diff --git a/FruitBankHybrid.Shared/Components/GridShippingDocument.razor b/FruitBankHybrid.Shared/Components/GridShippingDocument.razor
index 950d0d4..80b4e98 100644
--- a/FruitBankHybrid.Shared/Components/GridShippingDocument.razor
+++ b/FruitBankHybrid.Shared/Components/GridShippingDocument.razor
@@ -2,6 +2,7 @@
@using AyCode.Utils.Extensions
@using FruitBank.Common.Dtos
@using FruitBank.Common.Entities
+@* @using FruitBankHybrid.Shared.Components.FileUploads *@
@using FruitBankHybrid.Shared.Components.Grids.ShippingDocuments
@using FruitBankHybrid.Shared.Databases
@using FruitBankHybrid.Shared.Services.SignalRs
@@ -99,11 +100,15 @@
{
-
+@*
+ *@
+
+
+
}
@@ -126,6 +131,25 @@
+
+@*
+
+
+ *@
+
+
+
@code {
[Inject] public required DatabaseClient Database { get; set; }
[Inject] public required LoggedInModel LoggedInModel { get; set; }
@@ -148,6 +172,10 @@
string GridSearchText = "";
bool EditItemsEnabled { get; set; } = true;
int FocusedRowVisibleIndex { get; set; }
+
+ private DxWindow windowRef;
+ private bool windowVisible;
+
public GridShippingDocumentBase Grid { get; set; }
private LoggerClient _logger = null!;
private int _activeTabIndex;
@@ -196,7 +224,8 @@
if (Grid == null) return;
using (await ObjectLock.GetSemaphore().UseWaitAsync())
- if (forceReload) await Grid.ReloadDataSourceAsync();
+ if (forceReload)
+ await Grid.ReloadDataSourceAsync();
if (forceReload) Grid.Reload();
}
@@ -233,4 +262,18 @@
{
_activeTabIndex = activeTabIndex;
}
-}
\ No newline at end of file
+
+ private async Task Callback(ToolbarItemClickEventArgs obj)
+ {
+ if (windowVisible)
+ await windowRef.CloseAsync();
+ else
+ await windowRef.ShowAsync();
+ }
+
+ private void Callback2(WindowClosingEventArgs obj)
+ {
+ ReloadDataFromDb(true).Forget();
+ }
+
+}
diff --git a/FruitBankHybrid.Shared/Components/Grids/ShippingDocuments/AiProcessFormTemplate.razor b/FruitBankHybrid.Shared/Components/Grids/ShippingDocuments/AiProcessFormTemplate.razor
new file mode 100644
index 0000000..8f2fb07
--- /dev/null
+++ b/FruitBankHybrid.Shared/Components/Grids/ShippingDocuments/AiProcessFormTemplate.razor
@@ -0,0 +1,4 @@
+
+@code {
+
+}
diff --git a/FruitBankHybrid.Shared/wwwroot/app.css b/FruitBankHybrid.Shared/wwwroot/app.css
index 1bbebda..64bf028 100644
--- a/FruitBankHybrid.Shared/wwwroot/app.css
+++ b/FruitBankHybrid.Shared/wwwroot/app.css
@@ -170,7 +170,8 @@ h1:focus {
.grid-export-pdf,
.grid-refresh,
.grid-fullscreen,
-.grid-fullscreen-exit {
+.grid-fullscreen-exit,
+.grid-ai {
display: inline-flex;
align-items: center;
justify-content: center;
@@ -193,7 +194,8 @@ h1:focus {
.grid-export-pdf::before,
.grid-refresh::before,
.grid-fullscreen::before,
- .grid-fullscreen-exit::before {
+ .grid-fullscreen-exit::before,
+ .grid-ai::before {
content: "";
display: inline-block;
width: 1.25rem;
@@ -316,6 +318,12 @@ h1:focus {
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpolyline points='4 14 10 14 10 20'/%3E%3Cpolyline points='20 10 14 10 14 4'/%3E%3Cline x1='14' y1='10' x2='21' y2='3'/%3E%3Cline x1='3' y1='21' x2='10' y2='14'/%3E%3C/svg%3E");
}
+ /* AI icon (sparkles/magic) */
+ .grid-ai::before {
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='M12 3l1.5 4.5L18 9l-4.5 1.5L12 15l-1.5-4.5L6 9l4.5-1.5L12 3z'/%3E%3Cpath d='M5 19l1 3 1-3 3-1-3-1-1-3-1 3-3 1 3 1z'/%3E%3Cpath d='M19 11l.5 1.5 1.5.5-1.5.5-.5 1.5-.5-1.5L17 13l1.5-.5.5-1.5z'/%3E%3C/svg%3E");
+ -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Cpath d='M12 3l1.5 4.5L18 9l-4.5 1.5L12 15l-1.5-4.5L6 9l4.5-1.5L12 3z'/%3E%3Cpath d='M5 19l1 3 1-3 3-1-3-1-1-3-1 3-3 1 3 1z'/%3E%3Cpath d='M19 11l.5 1.5 1.5.5-1.5.5-.5 1.5-.5-1.5L17 13l1.5-.5.5-1.5z'/%3E%3C/svg%3E");
+ }
+
/* ========================================
MgGrid Splitter with InfoPanel
InfoPanel sticky via JavaScript