Siehe MoK-Release Notes 1/2025
This commit is contained in:
@@ -610,6 +610,15 @@
|
||||
<Content Include="Views\Main\MultiBookingSelectionPartial.cshtml" />
|
||||
<Content Include="Views\Main\MultiBookingScCbRelList.cshtml" />
|
||||
<Content Include="Views\Main\GoalRatingPopupContentPartial.cshtml" />
|
||||
<Content Include="Views\Scheduler\SchedulerEmployeeSelectionPartial.cshtml" />
|
||||
<Content Include="Views\Scheduler\SchedulerCustomerSelectionPartial.cshtml" />
|
||||
<Content Include="Views\Scheduler\SchedulerResourceSelectionPartial.cshtml" />
|
||||
<Content Include="Views\Scheduler\EmployeeSelectionPopupPartial.cshtml" />
|
||||
<Content Include="Views\Scheduler\EmployeeSelectionPopupListPartial.cshtml" />
|
||||
<Content Include="Views\Scheduler\CustomerSelectionPopupPartial.cshtml" />
|
||||
<Content Include="Views\Scheduler\CustomerSelectionPopupListPartial.cshtml" />
|
||||
<Content Include="Views\Scheduler\ResourceSelectionPopupPartial.cshtml" />
|
||||
<Content Include="Views\Scheduler\ResourceSelectionPopupListPartial.cshtml" />
|
||||
<Content Include="Views\ReportViewer\BerichteFormPartialView.cshtml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
||||
@@ -180,6 +180,22 @@ textarea {
|
||||
max-width: 1200px;
|
||||
}
|
||||
|
||||
.service-record-table {
|
||||
table-layout: auto;
|
||||
margin-right: -15px;
|
||||
margin-left: -15px;
|
||||
}
|
||||
|
||||
.service-record-table tr td:first-child {
|
||||
width: min-content;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.service-record-table tr td:nth-child(2) {
|
||||
width: 100%;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
/*!
|
||||
* Bootstrap v4.4.1 (https://getbootstrap.com/)
|
||||
* Copyright 2011-2019 The Bootstrap Authors
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -208,6 +208,22 @@ $font-family-sans-serif: 'Signika Negative', sans-serif;
|
||||
max-width: 1200px;
|
||||
}
|
||||
|
||||
.service-record-table {
|
||||
table-layout: auto;
|
||||
margin-right: -15px;
|
||||
margin-left: -15px;
|
||||
}
|
||||
|
||||
.service-record-table tr td:first-child {
|
||||
width: min-content;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.service-record-table tr td:nth-child(2) {
|
||||
width: 100%;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
@import "bootstrap/scss/bootstrap";
|
||||
|
||||
.btn-group-dropdown-toggle {
|
||||
|
||||
@@ -5,7 +5,6 @@ using System.Web.Security;
|
||||
using BeWo.Service.ServiceContracts;
|
||||
using BeWoPlanerMobil.Models;
|
||||
using BeWoPlanerMobil.Service;
|
||||
using BeWoPlanerMobil.Util;
|
||||
using BS.Shared;
|
||||
using BS.Shared.Core;
|
||||
using BS.Shared.DataContracts;
|
||||
|
||||
@@ -794,44 +794,63 @@ namespace BeWoPlanerMobil.Controllers
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
public string SaveUnterschrift(string blob, string timeStamp, long? serviceRecordOid)
|
||||
public ActionResult SaveSignature(FormCollection formCollection)
|
||||
{
|
||||
try
|
||||
var blob = formCollection[FormCollectionConstants.ServiceRecordSignatureBlobKey];
|
||||
var date = DateTime.Parse(formCollection[FormCollectionConstants.ServiceRecordSignatureDateKey]);
|
||||
long.TryParse(formCollection[FormCollectionConstants.ServiceRecordSignatureRecordOidKey], out var serviceRecordOid);
|
||||
|
||||
var serviceRecord = Model.ServiceRecords.FirstOrDefault(sr => sr.ServiceRecordOid.HasValue && sr.ServiceRecordOid.Value.Equals(serviceRecordOid));
|
||||
|
||||
if(serviceRecordOid < 1 || serviceRecord is null)
|
||||
{
|
||||
if(Model is null)
|
||||
var message2Log = string.Empty;
|
||||
|
||||
if(serviceRecordOid < 1)
|
||||
{
|
||||
Logout();
|
||||
return LeerzeichenFuerGetMethoden;
|
||||
message2Log = $"Einzelunterschrift konnte nicht gespeichert werden, da die ServiceRecordOid {serviceRecordOid} ungültig ist.";
|
||||
}
|
||||
else if(serviceRecord is null)
|
||||
{
|
||||
message2Log = "Einzelunterschrift konnte nicht gespeichert werden, da der Zeiterfassungseintrag im Model nicht gefunden werden konnte.";
|
||||
}
|
||||
|
||||
long? oid;
|
||||
Log.Error(message2Log);
|
||||
|
||||
using(var signatureBitmap = SignatureUtils.Base64StringToBitmap(blob.Split(',')[1]))
|
||||
TempData[TempDataConstants.ErrorMessageKey] = "Beim Speichern der Unterschrift ist ein Fehler aufgetreten. Bitte wenden Sie sich an Ihren Administrator.";
|
||||
return RedirectToActionPermanent("Main", "Main");
|
||||
}
|
||||
|
||||
long? oid;
|
||||
|
||||
using(var signatureBitmap = SignatureUtils.Base64StringToBitmap(blob.Split(',')[1]))
|
||||
{
|
||||
var isValid = SignatureUtils.ValidateSignature(signatureBitmap);
|
||||
|
||||
if(!isValid)
|
||||
{
|
||||
var isValid = SignatureUtils.ValidateSignature(signatureBitmap);
|
||||
|
||||
if(!isValid)
|
||||
{
|
||||
return SerializeObject("Das Unterschriftenfeld darf nicht leer sein.");
|
||||
}
|
||||
|
||||
var date = DateTime.Parse(timeStamp);
|
||||
|
||||
oid = OperationsService.InsertSignature(new SignatureDC
|
||||
{
|
||||
DataBild = blob,
|
||||
Zeitstempel = date,
|
||||
ServiceRecordOid = serviceRecordOid
|
||||
}).SignatureOid;
|
||||
TempData[TempDataConstants.ErrorMessageKey] = "Das Unterschriftenfeld darf nicht leer sein.";
|
||||
return RedirectToActionPermanent("Main", "Main");
|
||||
}
|
||||
|
||||
return oid.HasValue ? "1" : "0";
|
||||
oid = OperationsService.InsertSignature(new SignatureDC
|
||||
{
|
||||
DataBild = blob,
|
||||
Zeitstempel = date,
|
||||
ServiceRecordOid = serviceRecordOid
|
||||
}).SignatureOid;
|
||||
}
|
||||
catch(Exception e)
|
||||
|
||||
if(oid is null)
|
||||
{
|
||||
Log.Error(e.Message, e);
|
||||
return SerializeObject("Fehler 540");
|
||||
TempData[TempDataConstants.ErrorMessageKey] = "Beim Speichern der Unterschrift ist ein Fehler aufgetreten. Bitte wenden Sie sich an Ihren Administrator.";
|
||||
}
|
||||
else
|
||||
{
|
||||
TempData[TempDataConstants.InfoMessageKey] = $"Die Unterschrift von {serviceRecord.Customer} für den Eintrag vom {MainModel.GetServiceRecordTimeHeader(serviceRecord, false)} wurde erfolgreich gespeichert.";
|
||||
}
|
||||
|
||||
return RedirectToActionPermanent("Main", "Main");
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
|
||||
@@ -292,99 +292,78 @@ namespace BeWoPlanerMobil.Controllers
|
||||
|
||||
var rawStartDate = formCollection[FormCollectionConstants.AppointmentStartDateKey];
|
||||
var rawEndDate = formCollection[FormCollectionConstants.AppointmentEndDateKey];
|
||||
var rawStartTime = formCollection[FormCollectionConstants.AppointmentStartTimeKey];
|
||||
var rawEndTime = formCollection[FormCollectionConstants.AppointmentEndTimeKey];
|
||||
var subject = formCollection[FormCollectionConstants.AppointmentSubjectKey];
|
||||
var location = formCollection[FormCollectionConstants.AppointmentLocationKey];
|
||||
var notice = formCollection[FormCollectionConstants.AppointmentNoticeKey];
|
||||
var subject = formCollection[FormCollectionConstants.AppointmentSubjectKey] ?? string.Empty;
|
||||
var location = formCollection[FormCollectionConstants.AppointmentLocationKey] ?? string.Empty;
|
||||
var notice = formCollection[FormCollectionConstants.AppointmentNoticeKey] ?? string.Empty;
|
||||
|
||||
subject = subject.RemoveUppercaseEsszett();
|
||||
subject = subject.RemoveUppercaseEsszett();
|
||||
location = location.RemoveUppercaseEsszett();
|
||||
notice = notice.RemoveUppercaseEsszett();
|
||||
notice = notice.RemoveUppercaseEsszett();
|
||||
|
||||
var isPrivate = formCollection[FormCollectionConstants.AppointmentIsPrivateKey] == "true,false";
|
||||
var allDay = formCollection[FormCollectionConstants.AppointmentIsAllDayKey] == "true,false";
|
||||
var isPrivate = formCollection[FormCollectionConstants.AppointmentIsPrivateKey] == "on";
|
||||
var allDay = formCollection[FormCollectionConstants.AppointmentIsAllDayKey] == "on";
|
||||
|
||||
var isSuccessfulStartTime = DateTime.TryParseExact(rawStartTime, "HH:mm", null, DateTimeStyles.None, out var startTime);
|
||||
var isSuccessfulEndTime = DateTime.TryParseExact(rawEndTime, "HH:mm", null, DateTimeStyles.None, out var endTime);
|
||||
|
||||
if(rawStartTime is null)
|
||||
{
|
||||
rawStartTime = "00:00";
|
||||
}
|
||||
|
||||
if(rawEndTime is null)
|
||||
{
|
||||
rawEndTime = "00:00";
|
||||
}
|
||||
|
||||
var startAndEnd = ConvertStringDatesToDateTimes($"{rawStartDate} {rawStartTime}", $"{rawEndDate} {rawEndTime}");
|
||||
var startAndEnd = ConvertStringDatesToDateTimes(rawStartDate, rawEndDate);
|
||||
|
||||
var startDate = startAndEnd.StartDate;
|
||||
var endDate = startAndEnd.EndDate;
|
||||
|
||||
if(!allDay && isSuccessfulStartTime && isSuccessfulEndTime || allDay)
|
||||
var appointmentToInsert = Model.SelectedAppointment ?? new SchedulerAppointmentDC();
|
||||
|
||||
var isNew = !appointmentToInsert.SchedulerAppointmentOid.HasValue;
|
||||
|
||||
var appointmentEmployeeList = new List<Employee2SchedulerAppointmentDC>();
|
||||
if(Model.SelectedEmployees?.Any() ?? false)
|
||||
{
|
||||
startDate = startDate.MergeDatesByDate(startTime);
|
||||
endDate = endDate.MergeDatesByDate(endTime);
|
||||
|
||||
var appointmentToInsert = Model.SelectedAppointment ?? new SchedulerAppointmentDC();
|
||||
|
||||
var isNew = !appointmentToInsert.SchedulerAppointmentOid.HasValue;
|
||||
|
||||
var appointmentEmployeeList = new List<Employee2SchedulerAppointmentDC>();
|
||||
if(Model.SelectedEmployees?.Any() ?? false)
|
||||
foreach(var employee in Model.SelectedEmployees)
|
||||
{
|
||||
foreach(var employee in Model.SelectedEmployees)
|
||||
var employee2Appointment = new Employee2SchedulerAppointmentDC
|
||||
{
|
||||
var employee2Appointment = new Employee2SchedulerAppointmentDC
|
||||
{
|
||||
Employee = employee,
|
||||
};
|
||||
Employee = employee,
|
||||
};
|
||||
|
||||
appointmentEmployeeList.Add(employee2Appointment);
|
||||
}
|
||||
appointmentEmployeeList.Add(employee2Appointment);
|
||||
}
|
||||
}
|
||||
|
||||
if(allDay)
|
||||
if(allDay)
|
||||
{
|
||||
startDate = startDate.Date;
|
||||
endDate = endDate.AddDays(1);
|
||||
}
|
||||
|
||||
appointmentToInsert.EmployeeList = appointmentEmployeeList;
|
||||
appointmentToInsert.CustomerList = Model.SelectedCustomers;
|
||||
appointmentToInsert.ResourceList = Model.SelectedResources ?? new List<ResourceDC>();
|
||||
appointmentToInsert.SupportConceptList = isNew ? new List<CompactSupportConceptDC>() : appointmentToInsert.SupportConceptList;
|
||||
appointmentToInsert.ServiceRecordList = isNew ? new List<ServiceRecordDC>() : appointmentToInsert.ServiceRecordList;
|
||||
appointmentToInsert.EndDate = endDate;
|
||||
appointmentToInsert.StartDate = startDate;
|
||||
appointmentToInsert.Subject = subject;
|
||||
appointmentToInsert.Description = notice;
|
||||
appointmentToInsert.Originator = MobileSessionFacade.LoggedInCompactEmployee;
|
||||
appointmentToInsert.Location = location;
|
||||
appointmentToInsert.ActivationType = ActivationTypeId.Active;
|
||||
appointmentToInsert.IsPrivate = isPrivate;
|
||||
appointmentToInsert.AllDay = allDay;
|
||||
|
||||
// Eine Minute addieren, wenn die Uhrzeit eines ganztägigen Termins nicht exakt 00:00 ist.
|
||||
// ToDo: Wird beim SelectAppointmentToEdit gemacht, damit die Formularanzeige korrekt ist!
|
||||
if(allDay && endDate.Hour == 23 && endDate.Minute == 59)
|
||||
{
|
||||
appointmentToInsert.EndDate = endDate.AddMinutes(1);
|
||||
}
|
||||
|
||||
// ToDo: Rechte beachten!
|
||||
if(appointmentToInsert.CanBeEdited)
|
||||
{
|
||||
if(!isNew)
|
||||
{
|
||||
startDate = startDate.Date;
|
||||
endDate = endDate.AddDays(1);
|
||||
KalenderService.UpdateSchedulerAppointments(new List<SchedulerAppointmentDC> {appointmentToInsert});
|
||||
}
|
||||
|
||||
appointmentToInsert.EmployeeList = appointmentEmployeeList;
|
||||
appointmentToInsert.CustomerList = Model.SelectedCustomers;
|
||||
appointmentToInsert.ResourceList = Model.SelectedResources ?? new List<ResourceDC>();
|
||||
appointmentToInsert.SupportConceptList = isNew ? new List<CompactSupportConceptDC>() : appointmentToInsert.SupportConceptList;
|
||||
appointmentToInsert.ServiceRecordList = isNew ? new List<ServiceRecordDC>() : appointmentToInsert.ServiceRecordList;
|
||||
appointmentToInsert.EndDate = endDate;
|
||||
appointmentToInsert.StartDate = startDate;
|
||||
appointmentToInsert.Subject = subject;
|
||||
appointmentToInsert.Description = notice;
|
||||
appointmentToInsert.Originator = MobileSessionFacade.LoggedInCompactEmployee;
|
||||
appointmentToInsert.Location = location;
|
||||
appointmentToInsert.ActivationType = ActivationTypeId.Active;
|
||||
appointmentToInsert.IsPrivate = isPrivate;
|
||||
appointmentToInsert.AllDay = allDay;
|
||||
|
||||
// Eine Minute addieren, wenn die Uhrzeit eines ganztägigen Termins nicht exakt 00:00 ist.
|
||||
// ToDo: Wird beim SelectAppointmentToEdit gemacht, damit die Formularanzeige korrekt ist!
|
||||
if(allDay && endDate.Hour == 23 && endDate.Minute == 59)
|
||||
else
|
||||
{
|
||||
appointmentToInsert.EndDate = endDate.AddMinutes(1);
|
||||
}
|
||||
|
||||
// ToDo: Rechte beachten!
|
||||
if(appointmentToInsert.CanBeEdited)
|
||||
{
|
||||
if(!isNew)
|
||||
{
|
||||
KalenderService.UpdateSchedulerAppointments(new List<SchedulerAppointmentDC> {appointmentToInsert});
|
||||
}
|
||||
else
|
||||
{
|
||||
KalenderService.InsertSchedulerAppointments(new List<SchedulerAppointmentDC> {appointmentToInsert});
|
||||
}
|
||||
KalenderService.InsertSchedulerAppointments(new List<SchedulerAppointmentDC> {appointmentToInsert});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -573,57 +552,11 @@ namespace BeWoPlanerMobil.Controllers
|
||||
return Json(isOverlapping, JsonRequestBehavior.AllowGet);
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
public string SelectResourcesForAppointment(string resourceOids)
|
||||
{
|
||||
if(Model is null)
|
||||
{
|
||||
Logout();
|
||||
return LeerzeichenFuerGetMethoden;
|
||||
}
|
||||
|
||||
|
||||
var oidList = ConvertOidStringToList(resourceOids);
|
||||
|
||||
|
||||
var list = new List<ResourceDC>();
|
||||
|
||||
Model.ResourceCategories2Resources.Values.DoForEach(l => l.DoForEach(s => list.AddIfNotIn(s)));
|
||||
|
||||
Model.SelectedResources = list.Where(resource => resource.ResourceOid.HasValue && oidList.Contains(resource.ResourceOid.Value)).ToList();
|
||||
|
||||
return JsonConvert.SerializeObject(Model.SelectedResources);
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
public string SelectEmployeesForAppointment(string oidString)
|
||||
{
|
||||
if (Model is null)
|
||||
{
|
||||
Logout();
|
||||
return LeerzeichenFuerGetMethoden;
|
||||
}
|
||||
|
||||
var oidList = ConvertOidStringToList(oidString);
|
||||
|
||||
Model.SelectedEmployees = Model.AllEmployees.Where(employee => oidList.Contains(employee.EmployeeOid)).ToList();
|
||||
|
||||
return JsonConvert.SerializeObject(Model.SelectedEmployees.OrderBy(o => o.DetailDescription));
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
public string SelectCustomersForAppointment(string oidString)
|
||||
{
|
||||
if (Model is null)
|
||||
{
|
||||
Logout();
|
||||
return LeerzeichenFuerGetMethoden;
|
||||
}
|
||||
|
||||
var oidList = ConvertOidStringToList(oidString);
|
||||
|
||||
Model.SelectedCustomers = Model.AllCustomers.Where(customer => oidList.Contains(customer.CustomerOid)).ToList();
|
||||
|
||||
return JsonConvert.SerializeObject(Model.SelectedCustomers.OrderBy(o => o.LastNameFirstName));
|
||||
}
|
||||
|
||||
|
||||
[Authorize]
|
||||
public string CheckResourcesAvailability(string start, string end, string resourceOids, bool allDay)
|
||||
@@ -984,30 +917,221 @@ namespace BeWoPlanerMobil.Controllers
|
||||
return LeerzeichenFuerGetMethoden;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#region Mitarbeiterauswahl
|
||||
|
||||
[Authorize]
|
||||
public string SelectTeamForAppointment(string teamOidString)
|
||||
{
|
||||
if(Model?.Employee?.EmployeeOid is null)
|
||||
{
|
||||
Logout();
|
||||
TempData[TempDataConstants.DoLogoutKey] = true;
|
||||
return LeerzeichenFuerGetMethoden;
|
||||
}
|
||||
|
||||
var teamMemberOids = new List<long>();
|
||||
|
||||
if(long.TryParse(teamOidString, out var teamOid))
|
||||
if(!long.TryParse(teamOidString, out var teamOid))
|
||||
{
|
||||
var team = EmployeeService.FindTeamByOid(teamOid, Model.Employee.EmployeeOid.Value);
|
||||
if(!(team is null))
|
||||
{
|
||||
Model.SelectedEmployees.AddRangeIfElementsNotIn(team.Member);
|
||||
teamMemberOids.AddRangeIfElementsNotIn(team.Member.Select(member => member.EmployeeOid));
|
||||
}
|
||||
return LeerzeichenFuerGetMethoden;
|
||||
}
|
||||
|
||||
return JsonConvert.SerializeObject(teamMemberOids);
|
||||
var team = EmployeeService.FindTeamByOid(teamOid, Model.Employee.EmployeeOid.Value);
|
||||
|
||||
if(team is null)
|
||||
{
|
||||
return LeerzeichenFuerGetMethoden;
|
||||
}
|
||||
|
||||
Model.SelectedEmployees.AddRangeIfElementsNotIn(team.Member);
|
||||
teamMemberOids.AddRangeIfElementsNotIn(team.Member.Select(member => member.EmployeeOid));
|
||||
|
||||
return LeerzeichenFuerGetMethoden;
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
public ActionResult UpdateEmployeeSelection(string oidString)
|
||||
{
|
||||
if(Model is null)
|
||||
{
|
||||
TempData[TempDataConstants.DoLogoutKey] = true;
|
||||
Logout();
|
||||
return PartialView("SchedulerEmployeeSelectionPartial");
|
||||
}
|
||||
|
||||
var oidList = ConvertOidStringToList(oidString);
|
||||
|
||||
Model.SelectedEmployees = Model.AllEmployees.Where(employee => oidList.Contains(employee.EmployeeOid)).ToList();
|
||||
|
||||
return PartialView("SchedulerEmployeeSelectionPartial", Model);
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
public ActionResult SelectAllEmployees(bool isChecked)
|
||||
{
|
||||
if(Model is null)
|
||||
{
|
||||
TempData[TempDataConstants.DoLogoutKey] = true;
|
||||
return PartialView("EmployeeSelectionPopupListPartial");
|
||||
}
|
||||
|
||||
Model.SelectedEmployees = isChecked ? Model.AllEmployees : new List<CompactEmployeeDC>();
|
||||
|
||||
return PartialView("EmployeeSelectionPopupListPartial", Model);
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
public ActionResult LoadUpdatedEmployees()
|
||||
{
|
||||
if(Model is null)
|
||||
{
|
||||
TempData[TempDataConstants.DoLogoutKey] = true;
|
||||
return PartialView("SchedulerEmployeeSelectionPartial");
|
||||
}
|
||||
|
||||
return PartialView("SchedulerEmployeeSelectionPartial", Model);
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
public ActionResult LoadUpdatedEmployeePopupList()
|
||||
{
|
||||
if(Model is null)
|
||||
{
|
||||
TempData[TempDataConstants.DoLogoutKey] = true;
|
||||
return PartialView("EmployeeSelectionPopupListPartial");
|
||||
}
|
||||
|
||||
return PartialView("EmployeeSelectionPopupListPartial", Model);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Klientenauswahl
|
||||
|
||||
[Authorize]
|
||||
public ActionResult SelectAllCustomers(bool isChecked)
|
||||
{
|
||||
if(Model is null)
|
||||
{
|
||||
TempData[TempDataConstants.DoLogoutKey] = true;
|
||||
Logout();
|
||||
return PartialView("CustomerSelectionPopupListPartial");
|
||||
}
|
||||
|
||||
Model.SelectedCustomers = isChecked ? Model.AllCustomers : new List<CompactCustomerDC>();
|
||||
|
||||
return PartialView("CustomerSelectionPopupListPartial", Model);
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
public ActionResult LoadUpdatedCustomers()
|
||||
{
|
||||
if(Model is null)
|
||||
{
|
||||
TempData[TempDataConstants.DoLogoutKey] = true;
|
||||
return PartialView("SchedulerCustomerSelectionPartial");
|
||||
}
|
||||
|
||||
return PartialView("SchedulerCustomerSelectionPartial", Model);
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
public ActionResult LoadUpdatedCustomerPopupList()
|
||||
{
|
||||
if(Model is null)
|
||||
{
|
||||
TempData[TempDataConstants.DoLogoutKey] = true;
|
||||
return PartialView("CustomerSelectionPopupListPartial");
|
||||
}
|
||||
|
||||
return PartialView("CustomerSelectionPopupListPartial", Model);
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
public ActionResult UpdateCustomerSelection(string oidString)
|
||||
{
|
||||
if(Model is null)
|
||||
{
|
||||
TempData[TempDataConstants.DoLogoutKey] = true;
|
||||
Logout();
|
||||
return PartialView("SchedulerCustomerSelectionPartial");
|
||||
}
|
||||
|
||||
var oidList = ConvertOidStringToList(oidString);
|
||||
|
||||
Model.SelectedCustomers = Model.AllCustomers.Where(customer => oidList.Contains(customer.CustomerOid)).ToList();
|
||||
|
||||
return PartialView("SchedulerCustomerSelectionPartial", Model);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Ressourcenauswahl
|
||||
|
||||
[Authorize]
|
||||
public ActionResult UpdateResourceSelection(string oidString)
|
||||
{
|
||||
if(Model is null)
|
||||
{
|
||||
TempData[TempDataConstants.DoLogoutKey] = true;
|
||||
return PartialView("SchedulerResourceSelectionPartial");
|
||||
}
|
||||
|
||||
var oidList = ConvertOidStringToList(oidString);
|
||||
|
||||
//var list = new List<ResourceDC>();
|
||||
|
||||
//Model.ResourceCategories2Resources.Values.DoForEach(l => l.DoForEach(s => list.AddIfNotIn(s)));
|
||||
|
||||
//Model.SelectedResources = list.Where(resource => resource.ResourceOid.HasValue && oidList.Contains(resource.ResourceOid.Value)).ToList();
|
||||
|
||||
Model.SelectedResources = Model.AllResources.Where(resource => resource.ResourceOid.HasValue && oidList.Contains(resource.ResourceOid.Value)).ToList();
|
||||
|
||||
return PartialView("SchedulerResourceSelectionPartial", Model);
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
public ActionResult SelectAllResources(bool isChecked)
|
||||
{
|
||||
if(Model is null)
|
||||
{
|
||||
TempData[TempDataConstants.DoLogoutKey] = true;
|
||||
return PartialView("ResourceSelectionPopupListPartial");
|
||||
}
|
||||
|
||||
Model.SelectedResources = isChecked ? Model.AllResources : new List<ResourceDC>();
|
||||
|
||||
return PartialView("ResourceSelectionPopupListPartial", Model);
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
public ActionResult LoadUpdatedResourcePopupList()
|
||||
{
|
||||
if(Model is null)
|
||||
{
|
||||
TempData[TempDataConstants.DoLogoutKey] = true;
|
||||
return PartialView("ResourceSelectionPopupListPartial");
|
||||
}
|
||||
|
||||
return PartialView("ResourceSelectionPopupListPartial", Model);
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
public ActionResult LoadUpdatedResources()
|
||||
{
|
||||
if(Model is null)
|
||||
{
|
||||
TempData[TempDataConstants.DoLogoutKey] = true;
|
||||
return PartialView("SchedulerResourceSelectionPartial");
|
||||
}
|
||||
|
||||
return PartialView("SchedulerResourceSelectionPartial", Model);
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
[Authorize]
|
||||
public ActionResult FetchCustomersForFiltering()
|
||||
{
|
||||
|
||||
@@ -64,13 +64,9 @@ namespace BeWoPlanerMobil.Models
|
||||
|
||||
public string SubjectToEdit => SelectedAppointment?.Subject ?? string.Empty;
|
||||
|
||||
public string StartDateToEdit => SelectedAppointment?.StartDate?.ToShortDateString() ?? SelectedDate.ToShortDateString();
|
||||
public string StartDateToEdit => SelectedAppointment?.StartDate?.ToString("yyyy-MM-ddTHH:mm") ?? SelectedDate.ToString("yyyy-MM-ddTHH:mm");
|
||||
|
||||
public string EndDateToEdit => SelectedAppointment?.EndDate?.ToShortDateString() ?? SelectedDate.ToShortDateString();
|
||||
|
||||
public string StartTimeToEdit => SelectedAppointment?.StartDate?.ToShortTimeString() ?? string.Empty;
|
||||
|
||||
public string EndTimeToEdit => SelectedAppointment?.EndDate?.ToShortTimeString() ?? string.Empty;
|
||||
public string EndDateToEdit => SelectedAppointment?.EndDate?.ToString("yyyy-MM-ddTHH:mm") ?? SelectedDate.ToString("yyyy-MM-ddTHH:mm");
|
||||
|
||||
public string LocationToEdit => SelectedAppointment?.Location ?? string.Empty;
|
||||
|
||||
|
||||
@@ -5,17 +5,17 @@ function hideSignature() {
|
||||
|
||||
function resizeCanvas(sketchPadId, canvasRoId) {
|
||||
if($(sketchPadId).length !== 0) {
|
||||
var rowWidth = $(canvasRoId).innerWidth();
|
||||
var sourceCanvas = document.getElementById(sketchPadId.split("#")[1]);
|
||||
const rowWidth = $(canvasRoId).innerWidth();
|
||||
const sourceCanvas = document.getElementById(sketchPadId.split("#")[1]);
|
||||
|
||||
var canvasWidth = sourceCanvas.scrollWidth;
|
||||
const canvasWidth = sourceCanvas.scrollWidth;
|
||||
|
||||
var newWidth = rowWidth;
|
||||
const newWidth = rowWidth;
|
||||
|
||||
var parsedNewWidth = parseInt(newWidth, 10);
|
||||
var parsedCanvasWidth = parseInt(canvasWidth, 10);
|
||||
const parsedCanvasWidth = parseInt(canvasWidth, 10);
|
||||
|
||||
var isMinDifferenceMet = false;
|
||||
let isMinDifferenceMet = false;
|
||||
|
||||
if (parsedCanvasWidth > parsedNewWidth) {
|
||||
isMinDifferenceMet = parsedCanvasWidth - parsedNewWidth > 4;
|
||||
@@ -56,19 +56,19 @@ function resizeCanvas(sketchPadId, canvasRoId) {
|
||||
function initializeSignature(selectedServiceRecordOid) {
|
||||
$("#main-container, #checkbox-container").hide();
|
||||
$("#signature-container").addClass("d-block");
|
||||
|
||||
|
||||
$.get(getSelectedRecordInformationUrlWithOid(), { oid: selectedServiceRecordOid }).done(function(jsonServiceRecord2Monatsunterschrift) {
|
||||
if (jsonServiceRecord2Monatsunterschrift === "SessionTimeout") {
|
||||
if(jsonServiceRecord2Monatsunterschrift === "SessionTimeout") {
|
||||
window.location.href = getRedirectLink();
|
||||
return;
|
||||
}
|
||||
|
||||
if (isEmptyOrSpaces(jsonServiceRecord2Monatsunterschrift)) {
|
||||
if(isEmptyOrSpaces(jsonServiceRecord2Monatsunterschrift)) {
|
||||
$("#main-container, #checkbox-container").show();
|
||||
$("#signature-container").removeClass("d-block");
|
||||
|
||||
showMessagePopupWithHtmlAndCallback("Fehler", "Der zu unterschreibende Zeiterfassungseintrag konnte nicht geladen werden. Bitte wenden Sie sich an den Support.<br/><br/><a href='mailto:support@bewoplaner.de'>support@bewoplaner.de</a>", false,
|
||||
function () {
|
||||
function() {
|
||||
showSpinner();
|
||||
|
||||
location.reload();
|
||||
@@ -107,21 +107,21 @@ function initializeSignature(selectedServiceRecordOid) {
|
||||
$("#signature-employee").text(record.Employee.FirstName + " " + record.Employee.LastName);
|
||||
$("#signature-date-time").text(datum + " " + startDate + " - " + endDate);
|
||||
|
||||
if (hasMonatsunterschrift === true) {
|
||||
if(hasMonatsunterschrift === true) {
|
||||
var customerFirstName = record.Customer.FirstName;
|
||||
var customerLastName = record.Customer.LastName;
|
||||
|
||||
var customerName = "";
|
||||
|
||||
if (isEmptyOrSpaces(customerFirstName) && isEmptyOrSpaces(customerLastName) === false) {
|
||||
if(isEmptyOrSpaces(customerFirstName) && isEmptyOrSpaces(customerLastName) === false) {
|
||||
customerName = customerLastName;
|
||||
} else if (isEmptyOrSpaces(customerLastName) && false === isEmptyOrSpaces(customerFirstName)) {
|
||||
} else if(isEmptyOrSpaces(customerLastName) && false === isEmptyOrSpaces(customerFirstName)) {
|
||||
customerName = customerFirstName;
|
||||
} else {
|
||||
customerName = customerLastName + ", " + customerFirstName;
|
||||
}
|
||||
|
||||
$("#signature-alert").html("Für diesen Eintrag (" + datum + " " + startDate + " - " + endDate + ") existiert bereits eine Monatsunterschrift von " + customerName + ".<br /><br />Das Leisten dieser Unterschrift ist nicht notwendig.");
|
||||
$("#signature-alert").html(`Für diesen Eintrag (${datum} ${startDate} - ${endDate}) existiert bereits eine Monatsunterschrift von ${customerName}.<br /><br />Das Leisten dieser Unterschrift ist nicht notwendig.`);
|
||||
$("#signature-alert").removeClass("d-none");
|
||||
}
|
||||
|
||||
@@ -165,43 +165,26 @@ function initializeSignature(selectedServiceRecordOid) {
|
||||
|
||||
function saveButtonClick(selectedServiceRecordOid) {
|
||||
try {
|
||||
var url = getSetSelectedSignatureUrl();
|
||||
var date = moment(new Date());
|
||||
const date = moment(new Date());
|
||||
|
||||
var clonedCanvas = trimCanvas(cloneCanvas(document.getElementById("sketch-pad")));
|
||||
const clonedCanvas = trimCanvas(cloneCanvas(document.getElementById("sketch-pad")));
|
||||
|
||||
var context = clonedCanvas.getContext("2d", {willReadFrequently: true});
|
||||
const context = clonedCanvas.getContext("2d", {willReadFrequently: true});
|
||||
context.globalCompositeOperation = "destination-over";
|
||||
context.fillStyle = "white";
|
||||
context.fillRect(0, 0, clonedCanvas.width, clonedCanvas.height);
|
||||
|
||||
var dataUrl = clonedCanvas.toDataURL("image/png");
|
||||
|
||||
var formattedDate = date.format("DD.MM.YYYY HH:mm:ss");
|
||||
const dataUrl = clonedCanvas.toDataURL("image/png");
|
||||
|
||||
const formattedDate = date.format("DD.MM.YYYY HH:mm:ss");
|
||||
|
||||
showSpinner();
|
||||
|
||||
$.post(url, {blob: dataUrl, timeStamp: formattedDate, serviceRecordOid: selectedServiceRecordOid}).done(function (json) {
|
||||
hideSpinner();
|
||||
|
||||
if(json === "1") {
|
||||
$("#signature-container").removeClass("d-block");
|
||||
$("#main-container, #checkbox-container").show();
|
||||
showMessagePopupWithCallback("Unterschrift", "Die Unterschrift wurde erfolgreich gespeichert.", function () {
|
||||
showSpinner();
|
||||
$("#signature-alert").addClass("d-none");
|
||||
location.reload();
|
||||
}, true);
|
||||
} else {
|
||||
var errorMessage = json === "0" ? "Es ist ein Fehler beim Speichern der Unterschrift aufgetreten. Bitte wenden Sie sich an Ihren Administrator." : json;
|
||||
|
||||
showMessagePopup("Fehler", errorMessage);
|
||||
$("#signature-alert").addClass("d-none");
|
||||
signaturePad.clear();
|
||||
}
|
||||
});
|
||||
$(`#sr-sig-blob-${selectedServiceRecordOid}`).val(dataUrl);
|
||||
$(`#sr-sig-date-${selectedServiceRecordOid}`).val(formattedDate);
|
||||
$(`#save-signature-form-${selectedServiceRecordOid}`).submit();
|
||||
} catch (error) {
|
||||
showErrorPopup(error);
|
||||
window.showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -216,7 +199,7 @@ function cancelButtonClick(signaturePad) {
|
||||
signaturePad.clear();
|
||||
}, false);
|
||||
} catch(error) {
|
||||
showErrorPopup(error);
|
||||
window.showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -224,6 +207,6 @@ function clearButtonClick(signaturePad) {
|
||||
try {
|
||||
signaturePad.clear();
|
||||
} catch(error) {
|
||||
showErrorPopup(error);
|
||||
window.showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,18 +2,17 @@
|
||||
function changeItemListSelection(url, popupId, listId, itemIdPrefix, isCustomer, checkBoxIdSuffix, filterAppointmentsUrl, allItemsCheckBoxSuffix, teamMemberOids, allItemsCheckBoxId) {
|
||||
try {
|
||||
if(url === undefined || url === null) {
|
||||
logError("url ist undefined oder null");
|
||||
return;
|
||||
}
|
||||
|
||||
var selectedItemOids = $("#" + popupId + " .popup-list-item-container input:checked").map(function () { return $(this).attr("id").split("-")[1]; }).get();
|
||||
var allItemOids = $("#" + popupId + " .popup-list-item-container input[type=checkbox]").map(function () { return $(this).attr("id").split("-")[1]; }).get();
|
||||
const selectedItemOids = $(`#${popupId} .popup-list-item-container input:checked`).map(function () { return $(this).attr("id").split("-")[1]; }).get();
|
||||
const allItemOids = $(`#${popupId} .popup-list-item-container input[type=checkbox]`).map(function () { return $(this).attr("id").split("-")[1]; }).get();
|
||||
|
||||
if(!isCustomer) {
|
||||
$("#my-teams-checkbox" + allItemsCheckBoxSuffix).prop("checked", arrayContainsAllItems(selectedItemOids, teamMemberOids));
|
||||
$(`#my-teams-checkbox${allItemsCheckBoxSuffix}`).prop("checked", arrayContainsAllItems(selectedItemOids, teamMemberOids));
|
||||
}
|
||||
|
||||
$("#" + allItemsCheckBoxId).prop("checked", arrayContainsAllItems(selectedItemOids, allItemOids));
|
||||
$(`#${allItemsCheckBoxId}`).prop("checked", arrayContainsAllItems(selectedItemOids, allItemOids));
|
||||
|
||||
$.get(url, { oidString: selectedItemOids.toString() }).done(function (jsonResult) {
|
||||
updateSelectedList(jsonResult, listId, itemIdPrefix, isCustomer, popupId, checkBoxIdSuffix, url, filterAppointmentsUrl, allItemsCheckBoxSuffix, teamMemberOids);
|
||||
@@ -21,7 +20,7 @@ function changeItemListSelection(url, popupId, listId, itemIdPrefix, isCustomer,
|
||||
$("#one-day-scheduler-partial-container").load(filterAppointmentsUrl);
|
||||
});
|
||||
} catch(error) {
|
||||
showErrorPopup(error);
|
||||
window.showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,9 +33,9 @@ function updateSelectedList(jsonResult, listId, itemIdPrefix, isCustomer, popupI
|
||||
return;
|
||||
}
|
||||
|
||||
var listItems = parseJason(jsonResult);
|
||||
const listItems = parseJason(jsonResult);
|
||||
|
||||
var list = $("#" + listId);
|
||||
var list = $(`#${listId}`);
|
||||
list.empty();
|
||||
|
||||
var colorClass = "text-bewo-employee";
|
||||
@@ -54,41 +53,24 @@ function updateSelectedList(jsonResult, listId, itemIdPrefix, isCustomer, popupI
|
||||
oid = item.EmployeeOid;
|
||||
}
|
||||
|
||||
var id = itemIdPrefix + oid;
|
||||
const id = itemIdPrefix + oid;
|
||||
|
||||
var removeParams = oid + ", '" + checkBoxIdSuffix + "', " + isCustomer + ", '" + url + "', '" + popupId + "', '" + listId + "', '" + itemIdPrefix + "', '" + filterAppointmentsUrl + "', '" + allItemsCheckBoxSuffix + "', " + teamMemberOids;
|
||||
const removeParams = oid + ", '" + checkBoxIdSuffix + "', " + isCustomer + ", '" + url + "', '" + popupId + "', '" + listId + "', '" + itemIdPrefix + "', '" + filterAppointmentsUrl + "', '" + allItemsCheckBoxSuffix + "', " + teamMemberOids;
|
||||
|
||||
var html =
|
||||
"<div class=\"list-group-item my-auto\" id=\"" + id + "\">" +
|
||||
"<div class=\"row\">" +
|
||||
"<div class=\"input-group\">" +
|
||||
"<div class=\"input-group-prepend\">" +
|
||||
"<i class='fas fa-user " + colorClass + " h-100'></i>" +
|
||||
"</div>" +
|
||||
"<p class=\"form-control border-0 bg-transparent text-truncate\">" +
|
||||
item.LastName + ", " + item.FirstName +
|
||||
"</p>" +
|
||||
"<div class=\"input-group-append\">" +
|
||||
'<button class="btn btn-primary ficken" type="button" onclick="removeSelectedItem(' + removeParams + ')">' +
|
||||
"<span class='fas fa-times-circle'></span>" +
|
||||
"</button>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</div>";
|
||||
const html = `<div class="list-group-item my-auto" id="${id}"><div class="row"><div class="input-group"><div class="input-group-prepend"><i class='fas fa-user ${colorClass} h-100'></i></div><p class="form-control border-0 bg-transparent text-truncate">${item.LastName}, ${item.FirstName}</p><div class="input-group-append"><button class="btn btn-primary ficken" type="button" onclick="removeSelectedItem(${removeParams})"><span class='fas fa-times-circle'></span></button></div></div></div></div>`;
|
||||
|
||||
list.append(html);
|
||||
});
|
||||
} catch(error) {
|
||||
showErrorPopup(error);
|
||||
window.showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
|
||||
function removeSelectedItem(itemOid, itemSuffix, isCustomer, url, popupId, listId, itemIdPrefix, filterAppointmentsUrl, allItemsCheckBoxSuffix, teamMemberOids, allItemsCheckBoxId) {
|
||||
try {
|
||||
var prefix = isCustomer ? "customer-" : "employee-";
|
||||
const prefix = isCustomer ? "customer-" : "employee-";
|
||||
|
||||
var checkBox = $("#" + prefix + itemOid + itemSuffix);
|
||||
const checkBox = $("#" + prefix + itemOid + itemSuffix);
|
||||
|
||||
if(checkBox.length) {
|
||||
checkBox.prop("checked", false);
|
||||
@@ -96,6 +78,6 @@ function removeSelectedItem(itemOid, itemSuffix, isCustomer, url, popupId, listI
|
||||
|
||||
changeItemListSelection(url, popupId, listId, itemIdPrefix, isCustomer, itemSuffix, filterAppointmentsUrl, allItemsCheckBoxSuffix, teamMemberOids, allItemsCheckBoxId);
|
||||
} catch(error) {
|
||||
showErrorPopup(error);
|
||||
window.showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
@@ -1,10 +1,10 @@
|
||||
function calculateTimeWithDuration(timeInputValue, timeElement, startDate, duration, hoursMinutesDropdownBtnId) {
|
||||
var isInMin = getIsZeiterfassungseinheitInMinutes();
|
||||
|
||||
var hoursToMinutes = parseTimeInputToIntegerArray(timeInputValue);
|
||||
var hours = parseInt(hoursToMinutes[0]);
|
||||
var minutes = parseInt(hoursToMinutes[1]);
|
||||
var stdMinDropdown = $("#" + hoursMinutesDropdownBtnId);
|
||||
const hoursToMinutes = parseTimeInputToIntegerArray(timeInputValue);
|
||||
const hours = parseInt(hoursToMinutes[0]);
|
||||
const minutes = parseInt(hoursToMinutes[1]);
|
||||
const stdMinDropdown = $(`#${hoursMinutesDropdownBtnId}`);
|
||||
|
||||
startDate.hours(hours);
|
||||
startDate.minutes(minutes);
|
||||
@@ -13,7 +13,7 @@
|
||||
isInMin = stdMinDropdown.text().replaceAll(/\s/g, "") === "Minuten";
|
||||
}
|
||||
|
||||
var durationFormat = isInMin ? "m" : "h";
|
||||
const durationFormat = isInMin ? "m" : "h";
|
||||
|
||||
startDate.add(duration, durationFormat);
|
||||
|
||||
@@ -26,10 +26,10 @@ function onDurationChange(startTimeId, endTimeId, startDateId, endDateId, durati
|
||||
try {
|
||||
var isInMin = getIsZeiterfassungseinheitInMinutes();
|
||||
|
||||
var startTime = $("#" + startTimeId).val();
|
||||
var endTime = $("#" + endTimeId).val();
|
||||
var duration = $("#" + durationId).val();
|
||||
var hoursMinutesDropdownButton = $("#" + hoursMinutesDropdownBtnId);
|
||||
var startTime = $(`#${startTimeId}`).val();
|
||||
var endTime = $(`#${endTimeId}`).val();
|
||||
var duration = $(`#${durationId}`).val();
|
||||
var hoursMinutesDropdownButton = $(`#${hoursMinutesDropdownBtnId}`);
|
||||
|
||||
var startTimeCondition = startTime !== undefined && startTime !== null && startTime.length > 0;
|
||||
var endTimeCondition = endTime !== undefined && endTime !== null && endTime.length > 0;
|
||||
@@ -40,7 +40,7 @@ function onDurationChange(startTimeId, endTimeId, startDateId, endDateId, durati
|
||||
return;
|
||||
}
|
||||
|
||||
var startDateString = $("#" + startDatePickerId).datetimepicker("date");
|
||||
var startDateString = $(`#${startDatePickerId}`).datetimepicker("date");
|
||||
var endDate = moment(new Date());
|
||||
var startDate = moment(new Date());
|
||||
|
||||
@@ -49,8 +49,8 @@ function onDurationChange(startTimeId, endTimeId, startDateId, endDateId, durati
|
||||
endDate = startDate.clone();
|
||||
}
|
||||
|
||||
if($("#" + endDatePickerId).length !== 0) {
|
||||
var endDateString = $("#" + endDatePickerId).datetimepicker("date");
|
||||
if($(`#${endDatePickerId}`).length !== 0) {
|
||||
var endDateString = $(`#${endDatePickerId}`).datetimepicker("date");
|
||||
endDate = moment(endDateString);
|
||||
}
|
||||
|
||||
@@ -68,19 +68,19 @@ function onDurationChange(startTimeId, endTimeId, startDateId, endDateId, durati
|
||||
startDate = startDate.hours(h2m[0]).minutes(h2m[1]);
|
||||
endDate = startDate.clone().add(durationNumber, durationFormat);
|
||||
|
||||
$("#" + endTimeId).val(endDate.format("HH:mm"));
|
||||
$("#" + endDateId).val(endDate.format("DD.MM.yyyy"));
|
||||
$(`#${endTimeId}`).val(endDate.format("HH:mm"));
|
||||
$(`#${endDateId}`).val(endDate.format("DD.MM.yyyy"));
|
||||
} else {
|
||||
h2m = parseTimeInputToIntegerArray(endTime);
|
||||
|
||||
endDate = endDate.hours(h2m[0]).minutes(h2m[1]);
|
||||
startDate = endDate.clone().add(durationNumber * -1, durationFormat);
|
||||
|
||||
$("#" + startTimeId).val(startDate.format("HH:mm"));
|
||||
$("#" + startDateId).val(startDate.format("DD.MM.yyyy"));
|
||||
$(`#${startTimeId}`).val(startDate.format("HH:mm"));
|
||||
$(`#${startDateId}`).val(startDate.format("DD.MM.yyyy"));
|
||||
}
|
||||
} catch(error) {
|
||||
showErrorPopup(error);
|
||||
window.showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -94,7 +94,7 @@ function calculateDuration(isInvocatedByHoursMinutesButton, startTimeId, endTime
|
||||
|
||||
var isInMin = getIsZeiterfassungseinheitInMinutes();
|
||||
|
||||
if (hoursMinutesDropdownButton.length) {
|
||||
if(hoursMinutesDropdownButton.length) {
|
||||
isInMin = hoursMinutesDropdownButton.text().replaceAll(/\s/g, "") === "Minuten";
|
||||
}
|
||||
|
||||
@@ -122,8 +122,8 @@ function calculateDuration(isInvocatedByHoursMinutesButton, startTimeId, endTime
|
||||
}
|
||||
|
||||
// Es gibt ein Enddatumsfeld
|
||||
if($("#" + endDatePickerId).length !== 0) {
|
||||
var endDateString = $("#" + endDatePickerId).datetimepicker("date");
|
||||
if($(`#${endDatePickerId}`).length !== 0) {
|
||||
var endDateString = $(`#${endDatePickerId}`).datetimepicker("date");
|
||||
// Das Enddatum hat einen Wert
|
||||
if(endDateString !== null && endDateString.length !== 0) {
|
||||
endDate = moment(endDateString);
|
||||
@@ -147,48 +147,45 @@ function calculateDuration(isInvocatedByHoursMinutesButton, startTimeId, endTime
|
||||
if(durationNumber > 0 && isInvokedByStartElement && startDate >= endDate) {
|
||||
endDate = startDate.clone().add(durationNumber, durationFormat);
|
||||
|
||||
$("#" + endTimeId).val(endDate.format("HH:mm"));
|
||||
$("#" + endDatePickerId).val(endDate.format("DD.MM.yyyy"));
|
||||
$(`#${endTimeId}`).val(endDate.format("HH:mm"));
|
||||
$(`#${endDatePickerId}`).val(endDate.format("DD.MM.yyyy"));
|
||||
|
||||
momentDuration = moment.duration(endDate.diff(startDate));
|
||||
}
|
||||
|
||||
if (durationNumber > 0 && isInvokedByEndElement && startDate >= endDate) {
|
||||
if(durationNumber > 0 && isInvokedByEndElement && startDate >= endDate) {
|
||||
startDate = endDate.clone().subtract(durationNumber, durationFormat);
|
||||
|
||||
$("#" + startTimeId).val(startDate.format("HH:mm"));
|
||||
$("#" + startDatePickerId).val(startDate.format("DD.MM.yyyy"));
|
||||
$(`#${startTimeId}`).val(startDate.format("HH:mm"));
|
||||
$(`#${startDatePickerId}`).val(startDate.format("DD.MM.yyyy"));
|
||||
|
||||
momentDuration = moment.duration(endDate.diff(startDate));
|
||||
}
|
||||
|
||||
newDurationValue = isInMin ? momentDuration.asMinutes() : momentDuration.asHours();
|
||||
|
||||
$("#" + durationId).val(newDurationValue);
|
||||
$(`#${durationId}`).val(newDurationValue);
|
||||
// Startdatum und Dauer sind vorhanden
|
||||
} else if(isStartTimeValid && isDurationValid) {
|
||||
if (isInvocatedByHoursMinutesButton) {
|
||||
if(isInvocatedByHoursMinutesButton) {
|
||||
durationNumber = isInMin ? durationNumber *= 60 : durationNumber /= 60;
|
||||
$("#" + durationId).val(durationNumber);
|
||||
$(`#${durationId}`).val(durationNumber);
|
||||
}
|
||||
|
||||
calculateTimeWithDuration(startTime, $("#" + endTimeId), startDate, durationNumber, hoursMinutesDropdownBtnId);
|
||||
calculateTimeWithDuration(startTime, $(`#${endTimeId}`), startDate, durationNumber, hoursMinutesDropdownBtnId);
|
||||
// Enddatum und Dauer sind vorhanden
|
||||
} else if(isEndTimeValid && isDurationValid) {
|
||||
if (isInvocatedByHoursMinutesButton) {
|
||||
if(isInvocatedByHoursMinutesButton) {
|
||||
durationNumber = isInMin ? durationNumber *= 60 : durationNumber /= 60;
|
||||
$("#" + durationId).val(durationNumber);
|
||||
$(`#${durationId}`).val(durationNumber);
|
||||
}
|
||||
|
||||
calculateTimeWithDuration(endTime, $("#" + startTimeId), startDate, durationNumber * -1, hoursMinutesDropdownBtnId);
|
||||
} else if (isInvocatedByHoursMinutesButton) {
|
||||
calculateTimeWithDuration(endTime, $(`#${startTimeId}`), startDate, durationNumber * -1, hoursMinutesDropdownBtnId);
|
||||
} else if(isInvocatedByHoursMinutesButton) {
|
||||
// Wurde von Min zu Std oder Std zu Min
|
||||
if (isInvocatedByHoursMinutesButton && isDurationValid) {
|
||||
// Das jetzige Format ist das Gegenteil des vorherigen
|
||||
// Ist es jetzt Minuten, war es vorher Stunden; es muss also mit 60 multipliziert werden.
|
||||
// Ist es jetzt Stunden, war es vorher Minuten; es muss also durch 60 geteilt werden.
|
||||
if(isInvocatedByHoursMinutesButton && isDurationValid) {
|
||||
durationNumber = isInMin ? durationNumber * 60 : durationNumber / 60;
|
||||
$("#" + durationId).val(durationNumber);
|
||||
$(`#${durationId}`).val(durationNumber);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -224,7 +224,7 @@ function validateForm(form, prefix) {
|
||||
$("#srv-doku5").val(doku5);
|
||||
$("#srv-distance").val($(`#${prefix}distance`).val());
|
||||
$("#srv-form-id").val(form.attr("id"));
|
||||
$("#srv-marker").val($(`${prefix}marker-cb`).val());
|
||||
$("#srv-marker").val($(`#${prefix}marker-cb`).is(":checked") ? "on" : "off");
|
||||
$("#srv-service-description").val($(`#${prefix}leistung-select`).find(":selected").val());
|
||||
$("#srv-duration").val($(`#${prefix}duration`).val());
|
||||
$("#srv-betrag").val($("#betrag").val());
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
|
||||
|
||||
function submitInsertAppointmentForm() {
|
||||
function submitInsertAppointmentForm() {
|
||||
showSpinner();
|
||||
validateAppointmentForm();
|
||||
window.validateAppointmentForm();
|
||||
}
|
||||
|
||||
function submitSchedulerDateForm() {
|
||||
@@ -10,205 +8,19 @@ function submitSchedulerDateForm() {
|
||||
$("#scheduler-date-form").submit();
|
||||
}
|
||||
|
||||
function validateAppointmentForm() {
|
||||
var isAllDay = $("#IsAllDay").prop("checked") === true;
|
||||
|
||||
|
||||
var startTimePicker = $("#scheduler-start-time-picker");
|
||||
var startDatePicker = $("#scheduler-start-date-picker");
|
||||
var endTimePicker = $("#scheduler-end-time-picker");
|
||||
var endDatePicker = $("#scheduler-end-date-picker");
|
||||
|
||||
var isStartTimeInputEmpty = isAllDay ? false : isEmptyOrSpaces($("#scheduler-start-time").val());
|
||||
var isEndTimeInputEmpty = isAllDay ? false : isEmptyOrSpaces($("#scheduler-end-time").val());
|
||||
var isStartDateInputEmpty = isEmptyOrSpaces($("#scheduler-start-date").val());
|
||||
var isEndDateInputEmpty = isEmptyOrSpaces($("#scheduler-end-date").val());
|
||||
|
||||
startTimePicker.datetimepicker("show");
|
||||
startTimePicker.datetimepicker("hide");
|
||||
|
||||
startDatePicker.datetimepicker("show");
|
||||
startDatePicker.datetimepicker("hide");
|
||||
|
||||
endTimePicker.datetimepicker("show");
|
||||
endTimePicker.datetimepicker("hide");
|
||||
|
||||
endDatePicker.datetimepicker("show");
|
||||
endDatePicker.datetimepicker("hide");
|
||||
|
||||
var startTime = startTimePicker.datetimepicker("date");
|
||||
var endTime = endTimePicker.datetimepicker("date");
|
||||
var startDate = startDatePicker.datetimepicker("date");
|
||||
var endDate = endDatePicker.datetimepicker("date");
|
||||
|
||||
var a = startDate === undefined || startDate === null || !startDate.isValid();
|
||||
var b = endDate === undefined || endDate === null || !endDate.isValid();
|
||||
var c = isAllDay ? false : startTime === undefined || startTime === null || !startTime.isValid();
|
||||
var d = isAllDay ? false : endTime === undefined || endTime === null || !endTime.isValid();
|
||||
|
||||
if (a || b || c || d || isStartDateInputEmpty || isStartTimeInputEmpty || isEndTimeInputEmpty || isEndDateInputEmpty) {
|
||||
hideSpinner();
|
||||
|
||||
logInfo3("Datumsproblem!");
|
||||
|
||||
showMessagePopupWithHtml("Fehler", '<div class="alert alert-danger" role="alert">Die Zeit- und/oder Datumsangaben sind nicht korrekt.</div>');
|
||||
|
||||
$("#scheduler-start-time, #scheduler-end-time").val("");
|
||||
return;
|
||||
}
|
||||
|
||||
if(endDate.isValid() === false) {
|
||||
endDate = startDate.clone();
|
||||
}
|
||||
|
||||
var startHours = 0;
|
||||
var startMinutes = 0;
|
||||
var endHours = 0;
|
||||
var endMinutes = 0;
|
||||
|
||||
if(isAllDay === false) {
|
||||
startHours = startTime.hours();
|
||||
startMinutes = startTime.minutes();
|
||||
endHours = endTime.hours();
|
||||
endMinutes = endTime.minutes();
|
||||
}
|
||||
|
||||
startDate = startDate.hours(startHours);
|
||||
startDate = startDate.minutes(startMinutes);
|
||||
|
||||
endDate = endDate.hours(endHours);
|
||||
endDate = endDate.minutes(endMinutes);
|
||||
|
||||
if(endDate.isBefore(startDate)) {
|
||||
hideSpinner();
|
||||
showMessagePopupWithHtml("Fehler", '<div class="alert alert-danger" role="alert">Das Startdatum muss vor dem Enddatum liegen.</div>');
|
||||
return;
|
||||
}
|
||||
|
||||
var selectedOids = [];
|
||||
var oidString = "";
|
||||
|
||||
$("#resources-popup input:checked").each(function() {
|
||||
var id = $(this).attr("id");
|
||||
logInfo(id);
|
||||
selectedOids.push(id.split("-")[1]);
|
||||
});
|
||||
|
||||
for(var i = 0; i < selectedOids.length; i++) {
|
||||
oidString += selectedOids[i] + ",";
|
||||
}
|
||||
|
||||
$.get(getCheckResourcesAvailabilityUrl(), { start: startDate.format("DD.MM.YYYY HH:mm"), end: endDate.format("DD.MM.YYYY HH:mm"), resourceOids: oidString, allDay: isAllDay }).done(function(result) {
|
||||
if (result.length > 1) {
|
||||
try {
|
||||
hideSpinner();
|
||||
|
||||
if (result.includes("Fehler!")) {
|
||||
showErrorMessagePopup(result.substring(7));
|
||||
return;
|
||||
} else {
|
||||
showMessagePopupWithHtml("Überschneidung",
|
||||
result,
|
||||
function() {
|
||||
$("#messagePopup .modal-body").html();
|
||||
showSpinner();
|
||||
insertOrUpdateAppointment(startDate.format("DD.MM.YYYY"), endDate.format("DD.MM.YYYY"), startDate.format("HH:mm"), endDate.format("HH:mm"));
|
||||
},
|
||||
false);
|
||||
}
|
||||
|
||||
// ALT!
|
||||
//var unavailableResources = parseJason(result);
|
||||
//var resourceCount = 0;
|
||||
//var names = "";
|
||||
|
||||
//$.each(unavailableResources, function(index, resource) {
|
||||
// if (names.length > 1) {
|
||||
// names += ", ";
|
||||
// }
|
||||
|
||||
// resourceCount++;
|
||||
|
||||
// names += resource.Name;
|
||||
//});
|
||||
|
||||
//var unavailableResourcesMessage;
|
||||
|
||||
//if(resourceCount > 0) {
|
||||
// if(resourceCount > 1) {
|
||||
// unavailableResourcesMessage = "Einige der ausgewählten Ressourcen (" + names + ") sind zum gewählten Zeitpunkt nicht verfügbar.";
|
||||
// } else {
|
||||
// unavailableResourcesMessage = "Eine der ausgewählten Ressourcen (" + names + ") ist zum gewählten Zeitpunkt nicht verfügbar.";
|
||||
// }
|
||||
|
||||
// hideSpinner();
|
||||
|
||||
// showWarningMessageBox("Überschneidung", unavailableResourcesMessage, function() {
|
||||
// $("#messagePopup .modal-body").html();
|
||||
// showSpinner();
|
||||
// insertOrUpdateAppointment(startDate.format("DD.MM.YYYY"), endDate.format("DD.MM.YYYY"), startDate.format("HH:mm"), endDate.format("HH:mm"));
|
||||
// }, false);
|
||||
|
||||
// return;
|
||||
//}
|
||||
} catch (error) {
|
||||
showErrorPopup(error);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
insertOrUpdateAppointment(startDate.format("DD.MM.YYYY"), endDate.format("DD.MM.YYYY"), startDate.format("HH:mm"), endDate.format("HH:mm"));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function insertOrUpdateAppointment(formattedStartDate, formattedEndDate, formattedStartTime, formattedEndTime) {
|
||||
$.get(
|
||||
getCheckForOverlappingAppointmentsUrl(),
|
||||
{
|
||||
startDateRaw: formattedStartDate,
|
||||
endDateRaw: formattedEndDate,
|
||||
startTimeRaw: formattedStartTime,
|
||||
endTimeRaw: formattedEndTime
|
||||
}
|
||||
).done(function(result) {
|
||||
if(false === checkJson(result)) {
|
||||
logWarning("insertOrUpdateAppointment: Der zurückgegebene Wert ist kein gültiges JSON!");
|
||||
return;
|
||||
}
|
||||
|
||||
var isOverlapping = parseJason(result);
|
||||
|
||||
if(isOverlapping === true) {
|
||||
hideSpinner();
|
||||
$("#messagePopup .modal-body").html('<div class="alert alert-warning" role="alert">Dieser Termin überschneidet sich mit einem anderen bereits existierenden Termin.<br/> Möchten Sie ihn wirklich speichern?</div>');
|
||||
showMessagePopupWithCallback(
|
||||
"Überschneidung",
|
||||
null,
|
||||
function() {
|
||||
$("#messagePopup .modal-body").html();
|
||||
showSpinner();
|
||||
$("#insert-appointment-form").submit();
|
||||
},
|
||||
false);
|
||||
} else {
|
||||
$("#insert-appointment-form").submit();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function hideAppointmentForm() {
|
||||
$("#form-container").addClass("d-none d-sm-none");
|
||||
}
|
||||
|
||||
function showAppointmentForm() {
|
||||
$("#form-container").removeClass("d-none d-sm-none");
|
||||
calcPrependTextSizes();
|
||||
window.calcPrependTextSizes();
|
||||
}
|
||||
|
||||
function toggleAppointmentForm() {
|
||||
var isVisible = $("#form-container").css("display") === "block";
|
||||
const isVisible = $("#form-container").css("display") === "block";
|
||||
|
||||
if (isVisible) {
|
||||
if(isVisible) {
|
||||
hideAppointmentForm();
|
||||
} else {
|
||||
showAppointmentForm();
|
||||
@@ -217,33 +29,33 @@ function toggleAppointmentForm() {
|
||||
|
||||
function listSearchOnChange(searchInputId, entryClass, textClass) {
|
||||
try {
|
||||
var text = $("#" + searchInputId).val().toLowerCase();
|
||||
var text = $(`#${searchInputId}`).val().toLowerCase();
|
||||
|
||||
var entries = $("." + entryClass);
|
||||
const entries = $(`.${entryClass}`);
|
||||
|
||||
if (text.length === 0) {
|
||||
if(text.length === 0) {
|
||||
entries.show();
|
||||
}
|
||||
|
||||
$.each(entries, function (index, item) {
|
||||
var customer = $(item);
|
||||
$.each(entries, function(index, item) {
|
||||
const customer = $(item);
|
||||
|
||||
if (customer.find("." + textClass).text().toLowerCase().includes(text)) {
|
||||
if(customer.find(`.${textClass}`).text().toLowerCase().includes(text)) {
|
||||
customer.show();
|
||||
} else {
|
||||
customer.hide();
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
showErrorPopup(error);
|
||||
} catch(error) {
|
||||
window.showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
|
||||
function resetSearch(searchInputId, entryClass) {
|
||||
try {
|
||||
$("#" + searchInputId).val("");
|
||||
$("." + entryClass).show();
|
||||
$(`#${searchInputId}`).val("");
|
||||
$(`.${entryClass}`).show();
|
||||
} catch (error) {
|
||||
showErrorPopup(error);
|
||||
window.showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
@@ -178,6 +178,11 @@ namespace BeWoPlanerMobil.Util
|
||||
|
||||
schedulerAppointment.ResourceList.DoForEach(resource => { ResourceListInfo += $"{resource.Name}; "; });
|
||||
ResourceListInfo = ResourceListInfo.Trim(' ').Trim(';');
|
||||
|
||||
if(IsTask && schedulerAppointment.SupportConceptList.Any())
|
||||
{
|
||||
CustomerListInfo = schedulerAppointment.SupportConceptList.First().CustomerName;
|
||||
}
|
||||
}
|
||||
|
||||
private static string GetHexColorValueForCss(string argbHexColorValue)
|
||||
|
||||
@@ -29,6 +29,9 @@
|
||||
public static string MarkerKey => "marker-cb";
|
||||
public static string FormIdKey => "form-id";
|
||||
public static string BetragKey => "betrag";
|
||||
public static string ServiceRecordSignatureBlobKey => "service-record-signature-blob";
|
||||
public static string ServiceRecordSignatureDateKey => "service-record-signature-date";
|
||||
public static string ServiceRecordSignatureRecordOidKey => "service-record-signature-record-oid";
|
||||
|
||||
// Kalender
|
||||
public static string AppointmentStartDateKey => "StartDate";
|
||||
@@ -79,5 +82,6 @@
|
||||
public static string DoLogoutKey => "DoLogout";
|
||||
public static string ReportErrorMessageKey => "ReportErrorMessage";
|
||||
public static string ErrorAlertPopupMessage => "ErrorAlertPopupMessage";
|
||||
public static string InfoMessageKey => "InfoMessage";
|
||||
}
|
||||
}
|
||||
@@ -448,8 +448,11 @@ namespace BeWoPlanerMobil.Util
|
||||
{
|
||||
try
|
||||
{
|
||||
var isSuccessfulStartDate = DateTime.TryParseExact(start, "dd.MM.yyyy HH:mm", null, DateTimeStyles.None, out var startDate);
|
||||
var isSuccessfulEndDate = DateTime.TryParseExact(end, "dd.MM.yyyy HH:mm", null, DateTimeStyles.None, out var endDate);
|
||||
//var isSuccessfulStartDate = DateTime.TryParseExact(start, "dd.MM.yyyy HH:mm", null, DateTimeStyles.None, out var startDate);
|
||||
//var isSuccessfulEndDate = DateTime.TryParseExact(end, "dd.MM.yyyy HH:mm", null, DateTimeStyles.None, out var endDate);
|
||||
|
||||
var isSuccessfulStartDate = DateTime.TryParse(start, out var startDate);
|
||||
var isSuccessfulEndDate = DateTime.TryParse(end, out var endDate);
|
||||
|
||||
if(isSuccessfulStartDate && isSuccessfulEndDate)
|
||||
{
|
||||
@@ -477,7 +480,7 @@ namespace BeWoPlanerMobil.Util
|
||||
|
||||
foreach(var par in paragraphs)
|
||||
{
|
||||
stringBuilder.AppendLine("<p>");
|
||||
stringBuilder.AppendLine($"<p class='text-wrap'>");
|
||||
var p = par.Replace(Environment.NewLine, "<br />\r\n");
|
||||
|
||||
if(nofollow)
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
@using BS.Shared.DataContracts
|
||||
@model CustomerModel
|
||||
|
||||
<script>
|
||||
<script type="text/javascript">
|
||||
$(document).ready(() => {
|
||||
try {
|
||||
window.bsCustomFileInput.destroy();
|
||||
@@ -174,7 +174,7 @@
|
||||
</div>
|
||||
<input type="text" class="input-group-text px-1 form-control text-left pointer-element no-focus-outline no-selection" value="@folder.Name" readonly onclick="toggleFolderIcon(this)"/>
|
||||
<div class="input-group-append">
|
||||
<button class="btn btn-primary rounded-right" data-toggle="dropdown">
|
||||
<button class="btn btn-primary rounded-right border-dark" data-toggle="dropdown">
|
||||
<i class="fas fa-ellipsis-v"></i>
|
||||
</button>
|
||||
<div class="dropdown-menu">
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
@using BS.Shared.DataContracts
|
||||
@model MainModel
|
||||
|
||||
<script>
|
||||
<script type="text/javascript">
|
||||
function toggleGoalHeader(branchId) {
|
||||
try {
|
||||
$(branchId).collapse("toggle");
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
<script>
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function () {
|
||||
$("#hours-minutes-dropdown-btn").on("click", function() {
|
||||
$("#hours-minutes-dropdown-btn").data("text", $("#hours-minutes-dropdown-btn").text().replaceAll(/\s/g, ""));
|
||||
|
||||
@@ -211,7 +211,7 @@
|
||||
}
|
||||
}
|
||||
} catch(error) {
|
||||
showErrorPopup(error);
|
||||
window.showErrorPopup(error);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -396,10 +396,6 @@
|
||||
return '@Url.Action("GetSelectedRecordInformationWithOid")';
|
||||
}
|
||||
|
||||
function getSetSelectedSignatureUrl() {
|
||||
return '@Url.Action("SaveUnterschrift")';
|
||||
}
|
||||
|
||||
function getDeleteServiceRecordUrl() {
|
||||
return '@Url.Action("DeleteServiceRecord")';
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
<script>
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function () {
|
||||
try {
|
||||
$("#mb-hours-minutes-dropdown-btn").on("click",
|
||||
|
||||
@@ -72,6 +72,17 @@
|
||||
showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
|
||||
function submitServiceRecordEditForm(serviceRecordOid) {
|
||||
const form = document.getElementById(`select-record-to-edit-form-${serviceRecordOid}`);
|
||||
|
||||
if(hasEmptyRequiredFields($(form))) {
|
||||
return;
|
||||
}
|
||||
|
||||
showSpinner();
|
||||
form.submit();
|
||||
}
|
||||
</script>
|
||||
|
||||
@{
|
||||
@@ -261,241 +272,265 @@
|
||||
|
||||
<div class="row mb-3">
|
||||
<div class="card w-100 @cardBackground">
|
||||
<div class="card-header" onclick="cardHeaderClick('#chevron-@serviceRecord.ServiceRecordOid', '#collapse-service-record-@serviceRecord.ServiceRecordOid')">
|
||||
@*
|
||||
alt: cardHeaderClick('#chevron-@serviceRecord.ServiceRecordOid', '#collapse-service-record-@serviceRecord.ServiceRecordOid')
|
||||
*@
|
||||
<div class="card-header" onclick="cardHeaderClick2(this)">
|
||||
<div class="d-inline-flex">
|
||||
<i class="fas fa-chevron-down h-100 text-primary" id="chevron-@serviceRecord.ServiceRecordOid"></i>
|
||||
</div>
|
||||
<div class="p2 d-inline-flex text-primary h-100">
|
||||
<div class="d-inline-flex text-primary h-100">
|
||||
<button type="button" class="btn btn-link">
|
||||
@MainModel.GetServiceRecordTimeHeader(serviceRecord, true)
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div id="collapse-service-record-@serviceRecord.ServiceRecordOid" class="collapse">
|
||||
<div class="collapse" id="collapse-service-record-@serviceRecord.ServiceRecordOid">
|
||||
<div class="card-body">
|
||||
<div class="container">
|
||||
<div class="row mb-3">
|
||||
@if(Model.HasRightToEditServiceRecord(serviceRecord))
|
||||
{
|
||||
using(Html.BeginForm("SelectRecordToEdit", "Main", FormMethod.Post))
|
||||
using(Html.BeginForm("SelectRecordToEdit", "Main", FormMethod.Post, new { id = "select-record-to-edit-form-" + serviceRecord.ServiceRecordOid.Value }))
|
||||
{
|
||||
<div class="col-auto">
|
||||
<button type="button" onclick="submitForm(this)" class="btn btn-primary">
|
||||
<span class="fas fa-edit"></span>
|
||||
</button>
|
||||
<input type="hidden" name="service-record-oid-holder" value="@serviceRecord.ServiceRecordOid" />
|
||||
</div>
|
||||
<input type="hidden" name="service-record-oid-holder" value="@serviceRecord.ServiceRecordOid" />
|
||||
}
|
||||
}
|
||||
|
||||
@if(MainModel.IsAllowedToDeleteServiceRecord(serviceRecord))
|
||||
{
|
||||
<div class="col-auto">
|
||||
<button type="button" class="btn btn-primary" onclick="deleteServiceRecord(@serviceRecord.ServiceRecordOid)">
|
||||
<span class="fas fa-trash-alt"></span>
|
||||
</button>
|
||||
</div>
|
||||
}
|
||||
|
||||
@if(Model.ShowSignature && !serviceRecord.SignatureOid.HasValue && serviceRecord.Customer != null)
|
||||
{
|
||||
<div class="col-auto">
|
||||
<button type="button" class="btn btn-primary" onclick="initializeSignature(@serviceRecord.ServiceRecordOid)">
|
||||
using(Html.BeginForm("SaveSignature", "Main", FormMethod.Post, new { id = $"save-signature-form-{serviceRecord.ServiceRecordOid.Value}" }))
|
||||
{
|
||||
<input type="hidden" name="@FormCollectionConstants.ServiceRecordSignatureBlobKey" id="sr-sig-blob-@serviceRecord.ServiceRecordOid.Value" />
|
||||
<input type="hidden" name="@FormCollectionConstants.ServiceRecordSignatureDateKey" id="sr-sig-date-@serviceRecord.ServiceRecordOid.Value" />
|
||||
<input type="hidden" name="@FormCollectionConstants.ServiceRecordSignatureRecordOidKey" id="sr-sig-sr-oid-@serviceRecord.ServiceRecordOid.Value" value="@serviceRecord.ServiceRecordOid.Value" />
|
||||
}
|
||||
}
|
||||
|
||||
<div class="btn-group" role="group">
|
||||
@* Edit-Button *@
|
||||
@if(Model.HasRightToEditServiceRecord(serviceRecord))
|
||||
{
|
||||
<button type="button" onclick="submitServiceRecordEditForm(@serviceRecord.ServiceRecordOid)" class="btn btn-outline-primary">
|
||||
<span class="fas fa-edit"></span>
|
||||
</button>
|
||||
}
|
||||
|
||||
@* Löschen-Button *@
|
||||
@if(MainModel.IsAllowedToDeleteServiceRecord(serviceRecord))
|
||||
{
|
||||
<button type="button" class="btn btn-outline-danger" onclick="deleteServiceRecord(@serviceRecord.ServiceRecordOid)">
|
||||
<span class="fas fa-trash-alt"></span>
|
||||
</button>
|
||||
}
|
||||
|
||||
@* Unterschrift-Anlegen-Button *@
|
||||
@if(Model.ShowSignature && !serviceRecord.SignatureOid.HasValue && serviceRecord.Customer != null)
|
||||
{
|
||||
<button type="button" class="btn btn-outline-primary" onclick="initializeSignature(@serviceRecord.ServiceRecordOid)">
|
||||
<span class="fas fa-signature"></span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
if(Html.IsInDebugMode())
|
||||
{
|
||||
<div class="col-auto">
|
||||
<button class="btn btn-primary" type="button" onclick="generateExternalLink(@serviceRecord.ServiceRecordOid)">
|
||||
if(Html.IsInDebugMode())
|
||||
{
|
||||
<button class="btn btn-outline-primary" type="button" onclick="generateExternalLink(@serviceRecord.ServiceRecordOid)">
|
||||
<span class="fas fa-external-link-alt"></span>
|
||||
</button>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
else if(Model.ShowSignature && serviceRecord.SignatureOid.HasValue)
|
||||
{
|
||||
<div class="col-auto">
|
||||
<button type="button" data-toggle="modal" class="btn btn-primary" onclick="getSignatureImage(@serviceRecord.ServiceRecordOid.Value, @serviceRecord.SignatureOid.Value)">
|
||||
}
|
||||
}@* Unterschrift-Anzeigen-Button *@
|
||||
else if(Model.ShowSignature && serviceRecord.SignatureOid.HasValue)
|
||||
{
|
||||
<button type="button" data-toggle="modal" class="btn btn-outline-primary" onclick="getSignatureImage(@serviceRecord.ServiceRecordOid.Value, @serviceRecord.SignatureOid.Value)">
|
||||
<span class="fas fa-file-contract"></span>
|
||||
</button>
|
||||
</div>
|
||||
if(AbstractModel.HasRightToDeleteReceiptSignatures)
|
||||
{
|
||||
<div class="col-auto">
|
||||
<button type="button" class="btn btn-primary" onclick="deleteSigntarue(@serviceRecord.SignatureOid.Value, @serviceRecord.ServiceRecordOid.Value, '@serviceRecord.Customer', '@MainModel.GetServiceRecordTimeHeader(serviceRecord, false)')">
|
||||
if(AbstractModel.HasRightToDeleteReceiptSignatures)
|
||||
{
|
||||
<button type="button" class="btn btn-outline-danger" onclick="deleteSigntarue(@serviceRecord.SignatureOid.Value, @serviceRecord.ServiceRecordOid.Value, '@serviceRecord.Customer', '@MainModel.GetServiceRecordTimeHeader(serviceRecord, false)')">
|
||||
<i class="fas fa-file-contract"></i>
|
||||
löschen
|
||||
<i class="fas fa-arrow-right"></i>
|
||||
<i class="fas fa-trash-alt"></i>
|
||||
</button>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
}
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col text-secondary">
|
||||
Minuten (gerundet):
|
||||
</div>
|
||||
<div class="col text-info">
|
||||
@durationStr
|
||||
</div>
|
||||
</div>
|
||||
@if(Model.ShowDistanceField && serviceRecord.DistanceInMeterDecimal != null && serviceRecord.DistanceInMeterDecimal.Value > 0)
|
||||
{
|
||||
<div class="row">
|
||||
<div class="col text-secondary">
|
||||
Gefahrene Kilometer:
|
||||
</div>
|
||||
<div class="col">
|
||||
@($"{serviceRecord.DistanceInMeterDecimal:0.##}")
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
@if(serviceRecord.Goals != null && serviceRecord.Goals.Count > 0)
|
||||
{
|
||||
if(!string.IsNullOrEmpty(zieleString))
|
||||
{
|
||||
<div class="row">
|
||||
<div class="col text-secondary">
|
||||
Ziele:
|
||||
</div>
|
||||
<div class="col">
|
||||
@(new HtmlString(zieleString))
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
if(serviceRecord.Goals.Any(goal => goal.Type == ValueListEntryType.SupportConceptGoalType || goal.Type == ValueListEntryType.SupportConceptIndividualGoalType))
|
||||
{
|
||||
<div class="row">
|
||||
<div class="col text-secondary">
|
||||
Maßnahmen:
|
||||
</div>
|
||||
<div class="col">
|
||||
@(new HtmlString(massnahmenString))
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
<div class="row">
|
||||
<div class="col text-secondary">
|
||||
Leistungskategorie:
|
||||
</div>
|
||||
<div class="col">
|
||||
@serviceRecord.ServiceDescription.CategoryName
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col text-secondary">
|
||||
Leistung:
|
||||
</div>
|
||||
<div class="col">
|
||||
@serviceRecord.ServiceDescription.Name
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col text-secondary">
|
||||
Angelegt für:
|
||||
</div>
|
||||
<div class="col">
|
||||
@($"{serviceRecord.Employee.FirstName} {serviceRecord.Employee.LastName}")
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if(AbstractModel.ShowServiceRecordInsertedOn)
|
||||
{
|
||||
<div class="row">
|
||||
<div class="col text-secondary">
|
||||
Angelegt von:
|
||||
</div>
|
||||
<div class="col">
|
||||
@serviceRecord.InsUser
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col text-secondary">
|
||||
Angelegt am:
|
||||
</div>
|
||||
<div class="col">
|
||||
@serviceRecord.InsertedOn
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
<table class="table table-sm table-striped service-record-table">
|
||||
@* Dauer *@
|
||||
<tr>
|
||||
<td class="text-secondary">
|
||||
Minuten (gerundet):
|
||||
</td>
|
||||
<td class="text-info">
|
||||
@durationStr
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@if(Model.ShowBetrag)
|
||||
{
|
||||
var betrag = string.Empty;
|
||||
|
||||
if(serviceRecord.Betrag.HasValue && serviceRecord.Betrag.Value > 0)
|
||||
@* Gefahrene Kilometer *@
|
||||
@if(Model.ShowDistanceField && serviceRecord.DistanceInMeterDecimal != null && serviceRecord.DistanceInMeterDecimal.Value > 0)
|
||||
{
|
||||
betrag = serviceRecord.Betrag.Value.ToString("#.00") + " €";
|
||||
<tr>
|
||||
<td class="text-secondary">
|
||||
Gefahrene Kilometer:
|
||||
</td>
|
||||
<td>
|
||||
@($"{serviceRecord.DistanceInMeterDecimal:0.##}")
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
|
||||
<div class="row">
|
||||
<div class="col text-secondary">
|
||||
Betrag:
|
||||
</div>
|
||||
<div class="col">
|
||||
@betrag
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
@{
|
||||
var header1 = "Dokumentation";
|
||||
if(Model.NumberOfDokuTypes >= 1)
|
||||
@* Ziele & Maßnahmen *@
|
||||
@if(serviceRecord.Goals != null && serviceRecord.Goals.Count > 0)
|
||||
{
|
||||
header1 = Model.Dokutypes[0].TypeDescription;
|
||||
}
|
||||
|
||||
<div class="row">
|
||||
<div class="col text-secondary">
|
||||
@header1:
|
||||
</div>
|
||||
<div class="col">
|
||||
@Html.Raw(MobileUtils.ToHtml(serviceRecord.Notice, false))
|
||||
</div>
|
||||
</div>
|
||||
|
||||
for(var i = 1; i < serviceRecord.NoticeList.Count; i++)
|
||||
{
|
||||
var notice = serviceRecord.NoticeList[i];
|
||||
|
||||
if(string.IsNullOrWhiteSpace(notice) || Model.NumberOfDokuTypes <= i)
|
||||
if(!string.IsNullOrEmpty(zieleString))
|
||||
{
|
||||
continue;
|
||||
<tr>
|
||||
<td class="text-secondary">
|
||||
Ziele:
|
||||
</td>
|
||||
<td>
|
||||
@(new HtmlString(zieleString))
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
|
||||
var header = $"Dokumentation {i + 1}";
|
||||
|
||||
if(Model.NumberOfDokuTypes >= 2)
|
||||
if(serviceRecord.Goals.Any(goal => goal.Type == ValueListEntryType.SupportConceptGoalType || goal.Type == ValueListEntryType.SupportConceptIndividualGoalType))
|
||||
{
|
||||
if(Model.NumberOfDokuTypes <= i)
|
||||
<tr>
|
||||
<td class="text-secondary">
|
||||
Maßnahmen:
|
||||
</td>
|
||||
<td>
|
||||
@(new HtmlString(massnahmenString))
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
}
|
||||
|
||||
@* Leistungskategorie *@
|
||||
<tr>
|
||||
<td class="text-secondary">
|
||||
Leistungskategorie:
|
||||
</td>
|
||||
<td>
|
||||
@serviceRecord.ServiceDescription.CategoryName
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@* Leistung *@
|
||||
<tr>
|
||||
<td class="text-secondary">
|
||||
Leistung:
|
||||
</td>
|
||||
<td>
|
||||
@serviceRecord.ServiceDescription.Name
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@* Angelegt für *@
|
||||
<tr>
|
||||
<td class="text-secondary">
|
||||
Angelegt für:
|
||||
</td>
|
||||
<td>
|
||||
@($"{serviceRecord.Employee.FirstName} {serviceRecord.Employee.LastName}")
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@* Angelegt von & angelegt am *@
|
||||
@if(AbstractModel.ShowServiceRecordInsertedOn)
|
||||
{
|
||||
<tr>
|
||||
<td class="text-secondary">
|
||||
Angelegt von:
|
||||
</td>
|
||||
<td>
|
||||
@serviceRecord.InsUser
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-secondary">
|
||||
Angelegt am:
|
||||
</td>
|
||||
<td>
|
||||
@serviceRecord.InsertedOn
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
|
||||
@* Betrag *@
|
||||
@if(Model.ShowBetrag && serviceRecord.Betrag.HasValue && serviceRecord.Betrag.Value > 0)
|
||||
{
|
||||
var betrag = serviceRecord.Betrag.Value.ToString("#.00") + " €";
|
||||
|
||||
<tr>
|
||||
<td class="text-secondary">
|
||||
Betrag:
|
||||
</td>
|
||||
<td>
|
||||
@betrag
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
|
||||
@* Doku *@
|
||||
@{
|
||||
var header1 = "Dokumentation";
|
||||
if(Model.NumberOfDokuTypes >= 1)
|
||||
{
|
||||
header1 = Model.Dokutypes[0].TypeDescription;
|
||||
}
|
||||
|
||||
<tr>
|
||||
<td class="text-secondary">
|
||||
@header1:
|
||||
</td>
|
||||
<td>
|
||||
@Html.Raw(MobileUtils.ToHtml(serviceRecord.Notice, false))
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
for(var i = 1; i < serviceRecord.NoticeList.Count; i++)
|
||||
{
|
||||
var notice = serviceRecord.NoticeList[i];
|
||||
|
||||
if(string.IsNullOrWhiteSpace(notice) || Model.NumberOfDokuTypes <= i)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
header = Model.Dokutypes[i].TypeDescription;
|
||||
}
|
||||
<div class="row">
|
||||
<div class="col text-secondary">
|
||||
@header:
|
||||
</div>
|
||||
<div class="col">
|
||||
@Html.Raw(MobileUtils.ToHtml(notice, false))
|
||||
</div>
|
||||
</div>
|
||||
var header = $"Dokumentation {i + 1}";
|
||||
|
||||
if(Model.NumberOfDokuTypes >= 2)
|
||||
{
|
||||
if(Model.NumberOfDokuTypes <= i)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
header = Model.Dokutypes[i].TypeDescription;
|
||||
}
|
||||
<tr>
|
||||
<td class="text-secondary">
|
||||
@header:
|
||||
</td>
|
||||
<td>
|
||||
@Html.Raw(MobileUtils.ToHtml(notice, false))
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
}
|
||||
}
|
||||
<div class="row">
|
||||
<div class="col text-secondary">
|
||||
Unterschrieben:
|
||||
</div>
|
||||
<div class="col">
|
||||
@hasSignatureStr
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@* Unterschrieben *@
|
||||
<tr>
|
||||
<td class="text-secondary">
|
||||
Unterschrieben:
|
||||
</td>
|
||||
<td>
|
||||
@hasSignatureStr
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -299,7 +299,7 @@
|
||||
|
||||
using(Html.BeginForm("CreateOrUpdateServiceRecord", "Main", FormMethod.Post, new { id = "singleBookingForm" }))
|
||||
{
|
||||
<div class="mt-3">
|
||||
<div>
|
||||
@* ----- Einzelbuchung: Mitarbeiter ----- *@
|
||||
<div class="form-row">
|
||||
<div class="col-md">
|
||||
@@ -313,22 +313,19 @@
|
||||
@if(Model.SelectedSupportConcept != null && Model.SelectedSupportConcept.Goals.Any())
|
||||
{
|
||||
<!-- Einzelbuchung: Ziele -->
|
||||
<div class="form-row">
|
||||
<div class="form-row mb-0">
|
||||
<div class="col-md">
|
||||
<button type="button" class="btn btn-primary form-control my-3" data-toggle="modal" data-target="#goal-popup" id="goals-button">
|
||||
Ziele <span class="badge badge-light text-primary">@Model.SelectedGoals.Count</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div class="form-row mb-0">
|
||||
<div class="col-md">
|
||||
<div class="collapse w-100 mt-1 max-vw-50" id="goals-container"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@* ----- Einzelbuchung: Kategorie & Leistung ----- *@
|
||||
<div id="category-to-description-container">
|
||||
@@ -343,7 +340,7 @@
|
||||
<div class="form-row">
|
||||
<div class="col-md">
|
||||
<div class="custom-control custom-checkbox custom-control-inline">
|
||||
<input type="checkbox" class="custom-control-input" name="marker-cb" id="marker-cb" @markerCheckedValue />
|
||||
<input type="checkbox" class="custom-control-input" name="@FormCollectionConstants.MarkerKey" id="marker-cb" @markerCheckedValue />
|
||||
<label class="custom-control-label" for="marker-cb">Marker</label>
|
||||
</div>
|
||||
</div>
|
||||
@@ -539,7 +536,7 @@
|
||||
@* ----- Einzelbuchung: Textbausteine ----- *@
|
||||
@if(AbstractModel.HasRightToSeeTextModules)
|
||||
{
|
||||
<script>
|
||||
<script type="text/javascript">
|
||||
function textModuleButtonOnClick() {
|
||||
$('#tree').load('@Url.Action("LoadUpToDateTextModules")');
|
||||
}
|
||||
|
||||
@@ -14,13 +14,13 @@
|
||||
|
||||
<script type="text/javascript">
|
||||
function textCategoryOnClick(categoryId) {
|
||||
var childrenContainer = $(`#${categoryId}-children-container`);
|
||||
var iconSpan = $(`#${categoryId}-icon-span`);
|
||||
const childrenContainer = $(`#${categoryId}-children-container`);
|
||||
const iconSpan = $(`#${categoryId}-icon-span`);
|
||||
|
||||
var displayValue = childrenContainer.css("display");
|
||||
const displayValue = childrenContainer.css("display");
|
||||
|
||||
var classToRemove = displayValue === "block" ? "fa-angle-up" : "fa-angle-down";
|
||||
var classToAdd = displayValue === "block" ? "fa-angle-down" : "fa-angle-up";
|
||||
const classToRemove = displayValue === "block" ? "fa-angle-up" : "fa-angle-down";
|
||||
const classToAdd = displayValue === "block" ? "fa-angle-down" : "fa-angle-up";
|
||||
|
||||
iconSpan.removeClass(classToRemove);
|
||||
iconSpan.addClass(classToAdd);
|
||||
@@ -42,25 +42,25 @@
|
||||
}
|
||||
|
||||
$.get("@Url.Action("LoadCompleteTextbausteinByOid")", { pTextbausteinOid: textModuleOid }).done(function(textModuleText) {
|
||||
if ($(dokufeldId).length > 0) {
|
||||
if($(dokufeldId).length > 0) {
|
||||
focusedDokuFeld = $(dokufeldId);
|
||||
} else {
|
||||
var numberOfDokutypes = getNumberOfDokutypes();
|
||||
const numberOfDokutypes = getNumberOfDokutypes();
|
||||
|
||||
for (var i = 0; i < numberOfDokutypes; i++) {
|
||||
var currentElement = $(`#doku_${i}`);
|
||||
for(let i = 0; i < numberOfDokutypes; i++) {
|
||||
const currentElement = $(`#doku_${i}`);
|
||||
|
||||
if (currentElement.css("display") !== "none") {
|
||||
if(currentElement.css("display") !== "none") {
|
||||
focusedDokuFeld = $(dokuTextareaId + i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var cursorPosition = focusedDokuFeld.prop("selectionStart");
|
||||
var v = focusedDokuFeld.val();
|
||||
var textBefore = v.substring(0, cursorPosition);
|
||||
var textAfter = v.substring(cursorPosition, v.length);
|
||||
const cursorPosition = focusedDokuFeld.prop("selectionStart");
|
||||
const v = focusedDokuFeld.val();
|
||||
const textBefore = v.substring(0, cursorPosition);
|
||||
const textAfter = v.substring(cursorPosition, v.length);
|
||||
|
||||
focusedDokuFeld.val(textBefore + textModuleText + textAfter);
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
|
||||
@if(Model?.TextModules?.Any() ?? false)
|
||||
{
|
||||
<script>
|
||||
<script type="text/javascript">
|
||||
$("#textmodule-container").show();
|
||||
</script>
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
}
|
||||
else
|
||||
{
|
||||
<script>
|
||||
<script type="text/javascript">
|
||||
$("#textmodule-container").hide();
|
||||
</script>
|
||||
}
|
||||
@@ -19,7 +19,7 @@
|
||||
var sigInfo = $"Unterschrift{plural} von {Model.Quittierungsbelegsunterschriftenobjekt.PersonName} für {Model.Quittierungsbelegsunterschriftenobjekt.ServiceRecordCount} erbrachte Leistung{leistungsplurarl} von {Model.Quittierungsbelegsunterschriftenobjekt.CustomerName} ({Model.Quittierungsbelegsunterschriftenobjekt.TimeSpanInfo})";
|
||||
}
|
||||
|
||||
<script>
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function () {
|
||||
try {
|
||||
$(".left-col").width(getMaxWidth("left-col"));
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
<script type="text/javascript">
|
||||
function getChangeDateSelectionUrl() {
|
||||
return "@Url.Action("ChangeDateSelection")";
|
||||
}
|
||||
|
||||
@@ -228,8 +228,8 @@
|
||||
|
||||
@if(Model.SelectedQuery != null && Model.SelectedQuery.Parameter != null && Model.SelectedQuery.Parameter.Count > 0)
|
||||
{
|
||||
<div>
|
||||
<hr />
|
||||
<div>
|
||||
<hr />
|
||||
@for(var i = 0; i < Model.SelectedQuery.Parameter.Count; i++)
|
||||
{
|
||||
var parameter = Model.SelectedQuery.Parameter[i];
|
||||
@@ -322,7 +322,7 @@
|
||||
employeeButtonValue = selectedEmployee.DetailDescription;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Html.PopupWithSearchForIFilterables(Model.AllEmployeesForQueries, "selectEmployeeParameter", $"{parameterType}, {parameterOid}", employeeButtonValue, "query-employee-popup", false, true, true, true)
|
||||
</div>
|
||||
</div>
|
||||
@@ -341,7 +341,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Html.PopupWithSearchForIFilterables(Model.AllCustomersForQueries, "selectCustomerParameter", $"{parameterType}, {parameterOid}", customerButtonValue, "query-customer-popup", false, true, true, true)
|
||||
</div>
|
||||
</div>
|
||||
@@ -439,7 +439,7 @@
|
||||
</div>
|
||||
break;
|
||||
case QueryParameterType.DateRange:
|
||||
var startValue = string.Empty;
|
||||
var startValue = string.Empty;
|
||||
var endValue = string.Empty;
|
||||
|
||||
if(Model.SelectedValues.ContainsKey(parameterOid) && Model.SelectedValues[parameterOid].Parameter is BS.Shared.Core.DateTimeSpan dateTimeSpan)
|
||||
@@ -490,7 +490,7 @@
|
||||
teamButtonValue = selectedTeam.Name;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Html.PopupWithSearchForIFilterables(Model.AllTeamsForQueries, "selectTeamParameter", $"{parameterType}, {parameterOid}", teamButtonValue, "query-team-popup", false, true, true, true)
|
||||
</div>
|
||||
</div>
|
||||
@@ -591,7 +591,7 @@
|
||||
{
|
||||
var splitName = parameter.Name.Split('_');
|
||||
parameterName = string.Empty;
|
||||
for(var j = 0; j < splitName.Length-1; j++)
|
||||
for(var j = 0; j < splitName.Length - 1; j++)
|
||||
{
|
||||
parameterName += splitName[j];
|
||||
}
|
||||
@@ -642,7 +642,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Html.PopupWithSearchForIFilterables(Model.AllOrganisationForQuery, "selectOrganizationParameter", $"{parameterType}, {parameterOid}", organizationButtonValue, "query-organization-popup", false, true, true, true)
|
||||
</div>
|
||||
</div>
|
||||
@@ -671,12 +671,12 @@
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
<hr />
|
||||
<div class="form-row">
|
||||
<div class="col-md">
|
||||
<button class="btn btn-primary" type="button" onclick="executeQueryButtonClick()">Bericht öffnen</button>
|
||||
|
||||
<hr />
|
||||
<div class="form-row">
|
||||
<div class="col-md">
|
||||
<button class="btn btn-primary" type="button" onclick="executeQueryButtonClick()">Bericht öffnen</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
@@ -12,7 +12,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
<script>
|
||||
<script type="text/javascript">
|
||||
$(window).ready(function () {
|
||||
toggleMitarbeiterstundenForm();
|
||||
});
|
||||
|
||||
@@ -172,17 +172,17 @@
|
||||
{
|
||||
<div class="form-row">
|
||||
<div class="col">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="filterRadio" id="msk-filterForEmployeesRadio" onchange="reportFilterOnChange()" checked />
|
||||
<label for="msk-filterForEmployeesRadio">Nach Mitarbeiter filtern</label>
|
||||
<div class="custom-control custom-radio">
|
||||
<input class="custom-control-input" type="radio" name="filterRadio" id="msk-filterForEmployeesRadio" onchange="reportFilterOnChange()" checked />
|
||||
<label class="custom-control-label" for="msk-filterForEmployeesRadio">Nach Mitarbeiter filtern</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div class="col">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="filterRadio" id="msk-filterForTeamsRadio" onchange="reportFilterOnChange()" />
|
||||
<label for="msk-filterForTeamsRadio">Nach Teams filtern</label>
|
||||
<div class="custom-control custom-radio">
|
||||
<input class="custom-control-input" type="radio" name="filterRadio" id="msk-filterForTeamsRadio" onchange="reportFilterOnChange()" />
|
||||
<label class="custom-control-label" for="msk-filterForTeamsRadio">Nach Teams filtern</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -192,16 +192,16 @@
|
||||
@if(AbstractModel.HasRightMitarbeiterstundenkontoViewAll)
|
||||
{
|
||||
<div class="form-row">
|
||||
<div class="col">
|
||||
<div class="form-group form-check">
|
||||
<input type="checkbox" class="form-check-input" id="msk-all-employees-cb" />
|
||||
<label class="form-check-label" for="msk-all-employees-cb" onclick="allEmployeesCbOnClick()">Alle Mitarbeiter</label>
|
||||
<div class="col mb-2">
|
||||
<div class="custom-control custom-switch">
|
||||
<input type="checkbox" class="custom-control-input" id="msk-all-employees-cb" />
|
||||
<label class="custom-control-label" for="msk-all-employees-cb" onclick="allEmployeesCbOnClick()">Alle Mitarbeiter</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
<div class="form-row" id="msk-employee-list">
|
||||
<div class="col mb-3">
|
||||
<div class="col mb-2">
|
||||
@Html.PopupWithSearchForIFilterables(Model.AllEmployees, "setEmployee", null, Model.SelectedEmployee?.DetailDescription, "msk-employee-popup", false)
|
||||
</div>
|
||||
</div>
|
||||
@@ -210,16 +210,16 @@
|
||||
{
|
||||
<div id="msk-team-form">
|
||||
<div class="form-row">
|
||||
<div class="col">
|
||||
<div class="form-group form-check">
|
||||
<input type="checkbox" class="form-check-input" id="msk-all-teams-cb" />
|
||||
<label class="form-check-label" for="msk-all-teams-cb" onclick="allTeamsCbOnClick()">Alle Teams</label>
|
||||
<div class="col mb-2">
|
||||
<div class="custom-control custom-switch">
|
||||
<input type="checkbox" class="custom-control-input" id="msk-all-teams-cb" />
|
||||
<label class="custom-control-label" for="msk-all-teams-cb" onclick="allTeamsCbOnClick()">Alle Teams</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-row" id="msk-team-list">
|
||||
<div class="col mb-3">
|
||||
<div class="col mb-2">
|
||||
@Html.PopupWithSearchForIFilterables(Model.AllTeams, "setTeam", null, Model.SelectedTeam?.DetailDescription, "msk-team-popup", false)
|
||||
</div>
|
||||
</div>
|
||||
@@ -228,10 +228,10 @@
|
||||
|
||||
<div class="form-row">
|
||||
<div class="col">
|
||||
@Html.DropDownListFor(model => model.SelectedMonth, Model.Months, new { @class = "custom-select mb-3", id = "msk-month-select" })
|
||||
@Html.DropDownListFor(model => model.SelectedMonth, Model.Months, new { @class = "custom-select mb-2", id = "msk-month-select" })
|
||||
</div>
|
||||
<div class="col">
|
||||
@Html.DropDownListFor(model => model.SelectedYear, Model.Years, new { @class = "custom-select mb-3", id = "msk-year-select" })
|
||||
@Html.DropDownListFor(model => model.SelectedYear, Model.Years, new { @class = "custom-select mb-2", id = "msk-year-select" })
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
@@ -241,31 +241,31 @@
|
||||
|
||||
@if(str == "StundenkontoTagesansicht")
|
||||
{
|
||||
<div class="col-4">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="msk-ansichtsradio" id="msk-tagesansichtsradio" />
|
||||
<label for="msk-tagesansichtsradio">Tag</label>
|
||||
<div class="col-4 mb-2">
|
||||
<div class="custom-control custom-radio">
|
||||
<input class="custom-control-input" type="radio" name="msk-ansichtsradio" id="msk-tagesansichtsradio" />
|
||||
<label class="custom-control-label" for="msk-tagesansichtsradio">Tag</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-4">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="msk-ansichtsradio" id="msk-monatsansichtsradio" checked />
|
||||
<label for="msk-monatsansichtsradio">Monat</label>
|
||||
<div class="col-4 mb-2">
|
||||
<div class="custom-control custom-radio">
|
||||
<input class="custom-control-input" type="radio" name="msk-ansichtsradio" id="msk-monatsansichtsradio" checked />
|
||||
<label class="custom-control-label" for="msk-monatsansichtsradio">Monat</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-4">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="msk-ansichtsradio" id="msk-jahresansichtsradio" />
|
||||
<label for="msk-jahresansichtsradio">Jahr</label>
|
||||
<div class="col-4 mb-2">
|
||||
<div class="custom-control custom-radio">
|
||||
<input class="custom-control-input" type="radio" name="msk-ansichtsradio" id="msk-jahresansichtsradio" />
|
||||
<label class="custom-control-label" for="msk-jahresansichtsradio">Jahr</label>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="col">
|
||||
<div class="form-group form-check">
|
||||
<input type="checkbox" class="form-check-input" id="msk-tagesansicht-cb" />
|
||||
<label class="form-check-label" for="msk-tagesansicht-cb">@str</label>
|
||||
<div class="col mb-2">
|
||||
<div class="custom-control custom-checkbox">
|
||||
<input type="checkbox" class="custom-control-input" id="msk-tagesansicht-cb" />
|
||||
<label class="custom-control-label" for="msk-tagesansicht-cb">@str</label>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
@using BeWoPlanerMobil.Models
|
||||
@using BeWoPlanerMobil.Util
|
||||
@using BS.Shared.Extensions
|
||||
@model SchedulerModel
|
||||
|
||||
@{
|
||||
@@ -14,10 +13,18 @@
|
||||
}
|
||||
}
|
||||
|
||||
<script>
|
||||
<script type="text/javascript">
|
||||
function alldayChange() {
|
||||
try {
|
||||
$("#scheduler-start-time, #scheduler-end-time").attr("disabled", $("#IsAllDay").prop("checked"));
|
||||
const isAllDay = $("#all-day-switch").is(":checked");
|
||||
|
||||
const startDate = $("#scheduler-start-date").val().substring(0, 10);
|
||||
const endDate = $("#scheduler-end-date").val().substring(0, 10);
|
||||
|
||||
$("#scheduler-start-date, #scheduler-end-date").prop("type", isAllDay ? "date" : "datetime-local");
|
||||
|
||||
$("#scheduler-start-date").val((isAllDay ? startDate : `${startDate}T${moment().format("hh:mm")}`));
|
||||
$("#scheduler-end-date").val((isAllDay ? endDate : `${endDate}T${moment().format("hh:mm")}`));
|
||||
} catch(error) {
|
||||
window.showErrorPopup(error);
|
||||
}
|
||||
@@ -29,7 +36,7 @@
|
||||
|
||||
function calcPrependTextSizes() {
|
||||
try {
|
||||
var width = getMaxWidth("scheduler-form-prepend-text");
|
||||
const width = getMaxWidth("scheduler-form-prepend-text");
|
||||
|
||||
if(width <= 0) {
|
||||
return;
|
||||
@@ -42,107 +49,173 @@
|
||||
}
|
||||
|
||||
function resetInsertAppointmentForm() {
|
||||
$.get("@Url.Action("ResetSelectedAppointment")")
|
||||
.always(function() {
|
||||
if($(window).width() < 768) {
|
||||
hideAppointmentForm();
|
||||
}
|
||||
try {
|
||||
$.get("@Url.Action("ResetSelectedAppointment")")
|
||||
.always(function() {
|
||||
if($(window).width() < 768) {
|
||||
hideAppointmentForm();
|
||||
}
|
||||
});
|
||||
|
||||
$("#subject, #location, #notice").val("");
|
||||
|
||||
$("#scheduler-start-date, #scheduler-end-date").prop("type", "datetime-local");
|
||||
|
||||
$("#scheduler-end-date").val(moment().format("YYYY-MM-DD[T]hh:mm"));
|
||||
|
||||
$("#scheduler-start-date").val(moment().format("YYYY-MM-DD[T]hh:mm"));
|
||||
|
||||
$("#resources-popup input:checked, #customers-popup input:checked, #employees-popup input:checked").each(function() {
|
||||
$(this).prop("checked", false);
|
||||
});
|
||||
|
||||
$("#scheduler-start-time, #scheduler-end-time, #subject, #location, #notice").val("");
|
||||
$("#selected-resources-list, #selected-employees-list, #selected-customers-list").empty();
|
||||
|
||||
$("#scheduler-start-time, #scheduler-end-time").prop("disabled", false);
|
||||
$("#IsAllDay").prop("checked", false);
|
||||
$("#IsPrivate").prop("checked", false);
|
||||
} catch(error) {
|
||||
window.showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
|
||||
$("#scheduler-start-date, #scheduler-end-date").val(moment().format("DD.MM.YYYY"));
|
||||
function validateAppointmentForm() {
|
||||
const isAllDay = $("#IsAllDay").prop("checked") === true;
|
||||
|
||||
$("#resources-popup input:checked, #customers-popup input:checked, #employees-popup input:checked").each(function() {
|
||||
$(this).prop("checked", false);
|
||||
var start = window.moment(new Date($("#scheduler-start-date").val()));
|
||||
var end = window.moment(new Date($("#scheduler-end-date").val()));
|
||||
|
||||
if(start.isValid() === false || end.isValid() === false) {
|
||||
hideSpinner();
|
||||
|
||||
showMessagePopupWithHtml("Fehler", '<div class="alert alert-danger" role="alert">Die Zeit- und/oder Datumsangaben sind nicht korrekt.</div>');
|
||||
return;
|
||||
}
|
||||
|
||||
if(end.isBefore(start)) {
|
||||
hideSpinner();
|
||||
|
||||
showMessagePopupWithHtml("Fehler", '<div class="alert alert-danger" role="alert">Das Startdatum muss vor dem Enddatum liegen.</div>');
|
||||
return;
|
||||
}
|
||||
|
||||
var selectedOids = [];
|
||||
var oidString = "";
|
||||
|
||||
$("#resources-popup input:checked").each(function () {
|
||||
const id = $(this).attr("id");
|
||||
selectedOids.push(id.split("-")[1]);
|
||||
});
|
||||
|
||||
$("#selected-resources-list, #selected-employees-list, #selected-customers-list").empty();
|
||||
for(let i = 0; i < selectedOids.length; i++) {
|
||||
oidString += selectedOids[i] + ",";
|
||||
}
|
||||
|
||||
$("#IsAllDay").prop("checked", false);
|
||||
$("#IsPrivate").prop("checked", false);
|
||||
$.get("@Url.Action("CheckResourcesAvailability", "Scheduler")", {start: start.format("DD.MM.YYYY HH:mm"), end: end.format("DD.MM.YYYY HH:mm"), resourceOids: oidString, allDay: isAllDay}).done(function (result) {
|
||||
if(result.length > 1) {
|
||||
try {
|
||||
hideSpinner();
|
||||
|
||||
if(result.includes("Fehler!")) {
|
||||
window.showErrorMessagePopup(result.substring(7));
|
||||
return;
|
||||
} else {
|
||||
showMessagePopupWithHtml("Überschneidung",
|
||||
result,
|
||||
function () {
|
||||
$("#messagePopup .modal-body").html();
|
||||
showSpinner();
|
||||
insertOrUpdateAppointment(start.format("DD.MM.YYYY"), end.format("DD.MM.YYYY"), start.format("HH:mm"), end.format("HH:mm"));
|
||||
},
|
||||
false);
|
||||
}
|
||||
} catch(error) {
|
||||
window.showErrorPopup(error);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
insertOrUpdateAppointment(start.format("DD.MM.YYYY"), end.format("DD.MM.YYYY"), start.format("HH:mm"), end.format("HH:mm"));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function insertOrUpdateAppointment(formattedStartDate, formattedEndDate, formattedStartTime, formattedEndTime) {
|
||||
$.get(
|
||||
"@Url.Action("CheckForOverlappingAppointments", "Scheduler")",
|
||||
{
|
||||
startDateRaw: formattedStartDate,
|
||||
endDateRaw: formattedEndDate,
|
||||
startTimeRaw: formattedStartTime,
|
||||
endTimeRaw: formattedEndTime
|
||||
}
|
||||
).done(function (result) {
|
||||
if(false === checkJson(result)) {
|
||||
logWarning("insertOrUpdateAppointment: Der zurückgegebene Wert ist kein gültiges JSON!");
|
||||
return;
|
||||
}
|
||||
|
||||
const isOverlapping = parseJason(result);
|
||||
|
||||
if(isOverlapping === true) {
|
||||
hideSpinner();
|
||||
$("#messagePopup .modal-body").html('<div class="alert alert-warning" role="alert">Dieser Termin überschneidet sich mit einem anderen bereits existierenden Termin.<br/> Möchten Sie ihn wirklich speichern?</div>');
|
||||
showMessagePopupWithCallback(
|
||||
"Überschneidung",
|
||||
null,
|
||||
function () {
|
||||
$("#messagePopup .modal-body").html();
|
||||
showSpinner();
|
||||
$("#insert-appointment-form").submit();
|
||||
},
|
||||
false);
|
||||
} else {
|
||||
$("#insert-appointment-form").submit();
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
@using(Html.BeginForm("InsertOrUpdateAppointment", "Scheduler", FormMethod.Post, new { id = "insert-appointment-form" }))
|
||||
{
|
||||
var disabled = Model.SelectedAppointment?.AllDay ?? false ? "disabled" : string.Empty;
|
||||
|
||||
<div class="mt-0">
|
||||
<div class="form-row">
|
||||
<div class="col-7 mx-0 pr-1">
|
||||
<div class="col mx-0 pr-1">
|
||||
<div class="form-group mb-1 mr-0 pr-0">
|
||||
<div class="input-group date" id="scheduler-start-date-picker" data-target-input="nearest">
|
||||
<div class="input-group">
|
||||
<div class="input-group-prepend">
|
||||
<div class="input-group-text scheduler-form-prepend-text">
|
||||
<div class="input-group-text">
|
||||
Start
|
||||
</div>
|
||||
</div>
|
||||
<input type="text" id="scheduler-start-date" name="StartDate" class="form-control datetimepicker-input" data-target="#scheduler-start-date-picker" data-toggle="datetimepicker" value="@Model.StartDateToEdit" />
|
||||
<div class="input-group-append" data-target="#scheduler-start-date-picker" data-toggle="datetimepicker">
|
||||
<div class="input-group-text px-2">
|
||||
<i class="fas fa-calendar-alt"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-5 mx-0 pr-1">
|
||||
<div class="form-group mb-1 ml-0 pl-0">
|
||||
<div class="input-group date" id="scheduler-start-time-picker" data-target-input="nearest">
|
||||
<input type="text" id="scheduler-start-time" @disabled name="StartTime" class="form-control datetimepicker-input" data-target="#scheduler-start-time-picker" value="@Model.StartTimeToEdit" />
|
||||
<div class="input-group-append" data-target="#scheduler-start-time-picker" data-toggle="datetimepicker">
|
||||
<div class="input-group-text px-2">
|
||||
<i class="fas fa-clock"></i>
|
||||
</div>
|
||||
</div>
|
||||
<input type="datetime-local" id="scheduler-start-date" name="StartDate" class="form-control" value="@Model.StartDateToEdit" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div class="col-7 mx-0 pr-1">
|
||||
<div class="col mx-0 pr-1">
|
||||
<div class="form-group mb-1 mr-0 pr-0">
|
||||
<div class="input-group date" id="scheduler-end-date-picker" data-target-input="nearest">
|
||||
<div class="input-group date">
|
||||
<div class="input-group-prepend">
|
||||
<div class="input-group-text scheduler-form-prepend-text">
|
||||
<div class="input-group-text">
|
||||
Ende
|
||||
</div>
|
||||
</div>
|
||||
<input type="text" id="scheduler-end-date" name="EndDate" class="form-control datetimepicker-input" data-target="#scheduler-end-date-picker" data-toggle="datetimepicker" value="@Model.EndDateToEdit" />
|
||||
<div class="input-group-append" data-target="#scheduler-end-date-picker" data-toggle="datetimepicker">
|
||||
<div class="input-group-text px-2">
|
||||
<i class="fas fa-calendar-alt"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-5 mx-0 pr-1">
|
||||
<div class="form-group mb-1 ml-0 pl-0">
|
||||
<div class="input-group date" id="scheduler-end-time-picker" data-target-input="nearest">
|
||||
<input type="text" id="scheduler-end-time" @disabled name="EndTime" class="form-control datetimepicker-input" data-target="#scheduler-end-time-picker" value="@Model.EndTimeToEdit" />
|
||||
<div class="input-group-append" data-target="#scheduler-end-time-picker" data-toggle="datetimepicker">
|
||||
<div class="input-group-text px-2">
|
||||
<i class="fas fa-clock"></i>
|
||||
</div>
|
||||
</div>
|
||||
<input type="datetime-local" id="scheduler-end-date" name="EndDate" class="form-control" value="@Model.EndDateToEdit" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div class="col-6 mx-auto">
|
||||
<div class="custom-control custom-checkbox custom-control-inline mx-auto">
|
||||
@Html.CheckBoxFor(m => m.IsPrivate, new { @class = "custom-control-input" })
|
||||
@Html.LabelFor(m => m.IsPrivate, new { @class = "custom-control-label" })
|
||||
<div class="custom-control custom-switch custom-control-inline mx-auto">
|
||||
<input type="checkbox" class="custom-control-input" id="is-private-switch" name="IsPrivate" />
|
||||
<label class="custom-control-label" for="is-private-switch">Privat</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6 mx-auto">
|
||||
<div class="custom-control custom-checkbox custom-control-inline mx-auto">
|
||||
@Html.CheckBoxFor(m => m.IsAllDay, new { @class = "custom-control-input", onchange = "alldayChange()" })
|
||||
@Html.LabelFor(m => m.IsAllDay, new { @class = "custom-control-label" })
|
||||
<div class="custom-control custom-switch custom-control-inline mx-auto">
|
||||
<input type="checkbox" class="custom-control-input" id="all-day-switch" onchange = "alldayChange()" name="IsAllDay" />
|
||||
<label class="custom-control-label" for="all-day-switch">Ganztägig</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -176,106 +249,45 @@
|
||||
}
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
@if(AbstractModel.HasRightToViewEmployeeAppointments && AbstractModel.HasRightToInsertEmployeeAppointments)
|
||||
{
|
||||
<div class="col-12">
|
||||
<div class="form-group my-1">
|
||||
<div class="list-group" id="selected-employees-list">
|
||||
@foreach(var selectedEmployee in Model.SelectedEmployees)
|
||||
{
|
||||
<div class="list-group-item my-auto" id="related-employee-@selectedEmployee.EmployeeOid">
|
||||
<div class="row">
|
||||
<div class="input-group">
|
||||
<div class="input-group-prepend">
|
||||
<i class="fas fa-user text-bewo-employee h-100"></i>
|
||||
</div>
|
||||
<p class="form-control border-0 bg-transparent text-truncate">
|
||||
@selectedEmployee.DetailDescription
|
||||
</p>
|
||||
<div class="input-group-append">
|
||||
<button type="button" class="btn btn-primary" onclick="removeSelectedEmployee(@selectedEmployee.EmployeeOid)">
|
||||
<span class="fas fa-times-circle"></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
if(AbstractModel.HasRightToViewEmployeeAppointments && AbstractModel.HasRightToInsertEmployeeAppointments ||
|
||||
AbstractModel.HasRightToViewCustomerSelectionInScheduler && AbstractModel.HasRightToInsertCustomerAppointments ||
|
||||
AbstractModel.HasRightToViewAllResourceAppointments && AbstractModel.HasRightToInsertRessourceAppointments)
|
||||
{
|
||||
<div class="form-row">
|
||||
<div class="col">
|
||||
@if(AbstractModel.HasRightToViewEmployeeAppointments && AbstractModel.HasRightToInsertEmployeeAppointments)
|
||||
{
|
||||
<div id="scheduler-selected-employees-container">
|
||||
@Html.Partial("SchedulerEmployeeSelectionPartial", Model)
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
}
|
||||
@if(AbstractModel.HasRightToViewCustomerSelectionInScheduler && AbstractModel.HasRightToInsertCustomerAppointments)
|
||||
{
|
||||
<div class="col-12">
|
||||
<div class="form-group my-1">
|
||||
<div class="list-group" id="selected-customers-list">
|
||||
@foreach(var selectedCustomer in Model.SelectedCustomers)
|
||||
{
|
||||
<div class="list-group-item my-auto" id="related-customer-@selectedCustomer.CustomerOid">
|
||||
<div class="row">
|
||||
<div class="input-group">
|
||||
<div class="input-group-prepend">
|
||||
<i class="fas fa-user text-bewo-customers h-100"></i>
|
||||
</div>
|
||||
<p class="form-control border-0 bg-transparent text-truncate">
|
||||
@selectedCustomer.DetailDescription
|
||||
</p>
|
||||
<div class="input-group-append">
|
||||
@{
|
||||
var url = Url.Action("SelectCustomersForAppointment", "Scheduler");
|
||||
var oid = selectedCustomer.CustomerOid;
|
||||
|
||||
var filterAppointmentsUrl = Url.Action("FetchAppointments", "Scheduler");
|
||||
|
||||
var onClickParams = $"{oid}, '-checkbox', true, '{url}', 'customers-popup', 'selected-customers-list', 'related-customer-', '{filterAppointmentsUrl}'";
|
||||
}
|
||||
|
||||
<button type="button" class="btn btn-primary" onclick="removeSelectedItem(@onClickParams)">
|
||||
<span class="fas fa-times-circle"></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div class="col mx-0">
|
||||
@if(AbstractModel.HasRightToViewCustomerSelectionInScheduler && AbstractModel.HasRightToInsertCustomerAppointments)
|
||||
{
|
||||
<div id="scheduler-selected-customer-container">
|
||||
@Html.Partial("SchedulerCustomerSelectionPartial", Model)
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
}
|
||||
@if(AbstractModel.HasRightToViewAllResourceAppointments && AbstractModel.HasRightToInsertRessourceAppointments)
|
||||
{
|
||||
<div class="col-12">
|
||||
<div class="form-group my-1">
|
||||
<div class="list-group" id="selected-resources-list">
|
||||
@foreach(var selectedResource in Model.SelectedResources)
|
||||
{
|
||||
<div class="list-group-item my-auto" id="relation-item-@selectedResource.ResourceOid">
|
||||
<div class="row">
|
||||
<div class="input-group">
|
||||
<div class="input-group-prepend">
|
||||
<i class="fas fa-cubes text-bewo-resource h-100"></i>
|
||||
</div>
|
||||
<p class="form-control border-0 bg-transparent text-truncate">
|
||||
@selectedResource.Name
|
||||
</p>
|
||||
<div class="input-group-append">
|
||||
<button type="button" class="btn btn-primary" onclick="removeSelectedResource('relation-item-@selectedResource.ResourceOid', 'resource-@selectedResource.ResourceOid-checkbox', 'resources-popup', '@Url.Action("SelectResourcesForAppointment", "Scheduler")', 'selected-resources-list', '@Url.Action("FetchAppointments")', 'relation-item-', '-checkbox', 'all-resources-checkbox')">
|
||||
<span class="fas fa-times-circle"></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<div class="col mx-0">
|
||||
@if(AbstractModel.HasRightToViewAllResourceAppointments && AbstractModel.HasRightToInsertRessourceAppointments)
|
||||
{
|
||||
<div id="scheduler-selected-resources-container">
|
||||
@Html.Partial("SchedulerResourceSelectionPartial", Model)
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
|
||||
@* Betreff *@
|
||||
<div class="form-row">
|
||||
<div class="col-md">
|
||||
<div class="form-group mb-1">
|
||||
@@ -290,6 +302,8 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@* Ort *@
|
||||
<div class="form-row">
|
||||
<div class="col-md">
|
||||
<div class="form-group mb-1">
|
||||
@@ -304,6 +318,8 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@* Notiz *@
|
||||
<div class="form-row">
|
||||
<div class="col-md">
|
||||
<div class="form-group mb-1">
|
||||
@@ -321,6 +337,7 @@
|
||||
</div>
|
||||
}
|
||||
|
||||
@* Abbrechen- und Anlegen-Button *@
|
||||
<div class="w-100 bd-highlight mt-3">
|
||||
<div class="ml-0 bd-highlight float-left">
|
||||
<button type="button" class="btn btn-primary" id="reset-button" onclick="resetInsertAppointmentForm()">Abbrechen</button>
|
||||
@@ -328,362 +345,4 @@
|
||||
<div class="ml-3 bd-highlight float-right">
|
||||
<button type="button" class="btn btn-primary" id="create-button" onclick="submitInsertAppointmentForm()">Speichern</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if(AbstractModel.HasRightToViewAllResourceAppointments && AbstractModel.HasRightToInsertRessourceAppointments && Model.ResourceCategories2Resources.Any())
|
||||
{
|
||||
<div class="modal" tabindex="-1" role="dialog" id="resources-popup">
|
||||
<div class="modal-dialog modal-dialog-scrollable" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h6 class="modal-title text-center w-100 font-weight-bold">Ressourcen</h6>
|
||||
<button type="button" class="close" data-dismiss="modal" onclick="resetTreeSearch('resource-search-input', 'resource-text', 'category-card')">
|
||||
<span>×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="container-fluid">
|
||||
<div class="input-group mb-3">
|
||||
<div class="input-group-prepend">
|
||||
<div class="input-group-text">
|
||||
<div class="custom-control custom-checkbox custom-control-inline mx-auto">
|
||||
@{
|
||||
var allResourcesCheckedVal = Model.AllResources.AreListEqual(Model.SelectedResources) ? "checked" : string.Empty;
|
||||
}
|
||||
|
||||
<input type="checkbox" class="custom-control-input" id="all-resources-checkbox" @allResourcesCheckedVal onchange="selectAllCheckboxOnChange('all-resources-checkbox', '@Url.Action("SelectResourcesForAppointment", "Scheduler")', 'resources-popup', 'selected-resources-list', 'relation-item-', false, null, '@Url.Action("FetchAppointments", "Scheduler")', null)" />
|
||||
<label class="custom-control-label" for="all-resources-checkbox">Alle</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<input class="form-control w-100" type="text" placeholder="Suchen..." oninput="treeSearchOnChange('resource-search-input', 'resource-text', 'category-card', 'resource-name-label', 'resource-list')" id="resource-search-input" />
|
||||
<div class="input-group-append">
|
||||
<button class="btn btn-outline-secondary" type="button" onclick="resetTreeSearch('resource-search-input', 'resource-text', 'category-card')">
|
||||
<span class="fas fa-times-circle"></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@foreach(var category2Resources in Model.ResourceCategories2Resources)
|
||||
{
|
||||
<div class="card w-100 mb-3 category-card" id="resource-category-@category2Resources.Key.ValueListEntryOid">
|
||||
<div class="card-header tree-card-header" data-toggle="collapse" data-target="#collapsable-resource-category-@category2Resources.Key.ValueListEntryOid">
|
||||
<div class="d-flex align-items-center">
|
||||
<h5 class="mr-auto">@category2Resources.Key.DisplayName</h5>
|
||||
<div class="btn-group" role="group">
|
||||
<span class="fas fa-chevron-down text-primary"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse" id="collapsable-resource-category-@category2Resources.Key.ValueListEntryOid">
|
||||
<div class="card-body resource-list">
|
||||
@foreach(var resource in category2Resources.Value)
|
||||
{
|
||||
var checkedValue = Model.SelectedResources.Contains(resource) ? "checked" : string.Empty;
|
||||
|
||||
<div class="custom-control custom-checkbox resource-text">
|
||||
<input type="checkbox" class="custom-control-input" id="resource-@resource.ResourceOid-checkbox" @checkedValue onchange="changeResourceSelection('resources-popup', '@Url.Action("SelectResourcesForAppointment", "Scheduler")', 'selected-resources-list', 'relation-item-', '-checkbox', '@Url.Action("FetchAppointments", "Scheduler")', 'all-resources-checkbox')" />
|
||||
<label class="custom-control-label resource-name-label" for="resource-@resource.ResourceOid-checkbox">@resource.Name</label>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-primary" data-dismiss="modal">Übernehmen</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
@if(AbstractModel.HasRightToViewEmployeeAppointments && AbstractModel.HasRightToInsertEmployeeAppointments && Model.AllEmployees.Any())
|
||||
{
|
||||
<script type="text/javascript">
|
||||
function resetEmployeeSearch() {
|
||||
try {
|
||||
$("#employee-search-input").val("");
|
||||
$(".employee-text").show();
|
||||
} catch (error) {
|
||||
showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
|
||||
function employeeListSearchOnChange() {
|
||||
try {
|
||||
var text = $("#employee-search-input").val().toLowerCase();
|
||||
|
||||
var entries = $(".employee-text");
|
||||
|
||||
if (text.length === 0) {
|
||||
entries.show();
|
||||
}
|
||||
|
||||
$.each(entries, function (index, item) {
|
||||
var employee = $(item);
|
||||
|
||||
if(employee.find(".employee-name-label").text().toLowerCase().includes(text)) {
|
||||
employee.show();
|
||||
} else {
|
||||
employee.hide();
|
||||
}
|
||||
});
|
||||
} catch(error) {
|
||||
showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
|
||||
function selectAllEmployeesOnChange() {
|
||||
try {
|
||||
var allChecked = $("#all-employees-checkbox").prop("checked");
|
||||
|
||||
$("#employees-popup .employee-input-container input[type=checkbox]").map(function() { $(this).prop("checked", allChecked); });
|
||||
|
||||
changeEmployeeListSelection();
|
||||
} catch(error) {
|
||||
showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
|
||||
function changeEmployeeListSelection() {
|
||||
try {
|
||||
var selectedEmployeeOids = $("#employees-popup .employee-input-container input:checked").map(function() { return $(this).attr("id").split("-")[1]; }).get();
|
||||
var allEmployeesCount = $("#employees-popup .employee-input-container input[type=checkbox]").map(function () { return $(this).attr("id").split("-")[1]; }).get().length;
|
||||
var selectedEmployeesCount = selectedEmployeeOids.length;
|
||||
|
||||
$("#all-employees-checkbox").prop("checked", (allEmployeesCount === selectedEmployeesCount));
|
||||
|
||||
$.get('@Url.Action("SelectEmployeesForAppointment")', { oidString: selectedEmployeeOids.toString()}).done(function(jsonResult) {
|
||||
updateSelectedEmployees(jsonResult);
|
||||
$("#one-day-scheduler-partial-container").load('@Url.Action("FetchAppointments", "Scheduler")');
|
||||
});
|
||||
} catch(error) {
|
||||
showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
|
||||
function updateSelectedEmployees(jsonResult) {
|
||||
try {
|
||||
if(false === checkJson(jsonResult)) {
|
||||
logWarning("updateSelectedEmployees: Der zurückgegebene Wert ist kein gültiges JSON!");
|
||||
hideSpinner();
|
||||
return;
|
||||
}
|
||||
|
||||
var listItems = parseJason(jsonResult);
|
||||
|
||||
var list = $("#selected-employees-list");
|
||||
|
||||
list.empty();
|
||||
|
||||
$.each(listItems, function(index, item) {
|
||||
var oid = item.EmployeeOid;
|
||||
|
||||
var id = "#related-employee-" + oid;
|
||||
|
||||
var html =
|
||||
"<div class=\"list-group-item my-auto\" id=\"" + id + "\">" +
|
||||
"<div class=\"row\">" +
|
||||
"<div class=\"input-group\">" +
|
||||
"<div class=\"input-group-prepend\">" +
|
||||
"<i class='fas fa-user text-bewo-employee h-100'></i>" +
|
||||
"</div>" +
|
||||
"<p class=\"form-control border-0 bg-transparent text-truncate\">" +
|
||||
item.LastName + ", " + item.FirstName +
|
||||
"</p>" +
|
||||
"<div class=\"input-group-append\">" +
|
||||
'<button class="btn btn-primary ficken" type="button" onclick="removeSelectedEmployee(' + oid + ')">' +
|
||||
"<span class='fas fa-times-circle'></span>" +
|
||||
"</button>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</div>";
|
||||
|
||||
list.append(html);
|
||||
});
|
||||
} catch (error) {
|
||||
showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
|
||||
function removeSelectedEmployee(employeeOid) {
|
||||
try {
|
||||
var checkbox = $("#employee-" + employeeOid + "-checkbox");
|
||||
|
||||
if(checkbox.length) {
|
||||
checkbox.prop("checked", false);
|
||||
}
|
||||
|
||||
changeEmployeeListSelection();
|
||||
} catch (error) {
|
||||
showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
|
||||
function selectTeamForAppointment(teamOid) {
|
||||
try {
|
||||
$.get('@Url.Action("SelectTeamForAppointment")', {teamOidString: teamOid}).done(function (jsonResult) {
|
||||
if(false === checkJson(jsonResult)) {
|
||||
logWarning("selectTeamForAppointment: Der zurückgegebene Wert ist kein gültiges JSON!");
|
||||
hideSpinner();
|
||||
return;
|
||||
}
|
||||
|
||||
var oids = parseJason(jsonResult);
|
||||
|
||||
$("#employees-popup .employee-input-container input[type=checkbox]").each(function () {
|
||||
var id = $(this).attr("id").split("-")[1];
|
||||
|
||||
if ($.isNumeric(id) === false) {
|
||||
return;
|
||||
}
|
||||
|
||||
if(oids.includes(parseFloat(id))) {
|
||||
$(this).prop("checked", true);
|
||||
}
|
||||
});
|
||||
|
||||
changeEmployeeListSelection();
|
||||
});
|
||||
} catch(error) {
|
||||
showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<div class="modal" tabindex="-1" role="dialog" id="employees-popup">
|
||||
<div class="modal-dialog modal-dialog-scrollable" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h6 class="modal-title text-center w-100 font-weight-bold">Mitarbeiter</h6>
|
||||
<button type="button" class="close" data-dismiss="modal" onclick="resetEmployeeSearch()">
|
||||
<span>×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="container-fluid">
|
||||
<div class="input-group mb-3">
|
||||
<div class="input-group-prepend">
|
||||
<div class="input-group-text">
|
||||
<div class="custom-control custom-checkbox custom-control-inline mx-auto">
|
||||
@{
|
||||
var allEmployeesCheckedVal = Model.AllEmployees.AreListEqual(Model.SelectedEmployees) ? "checked" : string.Empty;
|
||||
}
|
||||
|
||||
<input type="checkbox" class="custom-control-input" id="all-employees-checkbox" @allEmployeesCheckedVal onchange="selectAllEmployeesOnChange()" />
|
||||
<label class="custom-control-label" for="all-employees-checkbox">Alle</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<input class="form-control w-100" type="text" placeholder="Suchen..." oninput="employeeListSearchOnChange()" id="employee-search-input" />
|
||||
<div class="input-group-append">
|
||||
<button class="btn btn-outline-secondary" type="button" onclick="resetEmployeeSearch()">
|
||||
<span class="fas fa-times-circle"></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if(AbstractModel.HasRightToViewTeams)
|
||||
{
|
||||
<div class="card w-100 mb-3">
|
||||
<div class="card-header" data-toggle="collapse" data-target="#collapsable-teams-selection">
|
||||
<div class="d-flex align-items-center">
|
||||
<h5 class="mr-auto">Meine Teams</h5>
|
||||
<div class="btn-group" role="group">
|
||||
<span class="fas fa-chevron-down text-primary"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse" id="collapsable-teams-selection">
|
||||
<div class="card-body">
|
||||
@foreach(var team in Model.MyTeams)
|
||||
{
|
||||
<button type="button" class="btn btn-bewo-teams w-100 my-2" onclick="selectTeamForAppointment(@team.TeamOid)">@team.Name</button>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
}
|
||||
|
||||
<div class="employee-input-container">
|
||||
@foreach(var employee in Model.AllEmployees)
|
||||
{
|
||||
var checkedValue = Model.SelectedEmployees.Contains(employee) ? "checked" : string.Empty;
|
||||
|
||||
<div class="custom-control custom-checkbox employee-text">
|
||||
<input type="checkbox" class="custom-control-input" id="employee-@employee.EmployeeOid-checkbox" @checkedValue onchange="changeEmployeeListSelection()" />
|
||||
<label class="custom-control-label employee-name-label" for="employee-@employee.EmployeeOid-checkbox">@employee.DetailDescription</label>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-primary" data-dismiss="modal">Übernehmen</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
@if(AbstractModel.HasRightToViewCustomerSelectionInScheduler && AbstractModel.HasRightToInsertCustomerAppointments && Model.AllCustomers.Any())
|
||||
{
|
||||
<div class="modal" tabindex="-1" role="dialog" id="customers-popup">
|
||||
<div class="modal-dialog modal-dialog-scrollable" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h6 class="modal-title text-center w-100 font-weight-bold">Klienten</h6>
|
||||
<button type="button" class="close" data-dismiss="modal" onclick="resetSearch('customer-search-input', 'customer-text')">
|
||||
<span>×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="container-fluid">
|
||||
<div class="input-group mb-3">
|
||||
<div class="input-group-prepend">
|
||||
<div class="input-group-text">
|
||||
@{
|
||||
var allCustomersCheckedVal = Model.AllCustomers.AreListEqual(Model.SelectedCustomers) ? "checked" : string.Empty;
|
||||
}
|
||||
|
||||
<div class="custom-control custom-checkbox custom-control-inline mx-auto">
|
||||
<input type="checkbox" class="custom-control-input" id="all-customers-checkbox" @allCustomersCheckedVal onchange="selectAllCheckboxOnChange('all-customers-checkbox', '@Url.Action("SelectCustomersForAppointment", "Scheduler")', 'customers-popup', 'selected-customers-list', 'related-customer-', true, '-checkbox', '@Url.Action("FetchAppointments", "Scheduler")', '')" />
|
||||
<label class="custom-control-label" for="all-customers-checkbox">Alle</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<input class="form-control w-100" type="text" placeholder="Suchen..." oninput="listSearchOnChange('customer-search-input', 'customer-text', 'customer-name-label')" id="customer-search-input" />
|
||||
<div class="input-group-append">
|
||||
<button class="btn btn-outline-secondary" type="button" onclick="resetSearch('customer-search-input', 'customer-text')">
|
||||
<span class="fas fa-times-circle"></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="popup-list-item-container">
|
||||
@foreach(var customer in Model.AllCustomers)
|
||||
{
|
||||
var checkedValue = Model.SelectedCustomers.Contains(customer) ? "checked" : string.Empty;
|
||||
|
||||
<div class="custom-control custom-checkbox customer-text">
|
||||
<input type="checkbox" class="custom-control-input" id="customer-@customer.CustomerOid-checkbox" @checkedValue onchange="changeItemListSelection('@Url.Action("SelectCustomersForAppointment", "Scheduler")', 'customers-popup', 'selected-customers-list', 'related-customer-', true, '-checkbox', '@Url.Action("FetchAppointments", "Scheduler")', '', getTeamMemberOids(), 'all-customers-checkbox')" />
|
||||
<label class="custom-control-label customer-name-label" for="customer-@customer.CustomerOid-checkbox">@customer.DetailDescription</label>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-primary" data-dismiss="modal">Übernehmen</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
@@ -14,24 +14,24 @@
|
||||
}
|
||||
}
|
||||
|
||||
<script>
|
||||
<script type="text/javascript">
|
||||
function resetCustomerSearchForFiltering() {
|
||||
try {
|
||||
$("#customer-search-input2").val("");
|
||||
$(".customer-text2").show();
|
||||
} catch (error) {
|
||||
showErrorPopup(error);
|
||||
window.showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
|
||||
function updateCustomerForFilteringPopup() {
|
||||
try {
|
||||
var customersPopup2 = $("#customers-popup2");
|
||||
const customersPopup2 = $("#customers-popup2");
|
||||
if (customersPopup2.length) {
|
||||
$("#customers-for-filtering-container").load('@Url.Action("FetchCustomerFilteringModalBody")');
|
||||
}
|
||||
} catch (error) {
|
||||
showErrorPopup(error);
|
||||
window.showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,14 +39,14 @@
|
||||
try {
|
||||
var text = $("#customer-search-input2").val().toLowerCase();
|
||||
|
||||
var entries = $(".customer-text2");
|
||||
const entries = $(".customer-text2");
|
||||
|
||||
if(text.length === 0) {
|
||||
entries.show();
|
||||
}
|
||||
|
||||
$.each(entries, function(index, item) {
|
||||
var customer = $(item);
|
||||
const customer = $(item);
|
||||
|
||||
if (customer.find(".customer-name-label2").text().toLowerCase().includes(text)) {
|
||||
customer.show();
|
||||
@@ -55,7 +55,7 @@
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
showErrorPopup(error);
|
||||
window.showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
var allChecked = true;
|
||||
|
||||
$("#customers-popup2 input[type=checkbox]").each(function () {
|
||||
var id = $(this).attr("id").split("-")[1];
|
||||
const id = $(this).attr("id").split("-")[1];
|
||||
|
||||
if($.isNumeric(id) === false) {
|
||||
return;
|
||||
@@ -90,19 +90,17 @@
|
||||
$("#customer-count2").text(customerCount);
|
||||
});
|
||||
} catch (error) {
|
||||
showErrorPopup(error);
|
||||
window.showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
|
||||
function selectAllCustomersForFiltering() {
|
||||
try {
|
||||
var isChecked = $("#all-customers-checkbox2").prop("checked");
|
||||
|
||||
$(".customer-checkbox2").prop("checked", isChecked);
|
||||
$(".customer-checkbox2").prop("checked", $("#all-customers-checkbox2").prop("checked"));
|
||||
|
||||
selectCustomersForFiltering();
|
||||
} catch (error) {
|
||||
showErrorPopup(error);
|
||||
window.showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
@model BeWoPlanerMobil.Models.SchedulerModel
|
||||
|
||||
@foreach(var customer in Model.AllCustomers)
|
||||
{
|
||||
var checkedValue = Model.SelectedCustomers.Contains(customer) ? "checked" : string.Empty;
|
||||
|
||||
<div class="custom-control custom-checkbox customer-text">
|
||||
<input type="checkbox" class="custom-control-input" id="customer-@customer.CustomerOid-checkbox" @checkedValue onchange="window.changeCustomerListSelection()" />
|
||||
<label class="custom-control-label customer-name-label" for="customer-@customer.CustomerOid-checkbox">@customer.DetailDescription</label>
|
||||
</div>
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
@using BS.Shared.Extensions
|
||||
@model BeWoPlanerMobil.Models.SchedulerModel
|
||||
|
||||
<script type="text/javascript">
|
||||
function selectAllCustomersOnChange() {
|
||||
const isChecked = $("#all-customers-checkbox").prop("checked");
|
||||
|
||||
$("#customer-input-container").load(
|
||||
"@Url.Action("SelectAllCustomers")",
|
||||
{
|
||||
isChecked: isChecked
|
||||
},
|
||||
() => {
|
||||
$("#selected-customers-list").load("@Url.Action("LoadUpdatedCustomers")", () => {
|
||||
$("#one-day-scheduler-partial-container").load('@Url.Action("FetchAppointments", "Scheduler")');
|
||||
});
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
function customerListSearchOnChange() {
|
||||
var text = $("#customer-search-input").val().toLowerCase();
|
||||
|
||||
const entries = $(".customer-text");
|
||||
|
||||
if(text.length === 0) {
|
||||
entries.show();
|
||||
}
|
||||
|
||||
$.each(entries, function (index, item) {
|
||||
const customer = $(item);
|
||||
|
||||
if(customer.find(".customer-name-label").text().toLowerCase().includes(text)) {
|
||||
customer.show();
|
||||
} else {
|
||||
customer.hide();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function resetCustomerSeach() {
|
||||
$("#customer-search-input").val("");
|
||||
$(".customer-text").show();
|
||||
}
|
||||
</script>
|
||||
|
||||
<div class="modal" tabindex="-1" role="dialog" id="customers-popup">
|
||||
<div class="modal-dialog modal-dialog-scrollable" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h6 class="modal-title text-center w-100 font-weight-bold">
|
||||
<span class="fas fa-user text-bewo-customers"></span>
|
||||
Klienten
|
||||
</h6>
|
||||
<button type="button" class="close" data-dismiss="modal" onclick="resetCustomerSeach()">
|
||||
<span>×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="container-fluid">
|
||||
<div class="input-group mb-3">
|
||||
<div class="input-group-prepend">
|
||||
<div class="input-group-text">
|
||||
@{
|
||||
var allCustomersCheckedVal = Model.AllCustomers.AreListEqual(Model.SelectedCustomers) ? "checked" : string.Empty;
|
||||
}
|
||||
|
||||
<div class="custom-control custom-checkbox custom-control-inline mx-auto">
|
||||
<input type="checkbox" class="custom-control-input" id="all-customers-checkbox" @allCustomersCheckedVal onchange="selectAllCustomersOnChange()" />
|
||||
<label class="custom-control-label" for="all-customers-checkbox">Alle</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<input class="form-control w-100" type="text" placeholder="Suchen..." oninput="customerListSearchOnChange()" id="customer-search-input" />
|
||||
<div class="input-group-append">
|
||||
<button class="btn btn-outline-secondary" type="button" onclick="resetCustomerSeach()">
|
||||
<span class="fas fa-times-circle"></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="customer-input-container">
|
||||
@Html.Partial("CustomerSelectionPopupListPartial", Model)
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-primary" data-dismiss="modal">Übernehmen</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -14,7 +14,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
<script>
|
||||
<script type="text/javascript">
|
||||
function resetEmployeeSearchForFiltering() {
|
||||
try {
|
||||
$("#employee-search-input2").val("");
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
@model BeWoPlanerMobil.Models.SchedulerModel
|
||||
|
||||
@foreach(var employee in Model.AllEmployees)
|
||||
{
|
||||
var checkedValue = Model.SelectedEmployees.Contains(employee) ? "checked" : string.Empty;
|
||||
|
||||
<div class="custom-control custom-checkbox employee-text">
|
||||
<input type="checkbox" class="custom-control-input" id="employee-@employee.EmployeeOid-checkbox" @checkedValue onchange="window.changeEmployeeListSelection()" />
|
||||
<label class="custom-control-label employee-name-label" for="employee-@employee.EmployeeOid-checkbox">@employee.DetailDescription</label>
|
||||
</div>
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
@using BeWoPlanerMobil.Models
|
||||
@using BS.Shared.Extensions
|
||||
@model BeWoPlanerMobil.Models.SchedulerModel
|
||||
|
||||
<script type="text/javascript">
|
||||
function selectAllEmployeesOnChange() {
|
||||
const isChecked = $("#all-employees-checkbox").prop("checked");
|
||||
|
||||
$("#employee-input-container").load(
|
||||
"@Url.Action("SelectAllEmployees")",
|
||||
{
|
||||
isChecked: isChecked
|
||||
},
|
||||
() => {
|
||||
$("#selected-employees-list").load(
|
||||
"@Url.Action("LoadUpdatedEmployees")",
|
||||
() => {
|
||||
$("#one-day-scheduler-partial-container").load('@Url.Action("FetchAppointments", "Scheduler")');
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
function employeeListSearchOnChange() {
|
||||
var text = $("#employee-search-input").val().toLowerCase();
|
||||
|
||||
const entries = $(".employee-text");
|
||||
|
||||
if(text.length === 0) {
|
||||
entries.show();
|
||||
}
|
||||
|
||||
$.each(entries, function (index, item) {
|
||||
const employee = $(item);
|
||||
|
||||
if(employee.find(".employee-name-label").text().toLowerCase().includes(text)) {
|
||||
employee.show();
|
||||
} else {
|
||||
employee.hide();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function resetEmployeeSearch() {
|
||||
$("#employee-search-input").val("");
|
||||
$(".employee-text").show();
|
||||
}
|
||||
</script>
|
||||
|
||||
<div class="modal" tabindex="-1" role="dialog" id="employees-popup">
|
||||
<div class="modal-dialog modal-dialog-scrollable" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h6 class="modal-title text-center w-100 font-weight-bold">
|
||||
<span class="fas fa-user text-bewo-employee"></span>
|
||||
Mitarbeiter
|
||||
</h6>
|
||||
<button type="button" class="close" data-dismiss="modal" onclick="resetEmployeeSearch()">
|
||||
<span>×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="container-fluid">
|
||||
<div class="input-group mb-3">
|
||||
<div class="input-group-prepend">
|
||||
<div class="input-group-text">
|
||||
<div class="custom-control custom-checkbox custom-control-inline mx-auto">
|
||||
@{
|
||||
var allEmployeesCheckedVal = Model.AllEmployees.AreListEqual(Model.SelectedEmployees) ? "checked" : string.Empty;
|
||||
}
|
||||
|
||||
<input type="checkbox" class="custom-control-input" id="all-employees-checkbox" @allEmployeesCheckedVal onchange="selectAllEmployeesOnChange()" />
|
||||
<label class="custom-control-label" for="all-employees-checkbox">Alle</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<input class="form-control w-100" type="text" placeholder="Suchen..." oninput="employeeListSearchOnChange()" id="employee-search-input" />
|
||||
<div class="input-group-append">
|
||||
<button class="btn btn-outline-secondary" type="button" onclick="resetEmployeeSearch()">
|
||||
<span class="fas fa-times-circle"></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if(AbstractModel.HasRightToViewTeams)
|
||||
{
|
||||
<div class="card w-100 mb-3">
|
||||
<div class="card-header" data-toggle="collapse" data-target="#collapsable-teams-selection">
|
||||
<div class="d-flex align-items-center">
|
||||
<h5 class="mr-auto">Meine Teams</h5>
|
||||
<div class="btn-group" role="group">
|
||||
<span class="fas fa-chevron-down text-primary"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse" id="collapsable-teams-selection">
|
||||
<div class="card-body">
|
||||
@foreach(var team in Model.MyTeams)
|
||||
{
|
||||
<button type="button" class="btn btn-bewo-teams w-100 my-2" onclick="selectTeamForAppointment(@team.TeamOid)">@team.Name</button>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
}
|
||||
|
||||
<div id="employee-input-container">
|
||||
@Html.Partial("EmployeeSelectionPopupListPartial")
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-primary" data-dismiss="modal">Übernehmen</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -12,14 +12,14 @@
|
||||
}
|
||||
}
|
||||
|
||||
<script>
|
||||
<script type="text/javascript">
|
||||
function deleteAppointment(appointmentOid, appointmentIdentifier, isException, subject) {
|
||||
try {
|
||||
if(isException === false && appointmentOid === 0) {
|
||||
$("#appointment-deletion-message").html("Wollen Sie alle Ereignisse des aktuellen Termins \"" + subject + "\", oder nur diesen einen löschen?");
|
||||
$("#appointment-deletion-message").html(`Wollen Sie alle Ereignisse des aktuellen Termins "${subject}", oder nur diesen einen löschen?`);
|
||||
$("#delete-popup-btn").on("click",
|
||||
function () {
|
||||
var deleteSeries = $("#deleteSeriesRadio").prop("checked");
|
||||
const deleteSeries = $("#deleteSeriesRadio").prop("checked");
|
||||
|
||||
submitDeletionForm(appointmentIdentifier, deleteSeries);
|
||||
});
|
||||
@@ -28,7 +28,7 @@
|
||||
submitDeletionForm(appointmentIdentifier, false);
|
||||
}
|
||||
} catch(error) {
|
||||
showErrorPopup(error);
|
||||
window.showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
$("#delete-occurring-appoinment-popup").modal("hide");
|
||||
});
|
||||
} catch(error) {
|
||||
showErrorPopup(error);
|
||||
window.showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,9 +47,9 @@
|
||||
try {
|
||||
showSpinner();
|
||||
|
||||
$("#transformAppToServiceRecForm-" + appointmentIdentifier).submit();
|
||||
$(`#transformAppToServiceRecForm-${appointmentIdentifier}`).submit();
|
||||
} catch(error) {
|
||||
showErrorPopup(error);
|
||||
window.showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -95,10 +95,11 @@
|
||||
<i class="fas fa-chevron-down h-100 text-primary" id="chevron-appointment-@appointment.Identifier"></i>
|
||||
</div>
|
||||
<div class="d-inline-flex text-primary h-100">
|
||||
<button type="button" class="btn btn-link text-wrap text-break">
|
||||
<button type="button" class="btn btn-link text-wrap w-100 text-break text-left">
|
||||
@if(appointment.IsTask)
|
||||
{
|
||||
<span class="text-bewo-task-red">@appointment.DateTimeInfo</span>
|
||||
<p class="small py-0 my-0 text-muted">@appointment.CustomerListInfo</p>
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -126,8 +127,8 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse" id="collapse-appointment-@appointment.Identifier">
|
||||
<div class="card-body">
|
||||
<div class="container-fluid">
|
||||
<div class="card-body py-2 px-2">
|
||||
<div class="container-fluid p-0">
|
||||
@if(appointment.HasEmployeesCustomersOrResources && !appointment.IsTask)
|
||||
{
|
||||
<div class="row">
|
||||
@@ -158,7 +159,7 @@
|
||||
|
||||
@if(Model.HasRightToEditAppointment(appointment.Identifier) && !appointment.IsTask && appointment.CanBeEdited)
|
||||
{
|
||||
<div class="row mb-3">
|
||||
<div class="row mb-3 p-0">
|
||||
<div class="col-auto">
|
||||
@if(appointment.Oid.HasValue)
|
||||
{
|
||||
@@ -186,7 +187,7 @@
|
||||
}
|
||||
</div>
|
||||
}
|
||||
<p>@appointment.Description</p>
|
||||
<p class="m-0 p-0">@appointment.Description</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -198,7 +199,7 @@
|
||||
|
||||
@foreach(var appointment in Model.AppointmentListItems.Where(a => !a.AllDay))
|
||||
{
|
||||
<div class="card w-100 mb-3">
|
||||
<div class="card w-100 mb-3 p-0">
|
||||
<div class="card-header border-left appointment-header" onclick="cardHeaderClick('#chevron-appointment-@appointment.Identifier', '#collapse-appointment-@appointment.Identifier')">
|
||||
<div class="d-inline-flex align-middle">
|
||||
<i class="fas fa-chevron-down h-100 text-primary" id="chevron-appointment-@appointment.Identifier"></i>
|
||||
@@ -235,8 +236,8 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse" id="collapse-appointment-@appointment.Identifier">
|
||||
<div class="card-body">
|
||||
<div class="container-fluid">
|
||||
<div class="card-body p-2">
|
||||
<div class="container-fluid p-0">
|
||||
@if(appointment.HasEmployeesCustomersOrResources && !appointment.IsTask)
|
||||
{
|
||||
<div class="row">
|
||||
@@ -267,8 +268,7 @@
|
||||
|
||||
@if(Model.HasRightToEditAppointment(appointment.Identifier) && !appointment.IsTask && appointment.CanBeEdited)
|
||||
{
|
||||
<div class="row mb-3">
|
||||
|
||||
<div class="row mb-3 p-0">
|
||||
@if(appointment.Oid.HasValue)
|
||||
{
|
||||
using(Html.BeginForm("SelectAppointmentToEdit", "Scheduler", FormMethod.Post))
|
||||
@@ -302,7 +302,7 @@
|
||||
<input type="hidden" value="@appointment.Identifier" name="appointment-id-input" />
|
||||
}
|
||||
}
|
||||
<p>@appointment.Description</p>
|
||||
<p class="m-0 p-0">@appointment.Description</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
@model BeWoPlanerMobil.Models.SchedulerModel
|
||||
|
||||
@foreach(var category2Resources in Model.ResourceCategories2Resources)
|
||||
{
|
||||
<div class="card w-100 mb-3 category-card" id="resource-category-@category2Resources.Key.ValueListEntryOid">
|
||||
<div class="card-header tree-card-header" data-toggle="collapse" data-target="#collapsable-resource-category-@category2Resources.Key.ValueListEntryOid">
|
||||
<div class="d-flex align-items-center">
|
||||
<h5 class="mr-auto">@category2Resources.Key.DisplayName</h5>
|
||||
<div class="btn-group" role="group">
|
||||
<span class="fas fa-chevron-down text-primary"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse" id="collapsable-resource-category-@category2Resources.Key.ValueListEntryOid">
|
||||
<div class="card-body resource-list">
|
||||
@foreach(var resource in category2Resources.Value)
|
||||
{
|
||||
var checkedValue = Model.SelectedResources.Contains(resource) ? "checked" : string.Empty;
|
||||
|
||||
<div class="custom-control custom-checkbox resource-text">
|
||||
<input type="checkbox" class="custom-control-input" id="resource-@resource.ResourceOid-checkbox" @checkedValue onchange="window.changeResourceListSelection()" />
|
||||
<label class="custom-control-label resource-name-label" for="resource-@resource.ResourceOid-checkbox">@resource.Name</label>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
@using BS.Shared.Extensions
|
||||
@model BeWoPlanerMobil.Models.SchedulerModel
|
||||
|
||||
<script type="text/javascript">
|
||||
function selectAllResourcesOnChange() {
|
||||
const isChecked = $("#all-resources-checkbox").prop("checked");
|
||||
|
||||
$("#resource-input-container").load(
|
||||
"@Url.Action("SelectAllResources")",
|
||||
{
|
||||
isChecked: isChecked
|
||||
},
|
||||
() => {
|
||||
$("#selected-resources-list").load(
|
||||
"@Url.Action("LoadUpdatedResources")",
|
||||
() => {
|
||||
$("#one-day-scheduler-partial-container").load('@Url.Action("FetchAppointments", "Scheduler")');
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
</script>
|
||||
|
||||
<div class="modal" tabindex="-1" role="dialog" id="resources-popup">
|
||||
<div class="modal-dialog modal-dialog-scrollable" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h6 class="modal-title text-center w-100 font-weight-bold">
|
||||
<span class="fas fa-cubes text-bewo-resource"></span>
|
||||
Ressourcen
|
||||
</h6>
|
||||
<button type="button" class="close" data-dismiss="modal" onclick="resetTreeSearch('resource-search-input', 'resource-text', 'category-card')">
|
||||
<span>×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="container-fluid">
|
||||
<div class="input-group mb-3">
|
||||
<div class="input-group-prepend">
|
||||
<div class="input-group-text">
|
||||
<div class="custom-control custom-checkbox custom-control-inline mx-auto">
|
||||
@{
|
||||
var allResourcesCheckedVal = Model.AllResources.AreListEqual(Model.SelectedResources) ? "checked" : string.Empty;
|
||||
}
|
||||
|
||||
<input type="checkbox" class="custom-control-input" id="all-resources-checkbox" @allResourcesCheckedVal onchange="selectAllResourcesOnChange()" />
|
||||
<label class="custom-control-label" for="all-resources-checkbox">Alle</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<input class="form-control w-100" type="text" placeholder="Suchen..." oninput="treeSearchOnChange('resource-search-input', 'resource-text', 'category-card', 'resource-name-label', 'resource-list')" id="resource-search-input" />
|
||||
<div class="input-group-append">
|
||||
<button class="btn btn-outline-secondary" type="button" onclick="resetTreeSearch('resource-search-input', 'resource-text', 'category-card')">
|
||||
<span class="fas fa-times-circle"></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="resource-input-container">
|
||||
@Html.Partial("ResourceSelectionPopupListPartial")
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-primary" data-dismiss="modal">Übernehmen</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -23,39 +23,11 @@
|
||||
format: "L"
|
||||
});
|
||||
|
||||
$("#scheduler-start-date-picker").datetimepicker({
|
||||
locale: "de",
|
||||
format: "L"
|
||||
});
|
||||
|
||||
$("#scheduler-end-date-picker").datetimepicker({
|
||||
locale: "de",
|
||||
format: "L"
|
||||
});
|
||||
|
||||
$("#scheduler-start-time-picker").datetimepicker({
|
||||
locale: "de",
|
||||
format: "LT"
|
||||
});
|
||||
|
||||
$("#scheduler-end-time-picker").datetimepicker({
|
||||
locale: "de",
|
||||
format: "LT"
|
||||
});
|
||||
|
||||
$("#scheduler-date-picker").on("change.datetimepicker", () => {
|
||||
submitSchedulerDateForm();
|
||||
});
|
||||
});
|
||||
|
||||
function getCheckForOverlappingAppointmentsUrl() {
|
||||
return "@Url.Action("CheckForOverlappingAppointments", "Scheduler")";
|
||||
}
|
||||
|
||||
function getCheckResourcesAvailabilityUrl() {
|
||||
return "@Url.Action("CheckResourcesAvailability", "Scheduler")";
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
@if(Model != null)
|
||||
{
|
||||
@@ -74,11 +46,11 @@
|
||||
return;
|
||||
}
|
||||
|
||||
var value = $("#" + checkboxId).prop("checked");
|
||||
var selectionPrefix = checkboxId.split("-")[1];
|
||||
var value = $(`#${checkboxId}`).prop("checked");
|
||||
const selectionPrefix = checkboxId.split("-")[1];
|
||||
|
||||
$("#" + popupId + " input[type=checkbox]").each(function () {
|
||||
var id = $(this).attr("id").split("-")[1];
|
||||
$(`#${popupId} input[type=checkbox]`).each(function () {
|
||||
const id = $(this).attr("id").split("-")[1];
|
||||
|
||||
if($.isNumeric(id) === false) {
|
||||
return;
|
||||
@@ -93,7 +65,7 @@
|
||||
changeResourceSelection(popupId, url, listId, itemIdPrefix, checkBoxIdSuffix, filterAppointmentsUrl, checkboxId);
|
||||
}
|
||||
} catch(error) {
|
||||
showErrorPopup(error);
|
||||
window.showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -162,13 +134,13 @@
|
||||
|
||||
function toggleBetweenTasksAndAppointments() {
|
||||
try {
|
||||
var isChecked = $("#tasks-checkbox").prop("checked");
|
||||
const isChecked = $("#tasks-checkbox").is(":checked");
|
||||
$.get("@Url.Action("SetShouldLoadTasks")", {isChecked: isChecked}).done(function() {
|
||||
$("#appointment-list-container").load("@Url.Action("FetchAppointments")");
|
||||
});
|
||||
|
||||
} catch(error) {
|
||||
showErrorPopup(error);
|
||||
window.showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -221,7 +193,7 @@
|
||||
|
||||
<div class="row d-flex justify-content-center">
|
||||
<div class="col-auto justify-content-center mx-1 px-0">
|
||||
<div class="custom-control custom-checkbox d-inline mx-auto">
|
||||
<div class="custom-control custom-switch d-inline mx-auto">
|
||||
<input type="checkbox" @showTasksChecked class="custom-control-input" id="tasks-checkbox" onchange="toggleBetweenTasksAndAppointments()" />
|
||||
<label for="tasks-checkbox" class="custom-control-label">Aufgaben anzeigen</label>
|
||||
</div>
|
||||
@@ -314,7 +286,7 @@
|
||||
|
||||
|
||||
<!-- Filterauswahl: -->
|
||||
@if(AbstractModel.HasRightToViewAllResourceAppointments && Model.ResourceCategories2Resources.Any())
|
||||
@if(AbstractModel.HasRightToViewAllResourceAppointments)
|
||||
{
|
||||
<div class="modal" tabindex="-1" role="dialog" id="resources-popup2">
|
||||
<div class="modal-dialog modal-dialog-scrollable" role="document">
|
||||
@@ -384,13 +356,28 @@
|
||||
</div>
|
||||
}
|
||||
|
||||
@if(AbstractModel.HasRightToViewEmployeeAppointments && Model.AllEmployees.Any())
|
||||
@if(AbstractModel.HasRightToViewEmployeeAppointments)
|
||||
{
|
||||
Html.RenderAction("FetchSelectedEmployeesForPopup", Model);
|
||||
}
|
||||
|
||||
@if(AbstractModel.HasRightToViewCustomerSelectionInScheduler && Model.AllCustomers.Any())
|
||||
@if(AbstractModel.HasRightToViewCustomerSelectionInScheduler)
|
||||
{
|
||||
Html.RenderAction("FetchCustomersForFiltering", Model);
|
||||
}
|
||||
<!-- /Filterauswahl -->
|
||||
<!-- /Filterauswahl -->
|
||||
|
||||
@if(AbstractModel.HasRightToViewEmployeeAppointments)
|
||||
{
|
||||
Html.RenderPartial("EmployeeSelectionPopupPartial", Model);
|
||||
}
|
||||
|
||||
@if(AbstractModel.HasRightToViewCustomerSelectionInScheduler && AbstractModel.HasRightToInsertCustomerAppointments)
|
||||
{
|
||||
Html.RenderPartial("CustomerSelectionPopupPartial", Model);
|
||||
}
|
||||
|
||||
@if(AbstractModel.HasRightToViewAllResourceAppointments && AbstractModel.HasRightToInsertRessourceAppointments)
|
||||
{
|
||||
Html.RenderPartial("ResourceSelectionPopupPartial", Model);
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
@model BeWoPlanerMobil.Models.SchedulerModel
|
||||
|
||||
<script type="text/javascript">
|
||||
function removeSelectedCustomer(customerOid) {
|
||||
const checkbox = $(`#customer-${customerOid}-checkbox`);
|
||||
|
||||
if(checkbox.length) {
|
||||
checkbox.prop("checked", false);
|
||||
}
|
||||
|
||||
changeCustomerListSelection();
|
||||
}
|
||||
|
||||
function changeCustomerListSelection() {
|
||||
const selectedCustomerOids = $("#customer-input-container input:checked").map(function () {return $(this).attr("id").split("-")[1];}).get();
|
||||
const allCustomersCount = $("#customer-input-container input[type=checkbox]").map(function () {return $(this).attr("id").split("-")[1];}).get();
|
||||
const selectedCustomersCount = selectedCustomerOids.length;
|
||||
|
||||
$("#all-customers-checkbox").prop("checked", (allCustomersCount === selectedCustomersCount));
|
||||
|
||||
$("#scheduler-selected-customer-container").load(
|
||||
"@Url.Action("UpdateCustomerSelection")",
|
||||
{
|
||||
oidString: selectedCustomerOids.toString()
|
||||
},
|
||||
function() {
|
||||
$("#one-day-scheduler-partial-container").load('@Url.Action("FetchAppointments", "Scheduler")');
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
<div class="col-12 px-0">
|
||||
<div class="form-group px-0 w-100" id="selected-customers-list">
|
||||
@foreach(var selectedCustomer in Model.SelectedCustomers)
|
||||
{
|
||||
<div class="input-group mb-1">
|
||||
<div class="input-group-prepend">
|
||||
<span class="input-group-text h-100">
|
||||
<i class="fas fa-user text-bewo-customers h-100"></i>
|
||||
</span>
|
||||
</div>
|
||||
<span class="form-control text-truncate">
|
||||
@selectedCustomer.DetailDescription
|
||||
</span>
|
||||
<div class="input-group-append">
|
||||
<button type="button" class="btn btn-outline-danger" onclick="removeSelectedCustomer(@selectedCustomer.CustomerOid)">
|
||||
<span class="fas fa-times-circle"></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
@model BeWoPlanerMobil.Models.SchedulerModel
|
||||
|
||||
<script type="text/javascript">
|
||||
function selectTeamForAppointment(teamOid) {
|
||||
$.get("@Url.Action("SelectTeamForAppointment")", {teamOidString: teamOid}).done(() => {
|
||||
$("#selected-employees-list").load("@Url.Action("LoadUpdatedEmployees")", () => {
|
||||
$("#employee-input-container").load("@Url.Action("LoadUpdatedEmployeePopupList")");
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function removeSelectedEmployee(employeeOid) {
|
||||
const checkbox = $(`#employee-${employeeOid}-checkbox`);
|
||||
|
||||
if(checkbox.length) {
|
||||
checkbox.prop("checked", false);
|
||||
}
|
||||
|
||||
changeEmployeeListSelection();
|
||||
}
|
||||
|
||||
function changeEmployeeListSelection() {
|
||||
const selectedEmployeeOids = $("#employee-input-container input:checked").map(function() { return $(this).attr("id").split("-")[1]; }).get();
|
||||
const allEmployeesCount = $("#employee-input-container input[type=checkbox]").map(function () { return $(this).attr("id").split("-")[1]; }).get().length;
|
||||
const selectedEmployeesCount = selectedEmployeeOids.length;
|
||||
|
||||
$("#all-employees-checkbox").prop("checked", (allEmployeesCount === selectedEmployeesCount));
|
||||
|
||||
$("#scheduler-selected-employees-container").load(
|
||||
"@Url.Action("UpdateEmployeeSelection")",
|
||||
{
|
||||
oidString: selectedEmployeeOids.toString()
|
||||
},
|
||||
() => {
|
||||
$("#one-day-scheduler-partial-container").load('@Url.Action("FetchAppointments", "Scheduler")');
|
||||
}
|
||||
);
|
||||
}
|
||||
</script>
|
||||
|
||||
<div class="col-12 px-0">
|
||||
<div class="form-group px-0 w-100" id="selected-employees-list">
|
||||
@foreach(var selectedEmployee in Model.SelectedEmployees)
|
||||
{
|
||||
<div class="input-group mb-1">
|
||||
<div class="input-group-prepend">
|
||||
<span class="input-group-text h-100">
|
||||
<i class="fas fa-user text-bewo-employee"></i>
|
||||
</span>
|
||||
</div>
|
||||
<span class="form-control text-truncate">
|
||||
@selectedEmployee.DetailDescription
|
||||
</span>
|
||||
<div class="input-group-append">
|
||||
<button type="button" class="btn btn-outline-danger" onclick="removeSelectedEmployee(@selectedEmployee.EmployeeOid)">
|
||||
<span class="fas fa-times-circle"></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
@model BeWoPlanerMobil.Models.SchedulerModel
|
||||
|
||||
<script type="text/javascript">
|
||||
function removeSelectedResource(resourceOid) {
|
||||
const checkbox = $(`#resource-${resourceOid}-checkbox`);
|
||||
|
||||
if(checkbox.length) {
|
||||
checkbox.prop("checked", false);
|
||||
}
|
||||
|
||||
changeResourceListSelection();
|
||||
}
|
||||
|
||||
function changeResourceListSelection() {
|
||||
const selectedResourceOids = $("#resource-input-container input:checked").map(function() {return $(this).attr("id").split("-")[1];}).get();
|
||||
const allResourcesCount = $("#resource-input-container input[type=checkbox]").map(function () {return $(this).attr("id").split("-")[1];}).get().length;
|
||||
const selectedResourcesCount = selectedResourceOids.length;
|
||||
|
||||
$("#all-resources-checkbox").prop("checked", (allResourcesCount === selectedResourcesCount));
|
||||
|
||||
$("#scheduler-selected-resources-container").load(
|
||||
"@Url.Action("UpdateResourceSelection")",
|
||||
{
|
||||
oidString: selectedResourceOids.toString()
|
||||
},
|
||||
() => {
|
||||
$("#one-day-scheduler-partial-container").load('@Url.Action("FetchAppointments", "Scheduler")');
|
||||
}
|
||||
);
|
||||
}
|
||||
</script>
|
||||
|
||||
<div class="col-12 px-0">
|
||||
<div class="form-group px-0 w-100" id="selected-resources-list">
|
||||
@foreach(var selectedResource in Model.SelectedResources)
|
||||
{
|
||||
<div class="input-group mb-1">
|
||||
<div class="input-group-prepend">
|
||||
<span class="input-group-text h-100">
|
||||
<i class="fas fa-cubes text-bewo-resource h-100"></i>
|
||||
</span>
|
||||
</div>
|
||||
<span class="form-control text-truncate">
|
||||
@selectedResource.DetailDescription
|
||||
</span>
|
||||
<div class="input-group-append">
|
||||
<button type="button" class="btn btn-outline-danger" onclick="removeSelectedResource(@selectedResource.ResourceOid)">
|
||||
<span class="fas fa-times-circle"></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
@@ -43,42 +43,42 @@
|
||||
<script type="text/javascript" src="@Scripts.Url("~/Scripts/devexpress-dependencies/globalize/message.min.js")"></script>
|
||||
|
||||
<script type="text/javascript" src="@Scripts.Url("~/Scripts/devexpress-dependencies/ace/ace.min.js")"></script>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="@Url.Content("~/Content/style.css")" />
|
||||
<link type="text/css" rel="stylesheet" href="@Url.Content("~/Content/tempusdominus-bootstrap-4.min.css")" />
|
||||
|
||||
<link rel="stylesheet" href="@Url.Content("~/Content/style.css")" />
|
||||
<link rel="stylesheet" href="@Url.Content("~/Content/tempusdominus-bootstrap-4.min.css")" />
|
||||
<script type="text/javascript" src="@Scripts.Url("~/Scripts/ownSoft-Scripts/utils/dateUtils.js")"></script>
|
||||
|
||||
<script src="@Scripts.Url("~/Scripts/ownSoft-Scripts/utils/dateUtils.js")" type="text/javascript"></script>
|
||||
<script type="text/javascript" src="@Scripts.Url("~/Scripts/moment/moment.min.js")"></script>
|
||||
<script type="text/javascript" src="@Scripts.Url("~/Scripts/moment/locale/de.js")"></script>
|
||||
<script type="text/javascript" src="@Scripts.Url("~/Scripts/tempusdominus-boostrap-4.min.js")"></script>
|
||||
<script type="text/javascript" src="@Scripts.Url("~/Scripts/ownSoft-Scripts/mobileUtils.js")"></script>
|
||||
|
||||
<script src="@Scripts.Url("~/Scripts/moment/moment.min.js")" type="text/javascript"></script>
|
||||
<script src="@Scripts.Url("~/Scripts/moment/locale/de.js")" type="text/javascript"></script>
|
||||
<script src="@Scripts.Url("~/Scripts/tempusdominus-boostrap-4.min.js")" type="text/javascript"></script>
|
||||
<script src="@Scripts.Url("~/Scripts/ownSoft-Scripts/mobileUtils.js")" type="text/javascript"></script>
|
||||
<script type="text/javascript" src="@Scripts.Url("~/Scripts/ownSoft-Scripts/view-scripts/main.js")"></script>
|
||||
<script type="text/javascript" src="@Scripts.Url("~/Scripts/ownSoft-Scripts/signature.js?v=1.1")"></script>
|
||||
|
||||
<script src="@Scripts.Url("~/Scripts/ownSoft-Scripts/view-scripts/main.js")" type="text/javascript"></script>
|
||||
<script src="@Scripts.Url("~/Scripts/ownSoft-Scripts/signature.js")" type="text/javascript"></script>
|
||||
<link type="text/css" rel="stylesheet" href="@Url.Content("~/Scripts/bootstrap/bootstrap4-modal-fullscreen.min.css")" />
|
||||
|
||||
<link rel="stylesheet" href="@Url.Content("~/Scripts/bootstrap/bootstrap4-modal-fullscreen.min.css")" />
|
||||
|
||||
<script src="@Scripts.Url("~/Scripts/ownSoft-Scripts/support-concept-statistics.js")" type="text/javascript"></script>
|
||||
<script src="@Scripts.Url("~/Scripts/ownSoft-Scripts/view-scripts/customer.js")" type="text/javascript"></script>
|
||||
<script src="@Scripts.Url("~/Scripts/ownSoft-Scripts/view-scripts/scheduler.js")" type="text/javascript"></script>
|
||||
<script type="text/javascript" src="@Scripts.Url("~/Scripts/ownSoft-Scripts/support-concept-statistics.js")"></script>
|
||||
<script type="text/javascript" src="@Scripts.Url("~/Scripts/ownSoft-Scripts/view-scripts/customer.js")"></script>
|
||||
<script type="text/javascript" src="@Scripts.Url("~/Scripts/ownSoft-Scripts/view-scripts/scheduler.js")"></script>
|
||||
|
||||
<script type="text/javascript" src="@Url.Content("~/Scripts/ownSoft-Scripts/view-scripts/report.js")"></script>
|
||||
<script src="@Scripts.Url("~/Scripts/signature-pad.min.js")" type="text/javascript"></script>
|
||||
<script src="@Scripts.Url("~/Scripts/ownSoft-Scripts/utils/trimCanvas.js")" type="text/javascript"></script>
|
||||
<script src="@Scripts.Url("~/Scripts/ownSoft-Scripts/utils/resources-list-utils.js")" type="text/javascript"></script>
|
||||
<script src="@Scripts.Url("~/Scripts/ownSoft-Scripts/utils/list-utils.js")" type="text/javascript"></script>
|
||||
<script src="@Scripts.Url("~/Scripts/ownSoft-Scripts/utils/service-record-time-calc.js")" type="text/javascript"></script>
|
||||
<script src="@Scripts.Url("~/Scripts/ownSoft-Scripts/utils/js-helper.js")" type="text/javascript"></script>
|
||||
<script src="@Scripts.Url("~/Scripts/ownSoft-Scripts/utils/logging.js")" type="text/javascript"></script>
|
||||
<script src="@Scripts.Url("~/Scripts/ownSoft-Scripts/utils/MoKPasswordSecurity.js")" type="text/javascript"></script>
|
||||
<script type="text/javascript" src="@Scripts.Url("~/Scripts/signature-pad.min.js")"></script>
|
||||
<script type="text/javascript" src="@Scripts.Url("~/Scripts/ownSoft-Scripts/utils/trimCanvas.js")"></script>
|
||||
<script type="text/javascript" src="@Scripts.Url("~/Scripts/ownSoft-Scripts/utils/resources-list-utils.js")"></script>
|
||||
<script type="text/javascript" src="@Scripts.Url("~/Scripts/ownSoft-Scripts/utils/list-utils.js")"></script>
|
||||
<script type="text/javascript" src="@Scripts.Url("~/Scripts/ownSoft-Scripts/utils/service-record-time-calc.js")"></script>
|
||||
<script type="text/javascript" src="@Scripts.Url("~/Scripts/ownSoft-Scripts/utils/js-helper.js")"></script>
|
||||
<script type="text/javascript" src="@Scripts.Url("~/Scripts/ownSoft-Scripts/utils/logging.js")"></script>
|
||||
<script type="text/javascript" src="@Scripts.Url("~/Scripts/ownSoft-Scripts/utils/MoKPasswordSecurity.js")"></script>
|
||||
<script type="text/javascript" src="@Scripts.Url("~/Scripts/bs-custom-file-input.min.js")"></script>
|
||||
<script type="text/javascript" src="@Scripts.Url("~/Scripts/ownSoft-Scripts/utils/dropdown-search.js")"></script>
|
||||
|
||||
<script type="text/javascript" src="@Scripts.Url("~/Scripts/devexpress-dependencies/devextreme/dx.all.js")"></script>
|
||||
|
||||
<link rel="stylesheet" href="@Url.Content("~/Content/dx.common.css")" />
|
||||
<link rel="stylesheet" href="@Url.Content("~/Content/dx.light.css")" />
|
||||
<link type="text/css" rel="stylesheet" href="@Url.Content("~/Content/dx.common.css")" />
|
||||
<link type="text/css" rel="stylesheet" href="@Url.Content("~/Content/dx.light.css")" />
|
||||
|
||||
@Html.DevExpress().GetStyleSheets(
|
||||
ASPxWebClientUIControl.ColorSchemeLight,
|
||||
@@ -251,9 +251,9 @@
|
||||
|
||||
previousWidth = "";
|
||||
function logSize() {
|
||||
var width = $(document).width();
|
||||
const width = $(document).width();
|
||||
|
||||
var val = widthToBootstrapVal(width);
|
||||
const val = widthToBootstrapVal(width);
|
||||
|
||||
if(previousWidth !== val) {
|
||||
console.log(`%c${val}`, "font-size: 16px; font-weight: bold; color: #00F2FF;");
|
||||
@@ -379,7 +379,7 @@
|
||||
<span class="navbar-text text-bewo-dev" id="dev-size-span"></span>
|
||||
}
|
||||
</a>
|
||||
|
||||
|
||||
<span class="d-inline-block" data-toggle="tooltip" title="Zeit bis zur automatischen Abmeldung" id="countdown-tooltip">
|
||||
<span class="navbar-text" style="font-size: small !important;" id="countdown" onclick="countdownClick()"></span>
|
||||
</span>
|
||||
@@ -561,7 +561,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="modal" tabindex="-1" role="dialog" id="error-alert-popup">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
@@ -588,30 +588,65 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if(TempData[TempDataConstants.ErrorMessageKey] != null)
|
||||
@if(TempData[TempDataConstants.ErrorMessageKey] is string errorMessage)
|
||||
{
|
||||
<script type="text/javascript">
|
||||
function clearErrorLog() {
|
||||
try {
|
||||
$("#error-message-alert").html("");
|
||||
$("#error-alert-container").hide();
|
||||
} catch (error) {
|
||||
showErrorPopup(error);
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<div class="container-fluid mt-3" id="error-alert-container">
|
||||
<div class="row d-flex justify-content-center">
|
||||
<div class="col-md-3 col-lg-4">
|
||||
<div class="alert alert-danger" id="error-message-alert" role="alert">
|
||||
@TempData[TempDataConstants.ErrorMessageKey]
|
||||
<div class="modal d-block" tabindex="-1" role="dialog" id="general-error-popup">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title font-weight-bold">Info</h5>
|
||||
<button class="close" type="button" data-dismiss="modal" aria-label="close" onclick="$('#general-error-popup').removeClass('d-block');">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="row">
|
||||
<div class="col-auto">
|
||||
<span class="fas fa-exclamation-triangle fa-3x text-danger"></span>
|
||||
</div>
|
||||
<div class="col" id="general-error-message">
|
||||
@Html.Raw(errorMessage)
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button class="btn btn-primary" type="button" data-dismiss="modal" onclick="$('#general-error-popup').removeClass('d-block');">OK</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
@using(Html.BeginForm("ZombieLogout", "Main", FormMethod.Post, new { id = "second-logout-form", style="display:none;" }))
|
||||
@if(TempData[TempDataConstants.InfoMessageKey] is string infoMessage)
|
||||
{
|
||||
<div class="modal d-block" tabindex="-1" role="dialog" id="info-popup">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title font-weight-bold">Info</h5>
|
||||
<button class="close" type="button" data-dismiss="modal" aria-label="close" onclick="$('#info-popup').removeClass('d-block');">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="row">
|
||||
<div class="col-auto">
|
||||
<span class="fas fa-exclamation-triangle fa-3x text-info"></span>
|
||||
</div>
|
||||
<div class="col" id="info-message">
|
||||
@Html.Raw(infoMessage)
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button class="btn btn-primary" type="button" data-dismiss="modal" onclick="$('#info-popup').removeClass('d-block');">OK</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
@using(Html.BeginForm("ZombieLogout", "Main", FormMethod.Post, new { id = "second-logout-form", style = "display:none;" }))
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user