Compare commits

..

No commits in common. "d5ea35de8496d460c3c4ef24e2f624eccfd66c47" and "ae183c77cfefc2c6b86fec2da7bdc0be3ef06efc" have entirely different histories.

49 changed files with 477 additions and 26579 deletions

View File

@ -1,29 +0,0 @@
namespace ILoan.Tools.Application.Layout;
public partial class MainLayout
{
[Inject]
protected IJSRuntime JSRuntime { get; set; }
[Inject]
protected NavigationManager NavigationManager { get; set; }
[Inject]
protected DialogService DialogService { get; set; }
[Inject]
protected TooltipService TooltipService { get; set; }
[Inject]
protected ContextMenuService ContextMenuService { get; set; }
[Inject]
protected NotificationService NotificationService { get; set; }
private bool sidebarExpanded = true;
void SidebarToggleClick()
{
sidebarExpanded = !sidebarExpanded;
}
}

View File

@ -1,202 +0,0 @@
@page "/add-core-rule"
@using ILoan.Tools.Domain.Entities
<PageTitle>Add CoreRule</PageTitle>
<RadzenColumn SizeMD=12>
<RadzenAlert Shade="Shade.Lighter" Variant="Variant.Flat" Size="AlertSize.Small" AlertStyle="AlertStyle.Danger" Visible="@errorVisible">Cannot save CoreRule</RadzenAlert>
<RadzenTemplateForm TItem="CoreRule" Data="@coreRule" Visible="@(coreRule != null)" Submit="@FormSubmit">
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Rule ID" Component="RuleId" style="width: 100%" />
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenNumeric style="display: block; width: 100%" @bind-Value="@coreRule.ID" Name="RuleId" />
<RadzenRequiredValidator Component="RuleId" Text="Rule id is required" />
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Rule Name" Component="RuleName" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextArea style="display: block; width: 100%" @bind-Value="@coreRule.RuleName" Name="RuleName"/>
<RadzenRequiredValidator Component="RuleName" Text="RuleName is required"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Source" Component="Source" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRule.Source" Name="Source"/>
<RadzenRequiredValidator Component="Source" Text="Source is required"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Default Threshold" Component="DefaultThreshold" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenNumeric style="display: block; width: 100%" @bind-Value="@coreRule.DefaultThreshold" Name="DefaultThreshold"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Blocked" Component="Blocked" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenCheckBox @bind-Value="@coreRule.Blocked" Name="Blocked"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Triggers Manual Review" Component="TriggersManualReview" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenCheckBox @bind-Value="@coreRule.TriggersManualReview" Name="TriggersManualReview"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Suggested Resolution" Component="SuggestedResolution" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRule.SuggestedResolution" Name="SuggestedResolution"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Trigger Reason" Component="TriggerReason" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRule.TriggerReason" Name="TriggerReason"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Use Last Record" Component="UseLastRecord" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenCheckBox @bind-Value="@coreRule.UseLastRecord" Name="UseLastRecord"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Applicant Type" Component="ApplicantType" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRule.ApplicantType" Name="ApplicantType"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Filter On Clickthrough" Component="FilterOnClickthrough" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRule.FilterOnClickthrough" Name="FilterOnClickthrough"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Run Before Status" Component="RunBeforeStatus" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRule.RunBeforeStatus" Name="RunBeforeStatus"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Display Section" Component="DisplaySection" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRule.DisplaySection" Name="DisplaySection"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Warning Field" Component="WarningField" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRule.WarningField" Name="WarningField"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Dutch Rule Name" Component="DutchRuleName" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextArea style="display: block; width: 100%" @bind-Value="@coreRule.DutchRuleName" Name="DutchRuleName"/>
<RadzenRequiredValidator Component="DutchRuleName" Text="DutchRuleName is required"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Dutch Trigger Reason" Component="DutchTriggerReason" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRule.DutchTriggerReason" Name="DutchTriggerReason"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Dutch Suggested Resolution" Component="DutchSuggestedResolution" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRule.DutchSuggestedResolution" Name="DutchSuggestedResolution"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Dutch Filter On Clickthrough" Component="DutchFilterOnClickthrough" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRule.DutchFilterOnClickthrough" Name="DutchFilterOnClickthrough"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Rule Explanation" Component="RuleExplanation" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRule.RuleExplanation" Name="RuleExplanation"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Dutch Rule Explanation" Component="DutchRuleExplanation" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextArea style="display: block; width: 100%" @bind-Value="@coreRule.DutchRuleExplanation" Name="DutchRuleExplanation"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Work Item Id" Component="WorkItemId" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenNumeric style="display: block; width: 100%" @bind-Value="@coreRule.WorkItemId" Name="WorkItemId"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Title" Component="Title" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRule.Title" Name="Title"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Update" Component="Update" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenNumeric style="display: block; width: 100%" @bind-Value="@coreRule.Update" Name="Update"/>
</RadzenColumn>
</RadzenRow>
<RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center" JustifyContent="JustifyContent.End" Gap="0.5rem">
<RadzenButton ButtonStyle="ButtonStyle.Primary" ButtonType="ButtonType.Submit" Icon="save" Text="Save" Variant="Variant.Flat"/>
<RadzenButton ButtonStyle="ButtonStyle.Light" Text="Cancel" Variant="Variant.Flat" Click="@CancelButtonClick"/>
</RadzenStack>
</RadzenTemplateForm>
</RadzenColumn>

View File

@ -1,51 +0,0 @@
using ILoan.Tools.Infrastructure.Services;
namespace ILoan.Tools.Application.Pages;
public partial class AddCoreRule
{
[Inject]
protected IJSRuntime JSRuntime { get; set; }
[Inject]
protected NavigationManager NavigationManager { get; set; }
[Inject]
protected DialogService DialogService { get; set; }
[Inject]
protected TooltipService TooltipService { get; set; }
[Inject]
protected ContextMenuService ContextMenuService { get; set; }
[Inject]
protected NotificationService NotificationService { get; set; }
[Inject]
public RulesService RulesService { get; set; }
protected override async Task OnInitializedAsync()
{
coreRule = new CoreRule();
}
protected bool errorVisible;
protected CoreRule coreRule;
protected async Task FormSubmit()
{
try
{
await RulesService.CreateCoreRule(coreRule);
DialogService.Close(coreRule);
}
catch (Exception ex)
{
errorVisible = true;
}
}
protected async Task CancelButtonClick(MouseEventArgs args)
{
DialogService.Close(null);
}
}

View File

@ -1,31 +0,0 @@
@page "/add-core-rule-criteria-operator"
<PageTitle>Add CoreRuleCriteriaOperator</PageTitle>
<RadzenColumn SizeMD=12>
<RadzenAlert Shade="Shade.Lighter" Variant="Variant.Flat" Size="AlertSize.Small" AlertStyle="AlertStyle.Danger" Visible="@errorVisible">Cannot save CoreRuleCriteriaOperator</RadzenAlert>
<RadzenTemplateForm TItem="CoreRuleCriteriaOperator" Data="@coreRuleCriteriaOperator" Visible="@(coreRuleCriteriaOperator != null)" Submit="@FormSubmit">
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Core Rule" Component="CoreRule" style="width: 100%" />
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenDropDown Data="@coreRulesForRuleID" TextProperty="RuleName" ValueProperty="ID" AllowClear=true
Disabled=@(hasRuleIDValue) Placeholder="Choose CoreRule" style="display: block; width: 100%" @bind-Value="@coreRuleCriteriaOperator.RuleID" Name="RuleID"
/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Operator1" Component="Operator1" style="width: 100%" />
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRuleCriteriaOperator.Operator1" Name="Operator1" />
</RadzenColumn>
</RadzenRow>
<RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center" JustifyContent="JustifyContent.End" Gap="0.5rem">
<RadzenButton ButtonStyle="ButtonStyle.Primary" ButtonType="ButtonType.Submit" Icon="save" Text="Save" Variant="Variant.Flat" />
<RadzenButton ButtonStyle="ButtonStyle.Light" Text="Cancel" Variant="Variant.Flat" Click="@CancelButtonClick" />
</RadzenStack>
</RadzenTemplateForm>
</RadzenColumn>

View File

@ -1,75 +0,0 @@
using ILoan.Tools.Infrastructure.Services;
namespace ILoan.Tools.Application.Pages;
public partial class AddCoreRuleCriteriaOperator
{
[Inject]
protected IJSRuntime JSRuntime { get; set; }
[Inject]
protected NavigationManager NavigationManager { get; set; }
[Inject]
protected DialogService DialogService { get; set; }
[Inject]
protected TooltipService TooltipService { get; set; }
[Inject]
protected ContextMenuService ContextMenuService { get; set; }
[Inject]
protected NotificationService NotificationService { get; set; }
[Inject]
public RulesService RulesService { get; set; }
protected override async Task OnInitializedAsync()
{
coreRulesForRuleID = await RulesService.GetCoreRules();
}
protected bool errorVisible;
protected CoreRuleCriteriaOperator coreRuleCriteriaOperator;
protected IEnumerable<CoreRule> coreRulesForRuleID;
protected async Task FormSubmit()
{
try
{
await RulesService.CreateCoreRuleCriteriaOperator(coreRuleCriteriaOperator);
DialogService.Close(coreRuleCriteriaOperator);
}
catch (Exception ex)
{
errorVisible = true;
}
}
protected async Task CancelButtonClick(MouseEventArgs args)
{
DialogService.Close(null);
}
bool hasRuleIDValue;
[Parameter]
public int? RuleID { get; set; }
public override async Task SetParametersAsync(ParameterView parameters)
{
coreRuleCriteriaOperator = new CoreRuleCriteriaOperator();
hasRuleIDValue = parameters.TryGetValue<int?>("RuleID", out var hasRuleIDResult);
if (hasRuleIDValue)
{
coreRuleCriteriaOperator.RuleID = hasRuleIDResult;
}
await base.SetParametersAsync(parameters);
}
}

View File

@ -1,75 +0,0 @@
@page "/add-core-rule-criterion"
<PageTitle>Add CoreRuleCriterion</PageTitle>
<RadzenColumn SizeMD=12>
<RadzenAlert Shade="Shade.Lighter" Variant="Variant.Flat" Size="AlertSize.Small" AlertStyle="AlertStyle.Danger" Visible="@errorVisible">Cannot save CoreRuleCriterion</RadzenAlert>
<RadzenTemplateForm TItem="CoreRuleCriterion" Data="@coreRuleCriterion" Visible="@(coreRuleCriterion != null)" Submit="@FormSubmit">
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Core Rule" Component="CoreRule" style="width: 100%" />
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenDropDown Data="@coreRulesForRuleID" TextProperty="RuleName" ValueProperty="ID" AllowClear=true
Disabled=@(hasRuleIDValue) Placeholder="Choose CoreRule" style="display: block; width: 100%" @bind-Value="@coreRuleCriterion.RuleID" Name="RuleID"
/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Property" Component="Property" style="width: 100%" />
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenAutoComplete Data="@Properties" @bind-Value="@coreRuleCriterion.Property"
Placeholder="Choose property or type your own" style="display: block; width: 100%" Name="Property"
/>
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRuleCriterion.Property" Name="Value" class="rz-pa-1" />
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Comparison" Component="Comparison" style="width: 100%" />
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenDropDown TValue="string" Data="@Comparisons" @bind-Value="@coreRuleCriterion.Comparison" AllowClear=true
Placeholder="Choose comparer" style="display: block; width: 100%" Name="Comparison" />
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Value" Component="Value" style="width: 100%" />
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRuleCriterion.Value" Name="Value" />
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Value Is Property" Component="ValueIsProperty" style="width: 100%" />
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenCheckBox @bind-Value="@coreRuleCriterion.ValueIsProperty" Name="ValueIsProperty" />
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Return Count" Component="ReturnCount" style="width: 100%" />
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenCheckBox @bind-Value="@coreRuleCriterion.ReturnCount" Name="ReturnCount" />
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Is Threshold Criterium" Component="IsThresholdCriterium" style="width: 100%" />
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenCheckBox @bind-Value="@coreRuleCriterion.IsThresholdCriterium" Name="IsThresholdCriterium" />
</RadzenColumn>
</RadzenRow>
<RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center" JustifyContent="JustifyContent.End" Gap="0.5rem">
<RadzenButton ButtonStyle="ButtonStyle.Primary" ButtonType="ButtonType.Submit" Icon="save" Text="Save" Variant="Variant.Flat" />
<RadzenButton ButtonStyle="ButtonStyle.Light" Text="Cancel" Variant="Variant.Flat" Click="@CancelButtonClick" />
</RadzenStack>
</RadzenTemplateForm>
</RadzenColumn>

View File

@ -1,85 +0,0 @@
using ILoan.Tools.Infrastructure.Services;
namespace ILoan.Tools.Application.Pages;
public partial class AddCoreRuleCriterion
{
[Inject]
protected IJSRuntime JSRuntime { get; set; }
[Inject]
protected NavigationManager NavigationManager { get; set; }
[Inject]
protected DialogService DialogService { get; set; }
[Inject]
protected TooltipService TooltipService { get; set; }
[Inject]
protected ContextMenuService ContextMenuService { get; set; }
[Inject]
protected NotificationService NotificationService { get; set; }
[Inject]
public RulesService RulesService { get; set; }
public List<string> Properties { get; set; }
public List<string> Comparisons { get; set; }
protected override async Task OnInitializedAsync()
{
Properties = RulesService.GetProperties();
Comparisons = RulesService.GetComparisons();
coreRulesForRuleID = await RulesService.GetCoreRules();
}
protected bool errorVisible;
protected CoreRuleCriterion coreRuleCriterion;
protected IEnumerable<CoreRule> coreRulesForRuleID;
protected async Task FormSubmit()
{
try
{
await RulesService.CreateCoreRuleCriterion(coreRuleCriterion);
DialogService.Close(coreRuleCriterion);
}
catch (Exception ex)
{
errorVisible = true;
}
}
protected async Task CancelButtonClick(MouseEventArgs args)
{
DialogService.Close(null);
}
bool hasRuleIDValue;
[Parameter]
public int? RuleID { get; set; }
public override async Task SetParametersAsync(ParameterView parameters)
{
coreRuleCriterion = new CoreRuleCriterion();
hasRuleIDValue = parameters.TryGetValue<int?>("RuleID", out var hasRuleIDResult);
if (hasRuleIDValue)
{
coreRuleCriterion.RuleID = hasRuleIDResult;
}
await base.SetParametersAsync(parameters);
}
void OnChange(dynamic args)
{
coreRuleCriterion.Property = args;
}
}

