Bearbeitungsfunktionen

Ab der Version 4.0.7 sind im Namespace IduIT.cardo.Core.CoreModules.BasicEditing einige C#- und TypeScript-Klassen vorhanden, die das einfache Erstellen von Formularen ermöglichen.

Ziel ist es, mit Attributen an den C#-Klassen die benötigten Informationen bereitzustellen.

'C#' steht hier und im Folgenden stellvertretend für '.Net'

Vorgehensweise

Implementierung der C#-Datenklasse

Sie soll die DB-Tabelle im Code repräsentieren und dem Entwickler eine Hilfe und Schnittstelle zwischen Daten-Modell, Programm-Logik- und Web-Oberfläche sein (MVC-Prinzip). Folgender Ablauf wird empfohlen und sorgt für IntelliSense-Unterstützung im späteren TypeScript:

  • Anlegen und Implementieren der Klasse
    • Definition der Spalten-Namen und deren Datentypen
    • Attributierung mit
      • DB-Meta-Attributen per [PropertyModelProperty]
      • Serialisierung-Informationen (Client <-> Server) per [JsonProperty]
      • Anderen, optionalen Darstellungs- und Formatierungsoptionen
  • Kompilieren des Projekts
    • Erzeugung der Assemblies, welche m.H. von Reflection ausgelesen werden
  • Verwendung des Visual Studio-Kontextmenüs des .Net Projektes
    • Klick auf die Option "IDUIT: Create .Net Typescript code"
    • Hinweis: Die IduIT Extension (siehe Downloads) muss dazu installiert sein
  • Registrierung in der C#-Applications-Klasse
    • Abschließender Schritt, damit das generierte JavaScript auch zur Laufzeit ausgeliefert wird

    • Verwenden Sie dazu (z.B. in der RegisterDefinitionScripts der implementierenden Anwendung): IduIT.Core.PropertyModel.Registrator.RegisterScripts(resourceCollector);

Beispiel-Implementierung einer Datenklasse, Ausstattung mit den entsprechenden PropertyModel Attributen:

    using IduIT.Core.PropertyModel;

    /// <summary>
    /// Beispiel-Klasse
    /// </summary>
    [PropertyModelClass("DbId")]
    public sealed class SampleRecord
    {
	    /// <summary>
	    /// Id in der Datenbank, Autowert
	    /// </summary>
	    [PropertyModelProperty("Id (Autowert)", ReadOnly = true, SortHint = "A")]
	    [Newtonsoft.Json.JsonProperty("dbId")]
	    public int? DbId
	    {
		    get;
		    set;
	    }

	    [PropertyModelProperty("Title", SortHint = "B")]
	    [Newtonsoft.Json.JsonProperty("name")]
	    public String Name
	    {
		    get;
		    set;
	    }

	    /// <summary>
	    /// Eine Geometrie
	    /// </summary>
	    [PropertyModelProperty("Geom", SortHint = "C", ValueHandlerType = typeof(IduIT.cardo.Core.CoreModules.Mapping.ValueHandler.GeometryValueHandler))]
	    [cardo.Core.CoreModules.Mapping.ValueHandler.GeometryValueHandlerConfig(
		    AllowedGeomtypes = new[] { Core.Geometry.GeometryTypeNames.Polygon, Core.Geometry.GeometryTypeNames.MultiPolygon }

		    )]
	    [Newtonsoft.Json.JsonProperty("geom")]
	    public IduIT.GeoLib.Net.Geometry Geom
	    {
		    get;
		    set;
	    }

	    /// <summary>
	    /// Beschreibung ...
	    /// </summary>
	    [PropertyModelProperty("Beschreibung", SortHint = "D", Description = "Geben Sie hier eine lange Beschreibung an!")]
	    [IduIT.Core.PropertyModel.Format.StringFormat(AllowEmpty = true, Format = IduIT.Core.PropertyModel.Format.StringFormat.MultiLine, Trim = true)]
	    [Newtonsoft.Json.JsonProperty("desc")]
	    public String Desc
	    {
		    get;
		    set;
	    }

	    /// <summary>
	    /// Lookup-Klasse ...
	    /// </summary>
	    [PropertyModelProperty("LU-List", SortHint = "E1", ValueHandlerType = typeof(cardo.Core.CoreModules.BasicEditing.ValueHandler.LookupValueHandler))]
	    [cardo.Core.CoreModules.BasicEditing.ValueHandler.LookupValueHandlerConfiguration(typeof(SampleApplication), LoaderTag = "A")]
	    [Newtonsoft.Json.JsonProperty("luVal")]
	    public int LUValue
	    {
		    get;
		    set;
	    }

	    /// <summary>
	    /// Weitere komplexe Klasse (Cpl = eine Klasse mit PropertyModelClass Attribut)
	    /// </summary>

	    [PropertyModelProperty("Cplx", SortHint = "D")]
	    public Cpl[] Complexe
	    {
		    get;
		    set;
	    }

    }

Spezielle Werte-Behandlungen können durch das Bereitstellen von Implementierungen von IduIT.Core.PropertyModel.ValueHandler.IValueHandlerConfig umgesetzt werden. Die Registrierung der Scripte muss entsprechend erfolgen.

Clientseitige Umsetzung

Im einfachsten Fall kann die Klasse FormEditorForm direkt verwendet werden:

export class Sample extends Kiss.Ui.Core.Component
{
    protected _initComponent(cfg: Kiss.Ui.Core.Component.IComponentConfig): void
    {
        //das Bearbeitungsformular
        this.__form = IduIT.cardo.Core.CoreModules.BasicEditing.FormEditorForm.create({
	        model: SampleRecord.Model,
	        context: null,
	        editObjectInfo: new __InfoUtil(),
	        flex: 1
        });

        //dann die bestehen Daten laden ...
        SampleApplicationRemote.AxGetAll().then(r => 
        {
            this.__form.editContext.view.store.addRange(r);
            //damit die nicht alle "neu" sind!
            this.__form.editContext.changeSet.commit();
           
            //1. Datensatz selektieren
            if (r.length)
            {
                this.__form.editContext.selectionModel.select(r[0);
            }
        }).fail(Cardo4.raise);
    }
}

Die Änderungen an den Daten im Formular werden im changeSet des editContext hinterlegt. Eine Implementierung der Speicher-Funktion könnte bspw. so aussehen:

    private __saveAllRecords(): void
    {
        const editCtx = this.__form.editContext;
        SampleApplicationRemote.AxHandleRecordChanges(
            editCtx.changeSet.created,
            editCtx.changeSet.updated,
            editCtx.changeSet.deleted)
        .done(() =>
        {
	        editCtx.changeSet.commit();					
        })
        .fail(Cardo4.raise);
    }

Zuletzt geändert: 21.03.2024 09:46:21 (erstmals erstellt 12.02.2018)