Modulo List
Il modulo List permette di gestire entità di tipo item mostrando gli element in una lista.
Per attivare una sezione con modulo List vanno configurati i settaggi nella relativa sezione specificando il tipo di elemento DataWeb che definisce l'item.
Il modulo List supporta le azioni personalizzate sia sul singolo elemento che sulla filtratura.
Il modulo può essere utilizzato con la sola configurazione in DataWeb ma, se serve, può essere personalizzato in ogni sua funzione impostando una classe ereditata da quella base ModuleList e sovrascrivendo i medodi interessati. La nuova classe viene impostata nei relativi settaggi in DataWeb.
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Threading;
using Microsoft.Extensions.DependencyInjection;
using DataWeb.Structure;
using DataWeb.Structure.Modules;
using DataWeb.Identity;
using DataWeb.Data;
namespace App.DataWeb.Structure.Modules
{
public class ModuleProductList(Section section, NavigationContext navigationContext, IServiceProvider serviceProvider) : ModuleList(section, navigationContext, serviceProvider)
{
private readonly IContextActionService contextActionService = serviceProvider.GetService<IContextActionService>();
public override async Task<List<ContextAction>> GetActionsAsync(CancellationToken cancellationToken = default)
{
var actions = await base.GetActionsAsync(cancellationToken);
actions.Add(contextActionService.GetRemoteAction("Notify status", "FilteredItemsNotify", ContextActionType.Notification, context: "FilteredItems", isConfirmRequired: true, isReloadAfterProcess: true, isSaveItemBeforeProcess: true));
actions.Add(contextActionService.GetRemoteAction("Notify status item", "SelectedItemsNotify", ContextActionType.Tool, context: "SelectedItems"));
actions.Add(contextActionService.GetRemoteAction("Set product status", "SelectedItemsSetProductStatus", ContextActionType.Dialog, context: "SelectedItems", dialogFormName: "Form_ActionProductStatus", isConfirmRequired: true, isReloadAfterProcess: true));
return actions;
}
public override async Task<ContextAction.Result> ProcessActionAsync(ContextAction action, IUser user, List<string> itemIdMasters = null, List<Form.ProvidedValue> controlValues = null, NavigationContext navigationContext = null, CancellationToken cancellationToken = default)
{
var result = await base.ProcessActionAsync(action, user, itemIdMasters, controlValues, navigationContext, cancellationToken);
switch (action.Name)
{
case "FilteredItemsNotify":
case "SelectedItemsNotify":
result = NotifyStatus();
break;
case "SelectedItemsSetProductStatus":
result = new ContextAction.Result { IsValid = true };
break;
}
return result;
}
public ContextAction.Result NotifyStatus()
{
var result = new ContextAction.Result { IsValid = true };
return result;
}
}
}
In questo esempio stiamo integrando azioni personalizzate sia sugli item che sulla filtratura.
Questa tabella può essere usata come riferimento per identificare le aree della classe base ModuleList che possono essere personalizzate creando una classe derivata.
Metodo | Descrizione | Possibile Personalizzazione |
---|---|---|
GetDataAsync | Recupera i dati del modulo, compresi campi, widget, layout, ricerca, paginazione e azioni. | Sovrascrivibile per modificare il comportamento di caricamento dei dati, aggiungere logica personalizzata per filtri, layout o azioni specifiche. |
GetDeferredDataAsync | Recupera dati "differiti" per gli item specificati, utilizzando parametri di input. | Sovrascrivibile per gestire caricamenti asincroni complessi o per modificare come vengono recuperati i dati differiti. |
GetSearchSuggestionsAsync | Fornisce suggerimenti di ricerca basati su filtri e input dell'utente. | Personalizzabile per aggiungere suggerimenti avanzati o per gestire regole specifiche per campi personalizzati. |
SetLayoutAsync | Aggiorna il layout del modulo (es. modalità "Table" o "Card"). | Sovrascrivibile per aggiungere logica specifica nella gestione del layout (es. modalità custom). |
SetSearchAsync | Aggiorna i filtri di ricerca del modulo basandosi sui valori forniti dall'utente. | Personalizzabile per gestire filtri complessi, con supporto per validazioni personalizzate o campi aggiuntivi. |
SetPageIndexAsync | Aggiorna l'indice di paginazione per la lista di dati. | Sovrascrivibile per modificare il comportamento della navigazione tra le pagine o per aggiungere controlli specifici sull'indice. |
SetOrderByAsync | Modifica le impostazioni di ordinamento per il modulo (campo e modalità). | Sovrascrivibile per implementare logiche di ordinamento avanzate o per supportare nuovi campi. |
GetActionsAsync | Recupera l'elenco delle azioni disponibili, inclusa l'esportazione se abilitata. | Sovrascrivibile per aggiungere azioni personalizzate o rimuovere quelle esistenti in base a specifici scenari. |
ProcessActionAsync | Gestisce l'esecuzione di azioni definite, come l'esportazione di item filtrati o selezionati. | Personalizzabile per implementare logiche personalizzate per azioni, come esportazioni specifiche o processi custom. |
ProcessExportAsync | Elabora l'esportazione di item in un file Excel. | Sovrascrivibile per modificare il formato di esportazione, aggiungere campi extra o personalizzare l'organizzazione dei dati esportati. |
IsCompletedAsync | Determina se un item è "completato" basandosi su criteri personalizzati. | Sovrascrivibile per definire regole personalizzate che stabiliscono lo stato di completamento di un item. |
CloneAsync | Clona un item specifico. | Sovrascrivibile per aggiungere logica personalizzata durante la clonazione di un item, come modifiche ai dati del clone. |
ProcessOnItemDeleteAsync | Eseguito quando un item viene eliminato, consente di aggiungere logica extra durante l'eliminazione. | Sovrascrivibile per gestire logiche specifiche come log, notifiche o aggiornamenti correlati all'eliminazione. |
ProcessOnItemSetStatusAsync | Eseguito quando cambia lo stato di un item, consente di aggiungere logica personalizzata per il cambio di stato. | Sovrascrivibile per gestire aggiornamenti extra, come sincronizzazioni o notifiche, quando lo stato di un item cambia. |
ProcessOnItemCloneAsync | Eseguito dopo la clonazione di un item, consente di aggiungere logica extra dopo il processo di clonazione. | Sovrascrivibile per implementare modifiche specifiche ai dati del clone o per eseguire azioni aggiuntive (es. aggiornamento di relazioni). |
ProcessOnItemMoveAsync | Eseguito quando un item viene spostato, consente di aggiungere logica personalizzata per il movimento dell'item. | Sovrascrivibile per modificare o aggiornare i dati associati all'item durante lo spostamento (es. aggiornamento di riferimenti o dipendenze). |
GetContextItemsAsync | Recupera gli item per la lista, applicando filtri, ordinamenti e paginazione. | Sovrascrivibile per modificare come vengono recuperati gli item o per aggiungere logica specifica per il caricamento dei dati. |
ProcessExportAsync | Genera un file Excel con i dati degli item esportati. | Personalizzabile per gestire la formattazione del file, l'aggiunta di colonne personalizzate o modifiche nei dati esportati. |
Il metodo GetContextItemsAsync può essere utilizzato nei vari contesti per recuperare rapidamente sia gli item filtrati che quelli selezionati (specificando gli IdMaster degli item coinvolti tramite itemIds). Ad esempio:
public override async Task<ContextAction.Result> ProcessActionAsync(ContextAction action, IUser user, List<string> itemIds = null, List<Form.ProvidedValue> controlValues = null, NavigationContext navigationContext = null, CancellationToken cancellationToken = default)
{
var result = await base.ProcessActionAsync(action, user, itemIds, controlValues, navigationContext, cancellationToken);
var step = navigationContext.Steps.Last();
switch (action.Name)
{
case "FilteredItemsExport":
var filteredContextItems = (await GetContextItemsAsync(cancellationToken: cancellationToken)).ContextItems;
result = new ContextAction.Result { IsValid = true, Stream = await ProcessExportAsync(filteredContextItems, cancellationToken), FileName = string.Format("{0}.xlsx", step.Section.Title), ContentType = "application/vnd.ms-excel" };
break;
case "SelectedItemsExport":
if (itemIds == null || itemIds.Count == 0)
{
return new ContextAction.Result { IsValid = false, Error = new Validation.ValidationError { Name = "ActionName", Message = "items are required" } };
}
var selectedContextItems = (await GetContextItemsAsync(itemIdMasters: itemIds, cancellationToken: cancellationToken)).ContextItems;
result = new ContextAction.Result { IsValid = true, Stream = await ProcessExportAsync(selectedContextItems, cancellationToken), FileName = string.Format("{0}.xlsx", step.Section.Title), ContentType = "application/vnd.ms-excel" };
break;
}
return result;
}