Skip to content

Commit

Permalink
Incognito mode introduced (#146)
Browse files Browse the repository at this point in the history
* Incognito mode for check-in: The name of the participant will not be displayed.

* Own name will be displayed in incognito mode

* Update news.md

* Update userguide.md

---------

Co-authored-by: Robert Brands (RiwaAdmin) <rbadmin@riwa4.de>
  • Loading branch information
rbrands and Robert Brands (RiwaAdmin) authored Nov 22, 2024
1 parent bca9f7f commit 1acf76b
Show file tree
Hide file tree
Showing 21 changed files with 100 additions and 50 deletions.
2 changes: 1 addition & 1 deletion MeetUpFunctions/Constants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public static class Constants
public const string DEFAULT_DISCLAIMER = "Disclaimer";
public const string DEFAULT_GUEST_DISCLAIMER = "Guest Disclaimer";

public const string VERSION = "2024-11-19";
public const string VERSION = "2024-11-21";
public const int ADMINOVERBOOKFACTOR = 1; // no overbooking any more, because not needed

public const int LOG_TTL = 30 * 24 * 3600; // 30 days TTL for Log items
Expand Down
2 changes: 1 addition & 1 deletion MeetUpFunctions/MeetUpPlanner.Functions.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Azure.Storage.Blobs" Version="12.23.0" />
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.45.2" />
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.46.0" />
<PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.1.0" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Storage" Version="5.3.2" />
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="8.0.0" />
Expand Down
2 changes: 2 additions & 0 deletions MeetUpPlanner/Client/AppState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ public string DisplayName
public string PhoneMail { get; set; }
public Boolean NoAddressNeeded { get; set; } = false;
public bool SaveSettings { get; set; } = true;
// User prefers to hide his name in the list of participants of a meetup
public Boolean Incognito { get; set; } = false;
public ExtendedRoute RouteArg { get; set; }

public bool NotificationSubscriptionRequested { get; set; } = false;
Expand Down
2 changes: 1 addition & 1 deletion MeetUpPlanner/Client/MeetUpPlanner.Client.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
<PackageReference Include="Blazored.LocalStorage" Version="4.5.0" />
<PackageReference Include="Blazored.TextEditor" Version="1.1.0" />
<PackageReference Include="CurrieTechnologies.Razor.Clipboard" Version="1.6.0" />
<PackageReference Include="Radzen.Blazor" Version="5.6.3" />
<PackageReference Include="Radzen.Blazor" Version="5.6.5" />
<PackageReference Include="Microsoft.AspNetCore.Components" Version="8.0.11" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="8.0.11" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="8.0.11" />
Expand Down
8 changes: 4 additions & 4 deletions MeetUpPlanner/Client/Pages/About.razor
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
</div>
<div class="card-body">
<p>
Diese kleine Anwendung habe ich ursprünglich in den "Corona"-Zeiten entwickelt, damit Radausfahrten so organisiert werden können, dass
Ursprünglich ist diese kleine Anwendung während der Covid-Pandemie entstanden, damit Radausfahrten so organisiert werden können, dass
die Teilnehmer sich registrieren können und alle Kontakte nachvollziehbar sind. Aber darüberhinaus hat sich der MeetUpPlanner als nützliches Tool
für die Verabredung von Ausfahrten oder anderen Aktivitäten bewährt.
</p>
Expand All @@ -23,12 +23,12 @@
Die Web-Anwendung ist "responsive", d.h. kann auf PC und SmartPhones mit allen modernen Browsern genutzt werden.
</li>
<li>
Minimaler administrativer Aufwand: Alle Termine mit ihren Teilnehmern werden automatisch nach 4 Wochen gelöscht.
Minimaler administrativer Aufwand: Alle Termine mit ihren Teilnehmern werden automatisch nach einer konfigurierbaren Zeit gelöscht.
</li>
<li>
Es können "private" Termine erstellt werden. Normalerweise sind die Termine für alle, die das "Schlüsselwort" kennen, zugänglich und
einsehbar. Es ist aber auch möglich, Termine mit einem weiteren Schlüsselwort zu versehen, um den Termin nur für enge Freunde sichtbar
und "buchbar" zu machen. Trotzdem bleibt die Nachverfolgbarkeit der Kontakte gegeben.
und "buchbar" zu machen.
</li>
</ul>
</p>
Expand All @@ -52,7 +52,7 @@
</div>

@code {
private const string clientVersion = "2024-11-19";
private const string clientVersion = "2024-11-21";
private string serverVersion = "tbd";
private string functionsVersion = "tbd";

Expand Down
40 changes: 21 additions & 19 deletions MeetUpPlanner/Client/Pages/Calendar.razor
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@
string badge = GetCalendarBadge(item);
if (!String.IsNullOrEmpty(badge))
{
<span class="badge badge-info">@badge</span>
<span class="badge badge-info">@badge</span>
}
}
</div>
Expand Down Expand Up @@ -107,7 +107,7 @@
</div>
@if (KeywordCheck.IsAdmin && item.PublishDate.ToLocalTime().CompareTo(DateTime.Now) > 0)
{
<small><em>Veröffentlichung @item.GetPublishDateAsString()</em></small>
<small><em>Veröffentlichung @item.GetPublishDateAsString()</em></small>
}
@if (!String.IsNullOrEmpty(item.GuestScope))
{
Expand All @@ -128,28 +128,28 @@
{
<span class="badge badge-danger" title="Mindestteilnehmerzahl">Min @item.MinRegistrationsCount</span>
}
<small>: <b>@item.HostDisplayName(AppStateStore.ClientSettings.NameDisplayLength)</b>@((MarkupString)item.ParticipantsDisplay(AppStateStore.ClientSettings.NameDisplayLength))</small>
<small>: <b>@item.HostDisplayName(AppStateStore.ClientSettings.NameDisplayLength)</b>@((MarkupString)item.ParticipantsDisplay(AppStateStore.ClientSettings.NameDisplayLength, AppStateStore.FirstName, AppStateStore.LastName))</small>
@if (0 < item.WaitingListCounter)
{
<hr />
<small>Warteliste (@item.WaitingListCounter von @item.MaxWaitingList): @item.WaitingListDisplay(AppStateStore.ClientSettings.NameDisplayLength)</small>
<small>Warteliste (@item.WaitingListCounter von @item.MaxWaitingList): @item.WaitingListDisplay(AppStateStore.ClientSettings.NameDisplayLength, AppStateStore.FirstName, AppStateStore.LastName)</small>
}
<hr />
@if (item.CommentsList.Count() > 0)
{
<ul class="list-unstyled">
@foreach (CalendarComment c in item.GetMostRecentComments(commentsToDisplay))
{
<li>
<small>
<em>@c.AuthorDisplayName(AppStateStore.ClientSettings.NameDisplayLength) (@c.DisplayDate): </em>@c.Comment
@if (!String.IsNullOrEmpty(c.Link))
{
<text>&nbsp;</text><a title="@c.DisplayLinkTitle" target="_blank" href="@c.Link">@c.DisplayLinkTitle</a>
}
</small>
</li>
}
{
<li>
<small>
<em>@c.AuthorDisplayName(AppStateStore.ClientSettings.NameDisplayLength) (@c.DisplayDate): </em>@c.Comment
@if (!String.IsNullOrEmpty(c.Link))
{
<text>&nbsp;</text><a title="@c.DisplayLinkTitle" target="_blank" href="@c.Link">@c.DisplayLinkTitle</a>
}
</small>
</li>
}
@if(!item.HideOlderCommments)
{
@foreach (CalendarComment c in item.GetOlderComments(commentsToDisplay))
Expand All @@ -166,13 +166,13 @@
}
} else if (item.CommentsCounter > commentsToDisplay)
{
<li>
<button class="btn btn-link text-left" type="button" @onclick="e => item.HideOlderCommments = false"><small><em>mehr ...</em></small></button>
</li>
<li>
<button class="btn btn-link text-left" type="button" @onclick="e => item.HideOlderCommments = false"><small><em>mehr ...</em></small></button>
</li>
}
</ul>
<hr />
}
}
</p>
@if (!String.IsNullOrEmpty(item.Link))
{
Expand Down Expand Up @@ -430,6 +430,7 @@
participant.ParticipantFirstName = AppStateStore.FirstName;
participant.ParticipantLastName = AppStateStore.LastName;
participant.ParticipantAdressInfo = AppStateStore.PhoneMail;
participant.IsIncognito = AppStateStore.Incognito;
participant.CalendarItemId = itemId;
checkInDisabled = true;
StateHasChanged();
Expand Down Expand Up @@ -472,6 +473,7 @@
participant.ParticipantAdressInfo = AppStateStore.PhoneMail;
participant.CalendarItemId = itemId;
participant.IsCoGuide = true;
participant.IsIncognito = false;
checkInDisabled = true;
StateHasChanged();
PrepareHttpClient();
Expand Down
2 changes: 1 addition & 1 deletion MeetUpPlanner/Client/Pages/Comment.razor
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
@using Newtonsoft.Json
@using Microsoft.AspNetCore.SignalR.Client

<MeetUp CalendarItem="@meetup" NameDisplayLength="@AppStateStore.ClientSettings.NameDisplayLength" />
<MeetUp CalendarItem="@meetup" NameDisplayLength="@AppStateStore.ClientSettings.NameDisplayLength" FirstName="@AppStateStore.FirstName" LastName="@AppStateStore.LastName" />
<AddComment OnSaveComment="SaveComment" OnCancel="OnCancel" EnableLink="true"></AddComment>
<hr />
<CommentsList Comments="@meetup.CommentsList" OnRemoveComment="RemoveComment" NameDisplayLength="@AppStateStore.ClientSettings.NameDisplayLength"></CommentsList>
Expand Down
12 changes: 6 additions & 6 deletions MeetUpPlanner/Client/Pages/Dataprotection.razor
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,14 @@
Wir behandeln Eure personenbezogenen Daten vertraulich und entsprechend der gesetzlichen Datenschutzvorschriften sowie dieser Datenschutzerkl&auml;rung.
</p> <p>
Für die Anmeldung zu einem Termin/Ausfahrt ist die Angabe des Namens und der E-Mail-Adresse oder Telefonnummer notwendig. Diese Angaben
werden ausschließlich zur Organisation der Termine benötigt (Einhaltung max. Teilnehmeranzahl) und für die Nachverfolgbarkeit im Falle
einer Covid-19 Erkrankung. In diesem Fall können auf Anfrage alle Teilnehmer der letzten 4 Wochen, die mit der betreffenden Person im gleichen Termin
waren, herausgegeben werden. Alle Termine werden ansonsten automatisch nach 4 Wochen gelöscht.
werden ausschließlich zur Organisation der Termine benötigt (Einhaltung max. Teilnehmeranzahl), ggf. für Rückfragen oder der Kontaktaufnahme nach Unfällen. Dazu werden
die Teilnehmerdaten für eine konfigurierbaren Zeitraum (max. 4 Wochen) gespeichert. Alle Termine mit Teilnehmerdaten werden ansonsten automatisch nach dem konfigurierten Zeitraum vollständig gelöscht.
Ansonsten erfolgt keine Verwendung oder Weitergabe der Daten.
</p>

<h2>Cookies</h2>
<p>
Die Internetseiten verwenden teilweise so genannte Cookies. Cookies richten auf deinem Rechner keinen Schaden an und
Die Internetseiten verwenden teilweise sog.Cookies. Cookies richten auf deinem Rechner keinen Schaden an und
enthalten keine Viren. Cookies dienen dazu, unser Angebot nutzerfreundlicher, effektiver und sicherer zu machen.
Cookies sind kleine Textdateien, die auf deinem Rechner abgelegt werden und die dein Browser speichert.
</p>
Expand All @@ -25,8 +24,9 @@
automatisch gel&ouml;scht.
</p>
<p>
Au0erdem kannst du bei der Eingabe des Namens und der Tel.-Nr/E-Mail-Adresse angeben, dass diese Angaben im Browser gespeichert werden.
Das erspart die Eingabe beim nächsten Mal. Die Speicherung dieser Eingabehilfe erfolgt ausschließlich im Browser.
Außerdem kannst du bei der Eingabe des Namens und der Tel.-Nr/E-Mail-Adresse angeben, dass diese Angaben im Browser gespeichert werden.
Das erspart die Eingabe beim nächsten Mal. Die Speicherung dieser Eingabehilfe erfolgt ausschließlich im Browser. Erst bei der Anmeldung zu einem Termin werden deine
Kontaktdaten übertragen.
</p>

<h2>Server-LogFiles</h2>
Expand Down
16 changes: 10 additions & 6 deletions MeetUpPlanner/Client/Pages/Guests.razor
Original file line number Diff line number Diff line change
Expand Up @@ -65,12 +65,12 @@
{
<div class="col">
<MeetUpCard FirstName="@_permAppState.FirstName" LastName="@_permAppState.LastName"
CalendarItem="@item"
IsGuest="true"
EnableCheckInCheckOut="true"
OnCheckinCallback="@(e => RegisterGuest(item))"
OnCheckoutCallback="@(e => RegisterGuest(item))"
OnCommentCallback="@(e => ShowComment(item.Id))">
CalendarItem="@item"
IsGuest="true"
EnableCheckInCheckOut="true"
OnCheckinCallback="@(e => RegisterGuest(item))"
OnCheckoutCallback="@(e => RegisterGuest(item))"
OnCommentCallback="@(e => ShowComment(item.Id))">
</MeetUpCard>
</div>
}
Expand Down Expand Up @@ -122,6 +122,7 @@
AppStateStore.FirstName = _guest.ParticipantFirstName;
AppStateStore.LastName = _guest.ParticipantLastName;
AppStateStore.PhoneMail = _guest.ParticipantAdressInfo;
AppStateStore.Incognito = _guest.IsIncognito;
if (AppStateStore.SaveSettings)
{
// Copy from app state to permanent storage
Expand All @@ -130,6 +131,7 @@
_permAppState.LastName = _guest.ParticipantLastName;
_permAppState.PhoneMail = _guest.ParticipantAdressInfo;
_permAppState.NoAddressNeeded = AppStateStore.NoAddressNeeded;
_permAppState.Incognito = _guest.IsIncognito;
await LocalStorage.SetItemAsync<PermAppState>(PERM_STORAGE, _permAppState);
}
else
Expand All @@ -151,6 +153,7 @@
_guest.ParticipantFirstName = _permAppState.FirstName;
_guest.ParticipantLastName = _permAppState.LastName;
_guest.ParticipantAdressInfo = _permAppState.PhoneMail;
_guest.IsIncognito = _permAppState.Incognito;
AppStateStore.NoAddressNeeded = _permAppState.NoAddressNeeded;
// If someone has stored the settings before the disclaimer has already been accepted by user
UsageRightsAccepted = true;
Expand Down Expand Up @@ -252,6 +255,7 @@
_permAppState.FirstName = _guest.ParticipantFirstName;
_permAppState.LastName = _guest.ParticipantLastName;
_permAppState.PhoneMail = _guest.ParticipantAdressInfo;
_permAppState.Incognito = _guest.IsIncognito;
await LocalStorage.SetItemAsync<PermAppState>(PERM_STORAGE, _permAppState);
}
else
Expand Down
9 changes: 9 additions & 0 deletions MeetUpPlanner/Client/Pages/Index.razor
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,13 @@
Für die Nachverfolgbarkeit hier bitte deine Mail-Adresse oder Telefonnummer eingeben. Diese Info wird nicht in der allgemeinen Teilnehmerliste zu Ausfahrten angezeigt.
</small>
</div>
<div class="form-group">
<div class="form-check">
<InputCheckbox id="Incognito" class="form-check-input" @bind-Value="AppStateStore.Incognito"></InputCheckbox>
<label for="Incognito" class="form-check-label">Inkognitomodus?</label>
</div>
<small id="inkognitoHelp">Dein Name wird in den Anmeldelisten der Termine nicht angezeigt. Du kannst dann allerdings auch nicht die Namen der anderen sehen für Termine, zu denen du inkognito angemeldet bist.</small>
</div>
<div class="form-group">
<div class="form-check">
<InputCheckbox id="SaveSettings" aria-describedby="saveSettingsHelp" class="form-check-input" @bind-Value="AppStateStore.SaveSettings"></InputCheckbox>
Expand Down Expand Up @@ -127,6 +134,7 @@
AppStateStore.PrivateKeyWord2 = permAppState.PrivateKeyWord2;
AppStateStore.PrivateKeyWord3 = permAppState.PrivateKeyWord3;
AppStateStore.NoAddressNeeded = permAppState.NoAddressNeeded;
AppStateStore.Incognito = permAppState.Incognito;
// If someone has stored the settings before the disclaimer has already been accepted by user
UsageRightsAccepted = true;
}
Expand Down Expand Up @@ -218,6 +226,7 @@
permAppState.PrivateKeyWord2 = AppStateStore.PrivateKeyWord2;
permAppState.PrivateKeyWord3 = AppStateStore.PrivateKeyWord3;
permAppState.NoAddressNeeded = AppStateStore.NoAddressNeeded;
permAppState.Incognito = AppStateStore.Incognito;
await localStorage.SetItemAsync<PermAppState>("permAppState", permAppState);
}
else
Expand Down
2 changes: 2 additions & 0 deletions MeetUpPlanner/Client/Pages/Register.razor
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@
_guest.ParticipantFirstName = permAppState.FirstName;
_guest.ParticipantLastName = permAppState.LastName;
_guest.ParticipantAdressInfo = permAppState.PhoneMail;
_guest.IsIncognito = permAppState.Incognito;
}
// Get client settings from server
PrepareHttpClient();
Expand Down Expand Up @@ -138,6 +139,7 @@
permAppState.FirstName = _guest.ParticipantFirstName;
permAppState.LastName = _guest.ParticipantLastName;
permAppState.PhoneMail = _guest.ParticipantAdressInfo;
permAppState.Incognito = _guest.IsIncognito;
await LocalStorage.SetItemAsync<PermAppState>(PERM_STORAGE, permAppState);
}
else
Expand Down
7 changes: 6 additions & 1 deletion MeetUpPlanner/Client/Pages/RegisterOthers.razor
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,12 @@
@inject NotificationService notificationService
@using Newtonsoft.Json