View File

@ -1,139 +0,0 @@
@page "/"
@using ILoan.Tools.Domain.Entities
<PageTitle>CoreRules</PageTitle>
<RadzenStack>
<RadzenRow AlignItems="AlignItems.Center">
<RadzenColumn Size="12" SizeMD="6">
<RadzenText Text="CoreRules" TextStyle="TextStyle.H3" TagName="TagName.H1" style="margin: 0"/>
</RadzenColumn>
<RadzenColumn Size="12" SizeMD="6">
<RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center" JustifyContent="JustifyContent.End" Gap="0.5rem">
<RadzenButton Icon="build" Text="Generate" Click="@GenerateButtonClick" Variant="Variant.Flat"/>
<RadzenButton Icon="add_circle_outline" Text="Add" Click="@AddButtonClick" Variant="Variant.Flat"/>
</RadzenStack>
</RadzenColumn>
</RadzenRow>
<RadzenRow>
<RadzenColumn SizeMD="12">
<RadzenDataGrid @ref="grid0" ColumnWidth="200px" ExpandMode="DataGridExpandMode.Single" AllowFiltering="true" FilterMode="FilterMode.Advanced" AllowPaging="true" AllowSorting="true" ShowPagingSummary="true" PageSizeOptions="@(new[] { 5, 10, 20, 30 })"
Data="@coreRules" TItem="CoreRule" RowSelect="@EditRow" RowExpand="@GetChildData">
<Columns>
<RadzenDataGridColumn TItem="CoreRule" Property="ID" Title="ID">
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="CoreRule" Property="RuleName" Title="Rule Name" Width="400px">
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="CoreRule" Property="Source" Title="Source">
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="CoreRule" Property="DefaultThreshold" Title="Default Threshold">
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="CoreRule" Property="Blocked" Title="Blocked">
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="CoreRule" Property="TriggersManualReview" Title="Triggers Manual Review">
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="CoreRule" Property="SuggestedResolution" Title="Suggested Resolution">
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="CoreRule" Property="TriggerReason" Title="Trigger Reason">
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="CoreRule" Property="UseLastRecord" Title="Use Last Record">
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="CoreRule" Property="ApplicantType" Title="Applicant Type">
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="CoreRule" Property="FilterOnClickthrough" Title="Filter On Clickthrough">
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="CoreRule" Property="RunBeforeStatus" Title="Run Before Status">
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="CoreRule" Property="DisplaySection" Title="Display Section">
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="CoreRule" Property="WarningField" Title="Warning Field">
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="CoreRule" Property="DutchRuleName" Title="Dutch Rule Name">
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="CoreRule" Property="DutchTriggerReason" Title="Dutch Trigger Reason">
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="CoreRule" Property="DutchSuggestedResolution" Title="Dutch Suggested Resolution">
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="CoreRule" Property="DutchFilterOnClickthrough" Title="Dutch Filter On Clickthrough">
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="CoreRule" Property="RuleExplanation" Title="Rule Explanation">
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="CoreRule" Property="DutchRuleExplanation" Title="Dutch Rule Explanation">
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="CoreRule" Property="WorkItemId" Title="Work Item Id">
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="CoreRule" Property="Title" Title="Title">
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="CoreRule" Property="update" Title="update">
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="CoreRule" Filterable="false" Sortable="false" Width="70px" TextAlign="TextAlign.Center">
<Template Context="coreRule">
<RadzenButton ButtonStyle="ButtonStyle.Danger" Icon="delete" Size="ButtonSize.Medium"
Shade="Shade.Lighter" Variant="Variant.Flat"
Click="@(args => GridDeleteButtonClick(args, coreRule))"@onclick:stopPropagation="true"/>
</Template>
</RadzenDataGridColumn>
</Columns>
<Template Context="coreRule">
<RadzenStack Class="rz-my-8">
<RadzenRow Gap="0" AlignItems="AlignItems.Center">
<RadzenColumn Size="12" SizeMD="6">
<RadzenText Visible="@(coreRuleChild != null)" Text="CoreRuleCriteria" TextStyle="TextStyle.H4" TagName="TagName.H2" style="margin: 0"/>
<RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center" JustifyContent="JustifyContent.Start" Gap="0.5rem">
<RadzenButton Visible="true" Icon="add_circle_outline" Text="Add" Click="@(args => CoreRuleCriteriaAddButtonClick(args, coreRuleChild))"/>
</RadzenStack>
</RadzenColumn>
</RadzenRow>
<RadzenDataGrid ColumnWidth="50px" Visible="@(coreRuleChild != null)" @ref="CoreRuleCriteriaDataGrid" AllowFiltering="true" FilterMode="FilterMode.Advanced" AllowPaging="true" AllowSorting="true" ShowPagingSummary="true" PageSizeOptions="@(new[] { 5, 10, 20, 30 })"
Data="@coreRuleChild?.CoreRuleCriteria" TItem="CoreRuleCriterion" RowSelect="@(args => CoreRuleCriteriaRowSelect(args, coreRuleChild))">
<Columns>
<RadzenDataGridColumn TItem="CoreRuleCriterion" Property="ID" Title="ID" Width="15px" />
<RadzenDataGridColumn TItem="CoreRuleCriterion" Title="Description">
<Template Context="coreRuleCriterionChild">
@(coreRuleCriterionChild.Property + " " + coreRuleCriterionChild.Comparison + " " + coreRuleCriterionChild.Value)
</Template>
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="CoreRuleCriterion" Property="ValueIsProperty" Title="Value Is Property" Width="10px" />
<RadzenDataGridColumn TItem="CoreRuleCriterion" Property="ReturnCount" Title="Return Count" Width="10px" />
<RadzenDataGridColumn TItem="CoreRuleCriterion" Property="IsThresholdCriterium" Title="Is Threshold Criterium" Width="10px" />
<RadzenDataGridColumn TItem="CoreRuleCriterion" Property="CoreRule.RuleName" Title="Core Rule" />
<RadzenDataGridColumn TItem="CoreRuleCriterion" Filterable="false" Sortable="false" Width="70px" TextAlign="TextAlign.Center">
<Template Context="coreRuleCriterionChild">
<RadzenButton ButtonStyle="ButtonStyle.Danger" Icon="delete" Size="ButtonSize.Medium" Shade="Shade.Lighter" Variant="Variant.Flat"
Click="@(args => CoreRuleCriteriaDeleteButtonClick(args, coreRuleCriterionChild))"@onclick:stopPropagation="true"/>
</Template>
</RadzenDataGridColumn>
</Columns>
</RadzenDataGrid>
</RadzenStack>
<RadzenStack Class="rz-my-8">
<RadzenRow Gap="0" AlignItems="AlignItems.Center">
<RadzenColumn Size="12" SizeMD="6">
<RadzenText Visible="@(coreRuleChild != null)" Text="CoreRuleCriteriaOperators" TextStyle="TextStyle.H4" TagName="TagName.H2" style="margin: 0"/>
<RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center" JustifyContent="JustifyContent.Start" Gap="0.5rem">
<RadzenButton Visible="true" Icon="add_circle_outline" Text="Add" Click="@(args => CoreRuleCriteriaOperatorsAddButtonClick(args, coreRuleChild))"/>
</RadzenStack>
</RadzenColumn>
</RadzenRow>
<RadzenDataGrid ColumnWidth="200px" Visible="@(coreRuleChild != null)" @ref="CoreRuleCriteriaOperatorsDataGrid" AllowFiltering="true" FilterMode="FilterMode.Advanced" AllowPaging="true" AllowSorting="true" ShowPagingSummary="true" PageSizeOptions="@(new[] { 5, 10, 20, 30 })"
Data="@coreRuleChild?.CoreRuleCriteriaOperators" TItem="CoreRuleCriteriaOperator" RowSelect="@(args => CoreRuleCriteriaOperatorsRowSelect(args, coreRuleChild))">
<Columns>
<RadzenDataGridColumn TItem="CoreRuleCriteriaOperator" Property="ID" Title="ID" Width="15px" />
<RadzenDataGridColumn TItem="CoreRuleCriteriaOperator" Property="Operator1" Title="Operator1" Width="15px" />
<RadzenDataGridColumn TItem="CoreRuleCriteriaOperator" Property="CoreRule.RuleName" Title="Core Rule" />
<RadzenDataGridColumn TItem="CoreRuleCriteriaOperator" Filterable="false" Sortable="false" Width="70px" TextAlign="TextAlign.Center">
<Template Context="coreRuleCriteriaOperatorChild">
<RadzenButton ButtonStyle="ButtonStyle.Danger" Icon="delete" Size="ButtonSize.Medium" Shade="Shade.Lighter" Variant="Variant.Flat"
Click="@(args => CoreRuleCriteriaOperatorsDeleteButtonClick(args, coreRuleCriteriaOperatorChild))"@onclick:stopPropagation="true"/>
</Template>
</RadzenDataGridColumn>
</Columns>
</RadzenDataGrid>
</RadzenStack>
</Template>
</RadzenDataGrid>
</RadzenColumn>
</RadzenRow>
</RadzenStack>

View File

@ -1,207 +0,0 @@
using ILoan.Tools.Infrastructure.Services;
namespace ILoan.Tools.Application.Pages;
public partial class CoreRules
{
[Inject]
protected IJSRuntime JSRuntime { get; set; }
[Inject]
protected NavigationManager NavigationManager { get; set; }
[Inject]
protected DialogService DialogService { get; set; }
[Inject]
protected TooltipService TooltipService { get; set; }
[Inject]
protected ContextMenuService ContextMenuService { get; set; }
[Inject]
protected NotificationService NotificationService { get; set; }
[Inject]
public RulesService RulesService { get; set; }
[Inject]
public RuleFileGeneratorService RuleFileGeneratorService { get; set; }
protected IEnumerable<CoreRule> coreRules;
protected RadzenDataGrid<CoreRule> grid0;
protected override async Task OnInitializedAsync()
{
coreRules = await RulesService.GetCoreRules();
}
protected async Task AddButtonClick(MouseEventArgs args)
{
await DialogService.OpenAsync<AddCoreRule>("Add CoreRule", null);
await grid0.Reload();
}
/// <summary>
/// Execute RuleFileGeneratorService to generate SQL files
/// </summary>
/// <param name="args"></param>
/// <returns></returns>
protected async Task GenerateButtonClick()
{
await RuleFileGeneratorService.GenerateRuleFilesAsync();
NotificationService.Notify(new NotificationMessage
{
Severity = NotificationSeverity.Success,
Summary = $"Success",
Detail = $"Rule files generated successfully",
});
}
protected async Task EditRow(CoreRule args)
{
await DialogService.OpenAsync<EditCoreRule>("Edit CoreRule", new Dictionary<string, object> { {"ID", args.ID} });
}
protected async Task GridDeleteButtonClick(MouseEventArgs args, CoreRule coreRule)
{
try
{
if (await DialogService.Confirm("Are you sure you want to delete this record?") == true)
{
var deleteResult = await RulesService.DeleteCoreRule(coreRule.ID);
if (deleteResult != null)
{
await grid0.Reload();
}
}
}
catch (Exception ex)
{
NotificationService.Notify(new NotificationMessage
{
Severity = NotificationSeverity.Error,
Summary = $"Error",
Detail = $"Unable to delete CoreRule"
});
}
}
protected CoreRule coreRuleChild;
protected async Task GetChildData(CoreRule args)
{
coreRuleChild = args;
var CoreRuleCriteriaResult = await RulesService.GetCoreRuleCriteria(new Query { Filter = $@"i => i.RuleID == {args.ID}", Expand = "CoreRule" });
if (CoreRuleCriteriaResult != null)
{
args.CoreRuleCriteria = CoreRuleCriteriaResult.ToList();
}
var CoreRuleCriteriaOperatorsResult = await RulesService.GetCoreRuleCriteriaOperators(new Query { Filter = $@"i => i.RuleID == {args.ID}", Expand = "CoreRule" });
if (CoreRuleCriteriaOperatorsResult != null)
{
args.CoreRuleCriteriaOperators = CoreRuleCriteriaOperatorsResult.ToList();
}
}
protected CoreRuleCriterion coreRuleCriterionCoreRuleCriteria;
protected IEnumerable<CoreRule> coreRulesForRuleIDCoreRuleCriteria;
protected RadzenDataGrid<CoreRuleCriterion> CoreRuleCriteriaDataGrid;
protected async Task CoreRuleCriteriaAddButtonClick(MouseEventArgs args, CoreRule data)
{
var dialogResult = await DialogService.OpenAsync<AddCoreRuleCriterion>("Add CoreRuleCriteria", new Dictionary<string, object> { {"RuleID" , data.ID} }, new DialogOptions
{
Width = "70%"
});
await GetChildData(data);
await CoreRuleCriteriaDataGrid.Reload();
}
protected async Task CoreRuleCriteriaRowSelect(CoreRuleCriterion args, CoreRule data)
{
var dialogResult = await DialogService.OpenAsync<EditCoreRuleCriterion>("Edit CoreRuleCriteria", new Dictionary<string, object> { {"ID", args.ID} });
await GetChildData(data);
await CoreRuleCriteriaDataGrid.Reload();
}
protected async Task CoreRuleCriteriaDeleteButtonClick(MouseEventArgs args, CoreRuleCriterion coreRuleCriterion)
{
try
{
if (await DialogService.Confirm("Are you sure you want to delete this record?") == true)
{
var deleteResult = await RulesService.DeleteCoreRuleCriterion(coreRuleCriterion.ID);
await GetChildData(coreRuleChild);
if (deleteResult != null)
{
await CoreRuleCriteriaDataGrid.Reload();
}
}
}
catch (System.Exception ex)
{
NotificationService.Notify(new NotificationMessage
{
Severity = NotificationSeverity.Error,
Summary = $"Error",
Detail = $"Unable to delete CoreRuleCriterion"
});
}
}
protected CoreRuleCriteriaOperator coreRuleCriteriaOperatorCoreRuleCriteriaOperators;
protected IEnumerable<CoreRule> coreRulesForRuleIDCoreRuleCriteriaOperators;
protected RadzenDataGrid<CoreRuleCriteriaOperator> CoreRuleCriteriaOperatorsDataGrid;
protected async Task CoreRuleCriteriaOperatorsAddButtonClick(MouseEventArgs args, CoreRule data)
{
var dialogResult = await DialogService.OpenAsync<AddCoreRuleCriteriaOperator>("Add CoreRuleCriteriaOperators", new Dictionary<string, object> { {"RuleID" , data.ID} });
await GetChildData(data);
await CoreRuleCriteriaOperatorsDataGrid.Reload();
}
protected async Task CoreRuleCriteriaOperatorsRowSelect(CoreRuleCriteriaOperator args, CoreRule data)
{
var dialogResult = await DialogService.OpenAsync<EditCoreRuleCriteriaOperator>("Edit CoreRuleCriteriaOperators", new Dictionary<string, object> { {"ID", args.ID} });
await GetChildData(data);
await CoreRuleCriteriaOperatorsDataGrid.Reload();
}
protected async Task CoreRuleCriteriaOperatorsDeleteButtonClick(MouseEventArgs args, CoreRuleCriteriaOperator coreRuleCriteriaOperator)
{
try
{
if (await DialogService.Confirm("Are you sure you want to delete this record?") == true)
{
var deleteResult = await RulesService.DeleteCoreRuleCriteriaOperator(coreRuleCriteriaOperator.ID);
await GetChildData(coreRuleChild);
if (deleteResult != null)
{
await CoreRuleCriteriaOperatorsDataGrid.Reload();
}
}
}
catch (System.Exception ex)
{
NotificationService.Notify(new NotificationMessage
{
Severity = NotificationSeverity.Error,
Summary = $"Error",
Detail = $"Unable to delete CoreRuleCriteriaOperator"
});
}
}
}

