Merge branch 'dev' into feature/refactor-work-package-index-styling-flexboxes

Signed-off-by: Alex Coles <alex@alexbcoles.com>

Conflicts:
	app/assets/stylesheets/layout/_split_view.sass
pull/1768/head
Alex Coles 10 years ago
commit 098012e8ed
  1. 2
      Gemfile
  2. 4
      Gemfile.lock
  3. 11
      app/assets/javascripts/angular/config/configuration-service.js
  4. 12
      app/assets/javascripts/angular/directives/components/focus.js
  5. 63
      app/assets/javascripts/angular/directives/components/single-click.js
  6. 6
      app/assets/javascripts/angular/services/activity-service.js
  7. 62
      app/assets/javascripts/angular/services/hook-service.js
  8. 19
      app/assets/javascripts/angular/services/work-package-service.js
  9. 26
      app/assets/javascripts/angular/services/work-packages-table-service.js
  10. 11
      app/assets/javascripts/angular/ui_components/has-dropdown-menu-directive.js
  11. 39
      app/assets/javascripts/angular/work_packages/column-context-menu.js
  12. 23
      app/assets/javascripts/angular/work_packages/controllers/details-tab-overview-controller.js
  13. 12
      app/assets/javascripts/angular/work_packages/controllers/work-package-details-controller.js
  14. 45
      app/assets/javascripts/angular/work_packages/directives/work-package-dynamic-attribute-directive.js
  15. 54
      app/assets/javascripts/angular/work_packages/directives/work-packages-table-directive.js
  16. 42
      app/assets/javascripts/angular/work_packages/view_models/relations-handler.js
  17. 4
      app/assets/javascripts/angular/work_packages/work-package-context-menu.js
  18. 1
      app/assets/javascripts/jstoolbar.js
  19. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-bg.js
  20. 14
      app/assets/javascripts/jstoolbar/lang/jstoolbar-bs.js
  21. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-ca.js
  22. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-cs.js
  23. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-da.js
  24. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-de.js
  25. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-en-gb.js
  26. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-en.js
  27. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-es.js
  28. 20
      app/assets/javascripts/jstoolbar/lang/jstoolbar-eu.js
  29. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-fa.js
  30. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-fi.js
  31. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-fr.js
  32. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-gl.js
  33. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-he.js
  34. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-hr.js
  35. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-hu.js
  36. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-id.js
  37. 19
      app/assets/javascripts/jstoolbar/lang/jstoolbar-it.js
  38. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-ja.js
  39. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-ko.js
  40. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-lt.js
  41. 17
      app/assets/javascripts/jstoolbar/lang/jstoolbar-lv.js
  42. 17
      app/assets/javascripts/jstoolbar/lang/jstoolbar-mk.js
  43. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-mn.js
  44. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-nl.js
  45. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-no.js
  46. 17
      app/assets/javascripts/jstoolbar/lang/jstoolbar-pl.js
  47. 18
      app/assets/javascripts/jstoolbar/lang/jstoolbar-pt-br.js
  48. 17
      app/assets/javascripts/jstoolbar/lang/jstoolbar-pt.js
  49. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-ro.js
  50. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-ru.js
  51. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-sk.js
  52. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-sl.js
  53. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-sr-yu.js
  54. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-sr.js
  55. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-sv.js
  56. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-th.js
  57. 14
      app/assets/javascripts/jstoolbar/lang/jstoolbar-tr.js
  58. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-uk.js
  59. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-vi.js
  60. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-zh-tw.js
  61. 16
      app/assets/javascripts/jstoolbar/lang/jstoolbar-zh.js
  62. 20
      app/assets/javascripts/jstoolbar/translations.js
  63. 18
      app/assets/stylesheets/content/_form_elements_input_textarea.md
  64. 34
      app/assets/stylesheets/content/_form_elements_input_textarea.sass
  65. 6
      app/assets/stylesheets/content/_work_packages.sass
  66. 1
      app/assets/stylesheets/default.css.sass
  67. 3
      app/assets/stylesheets/default_simple.css.sass
  68. 12
      app/controllers/work_packages_controller.rb
  69. 1
      app/helpers/journals_helper.rb
  70. 2
      app/views/layouts/angular.html.erb
  71. 8
      app/views/messages/_form.html.erb
  72. 4
      app/views/messages/show.html.erb
  73. 7
      app/views/news/_form.html.erb
  74. 2
      app/views/news/show.html.erb
  75. 3
      app/views/project_associations/_form.html.erb
  76. 2
      app/views/project_associations/index.html.erb
  77. 7
      app/views/projects/form/attributes/_description.html.erb
  78. 7
      app/views/projects/form/attributes/_summary.html.erb
  79. 2
      app/views/projects/show.html.erb
  80. 3
      app/views/reportings/edit.html.erb
  81. 2
      app/views/reportings/index.html.erb
  82. 6
      app/views/settings/_general.html.erb
  83. 9
      app/views/wiki/edit.html.erb
  84. 3
      app/views/wiki/new.html.erb
  85. 2
      app/views/work_packages/show.html.erb
  86. 2
      bower.json
  87. 47
      config/locales/de.yml
  88. 5
      config/locales/en.yml
  89. 17
      config/locales/js-de.yml
  90. 17
      config/locales/js-en.yml
  91. 50
      karma/tests/controllers/details-tab-overview-controller-test.js
  92. 6
      karma/tests/controllers/work-package-details-controller-test.js
  93. 4
      karma/tests/directives/components/focus-test.js
  94. 176
      karma/tests/services/hook-service-test.js
  95. 6
      karma/tests/work_packages/work-package-context-menu-test.js
  96. 11
      lib/api/root.rb
  97. 4
      lib/api/v3/activities/activities_api.rb
  98. 8
      lib/api/v3/activities/activity_representer.rb
  99. 6
      lib/api/v3/attachments/attachment_representer.rb
  100. 2
      lib/api/v3/attachments/attachments_api.rb
  101. Some files were not shown because too many files have changed in this diff Show More

@ -126,7 +126,7 @@ gem "prototype-rails"
# replace those with :remote => true
gem 'prototype_legacy_helper', '0.0.0', :git => 'https://github.com/rails/prototype_legacy_helper.git'
gem 'i18n-js', git: "https://github.com/fnando/i18n-js.git", branch: 'rewrite'
gem 'i18n-js', git: "https://github.com/fnando/i18n-js.git", branch: '12fe8ec2133dc162087eef2b1639309a01cbb414'
# small wrapper around the command line
gem 'cocaine'

@ -40,8 +40,8 @@ GIT
GIT
remote: https://github.com/fnando/i18n-js.git
revision: 4e5c525ff6e1ec4d3449852746fa5651a0577d68
branch: rewrite
revision: 12fe8ec2133dc162087eef2b1639309a01cbb414
branch: 12fe8ec2133dc162087eef2b1639309a01cbb414
specs:
i18n-js (3.0.0.rc5)
i18n

@ -28,16 +28,9 @@
angular.module('openproject.config')
.constant('DEFAULT_WORK_PACKAGE_PROPERTIES', [
'status', 'assignee', 'responsible',
'date', 'percentageDone', 'priority',
'estimatedTime', 'versionName'
])
.service('ConfigurationService', [
'$log',
'DEFAULT_WORK_PACKAGE_PROPERTIES',
function($log, DEFAULT_WORK_PACKAGE_PROPERTIES) {
function($log) {
return {
settingsPresent: function() {
@ -94,7 +87,7 @@ angular.module('openproject.config')
workPackageAttributes: function() {
var attributes = (this.workPackageAttributeSettingsPresent()) ? gon.settings.work_package_attributes : [];
return DEFAULT_WORK_PACKAGE_PROPERTIES.concat(attributes);
return attributes;
}
};
}]);

@ -29,10 +29,16 @@
// TODO move to UI components
angular.module('openproject.uiComponents')
.directive('focus', function() {
.directive('focus', ['$timeout', function($timeout) {
return {
link: function(scope, element, attrs) {
element[0].focus();
var condition = (attrs.focus) ? scope.$eval(attrs.focus) : true;
if (condition) {
$timeout(function() {
element[0].focus();
});
}
}
};
});
}]);

@ -0,0 +1,63 @@
//-- 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.
//++
// TODO move to UI components
angular.module('openproject.uiComponents')
.constant('DOUBLE_CLICK_DELAY', 300)
// Thanks to http://stackoverflow.com/a/20445344
.directive('singleClick', [
'DOUBLE_CLICK_DELAY',
'$parse',
'$timeout',
function(DOUBLE_CLICK_DELAY, $parse, $timeout) {
return {
restrict: 'A',
link: function(scope, element, attrs) {
var fn = $parse(attrs.singleClick);
var clicks = 0, timer = null;
if (fn) {
element.on('click', function (event) {
clicks++; //count clicks
if(clicks === 1) {
timer = $timeout(function() {
fn(scope, { $event: event });
clicks = 0; //after action performed, reset counter
}, DOUBLE_CLICK_DELAY);
} else {
$timeout.cancel(timer); //prevent single-click action
clicks = 0; //after action performed, reset counter
}
});
}
}
};
}]);

@ -37,7 +37,8 @@ angular.module('openproject.services')
var options = {
ajax: {
method: "POST",
data: { comment: comment }
data: JSON.stringify({ comment: comment }),
contentType: "application/json; charset=utf-8"
}
};
@ -48,7 +49,8 @@ angular.module('openproject.services')
var options = {
ajax: {
method: 'PATCH',
data: { comment: comment }
data: JSON.stringify({ comment: comment }),
contentType: "application/json; charset=utf-8"
}
};

@ -0,0 +1,62 @@
//-- 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.
//++
angular.module('openproject.services')
.service('HookService', [function() {
var hooks = { };
HookService = {
register: function(id, callback) {
if (callback && typeof(callback) == "function") {
if (!hooks[id]) {
hooks[id] = [];
}
hooks[id].push(callback);
}
},
call: function(id, params) {
var results = [];
if (hooks[id]) {
for (var x = 0; x < hooks[id].length; x++) {
var result = hooks[id][x](params);
if (result) {
results.push(result);
}
}
}
return results;
}
};
return HookService;
}]);

@ -130,13 +130,28 @@ angular.module('openproject.services')
});
},
updateWorkPackage: function(workPackage, data) {
var options = { ajax: {
method: "PATCH",
headers: {
Accept: "application/hal+json"
},
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8"
}};
return workPackage.links.update.fetch(options).then(function(workPackage) {
return workPackage;
})
},
addWorkPackageRelation: function(workPackage, toId, relationType) {
var options = { ajax: {
method: "POST",
data: {
data: JSON.stringify({
to_id: toId,
relation_type: relationType
}
}),
contentType: "application/json; charset=utf-8"
} };
return workPackage.links.addRelation.fetch(options).then(function(relation){
return relation;

@ -129,6 +129,32 @@ angular.module('openproject.workPackages.services')
field: columnName,
direction: direction
});
},
setCheckedStateForAllRows: function(rows, state) {
angular.forEach(rows, function(row) {
row.checked = state;
});
},
setRowSelection: function(row, state) {
row.checked = state;
},
selectRowRange: function(rows, row, activeSelectionBorderIndex) {
if (WorkPackagesTableHelper.getSelectedRows(rows).length == 0) {
this.setRowSelection(row, true);
activeSelectionBorderIndex = rows.indexOf(row);
} else {
var index = rows.indexOf(row);
var start = Math.min(index, activeSelectionBorderIndex);
var end = Math.max(index, activeSelectionBorderIndex);
for (var x = 0; x < rows.length; x++) {
rows[x].checked = x >= start && x <= end;
}
}
return activeSelectionBorderIndex;
}
};

@ -64,20 +64,21 @@ angular.module('openproject.uiComponents')
locals[key] = scope[key];
});
function toggle() {
active() ? close() : open();
function toggle(event) {
active() ? close() : open(event);
}
function active() {
return contextMenu.active() && ctrl.opened();
}
function open() {
function open(event) {
ctrl.open();
contextMenu.open(locals)
contextMenu.open(event.target, locals)
.then(function(element) {
menuElement = element;
angular.element(element).trap();
});
}
@ -96,7 +97,7 @@ angular.module('openproject.uiComponents')
event.stopPropagation();
scope.$apply(function() {
toggle();
toggle(event);
});
// set css position parameters after the digest has been completed

@ -58,7 +58,6 @@ angular.module('openproject.workPackages')
$scope.isGroupable = WorkPackagesTableService.isGroupable($scope.column);
});
// context menu actions
$scope.groupBy = function(columnName) {
@ -89,4 +88,42 @@ angular.module('openproject.workPackages')
$scope.insertColumns = function() {
columnsModal.activate();
};
$scope.canSort = function() {
return $scope.column && !!$scope.column.sortable;
};
function isValidColumn(column) {
return column && column.name !== 'id';
}
$scope.canMoveLeft = function() {
return isValidColumn($scope.column) && $scope.columns.indexOf($scope.column) !== 0;
};
$scope.canMoveRight = function() {
return isValidColumn($scope.column) && $scope.columns.indexOf($scope.column) !== $scope.columns.length - 1
};
$scope.canBeHidden = function() {
return isValidColumn($scope.column);
};
$scope.focusFeature = function(feature) {
var focus;
var mergeOrReturn = function(currentState, state) {
return ((currentState === undefined) ? state : currentState && !state);
};
switch (feature) {
case 'insert': focus = mergeOrReturn(focus, true);
case 'hide': focus = mergeOrReturn(focus, $scope.canBeHidden());
case 'moveRight': focus = mergeOrReturn(focus, $scope.canMoveRight());
case 'moveLeft': focus = mergeOrReturn(focus, $scope.canMoveLeft());
case 'group': focus = mergeOrReturn(focus, !!$scope.isGroupable);
default: focus = mergeOrReturn(focus, $scope.canSort());
}
return focus;
}
}]);

