Refactors employee details and UI controls

Enhances employee hours view with dynamic weekly schedule rendering
Updates toggle slider and theme switch components with improved interactions
Adds more flexible notification and settings configurations for employees

Improves user experience by streamlining UI controls and schedule display
This commit is contained in:
Janus C. H. Knudsen 2026-01-15 16:59:56 +01:00
parent 6746e876d7
commit 545d6606a6
18 changed files with 506 additions and 206 deletions

View file

@ -88,16 +88,6 @@
<swp-toggle-option>@Model.ToggleNo</swp-toggle-option>
</swp-toggle-slider>
</swp-toggle-row>
<swp-toggle-row>
<div>
<swp-toggle-label>@Model.SettingSmsReminders</swp-toggle-label>
<swp-toggle-description>@Model.SettingSmsRemindersDesc</swp-toggle-description>
</div>
<swp-toggle-slider data-value="yes">
<swp-toggle-option>@Model.ToggleYes</swp-toggle-option>
<swp-toggle-option>@Model.ToggleNo</swp-toggle-option>
</swp-toggle-slider>
</swp-toggle-row>
<swp-toggle-row>
<div>
<swp-toggle-label>@Model.SettingEditCalendar</swp-toggle-label>
@ -114,38 +104,48 @@
<swp-card>
<swp-section-label>@Model.LabelNotifications</swp-section-label>
<swp-notification-intro>@Model.NotificationsIntro</swp-notification-intro>
<swp-checkbox-list>
<swp-checkbox-row class="checked">
<swp-checkbox-box>
<svg viewBox="0 0 24 24"><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/></svg>
</swp-checkbox-box>
<swp-checkbox-text>@Model.NotifOnlineBooking</swp-checkbox-text>
</swp-checkbox-row>
<swp-checkbox-row class="checked">
<swp-checkbox-box>
<svg viewBox="0 0 24 24"><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/></svg>
</swp-checkbox-box>
<swp-checkbox-text>@Model.NotifManualBooking</swp-checkbox-text>
</swp-checkbox-row>
<swp-checkbox-row>
<swp-checkbox-box>
<svg viewBox="0 0 24 24"><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/></svg>
</swp-checkbox-box>
<swp-checkbox-text>@Model.NotifCancellation</swp-checkbox-text>
</swp-checkbox-row>
<swp-checkbox-row>
<swp-checkbox-box>
<svg viewBox="0 0 24 24"><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/></svg>
</swp-checkbox-box>
<swp-checkbox-text>@Model.NotifWaitlist</swp-checkbox-text>
</swp-checkbox-row>
<swp-checkbox-row class="checked">
<swp-checkbox-box>
<svg viewBox="0 0 24 24"><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/></svg>
</swp-checkbox-box>
<swp-checkbox-text>@Model.NotifDailySummary</swp-checkbox-text>
</swp-checkbox-row>
</swp-checkbox-list>
<swp-toggle-row>
<swp-toggle-label>@Model.SettingSmsReminders</swp-toggle-label>
<swp-toggle-slider data-value="yes">
<swp-toggle-option>@Model.ToggleYes</swp-toggle-option>
<swp-toggle-option>@Model.ToggleNo</swp-toggle-option>
</swp-toggle-slider>
</swp-toggle-row>
<swp-toggle-row>
<swp-toggle-label>@Model.NotifOnlineBooking</swp-toggle-label>
<swp-toggle-slider data-value="yes">
<swp-toggle-option>@Model.ToggleYes</swp-toggle-option>
<swp-toggle-option>@Model.ToggleNo</swp-toggle-option>
</swp-toggle-slider>
</swp-toggle-row>
<swp-toggle-row>
<swp-toggle-label>@Model.NotifManualBooking</swp-toggle-label>
<swp-toggle-slider data-value="yes">
<swp-toggle-option>@Model.ToggleYes</swp-toggle-option>
<swp-toggle-option>@Model.ToggleNo</swp-toggle-option>
</swp-toggle-slider>
</swp-toggle-row>
<swp-toggle-row>
<swp-toggle-label>@Model.NotifCancellation</swp-toggle-label>
<swp-toggle-slider data-value="no">
<swp-toggle-option>@Model.ToggleYes</swp-toggle-option>
<swp-toggle-option>@Model.ToggleNo</swp-toggle-option>
</swp-toggle-slider>
</swp-toggle-row>
<swp-toggle-row>
<swp-toggle-label>@Model.NotifWaitlist</swp-toggle-label>
<swp-toggle-slider data-value="no">
<swp-toggle-option>@Model.ToggleYes</swp-toggle-option>
<swp-toggle-option>@Model.ToggleNo</swp-toggle-option>
</swp-toggle-slider>
</swp-toggle-row>
<swp-toggle-row>
<swp-toggle-label>@Model.NotifDailySummary</swp-toggle-label>
<swp-toggle-slider data-value="yes">
<swp-toggle-option>@Model.ToggleYes</swp-toggle-option>
<swp-toggle-option>@Model.ToggleNo</swp-toggle-option>
</swp-toggle-slider>
</swp-toggle-row>
</swp-card>
</div>
</swp-detail-grid>

