parent
31709781e9
commit
7577385057
@ -0,0 +1,15 @@ |
||||
<div class="dropdown-wrapper"> |
||||
<label |
||||
class="hidden-for-sighted" |
||||
for="inplace-edit--write-value--{{::field.name}}"> |
||||
{{::field.getLabel()}} |
||||
</label> |
||||
<select |
||||
ng-disabled="fieldController.state.isBusy" |
||||
ng-model="field.value.props" |
||||
title="{{ fieldController.editTitle }}" |
||||
class="inplace-edit-select" |
||||
id="inplace-edit--write-value--{{::field.name}}" |
||||
ng-options="option as option.name for option in customEditorController.allowedValues track by option.hrefTracker"> |
||||
</select> |
||||
</div> |
@ -0,0 +1,135 @@ |
||||
// -- copyright
|
||||
// OpenProject is a project management system.
|
||||
// Copyright (C) 2012-2015 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.inplace-edit') |
||||
.directive('inplaceEditorType', inplaceEditorType); |
||||
|
||||
function inplaceEditorType(EditableFieldsState, FocusHelper, WorkPackageService) { |
||||
return { |
||||
restrict: 'E', |
||||
transclude: true, |
||||
replace: true, |
||||
require: '^workPackageField', |
||||
templateUrl: '/components/inplace-edit/directives/field-edit/edit-type/' + |
||||
'edit-type.directive.html', |
||||
|
||||
controller: InplaceEditorTypeController, |
||||
controllerAs: 'customEditorController', |
||||
|
||||
link: function(scope, element, attrs, fieldController) { |
||||
var field = scope.field; |
||||
|
||||
fieldController.state.isBusy = true; |
||||
|
||||
scope.emptyField = !scope.field.isRequired(); |
||||
|
||||
scope.customEditorController.updateAllowedValues(field.name).then(function() { |
||||
fieldController.state.isBusy = false; |
||||
|
||||
if (!EditableFieldsState.forcedEditState) { |
||||
EditableFieldsState.editAll.state || FocusHelper.focusUiSelect(element); |
||||
} |
||||
}); |
||||
|
||||
scope.$watch('field.value.props', function(newValue, oldValue) { |
||||
if (newValue.hrefTracker !== oldValue.hrefTracker) { |
||||
scope.$emit('form.updateRequired'); |
||||
} |
||||
}); |
||||
} |
||||
}; |
||||
} |
||||
inplaceEditorType.$inject = ['EditableFieldsState', 'FocusHelper', 'WorkPackageService']; |
||||
|
||||
function InplaceEditorTypeController($q, $scope, I18n, WorkPackageFieldConfigurationService) { |
||||
|
||||
this.allowedValues = []; |
||||
|
||||
this.updateAllowedValues = function(field) { |
||||
var customEditorController = this; |
||||
|
||||
return $q(function(resolve) { |
||||
$scope.field.getAllowedValues() |
||||
.then(function(values) { |
||||
|
||||
var sorting = WorkPackageFieldConfigurationService |
||||
.getDropdownSortingStrategy(field); |
||||
|
||||
if (sorting !== null) { |
||||
values = _.sortBy(values, sorting); |
||||
} |
||||
|
||||
if (!$scope.field.isRequired()) { |
||||
values = addEmptyOption(values); |
||||
} |
||||
|
||||
addHrefTracker(values); |
||||
|
||||
customEditorController.allowedValues = values; |
||||
|
||||
resolve(); |
||||
}); |
||||
}); |
||||
}; |
||||
|
||||
var addEmptyOption = function(values) { |
||||
var emptyOption = { props: { href: null, |
||||
name: $scope.field.placeholder } }; |
||||
|
||||
if (!$scope.field.isRequired()) { |
||||
var arrayWithEmptyOption = [emptyOption.props]; |
||||
|
||||
values = arrayWithEmptyOption.concat(values); |
||||
|
||||
if ($scope.field.value === null) { |
||||
$scope.field.value = emptyOption; |
||||
} |
||||
} |
||||
|
||||
return values; |
||||
}; |
||||
|
||||
// We have to maintain a separate property just to track the object by
|
||||
// in the template. This is due to angular aparently not being able to
|
||||
// track correclty with a field having null as it's value. It does work for
|
||||
// 'null' (String) however.
|
||||
var addHrefTracker = function(values) { |
||||
_.forEach(values, function(value) { |
||||
value.hrefTracker = String(value.href); |
||||
}); |
||||
|
||||
$scope.field.value.props.hrefTracker = String($scope.field.value.props.href); |
||||
}; |
||||
} |
||||
|
||||
InplaceEditorTypeController.$inject = [ |
||||
'$q', |
||||
'$scope', |
||||
'I18n', |
||||
'WorkPackageFieldConfigurationService']; |
@ -0,0 +1 @@ |
||||
<inplace-editor-type></inplace-editor-type> |
Loading…
Reference in new issue