Skip to content
Merged

Dev #2354

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
40e4013
Merge pull request #2221 from bcgov/hotfix/AB#32532-AddOneTimeConside…
DarylTodosichuk Apr 2, 2026
7148d66
AB#32455 hotfix for applicant electoral district intake
AndreGAot Apr 7, 2026
2733050
Merge pull request #2227 from bcgov/hotfix/AB#32455-applicant-elector…
JamesPasta Apr 7, 2026
d57c0c8
AB#32694 update applicant profile contact handling
AndreGAot Apr 17, 2026
44c3f26
Merge branch 'dev' into feature/AB#32694-applicant-profile-portal-con…
AndreGAot Apr 17, 2026
61620d0
Merge branch 'dev' into feature/AB#32694-applicant-profile-portal-con…
AndreGAot Apr 17, 2026
f644f3f
Merge branch 'dev' into feature/AB#32694-applicant-profile-portal-con…
AndreGAot Apr 20, 2026
83afc84
Merge pull request #2330 from bcgov/test
DarylTodosichuk Apr 22, 2026
0c9a3e3
AB#32694 applicant profile contacts alignment and refactor
AndreGAot Apr 23, 2026
368894c
AB#32694 removed test
AndreGAot Apr 23, 2026
df5b2e7
AB#32694 update permissions
AndreGAot Apr 23, 2026
498ef96
Merge remote-tracking branch 'origin/dev' into feature/AB#32694-appli…
AndreGAot Apr 23, 2026
d214d1c
AB#32694 sonar cleanup
AndreGAot Apr 23, 2026
e5e62a1
AB#32451 add AI generation tracking and polling
jacobwillsmith Apr 15, 2026
887fda3
AB#32451 add AI generation polling UI tests
jacobwillsmith Apr 15, 2026
9b3bb39
AB#32451 add AI request polling to generation flows
jacobwillsmith Apr 17, 2026
c16d63e
AB#32451 cover AI queue dedupe paths
jacobwillsmith Apr 17, 2026
a0535dd
AB#32451 fix ai queue status predicate
jacobwillsmith Apr 17, 2026
f112b2f
AB#32451 move AI requests into AI schema
jacobwillsmith Apr 17, 2026
a30df8f
AB#32451 scaffold AI request migration
jacobwillsmith Apr 17, 2026
798cfc9
AB#32451 consolidate AI queue entrypoints
jacobwillsmith Apr 17, 2026
7cf6279
AB#32451 tighten AI generation flow
jacobwillsmith Apr 18, 2026
e33032f
AB#32451 refine ai generation ui
jacobwillsmith Apr 18, 2026
0577082
AB#32451 tighten AI generation flow
jacobwillsmith Apr 18, 2026
4d7edf0
AB#32451 make chefs download all rows
jacobwillsmith Apr 21, 2026
2cf73ba
AB#32451 tighten AI generation flow
jacobwillsmith Apr 22, 2026
0f6feb2
AB#32451 tighten AI generation flow
jacobwillsmith Apr 22, 2026
3fa5552
AB#32451 tighten AI generation flow
jacobwillsmith Apr 22, 2026
efdcf99
AB#32451 restore pipeline job and align queued scoring with dev
jacobwillsmith Apr 22, 2026
8e38bfe
AB#32451 preserve manual scoring AI assessment creation
jacobwillsmith Apr 22, 2026
1e0cbf8
AB#32451 simplify ai polling ui and normalize ai request migration
jacobwillsmith Apr 27, 2026
5500686
AB#32451 clean up chefs attachments polling helpers
jacobwillsmith Apr 27, 2026
f8a6b7c
AB#32451 apply Copilot AI queue fixes
jacobwillsmith Apr 27, 2026
aaef5b7
Merge branch 'dev' into feature/AB#32451-ai-generation-polling-dedupe…
jacobwillsmith Apr 27, 2026
2f2433d
AB#32451 fix AI permissions namespace import
jacobwillsmith Apr 27, 2026
397c290
Merge remote-tracking branch 'origin/dev' into feature/AB#32694-appli…
AndreGAot Apr 27, 2026
7e520c7
AB#32451 fix AI queue tests for logger and queryable helper
jacobwillsmith Apr 27, 2026
7108393
AB#32694 copilot feedback
AndreGAot Apr 27, 2026
aa7dcd3
Merge pull request #2340 from bcgov/feature/AB#32694-applicant-profil…
AndreGAot Apr 27, 2026
d68bb68
AB#32451 fix Details.cshtml script section merge
jacobwillsmith Apr 27, 2026
5024967
AB#32694 - sonarqube fixes
AndreGAot Apr 27, 2026
ba783b2
Merge pull request #2350 from bcgov/feature/AB#32694-applicant-profil…
AndreGAot Apr 27, 2026
a651b8b
feature/AB#32632-WorksheetMerge-FixdragDropquestionInSections
JamesPasta Apr 28, 2026
1722df2
AB#31305: Supplier Handling on Applicant Merge - Initial Draft
aurelio-aot Apr 28, 2026
bf713fc
Merge branch 'dev' into feature/AB#31305-Supplier-On-Applicant-Merge
aurelio-aot Apr 28, 2026
786feda
AB#31305: Fix sonarqube issues
aurelio-aot Apr 28, 2026
89a1c65
Merge pull request #2351 from bcgov/feature/AB#32632-WorksheetMergeDev
JamesPasta Apr 28, 2026
34299fe
AB#31305: Bugfix: Merging on same applicant, Deleted Supplier Showing
aurelio-aot Apr 28, 2026
ef6c7d3
Merge pull request #2346 from bcgov/feature/AB#32451-ai-generation-po…
JamesPasta Apr 28, 2026
ece924f
feature/AB#32801-Matomo
JamesPasta Apr 28, 2026
c74be0c
Merge pull request #2353 from bcgov/feature/AB#32801-Matomo
JamesPasta Apr 28, 2026
e716d4b
Added pg_stat_statements to both Host and Tenant
DavidBrightBcGov Apr 28, 2026
ab5866b
feature/AB#32801-Matomo-SonarCleanup
JamesPasta Apr 28, 2026
9d1d092
feature/AB#32801-Matomo-SonarCleanup
JamesPasta Apr 28, 2026
fec43a0
AB#32451 fix ExecuteAsync argument name warning
jacobwillsmith Apr 28, 2026
d43394b
Merge pull request #2356 from bcgov/feature/AB#32451-ai-generation-po…
JamesPasta Apr 28, 2026
0d730ae
Merge pull request #2357 from bcgov/feature/AB#32801-Matomo
JamesPasta Apr 28, 2026
aa9891f
Merge pull request #2352 from bcgov/feature/AB#31305-Supplier-On-Appl…
JamesPasta Apr 28, 2026
930d8d8
feature/AB#32801-Matomo-SonarCleanup
JamesPasta Apr 29, 2026
bb8f5f5
Merge pull request #2358 from bcgov/feature/AB#32801-Matomo
JamesPasta Apr 29, 2026
3c5e2f8
Remove drop option for the tenant extension
DavidBrightBcGov Apr 29, 2026
e373d7b
Potential fix for pull request finding
DavidBrightBcGov Apr 29, 2026
8377c89
Merge pull request #2355 from bcgov/feature/#32805-pg-stat-statement-…
DavidBrightBcGov Apr 29, 2026
da2cf58
hotfix/AB#32799-FixCookies
JamesPasta Apr 29, 2026
e013505
AB#32799 change the multiple tenant tracking in cookie
AndreGAot Apr 29, 2026
0a8bb22
Merge branch 'dev' into hotfix/AB#32799-FixCookiesMinimal
JamesPasta Apr 29, 2026
583e177
hotfix/AB#32799-FixCookies
JamesPasta Apr 29, 2026
9ef0fa2
Merge pull request #2362 from bcgov/hotfix/AB#32799-FixCookiesMinimal
JamesPasta Apr 29, 2026
2ad2a35
feature/AB#32815-FixBuildWarnings
JamesPasta Apr 29, 2026
c44627b
Merge pull request #2363 from bcgov/feature/AB#32815-FixBuildWarnings
JamesPasta Apr 29, 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 @@ -5,5 +5,8 @@ namespace Unity.AI.Automation;