View file

@ -1,37 +1,36 @@
@model PlanTempus.Application.Features.Employees.Components.EmployeeDetailHoursViewModel
<swp-detail-grid>
<swp-card>
<swp-section-label>@Model.LabelWeeklySchedule</swp-section-label>
<swp-schedule-grid>
<swp-schedule-row>
<swp-schedule-day>@Model.LabelMonday</swp-schedule-day>
<swp-schedule-time>09:00 - 17:00</swp-schedule-time>
</swp-schedule-row>
<swp-schedule-row>
<swp-schedule-day>@Model.LabelTuesday</swp-schedule-day>
<swp-schedule-time>09:00 - 17:00</swp-schedule-time>
</swp-schedule-row>
<swp-schedule-row>
<swp-schedule-day>@Model.LabelWednesday</swp-schedule-day>
<swp-schedule-time>09:00 - 17:00</swp-schedule-time>
</swp-schedule-row>
<swp-schedule-row>
<swp-schedule-day>@Model.LabelThursday</swp-schedule-day>
<swp-schedule-time>09:00 - 19:00</swp-schedule-time>
</swp-schedule-row>
<swp-schedule-row>
<swp-schedule-day>@Model.LabelFriday</swp-schedule-day>
<swp-schedule-time>09:00 - 16:00</swp-schedule-time>
</swp-schedule-row>
<swp-schedule-row class="off">
<swp-schedule-day>@Model.LabelSaturday</swp-schedule-day>
<swp-schedule-time>Fri</swp-schedule-time>
</swp-schedule-row>
<swp-schedule-row class="off">
<swp-schedule-day>@Model.LabelSunday</swp-schedule-day>
<swp-schedule-time>Fri</swp-schedule-time>
</swp-schedule-row>
</swp-schedule-grid>
</swp-card>
</swp-detail-grid>
@{
string GetBadgeClass(string status) => status switch
{
"work" => "",
"off" => "off",
"vacation" => "vacation",
"sick" => "sick",
_ => "off"
};
}
<swp-schedule-scroll>
<swp-schedule-table class="hours-view">
<!-- Header row -->
<swp-schedule-cell class="header week-number"></swp-schedule-cell>
@foreach (var dayName in Model.DayNames)
{
<swp-schedule-cell class="header"><swp-day-name>@dayName</swp-day-name></swp-schedule-cell>
}
<!-- Week rows -->
@foreach (var week in Model.Weeks)
{
<swp-schedule-cell class="employee week-label">
<swp-employee-name>Uge @week.WeekNumber</swp-employee-name>
<swp-employee-hours>@week.TotalHours @Model.LabelHours</swp-employee-hours>
</swp-schedule-cell>
@foreach (var day in week.Days)
{
<swp-schedule-cell class="day"><swp-time-badge class="@GetBadgeClass(day.Status)">@day.Display</swp-time-badge></swp-schedule-cell>
}
}
</swp-schedule-table>
</swp-schedule-scroll>

