di-sukharev / opencommit

Generate conventional git commit messages with AI in 1 second 🤯🔫
https://www.npmjs.com/package/opencommit
MIT License
5.9k stars 310 forks source link

[Bug]: Request failed error code 400 #120

Open Kevdome3000 opened 1 year ago

Kevdome3000 commented 1 year ago

Opencommit Version

1.1.48

Node Version

19.8.1

NPM Version

9.63

What OS are you seeing the problem on?

Mac

What happened?

used opencommit from cli with a small commit and worked perfectly. Followed up with a larger commit, and received error stating commit was too large. So I reduced the size of the commit and tried again, and received this error: Error: Request failed with status code 400

I've received the request failed error every commit since.

For what it's worth, aicommits exhibits the same behavior

Expected Behavior

I'd expect it to be able to recover from an error received from open ai when a prompt contains too many tokens

Current Behavior

get's stuck in request failed loop

Possible Solution

No response

Steps to Reproduce

No response

Relevant log output

No response

suryaelidanto commented 1 year ago

Same here, can anyone resolve it?

TaQuangKhoi commented 1 year ago

it happen when the files i staged is very big..

di-sukharev commented 1 year ago

could anyone pls share output of git diff?

kamushadenes commented 1 year ago

That's because the model context window is exceeded. Implementing https://github.com/di-sukharev/opencommit/issues/114 would fix this as well.

di-sukharev commented 1 year ago

@kamushadenes thanks bro! we already split large files into smaller commits, im not sure why the 400 is still happening, do you want to investigate and PR?

kamushadenes commented 1 year ago

Can you post the git diff output? It could be something more complex like binary files maybe?

crsepulv commented 1 year ago

I have a lot of not committed files and failed, I git commit as usual ...and following OC's commits worked, I think that too much commited files exhaust openai maximum input size for api messages.

github-actions[bot] commented 1 year ago

Stale issue message

AlanNevill commented 1 year ago

Request failed with status code 400.

