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
65 changes: 43 additions & 22 deletions components/ILIAS/Conditions/classes/class.ilConditionHandlerGUI.php
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
<?php

declare(strict_types=1);

/**
* This file is part of ILIAS, a powerful learning management system
* published by ILIAS open source e-Learning e.V.
Expand All @@ -18,6 +16,8 @@
*
*********************************************************************/

declare(strict_types=1);

use ILIAS\Refinery\Factory;
use ILIAS\HTTP\GlobalHttpState;
use ILIAS\Conditions\Configuration\ConditionTriggerTableGUI;
Expand Down Expand Up @@ -893,9 +893,10 @@ protected function initCompulsoryForm(bool $with_request = false): ?StandardForm
$this->getTargetId(),
$this->getTargetType()
);
$is_subset_mode = count($optional_conditions) > 0;

$old_status = $this->ui_factory->input()->field()->hidden()->withValue(
(string) (count($optional_conditions) ? self::LIST_MODE_SUBSET : self::LIST_MODE_ALL)
(string) ($is_subset_mode ? self::LIST_MODE_SUBSET : self::LIST_MODE_ALL)
);

$hidden = $this->ui_factory->input()->field()->checkbox(
Expand All @@ -911,30 +912,50 @@ protected function initCompulsoryForm(bool $with_request = false): ?StandardForm
$list_mode_items[self::LIST_MODE_ALL] = $condition_mode_all;

$subset_limit = [];
if (count($all_conditions) > 1) {
$compulsory_count = 0;
foreach ($all_conditions as $condition) {
if ($condition['obligatory']) {
$compulsory_count++;
}
}

$all_conditions_number = count($all_conditions);
if ($all_conditions_number > 1) {

$num_required = ilConditionHandler::lookupObligatoryConditionsOfTarget(
$this->getTargetRefId(),
$this->getTargetId()
);
$subset_limit['num_compulsory'] =
$this->ui_factory->input()
->field()
->numeric(
$this->lng->txt('precondition_num_obligatory'),
$this->lng->txt('precondition_num_optional_info')
)
->withValue($num_required > 0 ? $num_required : null)
->withAdditionalTransformation(
$this->refinery->logical()->parallel(
[
$this->refinery->int()->isGreaterThan(0),
$this->refinery->int()->isLessThan(count($all_conditions))
]
)
);
}
if (count($all_conditions) > 1) {
$subset_limit['num_compulsory'] = $this->ui_factory->input()->field()
->numeric(
$this->lng->txt('precondition_num_obligatory'),
$this->lng->txt('precondition_num_optional_info')
)
->withValue($num_required > 0 ? $num_required : null)
->withAdditionalTransformation(
$this->refinery->custom()->constraint(
fn($val) => $val >= 1,
$this->lng->txt('precondition_number_of_required_materials_lower_than_one')
)
)
// check if the number of required materials is bigger than compulsory conditions in subset mode
->withAdditionalTransformation(
$this->refinery->custom()->constraint(
function ($val) use ($is_subset_mode, $compulsory_count) {
if ($is_subset_mode) {
return $val >= $compulsory_count + 1;
}
return true;
},
$this->lng->txt('precondition_number_of_required_materials_lower_compulsory_items')
)
)
->withAdditionalTransformation(
$this->refinery->custom()->constraint(
fn($val) => $val <= $all_conditions_number - 1,
$this->lng->txt('precondition_number_of_required_materials_bigger_preconditions_number')
)
);
$condition_mode_subset = $this->ui_factory->input()->field()->group(
$subset_limit,
$this->lng->txt('rbac_precondition_mode_subset'),
Expand Down
3 changes: 3 additions & 0 deletions lang/ilias_de.lang
Original file line number Diff line number Diff line change
Expand Up @@ -14516,6 +14516,9 @@ rbac#:#positions_override_operations#:#Globale Einstellungen überschreiben
rbac#:#precondition_not_obligatory_alt#:#Die Vorbedingung ist optional
rbac#:#precondition_num_obligatory#:#Geforderte Anzahl Materialien
rbac#:#precondition_num_optional_info#:#Anzahl von Materialien, die bis zum festgelegten Status / Ergebnis zu bearbeiten sind
rbac#:#precondition_number_of_required_materials_bigger_preconditions_number#:#Die Anzahl der geforderten Materialien muss kleiner sein als die Anzahl der Vorbedingungen.
rbac#:#precondition_number_of_required_materials_lower_compulsory_items#:#Die Anzahl der geforderten Materialien muss größer sein als die Anzahl der verpflichtenden Vorbedingungen.
rbac#:#precondition_number_of_required_materials_lower_than_one#:#Die Anzahl der geforderten Materialien muss mindestens 1 sein.
rbac#:#precondition_obligatory#:#Verpflichtend
rbac#:#precondition_obligatory_alt#:#Die Vorbedingung muss erfüllt werden
rbac#:#precondition_obligatory_info#:#Verpflichtende Vorbedingungen müssen erfüllt werden, um Zugriff zu erhalten.
Expand Down
3 changes: 3 additions & 0 deletions lang/ilias_en.lang
Original file line number Diff line number Diff line change
Expand Up @@ -14517,6 +14517,9 @@ rbac#:#positions_override_operations#:#Override global Settings
rbac#:#precondition_not_obligatory_alt#:#Precondition is optional
rbac#:#precondition_num_obligatory#:#Number of Required Materials
rbac#:#precondition_num_optional_info#:#Please enter the minimum number of materials required to fulfill this precondition.
rbac#:#precondition_number_of_required_materials_bigger_preconditions_number#:#The number of required materials must be less than the total number of preconditions.
rbac#:#precondition_number_of_required_materials_lower_compulsory_items#:#The number of required materials must be greater than the number of compulsory preconditions.
rbac#:#precondition_number_of_required_materials_lower_than_one#:#The number of required materials must be at least 1.
rbac#:#precondition_obligatory#:#Compulsory
rbac#:#precondition_obligatory_alt#:#Precondition must be fulfilled
rbac#:#precondition_obligatory_info#:#Compulsory preconditions must be fulfilled, for having access.
Expand Down
Loading