View file

@ -1,3 +1,4 @@
using System.Text.Json;
using Microsoft.AspNetCore.Mvc;
using PlanTempus.Application.Features.Localization.Services;
@ -6,38 +7,132 @@ namespace PlanTempus.Application.Features.Employees.Components;
public class EmployeeDetailHoursViewComponent : ViewComponent
{
private readonly ILocalizationService _localization;
private readonly IWebHostEnvironment _environment;
public EmployeeDetailHoursViewComponent(ILocalizationService localization)
public EmployeeDetailHoursViewComponent(ILocalizationService localization, IWebHostEnvironment environment)
{
_localization = localization;
_environment = environment;
}
public IViewComponentResult Invoke(string key)
{
var weekSchedule = LoadMockData();
var employee = weekSchedule.Employees.FirstOrDefault(e => e.EmployeeId == key);
var weeks = GenerateWeeks(weekSchedule, employee);
var model = new EmployeeDetailHoursViewModel
{
LabelWeeklySchedule = _localization.Get("employees.detail.hours.weekly"),
LabelMonday = _localization.Get("employees.detail.hours.monday"),
LabelTuesday = _localization.Get("employees.detail.hours.tuesday"),
LabelWednesday = _localization.Get("employees.detail.hours.wednesday"),
LabelThursday = _localization.Get("employees.detail.hours.thursday"),
LabelFriday = _localization.Get("employees.detail.hours.friday"),
LabelSaturday = _localization.Get("employees.detail.hours.saturday"),
LabelSunday = _localization.Get("employees.detail.hours.sunday")
EmployeeId = key,
Weeks = weeks,
DayNames = new[] { "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag", "Søndag" },
LabelHours = _localization.Get("employees.detail.hours.label")
};
return View(model);
}
private WeekScheduleData LoadMockData()
{
var jsonPath = Path.Combine(_environment.ContentRootPath, "Features", "Employees", "Data", "workScheduleMock.json");
var json = System.IO.File.ReadAllText(jsonPath);
return JsonSerializer.Deserialize<WeekScheduleData>(json, new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true
})!;
}
private List<WeekHoursData> GenerateWeeks(WeekScheduleData weekSchedule, EmployeeScheduleData? employee)
{
var weeks = new List<WeekHoursData>();
var startDate = DateTime.Parse(weekSchedule.StartDate);
// Generate 6 weeks of data (current week + 5 more)
for (int w = 0; w < 6; w++)
{
var weekStart = startDate.AddDays(w * 7);
var weekNumber = GetWeekNumber(weekStart);
var days = new List<DayHoursData>();
var totalMinutes = 0;
for (int d = 0; d < 7; d++)
{
var date = weekStart.AddDays(d);
var dateKey = date.ToString("yyyy-MM-dd");
var shift = employee?.Schedule.GetValueOrDefault(dateKey);
string status = "off";
string display = "—";
if (shift != null)
{
status = shift.Status;
if (shift.Status == "work" && shift.Start != null && shift.End != null)
{
display = $"{shift.Start} - {shift.End}";
totalMinutes += CalculateMinutes(shift.Start, shift.End);
}
else if (shift.Status == "vacation")
{
display = "Ferie";
}
else if (shift.Status == "sick")
{
display = "Syg";
}
}
days.Add(new DayHoursData
{
Date = dateKey,
Status = status,
Display = display
});
}
weeks.Add(new WeekHoursData
{
WeekNumber = weekNumber,
TotalHours = totalMinutes / 60,
Days = days
});
}
return weeks;
}
private int GetWeekNumber(DateTime date)
{
var cal = System.Globalization.CultureInfo.CurrentCulture.Calendar;
return cal.GetWeekOfYear(date, System.Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
}
private int CalculateMinutes(string start, string end)
{
var startTime = TimeSpan.Parse(start);
var endTime = TimeSpan.Parse(end);
return (int)(endTime - startTime).TotalMinutes;
}
}
public class EmployeeDetailHoursViewModel
{
public required string LabelWeeklySchedule { get; init; }
public required string LabelMonday { get; init; }
public required string LabelTuesday { get; init; }
public required string LabelWednesday { get; init; }
public required string LabelThursday { get; init; }
public required string LabelFriday { get; init; }
public required string LabelSaturday { get; init; }
public required string LabelSunday { get; init; }
public required string EmployeeId { get; init; }
public required List<WeekHoursData> Weeks { get; init; }
public required string[] DayNames { get; init; }
public required string LabelHours { get; init; }
}
public class WeekHoursData
{
public int WeekNumber { get; init; }
public int TotalHours { get; init; }
public required List<DayHoursData> Days { get; init; }
}
public class DayHoursData
{
public required string Date { get; init; }
public required string Status { get; init; }
public required string Display { get; init; }
}