@ -38,8 +38,17 @@ angular.module('openproject.workPackages.controllers')
'CustomFieldHelper',
'WorkPackagesHelper',
'UserService',
'HookService',
'$q',
function($scope, I18n, ConfigurationService, USER_TYPE, CustomFieldHelper, WorkPackagesHelper, UserService, $q) {
function($scope,
I18n,
ConfigurationService,
USER_TYPE,
CustomFieldHelper,
WorkPackagesHelper,
UserService,
HookService,
$q) {
// work package properties
@ -111,7 +120,17 @@ angular.module('openproject.workPackages.controllers')
index < 6 && secondRowToBeDisplayed()) {
addFormattedValueToPresentProperties(property, label, value, format);
} else {
$scope.emptyWorkPackageProperties.push(label);
var plugInValues = HookService.call('workPackageOverviewAttributes',
{ type: property,
workPackage: $scope.workPackage });
if (plugInValues.length == 0) {
$scope.emptyWorkPackageProperties.push(label);
} else {
for (var x = 0; x < plugInValues.length; x++) {
addFormattedValueToPresentProperties(property, label, plugInValues[x], 'dynamic');
}
}
}
});
})();

@ -39,6 +39,7 @@ angular.module('openproject.workPackages.controllers')
follows: "Relation::Follows"
})
.constant('RELATION_IDENTIFIERS', {
parent: "parent",
relatedTo: "relates",
duplicates: "duplicates",
duplicated: "duplicated",
@ -58,11 +59,13 @@ angular.module('openproject.workPackages.controllers')
'RELATION_IDENTIFIERS',
'$q',
'WorkPackagesHelper',
'PathHelper',
'UsersHelper',
'ConfigurationService',
'CommonRelationsHandler',
'ChildrenRelationsHandler',
'ParentRelationsHandler',
function($scope, latestTab, workPackage, I18n, VISIBLE_LATEST, RELATION_TYPES, RELATION_IDENTIFIERS, $q, WorkPackagesHelper, ConfigurationService, CommonRelationsHandler, ChildrenRelationsHandler, ParentRelationsHandler) {
function($scope, latestTab, workPackage, I18n, VISIBLE_LATEST, RELATION_TYPES, RELATION_IDENTIFIERS, $q, WorkPackagesHelper, PathHelper, UsersHelper, ConfigurationService, CommonRelationsHandler, ChildrenRelationsHandler, ParentRelationsHandler) {
$scope.$on('$stateChangeSuccess', function(event, toState){
latestTab.registerState(toState.name);
});
@ -111,16 +114,19 @@ angular.module('openproject.workPackages.controllers')
$scope.activities = displayedActivities($scope.workPackage);
// watchers
$scope.watchers = workPackage.embedded.watchers;
// Author
$scope.author = workPackage.embedded.author;
$scope.authorPath = PathHelper.staticUserPath($scope.author.props.id);
$scope.authorActive = UsersHelper.isActive($scope.author);
// Attachments
$scope.attachments = workPackage.embedded.attachments;
// relations
$q.all(WorkPackagesHelper.getParent(workPackage)).then(function(parents) {
var relationsHandler = new ParentRelationsHandler(workPackage, parents);
var relationsHandler = new ParentRelationsHandler(workPackage, parents, "parent");
$scope.wpParent = relationsHandler;
});

@ -0,0 +1,45 @@
//-- 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.
//++
angular.module('openproject.workPackages.directives')
.directive('workPackageDynamicAttribute', ['$compile', function($compile){
return {
restrict: 'EA',
scope: {
htmlElement: '=',
workPackage: '='
},
link: function(scope, element, attributes) {
var html = '<' + scope.htmlElement + '></' + scope.htmlElement +'>'
element.html(html);
$compile(element.contents())(scope);
}
};
}]);

@ -33,7 +33,8 @@ angular.module('openproject.workPackages.directives')
'WorkPackagesTableService',
'flags',
'PathHelper',
function(I18n, WorkPackagesTableService, flags, PathHelper){
'$state',
function(I18n, WorkPackagesTableService, flags, PathHelper, $state){
return {
restrict: 'E',
@ -54,6 +55,8 @@ angular.module('openproject.workPackages.directives')
updateBackUrl: '='
},
link: function(scope, element, attributes) {
var activeSelectionBorderIndex;
scope.I18n = I18n;
scope.workPackagesTableData = WorkPackagesTableService.getWorkPackagesTableData();
scope.workPackagePath = PathHelper.staticWorkPackagePath;
@ -76,9 +79,7 @@ angular.module('openproject.workPackages.directives')
});
scope.setCheckedStateForAllRows = function(state) {
angular.forEach(scope.rows, function(row) {
row.checked = state;
});
WorkPackagesTableService.setCheckedStateForAllRows(scope.rows, state);
};
var groupableColumns = WorkPackagesTableService.getGroupableColumns();
@ -97,6 +98,51 @@ angular.module('openproject.workPackages.directives')
}, function(detailsEnabled) {
scope.hideWorkPackageDetails = !detailsEnabled;
});
// Thanks to http://stackoverflow.com/a/880518
function clearSelection() {
if(document.selection && document.selection.empty) {
document.selection.empty();
} else if(window.getSelection) {
var sel = window.getSelection();
sel.removeAllRanges();
}
}
function setRowSelectionState(row, selected) {
activeSelectionBorderIndex = scope.rows.indexOf(row);
WorkPackagesTableService.setRowSelection(row, selected);
}
scope.selectWorkPackage = function(row, $event) {
if ($event.target.type != 'checkbox') {
var currentRowCheckState = row.checked;
var index = scope.rows.indexOf(row);
if (!($event.ctrlKey || $event.shiftKey)) {
scope.setCheckedStateForAllRows(false);
}
if ($event.shiftKey) {
clearSelection();
activeSelectionBorderIndex = WorkPackagesTableService.selectRowRange(scope.rows, row, activeSelectionBorderIndex);
} else {
setRowSelectionState(row, !currentRowCheckState);
}
}
};
scope.showWorkPackageDetails = function(row) {
var workPackageState = $state.get('work-packages');
clearSelection();
scope.setCheckedStateForAllRows(false);
setRowSelectionState(row, true);
$state.go(workPackageState.resolve.latestTab().getStateName(), { workPackageId: row.object.id });
};
}
};
}]);

@ -127,18 +127,30 @@ angular.module('openproject.viewModels')
return ChildrenRelationsHandler;
}])
.factory('ParentRelationsHandler', ['ChildrenRelationsHandler',
function(ChildrenRelationsHandler) {
function ParentRelationsHandler(workPackage, parents) {
var handler = new ChildrenRelationsHandler(workPackage, parents, undefined);
handler.type = "parent";
handler.canAddRelation = function() { return false };
handler.addRelation = undefined;
handler.isSingletonRelation = true;
return handler;
}
return ParentRelationsHandler;
}]);
.factory('ParentRelationsHandler', ['CommonRelationsHandler', 'WorkPackageService', 'ApiHelper',
function(CommonRelationsHandler, WorkPackageService, ApiHelper) {
function ParentRelationsHandler(workPackage, parents, relationsId) {
var handler = new CommonRelationsHandler(workPackage, parents, relationsId);
handler.type = "parent";
handler.addRelation = undefined;
handler.isSingletonRelation = true;
handler.relationsId = relationsId;
handler.canAddRelation = function() { return !!this.workPackage.links.update; };
handler.getRelatedWorkPackage = function(workPackage, relation) { return relation.fetch() };
handler.addRelation = function(scope) {
var inputElement = angular.element('#relation_to_id-' + this.relationsId);
var parentId = inputElement.val();
WorkPackageService.updateWorkPackage(this.workPackage, {parentId: parentId}).then(function(workPackage) {
inputElement.val('');
scope.$emit('workPackageRefreshRequired', '');
}, function(error) {
ApiHelper.handleError(scope, error);
});
};
return handler;
}
return ParentRelationsHandler;
}])

@ -55,6 +55,10 @@ angular.module('openproject.workPackages')
$scope.hideResourceActions = true;
$scope.$watch('row', function() {
if (!$scope.row.checked) {
WorkPackagesTableService.setCheckedStateForAllRows($scope.rows, false);
}
$scope.row.checked = true;
$scope.permittedActions = WorkPackageContextMenuHelper.getPermittedActions(getSelectedWorkPackages());
});

@ -27,4 +27,5 @@
//++
//= require jstoolbar/jstoolbar
//= require jstoolbar/translations
//= require jstoolbar/textile

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Strong';
jsToolBar.strings['Italic'] = 'Italic';
jsToolBar.strings['Underline'] = 'Underline';
jsToolBar.strings['Deleted'] = 'Deleted';
jsToolBar.strings['Code'] = 'Inline Code';
jsToolBar.strings['Heading 1'] = 'Heading 1';
jsToolBar.strings['Heading 2'] = 'Heading 2';
jsToolBar.strings['Heading 3'] = 'Heading 3';
jsToolBar.strings['Unordered list'] = 'Unordered list';
jsToolBar.strings['Ordered list'] = 'Ordered list';
jsToolBar.strings['Quote'] = 'Quote';
jsToolBar.strings['Unquote'] = 'Remove Quote';
jsToolBar.strings['Preformatted text'] = 'Preformatted text';
jsToolBar.strings['Wiki link'] = 'Link to a Wiki page';
jsToolBar.strings['Image'] = 'Image';