<MeetUp CalendarItem="@meetup" HideParticipants="false" NameDisplayLength="@AppStateStore.ClientSettings.NameDisplayLength" AdditionalText="Hier kannst du für andere Teilnehmer der Ausfahrt die An- oder Abmeldung übernehmen." />
<MeetUp CalendarItem="@meetup"
HideParticipants="false"
NameDisplayLength="@AppStateStore.ClientSettings.NameDisplayLength"
FirstName="@AppStateStore.FirstName"
LastName="@AppStateStore.LastName"
AdditionalText="Hier kannst du für andere Teilnehmer der Ausfahrt die An- oder Abmeldung übernehmen." />

<EditForm OnValidSubmit="RegisterParticipant" Model="@_participant">
<DataAnnotationsValidator />
Expand Down
1 change: 1 addition & 0 deletions MeetUpPlanner/Client/PermAppState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ public class PermAppState
public string LastName { get; set; }
public string PhoneMail { get; set; }
public Boolean NoAddressNeeded { get; set; }
public Boolean Incognito { get; set; }

}
}
6 changes: 5 additions & 1 deletion MeetUpPlanner/Client/Shared/MeetUp.razor
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
{
<span class="badge badge-danger" title="Mindestteilnehmerzahl">Min @CalendarItem.MinRegistrationsCount</span>
}
<small>: <b>@CalendarItem.HostDisplayName(NameDisplayLength)</b>@((MarkupString)CalendarItem.ParticipantsDisplay(NameDisplayLength))</small>
<small>: <b>@CalendarItem.HostDisplayName(NameDisplayLength)</b>@((MarkupString)CalendarItem.ParticipantsDisplay(NameDisplayLength, FirstName, LastName))</small>
}
else
{
Expand Down Expand Up @@ -58,4 +58,8 @@
public String AdditionalText { get; set; } = null;
[Parameter]
public int NameDisplayLength { get; set; } = 1;
[Parameter]
public String FirstName { get; set; } = "";
[Parameter]
public String LastName { get; set; } = "";
}
Loading

0 comments on commit 1acf76b

Please sign in to comment.