168 lines
5.3 KiB
Plaintext
168 lines
5.3 KiB
Plaintext
@namespace Oqtane.Modules.Admin.Visitors
|
|
@inherits ModuleBase
|
|
@inject IVisitorService VisitorService
|
|
@inject ISiteService SiteService
|
|
@inject ISettingService SettingService
|
|
@inject IStringLocalizer<Index> Localizer
|
|
@inject IStringLocalizer<SharedResources> SharedLocalizer
|
|
|
|
@if (_visitors == null)
|
|
{
|
|
<p><em>@SharedLocalizer["Loading"]</em></p>
|
|
}
|
|
else
|
|
{
|
|
<TabStrip>
|
|
<TabPanel Name="Visitors" Heading="Visitors" ResourceKey="Visitors">
|
|
<div class="container">
|
|
<div class="row mb-1 align-items-center">
|
|
<div class="col-sm-6">
|
|
<select id="type" class="form-select custom-select" @onchange="(e => TypeChanged(e))">
|
|
<option value="false">@Localizer["AllVisitors"]</option>
|
|
<option value="true">@Localizer["UsersOnly"]</option>
|
|
</select>
|
|
</div>
|
|
<div class="col-sm-6">
|
|
<select id="type" class="form-select custom-select" @onchange="(e => DateChanged(e))">
|
|
<option value="1">@Localizer["PastDay"]</option>
|
|
<option value="7">@Localizer["PastWeek"]</option>
|
|
<option value="30">@Localizer["PastMonth"]</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<br/>
|
|
<Pager Items="@_visitors">
|
|
<Header>
|
|
<th style="width: 1px;"> </th>
|
|
<th>@Localizer["IP"]</th>
|
|
<th>@Localizer["User"]</th>
|
|
<th>@Localizer["Language"]</th>
|
|
<th>@Localizer["Visits"]</th>
|
|
<th>@Localizer["Visited"]</th>
|
|
<th>@Localizer["Created"]</th>
|
|
</Header>
|
|
<Row>
|
|
<td><ActionLink Action="Detail" Parameters="@($"id=" + context.VisitorId.ToString())" ResourceKey="Details" /></td>
|
|
<td>@context.IPAddress</td>
|
|
<td>
|
|
@if (context.UserId != null)
|
|
{
|
|
@context.User.DisplayName
|
|
}
|
|
</td>
|
|
<td>@context.Language</td>
|
|
<td>@context.Visits</td>
|
|
<td>@context.VisitedOn</td>
|
|
<td>@context.CreatedOn</td>
|
|
</Row>
|
|
</Pager>
|
|
</TabPanel>
|
|
<TabPanel Name="Settings" Heading="Settings" ResourceKey="Settings">
|
|
<div class="container">
|
|
<div class="row mb-1 align-items-center">
|
|
<Label Class="col-sm-3" For="tracking" HelpText="Specify if visitor tracking is enabled" ResourceKey="Tracking">Tracking Enabled? </Label>
|
|
<div class="col-sm-9">
|
|
<select id="tracking" class="form-select" @bind="@_tracking" >
|
|
<option value="True">@SharedLocalizer["Yes"]</option>
|
|
<option value="False">@SharedLocalizer["No"]</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<div class="row mb-1 align-items-center">
|
|
<Label Class="col-sm-3" For="filter" HelpText="Comma delimited list of terms which may exist in IP addresses, user agents, or languages which identify visitors which should not be tracked (ie. bots)" ResourceKey="Filter">Filter: </Label>
|
|
<div class="col-sm-9">
|
|
<textarea id="filter" class="form-control" @bind="@_filter" rows="3"></textarea>
|
|
</div>
|
|
</div>
|
|
<div class="row mb-1 align-items-center">
|
|
<Label Class="col-sm-3" For="retention" HelpText="Number of days of visitor activity to retain" ResourceKey="Retention">Retention (Days): </Label>
|
|
<div class="col-sm-9">
|
|
<input id="retention" class="form-control" @bind="@_retention" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<br />
|
|
<button type="button" class="btn btn-success" @onclick="SaveSiteSettings">@SharedLocalizer["Save"]</button>
|
|
</TabPanel>
|
|
</TabStrip>
|
|
}
|
|
|
|
@code {
|
|
private bool _users = false;
|
|
private int _days = 1;
|
|
private List<Visitor> _visitors;
|
|
private string _tracking;
|
|
private string _filter = "";
|
|
private string _retention = "";
|
|
|
|
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
|
|
|
|
protected override async Task OnParametersSetAsync()
|
|
{
|
|
await GetVisitors();
|
|
_tracking = PageState.Site.VisitorTracking.ToString();
|
|
_filter = SettingService.GetSetting(PageState.Site.Settings, "VisitorFilter", "");
|
|
_retention = SettingService.GetSetting(PageState.Site.Settings, "VisitorRetention", "30");
|
|
}
|
|
|
|
private async void TypeChanged(ChangeEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
_users = bool.Parse(e.Value.ToString());
|
|
await GetVisitors();
|
|
StateHasChanged();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await logger.LogError(ex, "Error On TypeChanged");
|
|
}
|
|
}
|
|
|
|
private async void DateChanged(ChangeEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
_days = int.Parse(e.Value.ToString());
|
|
await GetVisitors();
|
|
StateHasChanged();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await logger.LogError(ex, "Error On DateChanged");
|
|
}
|
|
}
|
|
|
|
private async Task GetVisitors()
|
|
{
|
|
_visitors = await VisitorService.GetVisitorsAsync(PageState.Site.SiteId, DateTime.UtcNow.AddDays(-_days));
|
|
if (_users)
|
|
{
|
|
_visitors = _visitors.Where(item => item.UserId != null).ToList();
|
|
}
|
|
}
|
|
|
|
private async Task SaveSiteSettings()
|
|
{
|
|
try
|
|
{
|
|
var site = PageState.Site;
|
|
site.VisitorTracking = bool.Parse(_tracking);
|
|
await SiteService.UpdateSiteAsync(site);
|
|
|
|
var settings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId);
|
|
settings = SettingService.SetSetting(settings, "VisitorFilter", _filter, true);
|
|
settings = SettingService.SetSetting(settings, "VisitorRetention", _retention, true);
|
|
await SettingService.UpdateSiteSettingsAsync(settings, PageState.Site.SiteId);
|
|
|
|
AddModuleMessage(Localizer["Success.SaveSiteSettings"], MessageType.Success);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await logger.LogError(ex, "Error Saving Site Settings {Error}", ex.Message);
|
|
AddModuleMessage(Localizer["Error.SaveSiteSettings"], MessageType.Error);
|
|
}
|
|
}
|
|
}
|