public interface IApplicationAIGenerationQueue
{
Task QueueApplicationPipelineAsync(Guid applicationId, Guid? tenantId, string? promptVersion = null);
Task QueueAttachmentSummaryAsync(Guid applicationId, Guid? tenantId, string? promptVersion = null);
Task QueueApplicationAnalysisAsync(Guid applicationId, Guid? tenantId, string? promptVersion = null);
Task QueueApplicationScoringAsync(Guid applicationId, Guid? tenantId, string? promptVersion = null);
Task QueueAllAIStagesAsync(Guid applicationId, Guid? tenantId, string? promptVersion = null);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,20 @@
using System;
using System.Threading.Tasks;
using Unity.AI;
using Unity.AI.Operations;
using Unity.AI.Automation;
using Unity.AI.Permissions;
using Volo.Abp;
using Volo.Abp.Features;
using Volo.Abp.MultiTenancy;

namespace Unity.GrantManager.GrantApplications;

[Authorize(AIPermissions.Analysis.GenerateApplicationAnalysis)]
public class ApplicationAnalysisAppService(
IApplicationAnalysisService applicationAnalysisService,
IFeatureChecker featureChecker)
Unity.AI.Operations.IApplicationAnalysisService applicationAnalysisService,
IApplicationAIGenerationQueue aiGenerationQueue,
IFeatureChecker featureChecker,
ICurrentTenant currentTenant)
: AIAppService, IApplicationAnalysisAppService
{
public virtual async Task<ApplicationAnalysisResultDto> GenerateApplicationAnalysisAsync(Guid applicationId, string? promptVersion = null)
Expand All @@ -22,8 +25,8 @@ public virtual async Task<ApplicationAnalysisResultDto> GenerateApplicationAnaly
throw new UserFriendlyException("AI application analysis is not enabled.");
}

