← Back to Empire Docs

TGrapeJSEditor Component

TMS Web Core wrapper for GrapeJS visual HTML/CSS editor. Integrates with the CSS Database System via TAPIDataset for loading and saving templates.

TMS Web Core GrapeJS PostgreSQL Visual Editor

Overview

TGrapeJSEditor embeds the GrapeJS visual page builder directly into your TMS Web Core application. It provides:

Installation

The component is registered in the Framework Core palette. Drop it onto your form and configure the dataset properties.

Properties

PropertyTypeDescription
TemplateIdInt64Current template ID for load/save operations
APILoadDatasetTAPIDatasetDataset for website.gettemplate()
APISaveDatasetTAPIDatasetDataset for website.updatetemplate()
APIClearCssDatasetTAPIDatasetDataset for css.cleartemplatecss()
APIImportCssDatasetTAPIDatasetDataset for css.importgrapejscss()
APIDeleteDatasetTAPIDatasetDataset for template deletion
APIUpdateDatasetTAPIDatasetDataset for template updates
AutoSaveBooleanEnable auto-save (default: False)
AutoSaveIntervalIntegerAuto-save interval in ms (default: 30000)
ShowDevicesBooleanShow device switcher (default: True)
ShowLayersBooleanShow layers panel (default: True)
ShowBlocksBooleanShow blocks panel (default: True)
ShowStylesBooleanShow styles panel (default: True)
ShowTraitsBooleanShow traits panel (default: True)

Events

EventSignatureDescription
OnEditorLoadedprocedure(Sender: TGrapeJSEditor)Fired when GrapeJS initializes
OnSaveprocedure(Sender: TGrapeJSEditor; const Html, Css: string; CssRulesJson: TJSObject)Fired after successful save
OnChangeprocedure(Sender: TGrapeJSEditor)Fired on any editor change
OnErrorprocedure(Sender: TGrapeJSEditor; const ErrorMessage: string)Fired on errors

Methods

MethodDescription
InitEditorInitialize GrapeJS (call after form loads)
LoadTemplate(TemplateId: Int64)Load template from database
SaveTemplateSave current content to database
SetContent(Html, Css: string)Set editor content directly
GetHtml: stringGet current HTML
GetCss: stringGet current CSS as text
GetCssAsJson: TJSObjectGet CSS as JSON array (for database import)
ClearEditorClear all content
UndoUndo last action
RedoRedo last undone action

Usage Example

PROCEDURE TfrmEditor.WebFormShow(Sender: TObject);
BEGIN
   GrapeJSEditor1.InitEditor;
END;

PROCEDURE TfrmEditor.GrapeJSEditor1EditorLoaded(Sender: TGrapeJSEditor);
BEGIN
   // Editor ready - load a template
   GrapeJSEditor1.LoadTemplate(123);
END;

PROCEDURE TfrmEditor.btnSaveClick(Sender: TObject);
BEGIN
   GrapeJSEditor1.SaveTemplate;
END;

PROCEDURE TfrmEditor.GrapeJSEditor1Save(Sender: TGrapeJSEditor; 
   CONST Html, Css: STRING; CssRulesJson: TJSObject);
BEGIN
   ShowMessage('Template saved successfully');
END;

PROCEDURE TfrmEditor.GrapeJSEditor1Error(Sender: TGrapeJSEditor; 
   CONST ErrorMessage: STRING);
BEGIN
   ShowMessage('Error: ' + ErrorMessage);
END;

Dataset Configuration

APILoadDataset

Should call website.gettemplate(fktemplateid_)

API: website.gettemplate
Parameters:
  - fktemplateid_ (Integer)

APIClearCssDataset

Should call css.cleartemplatecss(fktemplateid_, keepinherited_)

API: css.cleartemplatecss
Parameters:
  - fktemplateid_ (Integer)
  - keepinherited_ (Boolean) - typically True

APIImportCssDataset

Should call css.importgrapejscss(fktemplateid_, cssrules_)

API: css.importgrapejscss
Parameters:
  - fktemplateid_ (Integer)
  - cssrules_ (String - JSON array)

Save Flow

  1. User calls SaveTemplate
  2. Component extracts CSS rules from GrapeJS as JSON
  3. Calls css.cleartemplatecss() to remove existing CSS
  4. Calls css.importgrapejscss() with new CSS rules
  5. Fires OnSave event on success

Load Flow

  1. User calls LoadTemplate(TemplateId)
  2. Component calls website.gettemplate()
  3. Parses returned JSON including CSS bindings
  4. Reconstructs CSS text from bindings
  5. Sets HTML and CSS into GrapeJS editor

CSS JSON Format

The component extracts CSS in this format for database import:

[
  {
    "selector": ".card",
    "priority": 1,
    "mediaQuery": null,
    "properties": [
      {"name": "background-color", "value": "#ffffff", "important": false},
      {"name": "border-radius", "value": "8px", "important": false}
    ]
  },
  {
    "selector": ".card:hover",
    "priority": 2,
    "mediaQuery": null,
    "properties": [
      {"name": "box-shadow", "value": "0 4px 12px rgba(0,0,0,0.1)", "important": false}
    ]
  }
]

Related Documentation