From 9de203511b13073d0d9bd591f0a6ab462f002651 Mon Sep 17 00:00:00 2001 From: StanZGenchev Date: Tue, 24 Mar 2026 00:01:52 +0200 Subject: [PATCH 1/7] Fixed #5782 and #5783 Signed-off-by: StanZGenchev --- .../editor-monaco/css/embeddable.css | 5 + .../editor-monaco/embeddable/editor.js | 4 +- .../dirigible/editor-monaco/js/editor.js | 13 ++ .../view-configurations/configurations.html | 118 ++++++++++++++---- .../META-INF/dirigible/view-git/js/local.js | 4 +- pom.xml | 2 +- 6 files changed, 115 insertions(+), 31 deletions(-) diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/css/embeddable.css b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/css/embeddable.css index e600c97ed81..76518d090e2 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/css/embeddable.css +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/css/embeddable.css @@ -2,4 +2,9 @@ font-family: codicon; font-display: block; src: url("/webjars/monaco-editor/min/vs/base/browser/ui/codicons/codicon/codicon.ttf") format("truetype"); +} + +.monaco-editor, +.monaco-editor * { + font-family: "Droid Sans Mono", "Consolas", "Menlo", "Monaco", "Liberation Mono", "Courier New", "monospace", monospace; } \ No newline at end of file diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/embeddable/editor.js b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/embeddable/editor.js index 3dbf16046a1..28c98cb8ccf 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/embeddable/editor.js +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/embeddable/editor.js @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025 Eclipse Dirigible contributors + * Copyright (c) 2026 Eclipse Dirigible contributors * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v2.0 @@ -101,6 +101,8 @@ angular.module('codeEditor', ['platformTheming']).directive('codeEditor', (Theme automaticLayout: true, language: scope.codeLang || 'javascript', readOnly: scope.readOnly ? true : false, + fontFamily: 'Droid Sans Mono, Consolas, Menlo, Monaco, Liberation Mono, Courier New, monospace', + fontSize: 14, }); const model = codeEditor.getModel(); diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js index 3af96a63128..ee5c7919b3e 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js @@ -1,3 +1,14 @@ +/* + * Copyright (c) 2026 Eclipse Dirigible contributors + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v20.html + * + * SPDX-FileCopyrightText: Eclipse Dirigible contributors + * SPDX-License-Identifier: EPL-2.0 + */ const WORKSPACE_API = "/services/ide/workspaces"; const REPOSITORY_API = "/services/core/repository"; const REGISTRY_API = "/services/core/repository/registry/public"; @@ -624,6 +635,8 @@ class DirigibleEditor { value: '', automaticLayout: true, readOnly: readOnly, + fontFamily: 'Droid Sans Mono, Consolas, Menlo, Monaco, Liberation Mono, Courier New, monospace', + fontSize: 14, autoClosingBrackets: DirigibleEditor.isAutoBracketsEnabled(), renderWhitespace: DirigibleEditor.getRenderWhitespace(), wordWrap: DirigibleEditor.getWordWrap(), diff --git a/components/ui/view-configurations/src/main/resources/META-INF/dirigible/view-configurations/configurations.html b/components/ui/view-configurations/src/main/resources/META-INF/dirigible/view-configurations/configurations.html index 6249ab517df..2feaecccd94 100644 --- a/components/ui/view-configurations/src/main/resources/META-INF/dirigible/view-configurations/configurations.html +++ b/components/ui/view-configurations/src/main/resources/META-INF/dirigible/view-configurations/configurations.html @@ -1,6 +1,6 @@ - 1.8.10 + 1.8.11 11.18.2 4.4.3 1.15.7 From c3b650040e19ad996e616d42bd8e9c27eef6f75b Mon Sep 17 00:00:00 2001 From: StanZGenchev Date: Tue, 24 Mar 2026 14:18:08 +0200 Subject: [PATCH 2/7] Extended configurations view search to all values Signed-off-by: StanZGenchev --- .../META-INF/dirigible/view-configurations/configurations.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/components/ui/view-configurations/src/main/resources/META-INF/dirigible/view-configurations/configurations.html b/components/ui/view-configurations/src/main/resources/META-INF/dirigible/view-configurations/configurations.html index 2feaecccd94..635ac126979 100644 --- a/components/ui/view-configurations/src/main/resources/META-INF/dirigible/view-configurations/configurations.html +++ b/components/ui/view-configurations/src/main/resources/META-INF/dirigible/view-configurations/configurations.html @@ -86,7 +86,8 @@ } to = $timeout(() => { for (let i = 0; i < $scope.configurations.length; i++) { - if ($scope.configurations[i].name.toLowerCase().includes($scope.searchField.text.toLowerCase())) { + const allValues = Object.values($scope.configurations[i]).join('').toLowerCase(); + if (allValues.includes($scope.searchField.text.toLowerCase())) { $scope.configurations[i].hidden = false; } else { $scope.configurations[i].hidden = true; From 022d526d4b13d88cf440dc371c2c118a6325dd89 Mon Sep 17 00:00:00 2001 From: StanZGenchev Date: Tue, 24 Mar 2026 16:02:19 +0200 Subject: [PATCH 3/7] Made the search bar always visible in configurations view Signed-off-by: StanZGenchev --- .../view-configurations/configurations.html | 22 +++++-------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/components/ui/view-configurations/src/main/resources/META-INF/dirigible/view-configurations/configurations.html b/components/ui/view-configurations/src/main/resources/META-INF/dirigible/view-configurations/configurations.html index 635ac126979..f95ad44d112 100644 --- a/components/ui/view-configurations/src/main/resources/META-INF/dirigible/view-configurations/configurations.html +++ b/components/ui/view-configurations/src/main/resources/META-INF/dirigible/view-configurations/configurations.html @@ -23,7 +23,7 @@ - +
@@ -48,19 +48,15 @@
- + - - - - + + + + + +