@ -1,14 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Strong';
jsToolBar.strings['Italic'] = 'Italic';
jsToolBar.strings['Underline'] = 'Underline';
jsToolBar.strings['Deleted'] = 'Deleted';
jsToolBar.strings['Code'] = 'Inline Code';
jsToolBar.strings['Heading 1'] = 'Heading 1';
jsToolBar.strings['Heading 2'] = 'Heading 2';
jsToolBar.strings['Heading 3'] = 'Heading 3';
jsToolBar.strings['Unordered list'] = 'Unordered list';
jsToolBar.strings['Ordered list'] = 'Ordered list';
jsToolBar.strings['Preformatted text'] = 'Preformatted text';
jsToolBar.strings['Wiki link'] = 'Link na Wiki stranicu';
jsToolBar.strings['Image'] = 'Slika';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Negreta';
jsToolBar.strings['Italic'] = 'Cursiva';
jsToolBar.strings['Underline'] = 'Subratllat';
jsToolBar.strings['Deleted'] = 'Barrat';
jsToolBar.strings['Code'] = 'Codi en línia';
jsToolBar.strings['Heading 1'] = 'Encapçalament 1';
jsToolBar.strings['Heading 2'] = 'Encapçalament 2';
jsToolBar.strings['Heading 3'] = 'Encapçalament 3';
jsToolBar.strings['Unordered list'] = 'Llista sense ordre';
jsToolBar.strings['Ordered list'] = 'Llista ordenada';
jsToolBar.strings['Quote'] = 'Cometes';
jsToolBar.strings['Unquote'] = 'Sense cometes';
jsToolBar.strings['Preformatted text'] = 'Text formatat';
jsToolBar.strings['Wiki link'] = 'Enllaça a una pàgina Wiki';
jsToolBar.strings['Image'] = 'Imatge';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Tučné';
jsToolBar.strings['Italic'] = 'Kurzíva';
jsToolBar.strings['Underline'] = 'Podtržené';
jsToolBar.strings['Deleted'] = 'Přeškrtnuté ';
jsToolBar.strings['Code'] = 'Zobrazení kódu';
jsToolBar.strings['Heading 1'] = 'Záhlaví 1';
jsToolBar.strings['Heading 2'] = 'Záhlaví 2';
jsToolBar.strings['Heading 3'] = 'Záhlaví 3';
jsToolBar.strings['Unordered list'] = 'Seznam';
jsToolBar.strings['Ordered list'] = 'Uspořádaný seznam';
jsToolBar.strings['Quote'] = 'Quote';
jsToolBar.strings['Unquote'] = 'Remove Quote';
jsToolBar.strings['Preformatted text'] = 'Předformátovaný text';
jsToolBar.strings['Wiki link'] = 'Vložit odkaz na Wiki stránku';
jsToolBar.strings['Image'] = 'Vložit obrázek';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Fed';
jsToolBar.strings['Italic'] = 'Kursiv';
jsToolBar.strings['Underline'] = 'Understreget';
jsToolBar.strings['Deleted'] = 'Slettet';
jsToolBar.strings['Code'] = 'Inline-kode';
jsToolBar.strings['Heading 1'] = 'Overskrift 1';
jsToolBar.strings['Heading 2'] = 'Overskrift 2';
jsToolBar.strings['Heading 3'] = 'Overskrift 3';
jsToolBar.strings['Unordered list'] = 'Unummereret liste';
jsToolBar.strings['Ordered list'] = 'Nummereret liste';
jsToolBar.strings['Quote'] = 'Citér';
jsToolBar.strings['Unquote'] = 'Fjern citér';
jsToolBar.strings['Preformatted text'] = 'Præformateret tekst';
jsToolBar.strings['Wiki link'] = 'Link til en wiki-side';
jsToolBar.strings['Image'] = 'Billede';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Fett';
jsToolBar.strings['Italic'] = 'Kursiv';
jsToolBar.strings['Underline'] = 'Unterstrichen';
jsToolBar.strings['Deleted'] = 'Durchgestrichen';
jsToolBar.strings['Code'] = 'Quelltext';
jsToolBar.strings['Heading 1'] = 'Überschrift 1. Ordnung';
jsToolBar.strings['Heading 2'] = 'Überschrift 2. Ordnung';
jsToolBar.strings['Heading 3'] = 'Überschrift 3. Ordnung';
jsToolBar.strings['Unordered list'] = 'Aufzählungsliste';
jsToolBar.strings['Ordered list'] = 'Nummerierte Liste';
jsToolBar.strings['Quote'] = 'Quote';
jsToolBar.strings['Unquote'] = 'Remove Quote';
jsToolBar.strings['Preformatted text'] = 'Präformatierter Text';
jsToolBar.strings['Wiki link'] = 'Verweis (Link) zu einer Wiki-Seite';
jsToolBar.strings['Image'] = 'Grafik';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Strong';
jsToolBar.strings['Italic'] = 'Italic';
jsToolBar.strings['Underline'] = 'Underline';
jsToolBar.strings['Deleted'] = 'Deleted';
jsToolBar.strings['Code'] = 'Inline Code';
jsToolBar.strings['Heading 1'] = 'Heading 1';
jsToolBar.strings['Heading 2'] = 'Heading 2';
jsToolBar.strings['Heading 3'] = 'Heading 3';
jsToolBar.strings['Unordered list'] = 'Unordered list';
jsToolBar.strings['Ordered list'] = 'Ordered list';
jsToolBar.strings['Quote'] = 'Quote';
jsToolBar.strings['Unquote'] = 'Remove Quote';
jsToolBar.strings['Preformatted text'] = 'Preformatted text';
jsToolBar.strings['Wiki link'] = 'Link to a Wiki page';
jsToolBar.strings['Image'] = 'Image';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Strong';
jsToolBar.strings['Italic'] = 'Italic';
jsToolBar.strings['Underline'] = 'Underline';
jsToolBar.strings['Deleted'] = 'Deleted';
jsToolBar.strings['Code'] = 'Inline Code';
jsToolBar.strings['Heading 1'] = 'Heading 1';
jsToolBar.strings['Heading 2'] = 'Heading 2';
jsToolBar.strings['Heading 3'] = 'Heading 3';
jsToolBar.strings['Unordered list'] = 'Unordered list';
jsToolBar.strings['Ordered list'] = 'Ordered list';
jsToolBar.strings['Quote'] = 'Quote';
jsToolBar.strings['Unquote'] = 'Remove Quote';
jsToolBar.strings['Preformatted text'] = 'Preformatted text';
jsToolBar.strings['Wiki link'] = 'Link to a Wiki page';
jsToolBar.strings['Image'] = 'Image';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Negrita';
jsToolBar.strings['Italic'] = 'Itálica';
jsToolBar.strings['Underline'] = 'Subrayado';
jsToolBar.strings['Deleted'] = 'Tachado';
jsToolBar.strings['Code'] = 'Código fuente';
jsToolBar.strings['Heading 1'] = 'Encabezado 1';
jsToolBar.strings['Heading 2'] = 'Encabezado 2';
jsToolBar.strings['Heading 3'] = 'Encabezado 3';
jsToolBar.strings['Unordered list'] = 'Lista sin ordenar';
jsToolBar.strings['Ordered list'] = 'Lista ordenada';
jsToolBar.strings['Quote'] = 'Citar';
jsToolBar.strings['Unquote'] = 'Quitar cita';
jsToolBar.strings['Preformatted text'] = 'Texto con formato';
jsToolBar.strings['Wiki link'] = 'Enlace a página Wiki';
jsToolBar.strings['Image'] = 'Imagen';

@ -1,20 +0,0 @@
// jsToolBar EU language
// Author: Ales Zabala Alava (Shagi), <shagi@gisa-elkartea.org>
// 2010-01-25
// Distributed under the same terms as the jsToolBar itself.
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Lodia';
jsToolBar.strings['Italic'] = 'Etzana';
jsToolBar.strings['Underline'] = 'Azpimarra';
jsToolBar.strings['Deleted'] = 'Ezabatuta';
jsToolBar.strings['Code'] = 'Inline Code';
jsToolBar.strings['Heading 1'] = '1 Goiburua';
jsToolBar.strings['Heading 2'] = '2 Goiburua';
jsToolBar.strings['Heading 3'] = '3 Goiburua';
jsToolBar.strings['Unordered list'] = 'Ordenatu gabeko zerrenda';
jsToolBar.strings['Ordered list'] = 'Ordenatutako zerrenda';
jsToolBar.strings['Quote'] = 'Aipamena';
jsToolBar.strings['Unquote'] = 'Aipamena kendu';
jsToolBar.strings['Preformatted text'] = 'Aurrez formateatutako testua';
jsToolBar.strings['Wiki link'] = 'Wiki orri baterako esteka';
jsToolBar.strings['Image'] = 'Irudia';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'پررنگ';
jsToolBar.strings['Italic'] = 'کج';
jsToolBar.strings['Underline'] = 'زیرخط';
jsToolBar.strings['Deleted'] = 'برداشته شده';
jsToolBar.strings['Code'] = 'کد درون خطی';
jsToolBar.strings['Heading 1'] = 'سربرگ ۱';
jsToolBar.strings['Heading 2'] = 'سربرگ ۲';
jsToolBar.strings['Heading 3'] = 'سربرگ ۳';
jsToolBar.strings['Unordered list'] = 'فهرست بدون شماره';
jsToolBar.strings['Ordered list'] = 'فهرست با شماره';
jsToolBar.strings['Quote'] = 'تو بردن';
jsToolBar.strings['Unquote'] = 'بیرون آوردن';
jsToolBar.strings['Preformatted text'] = 'نوشته قالب بندی شده';
jsToolBar.strings['Wiki link'] = 'پیوند به برگ ویکی';
jsToolBar.strings['Image'] = 'عکس';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Lihavoitu';
jsToolBar.strings['Italic'] = 'Kursivoitu';
jsToolBar.strings['Underline'] = 'Alleviivattu';
jsToolBar.strings['Deleted'] = 'Yliviivattu';
jsToolBar.strings['Code'] = 'Koodi näkymä';
jsToolBar.strings['Heading 1'] = 'Otsikko 1';
jsToolBar.strings['Heading 2'] = 'Otsikko 2';
jsToolBar.strings['Heading 3'] = 'Otsikko 3';
jsToolBar.strings['Unordered list'] = 'Järjestämätön lista';
jsToolBar.strings['Ordered list'] = 'Järjestetty lista';
jsToolBar.strings['Quote'] = 'Quote';
jsToolBar.strings['Unquote'] = 'Remove Quote';
jsToolBar.strings['Preformatted text'] = 'Ennaltamuotoiltu teksti';
jsToolBar.strings['Wiki link'] = 'Linkki Wiki sivulle';
jsToolBar.strings['Image'] = 'Kuva';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Gras';
jsToolBar.strings['Italic'] = 'Italique';
jsToolBar.strings['Underline'] = 'Souligné';
jsToolBar.strings['Deleted'] = 'Rayé';
jsToolBar.strings['Code'] = 'Code en ligne';
jsToolBar.strings['Heading 1'] = 'Titre niveau 1';
jsToolBar.strings['Heading 2'] = 'Titre niveau 2';
jsToolBar.strings['Heading 3'] = 'Titre niveau 3';
jsToolBar.strings['Unordered list'] = 'Liste à puces';
jsToolBar.strings['Ordered list'] = 'Liste numérotée';
jsToolBar.strings['Quote'] = 'Citer';
jsToolBar.strings['Unquote'] = 'Supprimer citation';
jsToolBar.strings['Preformatted text'] = 'Texte préformaté';
jsToolBar.strings['Wiki link'] = 'Lien vers une page Wiki';
jsToolBar.strings['Image'] = 'Image';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Negriña';
jsToolBar.strings['Italic'] = 'Itálica';
jsToolBar.strings['Underline'] = 'Suliñado';
jsToolBar.strings['Deleted'] = 'Tachado';
jsToolBar.strings['Code'] = 'Código fonte';
jsToolBar.strings['Heading 1'] = 'Encabezado 1';
jsToolBar.strings['Heading 2'] = 'Encabezado 2';
jsToolBar.strings['Heading 3'] = 'Encabezado 3';
jsToolBar.strings['Unordered list'] = 'Lista sen ordenar';
jsToolBar.strings['Ordered list'] = 'Lista ordenada';
jsToolBar.strings['Quote'] = 'Citar';
jsToolBar.strings['Unquote'] = 'Quitar cita';
jsToolBar.strings['Preformatted text'] = 'Texto con formato';
jsToolBar.strings['Wiki link'] = 'Enlace a páxina Wiki';
jsToolBar.strings['Image'] = 'Imaxe';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Strong';
jsToolBar.strings['Italic'] = 'Italic';
jsToolBar.strings['Underline'] = 'Underline';
jsToolBar.strings['Deleted'] = 'Deleted';
jsToolBar.strings['Code'] = 'Inline Code';
jsToolBar.strings['Heading 1'] = 'Heading 1';
jsToolBar.strings['Heading 2'] = 'Heading 2';
jsToolBar.strings['Heading 3'] = 'Heading 3';
jsToolBar.strings['Unordered list'] = 'Unordered list';
jsToolBar.strings['Ordered list'] = 'Ordered list';
jsToolBar.strings['Quote'] = 'Quote';
jsToolBar.strings['Unquote'] = 'Remove Quote';
jsToolBar.strings['Preformatted text'] = 'Preformatted text';
jsToolBar.strings['Wiki link'] = 'Link to a Wiki page';
jsToolBar.strings['Image'] = 'Image';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Podebljano';
jsToolBar.strings['Italic'] = 'Kurziv';
jsToolBar.strings['Underline'] = 'Podcrtano';
jsToolBar.strings['Deleted'] = 'Obrisano';
jsToolBar.strings['Code'] = 'Inline Code';
jsToolBar.strings['Heading 1'] = 'Naslov 1';
jsToolBar.strings['Heading 2'] = 'Naslov 2';
jsToolBar.strings['Heading 3'] = 'Naslov 3';
jsToolBar.strings['Unordered list'] = 'Graficke oznake';
jsToolBar.strings['Ordered list'] = 'Numeriranje';
jsToolBar.strings['Quote'] = 'Citat';
jsToolBar.strings['Unquote'] = 'Ukloni citat';
jsToolBar.strings['Preformatted text'] = 'Izveden tekst';
jsToolBar.strings['Wiki link'] = 'Link na Wiki stranicu';
jsToolBar.strings['Image'] = 'Slika';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Félkövér';
jsToolBar.strings['Italic'] = 'Dőlt';
jsToolBar.strings['Underline'] = 'Aláhúzott';
jsToolBar.strings['Deleted'] = 'Törölt';
jsToolBar.strings['Code'] = 'Kód sorok';
jsToolBar.strings['Heading 1'] = 'Fejléc 1';
jsToolBar.strings['Heading 2'] = 'Fejléc 2';
jsToolBar.strings['Heading 3'] = 'Fejléc 3';
jsToolBar.strings['Unordered list'] = 'Felsorolás';
jsToolBar.strings['Ordered list'] = 'Számozott lista';
jsToolBar.strings['Quote'] = 'Quote';
jsToolBar.strings['Unquote'] = 'Remove Quote';
jsToolBar.strings['Preformatted text'] = 'Előreformázott szöveg';
jsToolBar.strings['Wiki link'] = 'Link egy Wiki oldalra';
jsToolBar.strings['Image'] = 'Kép';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Tebal';
jsToolBar.strings['Italic'] = 'Miring';
jsToolBar.strings['Underline'] = 'Garis bawah';
jsToolBar.strings['Deleted'] = 'Dihapus';
jsToolBar.strings['Code'] = 'Inline Code';
jsToolBar.strings['Heading 1'] = 'Judul 1';
jsToolBar.strings['Heading 2'] = 'Judul 2';
jsToolBar.strings['Heading 3'] = 'Judul 3';
jsToolBar.strings['Unordered list'] = 'Daftar tak terurut';
jsToolBar.strings['Ordered list'] = 'Daftar terurut';
jsToolBar.strings['Quote'] = 'Kutipan';
jsToolBar.strings['Unquote'] = 'Hapus kutipan';
jsToolBar.strings['Preformatted text'] = 'Teks terformat';
jsToolBar.strings['Wiki link'] = 'Tautkan ke halaman wiki';
jsToolBar.strings['Image'] = 'Gambar';

