|
@@ -1662,7 +1662,64 @@ public abstract class DynamicGrid<T> : DynamicGrid, IDynamicGridUIComponentParen
|
|
|
OnBeforeSave?.Invoke(editor, items);
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// Edit the <paramref name="items"/> with a non-modal editor window, attaching them to the <paramref name="host"/> provided.
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="items">List of objects to edit.</param>
|
|
|
+ /// <param name="callback">A callback for when the items are finished being edited.</param>
|
|
|
+ public virtual void EditItemsNonModal(ISubPanelHost host, T[] items, Action<T[], bool> callback, Func<Type, CoreTable?>? PageDataHandler = null, bool PreloadPages = false)
|
|
|
+ {
|
|
|
+ if (!DynamicGridUtils.TryEdit(items, out var editLock))
|
|
|
+ {
|
|
|
+ if(editLock.Panel is Window window)
|
|
|
+ {
|
|
|
+ Task.Delay(100).ContinueWith(task =>
|
|
|
+ {
|
|
|
+ window.WindowState = WindowState.Normal;
|
|
|
+ window.Activate();
|
|
|
+ }, TaskScheduler.FromCurrentSynchronizationContext());
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ MessageWindow.ShowMessage("One or more items are already being edited in an open window. You cannot edit the same entity multiple times simultaneously.", "Simultaneous edit.");
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
+ DynamicEditorForm editor;
|
|
|
+ using (var cursor = new WaitCursor())
|
|
|
+ {
|
|
|
+ editor = new DynamicEditorForm();
|
|
|
+ editor.SetValue(Panel.ZIndexProperty, 999);
|
|
|
+ editor.Form.DisableOKIfUnchanged = true;
|
|
|
+
|
|
|
+ InitialiseEditorForm(editor, items, PageDataHandler, PreloadPages);
|
|
|
+ OnEditorLoaded?.Invoke(editor, items);
|
|
|
+ }
|
|
|
+ editLock.Panel = editor;
|
|
|
+
|
|
|
+ host.AddSubPanel(editor);
|
|
|
+ editor.SubPanelClosed += o =>
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ DynamicGridUtils.FinishEdit(items);
|
|
|
+ callback(items, editor.Result == true);
|
|
|
+ }
|
|
|
+ catch(Exception e)
|
|
|
+ {
|
|
|
+ MessageWindow.ShowError("Error occurred while closing editor.", e);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ editor.Show();
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Edit the <paramref name="items"/> with a modal editor window.
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="items">List of objects to edit.</param>
|
|
|
+ /// <returns><see langword="true"/> if the items were saved.</returns>
|
|
|
public virtual bool EditItems(T[] items, Func<Type, CoreTable?>? PageDataHandler = null, bool PreloadPages = false)
|
|
|
{
|
|
|
DynamicEditorForm editor;
|
|
@@ -1844,19 +1901,38 @@ public abstract class DynamicGrid<T> : DynamicGrid, IDynamicGridUIComponentParen
|
|
|
//foreach (String key in VisualFilters.Keys)
|
|
|
// CoreUtils.SetPropertyValue(item, key, VisualFilters[key]);
|
|
|
|
|
|
- if (EditItems([item]))
|
|
|
+ if(Options.NonModalEditorHost is not null)
|
|
|
{
|
|
|
- //_CurrentRow = Data.Rows.Count;
|
|
|
- var row = Data.NewRow();
|
|
|
- ObjectToRow(item, row);
|
|
|
- Data.Rows.Add(row);
|
|
|
- InvalidateGrid();
|
|
|
- SelectedRows = [row];
|
|
|
- DoChanged();
|
|
|
- return true;
|
|
|
+ EditItemsNonModal(Options.NonModalEditorHost, [item], (items, result) =>
|
|
|
+ {
|
|
|
+ if (result)
|
|
|
+ {
|
|
|
+ var row = Data.NewRow();
|
|
|
+ ObjectToRow(item, row);
|
|
|
+ Data.Rows.Add(row);
|
|
|
+ InvalidateGrid();
|
|
|
+ SelectedRows = [row];
|
|
|
+ DoChanged();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return false;
|
|
|
}
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (EditItems([item]))
|
|
|
+ {
|
|
|
+ //_CurrentRow = Data.Rows.Count;
|
|
|
+ var row = Data.NewRow();
|
|
|
+ ObjectToRow(item, row);
|
|
|
+ Data.Rows.Add(row);
|
|
|
+ InvalidateGrid();
|
|
|
+ SelectedRows = [row];
|
|
|
+ DoChanged();
|
|
|
+ return true;
|
|
|
+ }
|
|
|
|
|
|
- return false;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
var items = Array.Empty<T>();
|
|
@@ -1872,22 +1948,48 @@ public abstract class DynamicGrid<T> : DynamicGrid, IDynamicGridUIComponentParen
|
|
|
if (items.Length != 0)
|
|
|
{
|
|
|
var snaps = items.ToArray(x => x.TakeSnapshot());
|
|
|
- if (EditItems(items))
|
|
|
+
|
|
|
+ if(Options.NonModalEditorHost is not null)
|
|
|
{
|
|
|
- var sel = SelectedRows;
|
|
|
- UpdateRows(rows, items, invalidateRows: false);
|
|
|
- InvalidateGrid();
|
|
|
- SelectedRows = sel;
|
|
|
- DoChanged();
|
|
|
- return true;
|
|
|
+ EditItemsNonModal(Options.NonModalEditorHost, items, (items, result) =>
|
|
|
+ {
|
|
|
+ if (result)
|
|
|
+ {
|
|
|
+ var sel = SelectedRows;
|
|
|
+ UpdateRows(rows, items, invalidateRows: false);
|
|
|
+ InvalidateGrid();
|
|
|
+ SelectedRows = sel;
|
|
|
+ DoChanged();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ foreach(var snap in snaps)
|
|
|
+ {
|
|
|
+ snap.ResetObject();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return false;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- foreach(var snap in snaps)
|
|
|
+ if (EditItems(items))
|
|
|
{
|
|
|
- snap.ResetObject();
|
|
|
+ var sel = SelectedRows;
|
|
|
+ UpdateRows(rows, items, invalidateRows: false);
|
|
|
+ InvalidateGrid();
|
|
|
+ SelectedRows = sel;
|
|
|
+ DoChanged();
|
|
|
+ return true;
|
|
|
}
|
|
|
- }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ foreach(var snap in snaps)
|
|
|
+ {
|
|
|
+ snap.ResetObject();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
return false;
|
|
|
}
|
|
|
|