Name

+

The feed name determines the scope variable to which the response value is assigned. +

For example, if the feed name is extraData, the corresponding variable will be available as $scope.extraData. + Within the Designer tab, this variable can be referenced without the $scope. prefix.

+

To assign the response data directly to the model, set the feed name to model.

+ +

URL

+

This field specifies the URL of your back-end service. If the URL is dynamic, you can use a template literal (${}) to interpolate variable values or invoke + functions.

+

For example, if the URL is defined as:

+ /path/to/service/${someId}/ +

and a variable is declared in the Code tab as:

+ const someId = '1'; +

then the resulting request URL will be:

+ /path/to/service/1/ + +

Function

+

Specifying a function name is optional.

+

If you need to modify the response data before it is assigned to the target variable, you can provide a function name here. Then, define a corresponding function in the Code tab. This function must accept + the response data as its first parameter, apply any necessary transformations, and return the updated result for assignment.

+

For example, if the function name is set to:

+ printResponse +

the function should be defined as:

+
function printResponse(data) {
+    console.log(data);
+    return data;
+}
+ + + + + + diff --git a/components/ui/editor-form-builder/src/main/resources/META-INF/dirigible/editor-form-builder/editor.html b/components/ui/editor-form-builder/src/main/resources/META-INF/dirigible/editor-form-builder/editor.html index 3789af5b869..5d21882a6c3 100644 --- a/components/ui/editor-form-builder/src/main/resources/META-INF/dirigible/editor-form-builder/editor.html +++ b/components/ui/editor-form-builder/src/main/resources/META-INF/dirigible/editor-form-builder/editor.html @@ -174,6 +174,7 @@

+ @@ -181,6 +182,7 @@

+ @@ -191,6 +193,7 @@