@ -1,19 +0,0 @@
// Italian translation
// by Diego Pierotto (ita.translations@tiscali.it)
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Grassetto';
jsToolBar.strings['Italic'] = 'Corsivo';
jsToolBar.strings['Underline'] = 'Sottolineato';
jsToolBar.strings['Deleted'] = 'Barrato';
jsToolBar.strings['Code'] = 'Codice sorgente';
jsToolBar.strings['Heading 1'] = 'Titolo 1';
jsToolBar.strings['Heading 2'] = 'Titolo 2';
jsToolBar.strings['Heading 3'] = 'Titolo 3';
jsToolBar.strings['Unordered list'] = 'Elenco puntato';
jsToolBar.strings['Ordered list'] = 'Elenco numerato';
jsToolBar.strings['Quote'] = 'Aumenta rientro';
jsToolBar.strings['Unquote'] = 'Riduci rientro';
jsToolBar.strings['Preformatted text'] = 'Testo preformattato';
jsToolBar.strings['Wiki link'] = 'Collegamento a pagina Wiki';
jsToolBar.strings['Image'] = 'Immagine';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = '強調';
jsToolBar.strings['Italic'] = '斜体';
jsToolBar.strings['Underline'] = '下線';
jsToolBar.strings['Deleted'] = '取り消し線';
jsToolBar.strings['Code'] = 'コード';
jsToolBar.strings['Heading 1'] = '見出し 1';
jsToolBar.strings['Heading 2'] = '見出し 2';
jsToolBar.strings['Heading 3'] = '見出し 3';
jsToolBar.strings['Unordered list'] = '順不同リスト';
jsToolBar.strings['Ordered list'] = '番号つきリスト';
jsToolBar.strings['Quote'] = '引用';
jsToolBar.strings['Unquote'] = '引用解除';
jsToolBar.strings['Preformatted text'] = '整形済みテキスト';
jsToolBar.strings['Wiki link'] = 'Wikiページへのリンク';
jsToolBar.strings['Image'] = '画像';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = '굵게';
jsToolBar.strings['Italic'] = '기울임';
jsToolBar.strings['Underline'] = '밑줄';
jsToolBar.strings['Deleted'] = '취소선';
jsToolBar.strings['Code'] = '코드';
jsToolBar.strings['Heading 1'] = '제목 1';
jsToolBar.strings['Heading 2'] = '제목 2';
jsToolBar.strings['Heading 3'] = '제목 3';
jsToolBar.strings['Unordered list'] = '글머리 기호';
jsToolBar.strings['Ordered list'] = '번호 매기기';
jsToolBar.strings['Quote'] = '인용';
jsToolBar.strings['Unquote'] = '인용 취소';
jsToolBar.strings['Preformatted text'] = '있는 그대로 표현 (Preformatted text)';
jsToolBar.strings['Wiki link'] = 'Wiki 페이지에 연결';
jsToolBar.strings['Image'] = '그림';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Pastorinti';
jsToolBar.strings['Italic'] = 'Italic';
jsToolBar.strings['Underline'] = 'Pabraukti';
jsToolBar.strings['Deleted'] = 'Užbraukti';
jsToolBar.strings['Code'] = 'Kodas';
jsToolBar.strings['Heading 1'] = 'Heading 1';
jsToolBar.strings['Heading 2'] = 'Heading 2';
jsToolBar.strings['Heading 3'] = 'Heading 3';
jsToolBar.strings['Unordered list'] = 'Nenumeruotas sąrašas';
jsToolBar.strings['Ordered list'] = 'Numeruotas sąrašas';
jsToolBar.strings['Quote'] = 'Quote';
jsToolBar.strings['Unquote'] = 'Remove Quote';
jsToolBar.strings['Preformatted text'] = 'Preformatuotas tekstas';
jsToolBar.strings['Wiki link'] = 'Nuoroda į Wiki puslapį';
jsToolBar.strings['Image'] = 'Paveikslas';

@ -1,17 +0,0 @@
// translated by Dzintars Bergs (dzintars.bergs@gmail.com)
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Treknraksts';
jsToolBar.strings['Italic'] = 'Slīpraksts';
jsToolBar.strings['Underline'] = 'Pasvītrojums';
jsToolBar.strings['Deleted'] = 'Dzēsts';
jsToolBar.strings['Code'] = 'Iekļauts kods';
jsToolBar.strings['Heading 1'] = 'Virsraksts 1';
jsToolBar.strings['Heading 2'] = 'Virsraksts 2';
jsToolBar.strings['Heading 3'] = 'Virsraksts 3';
jsToolBar.strings['Unordered list'] = 'Nesakārtots saraksts';
jsToolBar.strings['Ordered list'] = 'Sakārtots saraksts';
jsToolBar.strings['Quote'] = 'Citēt';
jsToolBar.strings['Unquote'] = 'Noņemt citātu';
jsToolBar.strings['Preformatted text'] = 'Iepriekš formatēts teksts';
jsToolBar.strings['Wiki link'] = 'Saite uz Wiki lapu';
jsToolBar.strings['Image'] = 'Attēls';

@ -1,17 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Задебелен';
jsToolBar.strings['Italic'] = 'Закосен';
jsToolBar.strings['Underline'] = 'Подвлечен';
jsToolBar.strings['Deleted'] = 'Прецртан';
jsToolBar.strings['Code'] = 'Код';
jsToolBar.strings['Heading 1'] = 'Заглавје 1';
jsToolBar.strings['Heading 2'] = 'Заглавје 2';
jsToolBar.strings['Heading 3'] = 'Заглавје 3';
jsToolBar.strings['Unordered list'] = 'Неподредена листа';
jsToolBar.strings['Ordered list'] = 'Подредена листа';
jsToolBar.strings['Quote'] = 'Цитат';
jsToolBar.strings['Unquote'] = 'Отстрани цитат';
jsToolBar.strings['Preformatted text'] = 'Форматиран текст';
jsToolBar.strings['Wiki link'] = 'Врска до вики страна';
jsToolBar.strings['Image'] = 'Слика';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Бүдүүн';
jsToolBar.strings['Italic'] = 'Налуу';
jsToolBar.strings['Underline'] = 'Доогуур зураас';
jsToolBar.strings['Deleted'] = 'Устгагдсан';
jsToolBar.strings['Code'] = 'Програмын код';
jsToolBar.strings['Heading 1'] = 'Гарчиг 1';
jsToolBar.strings['Heading 2'] = 'Гарчиг 2';
jsToolBar.strings['Heading 3'] = 'Гарчиг 3';
jsToolBar.strings['Unordered list'] = 'Эрэмбэгүй жагсаалт';
jsToolBar.strings['Ordered list'] = 'Эрэмбэтэй жагсаалт';
jsToolBar.strings['Quote'] = 'Ишлэл';
jsToolBar.strings['Unquote'] = 'Ишлэлийг устгах';
jsToolBar.strings['Preformatted text'] = 'Өмнө нь хэлбэржсэн текст';
jsToolBar.strings['Wiki link'] = 'Вики хуудас руу холбох';
jsToolBar.strings['Image'] = 'Зураг';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Extra nadruk';
jsToolBar.strings['Italic'] = 'Cursief';
jsToolBar.strings['Underline'] = 'Onderstreept';
jsToolBar.strings['Deleted'] = 'Verwijderd';
jsToolBar.strings['Code'] = 'Computercode';
jsToolBar.strings['Heading 1'] = 'Kop 1';
jsToolBar.strings['Heading 2'] = 'Kop 2';
jsToolBar.strings['Heading 3'] = 'Kop 3';
jsToolBar.strings['Unordered list'] = 'Ongeordende lijst';
jsToolBar.strings['Ordered list'] = 'Geordende lijst';
jsToolBar.strings['Quote'] = 'Citaat';
jsToolBar.strings['Unquote'] = 'Verwijder citaat';
jsToolBar.strings['Preformatted text'] = 'Voor-geformateerde tekst';
jsToolBar.strings['Wiki link'] = 'Link naar een Wiki pagina';
jsToolBar.strings['Image'] = 'Afbeelding';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Fet';
jsToolBar.strings['Italic'] = 'Kursiv';
jsToolBar.strings['Underline'] = 'Understreking';
jsToolBar.strings['Deleted'] = 'Slettet';
jsToolBar.strings['Code'] = 'Kode';
jsToolBar.strings['Heading 1'] = 'Overskrift 1';
jsToolBar.strings['Heading 2'] = 'Overskrift 2';
jsToolBar.strings['Heading 3'] = 'Overskrift 3';
jsToolBar.strings['Unordered list'] = 'Punktliste';
jsToolBar.strings['Ordered list'] = 'Nummerert liste';
jsToolBar.strings['Quote'] = 'Sitat';
jsToolBar.strings['Unquote'] = 'Avslutt sitat';
jsToolBar.strings['Preformatted text'] = 'Preformatert tekst';
jsToolBar.strings['Wiki link'] = 'Lenke til Wiki-side';
jsToolBar.strings['Image'] = 'Bilde';

@ -1,17 +0,0 @@
// Keep this line in order to avoid problems with Windows Notepad UTF-8 EF-BB-BF idea...
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Pogrubienie';
jsToolBar.strings['Italic'] = 'Kursywa';
jsToolBar.strings['Underline'] = 'Podkreślenie';
jsToolBar.strings['Deleted'] = 'Usunięte';
jsToolBar.strings['Code'] = 'Wstawka kodu';
jsToolBar.strings['Heading 1'] = 'Nagłowek 1';
jsToolBar.strings['Heading 2'] = 'Nagłówek 2';
jsToolBar.strings['Heading 3'] = 'Nagłówek 3';
jsToolBar.strings['Unordered list'] = 'Nieposortowana lista';
jsToolBar.strings['Ordered list'] = 'Posortowana lista';
jsToolBar.strings['Quote'] = 'Cytat';
jsToolBar.strings['Unquote'] = 'Usuń cytat';
jsToolBar.strings['Preformatted text'] = 'Sformatowany tekst';
jsToolBar.strings['Wiki link'] = 'Odnośnik do strony Wiki';
jsToolBar.strings['Image'] = 'Obraz';

@ -1,18 +0,0 @@
// Translated by: Alexandre da Silva <simpsomboy@gmail.com>
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Negrito';
jsToolBar.strings['Italic'] = 'Itálico';
jsToolBar.strings['Underline'] = 'Sublinhado';
jsToolBar.strings['Deleted'] = 'Excluído';
jsToolBar.strings['Code'] = 'Código Inline';
jsToolBar.strings['Heading 1'] = 'Cabeçalho 1';
jsToolBar.strings['Heading 2'] = 'Cabeçalho 2';
jsToolBar.strings['Heading 3'] = 'Cabeçalho 3';
jsToolBar.strings['Unordered list'] = 'Lista não ordenada';
jsToolBar.strings['Ordered list'] = 'Lista ordenada';
jsToolBar.strings['Quote'] = 'Quote';
jsToolBar.strings['Unquote'] = 'Remove Quote';
jsToolBar.strings['Preformatted text'] = 'Texto pré-formatado';
jsToolBar.strings['Wiki link'] = 'Link para uma página Wiki';
jsToolBar.strings['Image'] = 'Imagem';

