Theme
arya
luna-amber
luna-blue
luna-green
luna-pink
nova-dark
nova-light
saga
vela
MonacoEditor
The Monaco Editor is the code editor which powers VS Code, with the features better described here.

The editor provides a rich coding experience with IntelliSense and validation for a few select languages, namely JavaScript/TypeScript, CSS / LESS /SCSS, and JSON; including but not limited to syntax highlighting, code completion and refactoring. Furthermore, basic support such as syntax highlighting is available for many mor languages, see the list below.

It also supports localization and comes with support for a few major languages out-of-the-box.
MonacoEditor(VSCode logo) This component is a wrapper that allows Monaco Editor to be used as a JSF component.

The monaco editor library is developed by Microsoft and released under a MIT License. You can find their official GitHub repo here.

The Monaco Editor component has been developed with customizability in mind. You can specify and extender to configure the editor via custom JavaScript in any way you like via the official client-side API. This JSF component comes in four varieties:
  • The pe:monacoEditor renders the editor inline in the page where you include it. This is usually more efficient and the preferred way when you do not need different editors with a different global configuration.
  • The pe:monacoEditorFramed renders the editor in an iframe for improved encapsulation. Part of the Monaco Editor configuration is window global, such as the loaded TypeScript declaration files for improved JavaScript IntelliSense. If you wish to use multiple editors with a completely different setup, consider using the framed variant.
  • The pe:monacoDiffEditor renders a diff editor for comparing two files inline in the page where you include it. This is usually more efficient and the preferred way when you do not need different editors with a different global configuration.
  • The pe:monacoDiffEditorFramed renders a diff editor for comparing two files in an iframe for improved encapsulation. Part of the Monaco Editor configuration is window global, such as the loaded TypeScript declaration files for improved JavaScript IntelliSense. If you wish to use multiple editors with a completely different setup, consider using the framed variant.
All variants share almost the same API with a few minor differences regarding a few client-side widget methods and how you specifiy the extender. The diff editor has some additional properties for the the settings of the original (left) editor against which the value is compared. As the framed variant runs inside an iframe, all interactions with the editor is handled via postMessage and thus neccesarily asynchronous. The API makes heavy use of Promises.

While PrimeFaces extensions does not have TypeScript declarations in general yet, the client side API of this component is fully typed and checked against the PrimeFaces type: primefaces-monaco-global.d.ts, primefaces-monaco-module.d.ts

Note that this is a code editor, not at all unlike CodeMirror. Especially for the languages with IntelliSense support (see above) this editor can provide a fuller and more pleasing experience. However, there are a few things to keep in mind:
  • Microsoft's statement regarding IE support: The Monaco Editor no longer supports IE 11. The last version that was tested on IE 11 is 0.18.1.
  • It is assumed that users are using a browser with support for the Promise API. Every browser other than IE, which is unsupported anyways, now supports Promises. When for some reason support for the Promise API should not be available, you can simply include an appropriate polyfill. While untested, it may also be possible to support IE 11 this way.
  • Also, the Monaco editor is not supported in mobile browsers or mobile web frameworks. In practice this means there is not dedicated user interface for small screens or special controls for entering code on mobile devices. A larger tablet with an external keyboard and possibly a mouse should work just fine, but make sure you test your use-case scenario.
Basic support including syntax highlighting is available for the following languages:
(but also check the official docs, more languages may have been added in the mean time)
  • abap
  • aes
  • apex
  • azcli
  • bat
  • bicep
  • c
  • cameligo
  • clojure
  • coffeescript
  • cpp
  • csharp
  • csp
  • css
  • cypher
  • dart
  • dockerfile
  • ecl
  • elixir
  • flow9
  • freemarker2
  • freemarker2.tag-angle.interpolation-bracket
  • freemarker2.tag-angle.interpolation-dollar
  • freemarker2.tag-auto.interpolation-bracket
  • freemarker2.tag-auto.interpolation-dollar
  • freemarker2.tag-bracket.interpolation-bracket
  • freemarker2.tag-bracket.interpolation-dollar
  • fsharp
  • go
  • graphql
  • handlebars
  • hcl
  • html
  • ini
  • java
  • javascript
  • json
  • julia
  • kotlin
  • less
  • lexon
  • liquid
  • lua
  • m3
  • markdown
  • mdx
  • mips
  • msdax
  • mysql
  • objective-c
  • pascal
  • pascaligo
  • perl
  • pgsql
  • php
  • pla
  • plaintext
  • postiats
  • powerquery
  • powershell
  • proto
  • pug
  • python
  • qsharp
  • r
  • razor
  • redis
  • redshift
  • restructuredtext
  • ruby
  • rust
  • sb
  • scala
  • scheme
  • scss
  • shell
  • sol
  • sparql
  • sql
  • st
  • swift
  • systemverilog
  • tcl
  • twig
  • typescript
  • typespec
  • vb
  • verilog
  • xml
  • yaml