+
Name URLFunction
{{feed.name}} {{feed.url}}{{feed.func}} diff --git a/components/ui/editor-form-builder/src/main/resources/META-INF/dirigible/editor-form-builder/extensions/help-window.extension b/components/ui/editor-form-builder/src/main/resources/META-INF/dirigible/editor-form-builder/extensions/help-window.extension new file mode 100644 index 00000000000..90f1a406be4 --- /dev/null +++ b/components/ui/editor-form-builder/src/main/resources/META-INF/dirigible/editor-form-builder/extensions/help-window.extension @@ -0,0 +1,5 @@ +{ + "module": "editor-form-builder/configs/help-window.js", + "extensionPoint": "platform-windows", + "description": "Feeds help window" +} \ No newline at end of file diff --git a/components/ui/editor-form-builder/src/main/resources/META-INF/dirigible/editor-form-builder/js/editor.js b/components/ui/editor-form-builder/src/main/resources/META-INF/dirigible/editor-form-builder/js/editor.js index 4c68fa86341..5dc993603e8 100644 --- a/components/ui/editor-form-builder/src/main/resources/META-INF/dirigible/editor-form-builder/js/editor.js +++ b/components/ui/editor-form-builder/src/main/resources/META-INF/dirigible/editor-form-builder/js/editor.js @@ -1871,6 +1871,14 @@ editorView.controller('DesignerController', ($scope, $window, $document, $timeou minlength: 1, required: true }, + 'afFunc': { + label: 'Function Name', + controlType: 'input', + placeholder: '', + type: 'text', + minlength: 1, + required: false + }, }, submitLabel: 'Add', cancelLabel: 'Cancel' @@ -1879,7 +1887,8 @@ editorView.controller('DesignerController', ($scope, $window, $document, $timeou $scope.$evalAsync(() => { $scope.formData.feeds.push({ name: form['afName'], - url: form['afUrl'] + url: form['afUrl'], + func: form['afFunc'] }); $scope.fileChanged(); }); @@ -1918,6 +1927,15 @@ editorView.controller('DesignerController', ($scope, $window, $document, $timeou value: feed.url, required: true }, + 'afFunc': { + label: 'Function Name', + controlType: 'input', + placeholder: '', + type: 'text', + minlength: 1, + value: feed.func, + required: false + }, }, submitLabel: 'Save', cancelLabel: 'Cancel' @@ -1926,6 +1944,7 @@ editorView.controller('DesignerController', ($scope, $window, $document, $timeou $scope.$evalAsync(() => { feed.name = form['afName']; feed.url = form['afUrl']; + feed.func = form['afFunc']; $scope.fileChanged(); }); } @@ -2059,6 +2078,12 @@ editorView.controller('DesignerController', ($scope, $window, $document, $timeou $scope.selectedTab = tabId; }; + $scope.feedHelp = () => { + dialogHub.showWindow({ + id: 'formBuilderHelp' + }); + }; + const createDomFromJson = (model, containerId) => { for (let i = 0; i < model.length; i++) { let control; From c7395a28a1142f57021c277e5414343ab5a6f2db Mon Sep 17 00:00:00 2001 From: StanGenchev <82379274+StanZGenchev@users.noreply.github.com> Date: Wed, 25 Mar 2026 13:06:17 +0200 Subject: [PATCH 6/7] Fixed #5790 (#5791) Signed-off-by: StanZGenchev --- .../dirigible/view-import/js/import.js | 76 ++++++++++--------- .../dirigible/view-projects/js/projects.js | 16 ++++ .../dirigible/view-projects/projects.html | 1 + 3 files changed, 57 insertions(+), 36 deletions(-) diff --git a/components/ui/view-import/src/main/resources/META-INF/dirigible/view-import/js/import.js b/components/ui/view-import/src/main/resources/META-INF/dirigible/view-import/js/import.js index 2a8ef0e441e..ec533d3a99d 100644 --- a/components/ui/view-import/src/main/resources/META-INF/dirigible/view-import/js/import.js +++ b/components/ui/view-import/src/main/resources/META-INF/dirigible/view-import/js/import.js @@ -31,47 +31,51 @@ importView.controller('ImportViewController', ($scope, $window, ViewParameters, $scope.uploader = new FileUploader({ url: projectImportUrl }); + $scope.importProjectDialog = false; $scope.initImport = () => { - let params = ViewParameters.get(); + const params = ViewParameters.get(); + if (params.workspace) $scope.selectedWorkspace = params.workspace; if (params.container === 'window') { $scope.inDialog = true; - if (params.importRepository) { - $scope.importRepository = true; - $scope.queueLength = 1; - $scope.uploader.url = TransportService.getSnapshotUrl(); - $scope.dropAreaTitle = 'Import repository from zip'; - $scope.dropAreaSubtitle = 'Drop snaphot here, or use the "+" button.'; - } else { - $scope.uploadPath = params.uploadPath; - if (params.workspace) $scope.selectedWorkspace = params.workspace; - if (params.importType === 'file') { - $scope.inputAccept = ''; - $scope.importType = params.importType; - $scope.dropAreaTitle = 'Import files'; - $scope.dropAreaSubtitle = 'Drop file(s) here, or use the "+" button.'; - $scope.dropAreaMore = `Files will be imported in "${params.uploadPath}"`; - } else if (params.importType === 'data') { - $scope.inputAccept = 'csv'; - $scope.importType = params.importType; - $scope.dropAreaTitle = 'Import data files'; - $scope.dropAreaSubtitle = 'Drop file(s) here, or use the "+" button.'; - $scope.dropAreaMore = `Files will be imported in "${params.table}"`; - } else if (params.importType === 'sql') { - $scope.inputAccept = 'sql'; - $scope.importType = params.importType; - $scope.dropAreaTitle = 'Import SQL files'; - $scope.dropAreaSubtitle = 'Drop file(s) here, or use the "+" button.'; - $scope.dropAreaMore = `Files will be imported in "${params.schema}"`; + $scope.importProjectDialog = params.importType === 'project'; + if (!$scope.importProjectDialog) { + if (params.importRepository) { + $scope.importRepository = true; + $scope.queueLength = 1; + $scope.uploader.url = TransportService.getSnapshotUrl(); + $scope.dropAreaTitle = 'Import repository from zip'; + $scope.dropAreaSubtitle = 'Drop snaphot here, or use the "+" button.'; } else { - $scope.dropAreaTitle = 'Import files from zip'; - $scope.dropAreaMore = `Files will be extracted in "${params.uploadPath}"`; - let pathSegments = params.uploadPath.split('/'); - $scope.uploader.url = UriBuilder().path(zipImportUrl.split('/')).path(pathSegments).build(); - if (pathSegments.length <= 2) $scope.uploader.url += '/%252F'; + $scope.uploadPath = params.uploadPath; + if (params.importType === 'file') { + $scope.inputAccept = ''; + $scope.importType = params.importType; + $scope.dropAreaTitle = 'Import files'; + $scope.dropAreaSubtitle = 'Drop file(s) here, or use the "+" button.'; + $scope.dropAreaMore = `Files will be imported in "${params.uploadPath}"`; + } else if (params.importType === 'data') { + $scope.inputAccept = 'csv'; + $scope.importType = params.importType; + $scope.dropAreaTitle = 'Import data files'; + $scope.dropAreaSubtitle = 'Drop file(s) here, or use the "+" button.'; + $scope.dropAreaMore = `Files will be imported in "${params.table}"`; + } else if (params.importType === 'sql') { + $scope.inputAccept = 'sql'; + $scope.importType = params.importType; + $scope.dropAreaTitle = 'Import SQL files'; + $scope.dropAreaSubtitle = 'Drop file(s) here, or use the "+" button.'; + $scope.dropAreaMore = `Files will be imported in "${params.schema}"`; + } else { + $scope.dropAreaTitle = 'Import files from zip'; + $scope.dropAreaMore = `Files will be extracted in "${params.uploadPath}"`; + let pathSegments = params.uploadPath.split('/'); + $scope.uploader.url = UriBuilder().path(zipImportUrl.split('/')).path(pathSegments).build(); + if (pathSegments.length <= 2) $scope.uploader.url += '/%252F'; + } } + $scope.projectsViewId = params.projectsViewId; } - $scope.projectsViewId = params.projectsViewId; } else $scope.reloadWorkspaceList(); } @@ -89,7 +93,7 @@ importView.controller('ImportViewController', ($scope, $window, ViewParameters, $scope.uploader.onBeforeUploadItem = (item) => { if (!$scope.importRepository) { - if (!$scope.inDialog) { + if (!$scope.inDialog || ($scope.inDialog && $scope.importProjectDialog)) { item.url = UriBuilder().path(projectImportUrl.split('/')).path($scope.selectedWorkspace).build(); } else if ($scope.inDialog && $scope.importType === 'file') { item.headers = { @@ -108,7 +112,7 @@ importView.controller('ImportViewController', ($scope, $window, ViewParameters, $scope.uploader.onCompleteAll = () => { if ($scope.importRepository) { Repository.announceRepositoryModified(); - } else if ($scope.inDialog) { + } else if ($scope.inDialog && !$scope.importProjectDialog) { // Temporary, publishes all files in the import directory, not just imported ones Workspace.announceWorkspaceChanged({ workspace: $scope.selectedWorkspace, diff --git a/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/projects.js b/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/projects.js index 284b9c11a22..4cefa6b7657 100644 --- a/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/projects.js +++ b/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/projects.js @@ -397,6 +397,10 @@ projectsView.controller('ProjectsViewController', ( id: 'newProject', label: 'New Project', leftIconClass: 'sap-icon--create', + }, { + id: 'importProject', + label: 'Import Project', + leftIconClass: 'sap-icon--upload', separator: true, }); if (PublisherService.isEnabled()) { @@ -673,6 +677,7 @@ projectsView.controller('ProjectsViewController', ( } else if (id === 'paste') { jstreeWidget.jstree(true).paste(contextMenuNodes[0]); } else if (id === 'newProject') $scope.createProject(); + else if (id === 'importProject') $scope.importProject(); else if (id === 'duplicateProject') { $scope.duplicateProject(contextMenuNodes[0]); } else if (id === 'rename') { @@ -1254,6 +1259,17 @@ projectsView.controller('ProjectsViewController', ( }); }; + $scope.importProject = () => { + Dialogs.showWindow({ + hasHeader: true, + id: 'import', + params: { + importType: 'project', + workspace: $scope.selectedWorkspace, + } + }); + }; + $scope.exportProjects = () => { TransportService.exportProject($scope.selectedWorkspace, '*'); }; diff --git a/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/projects.html b/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/projects.html index 3f5b0b4314f..729eba211cd 100644 --- a/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/projects.html +++ b/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/projects.html @@ -55,6 +55,7 @@ + From 43db43e607040f718356d400568575fd58976dd5 Mon Sep 17 00:00:00 2001 From: StanZGenchev Date: Wed, 25 Mar 2026 13:37:14 +0200 Subject: [PATCH 7/7] Search jobs by expression Signed-off-by: StanZGenchev --- .../src/main/resources/META-INF/dirigible/view-jobs/js/jobs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/ui/view-jobs/src/main/resources/META-INF/dirigible/view-jobs/js/jobs.js b/components/ui/view-jobs/src/main/resources/META-INF/dirigible/view-jobs/js/jobs.js index 13f6ea8ddbf..7116ada2240 100644 --- a/components/ui/view-jobs/src/main/resources/META-INF/dirigible/view-jobs/js/jobs.js +++ b/components/ui/view-jobs/src/main/resources/META-INF/dirigible/view-jobs/js/jobs.js @@ -94,7 +94,7 @@ jobsView.controller('JobsController', ($scope, $http, $timeout, Dialogs) => { } to = $timeout(() => { for (let i = 0; i < $scope.list.length; i++) { - const searchValues = `${$scope.list[i].name}${$scope.list[i].handler}${$scope.list[i].message}`.toLowerCase(); + const searchValues = `${$scope.list[i].name}${$scope.list[i].handler}${$scope.list[i].message}${$scope.list[i].expression}`.toLowerCase(); if (searchValues.includes($scope.searchField.text.toLowerCase())) { $scope.list[i].hidden = false; } else {