await applicationAnalysisService.RegenerateAndSaveAsync(applicationId, promptVersion);
return new ApplicationAnalysisResultDto { Completed = true };
await aiGenerationQueue.QueueApplicationAnalysisAsync(applicationId, currentTenant.Id, promptVersion);
return new ApplicationAnalysisResultDto { Completed = false };
}

// Internal-only: no HTTP endpoint, no auth check — safe for background job callers
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public async Task<ApplicationContentResultDto> GenerateContentAsync(Guid applica
throw new UserFriendlyException("AI generate all is not enabled.");
}

await aiGenerationQueue.QueueApplicationPipelineAsync(applicationId, currentTenant.Id, promptVersion);
await aiGenerationQueue.QueueAllAIStagesAsync(applicationId, currentTenant.Id, promptVersion);

return new ApplicationContentResultDto
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,6 @@ public interface ICustomFieldAppService
Task<CustomFieldDto> GetAsync(Guid id);
Task<CustomFieldDto> EditAsync(Guid id, EditCustomFieldDto dto);
Task DeleteAsync(Guid id);
Task MoveToSectionAsync(Guid fieldId, Guid targetSectionId, uint newIndex);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public virtual WorksheetSection Section
get => _section
?? throw new InvalidOperationException("Uninitialized property: " + nameof(Section));
}
public virtual Guid SectionId { get; }
public virtual Guid SectionId { get; internal set; }
private WorksheetSection? _section;

protected CustomField()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using Volo.Abp.Domain.Entities;
using System.Linq;
using Unity.Flex.Worksheets.Definitions;
using Volo.Abp;

namespace Unity.Flex.Worksheets
{
Expand Down Expand Up @@ -39,5 +40,31 @@ public async Task DeleteAsync(Guid id)

section.RemoveField(field);
}

