Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
- https://github.com/ObeoNetwork/pepper/issues/18[#18] Enhance the ergonomy of contextual menu in Gantt
- https://github.com/ObeoNetwork/pepper/issues/49[#49] Rework the detail views of Task and Workpackage
- https://github.com/ObeoNetwork/pepper/issues/55[#55] Link detail view updates with Gantt view
- https://github.com/ObeoNetwork/pepper/issues/42[#42] Change behavior for start and end dates of a work package

=== Bug fixes

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,10 @@
******************************************************************************/
package pepper.peppermm.impl;

import java.time.Instant;
import java.time.LocalDate;

import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.util.Collection;

Expand Down Expand Up @@ -367,13 +369,45 @@ public void setDescription(String newDescription) {
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
* @generated NOT
*/
@Override
public LocalDate getStartDate() {
if (ownedTasks != null && !ownedTasks.isEmpty()) {
Instant oldestInstant = null;
for (Task task : ownedTasks) {
Instant newOldestInstant = getOldestInstant(task, null);
if (oldestInstant == null || (newOldestInstant != null && newOldestInstant.isBefore(oldestInstant))) {
oldestInstant = newOldestInstant;
}
}
if (oldestInstant != null) {
return LocalDate.ofInstant(oldestInstant, ZoneId.systemDefault());
}
}
return startDate;
}

/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated NOT
*/
private Instant getOldestInstant(Task task, Instant oldestInstant) {
Instant startTime = task.getStartTime();

if (startTime != null && (oldestInstant == null || startTime.isBefore(oldestInstant))) {
oldestInstant = startTime;
}

if (task.getSubTasks() != null) {
for (Task subTask : task.getSubTasks()) {
oldestInstant = getOldestInstant(subTask, oldestInstant);
}
}
return oldestInstant;
}

/**
* If the workpackage's {@code startDate} is constrained by {@code START_END}, it is not changed
*
Expand Down Expand Up @@ -406,13 +440,45 @@ public void setStartDate(LocalDate newStartDate) {
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
* @generated NOT
*/
@Override
public LocalDate getEndDate() {
if (ownedTasks != null && !ownedTasks.isEmpty()) {
Instant latestInstant = null;
for (Task task : ownedTasks) {
Instant newLattestInstant = getLatestInstant(task, null);
if (latestInstant == null || (newLattestInstant != null && newLattestInstant.isAfter(latestInstant))) {
latestInstant = newLattestInstant;
}
}
if (latestInstant != null) {
return LocalDate.ofInstant(latestInstant, ZoneId.systemDefault());
}
}
return endDate;
}

/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated NOT
*/
private Instant getLatestInstant(Task task, Instant latestInstant) {
Instant endTime = task.getEndTime();

if (endTime != null && (latestInstant == null || endTime.isAfter(latestInstant))) {
latestInstant = endTime;
}

if (task.getSubTasks() != null) {
for (Task subTask : task.getSubTasks()) {
latestInstant = getLatestInstant(subTask, latestInstant);
}
}
return latestInstant;
}

/**
* If the workpackage's {@code endDate} is constrained by {@code START_END}, it is not changed
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,10 @@ private TextfieldDescription getDurationWidget() {
String id = "workpackage.duration";
return TextfieldDescription.newTextfieldDescription(id)
.isReadOnlyProvider(vm -> vm.get(VariableManager.SELF, Workpackage.class)
.map(workpackage -> workpackage.getCalculationOption() == TaskTimeBoundariesConstraint.START_END || isDateOptionForced(workpackage))
.map(workpackage -> workpackage.getCalculationOption() == TaskTimeBoundariesConstraint.START_END
|| isDateOptionForced(workpackage)
|| !workpackage.getOwnedTasks().isEmpty()
)
.orElse(true))
.idProvider(variableManager -> id)
.targetObjectIdProvider(this.propertiesConfigurerService.getSemanticTargetIdProvider())
Expand Down Expand Up @@ -357,36 +360,6 @@ private ReferenceWidgetDescription getDependenciesWidget() {
.build();
}

private Optional<Object> getItem(VariableManager variableManager) {
return variableManager.get(ReferenceWidgetComponent.ITEM_VARIABLE, Object.class);
}

private List<?> getReferenceValue(VariableManager variableManager, Object feature) {
List<?> value = List.of();
EStructuralFeature.Setting setting = this.resolveSetting(variableManager, feature);
if (setting != null) {
var rawValue = setting.get(true);
if (setting.getEStructuralFeature().isMany()) {
value = (List<?>) rawValue;
} else if (rawValue != null) {
value = List.of(rawValue);
} else {
value = List.of();
}
}
return value;
}

private EStructuralFeature.Setting resolveSetting(VariableManager variableManager, Object feature) {
EObject referenceOwner = variableManager.get(VariableManager.SELF, EObject.class).orElse(null);
if (referenceOwner != null && feature instanceof EReference reference) {
return ((InternalEObject) referenceOwner).eSetting(reference);
} else {
return null;
}
}


private DateTimeDescription getStartDateWidget() {
Function<VariableManager, String> valueProvider = variableManager -> variableManager.get(VariableManager.SELF, Workpackage.class)
.map(workpackage -> {
Expand Down Expand Up @@ -421,7 +394,11 @@ private DateTimeDescription getStartDateWidget() {
String id = "workpackage.startTime";
return DateTimeDescription.newDateTimeDescription(id)
.isReadOnlyProvider(vm -> vm.get(VariableManager.SELF, Workpackage.class)
.map(workpackage -> workpackage.getCalculationOption() == TaskTimeBoundariesConstraint.END_DURATION || isDateOptionForced(workpackage) || isPointed(workpackage, StartOrEnd.START))
.map(workpackage -> workpackage.getCalculationOption() == TaskTimeBoundariesConstraint.END_DURATION
|| isDateOptionForced(workpackage)
|| isPointed(workpackage, StartOrEnd.START)
|| !workpackage.getOwnedTasks().isEmpty()
)
.orElse(true))
.idProvider(variableManager -> id)
.targetObjectIdProvider(this.propertiesConfigurerService.getSemanticTargetIdProvider())
Expand Down Expand Up @@ -469,7 +446,11 @@ private DateTimeDescription getEndDateWidget() {
String id = "workpackage.endTime";
return DateTimeDescription.newDateTimeDescription(id)
.isReadOnlyProvider(vm -> vm.get(VariableManager.SELF, Workpackage.class)
.map(workpackage -> workpackage.getCalculationOption() == TaskTimeBoundariesConstraint.START_DURATION || isDateOptionForced(workpackage) || isPointed(workpackage, StartOrEnd.END))
.map(workpackage -> workpackage.getCalculationOption() == TaskTimeBoundariesConstraint.START_DURATION
|| isDateOptionForced(workpackage)
|| isPointed(workpackage, StartOrEnd.END)
|| !workpackage.getOwnedTasks().isEmpty()
)
.orElse(true))
.idProvider(variableManager -> id)
.targetObjectIdProvider(this.propertiesConfigurerService.getSemanticTargetIdProvider())
Expand Down Expand Up @@ -497,6 +478,35 @@ private Boolean isPointed(Workpackage workpackage, StartOrEnd startOrEnd) {
return false;
}

private Optional<Object> getItem(VariableManager variableManager) {
return variableManager.get(ReferenceWidgetComponent.ITEM_VARIABLE, Object.class);
}

private List<?> getReferenceValue(VariableManager variableManager, Object feature) {
List<?> value = List.of();
EStructuralFeature.Setting setting = this.resolveSetting(variableManager, feature);
if (setting != null) {
var rawValue = setting.get(true);
if (setting.getEStructuralFeature().isMany()) {
value = (List<?>) rawValue;
} else if (rawValue != null) {
value = List.of(rawValue);
} else {
value = List.of();
}
}
return value;
}

private EStructuralFeature.Setting resolveSetting(VariableManager variableManager, Object feature) {
EObject referenceOwner = variableManager.get(VariableManager.SELF, EObject.class).orElse(null);
if (referenceOwner != null && feature instanceof EReference reference) {
return ((InternalEObject) referenceOwner).eSetting(reference);
} else {
return null;
}
}

private Function<VariableManager, List<?>> getPersonsProvider() {
return variableManager -> variableManager.get(VariableManager.SELF, EObject.class)
.map(EObject::eResource)
Expand Down
Loading