View file

@ -67,7 +67,7 @@
data-employee-id="@employee.EmployeeId"
data-date="@day.Date"
data-day="@day.ShortDayName">
<swp-time-display class="@GetTimeClass(shift)">@GetTimeDisplay(shift)</swp-time-display>
<swp-time-badge class="@GetTimeClass(shift)">@GetTimeDisplay(shift)</swp-time-badge>
</swp-schedule-cell>
}
}

View file

@ -3,10 +3,10 @@
"year": 2025,
"startDate": "2025-12-23",
"endDate": "2025-12-29",
"closedDays": ["2025-12-25"],
"closedDays": ["2025-12-25", "2026-01-01"],
"employees": [
{
"employeeId": "emp-1",
"employeeId": "employee-1",
"name": "Anna Sørensen",
"weeklyHours": 32,
"schedule": {
@ -16,11 +16,39 @@
"2025-12-26": { "status": "off" },
"2025-12-27": { "status": "work", "start": "09:00", "end": "17:00" },
"2025-12-28": { "status": "work", "start": "10:00", "end": "14:00" },
"2025-12-29": { "status": "off" }
"2025-12-29": { "status": "off" },
"2025-12-30": { "status": "work", "start": "09:00", "end": "17:00" },
"2025-12-31": { "status": "work", "start": "09:00", "end": "14:00" },
"2026-01-01": { "status": "off" },
"2026-01-02": { "status": "work", "start": "09:00", "end": "17:00" },
"2026-01-03": { "status": "work", "start": "09:00", "end": "17:00" },
"2026-01-04": { "status": "work", "start": "10:00", "end": "14:00" },
"2026-01-05": { "status": "off" },
"2026-01-06": { "status": "work", "start": "09:00", "end": "17:00" },
"2026-01-07": { "status": "work", "start": "09:00", "end": "17:00" },
"2026-01-08": { "status": "work", "start": "09:00", "end": "17:00" },
"2026-01-09": { "status": "work", "start": "09:00", "end": "17:00" },
"2026-01-10": { "status": "off" },
"2026-01-11": { "status": "off" },
"2026-01-12": { "status": "off" },
"2026-01-13": { "status": "work", "start": "09:00", "end": "17:00" },
"2026-01-14": { "status": "work", "start": "09:00", "end": "17:00" },
"2026-01-15": { "status": "work", "start": "09:00", "end": "17:00" },
"2026-01-16": { "status": "work", "start": "09:00", "end": "17:00" },
"2026-01-17": { "status": "work", "start": "09:00", "end": "15:00" },
"2026-01-18": { "status": "off" },
"2026-01-19": { "status": "off" },
"2026-01-20": { "status": "vacation" },
"2026-01-21": { "status": "vacation" },
"2026-01-22": { "status": "vacation" },
"2026-01-23": { "status": "vacation" },
"2026-01-24": { "status": "vacation" },
"2026-01-25": { "status": "off" },
"2026-01-26": { "status": "off" }
}
},
{
"employeeId": "emp-2",
"employeeId": "employee-2",
"name": "Mette Jensen",
"weeklyHours": 40,
"schedule": {
@ -30,11 +58,39 @@
"2025-12-26": { "status": "vacation" },
"2025-12-27": { "status": "vacation" },
"2025-12-28": { "status": "off" },
"2025-12-29": { "status": "off" }
"2025-12-29": { "status": "off" },
"2025-12-30": { "status": "vacation" },
"2025-12-31": { "status": "vacation" },
"2026-01-01": { "status": "off" },
"2026-01-02": { "status": "work", "start": "10:00", "end": "18:00" },
"2026-01-03": { "status": "work", "start": "10:00", "end": "18:00" },
"2026-01-04": { "status": "off" },
"2026-01-05": { "status": "off" },
"2026-01-06": { "status": "work", "start": "10:00", "end": "18:00" },
"2026-01-07": { "status": "work", "start": "10:00", "end": "18:00" },
"2026-01-08": { "status": "work", "start": "10:00", "end": "18:00" },
"2026-01-09": { "status": "work", "start": "10:00", "end": "18:00" },
"2026-01-10": { "status": "work", "start": "10:00", "end": "18:00" },
"2026-01-11": { "status": "off" },
"2026-01-12": { "status": "off" },
"2026-01-13": { "status": "work", "start": "10:00", "end": "18:00" },
"2026-01-14": { "status": "work", "start": "10:00", "end": "18:00" },
"2026-01-15": { "status": "work", "start": "10:00", "end": "18:00" },
"2026-01-16": { "status": "work", "start": "10:00", "end": "18:00" },
"2026-01-17": { "status": "work", "start": "10:00", "end": "18:00" },
"2026-01-18": { "status": "off" },
"2026-01-19": { "status": "off" },
"2026-01-20": { "status": "work", "start": "10:00", "end": "18:00" },
"2026-01-21": { "status": "work", "start": "10:00", "end": "18:00" },
"2026-01-22": { "status": "work", "start": "10:00", "end": "18:00" },
"2026-01-23": { "status": "work", "start": "10:00", "end": "18:00" },
"2026-01-24": { "status": "work", "start": "10:00", "end": "18:00" },
"2026-01-25": { "status": "off" },
"2026-01-26": { "status": "off" }
}
},
{
"employeeId": "emp-3",
"employeeId": "employee-3",
"name": "Louise Nielsen",
"weeklyHours": 37,
"schedule": {
@ -44,11 +100,39 @@
"2025-12-26": { "status": "off" },
"2025-12-27": { "status": "work", "start": "09:00", "end": "17:00" },
"2025-12-28": { "status": "work", "start": "09:00", "end": "14:00" },
"2025-12-29": { "status": "off" }
"2025-12-29": { "status": "off" },
"2025-12-30": { "status": "work", "start": "09:00", "end": "17:00" },
"2025-12-31": { "status": "work", "start": "09:00", "end": "13:00" },
"2026-01-01": { "status": "off" },
"2026-01-02": { "status": "work", "start": "09:00", "end": "17:00" },
"2026-01-03": { "status": "work", "start": "09:00", "end": "17:00" },
"2026-01-04": { "status": "off" },
"2026-01-05": { "status": "off" },
"2026-01-06": { "status": "work", "start": "09:00", "end": "17:00" },
"2026-01-07": { "status": "work", "start": "09:00", "end": "17:00" },
"2026-01-08": { "status": "sick" },
"2026-01-09": { "status": "sick" },
"2026-01-10": { "status": "work", "start": "09:00", "end": "17:00" },
"2026-01-11": { "status": "off" },
"2026-01-12": { "status": "off" },
"2026-01-13": { "status": "work", "start": "09:00", "end": "17:00" },
"2026-01-14": { "status": "work", "start": "09:00", "end": "17:00" },
"2026-01-15": { "status": "work", "start": "09:00", "end": "17:00" },
"2026-01-16": { "status": "work", "start": "09:00", "end": "17:00" },
"2026-01-17": { "status": "work", "start": "09:00", "end": "17:00" },
"2026-01-18": { "status": "off" },
"2026-01-19": { "status": "off" },
"2026-01-20": { "status": "work", "start": "09:00", "end": "17:00" },
"2026-01-21": { "status": "work", "start": "09:00", "end": "17:00" },
"2026-01-22": { "status": "work", "start": "09:00", "end": "17:00" },
"2026-01-23": { "status": "work", "start": "09:00", "end": "17:00" },
"2026-01-24": { "status": "work", "start": "09:00", "end": "17:00" },
"2026-01-25": { "status": "off" },
"2026-01-26": { "status": "off" }
}
},
{
"employeeId": "emp-4",
"employeeId": "employee-4",
"name": "Katrine Pedersen",
"weeklyHours": 24,
"schedule": {
@ -58,11 +142,39 @@
"2025-12-26": { "status": "off" },
"2025-12-27": { "status": "work", "start": "12:00", "end": "20:00" },
"2025-12-28": { "status": "work", "start": "10:00", "end": "18:00" },
"2025-12-29": { "status": "off" }
"2025-12-29": { "status": "off" },
"2025-12-30": { "status": "work", "start": "12:00", "end": "20:00" },
"2025-12-31": { "status": "off" },
"2026-01-01": { "status": "off" },
"2026-01-02": { "status": "work", "start": "12:00", "end": "20:00" },
"2026-01-03": { "status": "work", "start": "12:00", "end": "20:00" },
"2026-01-04": { "status": "work", "start": "10:00", "end": "18:00" },
"2026-01-05": { "status": "off" },
"2026-01-06": { "status": "off" },
"2026-01-07": { "status": "work", "start": "12:00", "end": "20:00" },
"2026-01-08": { "status": "work", "start": "12:00", "end": "20:00" },
"2026-01-09": { "status": "off" },
"2026-01-10": { "status": "work", "start": "12:00", "end": "20:00" },
"2026-01-11": { "status": "work", "start": "10:00", "end": "18:00" },
"2026-01-12": { "status": "off" },
"2026-01-13": { "status": "off" },
"2026-01-14": { "status": "work", "start": "12:00", "end": "20:00" },
"2026-01-15": { "status": "work", "start": "12:00", "end": "20:00" },
"2026-01-16": { "status": "off" },
"2026-01-17": { "status": "work", "start": "12:00", "end": "20:00" },
"2026-01-18": { "status": "work", "start": "10:00", "end": "18:00" },
"2026-01-19": { "status": "off" },
"2026-01-20": { "status": "off" },
"2026-01-21": { "status": "work", "start": "12:00", "end": "20:00" },
"2026-01-22": { "status": "work", "start": "12:00", "end": "20:00" },
"2026-01-23": { "status": "off" },
"2026-01-24": { "status": "work", "start": "12:00", "end": "20:00" },
"2026-01-25": { "status": "work", "start": "10:00", "end": "18:00" },
"2026-01-26": { "status": "off" }
}
},
{
"employeeId": "emp-5",
"employeeId": "employee-5",
"name": "Sofie Andersen",
"weeklyHours": 20,
"schedule": {
@ -72,7 +184,35 @@
"2025-12-26": { "status": "off" },
"2025-12-27": { "status": "work", "start": "09:00", "end": "15:00" },
"2025-12-28": { "status": "off" },
"2025-12-29": { "status": "off" }
"2025-12-29": { "status": "off" },
"2025-12-30": { "status": "work", "start": "09:00", "end": "15:00" },
"2025-12-31": { "status": "off" },
"2026-01-01": { "status": "off" },
"2026-01-02": { "status": "work", "start": "09:00", "end": "15:00" },
"2026-01-03": { "status": "work", "start": "09:00", "end": "15:00" },
"2026-01-04": { "status": "off" },
"2026-01-05": { "status": "off" },
"2026-01-06": { "status": "work", "start": "09:00", "end": "15:00" },
"2026-01-07": { "status": "work", "start": "09:00", "end": "15:00" },
"2026-01-08": { "status": "work", "start": "09:00", "end": "15:00" },
"2026-01-09": { "status": "off" },
"2026-01-10": { "status": "off" },
"2026-01-11": { "status": "off" },
"2026-01-12": { "status": "off" },
"2026-01-13": { "status": "work", "start": "09:00", "end": "15:00" },
"2026-01-14": { "status": "work", "start": "09:00", "end": "15:00" },
"2026-01-15": { "status": "work", "start": "09:00", "end": "15:00" },
"2026-01-16": { "status": "off" },
"2026-01-17": { "status": "off" },
"2026-01-18": { "status": "off" },
"2026-01-19": { "status": "off" },
"2026-01-20": { "status": "work", "start": "09:00", "end": "15:00" },
"2026-01-21": { "status": "work", "start": "09:00", "end": "15:00" },
"2026-01-22": { "status": "work", "start": "09:00", "end": "15:00" },
"2026-01-23": { "status": "off" },
"2026-01-24": { "status": "off" },
"2026-01-25": { "status": "off" },
"2026-01-26": { "status": "off" }
}
}
]

