PCRB webassembly
This commit is contained in:
@ -2,7 +2,7 @@
|
||||
|
||||
<MudDialog>
|
||||
<DialogContent>
|
||||
<MudPaper Class="p-2">
|
||||
<MudPaper Class="m-2 p-2">
|
||||
<MudForm @bind-Errors="@errors">
|
||||
<MudTextField T="string"
|
||||
Label="Comments"
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
<MudDialog>
|
||||
<DialogContent>
|
||||
<MudPaper Class="p-2">
|
||||
<MudPaper Class="m-2 p-2">
|
||||
<MudForm @bind-Errors="@errors">
|
||||
<MudTextField T="string"
|
||||
Label="Comments"
|
||||
|
@ -4,10 +4,11 @@
|
||||
|
||||
<MudDialog>
|
||||
<DialogContent>
|
||||
<MudPaper Class="p-2">
|
||||
<MudPaper Class="m-2 p-2">
|
||||
<MudForm @bind-Errors="@errors">
|
||||
<MudSelect T="string"
|
||||
Label="Action"
|
||||
Disabled="@(!string.IsNullOrWhiteSpace(mrbAction.Action))"
|
||||
Required="true"
|
||||
RequiredError="You must select an action!"
|
||||
@bind-Value="@mrbAction.Action"
|
||||
@ -19,29 +20,61 @@
|
||||
<MudSelectItem Value="@("Unblock")" />
|
||||
<MudSelectItem Value="@("Waiver")" />
|
||||
</MudSelect>
|
||||
@if (mrbAction.Action.Equals("Convert")) {
|
||||
<MudTextField @bind-Value="@mrbAction.ConvertFrom"
|
||||
Label="Convert From"
|
||||
@if (mrbAction.Action.Equals("Convert", StringComparison.InvariantCultureIgnoreCase)) {
|
||||
<MudSelect T="string"
|
||||
Label="Convert From Customer"
|
||||
Required
|
||||
Variant="Variant.Outlined"
|
||||
AnchorOrigin="Origin.BottomCenter"
|
||||
@bind-Value=convertFromCustomer
|
||||
Text="@convertFromCustomer">
|
||||
@foreach (string customer in customerNames) {
|
||||
<MudSelectItem Value="@(customer)" />
|
||||
}
|
||||
</MudSelect>
|
||||
<MudTextField @bind-Value="@convertFromPart"
|
||||
Label="Convert From Part Number"
|
||||
Required
|
||||
RequiredError="Conversion value required!"
|
||||
Text="@mrbAction.ConvertFrom" />
|
||||
<MudTextField @bind-Value="@mrbAction.ConvertTo"
|
||||
Label="Convert To"
|
||||
RequiredError="Part number required!"
|
||||
Text="@convertFromPart" />
|
||||
<MudSelect T="string"
|
||||
Label="Convert To Customer"
|
||||
Required
|
||||
Variant="Variant.Outlined"
|
||||
AnchorOrigin="Origin.BottomCenter"
|
||||
@bind-Value=convertToCustomer
|
||||
Text="@convertToCustomer">
|
||||
@foreach (string customer in customerNames) {
|
||||
<MudSelectItem Value="@(customer)" />
|
||||
}
|
||||
</MudSelect>
|
||||
<MudTextField @bind-Value="@convertToPart"
|
||||
Label="Convert To Part Number"
|
||||
Required
|
||||
RequiredError="Conversion value required!"
|
||||
Text="@mrbAction.ConvertTo" />
|
||||
RequiredError="Part number required!"
|
||||
Text="@convertToPart" />
|
||||
} else {
|
||||
<MudSelect T="string"
|
||||
Label="Affected Customer"
|
||||
Required
|
||||
Variant="Variant.Outlined"
|
||||
AnchorOrigin="Origin.BottomCenter"
|
||||
@bind-Value=mrbAction.Customer
|
||||
Text="@mrbAction.Customer">
|
||||
@foreach (string customer in customerNames) {
|
||||
<MudSelectItem Value="@(customer)" />
|
||||
}
|
||||
</MudSelect>
|
||||
<MudAutocomplete T="string"
|
||||
Label="Part Number"
|
||||
Variant="Variant.Outlined"
|
||||
AnchorOrigin="Origin.BottomCenter"
|
||||
@bind-Value=mrbAction.PartNumber
|
||||
Text="@mrbAction.PartNumber"
|
||||
SearchFunc="@PartNumberSearch"
|
||||
ResetValueOnEmptyText
|
||||
CoerceText />
|
||||
}
|
||||
<MudSelect T="string"
|
||||
Label="Affected Customer"
|
||||
Required
|
||||
Variant="Variant.Outlined"
|
||||
AnchorOrigin="Origin.BottomCenter"
|
||||
@bind-Value=mrbAction.Customer
|
||||
Text="@mrbAction.Customer">
|
||||
@foreach (string customer in customerNames) {
|
||||
<MudSelectItem Value="@(customer)" />
|
||||
}
|
||||
</MudSelect>
|
||||
<MudTextField T="int"
|
||||
InputType="@InputType.Number"
|
||||
Label="Qty"
|
||||
@ -49,15 +82,6 @@
|
||||
RequiredError="You must supply a quantity!"
|
||||
@bind-Value=mrbAction.Quantity
|
||||
Text="@mrbAction.Quantity.ToString()" />
|
||||
<MudAutocomplete T="string"
|
||||
Label="Part Number"
|
||||
Variant="Variant.Outlined"
|
||||
AnchorOrigin="Origin.BottomCenter"
|
||||
@bind-Value=mrbAction.PartNumber
|
||||
Text="@mrbAction.PartNumber"
|
||||
SearchFunc="@PartNumberSearch"
|
||||
ResetValueOnEmptyText
|
||||
CoerceText />
|
||||
<MudAutocomplete T="string"
|
||||
Label="Batch Number / Lot Number"
|
||||
Variant="Variant.Outlined"
|
||||
@ -130,6 +154,11 @@
|
||||
|
||||
private IEnumerable<string> customerNames = new List<string>();
|
||||
|
||||
private string convertFromCustomer = string.Empty;
|
||||
private string convertFromPart = string.Empty;
|
||||
private string convertToCustomer = string.Empty;
|
||||
private string convertToPart = string.Empty;
|
||||
|
||||
private bool isVisible { get; set; }
|
||||
private string[] errors = { };
|
||||
private bool processingSave = false;
|
||||
@ -145,10 +174,34 @@
|
||||
actions = (await mrbService.GetMRBActionsForMRB(mrbAction.MRBNumber, false)).OrderByDescending(a => a.ActionID);
|
||||
|
||||
if (actions is not null && actions.Count() > 0) {
|
||||
if (string.IsNullOrWhiteSpace(mrbAction.Action))
|
||||
mrbAction.Action = actions.First().Action;
|
||||
if (string.IsNullOrWhiteSpace(mrbAction.Customer))
|
||||
mrbAction.Customer = actions.First().Customer;
|
||||
if (string.IsNullOrWhiteSpace(mrbAction.LotNumber))
|
||||
mrbAction.LotNumber = actions.First().LotNumber;
|
||||
if (string.IsNullOrWhiteSpace(mrbAction.PartNumber))
|
||||
mrbAction.PartNumber = actions.First().PartNumber;
|
||||
if (string.IsNullOrWhiteSpace(mrbAction.Justification))
|
||||
mrbAction.Justification = actions.First().Justification;
|
||||
if (mrbAction.Quantity == 0)
|
||||
mrbAction.Quantity = actions.First().Quantity;
|
||||
|
||||
if (mrbAction.Action.Equals("Convert", StringComparison.InvariantCultureIgnoreCase)) {
|
||||
string[] convertFrom = actions.First().ConvertFrom.Split(" ");
|
||||
if (convertFrom.Length > 1) {
|
||||
convertFromCustomer = convertFrom[0];
|
||||
foreach (string partStr in convertFrom.Skip(1))
|
||||
convertFromPart += partStr;
|
||||
}
|
||||
|
||||
string[] convertTo = actions.First().ConvertTo.Split(" ");
|
||||
if (convertTo.Length > 1) {
|
||||
convertToCustomer = convertTo[0];
|
||||
foreach (string partStr in convertTo.Skip(1))
|
||||
convertToPart += partStr;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -165,9 +218,17 @@
|
||||
actionIsValid = actionIsValid && !string.IsNullOrWhiteSpace(mrbAction.Customer) &&
|
||||
!string.IsNullOrWhiteSpace(mrbAction.PartNumber) &&
|
||||
!string.IsNullOrWhiteSpace(mrbAction.LotNumber);
|
||||
actionIsValid = actionIsValid && mrbAction.Quantity > 0;
|
||||
|
||||
if (mrbAction.Action.Equals("Scrap"))
|
||||
return actionIsValid && !string.IsNullOrWhiteSpace(mrbAction.Justification);
|
||||
if (mrbAction.Action.Equals("Convert", StringComparison.InvariantCultureIgnoreCase)) {
|
||||
actionIsValid = actionIsValid && !string.IsNullOrWhiteSpace(convertFromCustomer) &&
|
||||
!string.IsNullOrWhiteSpace(convertFromPart) &&
|
||||
!string.IsNullOrWhiteSpace(convertToCustomer) &&
|
||||
!string.IsNullOrWhiteSpace(convertToPart);
|
||||
}
|
||||
|
||||
if (mrbAction.Action.Equals("Scrap", StringComparison.InvariantCultureIgnoreCase))
|
||||
actionIsValid = actionIsValid && !string.IsNullOrWhiteSpace(mrbAction.Justification);
|
||||
|
||||
return actionIsValid;
|
||||
}
|
||||
@ -177,6 +238,11 @@
|
||||
try {
|
||||
if (!FormIsValid()) throw new Exception("You must complete the form before saving!");
|
||||
|
||||
if (mrbAction.Action.Equals("Convert", StringComparison.InvariantCultureIgnoreCase)) {
|
||||
mrbAction.ConvertFrom = $"{convertFromCustomer} {convertFromPart}";
|
||||
mrbAction.ConvertTo = $"{convertToCustomer} {convertToPart}";
|
||||
}
|
||||
|
||||
if (mrbAction.MRBNumber > 0) {
|
||||
if (mrbAction.ActionID <= 0) {
|
||||
await mrbService.CreateMRBAction(mrbAction);
|
||||
|
@ -5,7 +5,7 @@
|
||||
<MudDialog>
|
||||
<DialogContent>
|
||||
@if (availableApprovers is not null) {
|
||||
<MudPaper Class="p-2">
|
||||
<MudPaper Class="m-2 p-2">
|
||||
<MudSelect T="User"
|
||||
Label="Select a User"
|
||||
Required
|
||||
|
151
MesaFabApproval.Client/Pages/Components/PCR3DocumentForm.razor
Normal file
151
MesaFabApproval.Client/Pages/Components/PCR3DocumentForm.razor
Normal file
@ -0,0 +1,151 @@
|
||||
@inject MesaFabApprovalAuthStateProvider authStateProvider
|
||||
@inject NavigationManager navigationManager
|
||||
@inject IPCRBService pcrbService
|
||||
@inject IUserService userService
|
||||
@inject IECNService ecnService
|
||||
@inject ISnackbar snackbar
|
||||
|
||||
<MudDialog>
|
||||
<DialogContent>
|
||||
<MudPaper Class="m-2 p-2">
|
||||
<MudForm @bind-Errors="@errors">
|
||||
<MudTextField T="string"
|
||||
Label="Document Type"
|
||||
@bind-Value="@document.DocType"
|
||||
@bind-Text="@document.DocType"
|
||||
Disabled
|
||||
AutoGrow />
|
||||
<MudTextField Label="Document Numbers - Rev. & Title"
|
||||
@bind-Value="@document.DocNumbers"
|
||||
@bind-Text="@document.DocNumbers"
|
||||
Immediate
|
||||
AutoGrow
|
||||
AutoFocus />
|
||||
@if (DocNumberIsNA()) {
|
||||
<MudTextField Label="Comments"
|
||||
@bind-Value="@document.Comment"
|
||||
@bind-Text="@document.Comment"
|
||||
Required
|
||||
RequiredError="You must provide a comment"
|
||||
Immediate
|
||||
AutoGrow />
|
||||
} else {
|
||||
<MudTextField @bind-Value="@document.ECNNumber"
|
||||
Required
|
||||
RequiredError="You must provide a valid ECN#"
|
||||
Clearable
|
||||
Variant="Variant.Outlined"
|
||||
InputType="@InputType.Number"
|
||||
Validation="@(new Func<int, Task<string>>(ECNNoIsValid))"
|
||||
Label="ECN#"
|
||||
Immediate
|
||||
AutoGrow />
|
||||
}
|
||||
<MudCheckBox Label="Complete"
|
||||
Color="Color.Tertiary"
|
||||
@bind-Value=complete
|
||||
LabelPosition="LabelPosition.Start" />
|
||||
</MudForm>
|
||||
</MudPaper>
|
||||
</DialogContent>
|
||||
<DialogActions>
|
||||
@if ((DocNumberIsNA() && !string.IsNullOrWhiteSpace(document.Comment)) ||
|
||||
(!DocNumberIsNA() && ecnNoIsValid)) {
|
||||
<MudButton Variant="Variant.Filled"
|
||||
Color="Color.Tertiary"
|
||||
Class="m1-auto"
|
||||
OnClick=Save>
|
||||
@if (saveInProcess) {
|
||||
<MudProgressCircular Class="m-1" Size="Size.Small" Indeterminate="true" />
|
||||
<MudText>Processing</MudText>
|
||||
} else {
|
||||
<MudText>Save</MudText>
|
||||
}
|
||||
</MudButton>
|
||||
}
|
||||
<MudButton Variant="Variant.Filled"
|
||||
Class="grey text-black m1-auto"
|
||||
OnClick=Cancel>
|
||||
Cancel
|
||||
</MudButton>
|
||||
</DialogActions>
|
||||
</MudDialog>
|
||||
|
||||
@code {
|
||||
[CascadingParameter]
|
||||
MudDialogInstance MudDialog { get; set; }
|
||||
|
||||
[Parameter]
|
||||
public required PCR3Document document { get; set; }
|
||||
|
||||
private string[] errors = { };
|
||||
|
||||
private bool complete = false;
|
||||
|
||||
private bool saveInProcess = false;
|
||||
|
||||
private bool ecnNoIsValid = true;
|
||||
|
||||
protected override async Task OnParametersSetAsync() {
|
||||
complete = document.CompletedByID > 0;
|
||||
}
|
||||
|
||||
private async Task Save() {
|
||||
saveInProcess = true;
|
||||
try {
|
||||
if (authStateProvider.CurrentUser is null) {
|
||||
await authStateProvider.Logout();
|
||||
navigationManager.NavigateTo("login");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!complete) {
|
||||
document.CompletedByID = 0;
|
||||
document.CompletedBy = null;
|
||||
document.CompletedDate = DateTimeUtilities.MAX_DT;
|
||||
}
|
||||
|
||||
if (complete && document.CompletedByID <= 0) {
|
||||
document.CompletedByID = authStateProvider.CurrentUser.UserID;
|
||||
document.CompletedBy = authStateProvider.CurrentUser;
|
||||
document.CompletedDate = DateTime.Now;
|
||||
}
|
||||
|
||||
if (!DocNumberIsNA() && !ecnNoIsValid)
|
||||
throw new Exception($"{document.ECNNumber} is not a valid ECN#");
|
||||
if (DocNumberIsNA() && string.IsNullOrWhiteSpace(document.Comment))
|
||||
throw new Exception("you must provide a comment");
|
||||
|
||||
await pcrbService.UpdatePCR3Document(document);
|
||||
|
||||
await pcrbService.GetPCR3DocumentsForPlanNumber(document.PlanNumber, true);
|
||||
|
||||
saveInProcess = false;
|
||||
|
||||
MudDialog.Close(DialogResult.Ok(document));
|
||||
} catch (Exception ex) {
|
||||
saveInProcess = false;
|
||||
snackbar.Add($"Unable to save document, because {ex.Message}", Severity.Error);
|
||||
}
|
||||
}
|
||||
|
||||
private void Cancel() {
|
||||
MudDialog.Close(DialogResult.Cancel());
|
||||
}
|
||||
|
||||
private bool DocNumberIsNA() {
|
||||
if (document.DocNumbers.ToLower().Equals("na") ||
|
||||
document.DocNumbers.ToLower().Equals("n/a")) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private async Task<string> ECNNoIsValid(int ecnNumber) {
|
||||
string? result = await ecnService.ECNNumberIsValidStr(ecnNumber);
|
||||
if (result is null) ecnNoIsValid = true;
|
||||
else ecnNoIsValid = false;
|
||||
StateHasChanged();
|
||||
return result;
|
||||
}
|
||||
}
|
201
MesaFabApproval.Client/Pages/Components/PCRBActionItemForm.razor
Normal file
201
MesaFabApproval.Client/Pages/Components/PCRBActionItemForm.razor
Normal file
@ -0,0 +1,201 @@
|
||||
@inject MesaFabApprovalAuthStateProvider authStateProvider
|
||||
@inject NavigationManager navigationManager
|
||||
@inject IPCRBService pcrbService
|
||||
@inject IUserService userService
|
||||
@inject ISnackbar snackbar
|
||||
|
||||
<MudDialog>
|
||||
<DialogContent>
|
||||
<MudPaper Class="m-2 p-2">
|
||||
<MudForm @bind-Errors="@errors">
|
||||
<MudTextField T="string"
|
||||
Label="Action"
|
||||
Required
|
||||
RequiredError="Enter action item"
|
||||
@bind-Value="@name"
|
||||
@bind-Text="@name"
|
||||
Immediate
|
||||
Clearable
|
||||
AutoGrow
|
||||
AutoFocus />
|
||||
<MudCheckBox Label="Gating"
|
||||
Color="Color.Tertiary"
|
||||
@bind-Value=gating
|
||||
LabelPosition="LabelPosition.Start" />
|
||||
<MudCheckBox Label="Closed"
|
||||
Color="Color.Tertiary"
|
||||
@bind-Value="@closedStatus"
|
||||
LabelPosition="LabelPosition.Start" />
|
||||
@if (closedStatus) {
|
||||
<MudDatePicker Label="Closed Date"
|
||||
Color="Color.Tertiary"
|
||||
@bind-Date="@closedDate"
|
||||
Clearable
|
||||
MinDate="@DateTimeUtilities.MIN_DT"
|
||||
MaxDate="@DateTimeUtilities.MAX_DT"
|
||||
Placeholder="Select a closed date" />
|
||||
}
|
||||
<MudSelect T="User"
|
||||
Label="Responsible Person"
|
||||
Variant="Variant.Outlined"
|
||||
Required
|
||||
RequiredError="You must select a responsible person"
|
||||
Clearable
|
||||
AnchorOrigin="Origin.BottomCenter"
|
||||
ToStringFunc="@UserToNameConverter"
|
||||
@bind-Value=@responsiblePerson>
|
||||
@foreach (User user in allActiveUsers.OrderBy(u => u.FirstName)) {
|
||||
<MudSelectItem T="User" Value="@(user)" />
|
||||
}
|
||||
</MudSelect>
|
||||
</MudForm>
|
||||
</MudPaper>
|
||||
</DialogContent>
|
||||
<DialogActions>
|
||||
<MudButton Variant="Variant.Filled"
|
||||
Color="Color.Tertiary"
|
||||
Class="m1-auto"
|
||||
OnClick=Save>
|
||||
@if (saveActionItemInProcess) {
|
||||
<MudProgressCircular Class="m-1" Size="Size.Small" Indeterminate="true" />
|
||||
<MudText>Processing</MudText>
|
||||
} else {
|
||||
<MudText>Submit</MudText>
|
||||
}
|
||||
</MudButton>
|
||||
<MudButton Variant="Variant.Filled"
|
||||
Class="grey text-black m1-auto"
|
||||
OnClick=Cancel>
|
||||
Cancel
|
||||
</MudButton>
|
||||
</DialogActions>
|
||||
</MudDialog>
|
||||
|
||||
@code {
|
||||
[CascadingParameter]
|
||||
MudDialogInstance MudDialog { get; set; }
|
||||
|
||||
[Parameter]
|
||||
public int planNumber { get; set; } = 0;
|
||||
|
||||
[Parameter]
|
||||
public int step { get; set; } = 0;
|
||||
|
||||
[Parameter]
|
||||
public PCRBActionItem? actionItem { get; set; } = null;
|
||||
|
||||
[Parameter]
|
||||
public IEnumerable<User> allActiveUsers { get; set; }
|
||||
|
||||
private string[] errors = { };
|
||||
|
||||
private string name = "";
|
||||
private bool gating = false;
|
||||
private DateTime? closedDate = DateTimeUtilities.MAX_DT;
|
||||
private bool closedStatus = false;
|
||||
private User? responsiblePerson = null;
|
||||
|
||||
private bool saveActionItemInProcess = false;
|
||||
|
||||
protected override async Task OnParametersSetAsync() {
|
||||
if (authStateProvider.CurrentUser is null) {
|
||||
await authStateProvider.Logout();
|
||||
navigationManager.NavigateTo("login");
|
||||
}
|
||||
|
||||
if (planNumber <= 0) {
|
||||
snackbar.Add($"{planNumber} is not a valid PCRB plan#", Severity.Error);
|
||||
MudDialog.Close(DialogResult.Cancel());
|
||||
}
|
||||
|
||||
if (allActiveUsers is null || allActiveUsers.Count() <= 0)
|
||||
allActiveUsers = await userService.GetAllActiveUsers();
|
||||
|
||||
if (actionItem is not null) {
|
||||
name = actionItem.Name;
|
||||
gating = actionItem.Gating;
|
||||
closedStatus = actionItem.ClosedStatus;
|
||||
closedDate = actionItem.ClosedDate;
|
||||
if (closedDate.Equals(DateTimeUtilities.MAX_DT)) {
|
||||
closedDate = DateTime.Now;
|
||||
}
|
||||
if (actionItem.ResponsiblePersonID > 0) {
|
||||
if (actionItem.ResponsiblePerson is not null) responsiblePerson = actionItem.ResponsiblePerson;
|
||||
else responsiblePerson = await userService.GetUserByUserId(actionItem.ResponsiblePersonID);
|
||||
actionItem.ResponsiblePerson = responsiblePerson;
|
||||
}
|
||||
} else {
|
||||
name = "";
|
||||
gating = false;
|
||||
closedStatus = false;
|
||||
closedDate = DateTime.Now;
|
||||
responsiblePerson = null;
|
||||
}
|
||||
}
|
||||
|
||||
private async Task Save() {
|
||||
saveActionItemInProcess = true;
|
||||
try {
|
||||
if (authStateProvider.CurrentUser is null) {
|
||||
await authStateProvider.Logout();
|
||||
navigationManager.NavigateTo("login");
|
||||
}
|
||||
|
||||
if (string.IsNullOrWhiteSpace(name)) throw new Exception("name missing");
|
||||
|
||||
if (actionItem is null) {
|
||||
actionItem = new() {
|
||||
Name = name,
|
||||
UploadedBy = authStateProvider.CurrentUser,
|
||||
UploadedByID = authStateProvider.CurrentUser.UserID,
|
||||
PlanNumber = planNumber,
|
||||
Step = step,
|
||||
Gating = gating,
|
||||
ClosedStatus = closedStatus,
|
||||
ResponsiblePerson = responsiblePerson,
|
||||
ResponsiblePersonID = responsiblePerson.UserID,
|
||||
ClosedDate = closedDate,
|
||||
ClosedBy = closedDate is null || closedDate >= DateTimeUtilities.MAX_DT ? null : authStateProvider.CurrentUser,
|
||||
ClosedByID = closedStatus ? authStateProvider.CurrentUser.UserID : 0
|
||||
};
|
||||
|
||||
if (actionItem.ClosedStatus == false) {
|
||||
actionItem.ClosedDate = DateTimeUtilities.MAX_DT;
|
||||
}
|
||||
|
||||
await pcrbService.CreateNewActionItem(actionItem);
|
||||
} else {
|
||||
actionItem.Name = name;
|
||||
actionItem.Gating = gating;
|
||||
actionItem.ClosedStatus = closedStatus;
|
||||
actionItem.ClosedDate = closedDate;
|
||||
if (closedStatus) {
|
||||
actionItem.ClosedBy = authStateProvider.CurrentUser;
|
||||
actionItem.ClosedByID = authStateProvider.CurrentUser.UserID;
|
||||
} else {
|
||||
actionItem.ClosedDate = DateTimeUtilities.MAX_DT;
|
||||
}
|
||||
actionItem.ResponsiblePerson = responsiblePerson;
|
||||
if (responsiblePerson is not null)
|
||||
actionItem.ResponsiblePersonID = responsiblePerson.UserID;
|
||||
|
||||
await pcrbService.UpdateActionItem(actionItem);
|
||||
}
|
||||
|
||||
saveActionItemInProcess = false;
|
||||
|
||||
MudDialog.Close(DialogResult.Ok(actionItem));
|
||||
} catch (Exception ex) {
|
||||
saveActionItemInProcess = false;
|
||||
snackbar.Add($"Unable to save action item, because {ex.Message}", Severity.Error);
|
||||
}
|
||||
}
|
||||
|
||||
private void Cancel() {
|
||||
MudDialog.Close(DialogResult.Cancel());
|
||||
}
|
||||
|
||||
private Func<User, string> UserToNameConverter = u => u is null ? string.Empty : u.GetFullName();
|
||||
|
||||
private Func<PCRBAttachment, string> AttachmentToFileNameConverter = a => a is null ? "" : a.FileName;
|
||||
}
|
250
MesaFabApproval.Client/Pages/Components/PCRBApproverForm.razor
Normal file
250
MesaFabApproval.Client/Pages/Components/PCRBApproverForm.razor
Normal file
@ -0,0 +1,250 @@
|
||||
@inject MesaFabApprovalAuthStateProvider authStateProvider
|
||||
@inject NavigationManager navigationManager
|
||||
@inject IPCRBService pcrbService
|
||||
@inject IUserService userService
|
||||
@inject IApprovalService approvalService
|
||||
@inject ISnackbar snackbar
|
||||
|
||||
<MudDialog>
|
||||
<DialogContent>
|
||||
<MudPaper Class="m-2 p-2">
|
||||
<MudForm @bind-Errors="@errors">
|
||||
<MudSelect T="string"
|
||||
Label="Job Title"
|
||||
Required
|
||||
RequiredError="You must provide a job title"
|
||||
ValueChanged="@SelectedJobTitleChanged"
|
||||
@bind-Text="@selectedJobTitle"
|
||||
Immediate
|
||||
Disabled="@(approval is not null && !string.IsNullOrWhiteSpace(selectedJobTitle))"
|
||||
Clearable
|
||||
AutoFocus >
|
||||
@foreach (string jt in availableJobTitles) {
|
||||
<MudSelectItem Value="@jt">@jt</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
<MudSelect T="User"
|
||||
Label="Select a User"
|
||||
Required
|
||||
Clearable
|
||||
Disabled="@(string.IsNullOrWhiteSpace(selectedJobTitle))"
|
||||
Variant="Variant.Outlined"
|
||||
AnchorOrigin="Origin.BottomCenter"
|
||||
@bind-Value=selectedUser
|
||||
ToStringFunc="@UserToNameConverter">
|
||||
@foreach (User user in availableUsers) {
|
||||
<MudSelectItem Value="@user">@user.GetFullName()</MudSelectItem>
|
||||
}
|
||||
</MudSelect>
|
||||
</MudForm>
|
||||
</MudPaper>
|
||||
</DialogContent>
|
||||
<DialogActions>
|
||||
<MudButton Variant="Variant.Filled"
|
||||
Color="Color.Tertiary"
|
||||
Class="m1-auto"
|
||||
OnClick=Save>
|
||||
@if (saveAttendeeInProcess) {
|
||||
<MudProgressCircular Class="m-1" Size="Size.Small" Indeterminate="true" />
|
||||
<MudText>Processing</MudText>
|
||||
} else {
|
||||
<MudText>Submit</MudText>
|
||||
}
|
||||
</MudButton>
|
||||
<MudButton Variant="Variant.Filled"
|
||||
Class="grey text-black m1-auto"
|
||||
OnClick=Cancel>
|
||||
Cancel
|
||||
</MudButton>
|
||||
</DialogActions>
|
||||
</MudDialog>
|
||||
|
||||
@code {
|
||||
[CascadingParameter]
|
||||
MudDialogInstance MudDialog { get; set; }
|
||||
|
||||
[Parameter]
|
||||
public int planNumber { get; set; } = 0;
|
||||
|
||||
[Parameter]
|
||||
public int step { get; set; } = 0;
|
||||
|
||||
[Parameter]
|
||||
public Approval? approval { get; set; } = null;
|
||||
|
||||
private HashSet<string> availableJobTitles = new();
|
||||
|
||||
private Dictionary<string, SubRole> jobTitleToSubRoleMap = new();
|
||||
|
||||
private Dictionary<string, IEnumerable<User>> jobTitleToAvailableUsersMap = new();
|
||||
|
||||
private HashSet<User> availableUsers = new();
|
||||
|
||||
private string[] errors = { };
|
||||
|
||||
private string selectedJobTitle = "";
|
||||
private User? selectedUser = null;
|
||||
|
||||
private bool saveAttendeeInProcess = false;
|
||||
|
||||
protected override async Task OnParametersSetAsync() {
|
||||
if (authStateProvider.CurrentUser is null) {
|
||||
await authStateProvider.Logout();
|
||||
navigationManager.NavigateTo("login");
|
||||
}
|
||||
|
||||
if (planNumber <= 0) {
|
||||
snackbar.Add($"{planNumber} is not a valid PCRB plan#", Severity.Error);
|
||||
MudDialog.Close(DialogResult.Cancel());
|
||||
}
|
||||
|
||||
await GetAttendees();
|
||||
|
||||
if (approval is not null) {
|
||||
selectedJobTitle = approval.RoleName;
|
||||
if (approval.UserID > 0) {
|
||||
if (approval.User is not null) {
|
||||
selectedUser = approval.User;
|
||||
} else {
|
||||
selectedUser = await userService.GetUserByUserId(approval.UserID);
|
||||
approval.User = selectedUser;
|
||||
}
|
||||
}
|
||||
|
||||
SelectedJobTitleChanged(selectedJobTitle);
|
||||
} else {
|
||||
selectedJobTitle = "";
|
||||
selectedUser = null;
|
||||
}
|
||||
}
|
||||
|
||||
private async Task Save() {
|
||||
saveAttendeeInProcess = true;
|
||||
try {
|
||||
if (authStateProvider.CurrentUser is null) {
|
||||
await authStateProvider.Logout();
|
||||
navigationManager.NavigateTo("login");
|
||||
}
|
||||
|
||||
if (string.IsNullOrWhiteSpace(selectedJobTitle)) throw new Exception("job title missing");
|
||||
if (selectedUser is null) throw new Exception("attendee not selected");
|
||||
|
||||
PCRB pcrb = await pcrbService.GetPCRBByPlanNumber(planNumber, false);
|
||||
|
||||
if (approval is null) {
|
||||
jobTitleToSubRoleMap.TryGetValue($"{selectedJobTitle}{selectedUser.UserID}", out SubRole? subRole);
|
||||
|
||||
if (subRole is null) throw new Exception($"no approval role found for job title {selectedJobTitle}");
|
||||
|
||||
approval = new() {
|
||||
RoleName = subRole.SubRoleCategoryItem,
|
||||
SubRole = subRole.SubRoleName,
|
||||
SubRoleID = subRole.SubRoleID,
|
||||
IssueID = planNumber,
|
||||
Step = step,
|
||||
User = selectedUser,
|
||||
UserID = selectedUser.UserID,
|
||||
AssignedDate = DateTimeUtilities.MIN_DT
|
||||
};
|
||||
|
||||
await approvalService.CreateApproval(approval);
|
||||
} else {
|
||||
int originalUserId = approval.UserID;
|
||||
|
||||
approval.UserID = selectedUser.UserID;
|
||||
approval.User = selectedUser;
|
||||
|
||||
if (originalUserId != approval.UserID) {
|
||||
if (approval.AssignedDate > DateTimeUtilities.MIN_DT)
|
||||
approval.AssignedDate = DateTime.Now;
|
||||
approval.NotifyDate = DateTimeUtilities.MIN_DT;
|
||||
}
|
||||
|
||||
await approvalService.UpdateApproval(approval);
|
||||
|
||||
if (originalUserId != approval.UserID)
|
||||
await pcrbService.NotifyNewApprovals(pcrb);
|
||||
}
|
||||
|
||||
saveAttendeeInProcess = false;
|
||||
|
||||
MudDialog.Close(DialogResult.Ok(approval));
|
||||
} catch (Exception ex) {
|
||||
saveAttendeeInProcess = false;
|
||||
snackbar.Add($"Unable to save attendee, because {ex.Message}", Severity.Error);
|
||||
}
|
||||
}
|
||||
|
||||
private void Cancel() {
|
||||
MudDialog.Close(DialogResult.Cancel());
|
||||
}
|
||||
|
||||
private Func<User, string> UserToNameConverter = u => u is null ? string.Empty : u.GetFullName();
|
||||
|
||||
private async Task GetAttendees() {
|
||||
int roleId = await approvalService.GetRoleIdForRoleName("Module Manager");
|
||||
|
||||
if (roleId <= 0) throw new Exception($"could not find Director role ID");
|
||||
|
||||
availableJobTitles.Clear();
|
||||
jobTitleToAvailableUsersMap.Clear();
|
||||
jobTitleToSubRoleMap.Clear();
|
||||
|
||||
IEnumerable<SubRole> subRoles = await approvalService.GetSubRolesForSubRoleName("MMSubRole", roleId);
|
||||
|
||||
HashSet<string> defaultSubRoleCategoryItems = new() { "Si Production", "Si Engineering", "Quality" };
|
||||
HashSet<string> unusedSubRoleCategoryItems = new() { "GaN Engineering", "GaN Operations", "Integration" };
|
||||
foreach (SubRole subRole in subRoles) {
|
||||
if (approval is null) {
|
||||
if (!defaultSubRoleCategoryItems.Contains(subRole.SubRoleCategoryItem) &&
|
||||
!unusedSubRoleCategoryItems.Contains(subRole.SubRoleCategoryItem)) {
|
||||
availableJobTitles.Add(subRole.SubRoleCategoryItem);
|
||||
|
||||
IEnumerable<User> subRoleMembers = await approvalService.GetApprovalGroupMembers(subRole.SubRoleID);
|
||||
|
||||
jobTitleToAvailableUsersMap.Add(subRole.SubRoleCategoryItem, subRoleMembers);
|
||||
|
||||
foreach (User member in subRoleMembers) {
|
||||
jobTitleToSubRoleMap.Add($"{subRole.SubRoleCategoryItem}{member.UserID}", subRole);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (!unusedSubRoleCategoryItems.Contains(subRole.SubRoleCategoryItem)) {
|
||||
IEnumerable<User> subRoleMembers = await approvalService.GetApprovalGroupMembers(subRole.SubRoleID);
|
||||
|
||||
jobTitleToAvailableUsersMap.Add(subRole.SubRoleCategoryItem, subRoleMembers);
|
||||
|
||||
foreach (User member in subRoleMembers)
|
||||
availableUsers.Add(member);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void SelectedJobTitleChanged(string jobTitle) {
|
||||
selectedJobTitle = jobTitle;
|
||||
|
||||
selectedUser = null;
|
||||
|
||||
availableUsers.Clear();
|
||||
|
||||
if (approval is null) {
|
||||
if (jobTitleToAvailableUsersMap.TryGetValue(jobTitle, out IEnumerable<User>? jobTitleMembers)) {
|
||||
if (jobTitleMembers is not null) {
|
||||
foreach (User member in jobTitleMembers)
|
||||
availableUsers.Add(member);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
foreach (IEnumerable<User> memberList in jobTitleToAvailableUsersMap.Values) {
|
||||
if (memberList is not null) {
|
||||
foreach(User member in memberList) {
|
||||
availableUsers.Add(member);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
140
MesaFabApproval.Client/Pages/Components/PCRBAttachmentForm.razor
Normal file
140
MesaFabApproval.Client/Pages/Components/PCRBAttachmentForm.razor
Normal file
@ -0,0 +1,140 @@
|
||||
@inject MesaFabApprovalAuthStateProvider authStateProvider
|
||||
@inject NavigationManager navigationManager
|
||||
@inject IPCRBService pcrbService
|
||||
@inject ISnackbar snackbar
|
||||
|
||||
<MudDialog>
|
||||
<DialogContent>
|
||||
<MudPaper Class="m-2 p-2">
|
||||
<MudForm @bind-Errors="@errors">
|
||||
<MudTextField T="string"
|
||||
Label="File Name"
|
||||
Disabled
|
||||
Immediate
|
||||
@bind-Value="@fileName"
|
||||
@bind-Text="@fileName"
|
||||
AutoGrow />
|
||||
<MudFileUpload T="IBrowserFile"
|
||||
FilesChanged="AddFile"
|
||||
Required
|
||||
Disabled="@(!string.IsNullOrWhiteSpace(fileName))"
|
||||
RequiredError="You must select a file">
|
||||
<ActivatorContent>
|
||||
<MudButton Variant="Variant.Filled"
|
||||
Color="Color.Tertiary"
|
||||
style="margin: auto;"
|
||||
StartIcon="@Icons.Material.Filled.AttachFile">
|
||||
@if (addFileInProcess) {
|
||||
<MudProgressCircular Class="m-1" Size="Size.Small" Indeterminate="true" />
|
||||
<MudText>Processing</MudText>
|
||||
} else {
|
||||
<MudText>Add File</MudText>
|
||||
}
|
||||
</MudButton>
|
||||
</ActivatorContent>
|
||||
</MudFileUpload>
|
||||
</MudForm>
|
||||
</MudPaper>
|
||||
</DialogContent>
|
||||
<DialogActions>
|
||||
<MudButton Variant="Variant.Filled"
|
||||
Color="Color.Tertiary"
|
||||
Class="m1-auto"
|
||||
OnClick=Submit>
|
||||
@if (processing) {
|
||||
<MudProgressCircular Class="m-1" Size="Size.Small" Indeterminate="true" />
|
||||
<MudText>Processing</MudText>
|
||||
}
|
||||
else {
|
||||
<MudText>Submit</MudText>
|
||||
}
|
||||
</MudButton>
|
||||
<MudButton Variant="Variant.Filled"
|
||||
Class="grey text-black m1-auto"
|
||||
OnClick=Cancel>
|
||||
Cancel
|
||||
</MudButton>
|
||||
</DialogActions>
|
||||
</MudDialog>
|
||||
|
||||
@code {
|
||||
[CascadingParameter] MudDialogInstance MudDialog { get; set; }
|
||||
|
||||
[Parameter]
|
||||
public int planNumber { get; set; } = 0;
|
||||
|
||||
[Parameter]
|
||||
public int step { get; set; } = 0;
|
||||
|
||||
private string[] errors = { };
|
||||
|
||||
private string fileName = "";
|
||||
|
||||
private IBrowserFile? file = null;
|
||||
|
||||
private bool addFileInProcess = false;
|
||||
private bool processing = false;
|
||||
|
||||
protected override async Task OnParametersSetAsync() {
|
||||
if (planNumber <= 0) {
|
||||
snackbar.Add($"{planNumber} is not a valid PCRB plan#", Severity.Error);
|
||||
MudDialog.Close(DialogResult.Cancel());
|
||||
}
|
||||
|
||||
if (step <= 0) {
|
||||
snackbar.Add($"{step} is not a valid PCRB stage#", Severity.Error);
|
||||
MudDialog.Close(DialogResult.Cancel());
|
||||
}
|
||||
|
||||
if (authStateProvider.CurrentUser is null) {
|
||||
await authStateProvider.Logout();
|
||||
navigationManager.NavigateTo("login");
|
||||
}
|
||||
}
|
||||
|
||||
private void AddFile(IBrowserFile newFile) {
|
||||
addFileInProcess = true;
|
||||
file = newFile;
|
||||
fileName = newFile.Name;
|
||||
addFileInProcess = false;
|
||||
}
|
||||
|
||||
private async Task Submit() {
|
||||
processing = true;
|
||||
try {
|
||||
if (authStateProvider.CurrentUser is null) {
|
||||
await authStateProvider.Logout();
|
||||
navigationManager.NavigateTo("login");
|
||||
return;
|
||||
}
|
||||
|
||||
if (string.IsNullOrWhiteSpace(fileName))
|
||||
throw new Exception("file name missing");
|
||||
|
||||
if (file is null)
|
||||
throw new Exception("file is missing");
|
||||
|
||||
PCRBAttachment attachment = new() {
|
||||
Step = step,
|
||||
UploadDateTime = DateTime.Now,
|
||||
UploadedByID = authStateProvider.CurrentUser.UserID,
|
||||
PlanNumber = planNumber,
|
||||
File = file,
|
||||
FileName = fileName
|
||||
};
|
||||
|
||||
await pcrbService.UploadAttachment(attachment);
|
||||
|
||||
processing = false;
|
||||
|
||||
MudDialog.Close(DialogResult.Ok(attachment));
|
||||
} catch (Exception ex) {
|
||||
snackbar.Add($"Unable to save document, because {ex.Message}", Severity.Error);
|
||||
processing = false;
|
||||
}
|
||||
}
|
||||
|
||||
private void Cancel() {
|
||||
MudDialog.Close(DialogResult.Cancel());
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user