+Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.
+
Headline H2
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.
+
Headline H3
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.
+
Headline H4
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Crasdapibus. Vivamus elementum semper
+
+
+
+
+
+
+
+
Modal Headline
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper
+
+
+```
diff --git a/app/assets/stylesheets/content/_modal.sass b/app/assets/stylesheets/content/_modal.sass
index d390ca643d..babef96d4e 100644
--- a/app/assets/stylesheets/content/_modal.sass
+++ b/app/assets/stylesheets/content/_modal.sass
@@ -12,7 +12,7 @@ $ng-modal-image-width: $ng-modal-image-height
.ng-modal-window
// overlay
+position(fixed, 0px 0px 0px 0px)
- background: rgba(0, 0, 0, 0.2)
+ background: rgba(0, 0, 0, 0.5)
text-align: left
z-index: 10000
@@ -32,30 +32,8 @@ $ng-modal-image-width: $ng-modal-image-height
.ng-modal-inner
top: 0
-.ng-modal-close
- +position(absolute, $ng-modal-padding / 2 $ng-modal-padding / 2 0 0)
- +size(1.5em)
- cursor: pointer
- background: $ng-modal-background
- &:after,
- &:before
- +position(absolute, 3px 3px 0 50%)
- +transform(rotate(45deg))
- +size(0.15em 1.5em)
- background: $ng-modal-close-color
- content: ''
- display: block
- margin: -3px 0 0 -1px
- &:hover:after,
- &:hover:before
- background: darken($ng-modal-close-color, 10)
- &:before
- +transform(rotate(-45deg))
-
.ng-modal-inner
+transition(opacity 0.25s ease)
- border-radius: $base-border-radius
- box-shadow: 0 5px 10px rgba(0, 0, 0, .2)
background: $ng-modal-background
margin: auto
max-height: 95%
@@ -66,37 +44,32 @@ $ng-modal-image-width: $ng-modal-image-height
margin-top: .6em
//+media($medium-screen)
//padding: $ng-modal-padding
- //width: 60%
- //max-height: 60%
+ //width: 50%
+ //max-height: 50%
//margin-top: 10em
//+media($large-screen)
- width: 50%
+ width: 40%
margin-top: 10em
- h1
- color: $base-font-color
- margin-bottom: .6em
- text-align: left
- text-transform: capitalize
- p
- font-size: $base-font-size
- max-width: 100% !important
+ .modal-header
padding: 0
- text-align: left
- &.intro
- color: $blue
- line-height: 1.6em
- &.body
- color: $base-font-color
- line-height: 1.45em
- //+media($medium-screen)
- +columns(2 8em)
-
- a.cta
- color: white
- display: inline-block
- margin-right: .5em
- margin-top: 1em
- &:last-child
- padding: 0 2em
+ i
+ float: right
+ cursor: pointer
+
+ label
+ padding: 0 50px 0 0
+ input
+ width: 230px
+ height: 30px
+ line-height: 30px
+ padding: 0 5px
+ background: #ffffff
+ border: 1px solid #cacaca
+ font-size: 13px
+ color: #222222
+ border-radius: 2px
+ button
+ margin: 30px 7px 0 0
+
\ No newline at end of file
diff --git a/app/assets/stylesheets/fonts/_openproject_icon_font.sass b/app/assets/stylesheets/fonts/_openproject_icon_font.sass
index d5d500a0ea..3aadddec12 100644
--- a/app/assets/stylesheets/fonts/_openproject_icon_font.sass
+++ b/app/assets/stylesheets/fonts/_openproject_icon_font.sass
@@ -67,12 +67,16 @@
font-size: 12px
@mixin icon-dropdown-rules
- padding: 0 0px 0 3px
+ padding: 0 0 0 3px
font-size: 13px
@mixin icon-button-rules
- padding: 0 5px 0 0px
+ padding: 0 5px 0 0
font-size: 13px
+
+@mixin icon-dropdown-menu-rules
+ padding: 0 8px 0 0
+ font-size: 14px
@mixin icon-context-rules
padding: 0 4px 0 0
@@ -80,6 +84,19 @@
@mixin icon-table-rules
padding: 0 0 0 0
+
+@mixin icon-action-menu-rules
+ padding: 0 10px 0 0
+ font-size: 15px
+ line-height: 5px
+ vertical-align: -40%
+
+@mixin icon-sub-menu-rules
+ padding: 0 0 0 0
+ float: right
+ font-size: 15px
+ line-height: 5px
+ vertical-align: -40%
[data-icon]:before
@include icon-common
@@ -111,6 +128,11 @@
content: attr(data-icon-dropdown)
@include icon-dropdown-rules
+[data-icon-dropdown-menu]:before
+ @include icon-common
+ content: attr(data-icon-dropdown-menu)
+ @include icon-dropdown-menu-rules
+
[data-icon-button]:before
@include icon-common
content: attr(data-icon-button)
@@ -121,6 +143,14 @@
content: attr(data-icon-table)
@include icon-table-rules
+[data-icon-action-menu]:before
+ content: attr(data-icon-action-menu)
+ @include icon-action-menu-rules
+
+[data-icon-sub-menu]:before
+ content: attr(data-icon-sub-menu)
+ @include icon-sub-menu-rules
+
[class^="icon-"]:before,
[class*=" icon-"]:before
@include icon-common
@@ -152,6 +182,10 @@
.icon-dropdown:before
@include icon-dropdown-rules
+// used for icons dropdown-menus
+.icon-dropdown-menu:before
+ @include icon-dropdown-menu-rules
+
// used for icons in buttons
.icon-buttons:before
@include icon-button-rules
diff --git a/app/assets/stylesheets/global/_mixins.sass b/app/assets/stylesheets/global/_mixins.sass
index 2991f196a0..a902c67c0f 100644
--- a/app/assets/stylesheets/global/_mixins.sass
+++ b/app/assets/stylesheets/global/_mixins.sass
@@ -37,6 +37,40 @@ $button_gray_font_color: #222222
@each $vendor in $vendors
#{$vendor}transition: all 200ms ease-in-out 0s
+@mixin default-headline-h1
+ color: $headline_h1_font-color
+ font-size: $headline_h1_font_size
+ font-family: $font_family_normal
+ font-weight: normal
+ padding: 0 0 8px 0
+ margin: 0
+
+@mixin default-headline-h2
+ color: $headline_h2_font-color
+ font-size: $headline_h2_font_size
+ font-family: $font_family_normal
+ font-weight: normal
+ text-transform: uppercase
+ padding: 0 0 8px 0
+ margin: 0
+
+@mixin default-headline-h3
+ color: $headline_h3_font-color
+ font-size: $headline_h3_font_size
+ font-family: $font_family_normal
+ font-weight: normal
+ border-bottom: 1px solid #dddddd
+ padding: 0 0 8px 0
+ margin: 0 0 20px 0
+
+@mixin default-headline-h4
+ color: $headline_h4_font-color
+ font-size: $headline_h4_font_size
+ font-family: $font_family_normal
+ font-weight: normal
+ padding: 0 0 5px 0
+ margin: 0 0 20px 0
+
@mixin default-font-normal($color, $font-size: 13px)
color: $color
font-size: $font-size
diff --git a/app/assets/stylesheets/global/_variables.sass b/app/assets/stylesheets/global/_variables.sass
index c84e911bd3..b6a1154bff 100644
--- a/app/assets/stylesheets/global/_variables.sass
+++ b/app/assets/stylesheets/global/_variables.sass
@@ -30,6 +30,15 @@ $global_font_color: #555555 !default
$global_font_size: 13px !default
$global_line_height: 1.5 !default
+$headline_h1_font_size: 28px !default
+$headline_h1_font-color: #555555 !default
+$headline_h2_font_size: 22px !default
+$headline_h2_font-color: #06799F !default
+$headline_h3_font_size: 19px !default
+$headline_h3_font-color: #555555 !default
+$headline_h4_font_size: 17px !default
+$headline_h4_font-color: #555555 !default
+
$header_height: 55px !default
$header_bg_color: #3493B3 !default
$header_border_bottom_color: #3493B3 !default
diff --git a/app/assets/stylesheets/layout/_drop_down.sass b/app/assets/stylesheets/layout/_drop_down.sass
index 35595d4903..31f07da0d9 100644
--- a/app/assets/stylesheets/layout/_drop_down.sass
+++ b/app/assets/stylesheets/layout/_drop_down.sass
@@ -32,6 +32,10 @@
// https://github.com/plapier/jquery-dropdown
// (dual MIT/GPL-Licensed)
+
+#settingsDropdown
+ margin: 10px 0 0 0
+
.dropdown
position: absolute
z-index: 9999999
@@ -45,7 +49,7 @@
background: #FFF
border: solid 1px #DDD
border: solid 1px rgba(0, 0, 0, .2)
- border-radius: 6px
+ border-radius: 0px
box-shadow: 0 5px 10px rgba(0, 0, 0, .2)
overflow: visible
padding: 4px 0
@@ -103,21 +107,28 @@
color: #555
text-decoration: none
line-height: 18px
- padding: 3px 15px
+ padding: 3px 32px
white-space: nowrap
-
+
.dropdown .dropdown-menu LI > A:hover,
.dropdown .dropdown-menu LABEL:hover
- background-color: #08C
- color: #FFF
+ background-color: #F0F0F0
cursor: pointer
+.dropdown LI > A.dropdown-menu-hasicons
+ display: block
+ color: #555
+ text-decoration: none
+ line-height: 18px
+ padding: 3px 10px
+ white-space: nowrap
+
.dropdown .dropdown-menu .dropdown-divider
font-size: 1px
border-top: solid 1px #E5E5E5
padding: 0
- margin: 5px 0
+ margin: 4px 0
/* Icon Examples - icons courtesy of http://p.yusukekamiyamane.com/ */
.dropdown.has-icons LI > A
diff --git a/app/controllers/api/v3/projects_controller.rb b/app/controllers/api/v3/projects_controller.rb
index 6f19caf2a6..3bb958701f 100644
--- a/app/controllers/api/v3/projects_controller.rb
+++ b/app/controllers/api/v3/projects_controller.rb
@@ -64,7 +64,8 @@ module Api
private
def find_project
- @project = Project.find(params[:project_id])
+ @project = Project.where(identifier: params[:project_id]).first ||
+ Project.find(params[:id])
end
end
diff --git a/app/controllers/work_packages_controller.rb b/app/controllers/work_packages_controller.rb
index f182e85fae..8cb6da7d2a 100644
--- a/app/controllers/work_packages_controller.rb
+++ b/app/controllers/work_packages_controller.rb
@@ -206,7 +206,7 @@ class WorkPackagesController < ApplicationController
format.html do
render :index, :locals => { :query => @query,
:project => @project },
- :layout => !request.xhr?
+ :layout => 'angular' # !request.xhr?
end
format.csv do
serialized_work_packages = WorkPackage::Exporter.csv(@work_packages, @project)
diff --git a/app/views/layouts/angular.html.erb b/app/views/layouts/angular.html.erb
new file mode 100644
index 0000000000..a654252fc8
--- /dev/null
+++ b/app/views/layouts/angular.html.erb
@@ -0,0 +1,143 @@
+<%#-- copyright
+OpenProject is a project management system.
+Copyright (C) 2012-2014 the OpenProject Foundation (OPF)
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License version 3.
+
+OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+Copyright (C) 2006-2013 Jean-Philippe Lang
+Copyright (C) 2010-2013 the ChiliProject Team
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+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 General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+See doc/COPYRIGHT.rdoc for more details.
+
+++#%>
+<% show_decoration = params["layout"].nil? %>
+
+
+
+<%= html_title %>
+
+
+
+
+
+<%= csrf_meta_tags %>
+<%= favicon_link_tag 'favicon.ico' %>
+<%= stylesheet_link_tag current_theme.stylesheet_manifest, :media => "all" %>
+<% if User.current.impaired? && accessibility_css_enabled? %>
+ <%= stylesheet_link_tag 'accessibility' %>
+<% end %>
+
+<%= javascript_include_tag 'application' %>
+<%= javascript_include_tag 'angular-i18n/angular-locale_de-de' if I18n.locale == :de %>
+
+<%= user_specific_javascript_includes %>
+
+<%= call_hook :view_layouts_base_html_head %>
+
+<%= content_for(:header_tags) if content_for?(:header_tags) %>
+
+
+
+<% main_menu = render_main_menu(@project) %>
+<% side_displayed = content_for?(:sidebar) || content_for?(:main_menu) || !main_menu.blank? %>
+
+
+<%= call_hook :view_layouts_base_body_bottom %>
+
+
diff --git a/app/views/work_packages/_list.html.erb b/app/views/work_packages/_list.html.erb
deleted file mode 100644
index 6d3d929bb6..0000000000
--- a/app/views/work_packages/_list.html.erb
+++ /dev/null
@@ -1,62 +0,0 @@
-<%#-- copyright
-OpenProject is a project management system.
-Copyright (C) 2012-2014 the OpenProject Foundation (OPF)
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License version 3.
-
-OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
-Copyright (C) 2006-2013 Jean-Philippe Lang
-Copyright (C) 2010-2013 the ChiliProject Team
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-See doc/COPYRIGHT.rdoc for more details.
-
-++#%>
-
-<%= form_tag({}) do -%>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<% end -%>
diff --git a/app/views/work_packages/_query_form.html.erb b/app/views/work_packages/_query_form.html.erb
deleted file mode 100644
index be15a3bdbe..0000000000
--- a/app/views/work_packages/_query_form.html.erb
+++ /dev/null
@@ -1,43 +0,0 @@
-<%#-- copyright
-OpenProject is a project management system.
-Copyright (C) 2012-2014 the OpenProject Foundation (OPF)
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License version 3.
-
-OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
-Copyright (C) 2006-2013 Jean-Philippe Lang
-Copyright (C) 2010-2013 the ChiliProject Team
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-See doc/COPYRIGHT.rdoc for more details.
-
-++#%>
-
-<%= form_tag({ controller: '/queries', action: 'new' }, id: 'query_form', name: 'queryForm', novalidate: true) do %>
- <%= hidden_field_tag('project_id', project.to_param) if project %>
-
-
-
-
-
-
-
- <% if query.new_record? && User.current.allowed_to?(:save_queries, project, :global => true) %>
- Save
- <% end %>
-
-<% end %>
diff --git a/app/views/work_packages/index.html.erb b/app/views/work_packages/index.html.erb
index 781ef64e5a..cf2faa913d 100644
--- a/app/views/work_packages/index.html.erb
+++ b/app/views/work_packages/index.html.erb
@@ -47,63 +47,6 @@ end
<%= include_gon %>
-
-
<%= call_hook(:view_work_packages_index_bottom, { :project => project, :query => query }) %>
<% content_for :sidebar do %>
diff --git a/bower.json b/bower.json
index fd206f262a..d7cb08a6d7 100644
--- a/bower.json
+++ b/bower.json
@@ -24,7 +24,8 @@
"mocha": "~1.14.0",
"angular-mocks": "~1.2.14",
"angular-scenario": "~1.2.14",
- "chai": "~1.9.0"
+ "chai": "~1.9.0",
+ "angular-ui-router": "~0.2.10"
},
"resolutions": {
"select2": "3.3.2"
diff --git a/features/issues/query.feature b/features/issues/query.feature
index 4c2e925e9c..f13dee7d27 100644
--- a/features/issues/query.feature
+++ b/features/issues/query.feature
@@ -38,7 +38,7 @@ Feature: Work Package Query
| name | position |
| Bug | 1 |
- @javascript
+ @javascript @wip
Scenario: Create a query and give it a name
When I am already admin
And I go to the work packages index page for the project "project"
@@ -49,7 +49,7 @@ Feature: Work Package Query
Then I should see "Query" within "#content"
And I should see "Successful creation."
- @javascript
+ @javascript @wip
Scenario: Group on empty Value (Assignee)
Given the project "project" has 1 issue with the following:
| subject | issue1 |
@@ -65,6 +65,7 @@ Feature: Work Package Query
And I should see "Successful creation."
And I should see "None" within "#content"
+ @wip
Scenario: Save Button should be visible for users with the proper rights
Given there is 1 user with the following:
| login | bob |
@@ -79,6 +80,7 @@ Feature: Work Package Query
And I go to the work packages index page for the project "project"
Then I should see "Save" within "#query_form"
+ @wip
Scenario: Save Button should be invisible for users without the proper rights
Given there is 1 user with the following:
| login | alice |
diff --git a/karma.conf.js b/karma.conf.js
index b46315d193..1b95a8f2d6 100644
--- a/karma.conf.js
+++ b/karma.conf.js
@@ -90,6 +90,7 @@ module.exports = function(config) {
"app/assets/javascripts/angular/controllers/timelines-controller.js",
"app/assets/javascripts/angular/controllers/work-packages-controller.js",
+ "app/assets/javascripts/angular/controllers/work-package-details-controller.js",
'app/assets/javascripts/date-en-US.js',
diff --git a/karma/tests/controllers/work-package-details-controller-test.js b/karma/tests/controllers/work-package-details-controller-test.js
new file mode 100644
index 0000000000..c1f365802b
--- /dev/null
+++ b/karma/tests/controllers/work-package-details-controller-test.js
@@ -0,0 +1,56 @@
+//-- copyright
+// OpenProject is a project management system.
+// Copyright (C) 2012-2014 the OpenProject Foundation (OPF)
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License version 3.
+//
+// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+// Copyright (C) 2006-2013 Jean-Philippe Lang
+// Copyright (C) 2010-2013 the ChiliProject Team
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// 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 General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+// See doc/COPYRIGHT.rdoc for more details.
+//++
+
+/*jshint expr: true*/
+
+describe('WorkPackageDetailsController', function() {
+ var scope;
+ var buildController;
+
+ beforeEach(module('openproject.workPackages.controllers'));
+ beforeEach(inject(function($rootScope, $controller, $timeout) {
+ scope = $rootScope.$new();
+
+ buildController = function() {
+ ctrl = $controller("WorkPackageDetailsController", {
+ $scope: scope,
+ $stateParams: { workPackageId: 99 }
+ });
+
+ // $timeout.flush();
+ };
+
+ }));
+
+ describe('initialisation', function() {
+ it('should initialise', function() {
+ buildController();
+ });
+ });
+
+});
diff --git a/karma/tests/controllers/work-packages-controller-test.js b/karma/tests/controllers/work-packages-controller-test.js
index 2d8df67e2f..15fb784a43 100644
--- a/karma/tests/controllers/work-packages-controller-test.js
+++ b/karma/tests/controllers/work-packages-controller-test.js
@@ -29,15 +29,14 @@
/*jshint expr: true*/
describe('WorkPackagesController', function() {
- var scope, ctrl, win, testWorkPackageService, testQueryService, testPaginationService;
+ var scope, ctrl, win, testProjectService, testWorkPackageService, testQueryService, testPaginationService;
var buildController;
beforeEach(module('openproject.workPackages.controllers', 'openproject.workPackages.services', 'ng-context-menu', 'btford.modal'));
beforeEach(inject(function($rootScope, $controller, $timeout) {
scope = $rootScope.$new();
win = {
- location: { pathname: "" },
- gon: { project_types: [] }
+ location: { pathname: "" }
};
var workPackageData = {
@@ -49,6 +48,22 @@ describe('WorkPackagesController', function() {
var availableQueryiesData = {
};
+ var projectData = { embedded: { types: [] } };
+ var projectsData = [ projectData ];
+
+ testProjectService = {
+ getProject: function(identifier) {
+ return $timeout(function() {
+ return projectData;
+ }, 10);
+ },
+ getProjects: function(identifier) {
+ return $timeout(function() {
+ return projectsData;
+ }, 10);
+ }
+ }
+
testWorkPackageService = {
getWorkPackages: function () {
},
@@ -115,6 +130,7 @@ describe('WorkPackagesController', function() {
settingsModal: {},
shareModal: {},
sortingModal: {},
+ ProjectService: testProjectService,
QueryService: testQueryService,
PaginationService: testPaginationService,
WorkPackageService: testWorkPackageService
diff --git a/karma/tests/services/project-service-test.js b/karma/tests/services/project-service-test.js
new file mode 100644
index 0000000000..dbd384ac36
--- /dev/null
+++ b/karma/tests/services/project-service-test.js
@@ -0,0 +1,83 @@
+//-- copyright
+// OpenProject is a project management system.
+// Copyright (C) 2012-2014 the OpenProject Foundation (OPF)
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License version 3.
+//
+// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+// Copyright (C) 2006-2013 Jean-Philippe Lang
+// Copyright (C) 2010-2013 the ChiliProject Team
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// 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 General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+// See doc/COPYRIGHT.rdoc for more details.
+//++
+
+/*jshint expr: true*/
+
+describe('ProjectService', function() {
+
+ var $httpBackend, ProjectService;
+ beforeEach(module('openproject.services', 'openproject.models'));
+
+ beforeEach(inject(function(_$httpBackend_, _ProjectService_) {
+ $httpBackend = _$httpBackend_;
+ ProjectService = _ProjectService_;
+ }));
+
+ afterEach(function() {
+ $httpBackend.verifyNoOutstandingExpectation();
+ $httpBackend.verifyNoOutstandingRequest();
+ });
+
+ describe('getProject', function() {
+ beforeEach(function() {
+ $httpBackend.when('GET', '/api/v3/projects/superProject')
+ .respond({
+ "project": {
+ "id": 99,
+ "name": "Super-Duper Project",
+ "parent_id": null,
+ "leaf?": true
+ }
+ });
+ })
+
+ it('sends a successful get request', function() {
+ $httpBackend.expectGET('/api/v3/projects/superProject');
+
+ var callback = sinon.spy(),
+ project = ProjectService.getProject('superProject').then(callback);
+
+ $httpBackend.flush();
+ expect(callback).to.have.been.calledWith(sinon.match({
+ name: "Super-Duper Project"
+ }));
+ });
+
+ it('sends a unsuccessful get request', function() {
+ $httpBackend.expectGET('/api/v3/projects/superProject').respond(401);
+
+ var success = sinon.spy(),
+ error = sinon.spy(),
+ project = ProjectService.getProject('superProject').then(success, error);
+
+ $httpBackend.flush();
+ expect(success).not.to.have.been.called;
+ expect(error).to.have.been.called;
+ });
+ });
+});
diff --git a/public/templates/work_packages.html b/public/templates/work_packages.html
new file mode 100644
index 0000000000..17850fa3e5
--- /dev/null
+++ b/public/templates/work_packages.html
@@ -0,0 +1,68 @@
+