View File

@ -1,203 +0,0 @@
@page "/edit-core-rule"
@using ILoan.Tools.Domain.Entities
<PageTitle>Edit CoreRule</PageTitle>
<RadzenColumn SizeMD=12>
<RadzenAlert Shade="Shade.Lighter" Variant="Variant.Flat" Size="AlertSize.Small" AlertStyle="AlertStyle.Danger" Visible="@errorVisible">Cannot save CoreRule</RadzenAlert>
<RadzenTemplateForm TItem="CoreRule" Data="@coreRule" Visible="@(coreRule != null)" Submit="@FormSubmit">
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Rule ID" Component="RuleId" style="width: 100%" />
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenNumeric style="display: block; width: 100%" @bind-Value="@coreRule.ID" Name="RuleId" />
<RadzenRequiredValidator Component="RuleId" Text="Rule id is required" />
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Rule Name" Component="RuleName" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextArea style="display: block; width: 100%" @bind-Value="@coreRule.RuleName" Name="RuleName"/>
<RadzenRequiredValidator Component="RuleName" Text="RuleName is required"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Source" Component="Source" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRule.Source" Name="Source"/>
<RadzenRequiredValidator Component="Source" Text="Source is required"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Default Threshold" Component="DefaultThreshold" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenNumeric style="display: block; width: 100%" @bind-Value="@coreRule.DefaultThreshold" Name="DefaultThreshold"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Blocked" Component="Blocked" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenCheckBox @bind-Value="@coreRule.Blocked" Name="Blocked"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Triggers Manual Review" Component="TriggersManualReview" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenCheckBox @bind-Value="@coreRule.TriggersManualReview" Name="TriggersManualReview"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Suggested Resolution" Component="SuggestedResolution" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRule.SuggestedResolution" Name="SuggestedResolution"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Trigger Reason" Component="TriggerReason" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRule.TriggerReason" Name="TriggerReason"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Use Last Record" Component="UseLastRecord" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenCheckBox @bind-Value="@coreRule.UseLastRecord" Name="UseLastRecord"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Applicant Type" Component="ApplicantType" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRule.ApplicantType" Name="ApplicantType"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Filter On Clickthrough" Component="FilterOnClickthrough" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRule.FilterOnClickthrough" Name="FilterOnClickthrough"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Run Before Status" Component="RunBeforeStatus" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRule.RunBeforeStatus" Name="RunBeforeStatus"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Display Section" Component="DisplaySection" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRule.DisplaySection" Name="DisplaySection"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Warning Field" Component="WarningField" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRule.WarningField" Name="WarningField"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Dutch Rule Name" Component="DutchRuleName" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextArea style="display: block; width: 100%" @bind-Value="@coreRule.DutchRuleName" Name="DutchRuleName"/>
<RadzenRequiredValidator Component="DutchRuleName" Text="DutchRuleName is required"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Dutch Trigger Reason" Component="DutchTriggerReason" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRule.DutchTriggerReason" Name="DutchTriggerReason"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Dutch Suggested Resolution" Component="DutchSuggestedResolution" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRule.DutchSuggestedResolution" Name="DutchSuggestedResolution"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Dutch Filter On Clickthrough" Component="DutchFilterOnClickthrough" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRule.DutchFilterOnClickthrough" Name="DutchFilterOnClickthrough"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Rule Explanation" Component="RuleExplanation" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextArea style="display: block; width: 100%" @bind-Value="@coreRule.RuleExplanation" Name="RuleExplanation"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Dutch Rule Explanation" Component="DutchRuleExplanation" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextArea style="display: block; width: 100%" @bind-Value="@coreRule.DutchRuleExplanation" Name="DutchRuleExplanation"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Work Item Id" Component="WorkItemId" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenNumeric style="display: block; width: 100%" @bind-Value="@coreRule.WorkItemId" Name="WorkItemId"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Title" Component="Title" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRule.Title" Name="Title"/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="update" Component="Update" style="width: 100%"/>
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenNumeric style="display: block; width: 100%" @bind-Value="@coreRule.Update" Name="Update"/>
</RadzenColumn>
</RadzenRow>
<RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center" JustifyContent="JustifyContent.End" Gap="0.5rem">
<RadzenButton ButtonStyle="ButtonStyle.Primary" ButtonType="ButtonType.Submit" Icon="save" Text="Save" Variant="Variant.Flat"/>
<RadzenButton ButtonStyle="ButtonStyle.Light" Text="Cancel" Variant="Variant.Flat" Click="@CancelButtonClick"/>
</RadzenStack>
</RadzenTemplateForm>
</RadzenColumn>

View File

@ -1,53 +0,0 @@
namespace ILoan.Tools.Application.Pages;
public partial class EditCoreRule
{
[Inject]
protected IJSRuntime JSRuntime { get; set; }
[Inject]
protected NavigationManager NavigationManager { get; set; }
[Inject]
protected DialogService DialogService { get; set; }
[Inject]
protected TooltipService TooltipService { get; set; }
[Inject]
protected ContextMenuService ContextMenuService { get; set; }
[Inject]
protected NotificationService NotificationService { get; set; }
[Inject]
public RulesService RulesService { get; set; }
[Parameter]
public int ID { get; set; }
protected override async Task OnInitializedAsync()
{
coreRule = await RulesService.GetCoreRuleById(ID);
}
protected bool errorVisible;
protected CoreRule coreRule;
protected async Task FormSubmit()
{
try
{
coreRule.Update += 1;
await RulesService.UpdateCoreRule(ID, coreRule);
DialogService.Close(coreRule);
}
catch (Exception ex)
{
errorVisible = true;
}
}
protected async Task CancelButtonClick(MouseEventArgs args)
{
DialogService.Close(null);
}
}

View File

@ -1,40 +0,0 @@
@page "/edit-core-rule-criteria-operator"
<PageTitle>Edit CoreRuleCriteriaOperator</PageTitle>
<RadzenColumn SizeMD=12>
<RadzenAlert Shade="Shade.Lighter" Variant="Variant.Flat" Size="AlertSize.Small" AlertStyle="AlertStyle.Danger" Visible="@errorVisible">Cannot save CoreRuleCriteriaOperator</RadzenAlert>
<RadzenTemplateForm TItem="CoreRuleCriteriaOperator" Data="@coreRuleCriteriaOperator" Visible="@(coreRuleCriteriaOperator != null)" Submit="@FormSubmit">
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Core Rule" Component="CoreRule" style="width: 100%" />
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenDropDown Data="@coreRulesForRuleID" TextProperty="RuleName" ValueProperty="ID" AllowClear=true
Disabled=@(hasRuleIDValue) Placeholder="Choose CoreRule" style="display: block; width: 100%" @bind-Value="@coreRuleCriteriaOperator.RuleID" Name="RuleID"
/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Operator1" Component="Operator1" style="width: 100%" />
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRuleCriteriaOperator.Operator1" Name="Operator1" />
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="update" Component="Update" style="width: 100%" />
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenNumeric style="display: block; width: 100%" @bind-Value="@coreRuleCriteriaOperator.Update" Name="Update" />
</RadzenColumn>
</RadzenRow>
<RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center" JustifyContent="JustifyContent.End" Gap="0.5rem">
<RadzenButton ButtonStyle="ButtonStyle.Primary" ButtonType="ButtonType.Submit" Icon="save" Text="Save" Variant="Variant.Flat" />
<RadzenButton ButtonStyle="ButtonStyle.Light" Text="Cancel" Variant="Variant.Flat" Click="@CancelButtonClick" />
</RadzenStack>
</RadzenTemplateForm>
</RadzenColumn>

View File

@ -1,81 +0,0 @@
using ILoan.Tools.Infrastructure.Services;
namespace ILoan.Tools.Application.Pages
{
public partial class EditCoreRuleCriteriaOperator
{
[Inject]
protected IJSRuntime JSRuntime { get; set; }
[Inject]
protected NavigationManager NavigationManager { get; set; }
[Inject]
protected DialogService DialogService { get; set; }
[Inject]
protected TooltipService TooltipService { get; set; }
[Inject]
protected ContextMenuService ContextMenuService { get; set; }
[Inject]
protected NotificationService NotificationService { get; set; }
[Inject]
public RulesService RulesService { get; set; }
[Parameter]
public int ID { get; set; }
protected override async Task OnInitializedAsync()
{
coreRuleCriteriaOperator = await RulesService.GetCoreRuleCriteriaOperatorById(ID);
coreRulesForRuleID = await RulesService.GetCoreRules();
}
protected bool errorVisible;
protected CoreRuleCriteriaOperator coreRuleCriteriaOperator;
protected IEnumerable<CoreRule> coreRulesForRuleID;
protected async Task FormSubmit()
{
try
{
coreRuleCriteriaOperator.Update += 1;
await RulesService.UpdateCoreRuleCriteriaOperator(ID, coreRuleCriteriaOperator);
DialogService.Close(coreRuleCriteriaOperator);
}
catch (Exception ex)
{
errorVisible = true;
}
}
protected async Task CancelButtonClick(MouseEventArgs args)
{
DialogService.Close(null);
}
bool hasRuleIDValue;
[Parameter]
public int? RuleID { get; set; }
public override async Task SetParametersAsync(ParameterView parameters)
{
coreRuleCriteriaOperator = new CoreRuleCriteriaOperator();
hasRuleIDValue = parameters.TryGetValue<int?>("RuleID", out var hasRuleIDResult);
if (hasRuleIDValue)
{
coreRuleCriteriaOperator.RuleID = hasRuleIDResult;
}
await base.SetParametersAsync(parameters);
}
}
}

View File

@ -1,83 +0,0 @@
@page "/edit-core-rule-criterion"
<PageTitle>Edit CoreRuleCriterion</PageTitle>
<RadzenColumn SizeMD=12>
<RadzenAlert Shade="Shade.Lighter" Variant="Variant.Flat" Size="AlertSize.Small" AlertStyle="AlertStyle.Danger" Visible="@errorVisible">Cannot save CoreRuleCriterion</RadzenAlert>
<RadzenTemplateForm TItem="CoreRuleCriterion" Data="@coreRuleCriterion" Visible="@(coreRuleCriterion != null)" Submit="@FormSubmit">
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Core Rule" Component="CoreRule" style="width: 100%" />
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenDropDown Data="@coreRulesForRuleID" TextProperty="RuleName" ValueProperty="ID" AllowClear=true
Disabled=@(hasRuleIDValue) Placeholder="Choose CoreRule" style="display: block; width: 100%" @bind-Value="@coreRuleCriterion.RuleID" Name="RuleID"
/>
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Property" Component="Property" style="width: 100%" />
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenDropDown TValue="string" Data="@Properties" @bind-Value="@coreRuleCriterion.Property" AllowClear=true
Placeholder="Choose property" style="display: block; width: 100%" Name="Property" />
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRuleCriterion.Property" Name="Value" class="rz-pa-1" />
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Comparison" Component="Comparison" style="width: 100%" />
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenDropDown TValue="string" Data="@Comparisons" @bind-Value="@coreRuleCriterion.Comparison" AllowClear=true
Placeholder="Choose comparer" style="display: block; width: 100%" Name="Comparison" />
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Value" Component="Value" style="width: 100%" />
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRuleCriterion.Value" Name="Value" />
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Value Is Property" Component="ValueIsProperty" style="width: 100%" />
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenCheckBox @bind-Value="@coreRuleCriterion.ValueIsProperty" Name="ValueIsProperty" />
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Return Count" Component="ReturnCount" style="width: 100%" />
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenCheckBox @bind-Value="@coreRuleCriterion.ReturnCount" Name="ReturnCount" />
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="Is Threshold Criterium" Component="IsThresholdCriterium" style="width: 100%" />
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenCheckBox @bind-Value="@coreRuleCriterion.IsThresholdCriterium" Name="IsThresholdCriterium" />
</RadzenColumn>
</RadzenRow>
<RadzenRow style="margin-bottom: 1rem">
<RadzenColumn SizeMD="3">
<RadzenLabel Text="update" Component="Update" style="width: 100%" />
</RadzenColumn>
<RadzenColumn SizeMD="9">
<RadzenNumeric style="display: block; width: 100%" @bind-Value="@coreRuleCriterion.Update" Name="Update" />
</RadzenColumn>
</RadzenRow>
<RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center" JustifyContent="JustifyContent.End" Gap="0.5rem">
<RadzenButton ButtonStyle="ButtonStyle.Primary" ButtonType="ButtonType.Submit" Icon="save" Text="Save" Variant="Variant.Flat" />
<RadzenButton ButtonStyle="ButtonStyle.Light" Text="Cancel" Variant="Variant.Flat" Click="@CancelButtonClick" />
</RadzenStack>
</RadzenTemplateForm>
</RadzenColumn>

View File

