added docs for admin pages and blazor pages + fixed typos
This commit is contained in:
@@ -8,6 +8,6 @@
|
|||||||
- [x] Repositories usage
|
- [x] Repositories usage
|
||||||
- [x] AuthService usage
|
- [x] AuthService usage
|
||||||
- [x] AuthMiddleware usage
|
- [x] AuthMiddleware usage
|
||||||
- [ ] AdminPages usage
|
- [x] AdminPages usage
|
||||||
- [x] Endpoints usage
|
- [x] Endpoints usage
|
||||||
- [ ] Blazor pages usage
|
- [x] Blazor pages usage
|
||||||
|
|||||||
@@ -8,14 +8,14 @@ HopFrame currently only supports endpoints for authentication out of the box.
|
|||||||
> **Hint:** you can use the build-in [swagger](https://swagger.io/) ui to explore and test all endpoints of your application __including__ HopFrame endpoints.
|
> **Hint:** you can use the build-in [swagger](https://swagger.io/) ui to explore and test all endpoints of your application __including__ HopFrame endpoints.
|
||||||
|
|
||||||
### SecurityController
|
### SecurityController
|
||||||
Base endpoint: `api/v1/authentication`\
|
Base endpoint: `/api/v1/authentication`\
|
||||||
**Important:** All primitive data types (including `string`) are return as a [`SingleValueResult`](./models.md#SingleValueResult)
|
**Important:** All primitive data types (including `string`) are return as a [`SingleValueResult`](./models.md#SingleValueResult)
|
||||||
|
|
||||||
|
|
||||||
| Method | Endpoint | Payload | Returns |
|
| Method | Endpoint | Payload | Returns |
|
||||||
| ------ | -------- | ------- | ------- |
|
|--------|---------------|--------------------------------------------------------------|-----------------------|
|
||||||
| PUT | login | [UserLogin](./models.md#UserLogin) | access token (string) |
|
| PUT | /login | [UserLogin](./models.md#UserLogin) | access token (string) |
|
||||||
| POST | register | [UserRegister](./models#UserRegister) | access token (string) |
|
| POST | /register | [UserRegister](./models#UserRegister) | access token (string) |
|
||||||
| GET | authenticate | | access token (string) |
|
| GET | /authenticate | | access token (string) |
|
||||||
| DELETE | logout | | |
|
| DELETE | /logout | | |
|
||||||
| DELETE | delete | [UserPasswordValidation](./models.md#UserPasswordValidation) | |
|
| DELETE | /delete | [UserPasswordValidation](./models.md#UserPasswordValidation) | |
|
||||||
|
|||||||
@@ -1,2 +1,133 @@
|
|||||||
# HopFrame Admin Pages
|
# HopFrame Admin Pages
|
||||||
|
Admin pages can be defined through a `AdminContext` similar to how a `DbContext` is defined. They generate administration pages like [`/administration/users`](./pages.md)
|
||||||
|
simply by reading the structure of the provided model and optionally some additional configuration.
|
||||||
|
|
||||||
|
> **Fun fact:** The already existing pages `/administration/users` and `/administration/groups` are also generated using an internal `AdminContext`.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
1. Create a class that inherits the `AdminPagesContext` base class
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
public class AdminContext : AdminPagesContext {
|
||||||
|
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Add your admin pages as properties to the class
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
public class AdminContext : AdminPagesContext {
|
||||||
|
|
||||||
|
public AdminPage<Address> Addresses { get; set; }
|
||||||
|
|
||||||
|
public AdminPage<Employee> Employees { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Optionally** you can further configure your pages in the `OnModelCreating` method
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
public class AdminContext : AdminPagesContext {
|
||||||
|
|
||||||
|
public AdminPage<Address> Addresses { get; set; }
|
||||||
|
public AdminPage<Employee> Employees { get; set; }
|
||||||
|
|
||||||
|
public override void OnModelCreating(IAdminContextGenerator generator) {
|
||||||
|
base.OnModelCreating(generator);
|
||||||
|
|
||||||
|
generator.Page<Employee>()
|
||||||
|
.Property(e => e.Address)
|
||||||
|
.IsSelector();
|
||||||
|
|
||||||
|
generator.Page<Address>()
|
||||||
|
.Property(a => a.Employee)
|
||||||
|
.Ignore();
|
||||||
|
|
||||||
|
generator.Page<Address>()
|
||||||
|
.Property(a => a.AddressId)
|
||||||
|
.IsSelector<Employee>()
|
||||||
|
.Parser<Employee>((model, e) => model.AddressId = e.EmployeeId);
|
||||||
|
|
||||||
|
generator.Page<Employee>()
|
||||||
|
.ConfigureRepository<EmployeeProvider>()
|
||||||
|
.ListingProperty(e => e.Name);
|
||||||
|
|
||||||
|
generator.Page<Address>()
|
||||||
|
.ConfigureRepository<AddressProvider>()
|
||||||
|
.ListingProperty(a => a.City);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
4. **Optionally** you can also add some of the following attributes to your classes / properties to further configure the admin pages:\
|
||||||
|
\
|
||||||
|
Attributes for classes:
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
[AttributeUsage(AttributeTargets.Class)]
|
||||||
|
public sealed class AdminButtonConfigAttribute(bool showCreateButton = true, bool showDeleteButton = true, bool showUpdateButton = true) : Attribute {
|
||||||
|
public bool ShowCreateButton { get; set; } = showCreateButton;
|
||||||
|
public bool ShowDeleteButton { get; set; } = showDeleteButton;
|
||||||
|
public bool ShowUpdateButton { get; set; } = showUpdateButton;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
[AttributeUsage(AttributeTargets.Class)]
|
||||||
|
public sealed class AdminPermissionsAttribute(string view = null, string create = null, string update = null, string delete = null) : Attribute {
|
||||||
|
public AdminPagePermissions Permissions { get; set; } = new() {
|
||||||
|
Create = create,
|
||||||
|
Update = update,
|
||||||
|
Delete = delete,
|
||||||
|
View = view
|
||||||
|
};
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
[AttributeUsage(AttributeTargets.Class)]
|
||||||
|
public class AdminUrlAttribute(string url) : Attribute {
|
||||||
|
public string Url { get; set; } = url;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Attributes for properties:
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
[AttributeUsage(AttributeTargets.Property)]
|
||||||
|
public sealed class AdminHideValueAttribute : Attribute;
|
||||||
|
```
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
[AttributeUsage(AttributeTargets.Property)]
|
||||||
|
public sealed class AdminIgnoreAttribute(bool onlyForListing = false) : Attribute {
|
||||||
|
public bool OnlyForListing { get; set; } = onlyForListing;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
[AttributeUsage(AttributeTargets.Property)]
|
||||||
|
public sealed class AdminPrefixAttribute(string prefix) : Attribute {
|
||||||
|
public string Prefix { get; set; } = prefix;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
[AttributeUsage(AttributeTargets.Property)]
|
||||||
|
public sealed class AdminUneditableAttribute : Attribute;
|
||||||
|
```
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
[AttributeUsage(AttributeTargets.Property)]
|
||||||
|
public class AdminUniqueAttribute : Attribute;
|
||||||
|
```
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
[AttributeUsage(AttributeTargets.Property)]
|
||||||
|
public sealed class AdminUnsortableAttribute : Attribute;
|
||||||
|
```
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
[AttributeUsage(AttributeTargets.Property)]
|
||||||
|
public sealed class ListingPropertyAttribute : Attribute;
|
||||||
|
```
|
||||||
|
|||||||
@@ -15,6 +15,6 @@ public interface IAuthService {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
## Automatically refresh user sessions
|
## Automatically refresh user sessions
|
||||||
1. Make sure you have implementented the `AuthMiddleware` how it's described in step 5 of the [installation](./installation.md).
|
1. Make sure you have implemented the `AuthMiddleware` how it's described in step 5 of the [installation](./installation.md).
|
||||||
|
|
||||||
2. After that, the access token of the user gets automatically refreshed as long as the refresh token is valid.
|
2. After that, the access token of the user gets automatically refreshed as long as the refresh token is valid.
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
# HopFrame Pages
|
||||||
|
By default, the HopFrame provides some blazor pages for managing user accounts and permissions
|
||||||
|
|
||||||
|
## All currently supported blazor pages
|
||||||
|
|
||||||
|
| Page | Endpoint | Permission | Usage |
|
||||||
|
|-----------------|------------------------|----------------------------|--------------------------------------------------------------------------------------------------------|
|
||||||
|
| Admin Dashboard | /administration | hopframe.admin | This page provides an overview to all admin pages built-in and created by [AdminContexts](./admin.md). |
|
||||||
|
| Admin Login | /administration/login | | This page is a simple login screen so no login screen needs to be created to access the admin pages. |
|
||||||
|
| User Dashboard | /administration/users | hopframe.admin.users.view | This page serves as a management site for all users and their permissions. |
|
||||||
|
| Group Dashboard | /administration/groups | hopframe.admin.groups.view | This page serves as a management site for all groups and their permissions. |
|
||||||
|
|
||||||
|
> **Hint:** All pages created by [AdminContexts](./admin.md) are also under the `/administration/` location. This can unfortunately __not__ be changed at the moment.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user