View file

@ -317,6 +317,7 @@
"rating": "rating",
"employedsince": "ansat siden",
"hours": {
"label": "timer",
"weekly": "Ugentlig arbejdstid",
"monday": "Mandag",
"tuesday": "Tirsdag",
@ -409,8 +410,8 @@
"desc": "Kunder kan vælge denne medarbejder"
},
"smsreminders": {
"label": "Modtag SMS-påmindelser",
"desc": "Få besked om nye bookinger"
"label": "Få notifikation via App'en om nye bookinger",
"desc": ""
},
"editcalendar": {
"label": "Kan redigere egen kalender",
@ -419,12 +420,12 @@
},
"notifications": {
"label": "Notifikationer",
"intro": "Vælg hvilke email-notifikationer medarbejderen skal modtage.",
"onlinebooking": "Modtag email ved online booking",
"manualbooking": "Modtag email ved manuel booking",
"cancellation": "Modtag email ved aflysning",
"waitlist": "Modtag email ved opskrivning til venteliste",
"dailysummary": "Modtag daglig oversigt over morgendagens bookinger"
"intro": "Vælg hvilke notifikationer der skal sendes.",
"onlinebooking": "Email ved online booking",
"manualbooking": "Email ved manuel booking",
"cancellation": "Email ved aflysning",
"waitlist": "Email ved opskrivning til venteliste",
"dailysummary": "Email med daglig oversigt"
}
}
}

