Skip to content
Merged

Dev #2616

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
f9f5188
AB#33333 tenant creation improvements
AndreGAot Jun 4, 2026
b3f182d
Merge remote-tracking branch 'origin/dev' into feature/AB#33333-tenan…
AndreGAot Jun 5, 2026
90f6eba
AB#333333 encrypted tenant connection strings
AndreGAot Jun 5, 2026
98bbc4c
Merge branch 'feature/AB#33333-tenant-creation-updates' into feature/…
AndreGAot Jun 5, 2026
b2b688d
AB#33309 onboarding WIP
AndreGAot Jun 12, 2026
147c143
AB#33309 further enhancements for filtering and validations
AndreGAot Jun 18, 2026
52fe3d0
AB#33309 update unit tests
AndreGAot Jun 19, 2026
d1ae2c5
Merge remote-tracking branch 'origin/dev' into feature/AB#33309-onboa…
AndreGAot Jun 19, 2026
543e49e
AB#33309 more improvements to onboarding
AndreGAot Jun 19, 2026
f0cc6b1
AB#33309 multiversion dynamic columns
AndreGAot Jun 22, 2026
0931a3d
Merge remote-tracking branch 'origin/dev' into feature/AB#33309-onboa…
AndreGAot Jun 22, 2026
f74ed2f
Potential fix for pull request finding 'CodeQL / DOM text reinterpret…
AndreGAot Jun 22, 2026
9775623
AB#33309 address sonarqube feedback
AndreGAot Jun 22, 2026
7cef12d
Merge branch 'feature/AB#33309-onboarding-requests' of https://github…
AndreGAot Jun 22, 2026
d45ebef
AB#33309 address more sonarqube feedback
AndreGAot Jun 22, 2026
8420f07
AB#33309 more SQ feedback
AndreGAot Jun 22, 2026
f0bf0fc
AB#33309 migrator fix and code review fixes
AndreGAot Jun 22, 2026
45ce4d5
AB#33309 more sonarqube
AndreGAot Jun 23, 2026
53395cf
AB#33309 adjust scroll and layout of tenants list
AndreGAot Jun 23, 2026
f7fc950
AB#33309 sonarqube fix
AndreGAot Jun 23, 2026
a48910b
AB#33309 more sonarQube
AndreGAot Jun 23, 2026
e6b7546
AB#33309 fix reload call
AndreGAot Jun 23, 2026
620bff0
AB#33309 make sure pattern matching used for plain connection string …
AndreGAot Jun 24, 2026
1387ae6
AB#33573 - [UI] "Notifications" page layout issue
hasanpour Jun 25, 2026
d955a96
Merge pull request #2600 from bcgov/bugfix/AB#33573-Notifications-pag…
hasanpour Jun 25, 2026
6d700d5
AB#29743: Upgrade ECharts Library
aurelio-aot Jun 25, 2026
7d0f154
feature/AB#24674-FixBundleCall-MissingJs
JamesPasta Jun 25, 2026
d4428f1
AB#29743: Add Select/Deselect All Buttons in Dashboard dropdowns
aurelio-aot Jun 25, 2026
033d13a
Merge pull request #2602 from bcgov/feature/AB#24674-ScheduledEmails
JamesPasta Jun 25, 2026
7bbadd4
AB#29743: Improve Styling of Select/Deselect buttons
aurelio-aot Jun 25, 2026
d1dc45e
AB#33396 update fallback for missing FormSchema on submission
AndreGAot Jun 25, 2026
d8d254e
Merge pull request #2604 from bcgov/bugfix/AB#33396-report-config-ver…
AndreGAot Jun 25, 2026
59e3da1
AB#33509 - Labeled scheduled emails on Notification List
hasanpour Jun 25, 2026
b336add
AB#33509 - Removed dead draft method and isDraft from date job and ev…
hasanpour Jun 26, 2026
71cb6b0
AB#33509 - Fixed issues raised by Copilot.
hasanpour Jun 26, 2026
8b5fdaa
AB#33641 task to update Unity.NginxData configuration
DarylTodosichuk Jun 26, 2026
eeec644
Merge pull request #2607 from bcgov/feature/AB#33641-Remove-UAP-Stati…
DarylTodosichuk Jun 26, 2026
4e0ca16
AB#33459 Draft application external dependency documents
DarylTodosichuk Jun 26, 2026
cbaa53f
AB#33641 bugfix missing BCSans fonts add favicon.ico
DarylTodosichuk Jun 26, 2026
39eb6c4
Merge pull request #2609 from bcgov/feature/AB#33641-Remove-UAP-Stati…
DarylTodosichuk Jun 26, 2026
524cbbc
AB#33632: Bugfix - Error On Resync of Submission Attachments
aurelio-aot Jun 26, 2026
17e7e73
AB#32921 update scripts for configuration management page
AndreGAot Jun 26, 2026
208a49e
Merge pull request #2614 from bcgov/bugfix/AB#32921-account-codings
JamesPasta Jun 26, 2026
02222b7
Merge pull request #2610 from bcgov/bugfix/AB#33632-Attachment-Re-Syn…
JamesPasta Jun 26, 2026
bacef9b
Merge pull request #2605 from bcgov/feature/AB#33509-Populate-Recipie…
JamesPasta Jun 26, 2026
ee4306f
Merge pull request #2603 from bcgov/feature/AB#29743-Dashboard-Select…
JamesPasta Jun 26, 2026
7745101
Merge pull request #2583 from bcgov/feature/AB#33309-onboarding-requests
JamesPasta Jun 26, 2026
4c2c94f
Merge pull request #2608 from bcgov/feature/AB#33459-Unity-applicatio…
JamesPasta Jun 26, 2026
1dc9c44
AB#33641 Remove server type from Nginx error page contents
DarylTodosichuk Jun 26, 2026
9938c04
Merge pull request #2617 from bcgov/feature/AB#33641-Remove-UAP-Stati…
DarylTodosichuk Jun 26, 2026
a117316
AB#33309 add '-' to regex
AndreGAot Jun 26, 2026
d49be74
Merge pull request #2618 from bcgov/feature/AB#33309-extend-db-naming…
AndreGAot Jun 26, 2026
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
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using Microsoft.Extensions.DependencyInjection;
using Unity.AI.Localization;
using Unity.AI.Permissions;
using Unity.Modules.Shared.Specializations;
using Unity.Modules.Shared.Permissions;
using Volo.Abp.Features;
using Volo.Abp.UI.Navigation;
Expand All @@ -23,14 +24,18 @@ private static async Task ConfigureMainMenuAsync(MenuConfigurationContext contex
var l = context.GetLocalizer<AIResource>();
var featureChecker = context.ServiceProvider.GetRequiredService<IFeatureChecker>();

context.Menu.AddItem(new ApplicationMenuItem(
name: AIMenus.Prompts,
displayName: "AI Prompts",
url: "~/Prompts",
icon: "fl fl-ai-prompts",
order: 900,
requiredPermissionName: IdentityConsts.ITOperationsPermissionName
));
var specializationChecker = context.ServiceProvider.GetRequiredService<ISpecializationChecker>();
if (!await specializationChecker.IsEnabledAsync(SpecializationConsts.Onboarding))
{
context.Menu.AddItem(new ApplicationMenuItem(
name: AIMenus.Prompts,
displayName: "AI Prompts",
url: "~/Prompts",
icon: "fl fl-ai-prompts",
order: 900,
requiredPermissionName: IdentityConsts.ITOperationsPermissionName
));
}

if (await featureChecker.IsEnabledAsync("Unity.AIReporting"))
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using System.Threading.Tasks;
using System;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;

namespace Unity.Flex.WorksheetInstances
Expand All @@ -9,5 +11,10 @@ public interface IWorksheetInstanceAppService : IApplicationService
Task<WorksheetInstanceDto> GetByCorrelationAnchorAsync(Guid correlationId, string correlationProvider, Guid worksheetId, string uiAnchor);
Task<WorksheetInstanceDto> CreateAsync(CreateWorksheetInstanceDto dto);
Task UpdateAsync(PersistWorksheetIntanceValuesDto dto);
Task<List<WorksheetInstanceDataDto>> GetListByCorrelationIdsAsync(List<Guid> correlationIds, string correlationProvider);
Task<List<Guid>> GetDistinctWorksheetIdsByCorrelationProviderAsync(string correlationProvider);
Task<List<Guid>> GetDistinctWorksheetIdsByCorrelationIdsAsync(List<Guid> correlationIds, string correlationProvider);
Task<PagedResultDto<WorksheetInstanceDataDto>> GetPagedListByCorrelationProviderAsync(string correlationProvider, int skipCount, int maxResultCount);
Task<WorksheetInstanceDataDto?> GetDataByIdAsync(Guid id);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using System;

namespace Unity.Flex.WorksheetInstances
{
public class WorksheetInstanceDataDto
{
public Guid Id { get; set; }
public Guid CorrelationId { get; set; }
public Guid WorksheetId { get; set; }
public string CurrentValue { get; set; } = "{}";
public DateTime CreationTime { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,10 @@ public interface IWorksheetInstanceRepository : IBasicRepository<WorksheetInstan
Task<WorksheetInstance?> GetWithValuesAsync(Guid worksheetInstanceId);
Task<bool> ExistsAsync(Guid worksheetId, Guid instanceCorrelationId, string instanceCorrelationProvider, Guid sheetCorrelationId, string sheetCorrelationProvider, string? uiAnchor);
Task<bool> AnyByWorksheetAndFormVersionAsync(Guid worksheetId, Guid formVersionId);
Task<List<WorksheetInstance>> GetByCorrelationIdsAsync(IEnumerable<Guid> correlationIds, string correlationProvider);
Task<List<Guid>> GetDistinctWorksheetIdsByCorrelationProviderAsync(string correlationProvider);
Task<List<Guid>> GetDistinctWorksheetIdsByCorrelationIdsAsync(IEnumerable<Guid> correlationIds, string correlationProvider);
Task<List<WorksheetInstance>> GetPagedListByCorrelationProviderAsync(string correlationProvider, int skipCount, int maxResultCount);
Task<int> GetCountByCorrelationProviderAsync(string correlationProvider);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -76,5 +76,52 @@ public async Task<bool> AnyByWorksheetAndFormVersionAsync(Guid worksheetId, Guid
&& s.WorksheetCorrelationId == formVersionId
&& s.WorksheetCorrelationProvider == CorrelationConsts.FormVersion);
}

public async Task<List<WorksheetInstance>> GetByCorrelationIdsAsync(IEnumerable<Guid> correlationIds, string correlationProvider)
{
var dbSet = await GetDbSetAsync();
var ids = correlationIds.ToList();
return await dbSet
.Where(wi => ids.Contains(wi.CorrelationId) && wi.CorrelationProvider == correlationProvider)
.ToListAsync();
}

public async Task<List<Guid>> GetDistinctWorksheetIdsByCorrelationProviderAsync(string correlationProvider)
{
var dbSet = await GetDbSetAsync();
return await dbSet
.Where(wi => wi.CorrelationProvider == correlationProvider)
.Select(wi => wi.WorksheetId)
.Distinct()
.ToListAsync();
}

public async Task<List<Guid>> GetDistinctWorksheetIdsByCorrelationIdsAsync(IEnumerable<Guid> correlationIds, string correlationProvider)
{
var dbSet = await GetDbSetAsync();
var ids = correlationIds.ToList();
return await dbSet
.Where(wi => ids.Contains(wi.CorrelationId) && wi.CorrelationProvider == correlationProvider)
.Select(wi => wi.WorksheetId)
.Distinct()
.ToListAsync();
}

public async Task<List<WorksheetInstance>> GetPagedListByCorrelationProviderAsync(string correlationProvider, int skipCount, int maxResultCount)
{
var dbSet = await GetDbSetAsync();
return await dbSet
.Where(wi => wi.CorrelationProvider == correlationProvider)
.OrderByDescending(wi => wi.CreationTime)
.Skip(skipCount)
.Take(maxResultCount)
.ToListAsync();
}

public async Task<int> GetCountByCorrelationProviderAsync(string correlationProvider)
{
var dbSet = await GetDbSetAsync();
return await dbSet.CountAsync(wi => wi.CorrelationProvider == correlationProvider);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
using System.Threading.Tasks;
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Unity.Flex.Domain.WorksheetInstances;
using Unity.Flex.Domain.Services;
using Volo.Abp;
using Volo.Abp.Application.Dtos;

namespace Unity.Flex.WorksheetInstances
{
Expand All @@ -29,5 +33,60 @@ public virtual async Task UpdateAsync(PersistWorksheetIntanceValuesDto dto)
{
await worksheetsManager.PersistWorksheetData(ObjectMapper.Map<PersistWorksheetIntanceValuesDto, PersistWorksheetIntanceValuesEto>(dto));
}

[RemoteService(false)]
public virtual async Task<List<WorksheetInstanceDataDto>> GetListByCorrelationIdsAsync(List<Guid> correlationIds, string correlationProvider)
{
var instances = await worksheetInstanceRepository.GetByCorrelationIdsAsync(correlationIds, correlationProvider);
return instances.Select(wi => new WorksheetInstanceDataDto
{
CorrelationId = wi.CorrelationId,
WorksheetId = wi.WorksheetId,
CurrentValue = wi.CurrentValue
}).ToList();
}

[RemoteService(false)]
public virtual async Task<List<Guid>> GetDistinctWorksheetIdsByCorrelationProviderAsync(string correlationProvider)
{
return await worksheetInstanceRepository.GetDistinctWorksheetIdsByCorrelationProviderAsync(correlationProvider);
}

[RemoteService(false)]
public virtual async Task<List<Guid>> GetDistinctWorksheetIdsByCorrelationIdsAsync(List<Guid> correlationIds, string correlationProvider)
{
return await worksheetInstanceRepository.GetDistinctWorksheetIdsByCorrelationIdsAsync(correlationIds, correlationProvider);
}

[RemoteService(false)]
public virtual async Task<PagedResultDto<WorksheetInstanceDataDto>> GetPagedListByCorrelationProviderAsync(string correlationProvider, int skipCount, int maxResultCount)
{
var totalCount = await worksheetInstanceRepository.GetCountByCorrelationProviderAsync(correlationProvider);
var instances = await worksheetInstanceRepository.GetPagedListByCorrelationProviderAsync(correlationProvider, skipCount, maxResultCount);
var items = instances.Select(wi => new WorksheetInstanceDataDto
{
Id = wi.Id,
CorrelationId = wi.CorrelationId,
WorksheetId = wi.WorksheetId,
CurrentValue = wi.CurrentValue,
CreationTime = wi.CreationTime
}).ToList();
return new PagedResultDto<WorksheetInstanceDataDto>(totalCount, items);
}

[RemoteService(false)]
public virtual async Task<WorksheetInstanceDataDto?> GetDataByIdAsync(Guid id)
{
var wi = await worksheetInstanceRepository.FindAsync(id);
if (wi == null) return null;
return new WorksheetInstanceDataDto
{
Id = wi.Id,
CorrelationId = wi.CorrelationId,
WorksheetId = wi.WorksheetId,
CurrentValue = wi.CurrentValue,
CreationTime = wi.CreationTime
};
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
using Shouldly;
using System;
using System.Linq;
using System.Threading.Tasks;
using Unity.Flex.Domain.WorksheetInstances;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Uow;
using Xunit;
using Xunit.Abstractions;

namespace Unity.Flex.Worksheets
{
public class WorksheetInstanceRepositoryTests : FlexApplicationTestBase
{
private readonly IWorksheetInstanceRepository _worksheetInstanceRepository;
private readonly ICurrentTenant _currentTenant;
private readonly IUnitOfWorkManager _unitOfWorkManager;

public WorksheetInstanceRepositoryTests(ITestOutputHelper outputHelper) : base(outputHelper)
{
_worksheetInstanceRepository = GetRequiredService<IWorksheetInstanceRepository>();
_currentTenant = GetRequiredService<ICurrentTenant>();
_unitOfWorkManager = GetRequiredService<IUnitOfWorkManager>();
}

[Fact]
[Trait("Category", "Integration")]
public async Task GetByCorrelationIdsAsync_OnlyReturnsRowsForTheExactCorrelationProviderRequested()
{
var correlationId = Guid.NewGuid();

await _worksheetInstanceRepository.InsertAsync(new WorksheetInstance(
Guid.NewGuid(), Guid.NewGuid(), correlationId, "Application",
Guid.NewGuid(), "FormVersion", "anchor"), autoSave: true);
await _worksheetInstanceRepository.InsertAsync(new WorksheetInstance(
Guid.NewGuid(), Guid.NewGuid(), correlationId, "OtherProvider",
Guid.NewGuid(), "FormVersion", "anchor"), autoSave: true);

var result = await _worksheetInstanceRepository.GetByCorrelationIdsAsync([correlationId], "Application");

result.ShouldHaveSingleItem();
result[0].CorrelationProvider.ShouldBe("Application");
}

[Fact]
[Trait("Category", "Integration")]
public async Task GetByCorrelationIdsAsync_RespectsMultiTenantFilter()
{
var tenantA = Guid.NewGuid();
var tenantB = Guid.NewGuid();
var correlationId = Guid.NewGuid();

using (_currentTenant.Change(tenantA))
{
using var uow = _unitOfWorkManager.Begin();
await _worksheetInstanceRepository.InsertAsync(new WorksheetInstance(
Guid.NewGuid(), Guid.NewGuid(), correlationId, "Application",
Guid.NewGuid(), "FormVersion", "anchor"), autoSave: true);
await uow.CompleteAsync();
}

using (_currentTenant.Change(tenantA))
{
using var uow = _unitOfWorkManager.Begin();
var visibleToOwnTenant = await _worksheetInstanceRepository.GetByCorrelationIdsAsync([correlationId], "Application");
visibleToOwnTenant.ShouldHaveSingleItem();
}

using (_currentTenant.Change(tenantB))
{
using var uow = _unitOfWorkManager.Begin();
var visibleToOtherTenant = await _worksheetInstanceRepository.GetByCorrelationIdsAsync([correlationId], "Application");
visibleToOtherTenant.ShouldBeEmpty();
}
}

[Fact]
[Trait("Category", "Integration")]
public async Task GetDistinctWorksheetIdsByCorrelationIdsAsync_OnlyReturnsIdsForTheExactCorrelationProviderRequested()
{
var correlationId = Guid.NewGuid();
var worksheetIdForRequestedProvider = Guid.NewGuid();
var worksheetIdForOtherProvider = Guid.NewGuid();

await _worksheetInstanceRepository.InsertAsync(new WorksheetInstance(
Guid.NewGuid(), worksheetIdForRequestedProvider, correlationId, "Application",
Guid.NewGuid(), "FormVersion", "anchor"), autoSave: true);
await _worksheetInstanceRepository.InsertAsync(new WorksheetInstance(
Guid.NewGuid(), worksheetIdForOtherProvider, correlationId, "OtherProvider",
Guid.NewGuid(), "FormVersion", "anchor"), autoSave: true);

var result = await _worksheetInstanceRepository.GetDistinctWorksheetIdsByCorrelationIdsAsync([correlationId], "Application");

result.ShouldBe([worksheetIdForRequestedProvider]);
}

[Fact]
[Trait("Category", "Integration")]
public async Task GetPagedListByCorrelationProviderAsync_OnlyReturnsRowsForTheExactCorrelationProviderRequested()
{
var marker = Guid.NewGuid().ToString("N");
var correlationProvider = $"Provider-{marker}";

await _worksheetInstanceRepository.InsertAsync(new WorksheetInstance(
Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), correlationProvider,
Guid.NewGuid(), "FormVersion", "anchor"), autoSave: true);
await _worksheetInstanceRepository.InsertAsync(new WorksheetInstance(
Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), "OtherProvider",
Guid.NewGuid(), "FormVersion", "anchor"), autoSave: true);

var result = await _worksheetInstanceRepository.GetPagedListByCorrelationProviderAsync(correlationProvider, 0, 10);

result.ShouldHaveSingleItem();
result[0].CorrelationProvider.ShouldBe(correlationProvider);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ $(function () {
_identityRoleAppService
.delete(data.record.id)
.then(function () {
_dataTable.ajax.reloadEx();
_dataTable.ajax.reload();
abp.notify.success(l('SuccessfullyDeleted'));
});
},
Expand Down Expand Up @@ -174,10 +174,10 @@ $(function () {
});

_createModal.onResult(function () {
_dataTable.ajax.reloadEx();
_dataTable.ajax.reload();
});

_editModal.onResult(function () {
_dataTable.ajax.reloadEx();
_dataTable.ajax.reload();
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ $(function () {

$('#ImportUserSearchButton').click(function (e) {
e.preventDefault();
_filterDataTable.ajax.reloadEx();
_filterDataTable.ajax.reload();
$('#import-user-btn').attr('disabled', true);
});

Expand All @@ -87,7 +87,7 @@ $(function () {
});

_importModal.onResult(function () {
dataTable.ajax.reloadEx();
dataTable.ajax.reload();
});
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,18 @@
"Filter": "Filter",
"Export": "Export",
"NotificationList:NotificationId": "Notification Id",
"NotificationList:SubmissionId": "Submission Id",
"NotificationList:SubmissionId": "Submission #",
"NotificationList:ApplicantName": "Applicant Name",
"NotificationList:SentDate": "Sent Date",
"NotificationList:Status": "Status",
"NotificationList:From": "From",
"NotificationList:To": "To",
"NotificationList:Subject": "Subject",
"NotificationList:Recipient": "Recipient",
"NotificationList:EmailType": "Email Type"
"NotificationList:EmailType": "Email Type",
"NotificationList:EmailType:Manual": "Manual",
"NotificationList:EmailType:Scheduled": "Scheduled",
"NotificationList:EmailType:EventBased": "Event Based",
"NotificationList:EmailType:Delayed": "Delayed"
}
}
Loading
Loading