mirror of
https://github.com/bitwarden/server.git
synced 2026-01-31 14:13:18 +08:00
* [AC-1637] Added HtmlEncodingStringConverter to encode/decode special chars on JSON serialization/deserialization
* [AC-1637] Added unit tests for HtmlEncodingStringConverter
* [AC-1637] Moved expected values on unit tests to the arrange phase
* [AC-1637] Added HtmlEncodingStringConverter to properties that are for input/output of Org Name and Business name
* [AC-1637] Modified views in Admin project to decode values to display
* [AC-1637] Replaced Html.Raw with HttpUtility.HtmlDecode
* [AC-1637] Added JsonConverter to Provider DTOs
* [AC-1637] Modified HandlebarsMailService to decode organization name before sending emails
* Revert "[AC-1637] Added JsonConverter to Provider DTOs"
This reverts commit 94d507cf93.
* [AC-1637] Fixed Admin panel organization search
* [AC-1637] Sanitizing Organization name and business name on creation in Admin panel
* [AC-1637] Sanitizing organization name and business name on creation by a provider
* [AC-1637] Sanitizing provider name on creation and on viewing in admin panel
* [AC-1637] Added sanitization to more places where Org name is used
* [AC-1637] Swapped using HttpUtility for WebUtility since the later is part of the dotnet framework
* [AC-1637] Updated error messages
* [AC-1637] Decoding on Admin panel add existing organization
* [AC-1637] Fix HTML decoding issues
* [AC-1637] Refactor HTML decoding in View and Model classes on Admin panel
* [AC-1637] Refactor provider name and business name usages to use methods that output decoded values
* [AC-1637] Fixed typo
* [AC-1637] Renamed Provider methods to retrieve Decoded Name and BusinessName
* [AC-1637] Renamed Organization methods to retrieve Decoded Name and BusinessName
* [AC-1637] Update the display name method in the `ProviderOrganizationOrganizationDetails` class to `DisplayName()`
141 lines
5.6 KiB
Plaintext
141 lines
5.6 KiB
Plaintext
@model OrganizationsModel
|
|
@{
|
|
ViewData["Title"] = "Organizations";
|
|
}
|
|
|
|
<h1>Organizations</h1>
|
|
|
|
<form class="form-inline mb-2" method="get">
|
|
<label class="sr-only" asp-for="Name">Name</label>
|
|
<input type="text" class="form-control mb-2 mr-2" placeholder="Name" asp-for="Name" name="name">
|
|
<label class="sr-only" asp-for="UserEmail">User email</label>
|
|
<input type="text" class="form-control mb-2 mr-2" placeholder="User email" asp-for="UserEmail" name="userEmail">
|
|
@if(!Model.SelfHosted)
|
|
{
|
|
<label class="sr-only" asp-for="Paid">Customer</label>
|
|
<select class="form-control mb-2 mr-2" asp-for="Paid" name="paid">
|
|
<option asp-selected="!Model.Paid.HasValue" value="">-- Customer --</option>
|
|
<option asp-selected="Model.Paid.GetValueOrDefault(false)" value="true">Paid</option>
|
|
<option asp-selected="!Model.Paid.GetValueOrDefault(true)" value="false">Freeloader</option>
|
|
</select>
|
|
}
|
|
<button type="submit" class="btn btn-primary mb-2" title="Search"><i class="fa fa-search"></i> Search</button>
|
|
</form>
|
|
|
|
<div class="table-responsive">
|
|
<table class="table table-striped table-hover">
|
|
<thead>
|
|
<tr>
|
|
<th>Name</th>
|
|
<th style="width: 190px;">Plan</th>
|
|
<th style="width: 80px;">Seats</th>
|
|
<th style="width: 150px;">Created</th>
|
|
<th style="width: 170px; min-width: 170px;">Details</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
@if(!Model.Items.Any())
|
|
{
|
|
<tr>
|
|
<td colspan="5">No results to list.</td>
|
|
</tr>
|
|
}
|
|
else
|
|
{
|
|
@foreach(var org in Model.Items)
|
|
{
|
|
<tr>
|
|
<td>
|
|
<a asp-action="@Model.Action" asp-route-id="@org.Id">@org.DisplayName()</a>
|
|
</td>
|
|
<td>
|
|
@org.Plan
|
|
</td>
|
|
<td>
|
|
@org.Seats
|
|
</td>
|
|
<td>
|
|
<span title="@org.CreationDate.ToString()">
|
|
@org.CreationDate.ToShortDateString()
|
|
</span>
|
|
</td>
|
|
<td>
|
|
@if(!Model.SelfHosted)
|
|
{
|
|
if(!string.IsNullOrWhiteSpace(org.GatewaySubscriptionId))
|
|
{
|
|
<i class="fa fa-usd fa-lg fa-fw" title="Paid"></i>
|
|
}
|
|
else
|
|
{
|
|
<i class="fa fa-smile-o fa-lg fa-fw text-muted" title="Freeloader"></i>
|
|
}
|
|
}
|
|
@if(org.MaxStorageGb.HasValue && org.MaxStorageGb > 1)
|
|
{
|
|
<i class="fa fa-plus-square fa-lg fa-fw"
|
|
title="Additional Storage, @(org.MaxStorageGb - 1) GB"></i>
|
|
}
|
|
else
|
|
{
|
|
<i class="fa fa-plus-square-o fa-lg fa-fw text-muted"
|
|
title="No Additional Storage"></i>
|
|
}
|
|
@if(org.Enabled)
|
|
{
|
|
<i class="fa fa-check-circle fa-lg fa-fw"
|
|
title="Enabled, expires @(org.ExpirationDate?.ToShortDateString() ?? "-")"></i>
|
|
}
|
|
else
|
|
{
|
|
<i class="fa fa-times-circle-o fa-lg fa-fw text-muted" title="Disabled"></i>
|
|
}
|
|
@if(org.TwoFactorIsEnabled())
|
|
{
|
|
<i class="fa fa-lock fa-lg fa-fw" title="2FA Enabled"></i>
|
|
}
|
|
else
|
|
{
|
|
<i class="fa fa-unlock fa-lg fa-fw text-muted" title="2FA Not Enabled"></i>
|
|
}
|
|
</td>
|
|
</tr>
|
|
}
|
|
}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<nav>
|
|
<ul class="pagination">
|
|
@if(Model.PreviousPage.HasValue)
|
|
{
|
|
<li class="page-item">
|
|
<a class="page-link" asp-action="Index" asp-route-page="@Model.PreviousPage.Value"
|
|
asp-route-count="@Model.Count" asp-route-userEmail="@Model.UserEmail"
|
|
asp-route-name="@Model.Name" asp-route-paid="@Model.Paid">Previous</a>
|
|
</li>
|
|
}
|
|
else
|
|
{
|
|
<li class="page-item disabled">
|
|
<a class="page-link" href="#" tabindex="-1">Previous</a>
|
|
</li>
|
|
}
|
|
@if(Model.NextPage.HasValue)
|
|
{
|
|
<li class="page-item">
|
|
<a class="page-link" asp-action="Index" asp-route-page="@Model.NextPage.Value"
|
|
asp-route-count="@Model.Count" asp-route-userEmail="@Model.UserEmail"
|
|
asp-route-name="@Model.Name" asp-route-paid="@Model.Paid">Next</a>
|
|
</li>
|
|
}
|
|
else
|
|
{
|
|
<li class="page-item disabled">
|
|
<a class="page-link" href="#" tabindex="-1">Next</a>
|
|
</li>
|
|
}
|
|
</ul>
|
|
</nav>
|