Files
BeWoPlaner/BeWoPlanerMobil/Views/Main/GoalTreePartial.cshtml
2025-06-11 22:56:25 +02:00

210 lines
7.6 KiB
Plaintext

@using BeWoPlanerMobil.Models
@using BeWoPlanerMobil.Util
@using BS.Shared
@using BS.Shared.DataContracts
@model MainModel
<script type="text/javascript">
function toggleGoalHeader(branchId) {
try {
$(branchId).collapse("toggle");
} catch(error) {
showErrorPopup(error);
}
}
function stopToggle(e) {
try {
e.stopPropagation();
} catch(error) {
showErrorPopup(error);;
}
}
function goalTreeSearchOnChangeV2() {
try {
var text = $("#goal-search-input").val().toLowerCase();
if(text.length === 0 || !text.replace(/\s\g/, '').length) {
resetGoalTreeSearch();
return;
}
$(".goal-card, .goal-text").hide();
var goalLabels = $(".goal-name-label");
$.each(goalLabels, function (index, item) {
var label = $(item);
var goalText = $.trim(label.text());
if (false === goalText.toLowerCase().includes(text)) {
return;
}
var parents = label.parents(".goal-card, .goal-text");
parents.show();
});
} catch(error) {
showErrorPopup(error);
}
}
function resetGoalTreeSearch() {
try {
$("#goal-search-input").val("");
var entries = $(".goal-text");
var treeCard = $(".goal-card");
var collapsable = treeCard.find(".collapse");
entries.show();
treeCard.show();
hideCollapsable(collapsable);
} catch (error) {
showErrorPopup(error);
}
}
function getCheckedGoals() {
try {
var rootElement = $("#goals-tree");
var checkboxes = rootElement.find("input");
var selectedGoals = "";
$.each(checkboxes, function(index, checkbox) {
var box = $(checkbox);
var id = box.attr("id").split("-")[2];
if(box.prop("checked") === true && !id.includes("goal")) {
selectedGoals += id + ";";
}
});
return selectedGoals.substr(0, selectedGoals.length - 1);
} catch(error) {
showErrorPopup(error);
}
}
function updateSelectedGoals() {
try {
var selectedGoals = getCheckedGoals();
$.get("@Url.Action("UpdateGoals")", {pGoalOids: selectedGoals}, function (numberOfSelectedGoals) {
$("#goals-button").html(`Ziele <span class='badge badge-light text-primary'>${numberOfSelectedGoals}</span>`);
});
} catch(error) {
showErrorPopup(error);
}
}
function toggleAllGoalsSelection(element) {
try {
$('.goal-input').prop("checked", $(element).is(':checked'));
updateSelectedGoals();
} catch(error) {
showErrorPopup(error);
}
}
function showAllGoals() {
try {
$(".goal-collapse").collapse("show");
} catch(error) {
showErrorPopup(error);
}
}
function hideAllGoals() {
try {
$(".goal-collapse").collapse("hide");
} catch(error) {
showErrorPopup(error);
}
}
</script>
@*
ToDo für Montag, 15.07.2024: Bis 30 Ziele/Maßnahmen standardmäßig alles ausklappen, ansonsten einklappen
ToDo: Alles/Nichts auswählen implementieren
*@
@helper BuildGoalTreeBranch(GoalTreeItem goalTreeItem)
{
var collapseClass = Model.GoalTree.Count <= 30 ? "collapse show" : "collapse";
var isChecked = Model.SelectedGoals.Any(a => a.ValueListEntryOid.HasValue && a.ValueListEntryOid.Value == goalTreeItem.ValueListEntryOid);
var isCheckedValue = isChecked ? "checked" : string.Empty;
var textClass = goalTreeItem.ValueListEntryType == ValueListEntryType.SupportConceptIndividualGoalCategoryType ||
goalTreeItem.ValueListEntryType == ValueListEntryType.SupportConceptIndividualGoalType
? "text-bewo-custom-goal"
: string.Empty;
RatingTypeDC ratingType = null;
if(isChecked)
{
var selectedGoal = Model.SelectedGoals.FirstOrDefault(f => f.ValueListEntryOid.HasValue && f.ValueListEntryOid.Value == goalTreeItem.ValueListEntryOid);
if(!(selectedGoal is null))
{
ratingType = Model.GoalRatingTypes.FirstOrDefault(f => f.RatingTypeOid.HasValue && f.RatingTypeOid.Value == selectedGoal.RatingTypeOid);
}
}
if(!goalTreeItem.IsLeaf)
{
<div class="card w-100 mb-3 goal-card" id="c-@goalTreeItem.ValueListEntryOid">
<div class="card-header px-2" onclick="cardHeaderClick('#goal-chevron-@goalTreeItem.ValueListEntryOid', '#collapsable-goal-tree-branch-@goalTreeItem.ValueListEntryOid')">
<div class="clearfix">
<div class="custom-control custom-checkbox goal-card-header float-left" onclick="stopToggle(event)" >
<input type="checkbox" class="custom-control-input goal-input" value="@goalTreeItem.ValueListEntryOid" @isCheckedValue id="goal-cb-@goalTreeItem.ValueListEntryOid" onchange="updateSelectedGoals()" />
<label class="custom-control-label goal-name-label @textClass" for="goal-cb-@goalTreeItem.ValueListEntryOid">@goalTreeItem.Header</label>
@if(Model.HasRightToRateGoals)
{
<span style="cursor: pointer;" id="goal-rating-@goalTreeItem.ValueListEntryOid" class="badge badge-bewo-goal-rating goal-rating-badge ml-1" onclick="showGoalRatingPopup(@goalTreeItem.ValueListEntryOid)">
@(ratingType?.DisplayName ?? goalTreeItem.RatingName)
</span>
}
</div>
<div class="btn-group float-right" role="group">
<span class="fas fa-chevron-down text-primary align-middle" id="goal-chevron-@goalTreeItem.ValueListEntryOid"></span>
</div>
</div>
</div>
<div class="@collapseClass goal-collapse" id="collapsable-goal-tree-branch-@goalTreeItem.ValueListEntryOid">
<div class="card-body p-1 goal-list">
@foreach(var child in goalTreeItem.Children.OrderBy(child => child.Header))
{
@BuildGoalTreeBranch(child)
}
</div>
</div>
</div>
}
else
{
var marginBottom = goalTreeItem.IsGoal ? "mb-3 mx-2" : "";
<div class="custom-control custom-checkbox goal-text @marginBottom">
<input type="checkbox" class="custom-control-input goal-input" id="goal-cb-@goalTreeItem.ValueListEntryOid" @isCheckedValue onchange="updateSelectedGoals()">
<label for="goal-cb-@goalTreeItem.ValueListEntryOid" class="custom-control-label goal-name-label @textClass">@goalTreeItem.Header</label>
@if(Model.HasRightToRateGoals)
{
<span id="goal-rating-@goalTreeItem.ValueListEntryOid" style="cursor: pointer;" class="badge badge-bewo-goal-rating goal-rating-badge ml-1" onclick="showGoalRatingPopup(@goalTreeItem.ValueListEntryOid)">
@(ratingType?.DisplayName ?? goalTreeItem.RatingName)
</span>
}
</div>
}
}
@foreach(var branch in Model.GoalTree.OrderBy(goalTreeItem => goalTreeItem.Header))
{
@BuildGoalTreeBranch(branch)
}