@ -1,17 +0,0 @@
// Translated by: Pedro Araújo <phcrva19@hotmail.com>
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Negrito';
jsToolBar.strings['Italic'] = 'Itálico';
jsToolBar.strings['Underline'] = 'Sublinhado';
jsToolBar.strings['Deleted'] = 'Apagado';
jsToolBar.strings['Code'] = 'Código Inline';
jsToolBar.strings['Heading 1'] = 'Cabeçalho 1';
jsToolBar.strings['Heading 2'] = 'Cabeçalho 2';
jsToolBar.strings['Heading 3'] = 'Cabeçalho 3';
jsToolBar.strings['Unordered list'] = 'Lista não ordenada';
jsToolBar.strings['Ordered list'] = 'Lista ordenada';
jsToolBar.strings['Quote'] = 'Citação';
jsToolBar.strings['Unquote'] = 'Remover citação';
jsToolBar.strings['Preformatted text'] = 'Texto pré-formatado';
jsToolBar.strings['Wiki link'] = 'Link para uma página da Wiki';
jsToolBar.strings['Image'] = 'Imagem';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Bold';
jsToolBar.strings['Italic'] = 'Italic';
jsToolBar.strings['Underline'] = 'Subliniat';
jsToolBar.strings['Deleted'] = 'Șters';
jsToolBar.strings['Code'] = 'Fragment de cod';
jsToolBar.strings['Heading 1'] = 'Heading 1';
jsToolBar.strings['Heading 2'] = 'Heading 2';
jsToolBar.strings['Heading 3'] = 'Heading 3';
jsToolBar.strings['Unordered list'] = 'Listă pe puncte';
jsToolBar.strings['Ordered list'] = 'Listă ordonată';
jsToolBar.strings['Quote'] = 'Citează';
jsToolBar.strings['Unquote'] = 'Fără citat';
jsToolBar.strings['Preformatted text'] = 'Text preformatat';
jsToolBar.strings['Wiki link'] = 'Trimitere către o pagină wiki';
jsToolBar.strings['Image'] = 'Imagine';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Жирный';
jsToolBar.strings['Italic'] = 'Курсив';
jsToolBar.strings['Underline'] = 'Подчеркнутый';
jsToolBar.strings['Deleted'] = 'Зачеркнутый';
jsToolBar.strings['Code'] = 'Вставка кода';
jsToolBar.strings['Heading 1'] = 'Заголовок 1';
jsToolBar.strings['Heading 2'] = 'Заголовок 2';
jsToolBar.strings['Heading 3'] = 'Заголовок 3';
jsToolBar.strings['Unordered list'] = 'Маркированный список';
jsToolBar.strings['Ordered list'] = 'Нумерованный список';
jsToolBar.strings['Quote'] = 'Цитата';
jsToolBar.strings['Unquote'] = 'Удалить цитату';
jsToolBar.strings['Preformatted text'] = 'Заранее форматированный текст';
jsToolBar.strings['Wiki link'] = 'Ссылка на страницу в Wiki';
jsToolBar.strings['Image'] = 'Вставка изображения';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Tučné';
jsToolBar.strings['Italic'] = 'Kurzíva';
jsToolBar.strings['Underline'] = 'Podčiarknuté';
jsToolBar.strings['Deleted'] = 'Preškrtnuté';
jsToolBar.strings['Code'] = 'Zobrazenie kódu';
jsToolBar.strings['Heading 1'] = 'Záhlavie 1';
jsToolBar.strings['Heading 2'] = 'Záhlavie 2';
jsToolBar.strings['Heading 3'] = 'Záhlavie 3';
jsToolBar.strings['Unordered list'] = 'Zoznam';
jsToolBar.strings['Ordered list'] = 'Zoradený zoznam';
jsToolBar.strings['Quote'] = 'Citácia';
jsToolBar.strings['Unquote'] = 'Odstránenie citácie';
jsToolBar.strings['Preformatted text'] = 'Predformátovaný text';
jsToolBar.strings['Wiki link'] = 'Link na Wiki stránku';
jsToolBar.strings['Image'] = 'Obrázok';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Krepko';
jsToolBar.strings['Italic'] = 'Poševno';
jsToolBar.strings['Underline'] = 'Podčrtano';
jsToolBar.strings['Deleted'] = 'Izbrisano';
jsToolBar.strings['Code'] = 'Koda med vrsticami';
jsToolBar.strings['Heading 1'] = 'Naslov 1';
jsToolBar.strings['Heading 2'] = 'Naslov 2';
jsToolBar.strings['Heading 3'] = 'Naslov 3';
jsToolBar.strings['Unordered list'] = 'Neurejen seznam';
jsToolBar.strings['Ordered list'] = 'Urejen seznam';
jsToolBar.strings['Quote'] = 'Citat';
jsToolBar.strings['Unquote'] = 'Odstrani citat';
jsToolBar.strings['Preformatted text'] = 'Predoblikovano besedilo';
jsToolBar.strings['Wiki link'] = 'Povezava na Wiki stran';
jsToolBar.strings['Image'] = 'Slika';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Podebljano';
jsToolBar.strings['Italic'] = 'Kurziv';
jsToolBar.strings['Underline'] = 'Podvučeno';
jsToolBar.strings['Deleted'] = 'Obrisano';
jsToolBar.strings['Code'] = 'Ugrađeni kôd';
jsToolBar.strings['Heading 1'] = 'Naslov 1';
jsToolBar.strings['Heading 2'] = 'Naslov 2';
jsToolBar.strings['Heading 3'] = 'Naslov 3';
jsToolBar.strings['Unordered list'] = 'Lista nabrajanja';
jsToolBar.strings['Ordered list'] = 'Uređena lista';
jsToolBar.strings['Quote'] = 'Pod navodnicima';
jsToolBar.strings['Unquote'] = 'Ukloni navodnike';
jsToolBar.strings['Preformatted text'] = 'Prethodno formatiran tekst';
jsToolBar.strings['Wiki link'] = 'Veza prema Wiki strani';
jsToolBar.strings['Image'] = 'Slika';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Подебљано';
jsToolBar.strings['Italic'] = 'Курзив';
jsToolBar.strings['Underline'] = 'Подвучено';
jsToolBar.strings['Deleted'] = 'Обрисано';
jsToolBar.strings['Code'] = 'Уграђени кôд';
jsToolBar.strings['Heading 1'] = 'Наслов 1';
jsToolBar.strings['Heading 2'] = 'Наслов 2';
jsToolBar.strings['Heading 3'] = 'Наслов 3';
jsToolBar.strings['Unordered list'] = 'Листа набрајања';
jsToolBar.strings['Ordered list'] = 'Уређена листа';
jsToolBar.strings['Quote'] = 'Под наводницима';
jsToolBar.strings['Unquote'] = 'Уклони наводнике';
jsToolBar.strings['Preformatted text'] = 'Претходно форматиран текст';
jsToolBar.strings['Wiki link'] = 'Веза према Wiki страни';
jsToolBar.strings['Image'] = 'Слика';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Fet';
jsToolBar.strings['Italic'] = 'Kursiv';
jsToolBar.strings['Underline'] = 'Understruken';
jsToolBar.strings['Deleted'] = 'Genomstruken';
jsToolBar.strings['Code'] = 'Kod';
jsToolBar.strings['Heading 1'] = 'Rubrik 1';
jsToolBar.strings['Heading 2'] = 'Rubrik 2';
jsToolBar.strings['Heading 3'] = 'Rubrik 3';
jsToolBar.strings['Unordered list'] = 'Osorterad lista';
jsToolBar.strings['Ordered list'] = 'Sorterad lista';
jsToolBar.strings['Quote'] = 'Citat';
jsToolBar.strings['Unquote'] = 'Ta bort citat';
jsToolBar.strings['Preformatted text'] = 'Förformaterad text';
jsToolBar.strings['Wiki link'] = 'Länk till en wikisida';
jsToolBar.strings['Image'] = 'Bild';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'หนา';
jsToolBar.strings['Italic'] = 'เอยง';
jsToolBar.strings['Underline'] = 'ขดเสนใต';
jsToolBar.strings['Deleted'] = 'ขดฆา';
jsToolBar.strings['Code'] = 'โคดโปรแกรม';
jsToolBar.strings['Heading 1'] = 'หวขอ 1';
jsToolBar.strings['Heading 2'] = 'หวขอ 2';
jsToolBar.strings['Heading 3'] = 'หวขอ 3';
jsToolBar.strings['Unordered list'] = 'รายการ';
jsToolBar.strings['Ordered list'] = 'ลำดบเลข';
jsToolBar.strings['Quote'] = 'Quote';
jsToolBar.strings['Unquote'] = 'Remove Quote';
jsToolBar.strings['Preformatted text'] = 'รปแบบขอความคงท';
jsToolBar.strings['Wiki link'] = 'เชอมโยงไปหนา Wiki อน';
jsToolBar.strings['Image'] = 'รปภาพ';

@ -1,14 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Kalın';
jsToolBar.strings['Italic'] = 'İtalik';
jsToolBar.strings['Underline'] = 'Altı çizgili';
jsToolBar.strings['Deleted'] = 'Silinmiş';
jsToolBar.strings['Code'] = 'Satır içi kod';
jsToolBar.strings['Heading 1'] = 'Başlık 1';
jsToolBar.strings['Heading 2'] = 'Başlık 2';
jsToolBar.strings['Heading 3'] = 'Başlık 3';
jsToolBar.strings['Unordered list'] = 'Sırasız liste';
jsToolBar.strings['Ordered list'] = 'Sıralı liste';
jsToolBar.strings['Preformatted text'] = 'Preformatted text';
jsToolBar.strings['Wiki link'] = 'Wiki sayfasına bağlantı';
jsToolBar.strings['Image'] = 'Resim';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Strong';
jsToolBar.strings['Italic'] = 'Italic';
jsToolBar.strings['Underline'] = 'Underline';
jsToolBar.strings['Deleted'] = 'Deleted';
jsToolBar.strings['Code'] = 'Inline Code';
jsToolBar.strings['Heading 1'] = 'Heading 1';
jsToolBar.strings['Heading 2'] = 'Heading 2';
jsToolBar.strings['Heading 3'] = 'Heading 3';
jsToolBar.strings['Unordered list'] = 'Unordered list';
jsToolBar.strings['Ordered list'] = 'Ordered list';
jsToolBar.strings['Quote'] = 'Quote';
jsToolBar.strings['Unquote'] = 'Remove Quote';
jsToolBar.strings['Preformatted text'] = 'Preformatted text';
jsToolBar.strings['Wiki link'] = 'Link to a Wiki page';
jsToolBar.strings['Image'] = 'Image';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = 'Đậm';
jsToolBar.strings['Italic'] = 'Nghiêng';
jsToolBar.strings['Underline'] = 'Gạch chân';
jsToolBar.strings['Deleted'] = 'Xóa';
jsToolBar.strings['Code'] = 'Mã chung dòng';
jsToolBar.strings['Heading 1'] = 'Tiêu đề 1';
jsToolBar.strings['Heading 2'] = 'Tiêu đề 2';
jsToolBar.strings['Heading 3'] = 'Tiêu đề 3';
jsToolBar.strings['Unordered list'] = 'Danh sách không thứ tự';
jsToolBar.strings['Ordered list'] = 'Danh sách có thứ tự';
jsToolBar.strings['Quote'] = 'Trích dẫn';
jsToolBar.strings['Unquote'] = 'Bỏ trích dẫn';
jsToolBar.strings['Preformatted text'] = 'Mã nguồn';
jsToolBar.strings['Wiki link'] = 'Liên kết đến trang wiki';
jsToolBar.strings['Image'] = 'Ảnh';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = '粗體';
jsToolBar.strings['Italic'] = '斜體';
jsToolBar.strings['Underline'] = '底線';
jsToolBar.strings['Deleted'] = '刪除線';
jsToolBar.strings['Code'] = '程式碼';
jsToolBar.strings['Heading 1'] = '標題 1';
jsToolBar.strings['Heading 2'] = '標題 2';
jsToolBar.strings['Heading 3'] = '標題 3';
jsToolBar.strings['Unordered list'] = '項目清單';
jsToolBar.strings['Ordered list'] = '編號清單';
jsToolBar.strings['Quote'] = '引文';
jsToolBar.strings['Unquote'] = '取消引文';
jsToolBar.strings['Preformatted text'] = '已格式文字';
jsToolBar.strings['Wiki link'] = '連結至 Wiki 頁面';
jsToolBar.strings['Image'] = '圖片';

@ -1,16 +0,0 @@
jsToolBar.strings = {};
jsToolBar.strings['Strong'] = '粗体';
jsToolBar.strings['Italic'] = '斜体';
jsToolBar.strings['Underline'] = '下划线';
jsToolBar.strings['Deleted'] = '删除线';
jsToolBar.strings['Code'] = '程序代码';
jsToolBar.strings['Heading 1'] = '标题 1';
jsToolBar.strings['Heading 2'] = '标题 2';
jsToolBar.strings['Heading 3'] = '标题 3';
jsToolBar.strings['Unordered list'] = '无序列表';
jsToolBar.strings['Ordered list'] = '排序列表';
jsToolBar.strings['Quote'] = '引用';
jsToolBar.strings['Unquote'] = '删除引用';
jsToolBar.strings['Preformatted text'] = '格式化文本';
jsToolBar.strings['Wiki link'] = '连接到 Wiki 页面';
jsToolBar.strings['Image'] = '图片';

@ -0,0 +1,20 @@
jQuery(function() {
jsToolBar.strings = {
'Strong': I18n.t('js.wiki_formatting.strong'),
'Italic': I18n.t('js.wiki_formatting.italic'),
'Underline': I18n.t('js.wiki_formatting.underline'),
'Deleted': I18n.t('js.wiki_formatting.deleted'),
'Code': I18n.t('js.wiki_formatting.code'),
'Heading 1': I18n.t('js.wiki_formatting.heading1'),
'Heading 2': I18n.t('js.wiki_formatting.heading2'),
'Heading 3': I18n.t('js.wiki_formatting.heading3'),
'Unordered list': I18n.t('js.wiki_formatting.unordered_list'),
'Ordered list': I18n.t('js.wiki_formatting.ordered_list'),
'Quote': I18n.t('js.wiki_formatting.quote'),
'Unquote': I18n.t('js.wiki_formatting.unquote'),
'Preformatted text': I18n.t('js.wiki_formatting.preformatted_text'),
'Wiki link': I18n.t('js.wiki_formatting.wiki_link'),
'Image': I18n.t('js.wiki_formatting.image')
}
});

@ -0,0 +1,18 @@
# [Form elements] - Input, Textarea
```
<div id="work-packages-index">
<input class="wide"></input>
<br /><br />
<input class="small"></input>
<br /><br / >
<textarea rows="4"></textarea>
<br /><br />
<input placeholder="with placeholder text"></input>
<br /><br />
<textarea rows="4" placeholder="with placeholder text"></textarea>
</div>
```

@ -0,0 +1,34 @@
/* Please use these styles for future purposes! The idea is to use these as global styles for form elements, after we finalised the work-packages view. The width of the elements may vary in different views */
#work-packages-index
input
border: 1px solid #cacaca
background: #ffffff
border-radius: 2px
padding: 8px
font-family: $font_family_normal
font-size: $global_font_size
box-sizing: border-box
&:hover
border: 1px solid #aaaaaa
&:focus
box-shadow: 1px 1px 1px #dddddd inset
.wide
width: 180px
.small
width: 90px
.form-textarea
margin: 0 0 10px 0
textarea
border: 1px solid #cacaca
background: #ffffff
border-radius: 2px
padding: 8px
font-family: $font_family_normal
font-size: $global_font_size
width: 100%
box-sizing: border-box
&:hover
border: 1px solid #aaaaaa
&:focus
box-shadow: 1px 1px 1px #dddddd inset

@ -269,16 +269,16 @@ div
padding: 0
list-style-type: none
li
margin: 0 0 30px 0
margin: 0 0 25px 0
padding: 0
display: inline-table
min-width: 31%
min-width: 33%
clear: left
label
font-weight: bold
display: block
margin: 0 0 15px 0
margin: 0 0 7px 0
&.detail-panel-attributes-toggler
float: left
margin: 10px 0 0 0

@ -43,6 +43,7 @@
@import layout/all
@import content/accounts
@import content/forms
@import content/form_elements_input_textarea
@import content/flash_messages
@import content/calendar
@import content/wiki