Components and more
Documentation pe:monacoEditor
Attributes (move mouse over the names to see data types)
Name Description
id Unique identifier of the component in a naming container.
rendered Boolean value to specify the rendering of the component, when set to false component will not be rendered.
style CSS style(s) to be applied when this component is rendered.
styleClass Space-separated list of CSS style class(es) to be applied when this element is rendered. This value is passed through as the "class" attribute to the generated markup.
binding An EL expression referring to a server side UIComponent instance in a backing bean.
widgetVar Name of the client side widget.
value Value of the component.
readonly Defines if the editor is readonly. This option makes the UI not editable, but still accepts values that are submitted (e.g. when the editor value was changed via JavaScript). Use disabled if submitted values should not be accepted.
disabled Defines if the editor is disabled. This option does not accept a value to be submitted and ensures the model values stays the same (server validation).
placeholder Sets a placeholder for the editor. If set, the placeholder is shown if the editor is empty.
tabindex The tab index to assign to the editor. If not given, no tab index will be assigned.
converter An EL expression or a literal text that defines a converter for the component. When it's an EL expression, it's resolved to a converter instance. In case it's a static text, it must refer to a converter id.
required Marks component as required.
requiredMessage Message to display when required field validation fails.
converterMessage Message to display when conversion fails.
validatorMessage Message to display when validation fails.
validator A method expression referring to a method validating the input.
onfocus Client side callback when the editor area receives focus.
onblur Client side callback when the editor area loses focus.
onchange Client side callback when the editor content changes.
oninitialized Client side callback when the editor was rendered.
onpaste Client side callback when text was pasted into the editor.
onmousedown Client side callback when a mousedown event was triggered on the editor area.
onmousemove Client side callback when a mousemove event was triggered on the editor area.
onmouseup Client side callback when a mouseup event was triggered on the editor area.
onkeyup Client side callback when a keyup event was triggered on the editor area.
onkeydown Client side callback when a keydown event was triggered on the editor area.
onkeypress Client side callback when a keypress (onDidType) event was triggered on the editor area.
customThemes Allows you to register custom themes with the editor via Java. This must be a Map<String, org.primefaces.extensions.model.monacoeditor.EditorStandaloneTheme>. It maps between the name of the theme and the styling data for that theme. You can then specify the theme name for the theme option in the editorOptions.
locale Locale for the user interface. Can be either a java.util.Locale object or a string with the locale code. Built-in languages are "cs", "de", "en", "es", "fr", "it", "ja", "ko", "pl", "pt_BR", "ru", "tr", "zh_CN", and "zh_TW". To use a custom language or translation, you can specify a language file with custom translations via the option localeUrl.
localeUrl For custom language files. If given, this is used instead of the built-in language files. This URL must point to a JavaScript file that, when executed, adds the localization to window.MonacoEnvironment.Locale["LOCALE_CODE"], where LOCALE_CODE is the value you set for locale. See the language file the widget downloads (when locale is not set to English) for an example and all available messages that need to be translated.
extender

An extender object to further customize the monaco editor via JavaScript. This can be either:

  • unset, in which case no further customization is performed
  • or a JavaScript expression that evaluates to an extender object
