chore: add rules grid
This commit is contained in:
parent
ae183c77cf
commit
7086341e1b
@ -25,6 +25,7 @@
|
|||||||
</RadzenStack>
|
</RadzenStack>
|
||||||
<RadzenPanelMenu>
|
<RadzenPanelMenu>
|
||||||
<RadzenPanelMenuItem Text="Home" Path="" />
|
<RadzenPanelMenuItem Text="Home" Path="" />
|
||||||
|
<RadzenPanelMenuItem Text="CoreRules" Path="core-rules" />
|
||||||
</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.Rules.Web 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" />
|
||||||
|
192
src/iLoan.Rules.Web/Components/Pages/AddCoreRule.razor
Normal file
192
src/iLoan.Rules.Web/Components/Pages/AddCoreRule.razor
Normal file
@ -0,0 +1,192 @@
|
|||||||
|
@page "/add-core-rule"
|
||||||
|
|
||||||
|
<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="ILoan.Rules.Web.Models.Rules.CoreRule" Data="@coreRule" Visible="@(coreRule != null)" Submit="@FormSubmit">
|
||||||
|
<RadzenRow style="margin-bottom: 1rem">
|
||||||
|
<RadzenColumn SizeMD="3">
|
||||||
|
<RadzenLabel Text="Rule Name" Component="RuleName" style="width: 100%" />
|
||||||
|
</RadzenColumn>
|
||||||
|
<RadzenColumn SizeMD="9">
|
||||||
|
<RadzenTextBox 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">
|
||||||
|
<RadzenTextBox 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">
|
||||||
|
<RadzenTextBox 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">
|
||||||
|
<RadzenTextBox 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>
|
||||||
|
|
60
src/iLoan.Rules.Web/Components/Pages/AddCoreRule.razor.cs
Normal file
60
src/iLoan.Rules.Web/Components/Pages/AddCoreRule.razor.cs
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.JSInterop;
|
||||||
|
using Microsoft.AspNetCore.Components;
|
||||||
|
using Microsoft.AspNetCore.Components.Web;
|
||||||
|
using Radzen;
|
||||||
|
using Radzen.Blazor;
|
||||||
|
|
||||||
|
namespace ILoan.Rules.Web.Components.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 ILoan.Rules.Web.Models.Rules.CoreRule();
|
||||||
|
}
|
||||||
|
protected bool errorVisible;
|
||||||
|
protected ILoan.Rules.Web.Models.Rules.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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
@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="ILoan.Rules.Web.Models.Rules.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>
|
||||||
|
|
@ -0,0 +1,84 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.JSInterop;
|
||||||
|
using Microsoft.AspNetCore.Components;
|
||||||
|
using Microsoft.AspNetCore.Components.Web;
|
||||||
|
using Radzen;
|
||||||
|
using Radzen.Blazor;
|
||||||
|
|
||||||
|
namespace ILoan.Rules.Web.Components.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 ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator coreRuleCriteriaOperator;
|
||||||
|
|
||||||
|
protected IEnumerable<ILoan.Rules.Web.Models.Rules.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 ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator();
|
||||||
|
|
||||||
|
hasRuleIDValue = parameters.TryGetValue<int?>("RuleID", out var hasRuleIDResult);
|
||||||
|
|
||||||
|
if (hasRuleIDValue)
|
||||||
|
{
|
||||||
|
coreRuleCriteriaOperator.RuleID = hasRuleIDResult;
|
||||||
|
}
|
||||||
|
await base.SetParametersAsync(parameters);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,71 @@
|
|||||||
|
@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="ILoan.Rules.Web.Models.Rules.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">
|
||||||
|
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRuleCriterion.Property" Name="Property" />
|
||||||
|
</RadzenColumn>
|
||||||
|
</RadzenRow>
|
||||||
|
<RadzenRow style="margin-bottom: 1rem">
|
||||||
|
<RadzenColumn SizeMD="3">
|
||||||
|
<RadzenLabel Text="Comparison" Component="Comparison" style="width: 100%" />
|
||||||
|
</RadzenColumn>
|
||||||
|
<RadzenColumn SizeMD="9">
|
||||||
|
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRuleCriterion.Comparison" 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>
|
||||||
|
|
@ -0,0 +1,84 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.JSInterop;
|
||||||
|
using Microsoft.AspNetCore.Components;
|
||||||
|
using Microsoft.AspNetCore.Components.Web;
|
||||||
|
using Radzen;
|
||||||
|
using Radzen.Blazor;
|
||||||
|
|
||||||
|
namespace ILoan.Rules.Web.Components.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; }
|
||||||
|
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
|
||||||
|
coreRulesForRuleID = await RulesService.GetCoreRules();
|
||||||
|
}
|
||||||
|
protected bool errorVisible;
|
||||||
|
protected ILoan.Rules.Web.Models.Rules.CoreRuleCriterion coreRuleCriterion;
|
||||||
|
|
||||||
|
protected IEnumerable<ILoan.Rules.Web.Models.Rules.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 ILoan.Rules.Web.Models.Rules.CoreRuleCriterion();
|
||||||
|
|
||||||
|
hasRuleIDValue = parameters.TryGetValue<int?>("RuleID", out var hasRuleIDResult);
|
||||||
|
|
||||||
|
if (hasRuleIDValue)
|
||||||
|
{
|
||||||
|
coreRuleCriterion.RuleID = hasRuleIDResult;
|
||||||
|
}
|
||||||
|
await base.SetParametersAsync(parameters);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
152
src/iLoan.Rules.Web/Components/Pages/CoreRules.razor
Normal file
152
src/iLoan.Rules.Web/Components/Pages/CoreRules.razor
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
@page "/core-rules"
|
||||||
|
|
||||||
|
<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="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 int[]{5, 10, 20, 30})
|
||||||
|
Data="@coreRules" TItem="ILoan.Rules.Web.Models.Rules.CoreRule" RowSelect="@EditRow" RowExpand="@GetChildData">
|
||||||
|
<Columns>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRule" Property="ID" Title="ID">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRule" Property="RuleName" Title="Rule Name">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRule" Property="Source" Title="Source">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRule" Property="DefaultThreshold" Title="Default Threshold">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRule" Property="Blocked" Title="Blocked">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRule" Property="TriggersManualReview" Title="Triggers Manual Review">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRule" Property="SuggestedResolution" Title="Suggested Resolution">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRule" Property="TriggerReason" Title="Trigger Reason">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRule" Property="UseLastRecord" Title="Use Last Record">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRule" Property="ApplicantType" Title="Applicant Type">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRule" Property="FilterOnClickthrough" Title="Filter On Clickthrough">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRule" Property="RunBeforeStatus" Title="Run Before Status">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRule" Property="DisplaySection" Title="Display Section">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRule" Property="WarningField" Title="Warning Field">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRule" Property="DutchRuleName" Title="Dutch Rule Name">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRule" Property="DutchTriggerReason" Title="Dutch Trigger Reason">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRule" Property="DutchSuggestedResolution" Title="Dutch Suggested Resolution">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRule" Property="DutchFilterOnClickthrough" Title="Dutch Filter On Clickthrough">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRule" Property="RuleExplanation" Title="Rule Explanation">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRule" Property="DutchRuleExplanation" Title="Dutch Rule Explanation">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRule" Property="WorkItemId" Title="Work Item Id">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRule" Property="Title" Title="Title">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRule" Property="update" Title="update">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.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" />
|
||||||
|
</RadzenColumn>
|
||||||
|
<RadzenColumn Size="12" SizeMD="6">
|
||||||
|
<RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center" JustifyContent="JustifyContent.End" Gap="0.5rem">
|
||||||
|
<RadzenButton Visible="@(coreRuleChild != null)" Icon="add_circle_outline" Text="Add" Click=@(args => CoreRuleCriteriaAddButtonClick(args,coreRuleChild)) />
|
||||||
|
</RadzenStack>
|
||||||
|
</RadzenColumn>
|
||||||
|
</RadzenRow>
|
||||||
|
<RadzenDataGrid ColumnWidth="200px" Visible="@(coreRuleChild != null)" @ref=CoreRuleCriteriaDataGrid AllowFiltering="true" FilterMode="Radzen.FilterMode.Advanced" AllowPaging="true" AllowSorting="true" ShowPagingSummary="true" PageSizeOptions=@(new int[]{5, 10, 20, 30})
|
||||||
|
Data="@coreRuleChild?.CoreRuleCriteria" TItem="ILoan.Rules.Web.Models.Rules.CoreRuleCriterion" RowSelect="@(args => CoreRuleCriteriaRowSelect(args, coreRuleChild))">
|
||||||
|
<Columns>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRuleCriterion" Property="ID" Title="ID">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRuleCriterion" Property="CoreRule.RuleName" Title="Core Rule">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRuleCriterion" Property="Property" Title="Property">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRuleCriterion" Property="Comparison" Title="Comparison">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRuleCriterion" Property="Value" Title="Value">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRuleCriterion" Property="ValueIsProperty" Title="Value Is Property">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRuleCriterion" Property="ReturnCount" Title="Return Count">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRuleCriterion" Property="IsThresholdCriterium" Title="Is Threshold Criterium">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.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" />
|
||||||
|
</RadzenColumn>
|
||||||
|
<RadzenColumn Size="12" SizeMD="6">
|
||||||
|
<RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center" JustifyContent="JustifyContent.End" Gap="0.5rem">
|
||||||
|
<RadzenButton Visible="@(coreRuleChild != null)" 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="Radzen.FilterMode.Advanced" AllowPaging="true" AllowSorting="true" ShowPagingSummary="true" PageSizeOptions=@(new int[]{5, 10, 20, 30})
|
||||||
|
Data="@coreRuleChild?.CoreRuleCriteriaOperators" TItem="ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator" RowSelect="@(args => CoreRuleCriteriaOperatorsRowSelect(args, coreRuleChild))">
|
||||||
|
<Columns>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator" Property="ID" Title="ID">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator" Property="CoreRule.RuleName" Title="Core Rule">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator" Property="Operator1" Title="Operator1">
|
||||||
|
</RadzenDataGridColumn>
|
||||||
|
<RadzenDataGridColumn TItem="ILoan.Rules.Web.Models.Rules.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>
|
192
src/iLoan.Rules.Web/Components/Pages/CoreRules.razor.cs
Normal file
192
src/iLoan.Rules.Web/Components/Pages/CoreRules.razor.cs
Normal file
@ -0,0 +1,192 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.JSInterop;
|
||||||
|
using Microsoft.AspNetCore.Components;
|
||||||
|
using Microsoft.AspNetCore.Components.Web;
|
||||||
|
using Radzen;
|
||||||
|
using Radzen.Blazor;
|
||||||
|
|
||||||
|
namespace ILoan.Rules.Web.Components.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; }
|
||||||
|
|
||||||
|
protected IEnumerable<ILoan.Rules.Web.Models.Rules.CoreRule> coreRules;
|
||||||
|
|
||||||
|
protected RadzenDataGrid<ILoan.Rules.Web.Models.Rules.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();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected async Task EditRow(ILoan.Rules.Web.Models.Rules.CoreRule args)
|
||||||
|
{
|
||||||
|
await DialogService.OpenAsync<EditCoreRule>("Edit CoreRule", new Dictionary<string, object> { {"ID", args.ID} });
|
||||||
|
}
|
||||||
|
|
||||||
|
protected async Task GridDeleteButtonClick(MouseEventArgs args, ILoan.Rules.Web.Models.Rules.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 ILoan.Rules.Web.Models.Rules.CoreRule coreRuleChild;
|
||||||
|
protected async Task GetChildData(ILoan.Rules.Web.Models.Rules.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 ILoan.Rules.Web.Models.Rules.CoreRuleCriterion coreRuleCriterionCoreRuleCriteria;
|
||||||
|
|
||||||
|
protected IEnumerable<ILoan.Rules.Web.Models.Rules.CoreRule> coreRulesForRuleIDCoreRuleCriteria;
|
||||||
|
|
||||||
|
protected RadzenDataGrid<ILoan.Rules.Web.Models.Rules.CoreRuleCriterion> CoreRuleCriteriaDataGrid;
|
||||||
|
|
||||||
|
protected async Task CoreRuleCriteriaAddButtonClick(MouseEventArgs args, ILoan.Rules.Web.Models.Rules.CoreRule data)
|
||||||
|
{
|
||||||
|
|
||||||
|
var dialogResult = await DialogService.OpenAsync<AddCoreRuleCriterion>("Add CoreRuleCriteria", new Dictionary<string, object> { {"RuleID" , data.ID} });
|
||||||
|
await GetChildData(data);
|
||||||
|
await CoreRuleCriteriaDataGrid.Reload();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected async Task CoreRuleCriteriaRowSelect(ILoan.Rules.Web.Models.Rules.CoreRuleCriterion args, ILoan.Rules.Web.Models.Rules.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, ILoan.Rules.Web.Models.Rules.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 ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator coreRuleCriteriaOperatorCoreRuleCriteriaOperators;
|
||||||
|
|
||||||
|
protected IEnumerable<ILoan.Rules.Web.Models.Rules.CoreRule> coreRulesForRuleIDCoreRuleCriteriaOperators;
|
||||||
|
|
||||||
|
protected RadzenDataGrid<ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator> CoreRuleCriteriaOperatorsDataGrid;
|
||||||
|
|
||||||
|
protected async Task CoreRuleCriteriaOperatorsAddButtonClick(MouseEventArgs args, ILoan.Rules.Web.Models.Rules.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(ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator args, ILoan.Rules.Web.Models.Rules.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, ILoan.Rules.Web.Models.Rules.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"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
193
src/iLoan.Rules.Web/Components/Pages/EditCoreRule.razor
Normal file
193
src/iLoan.Rules.Web/Components/Pages/EditCoreRule.razor
Normal file
@ -0,0 +1,193 @@
|
|||||||
|
@page "/edit-core-rule"
|
||||||
|
|
||||||
|
<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="ILoan.Rules.Web.Models.Rules.CoreRule" Data="@coreRule" Visible="@(coreRule != null)" Submit="@FormSubmit">
|
||||||
|
<RadzenRow style="margin-bottom: 1rem">
|
||||||
|
<RadzenColumn SizeMD="3">
|
||||||
|
<RadzenLabel Text="Rule Name" Component="RuleName" style="width: 100%" />
|
||||||
|
</RadzenColumn>
|
||||||
|
<RadzenColumn SizeMD="9">
|
||||||
|
<RadzenTextBox 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">
|
||||||
|
<RadzenTextBox 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">
|
||||||
|
<RadzenTextBox 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">
|
||||||
|
<RadzenTextBox 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>
|
||||||
|
|
63
src/iLoan.Rules.Web/Components/Pages/EditCoreRule.razor.cs
Normal file
63
src/iLoan.Rules.Web/Components/Pages/EditCoreRule.razor.cs
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.JSInterop;
|
||||||
|
using Microsoft.AspNetCore.Components;
|
||||||
|
using Microsoft.AspNetCore.Components.Web;
|
||||||
|
using Radzen;
|
||||||
|
using Radzen.Blazor;
|
||||||
|
|
||||||
|
namespace ILoan.Rules.Web.Components.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 ILoan.Rules.Web.Models.Rules.CoreRule coreRule;
|
||||||
|
|
||||||
|
protected async Task FormSubmit()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await RulesService.UpdateCoreRule(ID, coreRule);
|
||||||
|
DialogService.Close(coreRule);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
errorVisible = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected async Task CancelButtonClick(MouseEventArgs args)
|
||||||
|
{
|
||||||
|
DialogService.Close(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
@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="ILoan.Rules.Web.Models.Rules.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>
|
||||||
|
|
@ -0,0 +1,88 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.JSInterop;
|
||||||
|
using Microsoft.AspNetCore.Components;
|
||||||
|
using Microsoft.AspNetCore.Components.Web;
|
||||||
|
using Radzen;
|
||||||
|
using Radzen.Blazor;
|
||||||
|
|
||||||
|
namespace ILoan.Rules.Web.Components.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 ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator coreRuleCriteriaOperator;
|
||||||
|
|
||||||
|
protected IEnumerable<ILoan.Rules.Web.Models.Rules.CoreRule> coreRulesForRuleID;
|
||||||
|
|
||||||
|
protected async Task FormSubmit()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
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 ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator();
|
||||||
|
|
||||||
|
hasRuleIDValue = parameters.TryGetValue<int?>("RuleID", out var hasRuleIDResult);
|
||||||
|
|
||||||
|
if (hasRuleIDValue)
|
||||||
|
{
|
||||||
|
coreRuleCriteriaOperator.RuleID = hasRuleIDResult;
|
||||||
|
}
|
||||||
|
await base.SetParametersAsync(parameters);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,72 @@
|
|||||||
|
@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="ILoan.Rules.Web.Models.Rules.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">
|
||||||
|
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRuleCriterion.Property" Name="Property" />
|
||||||
|
</RadzenColumn>
|
||||||
|
</RadzenRow>
|
||||||
|
<RadzenRow style="margin-bottom: 1rem">
|
||||||
|
<RadzenColumn SizeMD="3">
|
||||||
|
<RadzenLabel Text="Comparison" Component="Comparison" style="width: 100%" />
|
||||||
|
</RadzenColumn>
|
||||||
|
<RadzenColumn SizeMD="9">
|
||||||
|
<RadzenTextBox style="display: block; width: 100%" @bind-Value="@coreRuleCriterion.Comparison" 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>
|
||||||
|
|
@ -0,0 +1,88 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.JSInterop;
|
||||||
|
using Microsoft.AspNetCore.Components;
|
||||||
|
using Microsoft.AspNetCore.Components.Web;
|
||||||
|
using Radzen;
|
||||||
|
using Radzen.Blazor;
|
||||||
|
|
||||||
|
namespace ILoan.Rules.Web.Components.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; }
|
||||||
|
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
coreRuleCriterion = await RulesService.GetCoreRuleCriterionById(ID);
|
||||||
|
|
||||||
|
coreRulesForRuleID = await RulesService.GetCoreRules();
|
||||||
|
}
|
||||||
|
protected bool errorVisible;
|
||||||
|
protected ILoan.Rules.Web.Models.Rules.CoreRuleCriterion coreRuleCriterion;
|
||||||
|
|
||||||
|
protected IEnumerable<ILoan.Rules.Web.Models.Rules.CoreRule> coreRulesForRuleID;
|
||||||
|
|
||||||
|
protected async Task FormSubmit()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
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 ILoan.Rules.Web.Models.Rules.CoreRuleCriterion();
|
||||||
|
|
||||||
|
hasRuleIDValue = parameters.TryGetValue<int?>("RuleID", out var hasRuleIDResult);
|
||||||
|
|
||||||
|
if (hasRuleIDValue)
|
||||||
|
{
|
||||||
|
coreRuleCriterion.RuleID = hasRuleIDResult;
|
||||||
|
}
|
||||||
|
await base.SetParametersAsync(parameters);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
369
src/iLoan.Rules.Web/Controllers/ExportController.cs
Normal file
369
src/iLoan.Rules.Web/Controllers/ExportController.cs
Normal file
@ -0,0 +1,369 @@
|
|||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Linq.Dynamic.Core;
|
||||||
|
using System.Data;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using System.Text;
|
||||||
|
using System.IO;
|
||||||
|
using DocumentFormat.OpenXml;
|
||||||
|
using DocumentFormat.OpenXml.Packaging;
|
||||||
|
using DocumentFormat.OpenXml.Spreadsheet;
|
||||||
|
using System.Reflection;
|
||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
|
|
||||||
|
namespace ILoan.Rules.Web.Controllers
|
||||||
|
{
|
||||||
|
public partial class ExportController : Controller
|
||||||
|
{
|
||||||
|
public IQueryable ApplyQuery<T>(IQueryable<T> items, IQueryCollection query = null, bool keyless = false) where T : class
|
||||||
|
{
|
||||||
|
if (query != null)
|
||||||
|
{
|
||||||
|
if (query.ContainsKey("$expand"))
|
||||||
|
{
|
||||||
|
var propertiesToExpand = query["$expand"].ToString().Split(',');
|
||||||
|
foreach (var p in propertiesToExpand)
|
||||||
|
{
|
||||||
|
items = items.Include(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var filter = query.ContainsKey("$filter") ? query["$filter"].ToString() : null;
|
||||||
|
if (!string.IsNullOrEmpty(filter))
|
||||||
|
{
|
||||||
|
if(keyless)
|
||||||
|
{
|
||||||
|
items = items.ToList().AsQueryable();
|
||||||
|
}
|
||||||
|
items = items.Where(filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (query.ContainsKey("$orderBy"))
|
||||||
|
{
|
||||||
|
items = items.OrderBy(query["$orderBy"].ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (query.ContainsKey("$skip"))
|
||||||
|
{
|
||||||
|
items = items.Skip(int.Parse(query["$skip"].ToString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (query.ContainsKey("$top"))
|
||||||
|
{
|
||||||
|
items = items.Take(int.Parse(query["$top"].ToString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (query.ContainsKey("$select"))
|
||||||
|
{
|
||||||
|
return items.Select($"new ({query["$select"].ToString()})");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FileStreamResult ToCSV(IQueryable query, string fileName = null)
|
||||||
|
{
|
||||||
|
var columns = GetProperties(query.ElementType);
|
||||||
|
|
||||||
|
var sb = new StringBuilder();
|
||||||
|
|
||||||
|
foreach (var item in query)
|
||||||
|
{
|
||||||
|
var row = new List<string>();
|
||||||
|
|
||||||
|
foreach (var column in columns)
|
||||||
|
{
|
||||||
|
row.Add($"{GetValue(item, column.Key)}".Trim());
|
||||||
|
}
|
||||||
|
|
||||||
|
sb.AppendLine(string.Join(",", row.ToArray()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var result = new FileStreamResult(new MemoryStream(UTF8Encoding.Default.GetBytes($"{string.Join(",", columns.Select(c => c.Key))}{System.Environment.NewLine}{sb.ToString()}")), "text/csv");
|
||||||
|
result.FileDownloadName = (!string.IsNullOrEmpty(fileName) ? fileName : "Export") + ".csv";
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FileStreamResult ToExcel(IQueryable query, string fileName = null)
|
||||||
|
{
|
||||||
|
var columns = GetProperties(query.ElementType);
|
||||||
|
var stream = new MemoryStream();
|
||||||
|
|
||||||
|
using (var document = SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook))
|
||||||
|
{
|
||||||
|
var workbookPart = document.AddWorkbookPart();
|
||||||
|
workbookPart.Workbook = new Workbook();
|
||||||
|
|
||||||
|
var worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
|
||||||
|
worksheetPart.Worksheet = new Worksheet();
|
||||||
|
|
||||||
|
var workbookStylesPart = workbookPart.AddNewPart<WorkbookStylesPart>();
|
||||||
|
GenerateWorkbookStylesPartContent(workbookStylesPart);
|
||||||
|
|
||||||
|
var sheets = workbookPart.Workbook.AppendChild(new Sheets());
|
||||||
|
var sheet = new Sheet() { Id = workbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Sheet1" };
|
||||||
|
sheets.Append(sheet);
|
||||||
|
|
||||||
|
workbookPart.Workbook.Save();
|
||||||
|
|
||||||
|
var sheetData = worksheetPart.Worksheet.AppendChild(new SheetData());
|
||||||
|
|
||||||
|
var headerRow = new Row();
|
||||||
|
|
||||||
|
foreach (var column in columns)
|
||||||
|
{
|
||||||
|
headerRow.Append(new Cell()
|
||||||
|
{
|
||||||
|
CellValue = new CellValue(column.Key),
|
||||||
|
DataType = new EnumValue<CellValues>(CellValues.String)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
sheetData.AppendChild(headerRow);
|
||||||
|
|
||||||
|
foreach (var item in query)
|
||||||
|
{
|
||||||
|
var row = new Row();
|
||||||
|
|
||||||
|
foreach (var column in columns)
|
||||||
|
{
|
||||||
|
var value = GetValue(item, column.Key);
|
||||||
|
var stringValue = $"{value}".Trim();
|
||||||
|
|
||||||
|
var cell = new Cell();
|
||||||
|
|
||||||
|
var underlyingType = column.Value.IsGenericType &&
|
||||||
|
column.Value.GetGenericTypeDefinition() == typeof(Nullable<>) ?
|
||||||
|
Nullable.GetUnderlyingType(column.Value) : column.Value;
|
||||||
|
|
||||||
|
var typeCode = Type.GetTypeCode(underlyingType);
|
||||||
|
|
||||||
|
if (typeCode == TypeCode.DateTime)
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrWhiteSpace(stringValue))
|
||||||
|
{
|
||||||
|
cell.CellValue = new CellValue() { Text = ((DateTime)value).ToOADate().ToString(System.Globalization.CultureInfo.InvariantCulture) };
|
||||||
|
cell.DataType = new EnumValue<CellValues>(CellValues.Number);
|
||||||
|
cell.StyleIndex = (UInt32Value)1U;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (typeCode == TypeCode.Boolean)
|
||||||
|
{
|
||||||
|
cell.CellValue = new CellValue(stringValue.ToLowerInvariant());
|
||||||
|
cell.DataType = new EnumValue<CellValues>(CellValues.Boolean);
|
||||||
|
}
|
||||||
|
else if (IsNumeric(typeCode))
|
||||||
|
{
|
||||||
|
if (value != null)
|
||||||
|
{
|
||||||
|
stringValue = Convert.ToString(value, CultureInfo.InvariantCulture);
|
||||||
|
}
|
||||||
|
cell.CellValue = new CellValue(stringValue);
|
||||||
|
cell.DataType = new EnumValue<CellValues>(CellValues.Number);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cell.CellValue = new CellValue(stringValue);
|
||||||
|
cell.DataType = new EnumValue<CellValues>(CellValues.String);
|
||||||
|
}
|
||||||
|
|
||||||
|
row.Append(cell);
|
||||||
|
}
|
||||||
|
|
||||||
|
sheetData.AppendChild(row);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
workbookPart.Workbook.Save();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stream?.Length > 0)
|
||||||
|
{
|
||||||
|
stream.Seek(0, SeekOrigin.Begin);
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = new FileStreamResult(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
||||||
|
result.FileDownloadName = (!string.IsNullOrEmpty(fileName) ? fileName : "Export") + ".xlsx";
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static object GetValue(object target, string name)
|
||||||
|
{
|
||||||
|
return target.GetType().GetProperty(name).GetValue(target);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IEnumerable<KeyValuePair<string, Type>> GetProperties(Type type)
|
||||||
|
{
|
||||||
|
return type.GetProperties(BindingFlags.Public | BindingFlags.Instance)
|
||||||
|
.Where(p => p.CanRead && IsSimpleType(p.PropertyType)).Select(p => new KeyValuePair<string, Type>(p.Name, p.PropertyType));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool IsSimpleType(Type type)
|
||||||
|
{
|
||||||
|
var underlyingType = type.IsGenericType &&
|
||||||
|
type.GetGenericTypeDefinition() == typeof(Nullable<>) ?
|
||||||
|
Nullable.GetUnderlyingType(type) : type;
|
||||||
|
|
||||||
|
if(underlyingType == typeof(System.Guid) || underlyingType == typeof(System.DateTimeOffset))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
#if NET6_0_OR_GREATER
|
||||||
|
if(underlyingType == typeof(System.DateOnly) || underlyingType == typeof(System.TimeOnly))
|
||||||
|
return true;
|
||||||
|
#endif
|
||||||
|
var typeCode = Type.GetTypeCode(underlyingType);
|
||||||
|
|
||||||
|
switch (typeCode)
|
||||||
|
{
|
||||||
|
case TypeCode.Boolean:
|
||||||
|
case TypeCode.Byte:
|
||||||
|
case TypeCode.Char:
|
||||||
|
case TypeCode.DateTime:
|
||||||
|
case TypeCode.Decimal:
|
||||||
|
case TypeCode.Double:
|
||||||
|
case TypeCode.Int16:
|
||||||
|
case TypeCode.Int32:
|
||||||
|
case TypeCode.Int64:
|
||||||
|
case TypeCode.SByte:
|
||||||
|
case TypeCode.Single:
|
||||||
|
case TypeCode.String:
|
||||||
|
case TypeCode.UInt16:
|
||||||
|
case TypeCode.UInt32:
|
||||||
|
case TypeCode.UInt64:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool IsNumeric(TypeCode typeCode)
|
||||||
|
{
|
||||||
|
switch (typeCode)
|
||||||
|
{
|
||||||
|
case TypeCode.Decimal:
|
||||||
|
case TypeCode.Double:
|
||||||
|
case TypeCode.Int16:
|
||||||
|
case TypeCode.Int32:
|
||||||
|
case TypeCode.Int64:
|
||||||
|
case TypeCode.UInt16:
|
||||||
|
case TypeCode.UInt32:
|
||||||
|
case TypeCode.UInt64:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void GenerateWorkbookStylesPartContent(WorkbookStylesPart workbookStylesPart1)
|
||||||
|
{
|
||||||
|
Stylesheet stylesheet1 = new Stylesheet() { MCAttributes = new MarkupCompatibilityAttributes() { Ignorable = "x14ac x16r2 xr" } };
|
||||||
|
stylesheet1.AddNamespaceDeclaration("mc", "http://schemas.openxmlformats.org/markup-compatibility/2006");
|
||||||
|
stylesheet1.AddNamespaceDeclaration("x14ac", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac");
|
||||||
|
stylesheet1.AddNamespaceDeclaration("x16r2", "http://schemas.microsoft.com/office/spreadsheetml/2015/02/main");
|
||||||
|
stylesheet1.AddNamespaceDeclaration("xr", "http://schemas.microsoft.com/office/spreadsheetml/2014/revision");
|
||||||
|
|
||||||
|
Fonts fonts1 = new Fonts() { Count = (UInt32Value)1U, KnownFonts = true };
|
||||||
|
|
||||||
|
Font font1 = new Font();
|
||||||
|
FontSize fontSize1 = new FontSize() { Val = 11D };
|
||||||
|
Color color1 = new Color() { Theme = (UInt32Value)1U };
|
||||||
|
FontName fontName1 = new FontName() { Val = "Calibri" };
|
||||||
|
FontFamilyNumbering fontFamilyNumbering1 = new FontFamilyNumbering() { Val = 2 };
|
||||||
|
FontScheme fontScheme1 = new FontScheme() { Val = FontSchemeValues.Minor };
|
||||||
|
|
||||||
|
font1.Append(fontSize1);
|
||||||
|
font1.Append(color1);
|
||||||
|
font1.Append(fontName1);
|
||||||
|
font1.Append(fontFamilyNumbering1);
|
||||||
|
font1.Append(fontScheme1);
|
||||||
|
|
||||||
|
fonts1.Append(font1);
|
||||||
|
|
||||||
|
Fills fills1 = new Fills() { Count = (UInt32Value)2U };
|
||||||
|
|
||||||
|
Fill fill1 = new Fill();
|
||||||
|
PatternFill patternFill1 = new PatternFill() { PatternType = PatternValues.None };
|
||||||
|
|
||||||
|
fill1.Append(patternFill1);
|
||||||
|
|
||||||
|
Fill fill2 = new Fill();
|
||||||
|
PatternFill patternFill2 = new PatternFill() { PatternType = PatternValues.Gray125 };
|
||||||
|
|
||||||
|
fill2.Append(patternFill2);
|
||||||
|
|
||||||
|
fills1.Append(fill1);
|
||||||
|
fills1.Append(fill2);
|
||||||
|
|
||||||
|
Borders borders1 = new Borders() { Count = (UInt32Value)1U };
|
||||||
|
|
||||||
|
Border border1 = new Border();
|
||||||
|
LeftBorder leftBorder1 = new LeftBorder();
|
||||||
|
RightBorder rightBorder1 = new RightBorder();
|
||||||
|
TopBorder topBorder1 = new TopBorder();
|
||||||
|
BottomBorder bottomBorder1 = new BottomBorder();
|
||||||
|
DiagonalBorder diagonalBorder1 = new DiagonalBorder();
|
||||||
|
|
||||||
|
border1.Append(leftBorder1);
|
||||||
|
border1.Append(rightBorder1);
|
||||||
|
border1.Append(topBorder1);
|
||||||
|
border1.Append(bottomBorder1);
|
||||||
|
border1.Append(diagonalBorder1);
|
||||||
|
|
||||||
|
borders1.Append(border1);
|
||||||
|
|
||||||
|
CellStyleFormats cellStyleFormats1 = new CellStyleFormats() { Count = (UInt32Value)1U };
|
||||||
|
CellFormat cellFormat1 = new CellFormat() { NumberFormatId = (UInt32Value)0U, FontId = (UInt32Value)0U, FillId = (UInt32Value)0U, BorderId = (UInt32Value)0U };
|
||||||
|
|
||||||
|
cellStyleFormats1.Append(cellFormat1);
|
||||||
|
|
||||||
|
CellFormats cellFormats1 = new CellFormats() { Count = (UInt32Value)2U };
|
||||||
|
CellFormat cellFormat2 = new CellFormat() { NumberFormatId = (UInt32Value)0U, FontId = (UInt32Value)0U, FillId = (UInt32Value)0U, BorderId = (UInt32Value)0U, FormatId = (UInt32Value)0U };
|
||||||
|
CellFormat cellFormat3 = new CellFormat() { NumberFormatId = (UInt32Value)14U, FontId = (UInt32Value)0U, FillId = (UInt32Value)0U, BorderId = (UInt32Value)0U, FormatId = (UInt32Value)0U, ApplyNumberFormat = true };
|
||||||
|
|
||||||
|
cellFormats1.Append(cellFormat2);
|
||||||
|
cellFormats1.Append(cellFormat3);
|
||||||
|
|
||||||
|
CellStyles cellStyles1 = new CellStyles() { Count = (UInt32Value)1U };
|
||||||
|
CellStyle cellStyle1 = new CellStyle() { Name = "Normal", FormatId = (UInt32Value)0U, BuiltinId = (UInt32Value)0U };
|
||||||
|
|
||||||
|
cellStyles1.Append(cellStyle1);
|
||||||
|
DifferentialFormats differentialFormats1 = new DifferentialFormats() { Count = (UInt32Value)0U };
|
||||||
|
TableStyles tableStyles1 = new TableStyles() { Count = (UInt32Value)0U, DefaultTableStyle = "TableStyleMedium2", DefaultPivotStyle = "PivotStyleLight16" };
|
||||||
|
|
||||||
|
StylesheetExtensionList stylesheetExtensionList1 = new StylesheetExtensionList();
|
||||||
|
|
||||||
|
StylesheetExtension stylesheetExtension1 = new StylesheetExtension() { Uri = "{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}" };
|
||||||
|
stylesheetExtension1.AddNamespaceDeclaration("x14", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main");
|
||||||
|
|
||||||
|
StylesheetExtension stylesheetExtension2 = new StylesheetExtension() { Uri = "{9260A510-F301-46a8-8635-F512D64BE5F5}" };
|
||||||
|
stylesheetExtension2.AddNamespaceDeclaration("x15", "http://schemas.microsoft.com/office/spreadsheetml/2010/11/main");
|
||||||
|
|
||||||
|
OpenXmlUnknownElement openXmlUnknownElement4 = workbookStylesPart1.CreateUnknownElement("<x15:timelineStyles defaultTimelineStyle=\"TimeSlicerStyleLight1\" xmlns:x15=\"http://schemas.microsoft.com/office/spreadsheetml/2010/11/main\" />");
|
||||||
|
|
||||||
|
stylesheetExtension2.Append(openXmlUnknownElement4);
|
||||||
|
|
||||||
|
stylesheetExtensionList1.Append(stylesheetExtension1);
|
||||||
|
stylesheetExtensionList1.Append(stylesheetExtension2);
|
||||||
|
|
||||||
|
stylesheet1.Append(fonts1);
|
||||||
|
stylesheet1.Append(fills1);
|
||||||
|
stylesheet1.Append(borders1);
|
||||||
|
stylesheet1.Append(cellStyleFormats1);
|
||||||
|
stylesheet1.Append(cellFormats1);
|
||||||
|
stylesheet1.Append(cellStyles1);
|
||||||
|
stylesheet1.Append(differentialFormats1);
|
||||||
|
stylesheet1.Append(tableStyles1);
|
||||||
|
stylesheet1.Append(stylesheetExtensionList1);
|
||||||
|
|
||||||
|
workbookStylesPart1.Stylesheet = stylesheet1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
64
src/iLoan.Rules.Web/Controllers/ExportRulesController.cs
Normal file
64
src/iLoan.Rules.Web/Controllers/ExportRulesController.cs
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
using ILoan.Rules.Web.Data;
|
||||||
|
|
||||||
|
namespace ILoan.Rules.Web.Controllers
|
||||||
|
{
|
||||||
|
public partial class ExportRulesController : ExportController
|
||||||
|
{
|
||||||
|
private readonly RulesContext context;
|
||||||
|
private readonly RulesService service;
|
||||||
|
|
||||||
|
public ExportRulesController(RulesContext context, RulesService service)
|
||||||
|
{
|
||||||
|
this.service = service;
|
||||||
|
this.context = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet("/export/Rules/corerulecriteriaoperators/csv")]
|
||||||
|
[HttpGet("/export/Rules/corerulecriteriaoperators/csv(fileName='{fileName}')")]
|
||||||
|
public async Task<FileStreamResult> ExportCoreRuleCriteriaOperatorsToCSV(string fileName = null)
|
||||||
|
{
|
||||||
|
return ToCSV(ApplyQuery(await service.GetCoreRuleCriteriaOperators(), Request.Query, false), fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet("/export/Rules/corerulecriteriaoperators/excel")]
|
||||||
|
[HttpGet("/export/Rules/corerulecriteriaoperators/excel(fileName='{fileName}')")]
|
||||||
|
public async Task<FileStreamResult> ExportCoreRuleCriteriaOperatorsToExcel(string fileName = null)
|
||||||
|
{
|
||||||
|
return ToExcel(ApplyQuery(await service.GetCoreRuleCriteriaOperators(), Request.Query, false), fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet("/export/Rules/corerules/csv")]
|
||||||
|
[HttpGet("/export/Rules/corerules/csv(fileName='{fileName}')")]
|
||||||
|
public async Task<FileStreamResult> ExportCoreRulesToCSV(string fileName = null)
|
||||||
|
{
|
||||||
|
return ToCSV(ApplyQuery(await service.GetCoreRules(), Request.Query, false), fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet("/export/Rules/corerules/excel")]
|
||||||
|
[HttpGet("/export/Rules/corerules/excel(fileName='{fileName}')")]
|
||||||
|
public async Task<FileStreamResult> ExportCoreRulesToExcel(string fileName = null)
|
||||||
|
{
|
||||||
|
return ToExcel(ApplyQuery(await service.GetCoreRules(), Request.Query, false), fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet("/export/Rules/corerulecriteria/csv")]
|
||||||
|
[HttpGet("/export/Rules/corerulecriteria/csv(fileName='{fileName}')")]
|
||||||
|
public async Task<FileStreamResult> ExportCoreRuleCriteriaToCSV(string fileName = null)
|
||||||
|
{
|
||||||
|
return ToCSV(ApplyQuery(await service.GetCoreRuleCriteria(), Request.Query, false), fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet("/export/Rules/corerulecriteria/excel")]
|
||||||
|
[HttpGet("/export/Rules/corerulecriteria/excel(fileName='{fileName}')")]
|
||||||
|
public async Task<FileStreamResult> ExportCoreRuleCriteriaToExcel(string fileName = null)
|
||||||
|
{
|
||||||
|
return ToExcel(ApplyQuery(await service.GetCoreRuleCriteria(), Request.Query, false), fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
33
src/iLoan.Rules.Web/Data/BlankTriggerAddingConvention.cs
Normal file
33
src/iLoan.Rules.Web/Data/BlankTriggerAddingConvention.cs
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
|
||||||
|
namespace ILoan.Rules.Web.Data
|
||||||
|
{
|
||||||
|
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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
66
src/iLoan.Rules.Web/Data/RulesContext.cs
Normal file
66
src/iLoan.Rules.Web/Data/RulesContext.cs
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using ILoan.Rules.Web.Models.Rules;
|
||||||
|
|
||||||
|
namespace ILoan.Rules.Web.Data
|
||||||
|
{
|
||||||
|
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<ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator>()
|
||||||
|
.HasOne(i => i.CoreRule)
|
||||||
|
.WithMany(i => i.CoreRuleCriteriaOperators)
|
||||||
|
.HasForeignKey(i => i.RuleID)
|
||||||
|
.HasPrincipalKey(i => i.ID);
|
||||||
|
|
||||||
|
builder.Entity<ILoan.Rules.Web.Models.Rules.CoreRuleCriterion>()
|
||||||
|
.HasOne(i => i.CoreRule)
|
||||||
|
.WithMany(i => i.CoreRuleCriteria)
|
||||||
|
.HasForeignKey(i => i.RuleID)
|
||||||
|
.HasPrincipalKey(i => i.ID);
|
||||||
|
|
||||||
|
builder.Entity<ILoan.Rules.Web.Models.Rules.CoreRule>()
|
||||||
|
.Property(p => p.UseLastRecord)
|
||||||
|
.HasDefaultValueSql(@"true");
|
||||||
|
|
||||||
|
builder.Entity<ILoan.Rules.Web.Models.Rules.CoreRuleCriterion>()
|
||||||
|
.Property(p => p.ValueIsProperty)
|
||||||
|
.HasDefaultValueSql(@"false");
|
||||||
|
|
||||||
|
builder.Entity<ILoan.Rules.Web.Models.Rules.CoreRuleCriterion>()
|
||||||
|
.Property(p => p.ReturnCount)
|
||||||
|
.HasDefaultValueSql(@"false");
|
||||||
|
|
||||||
|
builder.Entity<ILoan.Rules.Web.Models.Rules.CoreRuleCriterion>()
|
||||||
|
.Property(p => p.IsThresholdCriterium)
|
||||||
|
.HasDefaultValueSql(@"false");
|
||||||
|
this.OnModelBuilding(builder);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DbSet<ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator> CoreRuleCriteriaOperators { get; set; }
|
||||||
|
|
||||||
|
public DbSet<ILoan.Rules.Web.Models.Rules.CoreRule> CoreRules { get; set; }
|
||||||
|
|
||||||
|
public DbSet<ILoan.Rules.Web.Models.Rules.CoreRuleCriterion> CoreRuleCriteria { get; set; }
|
||||||
|
|
||||||
|
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
|
||||||
|
{
|
||||||
|
configurationBuilder.Conventions.Add(_ => new BlankTriggerAddingConvention());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,12 +1,14 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<NoWarn>CS0168,CS1998,BL9993,CS0649,CS0436,0436</NoWarn>
|
<NoWarn>CS0168,CS1998,BL9993,CS0649,CS0436,0436</NoWarn>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Radzen.Blazor" Version="*" />
|
<PackageReference Include="Radzen.Blazor" Version="*" />
|
||||||
|
<PackageReference Include="DocumentFormat.OpenXml" Version="2.20.0" />
|
||||||
|
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.0" />
|
||||||
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.0" />
|
||||||
|
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
66
src/iLoan.Rules.Web/Models/Rules/CoreRule.cs
Normal file
66
src/iLoan.Rules.Web/Models/Rules/CoreRule.cs
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
|
||||||
|
namespace ILoan.Rules.Web.Models.Rules
|
||||||
|
{
|
||||||
|
[Table("Core_Rules", Schema = "core")]
|
||||||
|
public partial class CoreRule
|
||||||
|
{
|
||||||
|
[Key]
|
||||||
|
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
||||||
|
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 decimal? WorkItemId { get; set; }
|
||||||
|
|
||||||
|
public string Title { get; set; }
|
||||||
|
|
||||||
|
public string update { get; set; }
|
||||||
|
|
||||||
|
public ICollection<CoreRuleCriterion> CoreRuleCriteria { get; set; }
|
||||||
|
|
||||||
|
public ICollection<CoreRuleCriteriaOperator> CoreRuleCriteriaOperators { get; set; }
|
||||||
|
}
|
||||||
|
}
|
22
src/iLoan.Rules.Web/Models/Rules/CoreRuleCriteriaOperator.cs
Normal file
22
src/iLoan.Rules.Web/Models/Rules/CoreRuleCriteriaOperator.cs
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
|
||||||
|
namespace ILoan.Rules.Web.Models.Rules
|
||||||
|
{
|
||||||
|
[Table("Core_RuleCriteriaOperator", Schema = "core")]
|
||||||
|
public partial class CoreRuleCriteriaOperator
|
||||||
|
{
|
||||||
|
[Key]
|
||||||
|
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
||||||
|
public int ID { get; set; }
|
||||||
|
|
||||||
|
public int? RuleID { get; set; }
|
||||||
|
|
||||||
|
public CoreRule CoreRule { get; set; }
|
||||||
|
|
||||||
|
[Column("Operator")]
|
||||||
|
public string Operator1 { get; set; }
|
||||||
|
}
|
||||||
|
}
|
31
src/iLoan.Rules.Web/Models/Rules/CoreRuleCriterion.cs
Normal file
31
src/iLoan.Rules.Web/Models/Rules/CoreRuleCriterion.cs
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
|
||||||
|
namespace ILoan.Rules.Web.Models.Rules
|
||||||
|
{
|
||||||
|
[Table("Core_RuleCriteria", Schema = "core")]
|
||||||
|
public partial class CoreRuleCriterion
|
||||||
|
{
|
||||||
|
[Key]
|
||||||
|
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
||||||
|
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; }
|
||||||
|
}
|
||||||
|
}
|
@ -1,17 +1,19 @@
|
|||||||
using Radzen;
|
using Radzen;
|
||||||
using ILoan.Rules.Web.Components;
|
using ILoan.Rules.Web.Components;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
|
|
||||||
// Add services to the container.
|
// Add services to the container.
|
||||||
builder.Services.AddRazorComponents()
|
builder.Services.AddRazorComponents().AddInteractiveServerComponents().AddHubOptions(options => options.MaximumReceiveMessageSize = 10 * 1024 * 1024);
|
||||||
.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<ILoan.Rules.Web.RulesService>();
|
||||||
|
builder.Services.AddDbContext<ILoan.Rules.Web.Data.RulesContext>(options =>
|
||||||
|
{
|
||||||
|
options.UseNpgsql(builder.Configuration.GetConnectionString("RulesConnection"));
|
||||||
|
});
|
||||||
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())
|
||||||
{
|
{
|
||||||
@ -24,8 +26,5 @@ app.UseHttpsRedirection();
|
|||||||
app.MapControllers();
|
app.MapControllers();
|
||||||
app.UseStaticFiles();
|
app.UseStaticFiles();
|
||||||
app.UseAntiforgery();
|
app.UseAntiforgery();
|
||||||
|
app.MapRazorComponents<App>().AddInteractiveServerRenderMode();
|
||||||
app.MapRazorComponents<App>()
|
|
||||||
.AddInteractiveServerRenderMode();
|
|
||||||
|
|
||||||
app.Run();
|
app.Run();
|
560
src/iLoan.Rules.Web/Services/RulesService.cs
Normal file
560
src/iLoan.Rules.Web/Services/RulesService.cs
Normal file
@ -0,0 +1,560 @@
|
|||||||
|
using System;
|
||||||
|
using System.Data;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Linq.Dynamic.Core;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Text.Encodings.Web;
|
||||||
|
using Microsoft.AspNetCore.Components;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Radzen;
|
||||||
|
|
||||||
|
using ILoan.Rules.Web.Data;
|
||||||
|
|
||||||
|
namespace ILoan.Rules.Web
|
||||||
|
{
|
||||||
|
public partial class RulesService
|
||||||
|
{
|
||||||
|
RulesContext Context
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this.context;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly RulesContext context;
|
||||||
|
private readonly NavigationManager navigationManager;
|
||||||
|
|
||||||
|
public RulesService(RulesContext context, NavigationManager navigationManager)
|
||||||
|
{
|
||||||
|
this.context = context;
|
||||||
|
this.navigationManager = navigationManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Reset() => Context.ChangeTracker.Entries().Where(e => e.Entity != null).ToList().ForEach(e => e.State = EntityState.Detached);
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public async Task ExportCoreRuleCriteriaOperatorsToExcel(Query query = null, string fileName = null)
|
||||||
|
{
|
||||||
|
navigationManager.NavigateTo(query != null ? query.ToUrl($"export/rules/corerulecriteriaoperators/excel(fileName='{(!string.IsNullOrEmpty(fileName) ? UrlEncoder.Default.Encode(fileName) : "Export")}')") : $"export/rules/corerulecriteriaoperators/excel(fileName='{(!string.IsNullOrEmpty(fileName) ? UrlEncoder.Default.Encode(fileName) : "Export")}')", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task ExportCoreRuleCriteriaOperatorsToCSV(Query query = null, string fileName = null)
|
||||||
|
{
|
||||||
|
navigationManager.NavigateTo(query != null ? query.ToUrl($"export/rules/corerulecriteriaoperators/csv(fileName='{(!string.IsNullOrEmpty(fileName) ? UrlEncoder.Default.Encode(fileName) : "Export")}')") : $"export/rules/corerulecriteriaoperators/csv(fileName='{(!string.IsNullOrEmpty(fileName) ? UrlEncoder.Default.Encode(fileName) : "Export")}')", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
partial void OnCoreRuleCriteriaOperatorsRead(ref IQueryable<ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator> items);
|
||||||
|
|
||||||
|
public async Task<IQueryable<ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator>> GetCoreRuleCriteriaOperators(Query query = null)
|
||||||
|
{
|
||||||
|
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(ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator item);
|
||||||
|
partial void OnGetCoreRuleCriteriaOperatorById(ref IQueryable<ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator> items);
|
||||||
|
|
||||||
|
|
||||||
|
public async Task<ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator> GetCoreRuleCriteriaOperatorById(int id)
|
||||||
|
{
|
||||||
|
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(ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator item);
|
||||||
|
partial void OnAfterCoreRuleCriteriaOperatorCreated(ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator item);
|
||||||
|
|
||||||
|
public async Task<ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator> CreateCoreRuleCriteriaOperator(ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator corerulecriteriaoperator)
|
||||||
|
{
|
||||||
|
OnCoreRuleCriteriaOperatorCreated(corerulecriteriaoperator);
|
||||||
|
|
||||||
|
var existingItem = Context.CoreRuleCriteriaOperators
|
||||||
|
.Where(i => i.ID == corerulecriteriaoperator.ID)
|
||||||
|
.FirstOrDefault();
|
||||||
|
|
||||||
|
if (existingItem != null)
|
||||||
|
{
|
||||||
|
throw new Exception("Item already available");
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Context.CoreRuleCriteriaOperators.Add(corerulecriteriaoperator);
|
||||||
|
Context.SaveChanges();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
Context.Entry(corerulecriteriaoperator).State = EntityState.Detached;
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
|
OnAfterCoreRuleCriteriaOperatorCreated(corerulecriteriaoperator);
|
||||||
|
|
||||||
|
return corerulecriteriaoperator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator> CancelCoreRuleCriteriaOperatorChanges(ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator item)
|
||||||
|
{
|
||||||
|
var entityToCancel = Context.Entry(item);
|
||||||
|
if (entityToCancel.State == EntityState.Modified)
|
||||||
|
{
|
||||||
|
entityToCancel.CurrentValues.SetValues(entityToCancel.OriginalValues);
|
||||||
|
entityToCancel.State = EntityState.Unchanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
partial void OnCoreRuleCriteriaOperatorUpdated(ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator item);
|
||||||
|
partial void OnAfterCoreRuleCriteriaOperatorUpdated(ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator item);
|
||||||
|
|
||||||
|
public async Task<ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator> UpdateCoreRuleCriteriaOperator(int id, ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator corerulecriteriaoperator)
|
||||||
|
{
|
||||||
|
OnCoreRuleCriteriaOperatorUpdated(corerulecriteriaoperator);
|
||||||
|
|
||||||
|
var itemToUpdate = Context.CoreRuleCriteriaOperators
|
||||||
|
.Where(i => i.ID == corerulecriteriaoperator.ID)
|
||||||
|
.FirstOrDefault();
|
||||||
|
|
||||||
|
if (itemToUpdate == null)
|
||||||
|
{
|
||||||
|
throw new Exception("Item no longer available");
|
||||||
|
}
|
||||||
|
|
||||||
|
var entryToUpdate = Context.Entry(itemToUpdate);
|
||||||
|
entryToUpdate.CurrentValues.SetValues(corerulecriteriaoperator);
|
||||||
|
entryToUpdate.State = EntityState.Modified;
|
||||||
|
|
||||||
|
Context.SaveChanges();
|
||||||
|
|
||||||
|
OnAfterCoreRuleCriteriaOperatorUpdated(corerulecriteriaoperator);
|
||||||
|
|
||||||
|
return corerulecriteriaoperator;
|
||||||
|
}
|
||||||
|
|
||||||
|
partial void OnCoreRuleCriteriaOperatorDeleted(ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator item);
|
||||||
|
partial void OnAfterCoreRuleCriteriaOperatorDeleted(ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator item);
|
||||||
|
|
||||||
|
public async Task<ILoan.Rules.Web.Models.Rules.CoreRuleCriteriaOperator> DeleteCoreRuleCriteriaOperator(int id)
|
||||||
|
{
|
||||||
|
var itemToDelete = Context.CoreRuleCriteriaOperators
|
||||||
|
.Where(i => i.ID == id)
|
||||||
|
.FirstOrDefault();
|
||||||
|
|
||||||
|
if (itemToDelete == null)
|
||||||
|
{
|
||||||
|
throw new Exception("Item no longer available");
|
||||||
|
}
|
||||||
|
|
||||||
|
OnCoreRuleCriteriaOperatorDeleted(itemToDelete);
|
||||||
|
|
||||||
|
|
||||||
|
Context.CoreRuleCriteriaOperators.Remove(itemToDelete);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Context.SaveChanges();
|
||||||
|
}
|
||||||
|
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<ILoan.Rules.Web.Models.Rules.CoreRule> items);
|
||||||
|
|
||||||
|
public async Task<IQueryable<ILoan.Rules.Web.Models.Rules.CoreRule>> GetCoreRules(Query query = null)
|
||||||
|
{
|
||||||
|
var items = Context.CoreRules.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(ILoan.Rules.Web.Models.Rules.CoreRule item);
|
||||||
|
partial void OnGetCoreRuleById(ref IQueryable<ILoan.Rules.Web.Models.Rules.CoreRule> items);
|
||||||
|
|
||||||
|
|
||||||
|
public async Task<ILoan.Rules.Web.Models.Rules.CoreRule> GetCoreRuleById(int id)
|
||||||
|
{
|
||||||
|
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(ILoan.Rules.Web.Models.Rules.CoreRule item);
|
||||||
|
partial void OnAfterCoreRuleCreated(ILoan.Rules.Web.Models.Rules.CoreRule item);
|
||||||
|
|
||||||
|
public async Task<ILoan.Rules.Web.Models.Rules.CoreRule> CreateCoreRule(ILoan.Rules.Web.Models.Rules.CoreRule corerule)
|
||||||
|
{
|
||||||
|
OnCoreRuleCreated(corerule);
|
||||||
|
|
||||||
|
var existingItem = Context.CoreRules
|
||||||
|
.Where(i => i.ID == corerule.ID)
|
||||||
|
.FirstOrDefault();
|
||||||
|
|
||||||
|
if (existingItem != null)
|
||||||
|
{
|
||||||
|
throw new Exception("Item already available");
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Context.CoreRules.Add(corerule);
|
||||||
|
Context.SaveChanges();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
Context.Entry(corerule).State = EntityState.Detached;
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
|
OnAfterCoreRuleCreated(corerule);
|
||||||
|
|
||||||
|
return corerule;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<ILoan.Rules.Web.Models.Rules.CoreRule> CancelCoreRuleChanges(ILoan.Rules.Web.Models.Rules.CoreRule item)
|
||||||
|
{
|
||||||
|
var entityToCancel = Context.Entry(item);
|
||||||
|
if (entityToCancel.State == EntityState.Modified)
|
||||||
|
{
|
||||||
|
entityToCancel.CurrentValues.SetValues(entityToCancel.OriginalValues);
|
||||||
|
entityToCancel.State = EntityState.Unchanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
partial void OnCoreRuleUpdated(ILoan.Rules.Web.Models.Rules.CoreRule item);
|
||||||
|
partial void OnAfterCoreRuleUpdated(ILoan.Rules.Web.Models.Rules.CoreRule item);
|
||||||
|
|
||||||
|
public async Task<ILoan.Rules.Web.Models.Rules.CoreRule> UpdateCoreRule(int id, ILoan.Rules.Web.Models.Rules.CoreRule corerule)
|
||||||
|
{
|
||||||
|
OnCoreRuleUpdated(corerule);
|
||||||
|
|
||||||
|
var itemToUpdate = Context.CoreRules
|
||||||
|
.Where(i => i.ID == corerule.ID)
|
||||||
|
.FirstOrDefault();
|
||||||
|
|
||||||
|
if (itemToUpdate == null)
|
||||||
|
{
|
||||||
|
throw new Exception("Item no longer available");
|
||||||
|
}
|
||||||
|
|
||||||
|
var entryToUpdate = Context.Entry(itemToUpdate);
|
||||||
|
entryToUpdate.CurrentValues.SetValues(corerule);
|
||||||
|
entryToUpdate.State = EntityState.Modified;
|
||||||
|
|
||||||
|
Context.SaveChanges();
|
||||||
|
|
||||||
|
OnAfterCoreRuleUpdated(corerule);
|
||||||
|
|
||||||
|
return corerule;
|
||||||
|
}
|
||||||
|
|
||||||
|
partial void OnCoreRuleDeleted(ILoan.Rules.Web.Models.Rules.CoreRule item);
|
||||||
|
partial void OnAfterCoreRuleDeleted(ILoan.Rules.Web.Models.Rules.CoreRule item);
|
||||||
|
|
||||||
|
public async Task<ILoan.Rules.Web.Models.Rules.CoreRule> DeleteCoreRule(int id)
|
||||||
|
{
|
||||||
|
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
|
||||||
|
{
|
||||||
|
Context.SaveChanges();
|
||||||
|
}
|
||||||
|
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<ILoan.Rules.Web.Models.Rules.CoreRuleCriterion> items);
|
||||||
|
|
||||||
|
public async Task<IQueryable<ILoan.Rules.Web.Models.Rules.CoreRuleCriterion>> GetCoreRuleCriteria(Query query = null)
|
||||||
|
{
|
||||||
|
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(ILoan.Rules.Web.Models.Rules.CoreRuleCriterion item);
|
||||||
|
partial void OnGetCoreRuleCriterionById(ref IQueryable<ILoan.Rules.Web.Models.Rules.CoreRuleCriterion> items);
|
||||||
|
|
||||||
|
|
||||||
|
public async Task<ILoan.Rules.Web.Models.Rules.CoreRuleCriterion> GetCoreRuleCriterionById(int id)
|
||||||
|
{
|
||||||
|
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(ILoan.Rules.Web.Models.Rules.CoreRuleCriterion item);
|
||||||
|
partial void OnAfterCoreRuleCriterionCreated(ILoan.Rules.Web.Models.Rules.CoreRuleCriterion item);
|
||||||
|
|
||||||
|
public async Task<ILoan.Rules.Web.Models.Rules.CoreRuleCriterion> CreateCoreRuleCriterion(ILoan.Rules.Web.Models.Rules.CoreRuleCriterion corerulecriterion)
|
||||||
|
{
|
||||||
|
OnCoreRuleCriterionCreated(corerulecriterion);
|
||||||
|
|
||||||
|
var existingItem = Context.CoreRuleCriteria
|
||||||
|
.Where(i => i.ID == corerulecriterion.ID)
|
||||||
|
.FirstOrDefault();
|
||||||
|
|
||||||
|
if (existingItem != null)
|
||||||
|
{
|
||||||
|
throw new Exception("Item already available");
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Context.CoreRuleCriteria.Add(corerulecriterion);
|
||||||
|
Context.SaveChanges();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
Context.Entry(corerulecriterion).State = EntityState.Detached;
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
|
OnAfterCoreRuleCriterionCreated(corerulecriterion);
|
||||||
|
|
||||||
|
return corerulecriterion;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<ILoan.Rules.Web.Models.Rules.CoreRuleCriterion> CancelCoreRuleCriterionChanges(ILoan.Rules.Web.Models.Rules.CoreRuleCriterion item)
|
||||||
|
{
|
||||||
|
var entityToCancel = Context.Entry(item);
|
||||||
|
if (entityToCancel.State == EntityState.Modified)
|
||||||
|
{
|
||||||
|
entityToCancel.CurrentValues.SetValues(entityToCancel.OriginalValues);
|
||||||
|
entityToCancel.State = EntityState.Unchanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
partial void OnCoreRuleCriterionUpdated(ILoan.Rules.Web.Models.Rules.CoreRuleCriterion item);
|
||||||
|
partial void OnAfterCoreRuleCriterionUpdated(ILoan.Rules.Web.Models.Rules.CoreRuleCriterion item);
|
||||||
|
|
||||||
|
public async Task<ILoan.Rules.Web.Models.Rules.CoreRuleCriterion> UpdateCoreRuleCriterion(int id, ILoan.Rules.Web.Models.Rules.CoreRuleCriterion corerulecriterion)
|
||||||
|
{
|
||||||
|
OnCoreRuleCriterionUpdated(corerulecriterion);
|
||||||
|
|
||||||
|
var itemToUpdate = Context.CoreRuleCriteria
|
||||||
|
.Where(i => i.ID == corerulecriterion.ID)
|
||||||
|
.FirstOrDefault();
|
||||||
|
|
||||||
|
if (itemToUpdate == null)
|
||||||
|
{
|
||||||
|
throw new Exception("Item no longer available");
|
||||||
|
}
|
||||||
|
|
||||||
|
var entryToUpdate = Context.Entry(itemToUpdate);
|
||||||
|
entryToUpdate.CurrentValues.SetValues(corerulecriterion);
|
||||||
|
entryToUpdate.State = EntityState.Modified;
|
||||||
|
|
||||||
|
Context.SaveChanges();
|
||||||
|
|
||||||
|
OnAfterCoreRuleCriterionUpdated(corerulecriterion);
|
||||||
|
|
||||||
|
return corerulecriterion;
|
||||||
|
}
|
||||||
|
|
||||||
|
partial void OnCoreRuleCriterionDeleted(ILoan.Rules.Web.Models.Rules.CoreRuleCriterion item);
|
||||||
|
partial void OnAfterCoreRuleCriterionDeleted(ILoan.Rules.Web.Models.Rules.CoreRuleCriterion item);
|
||||||
|
|
||||||
|
public async Task<ILoan.Rules.Web.Models.Rules.CoreRuleCriterion> DeleteCoreRuleCriterion(int id)
|
||||||
|
{
|
||||||
|
var itemToDelete = Context.CoreRuleCriteria
|
||||||
|
.Where(i => i.ID == id)
|
||||||
|
.FirstOrDefault();
|
||||||
|
|
||||||
|
if (itemToDelete == null)
|
||||||
|
{
|
||||||
|
throw new Exception("Item no longer available");
|
||||||
|
}
|
||||||
|
|
||||||
|
OnCoreRuleCriterionDeleted(itemToDelete);
|
||||||
|
|
||||||
|
|
||||||
|
Context.CoreRuleCriteria.Remove(itemToDelete);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Context.SaveChanges();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
Context.Entry(itemToDelete).State = EntityState.Unchanged;
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
|
OnAfterCoreRuleCriterionDeleted(itemToDelete);
|
||||||
|
|
||||||
|
return itemToDelete;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -5,5 +5,15 @@
|
|||||||
"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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -5,5 +5,15 @@
|
|||||||
"Microsoft.AspNetCore": "Warning"
|
"Microsoft.AspNetCore": "Warning"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"AllowedHosts": "*"
|
"AllowedHosts": "*",
|
||||||
|
"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
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user