@ -35,8 +35,6 @@
@import fonts/lato
@import fonts/openproject_icon_font
@import work_packages
@import layout/base
@import layout/top_menu
@import layout/breadcrumb
@ -46,6 +44,7 @@
@import content/accounts
@import content/forms
@import content/form_elements_input_textarea
@import content/flash_messages
@import content/calendar
@import content/wiki

@ -61,6 +61,10 @@ class WorkPackagesController < ApplicationController
:protect_from_unauthorized_export, :only => [:index, :all, :preview]
before_filter :load_query, :only => :index
DEFAULT_WORK_PACKAGE_PROPERTIES = [:status, :assignee, :responsible,
:date, :percentageDone, :priority,
:estimatedTime, :versionName, :spentTime]
def show
respond_to do |format|
format.html do
@ -179,7 +183,7 @@ class WorkPackagesController < ApplicationController
flash[:notice] = l(:notice_successful_update)
show
redirect_to(work_package_path(work_package))
else
edit
end
@ -456,11 +460,11 @@ class WorkPackagesController < ApplicationController
parse_preview_data_helper :work_package, [:notes, :description]
end
def hook_overview_attributes
attributes = []
def hook_overview_attributes(initial_attributes = DEFAULT_WORK_PACKAGE_PROPERTIES)
attributes = initial_attributes
call_hook(:work_packages_overview_attributes,
project: @project,
attributes: attributes)
attributes
attributes.uniq
end
end

@ -112,6 +112,7 @@ module JournalsHelper
content << content_tag('div',
format_text(journal, :notes, :attachments => attachments),
:class => 'wikicontent',
:'ng-non-bindable' => '',
"data-user" => journal.journable.author)
css_classes = "wiki journal-notes"

@ -46,6 +46,8 @@ See doc/COPYRIGHT.rdoc for more details.
<%= include_gon %>
<%= javascript_include_tag 'application' %>
<%= javascript_include_tag 'angular-i18n/angular-locale_de-de' if I18n.locale == :de %>
<!-- plug-in specific tags -->
<%= call_hook :view_work_package_overview_attributes %>
<!-- user specific tags -->
<%= user_specific_javascript_includes %>
<!-- project specific tags -->

@ -51,9 +51,11 @@ See doc/COPYRIGHT.rdoc for more details.
<% end %>
<p>
<%= label_tag "message_content", l(:description_message_content), :class => "hidden-for-sighted" %>
<%= f.text_area :content, :cols => 80, :rows => 15, :class => 'wiki-edit', :id => 'message_content',
:'data-wp_autocomplete_url' => work_packages_auto_complete_path(:project_id => @project, :format => :json) %></p>
<%= label_tag "message_content", l(:description_message_content), :class => "hidden-for-sighted" %>
<%= f.text_area :content, :cols => 80, :rows => 15, :class => 'wiki-edit', :id => 'message_content',
:'data-wp_autocomplete_url' => work_packages_auto_complete_path(:project_id => @project, :format => :json),
:'ng-non-bindable' => '' %>
</p>
<%= wikitoolbar_for 'message_content' %>
<!--[eoform:message]-->

@ -57,7 +57,7 @@ See doc/COPYRIGHT.rdoc for more details.
<div class="message">
<p><span class="author"><%= authoring @topic.created_on, @topic.author %></span></p>
<div class="wiki">
<div class="wiki" ng-non-bindable>
<%= format_text(@topic.content, :object => @topic, :attachments => @topic.attachments) %>
</div>
<%= link_to_attachments @topic, :author => false %>
@ -97,7 +97,7 @@ See doc/COPYRIGHT.rdoc for more details.
:class => 'no-decoration-on-hover',
:alt => l(:button_delete)) if message.destroyable_by?(User.current) %>
</div>
<div class="wiki">
<div class="wiki" ng-non-bindable>
<%= format_text message, :content, :attachments => message.attachments %>
</div>
<%= link_to_attachments message, :author => false %>

@ -31,8 +31,11 @@ See doc/COPYRIGHT.rdoc for more details.
<div class="box tabular">
<p><%= f.text_field :title, :required => true, :size => 60 %></p>
<p><%= f.text_area :summary, :cols => 60, :rows => 2 %></p>
<p><%= f.text_area :description, :required => true, :cols => 60, :rows => 15, :class => 'wiki-edit',
:'data-wp_autocomplete_url' => work_packages_auto_complete_path(:project_id => @project, :format => :json) %></p>
<p>
<%= f.text_area :description, :required => true, :cols => 60, :rows => 15, :class => 'wiki-edit',
:'data-wp_autocomplete_url' => work_packages_auto_complete_path(:project_id => @project, :format => :json),
:'ng-non-bindable' => '' %>
</p>
</div>
<%= wikitoolbar_for 'news_description' %>

@ -60,7 +60,7 @@ See doc/COPYRIGHT.rdoc for more details.
<p><% unless @news.summary.blank? %><em><%=h @news.summary %></em><br /><% end %>
<span class="author"><%= authoring @news.created_on, @news.author %></span></p>
<div class="wiki">
<div class="wiki" ng-non-bindable>
<%= format_text(@news.description, :object => @news) %>
</div>
<br />

@ -32,5 +32,6 @@ See doc/COPYRIGHT.rdoc for more details.
</label>
<%= f.text_area(:description, :class => 'timelines-project-association-description wiki-edit', :rows => 10,
:'data-wp_autocomplete_url' => work_packages_auto_complete_path(:project_id => @project, :format => :json)) %>
:'data-wp_autocomplete_url' => work_packages_auto_complete_path(:project_id => @project, :format => :json),
:'ng-non-bindable' => '') %>
<%= wikitoolbar_for 'project_association_description' %>

@ -95,7 +95,7 @@ See doc/COPYRIGHT.rdoc for more details.
-
<% end %>
</td>
<td class="timelines-pa-description">
<td class="timelines-pa-description" ng-non-bindable>
<%= format_text association, :description %>
</td>
<td class="timelines-pa-actions">

@ -27,6 +27,9 @@ See doc/COPYRIGHT.rdoc for more details.
++#%>
<p><%= form.text_area :description, :rows => 5, :class => 'wiki-edit',
:'data-wp_autocomplete_url' => work_packages_auto_complete_path(:project_id => @project, :format => :json) %></p>
<p>
<%= form.text_area :description, :rows => 5, :class => 'wiki-edit',
:'data-wp_autocomplete_url' => work_packages_auto_complete_path(:project_id => @project, :format => :json),
:'ng-non-bindable' => '' %>
</p>
<%= wikitoolbar_for 'project_description' %>

@ -27,5 +27,8 @@ See doc/COPYRIGHT.rdoc for more details.
++#%>
<p><%= form.text_area :summary, :rows => 2, :class => 'wiki-edit',
:'data-wp_autocomplete_url' => work_packages_auto_complete_path(:project_id => @project, :format => :json) %></p>
<p>
<%= form.text_area :summary, :rows => 2, :class => 'wiki-edit',
:'data-wp_autocomplete_url' => work_packages_auto_complete_path(:project_id => @project, :format => :json),
:'ng-non-bindable' => '' %>
</p>

@ -38,7 +38,7 @@ See doc/COPYRIGHT.rdoc for more details.
<% breadcrumb_paths(l(:label_overview)) %>
<div class="splitcontentleft">
<div class="wiki">
<div class="wiki" ng-non-bindable>
<%= format_text @project.description %>
</div>
<ul>

@ -68,7 +68,8 @@ See doc/COPYRIGHT.rdoc for more details.
<%= Reporting.human_attribute_name(:reported_project_status_comment) %>:
</label><br/>
<%= f.text_area(:reported_project_status_comment, :class => 'wiki-edit', :rows => 10,
:'data-wp_autocomplete_url' => work_packages_auto_complete_path(:project_id => @project, :format => :json)) %>
:'data-wp_autocomplete_url' => work_packages_auto_complete_path(:project_id => @project, :format => :json),
:'ng-non-bindable' => '') %>
<%= wikitoolbar_for 'reporting_reported_project_status_comment' %>
</p>
</fieldset>

@ -65,7 +65,7 @@ See doc/COPYRIGHT.rdoc for more details.
<td class="timelines-rep-short">
<%=h reporting.reported_project_status.try(:name) || "-" %>
</td>
<td class="timelines-rep-comment">
<td class="timelines-rep-comment" ng-non-bindable>
<%= format_text reporting, :reported_project_status_comment %>
</td>
<td class="timelines-rep-last_change">

@ -32,8 +32,10 @@ See doc/COPYRIGHT.rdoc for more details.
<div class="box tabular settings">
<p><%= setting_text_field :app_title, :size => 30 %></p>
<p><%= setting_text_area :welcome_text, :cols => 60, :rows => 5, :class => 'wiki-edit' %></p>
<%= wikitoolbar_for 'settings_welcome_text' %>
<p>
<%= setting_text_area :welcome_text, :cols => 60, :rows => 5, :class => 'wiki-edit', :'ng-non-bindable' => '' %>
<%= wikitoolbar_for 'settings_welcome_text' %>
</p>
<p><%= setting_text_field :attachment_max_size, :size => 6 %> <%= l(:"number.human.storage_units.units.kb") %></p>

@ -33,9 +33,12 @@ See doc/COPYRIGHT.rdoc for more details.
<%= f.hidden_field :lock_version %>
<%= error_messages_for 'content' %>
<p><%= f.text_area :text, :cols => 100, :rows => 25, :class => 'wiki-edit', :accesskey => accesskey(:edit),
:value => format_text(@content, :text, :attachments => @content.page.attachments, :edit => true),
:'data-wp_autocomplete_url' => work_packages_auto_complete_path(:project_id => @project, :format => :json) %></p>
<p>
<%= f.text_area :text, :cols => 100, :rows => 25, :class => 'wiki-edit', :accesskey => accesskey(:edit),
:value => format_text(@content, :text, :attachments => @content.page.attachments, :edit => true),
:'data-wp_autocomplete_url' => work_packages_auto_complete_path(:project_id => @project, :format => :json),
:'ng-non-bindable' => '' %>
</p>
<p><label><%= Version.human_attribute_name(:comments) %></label><br /><%= f.text_field :comments, :size => 120 %></p>
<p><label><%=l(:label_attachment_plural)%></label><br /><%= render :partial => 'attachments/form' %></p>
<p><%= submit_tag l(:button_save) %>

@ -53,7 +53,8 @@ See doc/COPYRIGHT.rdoc for more details.
<p>
<%= f.text_area :text, :cols => 100, :rows => 25, :class => 'wiki-edit', :accesskey => accesskey(:edit),
:'data-wp_autocomplete_url' => work_packages_auto_complete_path(:project_id => @project, :format => :json) %>
:'data-wp_autocomplete_url' => work_packages_auto_complete_path(:project_id => @project, :format => :json),
:'ng-non-bindable' => '' %>
</p>
<p>

@ -58,7 +58,7 @@ See doc/COPYRIGHT.rdoc for more details.
<%= link_to_if_authorized(l(:button_quote), { controller: :work_packages, action: :quoted, id: work_package }, :class => 'quote-link icon icon-quote') %>
</div>
<p><strong><%= WorkPackage.human_attribute_name(:description)%></strong></p>
<div class="wiki wikicontent" data-user="<%= work_package.author %>">
<div class="wiki wikicontent" data-user="<%= work_package.author %>" ng-non-bindable>
<%= format_text work_package, :description, :attachments => work_package.attachments %>
</div>
</div>

@ -22,7 +22,7 @@
"jquery-migrate": "~1.2.1",
"momentjs": "~2.7.0",
"moment-timezone": "~0.2.0",
"angular-context-menu": "0.1.2",
"angular-context-menu": "finnlabs/angular-context-menu#v0.1.4",
"angular-busy": "~4.0.4",
"hyperagent": "manwithtwowatches/hyperagent#v0.4.2"
},