The extender object may have one or more of the following optional properties:
  • beforeCreate(editorWidget, options). Called before the monaco editor is created. It is passed the current options object that would be used to initialize the monaco editor. If this callback does not return a value, the options are used as they were passed to the callback. The callback is allowed to modify the passed options object. If the callback returns an options object, that options object is used instead. If it returns a thenable/Promise, the monaco editor is created only once the Promise resolves (successfully). If the Promise resolves with an options object, that options object is used to create the editor. See IStandaloneEditorConstructionOptions for all editor options.
  • afterCreate(editorWidget). Called after the editor was created.
  • beforeDestroy(editorWidget). Called before the editor is destroyed, e.g. when updating a component via AJAX.
  • afterDestroy(editorWidget). Called after the editor is destroyed, e.g. when updating a component via AJAX. Note that editorWidget.getMonaco() now returns undefined.
  • createModel(editorWidget, options). Called when a model needs to retrieved or created. The options contain value (current value that should be set on the model by the extender), url (default URL that was determined for the model), language (requested code language), and editorOptions (monaco editor constructor options). Should return the model. When it returns nothing, the default mechanism for creating a model is used. Note that editorWidget.getMonaco() returns undefined as the monaco editor was not created yet.
  • createEditorOverrideServices(editorWidget, options). Called when the monaco editor is created. May return an object with services that should be overriden. See here on GitHub for details on the available services. The options are the editor constructor options that will be used to create the editor, they are readonly and must not be changed.
  • createWorker(editorWidget, moduleId, label). Called when a worker for additional language support needs to be created. By default, monaco editor ships with the workers for JSON, CSS, HTML, and TYPESCRIPT. The label is the name of the language, e.g. css or javascript. Must return the worker to be used for the given language. Note that editorWidget.getMonaco() returns undefined as the monaco editor was not created yet.
scheme The monaco editor requires a unique URI for an opened model (i.e. the code currently being edited). This is the scheme (protocol) for that URI. Defaults to inmemory.
directory The monaco editor requires a unique URI for an opened model (i.e. the code currently being edited). This is the directory (path) for that URI, with parts separated by slashes. If not given, it is taken from the client ID of this component.
basename The monaco editor requires a unique URI for an opened model (i.e. the code currently being edited). This is the basename for that URI, without the extension. If not given, default to 'file'.
extension The monaco editor requires a unique URI for an opened model (i.e. the code currently being edited). This is the extension for that URI, with or without the period. If not given, it is inferred from the (code) language.
width Width of the editor with CSS units, set as an inline style. For example 500px or 100%/code>. Set this to the empty string in case you want to size the editor via CSS.
height Height of the editor with CSS units, set as an inline style. For example 500px or 100%/code>. Set this to the empty string in case you want to size the editor via CSS.
editorOptions Options for the Monaco code editor. This is a simple wrapper around the JavaScript API, see IEditorConstructionOptions The code language can be set via the EditorOptions#setLanguage option.
autoResize If true, resizes the editor automatically when the iframe element changes its size. Please note that this makes uses of the new ResizeObserver API and works only in newer browers. This widget checks whether ResizeObserver API is available, and when it is not, no resizing is performed. To support resizing for older browsers, search for a ResizeObserver polyfill. If you know when the size of the editor conainer could have changed, you can resize the editor manually via PF("editorWidgetVar").layout()
overflowWidgetsDomNode A PrimeFaces search expression of a component. Places overflow widgets inside an external DOM node. Defaults to an internal DOM node when not given. May be useful when the editor is used inside an element obscured by other components. You can, for example, append the overflow widget to the body. Note 1: you probably also need to set fixedOverflowWidgets on the editor options for this to work. Note 2: For now, you either need to add the CSS class monaco-editor to the container to style the overflow widgets properly, or add the appropriate CSS yourself. Note 3: As of monaco-editor 0.27.0, this option has several issues with event handling, use at your own risk. This will most likely be fixed in a later version of monaco-editor.
PrimeFaces Extensions Showcase - © 2011-2023,PrimeFaces: 14.0.5,PrimeFaces Extensions: 14.0.5,JSF: Apache MyFaces JSF-2.3 Core Impl 2.3.10,Server: jetty/9.4.36.v20210114,Build time: 2024-09-10 21:01