{"model":"gpt-3.5-turbo","messages":[{"role":"system","content":"You are to act as the author of a commit message in git. Your mission is to create clean and comprehensive commit messages in the conventional commit convention and explain WHAT were the changes and WHY the changes were done. I'll send you an output of 'git diff --staged' command, and you convert it into a commit message.\nDo not preface the commit with anything.\nDon't add any descriptions to the commit, only commit message.\nUse the present tense. Lines must not be longer than 74 characters. Use english to answer."},{"role":"user","content":"diff --git a/src/server.ts b/src/server.ts\nindex ad4db42..f3b18a9 100644\n--- a/src/server.ts\n+++ b/src/server.ts\n@@ -10,7 +10,7 @@\nimport {\n initWinstonLogger();\n \n const app = express();\n -const port = 7799;\n +const PORT = 7799;\n \n app.use(express.json());\n \n@@ -34,6 +34,6 @@\napp.use((_, res, next) => {\n // ROUTES\n app.use(PROTECTED_ROUTER_URL, protectedRouter);\n \n -app.listen(port, () => {\n - console.log(Server listening on port ${port});\n +app.listen(process.env.PORT || PORT, () => {\n + console.log(Server listening on port ${PORT});\n });"},{"role":"assistant","content":"fix(server.ts): change port variable case from lowercase port to uppercase PORT to improve semantics\nfeat(server.ts): add support for process.env.PORT environment variable to be able to run app on a configurable port\n"},{"role":"user","content":"diff --git a/Pages/Tcat1sList.razor b/Pages/Tcat1sList.razor\nindex cc50ede..c9f8771 100644\n--- a/Pages/Tcat1sList.razor\n+++ b/Pages/Tcat1sList.razor\n@@ -4,9 +4,9 @@\n Tcat1sList\n Tcat1sList\n \n+@inject FinanceContext financeContext\n @inject TcatService tcatService\n @inject ToastService toastService\n-@inject IDbContextFactory DbFactory\n @inject NavigationManager navigationManager\n @inject IJSRuntime jsRuntime\n \n@@ -22,8 +22,8 @@ else\n <div class=\"row\">\n <div class=\"col-5\">\n <div class=\"e-statustext\">Main categories

\n- \n- <SfGrid DataSource=\"@tcat1s\" AllowPaging=\"false\" @ref=\"sfTcat1sGrid\" Toolbar=\"@(new List() { \"Add\", \"Edit\", \"Delete\", \"Cancel\", \"Update\" })\">\n+\n+ <SfGrid @ref=\"sfTcat1sGrid\" DataSource=\"@tcat1s\" AllowPaging=\"false\" Toolbar=\"@(new List() { \"Add\", \"Edit\", \"Delete\", \"Cancel\", \"Update\" })\">\n \n <GridEditSettings AllowEditing=\"true\" AllowDeleting=\"true\" AllowAdding=\"true\" NewRowPosition=\"NewRowPosition.Top\">\n <GridEvents RowSelected=\"Tcat1sRowSelecthandler\" OnActionComplete=\"Tcat1EditComplete\" TValue=\"Tcat1s\">\n@@ -45,7 +45,7 @@ else\n
\n <div class=\"col-6\">\n \n- <div class=\"e-statustext\">Sub categories for: @(aTcat1s is null ? \"Select a main category\" : aTcat1s.Tcat1Description)\n+ <div class=\"e-statustext\">Sub categories for: @(aTcat1s is null ? \"select a main category\" : aTcat1s.Tcat1Description)\n \n <SfGrid @ref=\"sfTcat2sGrid\" DataSource=\"@tcat2s\" AllowPaging=\"false\" Toolbar=\"@(new List() { \"Add\", \"Edit\", \"Delete\", \"Cancel\", \"Update\" })\">\n \n@@ -56,14 +56,14 @@ else\n <GridColumn Field=@nameof(Tcat2s.Tcat2) IsPrimaryKey=\"true\" Width=\"100\" HeaderText=\"Code\">\n <GridColumn Field=@nameof(Tcat2s.Tcat2Description) AutoFit=true HeaderText=\"Description\">\n \n- <GridForeignColumn Field=@nameof(Tcat2s.Tcat2Tcat1) HeaderText=\"Change main category\" ForeignKeyField=\"Tcat1\" ForeignKeyValue=\"Tcat1Description\" ForeignDataSource=\"@tcat1s\" Width=\"350\" EditType=\"EditType.DropDownEdit\">\n+ <GridForeignColumn Field=@nameof(Tcat2s.Tcat2Tcat1) HeaderText=\"Change main category\" ForeignKeyField=\"Tcat1\" ForeignKeyValue=\"Tcat1Description\" ForeignDataSource=\"@tcat1s\" Width=\"400\" EditType=\"EditType.DropDownEdit\">\n \n <SfDropDownList ID=\"Tcat1\" @bind-Value=\"@((context as Tcat2s)!.Tcat2Tcat1)\" TItem=\"Tcat1s\" TValue=\"string\" DataSource=\"@tcat1s\">\n <DropDownListFieldSettings Text=\"Tcat1Description\" Value=\"Tcat1\">\n \n <DropDownListTemplates TItem=\"Tcat1s\" Context=\"ddListTcat1s\">\n

\n- @((ddListTcat1s as Tcat1s).Tcat1Description)\n+ @((ddListTcat1s as Tcat1s).Tcat1CodeDesc)\n \n \n Description\n@@ -117,11 +117,6 @@ else\n SfGrid? sfTcat1sGrid;\n SfGrid? sfTcat2sGrid;\n \n- // [CascadingParameter] \n- // public IModalService? myModal { get; set; }\n-\n- //ModalOptions options = new ModalOptions() { Position = ModalPosition.Middle , HideCloseButton = true };\n-\n protected override async Task OnInitializedAsync()\n {\n await base.OnInitializedAsync();\n@@ -146,7 +141,7 @@ else\n \n // if there are sub categories for the selected main category, then display them\n if (Args.Data.Tcat2sCount > 0)\n- tcat2s = Args.Data.Tcat2s!.OrderBy(x => x.Tcat2).ToList();\n+ tcat2s = aTcat1s.Tcat2s!.OrderBy(x => x.Tcat2).ToList();\n else\n tcat2s = null;\n \n@@ -163,15 +158,15 @@ else\n \n public async void Tcat1EditComplete(ActionEventArgs args)\n {\n- #region deprecated null argument checks\n+ #region null argument checks\n if (args is null)\n {\n- Log.Error($\"Tcat1sList.Tcat1EditComplete - ActionEventArgs is NULL, SelectedTcat1Id: {SelectedTcat1Id}, selectedIndex: {tcat1sSelectedIndex}\");\n+ Log.Debug($\"Tcat1sList.Tcat1EditComplete - ActionEventArgs is NULL, just return\");\n return;\n }\n if (args.Data is null)\n {\n- Log.Error($\"Tcat1sList.Tcat1EditComplete - ActionEventArgs args.Data is NULL, SelectedTcat1Id: {SelectedTcat1Id}, selectedIndex: {tcat1sSelectedIndex}\");\n+ Log.Debug($\"Tcat1sList.Tcat1EditComplete - ActionEventArgs args.Data is NULL, SelectedTcat1Id: {SelectedTcat1Id}, selectedIndex: {tcat1sSelectedIndex}, just return\");\n return;\n }\n if (args.Data.Tcat1Description is null)\n@@ -181,81 +176,101 @@ else\n }\n #endregion\n \n- // no errors\n- Log.Debug($\"Tcat1sList.Tcat1EditComplete - args.Action: {args.Action}, Syncfusion.Blazor.Grids.Action.Save: {Syncfusion.Blazor.Grids.Action.Save}\");\n+ // there is a Tcat1s in args.Data, so continue\n+\n+ aTcat1s = args.Data; // the selected Tcat2s row\n+ Log.Debug($\"Tcat1sList.Tcat1EditComplete - Syncfusion.Blazor.Grids.Action.Save: [{Syncfusion.Blazor.Grids.Action.Save}], args.Action: [{args.Action}], args.DataTcat1CodeDesc: [{args.Data.Tcat1CodeDesc}], aTcat1s.Tcat1CodeDesc: [{aTcat1s.Tcat1CodeDesc}]\");\n \n // ADD aTcat1s\n if ((args.RequestType.Equals(Syncfusion.Blazor.Grids.Action.Save) && args.Action == \"Add\"))\n {\n- Log.Debug($\"Tcat1sList.Tcat1EditComplete.Add - {args.Data.Tcat1CodeDesc}, new Tcat1s Tcat2Description\");\n- await tcatService.Tcat1s_InsertAsync(args.Data);\n- toastService.ShowToast($\"{args.Data.Tcat1CodeDesc} was added\", ToastLevel.Success, 3000);\n+ tcat1s!.Add(aTcat1s); // ADD the new Tcat1s row to the list\n+ await tcatService.Tcat1s_InsertAsync(aTcat1s); // UPDATE the database\n+\n+ toastService.ShowToast($\"'{aTcat1s.Tcat1CodeDesc}' was added\", ToastLevel.Success, 3000);\n+ await sfTcat1sGrid!.Refresh();\n+ Log.Debug($\"Tcat1sList.Tcat1EditComplete.Add - [{aTcat1s.Tcat1CodeDesc}]\");\n }\n \n- // Update the edited Tcat1s row\n- if (args.RequestType.Equals(Syncfusion.Blazor.Grids.Action.Save) && args.Action == \"Update\")\n+ // EDIT the edited Tcat1s row\n+ if (args.RequestType.Equals(Syncfusion.Blazor.Grids.Action.Save) && args.Action == \"Edit\")\n {\n- Log.Debug($\"Tcat1sList.Tcat1EditComplete.Syncfusion.Blazor.Grids.Action.Save is true && args.Action: {args.Action} == 'Update'\");\n-\n- // get the Tcat2s row from the database in case it has been deleted\n- using var context = DbFactory.CreateDbContext();\n+ Log.Debug($\"Tcat1sList.Tcat1EditComplete.Syncfusion.Blazor.Grids.Action.Save is true && args.Action: [{args.Action}], args.Data.Tcat1CodeDesc: [{args.Data.Tcat1CodeDesc}], aTcat1s.Tcat1CodeDesc: [{aTcat1s.Tcat1CodeDesc}]\");\n \n- Tcat1s? aTcat1s = await context.Tcat1s!.SingleAsync(x => x.Tcat1 == args.Data.Tcat1);\n+ // get the Tcat1s row from the database in case it has been deleted\n+ // using var context = DbFactory.CreateDbContext();\n+ // Tcat1s? aTcat1s = await context.Tcat1s!.SingleAsync(x => x.Tcat1 == args.Data.Tcat1);\n \n- if (aTcat1s is null)\n- {\n- Log.Error($\"Tcat1sList.Tcat1EditComplete.Syncfusion.Blazor.Grids.Action.Save and Update - aTcat1s is null, Tcat1: {args.Data.Tcat1CodeDesc}\");\n- toastService.ShowToast($\"Cannot save changes for Tcat1s: {args.Data.Tcat1}, see log\", ToastLevel.Error, 5000);\n- args.Cancel = true;\n- return;\n- }\n+ // if (aTcat1s is null)\n+ // {\n+ // Log.Error($\"Tcat1sList.Tcat1EditComplete.Syncfusion.Blazor.Grids.Action.Save and Update - aTcat1s is null, Tcat1: {args.Data.Tcat1CodeDesc}\");\n+ // toastService.ShowToast($\"Cannot save changes for Tcat1s: {args.Data.Tcat1}, see log\", ToastLevel.Error, 5000);\n+ // args.Cancel = true;\n+ // return;\n+ // }\n \n // update the Tcat2s row\n- aTcat1s.Tcat1Description = args.Data.Tcat1Description;\n- aTcat1s.Tcat1 = args.Data.Tcat1;\n- context.Update(aTcat1s);\n- await context.SaveChangesAsync();\n+ // aTcat1s.Tcat1Description = args.Data.Tcat1Description;\n+ // aTcat1s.Tcat1 = args.Data.Tcat1;\n+ // context.Update(aTcat1s);\n+ await tcatService.SaveChangesAsync();\n \n- Log.Debug($\"Tcat1sList.Tcat1EditComplete.Syncfusion.Blazor.Grids.Action.Save - Tcat2: {aTcat1s.Tcat1CodeDesc}\");\n \n- toastService.ShowToast($\"Updated {aTcat1s.Tcat1CodeDesc}.\", ToastLevel.Success, 3000);\n+ toastService.ShowToast($\"Updated '{aTcat1s.Tcat1CodeDesc}'\", ToastLevel.Success, 3000);\n+ await sfTcat1sGrid!.Refresh();\n //await Task.Delay(3000);\n \n // refresh the grids by re-rendering the page and selecting the Tcat1 which now owns the Tcat2 that was edited\n //navigationManager.NavigateTo($\"/tcat1slist/{aTcat2s!.Tcat2Tcat1}\", true);\n+ Log.Debug($\"Tcat1sList.Tcat1EditComplete.Edit - Tcat1.Tcat1CodeDesc: [{aTcat1s.Tcat1CodeDesc}]\");\n return;\n }\n \n // DELETE a Tcat1s\n if ((args.RequestType.Equals(Syncfusion.Blazor.Grids.Action.Delete) && args.Action == \"Delete\"))\n {\n- if (args.Data.Tcat2sCount > 0)\n+ if (aTcat1s.Tcat2sCount > 0)\n {\n- Log.Warning($\"Tcat1sList.Tcat1EditComplete.Delete - {args.Data.Tcat1CodeDesc} not deleted because Tcat2sCount not zero: {args.Data.Tcat2sCount}\");\n- toastService.ShowToast($\"{args.Data.Tcat1CodeDesc} was not deleted because Tcat2sCount not zero: {args.Data.Tcat2sCount}\",ToastLevel.Warning, 3000);\n+ Log.Warning($\"Tcat1sList.Tcat1EditComplete.Delete - [{aTcat1s.Tcat1CodeDesc}] not deleted because Tcat2sCount not zero: [{aTcat1s.Tcat2sCount}], aTcat1s.Tcat1CodeDesc: [{aTcat1s.Tcat1CodeDesc}]\");\n+ toastService.ShowToast($\"'{aTcat1s.Tcat1CodeDesc}' was not deleted because Tcat2sCount = {aTcat1s.Tcat2sCount}\", ToastLevel.Warning, 3000);\n args.Cancel = true;\n- StateHasChanged();\n+ await sfTcat1sGrid!.Refresh();\n+ return;\n+ }\n+\n+ // get the Tcat1sToDelete row from the database in case it has been deleted by another process\n+ Tcat1s? aTcat1sToDelete = await financeContext.Tcat1s!.FirstOrDefaultAsync(x => x.Tcat1 == aTcat1s!.Tcat1);\n+ if (aTcat1sToDelete is null)\n+ {\n+ Log.Error($\"Tcat1sList.Tcat2EditComplete.Syncfusion.Blazor.Grids.Action.Delete - [{aTcat1s.Tcat1CodeDesc}] already deleted\");\n+ toastService.ShowToast($\"'{aTcat1s.Tcat1CodeDesc}' already deleted\", ToastLevel.Error, 5000);\n+ args.Cancel = true;\n+ await sfTcat1sGrid!.Refresh();\n return;\n }\n \n // ask the user to confirm the delete\n- bool confirmed = await jsRuntime.InvokeAsync(\"confirm\", $\"Please confirm delete of {args.Data.Tcat1CodeDesc} ?\"); // confirm\n+ bool confirmed = await jsRuntime.InvokeAsync(\"confirm\", $\"Please confirm delete of {aTcat1s.Tcat1CodeDesc} ?\"); // confirm\n if (confirmed) // delete was approved\n {\n- await tcatService.Tcat1s_DeleteAsync(args.Data);\n- Log.Debug($\"Tcat1sList.Tcat1EditComplete.Delete - Deleted Tcat2Tcat1: {args.Data.Tcat1CodeDesc}, args.Data.Tcat2s.Count: {args.Data.Tcat2sCount}\");\n+ // remove the Tcat1s from the list and the database\n+ tcat1s!.Remove(aTcat1s);\n+ await tcatService.Tcat1s_DeleteAsync(aTcat1s);\n Tcat1Id = null; // clear the parameter in case the user uses the back button after the delete\n- toastService.ShowToast($\"Deleted {args.Data.Tcat1CodeDesc}\", ToastLevel.Success, 3000);\n+\n+ toastService.ShowToast($\"Deleted '{args.Data.Tcat1CodeDesc}'\", ToastLevel.Success, 3000);\n+ await sfTcat1sGrid!.Refresh();\n+\n+ Log.Debug($\"Tcat1sList.Tcat1EditComplete.Delete - Deleted Tcat2Tcat1: [{args.Data.Tcat1CodeDesc}], args.Data.Tcat2s.Count: [{args.Data.Tcat2sCount}]\");\n }\n else // deleted was cancelled\n {\n- Log.Debug($\"Tcat1sList2.Tcat1EditComplete.Delete - confirmed: {confirmed}, not deleted {args.Data.Tcat1CodeDesc}, args.Data.Tcat2s.Count: {args.Data.Tcat2sCount}\");\n+ Log.Debug($\"Tcat1sList2.Tcat1EditComplete.Delete - confirmed: {confirmed}, not deleted [{args.Data.Tcat1CodeDesc}], args.Data.Tcat2s.Count: [{args.Data.Tcat2sCount}]\");\n args.Cancel = true;\n toastService.ShowToast($\"confirmed: {confirmed}, not deleted {args.Data.Tcat1CodeDesc}\", ToastLevel.Warning, 3000);\n- await Task.Delay(3000);\n \n- // refresh the grids by re-rendering the page and selecting the Tcat1s that was to be deleted\n- navigationManager.NavigateTo($\"/tcat1slist/{args.Data.Tcat1}\", true);\n+ // refresh the grid\n+ await sfTcat1sGrid!.Refresh();\n }\n }\n \n@@ -264,20 +279,15 @@ else\n \n public async void Tcat2EditComplete(ActionEventArgs args)\n {\n- #region deprecated null argument checks\n+ #region null argument checks\n if (args is null)\n {\n- Log.Warning($\"Tcat1sList.Tcat2EditComplete - ActionEventArgs is NULL, tcat2sSelectedIndex: {tcat2sSelectedIndex}\");\n+ Log.Debug($\"Tcat1sList.Tcat2EditComplete - ActionEventArgs is NULL, tcat2sSelectedIndex: [{tcat2sSelectedIndex}], just return\");\n return;\n }\n if (args.Data is null)\n {\n- Log.Warning($\"Tcat1sList.Tcat2EditComplete - ActionEventArgs is NULL, SelectedTcat2Id: {SelectedTcat2Id}, tcat2sSelectedIndex: {tcat2sSelectedIndex}\");\n- return;\n- }\n- if (args.Data is null)\n- {\n- Log.Error($\"Tcat1sList.Tcat2EditComplete - ActionEventArgs args.Data is NULL, tcat2sSelectedIndex: {tcat2sSelectedIndex}\");\n+ Log.Debug($\"Tcat1sList.Tcat2EditComplete - ActionEventArgs is NULL, SelectedTcat2Id: [{SelectedTcat2Id}], tcat2sSelectedIndex: [{tcat2sSelectedIndex}], just return\");\n return;\n }\n if (args.Data.Tcat2Description is null)\n@@ -287,142 +297,121 @@ else\n }\n #endregion\n \n- // Add the new Tcat2s row\n+ aTcat2s = args.Data;\n+\n+ // get the Tcat1s which owns the Tcat2s that is being edited\n+ aTcat1s = tcat1s!.FirstOrDefault(t => t.Tcat1 == aTcat2s.Tcat2Tcat1);\n+\n+ Log.Debug($\"Tcat1sList.Tcat2EditComplete - tcat2sSelectedIndex: [{tcat2sSelectedIndex}], aTcat2s.Tcat2CodeDesc: {aTcat2s.Tcat2CodeDesc}, aTcat1s.Tcat1CodeDesc: {aTcat1s!.Tcat1CodeDesc}\");\n+\n+ // ADD the new Tcat2s row\n if (args.RequestType.Equals(Syncfusion.Blazor.Grids.Action.Save) && args.Action == \"Add\")\n {\n Log.Debug($\"Tcat1sList.Tcat2EditComplete.Syncfusion.Blazor.Grids.Action.Save is true && args.Action: {args.Action} == 'Add'\");\n \n // get the Tcat2s row from the database in case it has been deleted\n- using var context = DbFactory.CreateDbContext();\n+ //using var context = DbFactory.CreateDbContext();\n \n // instaniate the new Tcat2s row\n- Tcat2s newTcat2s = new() { Tcat2 = args.Data.Tcat2, Tcat2Description = args.Data.Tcat2Description, Tcat2Tcat1 = args.Data.Tcat2Tcat1 };\n+ //Tcat2s newTcat2s = new() { Tcat2 = args.Data.Tcat2, Tcat2Description = args.Data.Tcat2Description, Tcat2Tcat1 = args.Data.Tcat2Tcat1 };\n \n // check if the new Tcat2s row already exists\n- if (context.Tcat2s!.Any(x => x.Tcat2 == newTcat2s.Tcat2))\n- {\n- args.Cancel = true;\n- Log.Warning($\"Tcat1sList.Tcat2EditComplete.Syncfusion.Blazor.Grids.Action.Save - Tcat2: {newTcat2s.Tcat2} already exists, Tcat2Description: {newTcat2s.Tcat2Description}\");\n- toastService.ShowToast($\"Tcat2: {newTcat2s.Tcat2} already exists, Tcat2Description: {newTcat2s.Tcat2Description}\", ToastLevel.Error, 5000);\n- await Task.Delay(5000);\n-\n- // refresh the grids by re-rendering the page and selecting the Tcat1 which was to own the new Tcat2\n- navigationManager.NavigateTo($\"/tcat1slist/{aTcat2s!.Tcat2Tcat1}\", true);\n- return;\n- }\n+ // if (context.Tcat2s!.Any(x => x.Tcat2 == newTcat2s.Tcat2))\n+ // {\n+ // args.Cancel = true;\n+ // Log.Warning($\"Tcat1sList.Tcat2EditComplete.Syncfusion.Blazor.Grids.Action.Save - Tcat2: {newTcat2s.Tcat2} already exists, Tcat2Description: {newTcat2s.Tcat2Description}\");\n+ // toastService.ShowToast($\"Tcat2: {newTcat2s.Tcat2} already exists, Tcat2Description: {newTcat2s.Tcat2Description}\", ToastLevel.Error, 5000);\n+ // await Task.Delay(5000);\n \n- // insert the new Tcat2s row\n- context.Add(newTcat2s);\n- await context.SaveChangesAsync();\n+ // refresh the grids by re-rendering the page and selecting the Tcat1 which was to own the new Tcat2\n+ // navigationManager.NavigateTo($\"/tcat1slist/{aTcat2s!.Tcat2Tcat1}\", true);\n+ // return;\n+ // }\n \n- Log.Debug($\"Tcat1sList.Tcat2EditComplete.Syncfusion.Blazor.Grids.Action.Save and Add - Tcat2: {aTcat2s!.Tcat2CodeDesc}\");\n+ // insert the new Tcat2s row into the aTcat1s.Tcat2s collection and update the database\n+ aTcat1s!.Tcat2s!.Add(aTcat2s);\n+ await tcatService.Tcat2_InsertAsync(aTcat2s); // UPDATE the database\n \n- toastService.ShowToast($\"Added {aTcat2s.Tcat2CodeDesc}.\", ToastLevel.Success, 3000);\n- // refresh the grids by re-rendering the page\n- //navigationManager.NavigateTo(\"/tcat1slist\", true);\n+ toastService.ShowToast($\"Added '{aTcat2s.Tcat2CodeDesc}'\", ToastLevel.Success, 3000);\n+ await sfTcat2sGrid!.Refresh();\n+ Log.Debug($\"Tcat1sList.Tcat2EditComplete.Syncfusion.Blazor.Grids.Action.Save and Add - Tcat2: [{aTcat2s!.Tcat2CodeDesc}]\");\n+ return;\n }\n \n- // Update the edited row\n- if (args.RequestType.Equals(Syncfusion.Blazor.Grids.Action.Save) && args.Action ==\"Update\")\n+ // EDIT the Tcat2s row\n+ if (args.RequestType.Equals(Syncfusion.Blazor.Grids.Action.Save) && args.Action ==\"Edit\")\n {\n Log.Debug($\"Tcat1sList.Tcat2EditComplete.Syncfusion.Blazor.Grids.Action.Save is true && args.Action: {args.Action} == 'Update'\");\n \n // get the Tcat2s row from the database in case it has been deleted\n- using var context = DbFactory.CreateDbContext();\n+ // using var context = DbFactory.CreateDbContext();\n \n- Tcat2s? aTcat2s = await context.Tcat2s!.SingleAsync(x => x.Tcat2 == args.Data.Tcat2);\n+ // Tcat2s? aTcat2s = await context.Tcat2s!.SingleAsync(x => x.Tcat2 == args.Data.Tcat2);\n \n- if (aTcat2s is null)\n- {\n- Log.Error($\"Tcat1sList.Tcat2EditComplete.Syncfusion.Blazor.Grids.Action.Save and Update - aTcat2s is null, Tcat2: {args.Data.Tcat2CodeDesc}\");\n- toastService.ShowToast($\"Cannot save changes for Tcat2s: {args.Data.Tcat2}, see log\", ToastLevel.Error, 5000);\n- args.Cancel = true;\n- return;\n- }\n+ // if (aTcat2s is null)\n+ // {\n+ // Log.Error($\"Tcat1sList.Tcat2EditComplete.Syncfusion.Blazor.Grids.Action.Save and Update - aTcat2s is null, Tcat2: {args.Data.Tcat2CodeDesc}\");\n+ // toastService.ShowToast($\"Cannot save changes for Tcat2s: {args.Data.Tcat2}, see log\", ToastLevel.Error, 5000);\n+ // args.Cancel = true;\n+ // return;\n+ // }\n \n // update the Tcat2s row\n- aTcat2s.Tcat2Description = args.Data.Tcat2Description;\n- aTcat2s.Tcat2Tcat1 = args.Data.Tcat2Tcat1;\n- context.Update(aTcat2s);\n- await context.SaveChangesAsync();\n+ // aTcat2s.Tcat2Description = args.Data.Tcat2Description;\n+ // aTcat2s.Tcat2Tcat1 = args.Data.Tcat2Tcat1;\n+ // context.Update(aTcat2s);\n+ // await context.SaveChangesAsync();\n+ await tcatService.SaveChangesAsync();\n \n- Log.Debug($\"Tcat1sList.Tcat2EditComplete.Syncfusion.Blazor.Grids.Action.Save - Tcat2: {aTcat2s.Tcat2CodeDesc}\");\n+ Log.Debug($\"Tcat1sList.Tcat2EditComplete.Syncfusion.Blazor.Grids.Action.Save - Tcat2: [{aTcat2s.Tcat2CodeDesc}]\");\n \n toastService.ShowToast($\"Updated {aTcat2s.Tcat2CodeDesc}.\", ToastLevel.Success, 3000);\n- await Task.Delay(3000);\n+ //await Task.Delay(3000);\n \n // refresh the grids by re-rendering the page and selecting the Tcat1 which now owns the Tcat2 that was edited\n- navigationManager.NavigateTo($\"/tcat1slist/{aTcat2s!.Tcat2Tcat1}\", true);\n+ await sfTcat2sGrid!.Refresh();\n+ //navigationManager.NavigateTo($\"/tcat1slist/{aTcat2s!.Tcat2Tcat1}\", true);\n return;\n }\n \n- // delete the Tcat2s if there are no Trans or TransEtl rows linked to it.\n+ // DELETE the Tcat2s if there are no Trans or TransEtl rows linked to it.\n if (args.RequestType.Equals(Syncfusion.Blazor.Grids.Action.Delete) && args.Action==\"Delete\")\n {\n- Log.Debug($\"Tcat1sList.Tcat2EditComplete.Syncfusion.Blazor.Grids.Action.Delete is true && args.Action: {args.Action} == 'Delete'\");\n- using var context = DbFactory.CreateDbContext();\n+ Log.Debug($\"Tcat1sList.Tcat2EditComplete.Syncfusion.Blazor.Grids.Action.Delete is true && args.Action: [{args.Action}] == 'Delete'\");\n \n- // get the Tcat2s row from the database in case it has been deleted\n- Tcat2s? aTcat2s = await context.Tcat2s!.SingleAsync(x => x.Tcat2 == args.Data.Tcat2);\n-\n- if (aTcat2s is null)\n+ // get the Tcat2sToDelete row from the database in case it has been deleted by another process\n+ Tcat2s? aTcat2sToDelete = await financeContext.Tcat2s!.FirstOrDefaultAsync(x => x.Tcat2 == aTcat2s!.Tcat2);\n+ if (aTcat2sToDelete is null)\n {\n- Log.Error($\"Tcat1sList.Tcat2EditComplete.Syncfusion.Blazor.Grids.Action.Delete - {args.Data.Tcat2CodeDesc} already deleted\");\n- toastService.ShowToast($\"{args.Data.Tcat2CodeDesc} already deleted\", ToastLevel.Error, 5000);\n+ Log.Error($\"Tcat1sList.Tcat2EditComplete.Syncfusion.Blazor.Grids.Action.Delete - [{aTcat2s.Tcat2CodeDesc}] already deleted\");\n+ toastService.ShowToast($\"'{aTcat2s.Tcat2CodeDesc}' already deleted\", ToastLevel.Error, 5000);\n args.Cancel = true;\n+ await sfTcat2sGrid!.Refresh();\n return;\n }\n \n // check for any rows in Trans or TransEtl for this Tcat2s, if any exist the delete is cancelled\n- if (context.Trans.Any(x => x.Tcat2 == args.Data.Tcat2) || context.TransEtls.Any(x => x.Tcat2 == args.Data.Tcat2))\n+ if (financeContext.Trans.Any(x => x.Tcat2 == aTcat2sToDelete.Tcat2) || financeContext.TransEtls.Any(x => x.Tcat2 == aTcat2sToDelete.Tcat2))\n {\n- Log.Error($\"Tcat1sList.Tcat2EditComplete.Syncfusion.Blazor.Grids.Action.Delete - Cannot delete. Rows exist for Tcat2: {args.Data.Tcat2CodeDesc} in Trans and/or TransEtl\");\n- toastService.ShowToast($\"Cannot delete {args.Data.Tcat2CodeDesc}. Rows already exist in Trans and/or TransEtl\", ToastLevel.Error, 5000);\n+ Log.Error($\"Tcat1sList.Tcat2EditComplete.Syncfusion.Blazor.Grids.Action.Delete - Cannot delete. Rows exist for Tcat2: [{aTcat2sToDelete.Tcat2CodeDesc}] in Trans and/or TransEtl\");\n+ toastService.ShowToast($\"Cannot delete '{aTcat2sToDelete.Tcat2CodeDesc}'. Rows already exist in Trans and/or TransEtl\", ToastLevel.Error, 5000);\n args.Cancel = true;\n- await Task.Delay(5000);\n-\n- // refresh the grids by re-rendering the page and re-selecting the Tcat1 which now owns the Tcat2 that was being deleted\n- navigationManager.NavigateTo($\"/tcat1slist/{aTcat2s!.Tcat2Tcat1}\", true);\n+ await sfTcat2sGrid!.Refresh();\n return;\n }\n \n- // call modal form to confirm delete of the selected Tcat2s\n- // ModalResult result = await ShowModalDelete($\"Tcat1sList.Tcat2EditComplete/Delete {args.Data.Tcat2CodeDesc}\");\n- // if (result.Cancelled)\n- // {\n- // args.Cancel = true;\n- // SelectedTcat1Id = null;\n- // await Tcat1sGrid!.Refresh();\n- // Log.Warning($\"Tcat1sList.Tcat2EditComplete/Delete - Deleted was cancelled for Tcat2s: {args.Data.Tcat2}\");\n- // toastService.ShowToast($\"Deleted was cancelled for {args.Data.Tcat2CodeDesc}\", ToastLevel.Warning, 3000);\n- // return;\n- // }\n-\n- context.Remove(aTcat2s);\n- await context.SaveChangesAsync();\n+ // delete the Tcat2s row from the tcat2s list, the aTcat1s.tcat2 collection and the database\n+ tcat2s!.Remove(aTcat2sToDelete);\n+ aTcat1s!.Tcat2s!.Remove(aTcat2sToDelete);\n+ await tcatService.Tcat2s_DeleteAsync(aTcat2sToDelete);\n \n- Log.Debug($\"Tcat1sList.Tcat2EditComplete.Syncfusion.Blazor.Grids.Action.Delete - Tcat2: {aTcat2s.Tcat2CodeDesc}\");\n- toastService.ShowToast($\"Deleted {args.Data.Tcat2CodeDesc}\", ToastLevel.Success, 3000);\n- await Task.Delay(3000);\n- navigationManager.NavigateTo(\"/tcat1slist\", true);\n+ Log.Debug($\"Tcat1sList.Tcat2EditComplete.Syncfusion.Blazor.Grids.Action.Delete - Tcat2: [{aTcat2sToDelete.Tcat2CodeDesc}]\");\n+ toastService.ShowToast($\"Deleted '{aTcat2sToDelete.Tcat2CodeDesc}'\", ToastLevel.Success, 3000);\n+ await sfTcat2sGrid!.Refresh();\n return;\n }\n-\n }\n \n- // used to confirm the delete of a selected Tcat2s\n- // async Task ShowModalDelete(string message)\n- // {\n- // var Tcat1ListModal = myModal!.Show(message, options);\n- // var result = await Tcat1ListModal.Result;\n- // if (result.Cancelled)\n- // Log.Debug($\"Tcat1sList2/ShowModalDelete - Modal was cancelled; {result.Cancelled}\");\n- // else\n- // Log.Debug($\"Tcat1sList2/ShowModalDelete - Modal was closed, result.Cancelled: {result.Cancelled}\");\n-\n- // return result;\n- // }\n-\n // view all the transactions belonging to this Tcat2s\n public void NavigateTransList()\n {\n@@ -470,7 +459,7 @@ else\n .nav-link .bi {\n font-size: 1rem;\n color: black;\n- margin-right: 0.5rem;\n+ margin-right: 0rem;\n }\n \n "}],"temperature":0,"top_p":0.1,"max_tokens":500}