@ -33,8 +33,8 @@ de:
deleted: "Account erfolgreich gelöscht"
deletion_info:
data_consequences:
other: "Von den vom Nutzer im Zuge der Nutzung der Anwendung erstellen Daten (z.B. E-Mail-Adresse, Systemeinstellungen, Tickets, Wiki-Einträgen) werden so viele wie möglich gelöscht. Bitte beachten Sie allerdings, dass Daten wie Tickets und Wiki-Einträge nicht gelöscht werden können, da dies die Arbeit der anderen Nutzer behindern würde. Solche Daten werden daher einem \"Gelöschten Nutzer\" zugewiesen. Da die Daten aller gelöschter Accounts dem \"Gelöschten Nutzer\" zugewiesen werden, ist es unmöglich, die vom Nutzer erstellten Daten diesem Nutzer zuzuordnen."
self: "Von den von Ihnen im Zuge der Nutzung der Anwendung erstellen Daten (z.B. E-Mail-Adresse, Systemeinstellungen, Tickets, Wiki-Einträgen) werden so viele wie möglich gelöscht. Bitte beachten Sie allerdings, dass Daten wie Tickets und Wiki-Einträge nicht gelöscht werden können, da dies die Arbeit der anderen Nutzer behindern würde. Solche Daten werden daher einem \"Gelöschten Nutzer\" zugewiesen. Da die Daten aller gelöschter Accounts dem \"Gelöschten Nutzer\" zugewiesen werden, ist es unmöglich, die von Ihnen erstellten Daten auf Ihre Person zurückzuführen."
other: "Von den vom Nutzer im Zuge der Nutzung der Anwendung erstellen Daten (z.B. E-Mail-Adresse, Systemeinstellungen, Arbeitspaketen, Wiki-Einträgen) werden so viele wie möglich gelöscht. Bitte beachten Sie allerdings, dass Daten wie Arbeitspakete und Wiki-Einträge nicht gelöscht werden können, da dies die Arbeit der anderen Nutzer behindern würde. Solche Daten werden daher einem \"Gelöschten Nutzer\" zugewiesen. Da die Daten aller gelöschter Accounts dem \"Gelöschten Nutzer\" zugewiesen werden, ist es unmöglich, die vom Nutzer erstellten Daten diesem Nutzer zuzuordnen."
self: "Von den von Ihnen im Zuge der Nutzung der Anwendung erstellen Daten (z.B. E-Mail-Adresse, Systemeinstellungen, Arbeitspakete, Wiki-Einträgen) werden so viele wie möglich gelöscht. Bitte beachten Sie allerdings, dass Daten wie Arbeitspakete und Wiki-Einträge nicht gelöscht werden können, da dies die Arbeit der anderen Nutzer behindern würde. Solche Daten werden daher einem \"Gelöschten Nutzer\" zugewiesen. Da die Daten aller gelöschter Accounts dem \"Gelöschten Nutzer\" zugewiesen werden, ist es unmöglich, die von Ihnen erstellten Daten auf Ihre Person zurückzuführen."
heading: "Lösche Account %{name}"
info:
other: "Das Löschen des Accounts kann nicht rückgängig gemacht werden."
@ -115,11 +115,11 @@ de:
repository:
url: "URL"
role:
assignable: "Tickets können dieser Rolle zugewiesen werden"
assignable: "Arbeitspakete können dieser Rolle zugewiesen werden"
time_entry:
activity: "Aktivität"
hours: "Stunden"
issue: "Ticket"
issue: "Arbeitspaket"
spent_on: "Datum"
type: "Typ"
type_color:
@ -263,7 +263,7 @@ de:
comment: "Kommentar"
custom_field: "Benutzerdefiniertes Feld"
group: "Gruppe"
issue: "Ticket"
issue: "Arbeitspaket"
category: "Kategorie"
status: "Arbeitspaket-Status"
member: "Mitglied"
@ -349,7 +349,7 @@ de:
button_collapse_all: "Alle zuklappen"
button_configure: "Konfigurieren"
button_copy: "Kopieren"
button_copy_and_follow: "Kopieren und Ticket anzeigen"
button_copy_and_follow: "Kopieren und Arbeitspaket anzeigen"
button_create: "Anlegen"
button_create_and_continue: "Anlegen und weiter"
button_delete: "Löschen"
@ -364,7 +364,7 @@ de:
button_log_time: "Aufwand buchen"
button_login: "Anmelden"
button_move: "Verschieben"
button_move_and_follow: "Verschieben und Ticket anzeigen"
button_move_and_follow: "Verschieben und Arbeitspaket anzeigen"
button_quote: "Zitieren"
button_remove_widget: "Infobox löschen"
button_rename: "Umbenennen"
@ -456,6 +456,10 @@ de:
x_seconds:
one: "1 Sekunde"
other: "%{count} Sekunden"
units:
hour:
one: "Stunde"
other: "Stunden"
default_activity_design: "Design"
default_activity_development: "Entwicklung"
@ -486,10 +490,10 @@ de:
description_attachment_toggle: "Dateien aus/einblenden"
description_autocomplete: >
Für dieses Feld werden Sie mit einer Autovervollständigung
unterstützt. Sie können einen Teil des Tickettitels schreiben und
bekommen eine Liste von möglichen Tickets angezeigt. Wählen Sie mit
unterstützt. Sie können einen Teil des Arbeitspakettitels schreiben und
bekommen eine Liste von möglichen Arbeitspaketen angezeigt. Wählen Sie mit
den Pfeiltasten den gewünschten Eintrag und bestätigen Sie mit Tab
oder Enter. Sie können aber auch die Ticketnummer direkt eintragen.
oder Enter. Sie können aber auch die Arbeitspaketnummer direkt eintragen.
description_available_columns: "Verfügbare Spalten"
description_choose_project: "Projekte"
description_compare_from: "Vergleiche von Version"
@ -529,7 +533,7 @@ de:
error_can_not_archive_project: "Dieses Projekt kann nicht archiviert werden."
error_can_not_delete_custom_field: "Kann das benutzerdefinierte Feld nicht löschen."
error_can_not_delete_type: "Dieser Typ enthält Tickets und kann nicht gelöscht werden."
error_can_not_delete_type: "Dieser Typ enthält Arbeitspakete und kann nicht gelöscht werden."
error_can_not_delete_standard_type: "Standardtypen können nicht gelöscht werden."
error_can_not_remove_role: "Diese Rolle wird verwendet und kann nicht gelöscht werden."
error_can_not_reopen_work_package_on_closed_version: "Das Arbeitspaket ist einer abgeschlossenen Version zugeordnet und kann daher nicht wieder geöffnet werden."
@ -538,13 +542,13 @@ de:
error_work_package_done_ratios_not_updated: "Der Arbeitspaket-Fortschritt wurde nicht aktualisiert."
error_work_package_not_found_in_project: "Das Arbeitspaket wurde nicht gefunden oder gehört nicht zu diesem Projekt."
error_must_be_project_member: "muss Mitglied des Projekts sein"
error_no_default_work_package_status: "Es ist kein Status als Standard definiert. Bitte überprüfen Sie Ihre Konfiguration (unter \"Administration -> Ticket-Status\")."
error_no_default_work_package_status: "Es ist kein Status als Standard definiert. Bitte überprüfen Sie Ihre Konfiguration (unter \"Administration -> Arbeitspaket-Status\")."
error_no_type_in_project: "Diesem Projekt ist kein Typ zugeordnet. Bitte überprüfen Sie die Projekteinstellungen."
error_omniauth_registration_timed_out: "Die Registrierung über einen externen Authentifizierungsprovider ist fehlgeschlagen. Bitte versuchen Sie es erneut."
error_scm_annotate: "Der Eintrag existiert nicht oder kann nicht annotiert werden."
error_scm_command_failed: "Beim Zugriff auf das Projektarchiv ist ein Fehler aufgetreten: %{value}"
error_scm_not_found: "Eintrag und/oder Revision existiert nicht im Projektarchiv."
error_unable_delete_status: "Der Ticket-Status konnte nicht gelöscht werden."
error_unable_delete_status: "Der Arbeitspaket-Status konnte nicht gelöscht werden."
error_unable_delete_default_status: "Der Arbeitspaket-Status konnte nicht gelöscht werden, da dieser als Standard-Status markiert ist. Wählen Sie bitte zunächst einen anderen Arbeitspaket-Status als Standard-Status."
error_unable_to_connect: "Fehler beim Verbinden (%{value})"
error_workflow_copy_source: "Bitte wählen Sie einen Quell-Typ und eine Quell-Rolle."
@ -589,7 +593,7 @@ de:
label_add_another_file: "Eine weitere Datei hinzufügen"
label_add_columns: "Ausgewählte Spalten hinzufügen"
label_add_note: "Kommentar hinzufügen"
label_add_related_issues: "Zugehöriges Ticket hinzufügen"
label_add_related_issues: "Zugehöriges Arbeitspaket hinzufügen"
label_add_related_work_packages: "Zugehöriges Arbeitspaket hinzufügen"
label_add_subtask: "Unteraufgabe hinzufügen"
label_added: "hinzugefügt"
@ -745,7 +749,7 @@ de:
label_work_package_status_plural: "Arbeitspaket-Status"
label_work_package_tracking: "Arbeitspakete"
label_work_package_updated: "Arbeitspaket aktualisiert"
label_work_package_view_all: "Alle Tickets anzeigen"
label_work_package_view_all: "Alle Arbeitspakete anzeigen"
label_work_package_view_all_assigned_to_me: "Alle mir zugewiesenen Arbeitspakete anzeigen"
label_work_package_view_all_reported_by_me: "Alle von mir erstellten Arbeitspakete anzeigen"
label_work_package_view_all_responsible_for: "Alle von mir verantworteten Arbeitspakete anzeigen"
@ -1040,13 +1044,13 @@ de:
mail_body_account_information_external: "Sie können sich mit Ihrem Konto %{value} anmelden."
mail_body_lost_password: "Benutzen Sie den folgenden Link, um Ihr Kennwort zu ändern:"
mail_body_register: "Um Ihr Konto zu aktivieren, benutzen Sie folgenden Link:"
mail_body_reminder: "%{count} Tickets, die Ihnen zugewiesen sind, müssen in den nächsten %{days} Tagen abgegeben werden:"
mail_body_reminder: "%{count} Arbeitspakete, die Ihnen zugewiesen sind, müssen in den nächsten %{days} Tagen abgegeben werden:"
mail_body_wiki_content_added: "Die Wiki-Seite '%{id}' wurde von %{author} hinzugefügt."
mail_body_wiki_content_updated: "Die Wiki-Seite '%{id}' wurde von %{author} aktualisiert."
mail_subject_account_activation_request: "Antrag auf %{value} Kontoaktivierung"
mail_subject_lost_password: "Ihr %{value} Kennwort"
mail_subject_register: "%{value} Kontoaktivierung"
mail_subject_reminder: "%{count} Tickets müssen in den nächsten %{days} Tagen abgegeben werden"
mail_subject_reminder: "%{count} Arbeitspakete müssen in den nächsten %{days} Tagen abgegeben werden"
mail_subject_wiki_content_added: "Wiki-Seite '%{id}' hinzugefügt"
mail_subject_wiki_content_updated: "Wiki-Seite '%{id}' erfolgreich aktualisiert"
@ -1168,7 +1172,7 @@ de:
permission_list_attachments: "Anhänge auflisten"
permission_log_time: "Aufwände buchen"
permission_manage_boards: "Foren verwalten"
permission_manage_categories: "Ticket-Kategorien verwalten"
permission_manage_categories: "Arbeitspaket-Kategorien verwalten"
permission_manage_work_package_relations: "Arbeitspaket-Beziehungen verwalten"
permission_manage_members: "Mitglieder verwalten"
permission_manage_news: "News verwalten"
@ -1227,7 +1231,7 @@ de:
setting_brute_force_block_after_failed_logins: "Sperre Benutzer nach dieser Anzahl fehlgeschlagener Loginversuche (deaktivieren mit 0)"
setting_brute_force_block_minutes: "Sperre Benutzer für Dauer (Minuten)"
setting_cache_formatted_text: "Formatierten Text im Cache speichern"
setting_column_options: "Anpassen der Darstellung der Ticketlisten"
setting_column_options: "Anpassen der Darstellung der Arbeitspaketlisten"
setting_commit_fix_keywords: "Schlüsselwörter (Status)"
setting_commit_logs_encoding: "Kodierung der Commit-Log-Meldungen"
setting_commit_logtime_activity_id: "Aktivität für die Zeiterfassung"
@ -1353,7 +1357,7 @@ de:
text_load_default_configuration: "Standard-Konfiguration laden"
text_min_max_length_info: "0 heißt keine Beschränkung"
text_no_configuration_data: >
Rollen, Typ, Ticket-Status und Workflows wurden noch nicht
Rollen, Typ, Arbeitspaket-Status und Workflows wurden noch nicht
konfiguriert. Es ist sehr zu empfehlen, die Standard-Konfiguration
zu laden. Sobald sie geladen ist, können Sie sie abändern.
text_own_membership_delete_confirmation: "Sie sind dabei, einige oder alle Ihre Berechtigungen zu entfernen. Es ist möglich, dass Sie danach das Projekt nicht mehr ansehen oder bearbeiten dürfen.\nSind Sie sicher, dass Sie dies tun möchten?"
@ -1375,7 +1379,7 @@ de:
text_tip_work_package_end_day: "Arbeitspaket, das an diesem Tag endet"
text_type_no_workflow: "Kein Workflow für diesen Typ definiert."
text_unallowed_characters: "Nicht erlaubte Zeichen"
text_user_mail_option: "Für nicht ausgewählte Projekte werden Sie nur Benachrichtigungen für Dinge erhalten, die Sie beobachten oder an denen Sie beteiligt sind (z. B. Tickets, deren Autor Sie sind oder die Ihnen zugewiesen sind)."
text_user_mail_option: "Für nicht ausgewählte Projekte werden Sie nur Benachrichtigungen für Dinge erhalten, die Sie beobachten oder an denen Sie beteiligt sind (z. B. Arbeitspakete, deren Autor Sie sind oder die Ihnen zugewiesen sind)."
text_user_wrote: "%{value} schrieb:"
text_warn_on_leaving_unsaved: "Der eingegebene Text wird nicht gespeichert, wenn Sie die Seite jetzt verlassen."
text_wiki_destroy_confirmation: "Sind Sie sicher, dass Sie dieses Wiki mit sämtlichem Inhalt löschen möchten?"
@ -1622,6 +1626,7 @@ de:
menu_item: "Menüpunkt"
menu_item_setting: "Sichtbarkeit"
wiki_menu_item_for: "Menüpunkt für die Wikiseite \"%{title}\""
wiki_menu_item_setting: "Sichtbarkeit"
wiki_menu_item_new_main_item_explanation: >

@ -454,6 +454,10 @@ en:
x_seconds:
one: "1 second"
other: "%{count} seconds"
units:
hour:
one: "hour"
other: "hours"
default_activity_design: "Design"
default_activity_development: "Development"
@ -1612,6 +1616,7 @@ en:
menu_item: "Menu item"
menu_item_setting: "Visibility"
wiki_menu_item_for: "Menu item for wikipage \"%{title}\""
wiki_menu_item_setting: "Visibility"
wiki_menu_item_new_main_item_explanation: >