public async Task MoveToSectionAsync(Guid fieldId, Guid targetSectionId, uint newIndex)
{
var field = await customFieldRepostitory.GetAsync(fieldId) ?? throw new EntityNotFoundException();
if (field.SectionId == targetSectionId) return;

var worksheet = await worksheetRepository.GetBySectionAsync(field.SectionId, true) ?? throw new EntityNotFoundException();
if (worksheet.Published) throw new UserFriendlyException("Cannot move fields in a published worksheet.");

var sourceSection = worksheet.Sections.FirstOrDefault(s => s.Id == field.SectionId) ?? throw new EntityNotFoundException();
var targetSection = worksheet.Sections.FirstOrDefault(s => s.Id == targetSectionId) ?? throw new EntityNotFoundException();

// Renumber source section, excluding the moving field
var sourceFields = sourceSection.Fields.Where(f => f.Id != fieldId).OrderBy(f => f.Order).ToList();
for (int i = 0; i < sourceFields.Count; i++)
sourceFields[i].SetOrder((uint)(i + 1));

// Make room in target section at the insertion point
uint insertAt = Math.Min(newIndex + 1, (uint)(targetSection.Fields.Count + 1));
foreach (var f in targetSection.Fields.Where(f => f.Order >= insertAt))
f.SetOrder(f.Order + 1);

// Update FK directly — EF Core change tracker issues a single UPDATE, avoids orphan-deletion
field.SetOrder(insertAt);
field.SectionId = targetSectionId;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -389,7 +389,8 @@ private static DataGridViewSummary GenerateSummary(DataGridColumn[]? dataColumns
private static string SumCells(string? key, DataGridViewModelRow[] rows)
{
decimal sum = 0;
foreach (var cell in rows.Select(row => row.Cells.Find(x => x.Key == key)).Where(cell => cell != null))
var cells = rows.Select(row => row.Cells.Find(x => x.Key == key)).Where(cell => cell != null);
foreach (var cell in cells)
{
var preparse = cell!.Value.Replace("$", "").Replace(",", "");
if (decimal.TryParse(preparse, out decimal value))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,30 +28,27 @@ public class QuestionSelectListDefinitionWidget : AbpViewComponent
var seenKeys = new HashSet<string>();
var counter = 1;

foreach (var key in form.Keys)
var optionKeys = form.Keys.Where(key => key.StartsWith("Options[") && key.EndsWith("].Text"));
foreach (var key in optionKeys)
{
if (key.StartsWith("Options[") && key.EndsWith("].Text"))
{
var index = key.Split('[')[1].Split(']')[0];
var index = key.Split('[')[1].Split(']')[0];
var optionKey = form[key].ToString() ?? string.Empty;
var scoreKey = $"Options[{index}].Score";
var optionScore = form[scoreKey].ToString() ?? string.Empty;

var optionKey = form[key].ToString() ?? string.Empty;
var scoreKey = $"Options[{index}].Score";
var optionScore = form[scoreKey].ToString() ?? string.Empty;
// Ensure optionKey is unique and not empty
if (!seenKeys.Contains(optionKey) && !string.IsNullOrEmpty(optionKey))
{
seenKeys.Add(optionKey);

// Ensure optionKey is unique and not empty
if (!seenKeys.Contains(optionKey) && !string.IsNullOrEmpty(optionKey))
var questionOption = new QuestionSelectListOption
{
seenKeys.Add(optionKey);

var questionOption = new QuestionSelectListOption
{
Key = "key" + counter++,
NumericValue = long.TryParse(optionScore, out var score) ? score : 0,
Value = optionKey
};
Key = "key" + counter++,
NumericValue = long.TryParse(optionScore, out var score) ? score : 0,
Value = optionKey
};

options.Add(questionOption);
}
options.Add(questionOption);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,9 @@ function makeCustomFieldsSortable() {
document.querySelectorAll('.custom-fields-wrapper').forEach(function (div) {
const wrapper = div.closest('.sections-wrapper-outer');
const isArchived = wrapper?.dataset.isArchived === 'true';
const worksheetId = wrapper?.dataset.worksheetId;
customFieldSortables.push(new Sortable(div, {
group: `custom-fields-${worksheetId}`,
animation: 150,
disabled: isArchived,
onEnd: function (evt) {
Expand Down Expand Up @@ -138,18 +140,36 @@ function makeSectionsSortable() {
}

function updateCustomFieldsSequence(evt) {
let sectionId = evt.target.dataset.sectionId;
let oldIndex = evt.oldIndex;
let newIndex = evt.newIndex;

unity.flex.worksheets.worksheetSection
.resequenceCustomFields(sectionId, oldIndex, newIndex, {})
.done(function () {
updatePreview();
abp.notify.success(
'Custom fields order updated.'
);
});
if (evt.from === evt.to) {
// Reorder within the same section
const sectionId = evt.from.dataset.sectionId;
const oldIndex = evt.oldIndex;
const newIndex = evt.newIndex;

unity.flex.worksheets.worksheetSection
.resequenceCustomFields(sectionId, oldIndex, newIndex, {})
.done(function () {
updatePreview();
abp.notify.success('Custom fields order updated.');
});
} else {
// Move to a different section
const fieldId = evt.item.dataset.id;
const targetSectionId = evt.to.dataset.sectionId;
const newIndex = evt.newIndex;

unity.flex.worksheets.customField
.moveToSection(fieldId, targetSectionId, newIndex, {})
.done(function () {
updatePreview();
abp.notify.success('Field moved to new section.');
})
.fail(function () {
// Revert the DOM move on failure
evt.from.insertBefore(evt.item, evt.from.children[evt.oldIndex] || null);
abp.notify.error('Failed to move field.');
});
}
}

function updateSectionSequence(evt) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,34 +25,31 @@

<abp-input asp-for="Role.IsPublic" />

@foreach (var propertyInfo in ObjectExtensionManager.Instance.GetProperties<CreateModalModel.RoleInfoModel>())
@foreach (ObjectExtensionPropertyInfo propertyInfo in ObjectExtensionManager.Instance.GetProperties<CreateModalModel.RoleInfoModel>().Where(p => !p.Name.EndsWith("_Text")))
{
if (!propertyInfo.Name.EndsWith("_Text"))
if (propertyInfo.Type.IsEnum || !propertyInfo.Lookup.Url.IsNullOrEmpty())
{
if (propertyInfo.Type.IsEnum || !propertyInfo.Lookup.Url.IsNullOrEmpty())
if (propertyInfo.Type.IsEnum)
{
if (propertyInfo.Type.IsEnum)
{
Model.Role.ExtraProperties.ToEnum(propertyInfo.Name, propertyInfo.Type);
}
<abp-select asp-for="Role.ExtraProperties[propertyInfo.Name]"
label="@propertyInfo.GetLocalizedDisplayName(StringLocalizerFactory)"
autocomplete-api-url="@propertyInfo.Lookup.Url"
autocomplete-selected-item-name="@Model.Role.GetProperty(propertyInfo.Name+"_Text")"
autocomplete-selected-item-value="@Model.Role.GetProperty(propertyInfo.Name)"
autocomplete-filter-param-name="@propertyInfo.Lookup.FilterParamName"
autocomplete-items-property-name="@propertyInfo.Lookup.ResultListPropertyName"
autocomplete-display-property-name="@propertyInfo.Lookup.DisplayPropertyName"
autocomplete-value-property-name="@propertyInfo.Lookup.ValuePropertyName"></abp-select>
}
else
{
<abp-input type="@propertyInfo.GetInputType()"
asp-for="Role.ExtraProperties[propertyInfo.Name]"
label="@propertyInfo.GetLocalizedDisplayName(StringLocalizerFactory)"
asp-format="@propertyInfo.GetInputFormatOrNull()"
value="@propertyInfo.GetInputValueOrNull(Model.Role.GetProperty(propertyInfo.Name))" />
Model.Role.ExtraProperties.ToEnum(propertyInfo.Name, propertyInfo.Type);
}
<abp-select asp-for="Role.ExtraProperties[propertyInfo.Name]"
label="@propertyInfo.GetLocalizedDisplayName(StringLocalizerFactory)"
autocomplete-api-url="@propertyInfo.Lookup.Url"
autocomplete-selected-item-name="@Model.Role.GetProperty(propertyInfo.Name+"_Text")"
autocomplete-selected-item-value="@Model.Role.GetProperty(propertyInfo.Name)"
autocomplete-filter-param-name="@propertyInfo.Lookup.FilterParamName"
autocomplete-items-property-name="@propertyInfo.Lookup.ResultListPropertyName"
autocomplete-display-property-name="@propertyInfo.Lookup.DisplayPropertyName"
autocomplete-value-property-name="@propertyInfo.Lookup.ValuePropertyName"></abp-select>
}
else
{
<abp-input type="@propertyInfo.GetInputType()"
asp-for="Role.ExtraProperties[propertyInfo.Name]"
label="@propertyInfo.GetLocalizedDisplayName(StringLocalizerFactory)"
asp-format="@propertyInfo.GetInputFormatOrNull()"
value="@propertyInfo.GetInputValueOrNull(Model.Role.GetProperty(propertyInfo.Name))" />
}
}
</abp-modal-body>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,34 +36,31 @@

<abp-input asp-for="Role.IsPublic" />

@foreach (var propertyInfo in ObjectExtensionManager.Instance.GetProperties<CreateModalModel.RoleInfoModel>())
@foreach (ObjectExtensionPropertyInfo propertyInfo in ObjectExtensionManager.Instance.GetProperties<CreateModalModel.RoleInfoModel>().Where(p => !p.Name.EndsWith("_Text")))
{
if (!propertyInfo.Name.EndsWith("_Text"))
if (propertyInfo.Type.IsEnum || !propertyInfo.Lookup.Url.IsNullOrEmpty())
{
if (propertyInfo.Type.IsEnum || !propertyInfo.Lookup.Url.IsNullOrEmpty())
if (propertyInfo.Type.IsEnum)
{
if (propertyInfo.Type.IsEnum)
{
Model.Role.ExtraProperties.ToEnum(propertyInfo.Name, propertyInfo.Type);
}
<abp-select asp-for="Role.ExtraProperties[propertyInfo.Name]"
label="@propertyInfo.GetLocalizedDisplayName(StringLocalizerFactory)"
autocomplete-api-url="@propertyInfo.Lookup.Url"
autocomplete-selected-item-name="@Model.Role.GetProperty(propertyInfo.Name+"_Text")"
autocomplete-selected-item-value="@Model.Role.GetProperty(propertyInfo.Name)"
autocomplete-filter-param-name="@propertyInfo.Lookup.FilterParamName"
autocomplete-items-property-name="@propertyInfo.Lookup.ResultListPropertyName"
autocomplete-display-property-name="@propertyInfo.Lookup.DisplayPropertyName"
autocomplete-value-property-name="@propertyInfo.Lookup.ValuePropertyName"></abp-select>
}
else
{
<abp-input type="@propertyInfo.GetInputType()"
asp-for="Role.ExtraProperties[propertyInfo.Name]"
label="@propertyInfo.GetLocalizedDisplayName(StringLocalizerFactory)"
asp-format="@propertyInfo.GetInputFormatOrNull()"
value="@propertyInfo.GetInputValueOrNull(Model.Role.GetProperty(propertyInfo.Name))" />
Model.Role.ExtraProperties.ToEnum(propertyInfo.Name, propertyInfo.Type);
}
<abp-select asp-for="Role.ExtraProperties[propertyInfo.Name]"
label="@propertyInfo.GetLocalizedDisplayName(StringLocalizerFactory)"
autocomplete-api-url="@propertyInfo.Lookup.Url"
autocomplete-selected-item-name="@Model.Role.GetProperty(propertyInfo.Name+"_Text")"
autocomplete-selected-item-value="@Model.Role.GetProperty(propertyInfo.Name)"
autocomplete-filter-param-name="@propertyInfo.Lookup.FilterParamName"
autocomplete-items-property-name="@propertyInfo.Lookup.ResultListPropertyName"
autocomplete-display-property-name="@propertyInfo.Lookup.DisplayPropertyName"
autocomplete-value-property-name="@propertyInfo.Lookup.ValuePropertyName"></abp-select>
}
else
{
<abp-input type="@propertyInfo.GetInputType()"
asp-for="Role.ExtraProperties[propertyInfo.Name]"
label="@propertyInfo.GetLocalizedDisplayName(StringLocalizerFactory)"
asp-format="@propertyInfo.GetInputFormatOrNull()"
value="@propertyInfo.GetInputValueOrNull(Model.Role.GetProperty(propertyInfo.Name))" />
}
}
</abp-modal-body>
Expand Down
Loading
Loading