From c2d31e3a65d22fe501046a49fc304e9fe9f99d7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adina=20=C8=9Aeudan?= Date: Thu, 21 Sep 2023 00:27:43 +0300 Subject: [PATCH] RED-7571: Highlight and autocomplete drools keywords --- .../rules-screen/rules-screen.component.ts | 36 ++++++++++++++- .../red-domain/src/lib/shared/editor.types.ts | 45 +++++++++++++++++++ libs/red-domain/src/lib/shared/index.ts | 1 + 3 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 libs/red-domain/src/lib/shared/editor.types.ts diff --git a/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen/rules-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen/rules-screen.component.ts index a97a56f44..862110d60 100644 --- a/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen/rules-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen/rules-screen.component.ts @@ -3,7 +3,7 @@ import { PermissionsService } from '@services/permissions.service'; import { IconButtonTypes, LoadingService, Toaster } from '@iqser/common-ui'; import { RulesService } from '../../../services/rules.service'; import { firstValueFrom } from 'rxjs'; -import { DOSSIER_TEMPLATE_ID, IRules } from '@red/domain'; +import { DOSSIER_TEMPLATE_ID, DroolsKeywords, IRules } from '@red/domain'; import { EditorThemeService } from '@services/editor-theme.service'; import { ComponentCanDeactivate } from '@guards/can-deactivate.guard'; import { Debounce, getParam } from '@iqser/common-ui/lib/utils'; @@ -80,12 +80,13 @@ export class RulesScreenComponent implements OnInit, ComponentCanDeactivate { await this._initialize(); } - onCodeEditorInit(editor: ICodeEditor) { + async onCodeEditorInit(editor: ICodeEditor): Promise { this._codeEditor = editor; for (const theme of this._editorThemeService.themes) { (window as any).monaco.editor.defineTheme(theme, this._editorThemeService.configurations[theme]); } (window as any).monaco.editor.setTheme(this._editorThemeService.getTheme(true)); + await this._configureSyntaxHighlighting(); this._changeDetectorRef.detectChanges(); } @@ -130,6 +131,37 @@ export class RulesScreenComponent implements OnInit, ComponentCanDeactivate { this._loadingService.stop(); } + private async _configureSyntaxHighlighting() { + const languages = (window as any).monaco.languages.getLanguages(); + const javaLang = languages.find(l => l.id === 'java'); + const { language: config } = await javaLang.loader(); + DroolsKeywords.forEach(k => { + if (!config.keywords.includes(k)) { + config.keywords.push(k); + } + }); + console.log({ config }); + + monaco.languages.registerCompletionItemProvider('java', { + provideCompletionItems: (model, position) => { + const word = model.getWordUntilPosition(position); + const range = { + startLineNumber: position.lineNumber, + endLineNumber: position.lineNumber, + startColumn: word.startColumn, + endColumn: word.endColumn, + }; + const suggestions = config.keywords.map(k => ({ + label: k, + kind: monaco.languages.CompletionItemKind.Keyword, + insertText: k, + range, + })); + return { suggestions }; + }, + }); + } + private _isNew(entry: string): boolean { return this.initialLines.indexOf(entry) < 0 && entry?.trim().length > 0; } diff --git a/libs/red-domain/src/lib/shared/editor.types.ts b/libs/red-domain/src/lib/shared/editor.types.ts new file mode 100644 index 000000000..77fbb0278 --- /dev/null +++ b/libs/red-domain/src/lib/shared/editor.types.ts @@ -0,0 +1,45 @@ +// https://docs.jboss.org/drools/release/5.2.0.Final/drools-expert-docs/html/ch05.html#d0e2854 + +export const DroolsKeywords = [ + 'lock-on-active', + 'date-effective', + 'date-expires', + 'no-loop', + 'auto-focus', + 'activation-group', + 'agenda-group', + 'ruleflow-group', + 'entry-point', + 'duration', + 'package', + 'import', + 'dialect', + 'salience', + 'enabled', + 'attributes', + 'rule', + 'extend', + 'when', + 'then', + 'template', + 'query', + 'declare', + 'function', + 'global', + 'eval', + 'not', + 'in', + 'or', + 'and', + 'exists', + 'forall', + 'accumulate', + 'collect', + 'from', + 'action', + 'reverse', + 'result', + 'end', + 'over', + 'init', +]; diff --git a/libs/red-domain/src/lib/shared/index.ts b/libs/red-domain/src/lib/shared/index.ts index b6973f8bf..8406e4be7 100644 --- a/libs/red-domain/src/lib/shared/index.ts +++ b/libs/red-domain/src/lib/shared/index.ts @@ -12,3 +12,4 @@ export * from './charts'; export * from './app-config'; export * from './system-preferences'; export * from './component-rules'; +export * from './editor.types';