@ -1,87 +0,0 @@
using ILoan.Tools.Infrastructure.Services;
namespace ILoan.Tools.Application.Pages
{
public partial class EditCoreRuleCriterion
{
[Inject]
protected IJSRuntime JSRuntime { get; set; }
[Inject]
protected NavigationManager NavigationManager { get; set; }
[Inject]
protected DialogService DialogService { get; set; }
[Inject]
protected TooltipService TooltipService { get; set; }
[Inject]
protected ContextMenuService ContextMenuService { get; set; }
[Inject]
protected NotificationService NotificationService { get; set; }
[Inject]
public RulesService RulesService { get; set; }
[Parameter]
public int ID { get; set; }
public List<string> Properties { get; set; }
public List<string> Comparisons { get; set; }
protected override async Task OnInitializedAsync()
{
Properties = RulesService.GetProperties();
Comparisons = RulesService.GetComparisons();
coreRuleCriterion = await RulesService.GetCoreRuleCriterionById(ID);
coreRulesForRuleID = await RulesService.GetCoreRules();
}
protected bool errorVisible;
protected CoreRuleCriterion coreRuleCriterion;
protected IEnumerable<CoreRule> coreRulesForRuleID;
protected async Task FormSubmit()
{
try
{
coreRuleCriterion.Update += 1;
await RulesService.UpdateCoreRuleCriterion(ID, coreRuleCriterion);
DialogService.Close(coreRuleCriterion);
}
catch (Exception ex)
{
errorVisible = true;
}
}
protected async Task CancelButtonClick(MouseEventArgs args)
{
DialogService.Close(null);
}
bool hasRuleIDValue;
[Parameter]
public int? RuleID { get; set; }
public override async Task SetParametersAsync(ParameterView parameters)
{
coreRuleCriterion = new CoreRuleCriterion();
hasRuleIDValue = parameters.TryGetValue<int?>("RuleID", out var hasRuleIDResult);
if (hasRuleIDValue)
{
coreRuleCriterion.RuleID = hasRuleIDResult;
}
await base.SetParametersAsync(parameters);
}
}
}

View File

@ -21,13 +21,13 @@
</RadzenBody> </RadzenBody>
<RadzenSidebar Expanded="@sidebarExpanded" style="z-index: 2"> <RadzenSidebar Expanded="@sidebarExpanded" style="z-index: 2">
<RadzenStack AlignItems="Radzen.AlignItems.Center" class="rz-py-4 rz-py-lg-6" Style="padding: var(--rz-panel-menu-item-padding); border-bottom: var(--rz-panel-menu-item-border);"> <RadzenStack AlignItems="Radzen.AlignItems.Center" class="rz-py-4 rz-py-lg-6" Style="padding: var(--rz-panel-menu-item-padding); border-bottom: var(--rz-panel-menu-item-border);">
<RadzenText Text="iLoan.Tools" TextStyle="Radzen.Blazor.TextStyle.Subtitle1" class="rz-mb-0" style="color: var(--rz-sidebar-color);" /> <RadzenText Text="iLoan.Rules.Web" TextStyle="Radzen.Blazor.TextStyle.Subtitle1" class="rz-mb-0" style="color: var(--rz-sidebar-color);" />
</RadzenStack> </RadzenStack>
<RadzenPanelMenu> <RadzenPanelMenu>
<RadzenPanelMenuItem Text="Rules" Path="" /> <RadzenPanelMenuItem Text="Home" Path="" />
</RadzenPanelMenu> </RadzenPanelMenu>
<RadzenStack AlignItems="Radzen.AlignItems.Center" Gap="0" class="rz-py-4 rz-py-lg-6" Style="padding: var(--rz-panel-menu-item-padding);"> <RadzenStack AlignItems="Radzen.AlignItems.Center" Gap="0" class="rz-py-4 rz-py-lg-6" Style="padding: var(--rz-panel-menu-item-padding);">
<RadzenText Text="iLoan.Tools v1.0.0" TextStyle="Radzen.Blazor.TextStyle.Caption" TagName="Radzen.Blazor.TagName.P" TextAlign="Radzen.TextAlign.Center" /> <RadzenText Text="iLoan.Rules.Web v1.0.0" TextStyle="Radzen.Blazor.TextStyle.Caption" TagName="Radzen.Blazor.TagName.P" TextAlign="Radzen.TextAlign.Center" />
<RadzenText Text="Copyright Ⓒ 2024" TextStyle="Radzen.Blazor.TextStyle.Caption" class="rz-mb-0" TagName="Radzen.Blazor.TagName.P" TextAlign="Radzen.TextAlign.Center" /> <RadzenText Text="Copyright Ⓒ 2024" TextStyle="Radzen.Blazor.TextStyle.Caption" class="rz-mb-0" TagName="Radzen.Blazor.TagName.P" TextAlign="Radzen.TextAlign.Center" />
</RadzenStack> </RadzenStack>
</RadzenSidebar> </RadzenSidebar>

View File

@ -0,0 +1,42 @@
using System.Net.Http;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Components.Forms;
using Microsoft.AspNetCore.Components.Routing;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Components.Web.Virtualization;
using Microsoft.JSInterop;
using Radzen;
using Radzen.Blazor;
namespace ILoan.Rules.Web.Components.Layout
{
public partial class MainLayout
{
[Inject]
protected IJSRuntime JSRuntime { get; set; }
[Inject]
protected NavigationManager NavigationManager { get; set; }
[Inject]
protected DialogService DialogService { get; set; }
[Inject]
protected TooltipService TooltipService { get; set; }
[Inject]
protected ContextMenuService ContextMenuService { get; set; }
[Inject]
protected NotificationService NotificationService { get; set; }
private bool sidebarExpanded = true;
void SidebarToggleClick()
{
sidebarExpanded = !sidebarExpanded;
}
}
}

View File

@ -0,0 +1,31 @@
@page "/"
<PageTitle>Index</PageTitle>
<RadzenRow Gap="5" RowGap="5">
<RadzenColumn Size="12">
<RadzenText Text="Welcome to your new app" TextStyle="Radzen.Blazor.TextStyle.DisplayH2" TagName="Radzen.Blazor.TagName.Auto"></RadzenText>
<RadzenText Text="Your Success Is Our Biggest Priority" TextStyle="Radzen.Blazor.TextStyle.H4" TagName="Radzen.Blazor.TagName.H2" class="mt-5"></RadzenText>
<RadzenText Text="With Radzen Blazor Studio, application development is just one-click away." TextStyle="Radzen.Blazor.TextStyle.Body1" TagName="Radzen.Blazor.TagName.Auto" class="mt-4" Style="font-size: 20px; line-height: 24px"></RadzenText>
<RadzenText Text="Simple to setup, maintain and update." TextStyle="Radzen.Blazor.TextStyle.Body1" TagName="Radzen.Blazor.TagName.Auto" class="mt-3" Style="font-size: 20px; line-height: 24px"></RadzenText>
<RadzenCard Style="margin-top: 40px; padding: 20px 40px 40px;">
<RadzenRow>
<RadzenColumn Size="12" SizeMD="4">
<RadzenIcon Icon="smart_button" Style="margin-top: 20px; width: 48px; height: 48px; font-size: 48px; color: var(--rz-text-title-color);"></RadzenIcon>
<RadzenText Text="Learn the Fundamentals" TextStyle="Radzen.Blazor.TextStyle.DisplayH6" TagName="Radzen.Blazor.TagName.H3"></RadzenText>
<RadzenLink Text="Docs" Path="https://www.radzen.com/blazor-studio/documentation/" Icon="east" Target="_blank" Style="font-size: 18px"></RadzenLink>
<RadzenLink Text="Videos" Path="https://youtube.com/playlist?list=PLQyJPeb3xHcBij_RbHD__2TOo8Jv5HQVc" Icon="east" Target="_blank" Style="display: block; font-size: 18px"></RadzenLink>
</RadzenColumn>
<RadzenColumn Size="12" SizeMD="4">
<RadzenIcon Icon="code" Style="margin-top: 20px; width: 48px; height: 48px; font-size: 48px; color: var(--rz-text-title-color);"></RadzenIcon>
<RadzenText Text="Radzen Blazor Components" TextStyle="Radzen.Blazor.TextStyle.DisplayH6" TagName="Radzen.Blazor.TagName.H3"></RadzenText>
<RadzenLink Text="Demos" Path="https://blazor.radzen.com" Icon="east" Target="_blank" Style="font-size: 18px"></RadzenLink>
</RadzenColumn>
<RadzenColumn Size="12" SizeMD="4">
<RadzenIcon Icon="people_outline" Style="margin-top: 20px; width: 48px; height: 48px; font-size: 48px; color: var(--rz-text-title-color);"></RadzenIcon>
<RadzenText Text="Radzen Community" TextStyle="Radzen.Blazor.TextStyle.DisplayH6" TagName="Radzen.Blazor.TagName.H3"></RadzenText>
<RadzenLink Text="Radzen Blazor Studio Forums" Path="https://forum.radzen.com/c/radzen-blazor-studio/12" Icon="east" Target="_blank" Style="font-size: 18px"></RadzenLink>
</RadzenColumn>
</RadzenRow>
</RadzenCard>
</RadzenColumn>
</RadzenRow>

View File

@ -0,0 +1,35 @@
using System.Net.Http;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Components.Forms;
using Microsoft.AspNetCore.Components.Routing;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Components.Web.Virtualization;
using Microsoft.JSInterop;
using Radzen;
using Radzen.Blazor;
namespace ILoan.Rules.Web.Components.Pages
{
public partial class Index
{
[Inject]
protected IJSRuntime JSRuntime { get; set; }
[Inject]
protected NavigationManager NavigationManager { get; set; }
[Inject]
protected DialogService DialogService { get; set; }
[Inject]
protected TooltipService TooltipService { get; set; }
[Inject]
protected ContextMenuService ContextMenuService { get; set; }
[Inject]
protected NotificationService NotificationService { get; set; }
}
}

View File

@ -9,6 +9,6 @@
@using Radzen @using Radzen
@using Radzen.Blazor @using Radzen.Blazor
@using static Microsoft.AspNetCore.Components.Web.RenderMode @using static Microsoft.AspNetCore.Components.Web.RenderMode
@using ILoan.Tools @using ILoan.Rules.Web
@using ILoan.Tools.Application @using ILoan.Rules.Web.Components
@using ILoan.Tools.Application.Layout @using ILoan.Rules.Web.Components.Layout

View File

@ -0,0 +1,243 @@
using System;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Extensions;
using Microsoft.AspNetCore.Mvc;
namespace ILoan.Rules.Web.Controllers
{
public partial class ReportController : Controller
{
[HttpGet("/__ssrsreport")]
public async Task Get(string url)
{
if (!String.IsNullOrEmpty(url))
{
using (var httpClient = CreateHttpClient())
{
var responseMessage = await ForwardRequest(httpClient, Request, url);
CopyResponseHeaders(responseMessage, Response);
await WriteResponse(Request, url, responseMessage, Response, false);
}
}
}
[Route("/ssrsproxy/{*url}")]
public async Task Proxy()
{
var urlToReplace = String.Format("{0}://{1}{2}/{3}/", Request.Scheme, Request.Host.Value, Request.PathBase, "ssrsproxy");
var requestedUrl = Request.GetDisplayUrl().Replace(urlToReplace, "", StringComparison.InvariantCultureIgnoreCase);
var reportServerIndex = requestedUrl.IndexOf("/ReportServer", StringComparison.InvariantCultureIgnoreCase);
if (reportServerIndex == -1)
{
reportServerIndex = requestedUrl.IndexOf("/Reports", StringComparison.InvariantCultureIgnoreCase);
}
var reportUrlParts = requestedUrl.Substring(0, reportServerIndex).Split('/');
var url = String.Format("{0}://{1}:{2}{3}", reportUrlParts[0], reportUrlParts[1], reportUrlParts[2],
requestedUrl.Substring(reportServerIndex, requestedUrl.Length - reportServerIndex));
using (var httpClient = CreateHttpClient())
{
var responseMessage = await ForwardRequest(httpClient, Request, url);
CopyResponseHeaders(responseMessage, Response);
if (Request.Method == "POST")
{
await WriteResponse(Request, url, responseMessage, Response, true);
}
else
{
if (responseMessage.Content.Headers.ContentType != null && responseMessage.Content.Headers.ContentType.MediaType == "text/html")
{
await WriteResponse(Request, url, responseMessage, Response, false);
}
else
{
using (var responseStream = await responseMessage.Content.ReadAsStreamAsync())
{
await responseStream.CopyToAsync(Response.Body, 81920, HttpContext.RequestAborted);
}
}
}
}
}
partial void OnHttpClientHandlerCreate(ref HttpClientHandler handler);
private HttpClient CreateHttpClient()
{
var httpClientHandler = new HttpClientHandler();
httpClientHandler.AllowAutoRedirect = true;
httpClientHandler.UseDefaultCredentials = true;
if (httpClientHandler.SupportsAutomaticDecompression)
{
httpClientHandler.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
}
OnHttpClientHandlerCreate(ref httpClientHandler);
return new HttpClient(httpClientHandler);
}
partial void OnReportRequest(ref HttpRequestMessage requestMessage);
async Task<HttpResponseMessage> ForwardRequest(HttpClient httpClient, HttpRequest currentReqest, string url)
{
var proxyRequestMessage = new HttpRequestMessage(new HttpMethod(currentReqest.Method), url);
foreach (var header in currentReqest.Headers)
{
if (header.Key != "Host")
{
proxyRequestMessage.Headers.TryAddWithoutValidation(header.Key, new string[] { header.Value });
}
}
this.OnReportRequest(ref proxyRequestMessage);
if (currentReqest.Method == "POST")
{
using (var stream = new MemoryStream())
{
await currentReqest.Body.CopyToAsync(stream);
stream.Position = 0;
string body = new StreamReader(stream).ReadToEnd();
proxyRequestMessage.Content = new StringContent(body);
if (body.IndexOf("AjaxScriptManager") != -1)
{
proxyRequestMessage.Content.Headers.Remove("Content-Type");
proxyRequestMessage.Content.Headers.Add("Content-Type", new string[] { currentReqest.ContentType });
}
}
}
return await httpClient.SendAsync(proxyRequestMessage);
}
static void CopyResponseHeaders(HttpResponseMessage responseMessage, HttpResponse response)
{
response.StatusCode = (int)responseMessage.StatusCode;
foreach (var header in responseMessage.Headers)
{
response.Headers[header.Key] = header.Value.ToArray();
}
foreach (var header in responseMessage.Content.Headers)
{
response.Headers[header.Key] = header.Value.ToArray();
}
response.Headers.Remove("transfer-encoding");
}
static async Task WriteResponse(HttpRequest currentReqest, string url, HttpResponseMessage responseMessage, HttpResponse response, bool isAjax)
{
var result = await responseMessage.Content.ReadAsStringAsync();
var ReportServer = url.Contains("/ReportServer/", StringComparison.InvariantCultureIgnoreCase) ? "ReportServer" : "Reports";
var reportUri = new Uri(url);
var proxyUrl = String.Format("{0}://{1}{2}/ssrsproxy/{3}/{4}/{5}", currentReqest.Scheme, currentReqest.Host.Value, currentReqest.PathBase,
reportUri.Scheme, reportUri.Host, reportUri.Port);
if (isAjax && result.IndexOf("|") != -1)
{
var builder = new StringBuilder();
var delimiterIndex = 0;
var length = 0;
var index = 0;
var type = "";
var id = "";
var content = "";
while (index < result.Length)
{
delimiterIndex = result.IndexOf("|", index);
if (delimiterIndex == -1)
{
break;
}
length = int.Parse(result.Substring(index, delimiterIndex - index));
if ((length % 1) != 0)
{
break;
}
index = delimiterIndex + 1;
delimiterIndex = result.IndexOf("|", index);
if (delimiterIndex == -1)
{
break;
}
type = result.Substring(index, delimiterIndex - index);
index = delimiterIndex + 1;
delimiterIndex = result.IndexOf("|", index);
if (delimiterIndex == -1)
{
break;
}
id = result.Substring(index, delimiterIndex - index);
index = delimiterIndex + 1;
if ((index + length) >= result.Length)
{
break;
}
content = result.Substring(index, length);
index += length;
if (result.Substring(index, 1) != "|")
{
break;
}
index++;
content = content.Replace($"/{ReportServer}/", $"{proxyUrl}/{ReportServer}/", StringComparison.InvariantCultureIgnoreCase);
if (content.Contains("./ReportViewer.aspx", StringComparison.InvariantCultureIgnoreCase))
{
content = content.Replace("./ReportViewer.aspx", $"{proxyUrl}/{ReportServer}/Pages/ReportViewer.aspx", StringComparison.InvariantCultureIgnoreCase);
}
else
{
content = content.Replace("ReportViewer.aspx", $"{proxyUrl}/{ReportServer}/Pages/ReportViewer.aspx", StringComparison.InvariantCultureIgnoreCase);
}
builder.Append(String.Format("{0}|{1}|{2}|{3}|", content.Length, type, id, content));
}
result = builder.ToString();
}
else
{
result = result.Replace($"/{ReportServer}/", $"{proxyUrl}/{ReportServer}/", StringComparison.InvariantCultureIgnoreCase);
if (result.Contains("./ReportViewer.aspx", StringComparison.InvariantCultureIgnoreCase))
{
result = result.Replace("./ReportViewer.aspx", $"{proxyUrl}/{ReportServer}/Pages/ReportViewer.aspx", StringComparison.InvariantCultureIgnoreCase);
}
else
{
result = result.Replace("ReportViewer.aspx", $"{proxyUrl}/{ReportServer}/Pages/ReportViewer.aspx", StringComparison.InvariantCultureIgnoreCase);
}
}
response.Headers.Remove("Content-Length");
response.Headers.Append("Content-Length", new string[] { System.Text.Encoding.UTF8.GetByteCount(result).ToString() });
await response.WriteAsync(result);
}
}
}