@ -41,6 +41,7 @@ de:
button_edit: "Bearbeiten"
button_log_time: "Aufwand buchen"
button_move: "Verschieben"
button_open_details: "Öffne Detailansicht"
button_quote: "Zitieren"
button_save: "Speichern"
button_uncheck_all: "Alles abwählen"
@ -242,6 +243,22 @@ de:
title: "Ihr Browser wird nicht unterstützt"
message: "Sie verwenden einen veralteten Browser. OpenProject unterstützt diesen Browser nicht länger. Bitte aktualisieren Sie Ihren Browser."
learn_more: "Mehr erfahren"
wiki_formatting:
strong: "Fett"
italic: "Kursiv"
underline: "Unterstrichen"
deleted: "Duchgestrichen"
code: "Quelltext"
heading1: "Überschrift 1. Ordnung"
heading2: "Überschrift 2. Ordnung"
heading3: "Überschrift 3. Ordnung"
unordered_list: "Aufzählungsliste"
ordered_list: "Nummerierte Liste"
quote: "Zitieren"
unquote: "Zitat entfernen"
preformatted_text: "Präformatierter Text"
wiki_link: "Verweis (Link) zu einer Wiki-Seite"
image: "Grafik"
work_packages:
button_clear: "Zurücksetzen"
description_filter: "Filter"

@ -41,6 +41,7 @@ en:
button_edit: "Edit"
button_log_time: "Log time"
button_move: "Move"
button_open_details: "Open details view"
button_quote: "Quote"
button_save: "Save"
button_uncheck_all: "Uncheck all"
@ -244,6 +245,22 @@ en:
title: "Your browser is not supported"
message: "The browser you are using is no longer supported by OpenProject. Please update your browser."
learn_more: "Learn more"
wiki_formatting:
strong: "Strong"
italic: "Italic"
underline: "Underline"
deleted: "Deleted"
code: "Inline Code"
heading1: "Heading 1"
heading2: "Heading 2"
heading3: "Heading 3"
unordered_list: "Unordered List"
ordered_list: "Ordered List"
quote: "Quote"
unquote: "Unquote"
preformatted_text: "Preformatted Text"
wiki_link: "Link to a Wiki page"
image: "Image"
work_packages:
button_clear: "Clear"
description_filter: "Filter"

@ -29,8 +29,14 @@
/*jshint expr: true*/
describe('DetailsTabOverviewController', function() {
var DEFAULT_WORK_PACKAGE_PROPERTIES = ['status', 'assignee', 'responsible',
'date', 'percentageDone', 'priority',
'estimatedTime', 'versionName', 'spentTime']
var scope;
var buildController;
var HookService;
var ConfigurationService;
var I18n = { t: angular.identity },
WorkPackagesHelper = {
formatWorkPackageProperty: angular.identity
@ -57,6 +63,7 @@ describe('DetailsTabOverviewController', function() {
attachments: []
},
};
var workPackageAttributesStub;
function buildWorkPackageWithId(id) {
angular.extend(workPackage.props, {id: id});
@ -68,7 +75,7 @@ describe('DetailsTabOverviewController', function() {
'openproject.config',
'openproject.workPackages.controllers'));
beforeEach(inject(function($rootScope, $controller, $timeout) {
beforeEach(inject(function($rootScope, $controller, $timeout, _HookService_, _ConfigurationService_) {
var workPackageId = 99;
buildController = function() {
@ -85,6 +92,11 @@ describe('DetailsTabOverviewController', function() {
$timeout.flush();
};
HookService = _HookService_;
ConfigurationService = _ConfigurationService_;
workPackageAttributesStub = sinon.stub(ConfigurationService, "workPackageAttributes");
workPackageAttributesStub.returns(DEFAULT_WORK_PACKAGE_PROPERTIES);
}));
describe('initialisation', function() {
@ -330,7 +342,41 @@ describe('DetailsTabOverviewController', function() {
});
});
});
});
describe('Plug-in properties', function() {
var propertyName = 'myPluginProperty';
var directiveName = 'my-plugin-property-directive';
beforeEach(function() {
gon.settings = { };
gon.settings.work_package_attributes = [propertyName];
var attributes = DEFAULT_WORK_PACKAGE_PROPERTIES.slice(0);
attributes.push(propertyName);
workPackageAttributesStub.returns(attributes);
var workPackageOverviewAttributesStub = sinon.stub(HookService, "call");
workPackageOverviewAttributesStub.withArgs('workPackageOverviewAttributes',
{ type: propertyName,
workPackage: workPackage })
.returns([directiveName]);
workPackageOverviewAttributesStub.returns([]);
buildController();
});
it('adds plug-in property to present properties', function() {
expect(fetchPresentPropertiesWithName(propertyName)).to.have.length(1);
});
it('adds plug-in property to present properties', function() {
var propertyData = fetchPresentPropertiesWithName(propertyName)[0];
expect(propertyData.property).to.eq(propertyName);
expect(propertyData.format).to.eq('dynamic');
expect(propertyData.value).to.eq(directiveName);
});
});
});
});

@ -50,6 +50,12 @@ describe('WorkPackageDetailsController', function() {
]
},
embedded: {
author: {
props: {
id: 1,
status: 1
}
},
activities: [],
watchers: [],
attachments: [],

@ -32,7 +32,7 @@ describe('focus Directive', function() {
beforeEach(angular.mock.module('openproject.uiComponents'));
beforeEach(module('templates'));
beforeEach(inject(function($compile, $rootScope, $document) {
beforeEach(inject(function($compile, $rootScope, $document, $timeout) {
var html = '<input type="text" name="testInput" focus></input>';
doc = $document[0];
@ -46,6 +46,8 @@ describe('focus Directive', function() {
$compile(element)(scope);
scope.$digest();
$timeout.flush();
};
}));

@ -0,0 +1,176 @@
//-- 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('HookService', function() {
var HookService;
var validId = 'myValidCallbacks';
beforeEach(module('openproject.services'));
beforeEach(inject(function(_HookService_){
HookService = _HookService_;
}));
var shouldBehaveLikeEmptyResult = function(id) {
it('returns empty results', function() {
expect(HookService.call(id)).to.be.empty;
});
};
var shouldBehaveLikeResultWithElements = function(id, count) {
it('returns #count results', function() {
expect(HookService.call(id).length).to.eq(count);
});
};
var shouldBehaveLikeCalledCallback = function(id) {
beforeEach(function() {
HookService.call(id);
});
it('is called', function() {
expect(callback.called).to.be.true;
});
};
var shouldBehaveLikeUncalledCallback = function(id) {
beforeEach(function() {
HookService.call(id);
});
it('is not called', function() {
expect(invalidCallback.called).to.be.false;
});
};
describe('register', function() {
var invalidId = 'myInvalidCallbacks';
describe('no callback registered', function() {
shouldBehaveLikeEmptyResult(invalidId);
});
describe('undefined callback registered', function() {
beforeEach(function() {
HookService.register('myInvalidCallbacks');
});
shouldBehaveLikeEmptyResult(invalidId);
});
describe('non function callback registered', function() {
beforeEach(function() {
HookService.register('myInvalidCallbacks', 'eeek');
});
shouldBehaveLikeEmptyResult(invalidId);
});
describe('valid function callback registered', function() {
beforeEach(function() {
callback = sinon.spy();
HookService.register('myValidCallbacks', callback);
});
shouldBehaveLikeEmptyResult(validId);
shouldBehaveLikeCalledCallback(validId);
});
});
describe('call', function() {
describe('function that returns undefined', function() {
beforeEach(function() {
callback = sinon.spy();
HookService.register('myValidCallbacks', callback);
});
shouldBehaveLikeCalledCallback(validId);
shouldBehaveLikeEmptyResult(validId);
});
describe('function that returns something that is not undefined', function() {
beforeEach(function() {
callback = sinon.stub();
callback.returns(new Object());
HookService.register('myValidCallbacks', callback);
});
shouldBehaveLikeCalledCallback(validId);
shouldBehaveLikeResultWithElements(validId, 1);
});
describe('function that returns something that is not undefined', function() {
beforeEach(function() {
callback = sinon.stub();
callback.returns(new Object());
HookService.register('myValidCallbacks', callback);
});
shouldBehaveLikeCalledCallback(validId);
shouldBehaveLikeResultWithElements(validId, 1);
});
describe('function that returns something that is not undefined', function() {
beforeEach(function() {
callback = sinon.spy();
invalidCallback = sinon.spy();
HookService.register('myValidCallbacks', callback);
HookService.register('myInvalidCallbacks', invalidCallback);
});
shouldBehaveLikeCalledCallback(validId);
shouldBehaveLikeUncalledCallback(validId);
});
describe('function that returns something that is not undefined', function() {
beforeEach(function() {
callback1 = sinon.stub();
callback1.returns(new Object());
callback2 = sinon.stub();
callback2.returns(new Object());
HookService.register('myValidCallbacks', callback1);
HookService.register('myValidCallbacks', callback2);
});
shouldBehaveLikeResultWithElements(validId, 2);
});
});
});

@ -100,11 +100,11 @@ describe('workPackageContextMenu', function() {
});
it('lists link tags for any permitted action', function(){
expect(directListElements.length).to.equal(2);
expect(directListElements.length).to.equal(3);
});
it('assigns a css class named by the action', function(){
expect(directListElements[0].className).to.equal(actions[0]);
expect(directListElements[1].className).to.equal(actions[0]);
});
it('adds an icon from the icon fonts to each list container', function() {
@ -139,7 +139,7 @@ describe('workPackageContextMenu', function() {
});
it('displays a link triggering deleteWorkPackages within the scope', function() {
expect(directListElements.find('a').attr('ng-click')).to.equal('deleteWorkPackages()');
expect(directListElements.find('a.icon-delete').attr('ng-click')).to.equal('deleteWorkPackages()');
});
});
});

@ -34,8 +34,17 @@
module API
class Root < Grape::API
prefix :api
class Formatter
def call(object, env)
object.respond_to?(:to_json) ? object.to_json : MultiJson.dump(object)
end
end
content_type 'hal+json', 'application/hal+json'
content_type :json, 'application/json'
format 'hal+json'
formatter 'hal+json', Formatter.new
helpers do
def current_user
@ -56,7 +65,7 @@ module API
def build_representer(obj, model_klass, representer_klass, options = {})
model = (obj.kind_of?(Array)) ? obj.map{ |o| model_klass.new(o) } : model_klass.new(obj)
representer_klass.new(model, options).to_json
representer_klass.new(model, options)
end
end

@ -46,7 +46,7 @@ module API
get do
authorize(:view_project, context: @activity.journable.project)
@representer.to_json
@representer
end
helpers do
@ -55,7 +55,7 @@ module API
model = ::API::V3::Activities::ActivityModel.new(activity)
representer = ::API::V3::Activities::ActivityRepresenter.new(model)
representer.to_json
representer
else
errors = activity.errors.full_messages.join(", ")
fail Errors::Validation.new(activity, description: errors)

@ -49,20 +49,20 @@ module API
property :_type, exec_context: :decorator
link :self do
{ href: "#{root_url}api/v3/activities/#{represented.model.id}", title: "#{represented.model.id}" }
{ href: "#{root_path}api/v3/activities/#{represented.model.id}", title: "#{represented.model.id}" }
end
link :workPackage do
{ href: "#{root_url}api/v3/work_packages/#{represented.model.journable.id}", title: "#{represented.model.journable.subject}" }
{ href: "#{root_path}api/v3/work_packages/#{represented.model.journable.id}", title: "#{represented.model.journable.subject}" }
end
link :user do
{ href: "#{root_url}api/v3/users/#{represented.model.user.id}", title: "#{represented.model.user.name} - #{represented.model.user.login}" }
{ href: "#{root_path}api/v3/users/#{represented.model.user.id}", title: "#{represented.model.user.name} - #{represented.model.user.login}" }
end
link :update do
{
href: "#{root_url}api/v3/activities/#{represented.model.id}",
href: "#{root_path}api/v3/activities/#{represented.model.id}",
method: :patch,
title: "#{represented.model.id}"
} if current_user_allowed_to_edit?

@ -43,17 +43,17 @@ module API
property :_type, exec_context: :decorator
link :self do
{ href: "#{root_url}api/v3/attachments/#{represented.model.id}", title: "#{represented.model.filename}" }
{ href: "#{root_path}api/v3/attachments/#{represented.model.id}", title: "#{represented.model.filename}" }
end
link :work_package do
work_package = represented.model.container
{ href: "#{root_url}api/v3/work_packages/#{work_package.id}", title: "#{work_package.subject}" } unless work_package.nil?
{ href: "#{root_path}api/v3/work_packages/#{work_package.id}", title: "#{work_package.subject}" } unless work_package.nil?
end
link :author do
author = represented.model.author
{ href: "#{root_url}api/v3/users/#{author.id}", title: "#{author.name} - #{author.login}" } unless author.nil?
{ href: "#{root_path}api/v3/users/#{author.id}", title: "#{author.name} - #{author.login}" } unless author.nil?
end
property :id, getter: -> (*) { model.id }, render_nil: true

@ -46,7 +46,7 @@ module API
get do
authorize(:view_project, context: @attachment.container.project)
@representer.to_json
@representer
end
end

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save