View file

@ -317,6 +317,7 @@
"rating": "rating",
"employedsince": "employed since",
"hours": {
"label": "hours",
"weekly": "Weekly working hours",
"monday": "Monday",
"tuesday": "Tuesday",
@ -409,8 +410,8 @@
"desc": "Customers can select this employee"
},
"smsreminders": {
"label": "Receive SMS reminders",
"desc": "Get notified about new bookings"
"label": "Get notified via the App about new bookings",
"desc": ""
},
"editcalendar": {
"label": "Can edit own calendar",
@ -419,12 +420,12 @@
},
"notifications": {
"label": "Notifications",
"intro": "Choose which email notifications the employee should receive.",
"onlinebooking": "Receive email for online booking",
"manualbooking": "Receive email for manual booking",
"cancellation": "Receive email for cancellation",
"waitlist": "Receive email for waitlist signup",
"dailysummary": "Receive daily summary of tomorrow's bookings"
"intro": "Choose which notifications to send.",
"onlinebooking": "Email on online booking",
"manualbooking": "Email on manual booking",
"cancellation": "Email on cancellation",
"waitlist": "Email on waitlist signup",
"dailysummary": "Email with daily summary"
}
}
}

View file

@ -35,7 +35,7 @@
</swp-theme-label>
<swp-toggle-switch id="themeToggle">
<input type="checkbox" id="themeCheckbox">
<swp-toggle-slider></swp-toggle-slider>
<swp-toggle-track></swp-toggle-track>
</swp-toggle-switch>
</swp-theme-toggle>
</swp-drawer-content>

View file

@ -35,7 +35,7 @@
</swp-theme-label>
<swp-toggle-switch id="themeToggle">
<input type="checkbox" id="themeCheckbox">
<swp-toggle-slider></swp-toggle-slider>
<swp-toggle-track></swp-toggle-track>
</swp-toggle-switch>
</swp-theme-toggle>
</swp-drawer-content>