View File

@ -0,0 +1,88 @@
using System;
using System.IO;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Hosting;
namespace ILoan.Rules.Web.Controllers
{
public partial class UploadController : Controller
{
private readonly IWebHostEnvironment environment;
public UploadController(IWebHostEnvironment environment)
{
this.environment = environment;
}
// Single file upload
[HttpPost("upload/single")]
public IActionResult Single(IFormFile file)
{
try
{
// Put your code here
return StatusCode(200);
}
catch (Exception ex)
{
return StatusCode(500, ex.Message);
}
}
// Multiple files upload
[HttpPost("upload/multiple")]
public IActionResult Multiple(IFormFile[] files)
{
try
{
// Put your code here
return StatusCode(200);
}
catch (Exception ex)
{
return StatusCode(500, ex.Message);
}
}
// Multiple files upload with parameter
[HttpPost("upload/{id}")]
public IActionResult Post(IFormFile[] files, int id)
{
try
{
// Put your code here
return StatusCode(200);
}
catch (Exception ex)
{
return StatusCode(500, ex.Message);
}
}
// Image file upload (used by HtmlEditor components)
[HttpPost("upload/image")]
public IActionResult Image(IFormFile file)
{
try
{
var fileName = $"{Guid.NewGuid()}{Path.GetExtension(file.FileName)}";
using (var stream = new FileStream(Path.Combine(environment.WebRootPath, fileName), FileMode.Create))
{
// Save the file
file.CopyTo(stream);
// Return the URL of the file
var url = Url.Content($"~/{fileName}");
return Ok(new { Url = url });
}
}
catch (Exception ex)
{
return StatusCode(500, ex.Message);
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,61 +0,0 @@
namespace ILoan.Tools.Domain.Entities;
[Table("Core_Rules", Schema = "core")]
public partial class CoreRule
{
[Key]
public int ID { get; set; }
[Required]
public string RuleName { get; set; }
[Required]
public string Source { get; set; }
public decimal? DefaultThreshold { get; set; }
public bool Blocked { get; set; }
public bool TriggersManualReview { get; set; }
public string SuggestedResolution { get; set; }
public string TriggerReason { get; set; }
public bool? UseLastRecord { get; set; }
public string ApplicantType { get; set; }
public string FilterOnClickthrough { get; set; }
public string RunBeforeStatus { get; set; }
public string DisplaySection { get; set; }
public string WarningField { get; set; }
[Required]
public string DutchRuleName { get; set; }
public string DutchTriggerReason { get; set; }
public string DutchSuggestedResolution { get; set; }
public string DutchFilterOnClickthrough { get; set; }
public string RuleExplanation { get; set; }
public string DutchRuleExplanation { get; set; }
public int? WorkItemId { get; set; }
public string Title { get; set; }
public int Update { get; set; }
public string Scope { get; set; }
public ICollection<CoreRuleCriterion> CoreRuleCriteria { get; set; } = [];
public ICollection<CoreRuleCriteriaOperator> CoreRuleCriteriaOperators { get; set; } = [];
}

View File

@ -1,18 +0,0 @@
namespace ILoan.Tools.Domain.Entities;
[Table("Core_RuleCriteriaOperator", Schema = "core")]
public partial class CoreRuleCriteriaOperator
{
[Key]
public int ID { get; set; }
public int? RuleID { get; set; }
public CoreRule CoreRule { get; set; }
[Column("Operator")]
public string Operator1 { get; set; }
public int Update { get; set; } = 0;
}

View File

@ -1,27 +0,0 @@
namespace ILoan.Tools.Domain.Entities;
[Table("Core_RuleCriteria", Schema = "core")]
public partial class CoreRuleCriterion
{
[Key]
public int ID { get; set; }
public int? RuleID { get; set; }
public CoreRule CoreRule { get; set; }
public string Property { get; set; }
public string Comparison { get; set; }
public string Value { get; set; }
public bool? ValueIsProperty { get; set; }
public bool? ReturnCount { get; set; }
public bool? IsThresholdCriterium { get; set; }
public int Update { get; set; }
}

View File

@ -1,75 +0,0 @@
namespace ILoan.Tools.Domain.Enums;
/// <summary>
/// The comparison to apply to the rule value.
/// </summary>
[Description("The comparison to apply to the rule value")]
public enum RuleComparison
{
/// <summary>
/// The rule should contain a value.
/// </summary>
[Display(Name = "contains")]
Contains,
/// <summary>
/// The rule should not contain a value.
/// </summary>
[Display(Name = "does not contain")]
DoesNotContain,
/// <summary>
/// The rule should start with a value.
/// </summary>
[Display(Name = "starts with")]
StartsWith,
/// <summary>
/// The rule should not start with a value.
/// </summary>
[Display(Name = "does not start with")]
DoesNotStartWith,
/// <summary>
/// The rule should be lower than a value.
/// </summary>
[Display(Name = "lower than")]
LowerThan,
/// <summary>
/// The rule should be lower than or equal to a value.
/// </summary>
[Display(Name = "lower than or equal to")]
LowerThanOrEqualTo,
/// <summary>
/// The rule should be greater than a value.
/// </summary>
[Display(Name = "greater than")]
GreaterThan,
/// <summary>
/// The rule should be greater than or equal to a value.
/// </summary>
[Display(Name = "greater than or equal to")]
GreaterThanOrEqualTo,
/// <summary>
/// The rule should be equal to a value.
/// </summary>
[Display(Name = "is")]
Is,
/// <summary>
/// The rule should not be equal to a value.
/// </summary>
[Display(Name = "is not")]
IsNot,
/// <summary>
/// The rule value should be similar to a value.
/// </summary>
[Display(Name = "similar to")]
SimilarTo
}

View File

@ -1,210 +0,0 @@
// <auto-generated />
using System;
using ILoan.Tools.Domain;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace ILoan.Tools.Domain.Migrations
{
[DbContext(typeof(RulesContext))]
[Migration("20240708140259_CreateToolsSchema")]
partial class CreateToolsSchema
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder.HasAnnotation("ProductVersion", "8.0.6");
modelBuilder.Entity("ILoan.Tools.Domain.Entities.CoreRule", b =>
{
b.Property<int>("ID")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<string>("ApplicantType")
.HasColumnType("TEXT");
b.Property<bool>("Blocked")
.HasColumnType("INTEGER");
b.Property<decimal?>("DefaultThreshold")
.HasColumnType("TEXT");
b.Property<string>("DisplaySection")
.HasColumnType("TEXT");
b.Property<string>("DutchFilterOnClickthrough")
.HasColumnType("TEXT");
b.Property<string>("DutchRuleExplanation")
.HasColumnType("TEXT");
b.Property<string>("DutchRuleName")
.IsRequired()
.HasColumnType("TEXT");
b.Property<string>("DutchSuggestedResolution")
.HasColumnType("TEXT");
b.Property<string>("DutchTriggerReason")
.HasColumnType("TEXT");
b.Property<string>("FilterOnClickthrough")
.HasColumnType("TEXT");
b.Property<string>("RuleExplanation")
.HasColumnType("TEXT");
b.Property<string>("RuleName")
.IsRequired()
.HasColumnType("TEXT");
b.Property<string>("RunBeforeStatus")
.HasColumnType("TEXT");
b.Property<string>("Scope")
.HasColumnType("TEXT");
b.Property<string>("Source")
.IsRequired()
.HasColumnType("TEXT");
b.Property<string>("SuggestedResolution")
.HasColumnType("TEXT");
b.Property<string>("Title")
.HasColumnType("TEXT");
b.Property<string>("TriggerReason")
.HasColumnType("TEXT");
b.Property<bool>("TriggersManualReview")
.HasColumnType("INTEGER");
b.Property<int>("Update")
.HasColumnType("INTEGER");
b.Property<bool?>("UseLastRecord")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasDefaultValueSql("true");
b.Property<string>("WarningField")
.HasColumnType("TEXT");
b.Property<int?>("WorkItemId")
.HasColumnType("INTEGER");
b.HasKey("ID");
b.ToTable("Core_Rules", "core", t =>
{
t.HasTrigger("Core_Rules_Trigger");
});
});
modelBuilder.Entity("ILoan.Tools.Domain.Entities.CoreRuleCriteriaOperator", b =>
{
b.Property<int>("ID")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<string>("Operator1")
.HasColumnType("TEXT")
.HasColumnName("Operator");
b.Property<int?>("RuleID")
.HasColumnType("INTEGER");
b.Property<int>("Update")
.HasColumnType("INTEGER");
b.HasKey("ID");
b.HasIndex("RuleID");
b.ToTable("Core_RuleCriteriaOperator", "core", t =>
{
t.HasTrigger("Core_RuleCriteriaOperator_Trigger");
});
});
modelBuilder.Entity("ILoan.Tools.Domain.Entities.CoreRuleCriterion", b =>
{
b.Property<int>("ID")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<string>("Comparison")
.HasColumnType("TEXT");
b.Property<bool?>("IsThresholdCriterium")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasDefaultValueSql("false");
b.Property<string>("Property")
.HasColumnType("TEXT");
b.Property<bool?>("ReturnCount")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasDefaultValueSql("false");
b.Property<int?>("RuleID")
.HasColumnType("INTEGER");
b.Property<int>("Update")
.HasColumnType("INTEGER");
b.Property<string>("Value")
.HasColumnType("TEXT");
b.Property<bool?>("ValueIsProperty")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasDefaultValueSql("false");
b.HasKey("ID");
b.HasIndex("RuleID");
b.ToTable("Core_RuleCriteria", "core", t =>
{
t.HasTrigger("Core_RuleCriteria_Trigger");
});
});
modelBuilder.Entity("ILoan.Tools.Domain.Entities.CoreRuleCriteriaOperator", b =>
{
b.HasOne("ILoan.Tools.Domain.Entities.CoreRule", "CoreRule")
.WithMany("CoreRuleCriteriaOperators")
.HasForeignKey("RuleID");
b.Navigation("CoreRule");
});
modelBuilder.Entity("ILoan.Tools.Domain.Entities.CoreRuleCriterion", b =>
{
b.HasOne("ILoan.Tools.Domain.Entities.CoreRule", "CoreRule")
.WithMany("CoreRuleCriteria")
.HasForeignKey("RuleID");
b.Navigation("CoreRule");
});
modelBuilder.Entity("ILoan.Tools.Domain.Entities.CoreRule", b =>
{
b.Navigation("CoreRuleCriteria");
b.Navigation("CoreRuleCriteriaOperators");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -1,130 +0,0 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace ILoan.Tools.Domain.Migrations
{
/// <inheritdoc />
public partial class CreateToolsSchema : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.EnsureSchema(
name: "core");
migrationBuilder.CreateTable(
name: "Core_Rules",
schema: "core",
columns: table => new
{
ID = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
RuleName = table.Column<string>(type: "TEXT", nullable: false),
Source = table.Column<string>(type: "TEXT", nullable: false),
DefaultThreshold = table.Column<decimal>(type: "TEXT", nullable: true),
Blocked = table.Column<bool>(type: "INTEGER", nullable: false),
TriggersManualReview = table.Column<bool>(type: "INTEGER", nullable: false),
SuggestedResolution = table.Column<string>(type: "TEXT", nullable: true),
TriggerReason = table.Column<string>(type: "TEXT", nullable: true),
UseLastRecord = table.Column<bool>(type: "INTEGER", nullable: true, defaultValueSql: "true"),
ApplicantType = table.Column<string>(type: "TEXT", nullable: true),
FilterOnClickthrough = table.Column<string>(type: "TEXT", nullable: true),
RunBeforeStatus = table.Column<string>(type: "TEXT", nullable: true),
DisplaySection = table.Column<string>(type: "TEXT", nullable: true),
WarningField = table.Column<string>(type: "TEXT", nullable: true),
DutchRuleName = table.Column<string>(type: "TEXT", nullable: false),
DutchTriggerReason = table.Column<string>(type: "TEXT", nullable: true),
DutchSuggestedResolution = table.Column<string>(type: "TEXT", nullable: true),
DutchFilterOnClickthrough = table.Column<string>(type: "TEXT", nullable: true),
RuleExplanation = table.Column<string>(type: "TEXT", nullable: true),
DutchRuleExplanation = table.Column<string>(type: "TEXT", nullable: true),
WorkItemId = table.Column<int>(type: "INTEGER", nullable: true),
Title = table.Column<string>(type: "TEXT", nullable: true),
Update = table.Column<int>(type: "INTEGER", nullable: false),
Scope = table.Column<string>(type: "TEXT", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Core_Rules", x => x.ID);
});
migrationBuilder.CreateTable(
name: "Core_RuleCriteria",
schema: "core",
columns: table => new
{
ID = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
RuleID = table.Column<int>(type: "INTEGER", nullable: true),
Property = table.Column<string>(type: "TEXT", nullable: true),
Comparison = table.Column<string>(type: "TEXT", nullable: true),
Value = table.Column<string>(type: "TEXT", nullable: true),
ValueIsProperty = table.Column<bool>(type: "INTEGER", nullable: true, defaultValueSql: "false"),
ReturnCount = table.Column<bool>(type: "INTEGER", nullable: true, defaultValueSql: "false"),
IsThresholdCriterium = table.Column<bool>(type: "INTEGER", nullable: true, defaultValueSql: "false"),
Update = table.Column<int>(type: "INTEGER", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Core_RuleCriteria", x => x.ID);
table.ForeignKey(
name: "FK_Core_RuleCriteria_Core_Rules_RuleID",
column: x => x.RuleID,
principalSchema: "core",
principalTable: "Core_Rules",
principalColumn: "ID");
});
migrationBuilder.CreateTable(
name: "Core_RuleCriteriaOperator",
schema: "core",
columns: table => new
{
ID = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
RuleID = table.Column<int>(type: "INTEGER", nullable: true),
Operator = table.Column<string>(type: "TEXT", nullable: true),
Update = table.Column<int>(type: "INTEGER", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Core_RuleCriteriaOperator", x => x.ID);
table.ForeignKey(
name: "FK_Core_RuleCriteriaOperator_Core_Rules_RuleID",
column: x => x.RuleID,
principalSchema: "core",
principalTable: "Core_Rules",
principalColumn: "ID");
});
migrationBuilder.CreateIndex(
name: "IX_Core_RuleCriteria_RuleID",
schema: "core",
table: "Core_RuleCriteria",
column: "RuleID");
migrationBuilder.CreateIndex(
name: "IX_Core_RuleCriteriaOperator_RuleID",
schema: "core",
table: "Core_RuleCriteriaOperator",
column: "RuleID");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Core_RuleCriteria",
schema: "core");
migrationBuilder.DropTable(
name: "Core_RuleCriteriaOperator",
schema: "core");
migrationBuilder.DropTable(
name: "Core_Rules",
schema: "core");
}
}
}

View File

@ -1,207 +0,0 @@
// <auto-generated />
using System;
using ILoan.Tools.Domain;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace ILoan.Tools.Domain.Migrations
{
[DbContext(typeof(RulesContext))]
partial class RulesContextModelSnapshot : ModelSnapshot
{
protected override void BuildModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder.HasAnnotation("ProductVersion", "8.0.6");
modelBuilder.Entity("ILoan.Tools.Domain.Entities.CoreRule", b =>
{
b.Property<int>("ID")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<string>("ApplicantType")
.HasColumnType("TEXT");
b.Property<bool>("Blocked")
.HasColumnType("INTEGER");
b.Property<decimal?>("DefaultThreshold")
.HasColumnType("TEXT");
b.Property<string>("DisplaySection")
.HasColumnType("TEXT");
b.Property<string>("DutchFilterOnClickthrough")
.HasColumnType("TEXT");
b.Property<string>("DutchRuleExplanation")
.HasColumnType("TEXT");
b.Property<string>("DutchRuleName")
.IsRequired()
.HasColumnType("TEXT");
b.Property<string>("DutchSuggestedResolution")
.HasColumnType("TEXT");
b.Property<string>("DutchTriggerReason")
.HasColumnType("TEXT");
b.Property<string>("FilterOnClickthrough")
.HasColumnType("TEXT");
b.Property<string>("RuleExplanation")
.HasColumnType("TEXT");
b.Property<string>("RuleName")
.IsRequired()
.HasColumnType("TEXT");
b.Property<string>("RunBeforeStatus")
.HasColumnType("TEXT");
b.Property<string>("Scope")
.HasColumnType("TEXT");
b.Property<string>("Source")
.IsRequired()
.HasColumnType("TEXT");
b.Property<string>("SuggestedResolution")
.HasColumnType("TEXT");
b.Property<string>("Title")
.HasColumnType("TEXT");
b.Property<string>("TriggerReason")
.HasColumnType("TEXT");
b.Property<bool>("TriggersManualReview")
.HasColumnType("INTEGER");
b.Property<int>("Update")
.HasColumnType("INTEGER");
b.Property<bool?>("UseLastRecord")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasDefaultValueSql("true");
b.Property<string>("WarningField")
.HasColumnType("TEXT");
b.Property<int?>("WorkItemId")
.HasColumnType("INTEGER");
b.HasKey("ID");
b.ToTable("Core_Rules", "core", t =>
{
t.HasTrigger("Core_Rules_Trigger");
});
});
modelBuilder.Entity("ILoan.Tools.Domain.Entities.CoreRuleCriteriaOperator", b =>
{
b.Property<int>("ID")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<string>("Operator1")
.HasColumnType("TEXT")
.HasColumnName("Operator");
b.Property<int?>("RuleID")
.HasColumnType("INTEGER");
b.Property<int>("Update")
.HasColumnType("INTEGER");
b.HasKey("ID");
b.HasIndex("RuleID");
b.ToTable("Core_RuleCriteriaOperator", "core", t =>
{
t.HasTrigger("Core_RuleCriteriaOperator_Trigger");
});
});
modelBuilder.Entity("ILoan.Tools.Domain.Entities.CoreRuleCriterion", b =>
{
b.Property<int>("ID")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<string>("Comparison")
.HasColumnType("TEXT");
b.Property<bool?>("IsThresholdCriterium")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasDefaultValueSql("false");
b.Property<string>("Property")
.HasColumnType("TEXT");
b.Property<bool?>("ReturnCount")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasDefaultValueSql("false");
b.Property<int?>("RuleID")
.HasColumnType("INTEGER");
b.Property<int>("Update")
.HasColumnType("INTEGER");
b.Property<string>("Value")
.HasColumnType("TEXT");
b.Property<bool?>("ValueIsProperty")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasDefaultValueSql("false");
b.HasKey("ID");
b.HasIndex("RuleID");
b.ToTable("Core_RuleCriteria", "core", t =>
{
t.HasTrigger("Core_RuleCriteria_Trigger");
});
});
modelBuilder.Entity("ILoan.Tools.Domain.Entities.CoreRuleCriteriaOperator", b =>
{
b.HasOne("ILoan.Tools.Domain.Entities.CoreRule", "CoreRule")
.WithMany("CoreRuleCriteriaOperators")
.HasForeignKey("RuleID");
b.Navigation("CoreRule");
});
modelBuilder.Entity("ILoan.Tools.Domain.Entities.CoreRuleCriterion", b =>
{
b.HasOne("ILoan.Tools.Domain.Entities.CoreRule", "CoreRule")
.WithMany("CoreRuleCriteria")
.HasForeignKey("RuleID");
b.Navigation("CoreRule");
});
modelBuilder.Entity("ILoan.Tools.Domain.Entities.CoreRule", b =>
{
b.Navigation("CoreRuleCriteria");
b.Navigation("CoreRuleCriteriaOperators");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -1,59 +0,0 @@
namespace ILoan.Tools.Domain;
public partial class RulesContext : DbContext
{
public RulesContext()
{
}
public RulesContext(DbContextOptions<RulesContext> options) : base(options)
{
}
partial void OnModelBuilding(ModelBuilder builder);
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<CoreRuleCriteriaOperator>()
.HasOne(i => i.CoreRule)
.WithMany(i => i.CoreRuleCriteriaOperators)
.HasForeignKey(i => i.RuleID)
.HasPrincipalKey(i => i.ID);
builder.Entity<CoreRuleCriterion>()
.HasOne(i => i.CoreRule)
.WithMany(i => i.CoreRuleCriteria)
.HasForeignKey(i => i.RuleID)
.HasPrincipalKey(i => i.ID);
builder.Entity<CoreRule>()
.Property(p => p.UseLastRecord)
.HasDefaultValueSql(@"true");
builder.Entity<CoreRuleCriterion>()
.Property(p => p.ValueIsProperty)
.HasDefaultValueSql(@"false");
builder.Entity<CoreRuleCriterion>()
.Property(p => p.ReturnCount)
.HasDefaultValueSql(@"false");
builder.Entity<CoreRuleCriterion>()
.Property(p => p.IsThresholdCriterium)
.HasDefaultValueSql(@"false");
this.OnModelBuilding(builder);
}
public DbSet<CoreRuleCriteriaOperator> CoreRuleCriteriaOperators { get; set; }
public DbSet<CoreRule> CoreRules { get; set; }
public DbSet<CoreRuleCriterion> CoreRuleCriteria { get; set; }
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
{
configurationBuilder.Conventions.Add(_ => new BlankTriggerAddingConvention());
}
}

View File

@ -1,27 +0,0 @@
namespace ILoan.Tools.Domain.Triggers;
public class BlankTriggerAddingConvention : Microsoft.EntityFrameworkCore.Metadata.Conventions.IModelFinalizingConvention
{
public virtual void ProcessModelFinalizing(
Microsoft.EntityFrameworkCore.Metadata.Builders.IConventionModelBuilder modelBuilder,
Microsoft.EntityFrameworkCore.Metadata.Conventions.IConventionContext<Microsoft.EntityFrameworkCore.Metadata.Builders.IConventionModelBuilder> context)
{
foreach (var entityType in modelBuilder.Metadata.GetEntityTypes())
{
var table = Microsoft.EntityFrameworkCore.Metadata.StoreObjectIdentifier.Create(entityType, Microsoft.EntityFrameworkCore.Metadata.StoreObjectType.Table);
if (table != null
&& entityType.GetDeclaredTriggers().All(t => t.GetDatabaseName(table.Value) == null))
{
entityType.Builder.HasTrigger(table.Value.Name + "_Trigger");
}
foreach (var fragment in entityType.GetMappingFragments(Microsoft.EntityFrameworkCore.Metadata.StoreObjectType.Table))
{
if (entityType.GetDeclaredTriggers().All(t => t.GetDatabaseName(fragment.StoreObject) == null))
{
entityType.Builder.HasTrigger(fragment.StoreObject.Name + "_Trigger");
}
}
}
}
}

View File

@ -1,19 +0,0 @@
// Global using directives
global using ILoan.Tools.Domain;
global using ILoan.Tools.Domain.Entities;
global using ILoan.Tools.Domain.Enums;
global using ILoan.Tools.Infrastructure.Services;
global using Microsoft.AspNetCore.Components;
global using Microsoft.AspNetCore.Components.Web;
global using Microsoft.EntityFrameworkCore;
global using Microsoft.JSInterop;
global using Radzen;
global using Radzen.Blazor;
global using System.ComponentModel;
global using System.ComponentModel.DataAnnotations;
global using System.ComponentModel.DataAnnotations.Schema;
global using System.Linq.Dynamic.Core;
global using System.Text.Encodings.Web;
global using ILoan.Tools.Domain.Triggers;
global using EnumExtensions = ILoan.Tools.Infrastructure.Extensions.EnumExtensions;

View File

@ -1,24 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<NoWarn>CS0168,CS1998,BL9993,CS0649,CS0436,0436</NoWarn>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Radzen.Blazor" Version="*" />
<PackageReference Include="DocumentFormat.OpenXml" Version="3.0.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.6">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.6">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.4" />
</ItemGroup>
<ItemGroup>
<Folder Include="Domain\Data\" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<NoWarn>CS0168,CS1998,BL9993,CS0649,CS0436,0436</NoWarn>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Radzen.Blazor" Version="*" />
</ItemGroup>
</Project>

View File

@ -2,7 +2,8 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17 # Visual Studio Version 17
VisualStudioVersion = 17.0.0.0 VisualStudioVersion = 17.0.0.0
MinimumVisualStudioVersion = 17.0.0.0 MinimumVisualStudioVersion = 17.0.0.0
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ILoan.Tools", "ILoan.Tools.csproj", "{E9962792-F259-417D-9699-6283FE80DB7C}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ILoan.Rules.Web", "ILoan.Rules.Web.csproj", "{E9962792-F259-417D-9699-6283FE80DB7C}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution

View File

@ -1,25 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<NoWarn>CS0168,CS1998,BL9993,CS0649,CS0436,0436</NoWarn>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="8.0.6" />
<PackageReference Include="Radzen.Blazor" Version="*" />
<PackageReference Include="DocumentFormat.OpenXml" Version="3.0.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.6">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.6">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.4" />
</ItemGroup>
<ItemGroup>
<Folder Include="Domain\Data\" />
</ItemGroup>
</Project>

View File

@ -1,16 +0,0 @@
namespace ILoan.Tools.Infrastructure.Extensions;
public static class EnumExtensions
{
public static List<string> ToList<T>() where T : Enum
{
var names = new List<string>();
foreach (var name in Enum.GetNames(typeof(T)))
{
names.Add(name);
}
return names;
}
}

View File

@ -1,160 +0,0 @@
using System.Text;
namespace ILoan.Tools.Infrastructure.Services;
public class RuleFileGeneratorService(RulesContext context, IConfiguration configuration)
{
private readonly int _startRuleId = configuration.GetValue<int>("Parameters:StartRuleId");
private int _startSeq = configuration.GetValue<int>("Parameters:StartSeqNo");
private readonly string _root = configuration.GetValue<string>("Parameters:GeneratorRoot");
private readonly string _workitem = configuration.GetValue<string>("Parameters:Workitem");
public async Task GenerateRuleFilesAsync()
{
if (!_root.EndsWith("migrations"))
{
if (Directory.Exists(_root)) Directory.Delete(_root, true);
if (!Directory.Exists(_root)) Directory.CreateDirectory(_root);
}
var rules = await context.CoreRules
.Include(r => r.CoreRuleCriteria)
.Include(r => r.CoreRuleCriteriaOperators)
.Where(rule => rule.ID >= _startRuleId)
.ToListAsync();
foreach (var rule in rules.Where(r => _workitem.Contains(r.WorkItemId.ToString())).OrderBy(x => x.ID))
{
var fileName = $"V3.{_startSeq:00}__{rule.WorkItemId}_Rules_{rule.ID}_{rule.Title}.sql";
if (rule.Update > 0)
{
fileName = $"V3.{_startSeq:00}__{rule.WorkItemId}_Rules_{rule.ID}_{rule.Title}_Update({rule.Update}).sql";
}
var sql = GenerateSqlStatement(rule);
Console.WriteLine($"Generating file: {fileName}");
await File.WriteAllTextAsync(Path.Combine(_root, fileName), sql, Encoding.UTF8);
_startSeq++;
}
}
private string GenerateSqlStatement(CoreRule rule)
{
var sqlBuilder = new StringBuilder();
if (rule.Update == 0)
{
// SQL for inserting CoreRule
sqlBuilder.AppendLine($@"
INSERT INTO core.""Core_Rules"" (
""ID"", ""RuleName"", ""Source"", ""DefaultThreshold"", ""Blocked"", ""TriggersManualReview"",
""SuggestedResolution"", ""TriggerReason"", ""UseLastRecord"", ""ApplicantType"", ""FilterOnClickthrough"",
""RunBeforeStatus"", ""DisplaySection"", ""WarningField"", ""DutchRuleName"", ""DutchTriggerReason"",
""DutchSuggestedResolution"", ""DutchFilterOnClickthrough"", ""RuleExplanation"", ""DutchRuleExplanation"", ""Scope""
) OVERRIDING SYSTEM VALUE VALUES (
{rule.ID}, '{EscapeSingleQuote(rule.RuleName)}', '{EscapeSingleQuote(rule.Source)}', {rule.DefaultThreshold?.ToString() ?? "NULL"},
{rule.Blocked.ToString().ToUpper()}, {rule.TriggersManualReview.ToString().ToUpper()}, '{EscapeSingleQuote(rule.SuggestedResolution)}',
'{EscapeSingleQuote(rule.TriggerReason)}', {rule.UseLastRecord?.ToString().ToUpper() ?? "NULL"}, '{EscapeSingleQuote(rule.ApplicantType)}',
'{EscapeSingleQuote(rule.FilterOnClickthrough)}', '{EscapeSingleQuote(rule.RunBeforeStatus)}', '{EscapeSingleQuote(rule.DisplaySection)}',
'{EscapeSingleQuote(rule.WarningField)}', '{EscapeSingleQuote(rule.DutchRuleName)}', '{EscapeSingleQuote(rule.DutchTriggerReason)}',
'{EscapeSingleQuote(rule.DutchSuggestedResolution)}', '{EscapeSingleQuote(rule.DutchFilterOnClickthrough)}',
'{EscapeSingleQuote(rule.RuleExplanation)}', '{EscapeSingleQuote(rule.DutchRuleExplanation)}', '{EscapeSingleQuote(rule.Scope)}'
);
");
// SQL for inserting CoreRuleCriteria
foreach (var criterion in rule.CoreRuleCriteria)
{
sqlBuilder.AppendLine($@"
INSERT INTO core.""Core_RuleCriteria"" (
""ID"", ""RuleID"", ""Property"", ""Comparison"", ""Value"", ""ValueIsProperty"", ""ReturnCount"", ""IsThresholdCriterium""
) OVERRIDING SYSTEM VALUE VALUES (
{criterion.ID}, {criterion.RuleID}, '{EscapeSingleQuote(criterion.Property)}', '{EscapeSingleQuote(criterion.Comparison)}', '{EscapeSingleQuote(criterion.Value)}',
{criterion.ValueIsProperty?.ToString().ToUpper() ?? "NULL"}, {criterion.ReturnCount?.ToString().ToUpper() ?? "NULL"}, {criterion.IsThresholdCriterium?.ToString().ToUpper() ?? "NULL"}
);
");
}
// SQL for inserting CoreRuleCriteriaOperator
foreach (var coreRuleCriteriaOperator in rule.CoreRuleCriteriaOperators)
{
sqlBuilder.AppendLine($@"
INSERT INTO core.""Core_RuleCriteriaOperator"" (
""ID"", ""RuleID"", ""Operator""
) OVERRIDING SYSTEM VALUE VALUES (
{coreRuleCriteriaOperator.ID}, {coreRuleCriteriaOperator.RuleID}, '{EscapeSingleQuote(coreRuleCriteriaOperator.Operator1)}'
);
");
}
}
else
{
// SQL for updating CoreRule
sqlBuilder.AppendLine($@"
UPDATE core.""Core_Rules""
SET
""RuleName"" = '{EscapeSingleQuote(rule.RuleName)}',
""Source"" = '{EscapeSingleQuote(rule.Source)}',
""DefaultThreshold"" = {rule.DefaultThreshold?.ToString() ?? "NULL"},
""Blocked"" = {rule.Blocked.ToString().ToUpper()},
""TriggersManualReview"" = {rule.TriggersManualReview.ToString().ToUpper()},
""SuggestedResolution"" = '{EscapeSingleQuote(rule.SuggestedResolution)}',
""TriggerReason"" = '{EscapeSingleQuote(rule.TriggerReason)}',
""UseLastRecord"" = {rule.UseLastRecord?.ToString().ToUpper() ?? "NULL"},
""ApplicantType"" = '{EscapeSingleQuote(rule.ApplicantType)}',
""FilterOnClickthrough"" = '{EscapeSingleQuote(rule.FilterOnClickthrough)}',
""RunBeforeStatus"" = '{EscapeSingleQuote(rule.RunBeforeStatus)}',
""DisplaySection"" = '{EscapeSingleQuote(rule.DisplaySection)}',
""WarningField"" = '{EscapeSingleQuote(rule.WarningField)}',
""DutchRuleName"" = '{EscapeSingleQuote(rule.DutchRuleName)}',
""DutchTriggerReason"" = '{EscapeSingleQuote(rule.DutchTriggerReason)}',
""DutchSuggestedResolution"" = '{EscapeSingleQuote(rule.DutchSuggestedResolution)}',
""DutchFilterOnClickthrough"" = '{EscapeSingleQuote(rule.DutchFilterOnClickthrough)}',
""RuleExplanation"" = '{EscapeSingleQuote(rule.RuleExplanation)}',
""DutchRuleExplanation"" = '{EscapeSingleQuote(rule.DutchRuleExplanation)}',
""Scope"" = '{EscapeSingleQuote(rule.Scope)}'
WHERE ""ID"" = {rule.ID};
");
// SQL for updating CoreRuleCriteria
foreach (var criterion in rule.CoreRuleCriteria)
{
sqlBuilder.AppendLine($@"
UPDATE core.""Core_RuleCriteria""
SET
""Property"" = '{EscapeSingleQuote(criterion.Property)}',
""Comparison"" = '{EscapeSingleQuote(criterion.Comparison)}',
""Value"" = '{EscapeSingleQuote(criterion.Value)}',
""ValueIsProperty"" = {criterion.ValueIsProperty?.ToString().ToUpper() ?? "NULL"},
""ReturnCount"" = {criterion.ReturnCount?.ToString().ToUpper() ?? "NULL"},
""IsThresholdCriterium"" = {criterion.IsThresholdCriterium?.ToString().ToUpper() ?? "NULL"}
WHERE ""ID"" = {criterion.ID};
");
}
// SQL for updating CoreRuleCriteriaOperator
foreach (var coreRuleCriteriaOperator in rule.CoreRuleCriteriaOperators)
{
sqlBuilder.AppendLine($@"
UPDATE core.""Core_RuleCriteriaOperator""
SET
""Operator"" = '{EscapeSingleQuote(coreRuleCriteriaOperator.Operator1)}'
WHERE ""ID"" = {coreRuleCriteriaOperator.ID};
");
}
}
return sqlBuilder.ToString();
}
private static string EscapeSingleQuote(string value)
{
return value?.Replace("'", "''");
}
}
// Usage example:
// var context = new RulesContext();
// var generator = new RuleFileGeneratorService(context, configuration);
// await generator.GenerateRuleFilesAsync();

View File

@ -1,512 +0,0 @@
namespace ILoan.Tools.Infrastructure.Services;
public partial class RulesService(IDbContextFactory<RulesContext> factory, NavigationManager navigationManager)
{
public void ApplyQuery<T>(ref IQueryable<T> items, Query query = null)
{
if (query != null)
{
if (!string.IsNullOrEmpty(query.Filter))
{
if (query.FilterParameters != null)
items = items.Where(query.Filter, query.FilterParameters);
else
items = items.Where(query.Filter);
}
if (!string.IsNullOrEmpty(query.OrderBy)) items = items.OrderBy(query.OrderBy);
if (query.Skip.HasValue) items = items.Skip(query.Skip.Value);
if (query.Top.HasValue) items = items.Take(query.Top.Value);
}
}
partial void OnCoreRuleCriteriaOperatorsRead(ref IQueryable<CoreRuleCriteriaOperator> items);
public async Task<IQueryable<CoreRuleCriteriaOperator>> GetCoreRuleCriteriaOperators(Query query = null)
{
var context = await factory.CreateDbContextAsync();
var items = context.CoreRuleCriteriaOperators.AsQueryable();
items = items.Include(i => i.CoreRule);
if (query != null)
{
if (!string.IsNullOrEmpty(query.Expand))
{
var propertiesToExpand = query.Expand.Split(',');
foreach (var p in propertiesToExpand) items = items.Include(p.Trim());
}
ApplyQuery(ref items, query);
}
OnCoreRuleCriteriaOperatorsRead(ref items);
return await Task.FromResult(items);
}
partial void OnCoreRuleCriteriaOperatorGet(CoreRuleCriteriaOperator item);
partial void OnGetCoreRuleCriteriaOperatorById(ref IQueryable<CoreRuleCriteriaOperator> items);
public async Task<CoreRuleCriteriaOperator> GetCoreRuleCriteriaOperatorById(int id)
{
var context = await factory.CreateDbContextAsync();
var items = context.CoreRuleCriteriaOperators
.AsNoTracking()
.Where(i => i.ID == id);
items = items.Include(i => i.CoreRule);
OnGetCoreRuleCriteriaOperatorById(ref items);
var itemToReturn = items.FirstOrDefault();
OnCoreRuleCriteriaOperatorGet(itemToReturn);
return await Task.FromResult(itemToReturn);
}
partial void OnCoreRuleCriteriaOperatorCreated(CoreRuleCriteriaOperator item);
partial void OnAfterCoreRuleCriteriaOperatorCreated(CoreRuleCriteriaOperator item);
public async Task<CoreRuleCriteriaOperator> CreateCoreRuleCriteriaOperator(
CoreRuleCriteriaOperator corerulecriteriaoperator)
{
OnCoreRuleCriteriaOperatorCreated(corerulecriteriaoperator);
var context = await factory.CreateDbContextAsync();
var existingItem = context.CoreRuleCriteriaOperators
.FirstOrDefault(i => i.ID == corerulecriteriaoperator.ID);
if (existingItem != null) throw new Exception("Item already available");
try
{
context.CoreRuleCriteriaOperators.Add(corerulecriteriaoperator);
await context.SaveChangesAsync();
}
catch
{
context.Entry(corerulecriteriaoperator).State = EntityState.Detached;
throw;
}
OnAfterCoreRuleCriteriaOperatorCreated(corerulecriteriaoperator);
return corerulecriteriaoperator;
}
public async Task<CoreRuleCriteriaOperator> CancelCoreRuleCriteriaOperatorChanges(CoreRuleCriteriaOperator item)
{
var context = await factory.CreateDbContextAsync();
var entityToCancel = context.Entry(item);
if (entityToCancel.State == EntityState.Modified)
{
entityToCancel.CurrentValues.SetValues(entityToCancel.OriginalValues);
entityToCancel.State = EntityState.Unchanged;
}
return item;
}
partial void OnCoreRuleCriteriaOperatorUpdated(CoreRuleCriteriaOperator item);
partial void OnAfterCoreRuleCriteriaOperatorUpdated(CoreRuleCriteriaOperator item);
public async Task<CoreRuleCriteriaOperator> UpdateCoreRuleCriteriaOperator(int id,
CoreRuleCriteriaOperator corerulecriteriaoperator)
{
OnCoreRuleCriteriaOperatorUpdated(corerulecriteriaoperator);
var context = await factory.CreateDbContextAsync();
var itemToUpdate = context.CoreRuleCriteriaOperators
.FirstOrDefault(i => i.ID == corerulecriteriaoperator.ID);
if (itemToUpdate == null) throw new Exception("Item no longer available");
var entryToUpdate = context.Entry(itemToUpdate);
entryToUpdate.CurrentValues.SetValues(corerulecriteriaoperator);
entryToUpdate.State = EntityState.Modified;
await context.SaveChangesAsync();
OnAfterCoreRuleCriteriaOperatorUpdated(corerulecriteriaoperator);
return corerulecriteriaoperator;
}
partial void OnCoreRuleCriteriaOperatorDeleted(CoreRuleCriteriaOperator item);
partial void OnAfterCoreRuleCriteriaOperatorDeleted(CoreRuleCriteriaOperator item);
public async Task<CoreRuleCriteriaOperator> DeleteCoreRuleCriteriaOperator(int id)
{
var context = await factory.CreateDbContextAsync();
var itemToDelete = context.CoreRuleCriteriaOperators
.FirstOrDefault(i => i.ID == id);
if (itemToDelete == null) throw new Exception("Item no longer available");
OnCoreRuleCriteriaOperatorDeleted(itemToDelete);
context.CoreRuleCriteriaOperators.Remove(itemToDelete);
try
{
await context.SaveChangesAsync();
}
catch
{
context.Entry(itemToDelete).State = EntityState.Unchanged;
throw;
}
OnAfterCoreRuleCriteriaOperatorDeleted(itemToDelete);
return itemToDelete;
}
public async Task ExportCoreRulesToExcel(Query query = null, string fileName = null)
{
navigationManager.NavigateTo(
query != null
? query.ToUrl(
$"export/rules/corerules/excel(fileName='{(!string.IsNullOrEmpty(fileName) ? UrlEncoder.Default.Encode(fileName) : "Export")}')")
: $"export/rules/corerules/excel(fileName='{(!string.IsNullOrEmpty(fileName) ? UrlEncoder.Default.Encode(fileName) : "Export")}')",
true);
}
public async Task ExportCoreRulesToCSV(Query query = null, string fileName = null)
{
navigationManager.NavigateTo(
query != null
? query.ToUrl(
$"export/rules/corerules/csv(fileName='{(!string.IsNullOrEmpty(fileName) ? UrlEncoder.Default.Encode(fileName) : "Export")}')")
: $"export/rules/corerules/csv(fileName='{(!string.IsNullOrEmpty(fileName) ? UrlEncoder.Default.Encode(fileName) : "Export")}')",
true);
}
partial void OnCoreRulesRead(ref IQueryable<CoreRule> items);
public async Task<IQueryable<CoreRule>> GetCoreRules(Query query = null)
{
var context = await factory.CreateDbContextAsync();
var items = context.CoreRules.OrderBy(r => r.ID).AsQueryable();
if (query != null)
{
if (!string.IsNullOrEmpty(query.Expand))
{
var propertiesToExpand = query.Expand.Split(',');
foreach (var p in propertiesToExpand) items = items.Include(p.Trim());
}
ApplyQuery(ref items, query);
}
OnCoreRulesRead(ref items);
return await Task.FromResult(items);
}
partial void OnCoreRuleGet(CoreRule item);
partial void OnGetCoreRuleById(ref IQueryable<CoreRule> items);
public async Task<CoreRule> GetCoreRuleById(int id)
{
var context = await factory.CreateDbContextAsync();
var items = context.CoreRules
.AsNoTracking()
.Where(i => i.ID == id);
OnGetCoreRuleById(ref items);
var itemToReturn = items.FirstOrDefault();
OnCoreRuleGet(itemToReturn);
return await Task.FromResult(itemToReturn);
}
partial void OnCoreRuleCreated(CoreRule item);
partial void OnAfterCoreRuleCreated(CoreRule item);
public async Task<CoreRule> CreateCoreRule(CoreRule corerule)
{
OnCoreRuleCreated(corerule);
var context = await factory.CreateDbContextAsync();
var existingItem = context.CoreRules
.FirstOrDefault(i => i.ID == corerule.ID);
if (existingItem != null) throw new Exception("Item already available");
try
{
context.CoreRules.Add(corerule);
await context.SaveChangesAsync();
}
catch
{
context.Entry(corerule).State = EntityState.Detached;
throw;
}
OnAfterCoreRuleCreated(corerule);
return corerule;
}
public async Task<CoreRule> CancelCoreRuleChanges(CoreRule item)
{
var context = await factory.CreateDbContextAsync();
var entityToCancel = context.Entry(item);
if (entityToCancel.State == EntityState.Modified)
{
entityToCancel.CurrentValues.SetValues(entityToCancel.OriginalValues);
entityToCancel.State = EntityState.Unchanged;
}
return item;
}
partial void OnCoreRuleUpdated(CoreRule item);
partial void OnAfterCoreRuleUpdated(CoreRule item);
public async Task<CoreRule> UpdateCoreRule(int id, CoreRule corerule)
{
OnCoreRuleUpdated(corerule);
var context = await factory.CreateDbContextAsync();
var itemToUpdate = context.CoreRules
.FirstOrDefault(i => i.ID == corerule.ID);
if (itemToUpdate == null) throw new Exception("Item no longer available");
var entryToUpdate = context.Entry(itemToUpdate);
entryToUpdate.CurrentValues.SetValues(corerule);
entryToUpdate.State = EntityState.Modified;
await context.SaveChangesAsync();
OnAfterCoreRuleUpdated(corerule);
return corerule;
}
partial void OnCoreRuleDeleted(CoreRule item);
partial void OnAfterCoreRuleDeleted(CoreRule item);
public async Task<CoreRule> DeleteCoreRule(int id)
{
var context = await factory.CreateDbContextAsync();
var itemToDelete = context.CoreRules
.Where(i => i.ID == id)
.Include(i => i.CoreRuleCriteria)
.Include(i => i.CoreRuleCriteriaOperators)
.FirstOrDefault();
if (itemToDelete == null) throw new Exception("Item no longer available");
OnCoreRuleDeleted(itemToDelete);
context.CoreRules.Remove(itemToDelete);
try
{
await context.SaveChangesAsync();
}
catch
{
context.Entry(itemToDelete).State = EntityState.Unchanged;
throw;
}
OnAfterCoreRuleDeleted(itemToDelete);
return itemToDelete;
}
public async Task ExportCoreRuleCriteriaToExcel(Query query = null, string fileName = null)
{
navigationManager.NavigateTo(
query != null
? query.ToUrl(
$"export/rules/corerulecriteria/excel(fileName='{(!string.IsNullOrEmpty(fileName) ? UrlEncoder.Default.Encode(fileName) : "Export")}')")
: $"export/rules/corerulecriteria/excel(fileName='{(!string.IsNullOrEmpty(fileName) ? UrlEncoder.Default.Encode(fileName) : "Export")}')",
true);
}
public async Task ExportCoreRuleCriteriaToCSV(Query query = null, string fileName = null)
{
navigationManager.NavigateTo(
query != null
? query.ToUrl(
$"export/rules/corerulecriteria/csv(fileName='{(!string.IsNullOrEmpty(fileName) ? UrlEncoder.Default.Encode(fileName) : "Export")}')")
: $"export/rules/corerulecriteria/csv(fileName='{(!string.IsNullOrEmpty(fileName) ? UrlEncoder.Default.Encode(fileName) : "Export")}')",
true);
}
partial void OnCoreRuleCriteriaRead(ref IQueryable<CoreRuleCriterion> items);
public async Task<IQueryable<CoreRuleCriterion>> GetCoreRuleCriteria(Query query = null)
{
var context = await factory.CreateDbContextAsync();
var items = context.CoreRuleCriteria.AsQueryable();
items = items.Include(i => i.CoreRule);
if (query != null)
{
if (!string.IsNullOrEmpty(query.Expand))
{
var propertiesToExpand = query.Expand.Split(',');
foreach (var p in propertiesToExpand) items = items.Include(p.Trim());
}
ApplyQuery(ref items, query);
}
OnCoreRuleCriteriaRead(ref items);
return await Task.FromResult(items);
}
partial void OnCoreRuleCriterionGet(CoreRuleCriterion item);
partial void OnGetCoreRuleCriterionById(ref IQueryable<CoreRuleCriterion> items);
public async Task<CoreRuleCriterion> GetCoreRuleCriterionById(int id)
{
var context = await factory.CreateDbContextAsync();
var items = context.CoreRuleCriteria
.AsNoTracking()
.Where(i => i.ID == id);
items = items.Include(i => i.CoreRule);
OnGetCoreRuleCriterionById(ref items);
var itemToReturn = items.FirstOrDefault();
OnCoreRuleCriterionGet(itemToReturn);
return await Task.FromResult(itemToReturn);
}
partial void OnCoreRuleCriterionCreated(CoreRuleCriterion item);
partial void OnAfterCoreRuleCriterionCreated(CoreRuleCriterion item);
public async Task<CoreRuleCriterion> CreateCoreRuleCriterion(CoreRuleCriterion corerulecriterion)
{
OnCoreRuleCriterionCreated(corerulecriterion);
var context = await factory.CreateDbContextAsync();
var existingItem = context.CoreRuleCriteria
.FirstOrDefault(i => i.ID == corerulecriterion.ID);
if (existingItem != null) throw new Exception("Item already available");
try
{
context.CoreRuleCriteria.Add(corerulecriterion);
await context.SaveChangesAsync();
}
catch
{
context.Entry(corerulecriterion).State = EntityState.Detached;
throw;
}
OnAfterCoreRuleCriterionCreated(corerulecriterion);
return corerulecriterion;
}
public async Task<CoreRuleCriterion> CancelCoreRuleCriterionChanges(CoreRuleCriterion item)
{
var context = await factory.CreateDbContextAsync();
var entityToCancel = context.Entry(item);
if (entityToCancel.State == EntityState.Modified)
{
entityToCancel.CurrentValues.SetValues(entityToCancel.OriginalValues);
entityToCancel.State = EntityState.Unchanged;
}
return item;
}
partial void OnCoreRuleCriterionUpdated(CoreRuleCriterion item);
partial void OnAfterCoreRuleCriterionUpdated(CoreRuleCriterion item);
public async Task<CoreRuleCriterion> UpdateCoreRuleCriterion(int id, CoreRuleCriterion corerulecriterion)
{
OnCoreRuleCriterionUpdated(corerulecriterion);
var context = await factory.CreateDbContextAsync();
var itemToUpdate = context.CoreRuleCriteria
.FirstOrDefault(i => i.ID == corerulecriterion.ID);
if (itemToUpdate == null) throw new Exception("Item no longer available");
var entryToUpdate = context.Entry(itemToUpdate);
entryToUpdate.CurrentValues.SetValues(corerulecriterion);
entryToUpdate.State = EntityState.Modified;
await context.SaveChangesAsync();
OnAfterCoreRuleCriterionUpdated(corerulecriterion);
return corerulecriterion;
}
partial void OnCoreRuleCriterionDeleted(CoreRuleCriterion item);
partial void OnAfterCoreRuleCriterionDeleted(CoreRuleCriterion item);
public async Task<CoreRuleCriterion> DeleteCoreRuleCriterion(int id)
{
var context = await factory.CreateDbContextAsync();
var itemToDelete = context.CoreRuleCriteria
.FirstOrDefault(i => i.ID == id);
if (itemToDelete == null) throw new Exception("Item no longer available");
OnCoreRuleCriterionDeleted(itemToDelete);
context.CoreRuleCriteria.Remove(itemToDelete);
try
{
await context.SaveChangesAsync();
}
catch
{
context.Entry(itemToDelete).State = EntityState.Unchanged;
throw;
}
OnAfterCoreRuleCriterionDeleted(itemToDelete);
return itemToDelete;
}
// get properties from CoreRuleCriterion as a disctinct list for type ahead
public List<string> GetProperties()
{
var context = factory.CreateDbContext();
var properties = context.CoreRuleCriteria.Select(c => c.Property).Distinct().OrderBy(x => x).ToList();
return properties;
}
public List<string> GetComparisons()
{
return EnumExtensions.ToList<RuleComparison>();
}
}

View File

@ -1,16 +1,17 @@
using Radzen;
using ILoan.Rules.Web.Components;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
// Add services to the container. // Add services to the container.
builder.Services.AddRazorComponents().AddInteractiveServerComponents().AddHubOptions(options => options.MaximumReceiveMessageSize = 10 * 1024 * 1024); builder.Services.AddRazorComponents()
.AddInteractiveServerComponents().AddHubOptions(options => options.MaximumReceiveMessageSize = 10 * 1024 * 1024);
builder.Services.AddControllers(); builder.Services.AddControllers();
builder.Services.AddRadzenComponents(); builder.Services.AddRadzenComponents();
builder.Services.AddHttpClient(); builder.Services.AddHttpClient();
builder.Services.AddScoped<RulesService>();
builder.Services.AddScoped<RuleFileGeneratorService>();
builder.Services.AddDbContextFactory<RulesContext>(options =>
{
options.UseSqlite(builder.Configuration.GetConnectionString("Sqlite"));
});
var app = builder.Build(); var app = builder.Build();
// Configure the HTTP request pipeline. // Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment()) if (!app.Environment.IsDevelopment())
{ {
@ -23,5 +24,8 @@ app.UseHttpsRedirection();
app.MapControllers(); app.MapControllers();
app.UseStaticFiles(); app.UseStaticFiles();
app.UseAntiforgery(); app.UseAntiforgery();
app.MapRazorComponents<ILoan.Tools.Application.App>().AddInteractiveServerRenderMode();
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode();
app.Run(); app.Run();

View File

@ -8,11 +8,11 @@
} }
}, },
"profiles": { "profiles": {
"ILoan.Tools": { "ILoan.Rules.Web.Server": {
"commandName": "Project", "commandName": "Project",
"dotnetRunMessages": true, "dotnetRunMessages": true,
"launchBrowser": true, "launchBrowser": true,
"applicationUrl": "https://localhost:7001;http://localhost:7000", "applicationUrl": "https://localhost:5001;http://localhost:5000",
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} }

View File

@ -5,15 +5,5 @@
"Default": "Information", "Default": "Information",
"Microsoft.AspNetCore": "Warning" "Microsoft.AspNetCore": "Warning"
} }
},
"ConnectionStrings": {
"RulesConnection": "Host=localhost;User ID=wendell@iloan.nl;Password=8o%2FGjK&A#p^De1;Timeout=30;Port=5432;Database=iloan-dev-rules"
},
"Databases": {
"Rules": {
"NoPluralize": false,
"UseDatabaseNames": false,
"UseEFNaming": false
}
} }
} }

View File

@ -5,22 +5,5 @@
"Microsoft.AspNetCore": "Warning" "Microsoft.AspNetCore": "Warning"
} }
}, },
"AllowedHosts": "*", "AllowedHosts": "*"
"ConnectionStrings": {
"Pgsql": "Host=localhost;User ID=wendell@iloan.nl;Password=8o%2FGjK&A#p^De1;Timeout=30;Port=5432;Database=iloan-dev-rules",
"Sqlite": "Data Source=./Domain/Data/iloan.tools.db"
},
"Databases": {
"Rules": {
"NoPluralize": false,
"UseDatabaseNames": false,
"UseEFNaming": false
}
},
"Parameters": {
"GeneratorRoot": "C:\\iloan\\iloan-base-dev\\migrations",
"StartSeqNo": 27,
"StartRuleId": 499,
"Workitem": "3130"
}
} }