Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'doc/development/fe_guide/editor_lite.md')
-rw-r--r--doc/development/fe_guide/editor_lite.md265
1 files changed, 5 insertions, 260 deletions
diff --git a/doc/development/fe_guide/editor_lite.md b/doc/development/fe_guide/editor_lite.md
index f28588c23e9..5020bf9eeeb 100644
--- a/doc/development/fe_guide/editor_lite.md
+++ b/doc/development/fe_guide/editor_lite.md
@@ -1,264 +1,9 @@
---
-stage: Create
-group: Editor
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+redirect_to: 'source_editor.md'
+remove_date: '2021-09-19'
---
-# Editor Lite **(FREE)**
+This document was moved to [another location](source_editor.md).
-**Editor Lite** provides the editing experience at GitLab. This thin wrapper around
-[the Monaco editor](https://microsoft.github.io/monaco-editor/) provides necessary
-helpers and abstractions, and extends Monaco [using extensions](#extensions). Multiple
-GitLab features use it, including:
-
-- [Web IDE](../../user/project/web_ide/index.md)
-- [CI Linter](../../ci/lint.md)
-- [Snippets](../../user/snippets.md)
-- [Web Editor](../../user/project/repository/web_editor.md)
-- [Security Policies](../../user/application_security/threat_monitoring/index.md)
-
-## How to use Editor Lite
-
-Editor Lite is framework-agnostic and can be used in any application, including both
-Rails and Vue. To help with integration, we have the dedicated `<editor-lite>`
-Vue component, but the integration of Editor Lite is generally straightforward:
-
-1. Import Editor Lite:
-
- ```javascript
- import EditorLite from '~/editor/editor_lite';
- ```
-
-1. Initialize global editor for the view:
-
- ```javascript
- const editor = new EditorLite({
- // Editor Options.
- // The list of all accepted options can be found at
- // https://microsoft.github.io/monaco-editor/api/enums/monaco.editor.editoroption.html
- });
- ```
-
-1. Create an editor's instance:
-
- ```javascript
- editor.createInstance({
- // Editor Lite configuration options.
- })
- ```
-
-An instance of Editor Lite accepts the following configuration options:
-
-| Option | Required? | Description |
-| -------------- | ------- | ---- |
-| `el` | `true` | `HTML Node`: The element on which to render the editor. |
-| `blobPath` | `false` | `String`: The name of a file to render in the editor, used to identify the correct syntax highlighter to use with that file, or another file type. Can accept wildcards like `*.js` when the actual filename isn't known or doesn't play any role. |
-| `blobContent` | `false` | `String`: The initial content to render in the editor. |
-| `extensions` | `false` | `Array`: Extensions to use in this instance. |
-| `blobGlobalId` | `false` | `String`: An auto-generated property.<br>**Note:** This property may go away in the future. Do not pass `blobGlobalId` unless you know what you're doing.|
-| Editor Options | `false` | `Object(s)`: Any property outside of the list above is treated as an Editor Option for this particular instance. Use this field to override global Editor Options on the instance level. A full [index of Editor Options](https://microsoft.github.io/monaco-editor/api/enums/monaco.editor.editoroption.html) is available. |
-
-## API
-
-The editor uses the same public API as
-[provided by Monaco editor](https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.istandalonecodeeditor.html)
-with additional functions on the instance level:
-
-| Function | Arguments | Description
-| --------------------- | ----- | ----- |
-| `updateModelLanguage` | `path`: String | Updates the instance's syntax highlighting to follow the extension of the passed `path`. Available only on the instance level.|
-| `use` | Array of objects | Array of extensions to apply to the instance. Accepts only the array of _objects_. You must fetch the extensions' ES6 modules must be fetched and resolved in your views or components before they are passed to `use`. This property is available on _instance_ (applies extension to this particular instance) and _global editor_ (applies the same extension to all instances) levels. |
-| Monaco Editor options | See [documentation](https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.istandalonecodeeditor.html) | Default Monaco editor options |
-
-## Tips
-
-1. Editor's loading state.
-
- The loading state is built in to Editor Lite, making spinners and loaders
- rarely needed in HTML. To benefit the built-in loading state, set the `data-editor-loading`
- property on the HTML element that should contain the editor. When bootstrapping,
- Editor Lite shows the loader automatically.
-
- ![Editor Lite: loading state](img/editor_lite_loading.png)
-
-1. Update syntax highlighting if the filename changes.
-
- ```javascript
- // fileNameEl here is the HTML input element that contains the file name
- fileNameEl.addEventListener('change', () => {
- this.editor.updateModelLanguage(fileNameEl.value);
- });
- ```
-
-1. Get the editor's content.
-
- We may set up listeners on the editor for every change, but it rapidly can become
- an expensive operation. Instead, get the editor's content when it's needed.
- For example, on a form's submission:
-
- ```javascript
- form.addEventListener('submit', () => {
- my_content_variable = this.editor.getValue();
- });
- ```
-
-1. Performance
-
- Even though Editor Lite itself is extremely slim, it still depends on Monaco editor,
- which adds weight. Every time you add Editor Lite to a view, the JavaScript bundle's
- size significantly increases, affecting your view's loading performance. We recommend
- you import the editor on demand if either:
-
- - You're uncertain if the view needs the editor.
- - The editor is a secondary element of the view.
-
- Loading Editor Lite on demand is handled like loading any other module:
-
- ```javascript
- someActionFunction() {
- import(/* webpackChunkName: 'EditorLite' */ '~/editor/editor_lite').
- then(({ default: EditorLite }) => {
- const editor = new EditorLite();
- ...
- });
- ...
- }
- ```
-
-## Extensions
-
-Editor Lite provides a universal, extensible editing tool to the whole product,
-and doesn't depend on any particular group. Even though the Editor Lite's core is owned by
-[Create::Editor FE Team](https://about.gitlab.com/handbook/engineering/development/dev/create-editor/),
-any group can own the extensions—the main functional elements. The goal of
-Editor Lite extensions is to keep the editor's core slim and stable. Any
-needed features can be added as extensions to this core. Any group can
-build and own new editing features without worrying about changes to Editor Lite
-breaking or overriding them.
-
-You can depend on other modules in your extensions. This organization helps keep
-the size of Editor Lite's core at bay by importing dependencies only when needed.
-
-Structurally, the complete implementation of Editor Lite can be presented as this diagram:
-
-```mermaid
-graph TD;
- B[Extension 1]---A[Editor Lite]
- C[Extension 2]---A[Editor Lite]
- D[Extension 3]---A[Editor Lite]
- E[...]---A[Editor Lite]
- F[Extension N]---A[Editor Lite]
- A[Editor Lite]---Z[Monaco]
-```
-
-An extension is an ES6 module that exports a JavaScript object:
-
-```javascript
-import { Position } from 'monaco-editor';
-
-export default {
- navigateFileStart() {
- this.setPosition(new Position(1, 1));
- },
-};
-
-```
-
-In the extension's functions, `this` refers to the current Editor Lite instance.
-Using `this`, you get access to the complete instance's API, such as the
-`setPosition()` method in this particular case.
-
-### Using an existing extension
-
-Adding an extension to Editor Lite's instance requires the following steps:
-
-```javascript
-import EditorLite from '~/editor/editor_lite';
-import MyExtension from '~/my_extension';
-
-const editor = new EditorLite().createInstance({
- ...
-});
-editor.use(MyExtension);
-```
-
-### Creating an extension
-
-Let's create our first Editor Lite extension. Extensions are
-[ES6 modules](https://hacks.mozilla.org/2015/08/es6-in-depth-modules/) exporting a
-basic `Object`, used to extend Editor Lite's features. As a test, let's
-create an extension that extends Editor Lite with a new function that, when called,
-outputs the editor's content in `alert`.
-
-`~/my_folder/my_fancy_extension.js:`
-
-```javascript
-export default {
- throwContentAtMe() {
- alert(this.getValue());
- },
-};
-```
-
-In the code example, `this` refers to the instance. By referring to the instance,
-we can access the complete underlying
-[Monaco editor API](https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.istandalonecodeeditor.html),
-which includes functions like `getValue()`.
-
-Now let's use our extension:
-
-`~/my_folder/component_bundle.js`:
-
-```javascript
-import EditorLite from '~/editor/editor_lite';
-import MyFancyExtension from './my_fancy_extension';
-
-const editor = new EditorLite().createInstance({
- ...
-});
-editor.use(MyFancyExtension);
-...
-someButton.addEventListener('click', () => {
- editor.throwContentAtMe();
-});
-```
-
-First of all, we import Editor Lite and our new extension. Then we create the
-editor and its instance. By default Editor Lite has no `throwContentAtMe` method.
-But the `editor.use(MyFancyExtension)` line brings that method to our instance.
-After that, we can use it any time we need it. In this case, we call it when some
-theoretical button has been clicked.
-
-This script would result in an alert containing the editor's content when `someButton` is clicked.
-
-![Editor Lite new extension's result](img/editor_lite_create_ext.png)
-
-### Tips
-
-1. Performance
-
- Just like Editor Lite itself, any extension can be loaded on demand to not harm
- loading performance of the views:
-
- ```javascript
- const EditorPromise = import(
- /* webpackChunkName: 'EditorLite' */ '~/editor/editor_lite'
- );
- const MarkdownExtensionPromise = import('~/editor/editor_markdown_ext');
-
- Promise.all([EditorPromise, MarkdownExtensionPromise])
- .then(([{ default: EditorLite }, { default: MarkdownExtension }]) => {
- const editor = new EditorLite().createInstance({
- ...
- });
- editor.use(MarkdownExtension);
- });
- ```
-
-1. Using multiple extensions
-
- Just pass the array of extensions to your `use` method:
-
- ```javascript
- editor.use([FileTemplateExtension, MyFancyExtension]);
- ```
+<!-- This redirect file can be deleted after <2021-09-19>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->