Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions 3-Aquiis.UI.Shared/wwwroot/js/theme.js
Original file line number Diff line number Diff line change
Expand Up @@ -115,9 +115,9 @@ if (typeof localStorage !== "undefined") {

// Start observing after a short delay to let Blazor initialize
setTimeout(() => {
observer.observe(document.body, {
childList: true,
subtree: true,
observer.observe(document.documentElement, {
attributes: true,
attributeFilter: ["data-bs-theme", "data-brand-theme"],
});
}, 1000);

Expand Down
8 changes: 4 additions & 4 deletions 4-Aquiis.SimpleStart/Aquiis.SimpleStart.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@
<MigrationsDirectory>Data/Migrations</MigrationsDirectory>

<!-- Semantic Versioning -->
<Version>1.1.0</Version>
<AssemblyVersion>1.1.0.0</AssemblyVersion>
<FileVersion>1.1.0.0</FileVersion>
<InformationalVersion>1.1.0</InformationalVersion>
<Version>1.1.1</Version>
<AssemblyVersion>1.1.1.0</AssemblyVersion>
<FileVersion>1.1.1.0</FileVersion>
<InformationalVersion>1.1.1</InformationalVersion>
</PropertyGroup>

<ItemGroup>
Expand Down
4 changes: 2 additions & 2 deletions 4-Aquiis.SimpleStart/ElectronHostHook/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion 4-Aquiis.SimpleStart/ElectronHostHook/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "aquiis-simplestart-electron",
"version": "1.0.0",
"version": "1.1.1",
"description": "Aquiis SimpleStart Electron Host",
"main": "main.js",
"dependencies": {
Expand Down
5 changes: 3 additions & 2 deletions 4-Aquiis.SimpleStart/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -745,9 +745,10 @@
Height = 900,
MinWidth = 800,
MinHeight = 600,
Show = false
Show = false,
AutoHideMenuBar = true
Comment on lines +748 to +749
Copy link

Copilot AI Feb 28, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AutoHideMenuBar = true and window.RemoveMenu() are overlapping approaches (auto-hide vs removing the menu entirely). Consider choosing one to avoid confusion and keep behavior consistent across platforms; if the intent is to fully remove the menu, AutoHideMenuBar becomes redundant.

Suggested change
Show = false,
AutoHideMenuBar = true
Show = false

Copilot uses AI. Check for mistakes.
});

window.RemoveMenu();
window.OnReadyToShow += () => window.Show();
window.SetTitle("Aquiis Property Management");

Expand Down
54 changes: 16 additions & 38 deletions 4-Aquiis.SimpleStart/README.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
# Aquiis - Property Management System

![.NET 9.0](https://img.shields.io/badge/.NET-9.0-blue)
![ASP.NET Core](https://img.shields.io/badge/ASP.NET%20Core-9.0-blueviolet)
![.NET 10.0](https://img.shields.io/badge/.NET-10.0-blue)
![ASP.NET Core](https://img.shields.io/badge/ASP.NET%20Core-10.0-blueviolet)
![Blazor Server](https://img.shields.io/badge/Blazor-Server-orange)
![Entity Framework](https://img.shields.io/badge/Entity%20Framework-9.0-green)
![Entity Framework](https://img.shields.io/badge/Entity%20Framework-10.0-green)
![SQLite](https://img.shields.io/badge/Database-SQLite-lightblue)

A comprehensive web-based property management system built with ASP.NET Core 9.0 and Blazor Server. Aquiis streamlines rental property management for property owners, managers, and tenants with an intuitive interface and robust feature set.
A comprehensive web-based property management system built with ASP.NET Core 10.0 and Blazor Server. Aquiis streamlines rental property management for property owners and managers with an intuitive interface and robust feature set.

## 🏢 Overview

Aquiis is designed to simplify property management operations through a centralized platform that handles everything from property listings and tenant management to lease tracking and document storage. Built with modern web technologies, it provides a responsive, secure, and scalable solution for property management professionals.
Aquiis is designed to simplify property management operations through a centralized platform that handles everything from property, tenant, and lease tracking to document storage and rental invoice and expense tracking. Built with modern web technologies including AI (GitHub Copilot and Claude Sonnet), it provides a responsive, secure, and scalable solution for DIY landlords and property managers.

## ✨ Key Features

Expand All @@ -28,17 +28,15 @@ Aquiis is designed to simplify property management operations through a centrali
- **Tenant Profiles** - Complete tenant information management
- **Contact Management** - Phone, email, emergency contacts
- **Tenant History** - Track tenant interactions and lease history
- **Tenant Portal** - Dedicated tenant dashboard and self-service features
- **Communication Tools** - Built-in messaging and notification system
- **Tenant Screening** - Application and background check workflow

### 📄 Lease Management

- **Lease Creation** - Digital lease agreement generation
- **Lease Tracking** - Active, pending, expired, and terminated lease monitoring
- **Rent Tracking** - Monthly rent amounts and payment schedules
- **Security Deposits** - Deposit tracking and management
- **Lease Renewals** - Automated renewal notifications and processing
- **Lease Renewals** - Manual lease renewal tracking
- **Terms Management** - Flexible lease terms and conditions

### 💰 Financial Management
Expand All @@ -54,14 +52,10 @@ Aquiis is designed to simplify property management operations through a centrali

- **File Storage** - Secure document upload and storage
- **Document Categories** - Organized by type (leases, receipts, photos, etc.)
- **Version Control** - Document revision tracking
- **Digital Signatures** - Electronic signature support
- **Document Sharing** - Secure document sharing with tenants
- **Bulk Operations** - Mass document upload and organization

### 🔐 User Management & Security

- **Role-Based Access** - Administrator, Property Manager, and Tenant roles
- **Role-Based Access** - Administrator and Property Manager roles
- **Authentication** - Secure login with ASP.NET Core Identity
- **User Profiles** - Comprehensive user account management
- **Permission Management** - Granular access control
Expand All @@ -80,9 +74,9 @@ Aquiis is designed to simplify property management operations through a centrali

### Backend

- **Backend**: ASP.NET Core 9.0
- **Backend**: ASP.NET Core 10.0
- **UI Framework**: Blazor Server
- **Database**: SQLite with Entity Framework Core 9.0
- **Database**: SQLite with Entity Framework Core 10.0
- **Authentication**: ASP.NET Core Identity
- **Architecture**: Clean Architecture with vertical slice organization

Expand All @@ -101,10 +95,11 @@ Aquiis is designed to simplify property management operations through a centrali
- **Version Control**: Git with GitHub integration
- **Package Management**: NuGet
- **Build System**: .NET SDK build system
- **AI Assisted Coding**: GitHub Copilot, Claude Sonnet, GPT

## 📋 Prerequisites

- [.NET 9.0 SDK](https://dotnet.microsoft.com/download/dotnet/9.0)
- [.NET 10.0 SDK](https://dotnet.microsoft.com/download/dotnet/10.0)
- [Git](https://git-scm.com/)
- [Visual Studio Code](https://code.visualstudio.com/) (recommended) or Visual Studio 2022
- [C# Dev Kit Extension](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit) for VS Code
Expand Down Expand Up @@ -318,7 +313,7 @@ Shared → Core

## 🔑 Default User Roles

The system includes three primary user roles:
The system includes two primary user roles:

Comment on lines 314 to 317
Copy link

Copilot AI Feb 28, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This README now states there are only two primary roles (Administrator, Property Manager), but the SimpleStart UI/codebase still references additional roles (e.g., Owner in NavMenu and Tenant in at least one page’s [OrganizationAuthorize]). Please update this section to reflect the actual roles supported by the app (or remove/retire those roles in code if they’re no longer valid).

Copilot uses AI. Check for mistakes.
### Administrator

Expand All @@ -335,14 +330,6 @@ The system includes three primary user roles:
- Financial tracking
- Document management

### Tenant

- Personal dashboard
- Lease information access
- Payment history
- Maintenance requests
- Document viewing

## 🎯 Key Components

### Property Management Service
Expand Down Expand Up @@ -391,14 +378,6 @@ Core business logic service in the Application layer:
- Administrative quick actions
- Recent system activity

### Tenant Dashboard

- Personal lease information
- Payment history
- Maintenance requests
- Document access
- Communication center

## 🔧 Configuration

### Application Settings
Expand All @@ -422,7 +401,7 @@ Configuration is managed through:

### Prerequisites for Production

- Windows/Linux server with .NET 9.0 runtime
- Windows/Linux server with .NET 10.0 runtime
- IIS or reverse proxy (nginx/Apache)
- SSL certificate for HTTPS
- Database server (or SQLite for smaller deployments)
Expand Down Expand Up @@ -474,7 +453,7 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
### Common Issues

1. **Database Connection Issues**: Verify SQLite file permissions and path
2. **Build Errors**: Ensure .NET 9.0 SDK is installed
2. **Build Errors**: Ensure .NET 10.0 SDK is installed
3. **Authentication Problems**: Check Identity configuration and user roles
4. **Performance Issues**: Review database indexing and query optimization

Expand All @@ -487,14 +466,13 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file

## 🏗️ Roadmap

### Upcoming Features
### Upcoming Features via Aquiis Professional

- Mobile application support
- Advanced reporting and analytics
- Integration with accounting software
- Automated rent collection
- Multi-language support
- Advanced tenant screening
- IoT device integration
- API for third-party integrations

Expand All @@ -510,4 +488,4 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file

**Aquiis** - Streamlining Property Management for the Modern World

Built with ❤️ using ASP.NET Core 9.0 and Blazor Server
Built with ❤️ using ASP.NET Core 10.0, Blazor Server, and AI Tools (GitHub Copilot and Claude Sonnet)
65 changes: 45 additions & 20 deletions 4-Aquiis.SimpleStart/Shared/Components/Account/Pages/Login.razor
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,17 @@
</label>
</div>
<div>
<button type="submit" class="w-100 btn btn-lg btn-primary">Log in</button>
<button type="submit" class="w-100 btn btn-lg btn-primary" disabled="@isSubmitting">
@if (isSubmitting)
{
<span class="spinner-border spinner-border-sm me-2" role="status" aria-hidden="true"></span>
<span>Logging in...</span>
}
else
{
<span>Log in</span>
}
</button>
</div>
<div>
<p>
Expand All @@ -66,6 +76,7 @@

@code {
private string? errorMessage;
private bool isSubmitting = false;

[CascadingParameter]
private HttpContext HttpContext { get; set; } = default!;
Expand Down Expand Up @@ -103,28 +114,42 @@

public async Task LoginUser()
{
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, set lockoutOnFailure: true
var result = await SignInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
Logger.LogInformation("User logged in.");
RedirectManager.RedirectTo(ReturnUrl);
}
else if (result.RequiresTwoFactor)
{
RedirectManager.RedirectTo(
"Account/LoginWith2fa",
new() { ["returnUrl"] = ReturnUrl, ["rememberMe"] = Input.RememberMe });
}
else if (result.IsLockedOut)
// Prevent double submission
if (isSubmitting)
return;

try
{
Logger.LogWarning("User account locked out.");
RedirectManager.RedirectTo("Account/Lockout");
isSubmitting = true;
errorMessage = null;

// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, set lockoutOnFailure: true
var result = await SignInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
Logger.LogInformation("User logged in.");
RedirectManager.RedirectTo(ReturnUrl);
}
else if (result.RequiresTwoFactor)
{
RedirectManager.RedirectTo(
"Account/LoginWith2fa",
new() { ["returnUrl"] = ReturnUrl, ["rememberMe"] = Input.RememberMe });
}
else if (result.IsLockedOut)
{
Logger.LogWarning("User account locked out.");
RedirectManager.RedirectTo("Account/Lockout");
}
else
{
errorMessage = "Error: Invalid login attempt.";
}
}
else
finally
{
errorMessage = "Error: Invalid login attempt.";
isSubmitting = false;
}
}

Expand Down
10 changes: 8 additions & 2 deletions 4-Aquiis.SimpleStart/Shared/Layout/NavMenu.razor
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@

<input type="checkbox" title="Navigation menu" class="navbar-toggler" />

<div class="nav-scrollable" onclick="document.querySelector('.navbar-toggler').click()">
<div class="nav-scrollable">
Copy link

Copilot AI Feb 28, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removing the inline click handler from .nav-scrollable means the hamburger/checkbox menu will no longer auto-collapse after selecting a nav item on small screens. If the auto-close behavior is still desired, consider implementing it in a more targeted way (e.g., close the toggler on NavLink click/navigation) rather than dropping it entirely.

Suggested change
<div class="nav-scrollable">
<div class="nav-scrollable" onclick="var t = document.querySelector('.navbar-toggler'); if (t) t.checked = false;">

Copilot uses AI. Check for mistakes.
<nav class="nav flex-column">

<OrganizationAuthorizeView Roles="Owner,Administrator">
Expand Down Expand Up @@ -336,7 +336,13 @@

private async void OnLocationChanged(object? sender, LocationChangedEventArgs e)
{
currentUrl = NavigationManager.ToBaseRelativePath(e.Location);
var newUrl = NavigationManager.ToBaseRelativePath(e.Location);

// Only update if URL actually changed (prevents visual glitch on same-link clicks)
if (newUrl == currentUrl)
return;

currentUrl = newUrl;

// Re-apply current theme and brand theme after navigation
try
Expand Down
2 changes: 1 addition & 1 deletion 4-Aquiis.SimpleStart/appsettings.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
"ApplicationSettings": {
"AppName": "Aquiis",
"ProductName": "Aquiis SimpleStart",
"Version": "1.1.0",
"Version": "1.1.1",
"Author": "CIS Guru",
"Email": "cisguru@outlook.com",
"Repository": "https://github.com/xnodeoncode/Aquiis",
Expand Down
2 changes: 1 addition & 1 deletion 4-Aquiis.SimpleStart/electron.manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
"appId": "com.aquiis.propertymanagement",
"productName": "Aquiis",
"copyright": "Copyright © 2026",
"buildVersion": "1.1.0",
"buildVersion": "1.1.1",
"compression": "normal",
"directories": {
"output": "../../../bin/Desktop"
Expand Down
Loading