diff --git a/.github/workflows/branch-deletion-pr-creation.yml b/.github/workflows/branch-deletion-pr-creation.yml index 62b8eb36269..fe3a55f0600 100644 --- a/.github/workflows/branch-deletion-pr-creation.yml +++ b/.github/workflows/branch-deletion-pr-creation.yml @@ -105,4 +105,6 @@ jobs: reviewers: MarkvanMents,OlufunkeMoronfolu commit-message: "Add branch cleanup candidates for ${{ env.CURRENT_DATE }}" add-paths: | - branch-cleanup-timestamp.txt \ No newline at end of file + branch-cleanup-timestamp.tx + author: "github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>" + committer: "github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>" \ No newline at end of file diff --git a/.github/workflows/branch-deletion-pr-processing.yml b/.github/workflows/branch-deletion-pr-processing.yml index 1edd1173d2a..58bbf850897 100644 --- a/.github/workflows/branch-deletion-pr-processing.yml +++ b/.github/workflows/branch-deletion-pr-processing.yml @@ -21,6 +21,8 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + persist-credentials: true - name: Extract branches id: extract-branches diff --git a/.github/workflows/lint-action.yml b/.github/workflows/lint-action.yml index 1131ad4be78..56b7452c61d 100644 --- a/.github/workflows/lint-action.yml +++ b/.github/workflows/lint-action.yml @@ -53,7 +53,8 @@ jobs: body: | ${{ env.VER }} branch: lint-docs - committer: MarkvanMents + author: "github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>" + committer: "github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>" assignees: MarkvanMents,OlufunkeMoronfolu reviewers: MarkvanMents,OlufunkeMoronfolu labels: Internal WIP diff --git a/.github/workflows/remunusedattachments.yml b/.github/workflows/remunusedattachments.yml index c3a95e0ea30..d3f1a8336c6 100644 --- a/.github/workflows/remunusedattachments.yml +++ b/.github/workflows/remunusedattachments.yml @@ -36,7 +36,8 @@ jobs: Pull Request to delete attachments that are no longer used. Check the htmltest output from the CI/CD pipeline to ensure that nothing has been removed accidentally. branch: rem-unused-attachments - committer: MarkvanMents + author: "github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>" + committer: "github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>" assignees: MarkvanMents,OlufunkeMoronfolu reviewers: MarkvanMents,OlufunkeMoronfolu labels: Internal WIP diff --git a/branch-cleanup-timestamp.txt b/branch-cleanup-timestamp.txt index d46839f9300..d03bff95e10 100644 --- a/branch-cleanup-timestamp.txt +++ b/branch-cleanup-timestamp.txt @@ -1 +1 @@ -Last scan: Fri Nov 7 09:17:19 UTC 2025 +Last scan for stale merged branches: 2025-12-01 23:24:23 CET (UTC+01:00) diff --git a/content/en/docs/apidocs-mxsdk/apidocs/governance/project-category-api.md b/content/en/docs/apidocs-mxsdk/apidocs/governance/project-category-api.md new file mode 100644 index 00000000000..9bc2c5d6d57 --- /dev/null +++ b/content/en/docs/apidocs-mxsdk/apidocs/governance/project-category-api.md @@ -0,0 +1,37 @@ +--- +title: "Project Category API" +url: /apidocs-mxsdk/apidocs/project-category-api/ +type: swagger +description: "The Project Category API manages your project categories." +weight: 100 +restapi: true +--- + +## Introduction + +The Mendix Project Category API allows you to create, edit or delete your project categories. + +## Authentication {#authentication} + +Authentication for the Project Category API uses a personal access token (PAT). + +### Generating a PAT {#generate} + +For details on how to generate a PAT, refer to the [Personal Access Tokens](/mendix-profile/user-settings/#pat) section of *User Settings*. + +Select the appropriate scopes, depending on the endpoints that need to be invoked. Refer to the [API Reference](#api-reference) for more information on which scopes to use in which endpoints. + +Store the generated value somewhere safe so you can use it to authorize your API calls. + +### Using the PAT + +Each request must contain an `Authorization` header with the value `MxToken {GENERATED_PAT}`. For example: + +```http +GET /projects HTTP/1.1 +Authorization: MxToken 7LJE…vk +``` + +## API Reference{#api-reference} + +{{< swaggerui-disable-try-it-out src="/openapi-spec/project-category-api.yaml" >}} diff --git a/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/csharp/extensibility-api-howtos/add-menu.md b/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/csharp/extensibility-api-howtos/add-menu.md index 9b9be2cfe54..3362f4abefc 100644 --- a/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/csharp/extensibility-api-howtos/add-menu.md +++ b/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/csharp/extensibility-api-howtos/add-menu.md @@ -98,4 +98,4 @@ You can add a `MenuSeparator` to a menu using the `Separator` property. The opti #### Enabling and Disabling Menus -Menus are enabled by default. To disable a menu, set its `IsEnabled` property to `false`. \ No newline at end of file +Menus are enabled by default. To disable a menu, set its `IsEnabled` property to `false`. diff --git a/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/csharp/extensibility-api-howtos/build-todo-example-extension.md b/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/csharp/extensibility-api-howtos/build-todo-example-extension.md index e38f5489fee..4322aec8249 100644 --- a/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/csharp/extensibility-api-howtos/build-todo-example-extension.md +++ b/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/csharp/extensibility-api-howtos/build-todo-example-extension.md @@ -452,8 +452,7 @@ To store to-do data on disk, create model classes that represent individual item } ``` - - ### Create the To-do List Model +### Create the To-do List Model 1. Add another class file named *ToDoListModel.cs*. 2. Replace the contents of this file with the following code: @@ -751,27 +750,27 @@ This HTML page provides a simple interface styled with Tailwind CSS. The JavaScr 1. Add a helper function to simplify the call to the browser API: -```javascript -function postMessage(message, data) { - window.chrome.webview.postMessage({ message, data }); -} -``` + ```javascript + function postMessage(message, data) { + window.chrome.webview.postMessage({ message, data }); + } + ``` 2. Initialize message handling and respond to incoming messages: -```javascript -// Register message handler. -window.chrome.webview.addEventListener("message", handleMessage); -// Indicate that you are ready to receive messages. -postMessage("MessageListenerRegistered"); - -async function handleMessage(event) { - const { message, data } = event.data; - if (message === "RefreshToDos") { - await refreshToDos(); - } -} -``` + ```javascript + // Register message handler. + window.chrome.webview.addEventListener("message", handleMessage); + // Indicate that you are ready to receive messages. + postMessage("MessageListenerRegistered"); + + async function handleMessage(event) { + const { message, data } = event.data; + if (message === "RefreshToDos") { + await refreshToDos(); + } + } + ``` {{% alert color="warning" %}} @@ -944,4 +943,4 @@ Use a command-line flag to enable extensions: 1. Open the Studio Pro Installation folder. 2. From the command-line, run: `.\studiopro.exe --enable-extension-development`. -This will launch Studio Pro and load your extension. You can now access it from the **View** > **Todo** menu item. \ No newline at end of file +This will launch Studio Pro and load your extension. You can now access it from the **View** > **Todo** menu item. diff --git a/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/csharp/extensibility-api-howtos/create-menu-extension.md b/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/csharp/extensibility-api-howtos/create-menu-extension.md index c0ca95a7187..76a420b77ef 100644 --- a/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/csharp/extensibility-api-howtos/create-menu-extension.md +++ b/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/csharp/extensibility-api-howtos/create-menu-extension.md @@ -26,7 +26,7 @@ You can download the example in this how-to in [this GitHub repository](https:// { "mx_extensions": [ ".dll" ] } ``` - 3. For the `manifest.json` file, right-click **Solution Explorer** > **Properties** and change the **Copy to Output Directory** property to **Copy always**. + 4. For the `manifest.json` file, right-click **Solution Explorer** > **Properties** and change the **Copy to Output Directory** property to **Copy always**. ## Creating a Test Mendix App @@ -114,4 +114,4 @@ You can access reusable .NET libraries via [NuGet](https://www.nuget.org/) Follo true ``` -3. Use the **Manage NuGet Packages** to add a dependency. \ No newline at end of file +3. Use the **Manage NuGet Packages** to add a dependency. diff --git a/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/csharp/extensibility-api-howtos/create-microflow-service.md b/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/csharp/extensibility-api-howtos/create-microflow-service.md index cb31dd9da22..7bac2affcae 100644 --- a/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/csharp/extensibility-api-howtos/create-microflow-service.md +++ b/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/csharp/extensibility-api-howtos/create-microflow-service.md @@ -116,7 +116,6 @@ It returns a list of `IMicroflowParameterObject`, which includes: * Description * `DataType` - ```csharp IReadOnlyList parameters = _microflowService.GetParameters(microflow); ``` diff --git a/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/csharp/extensibility-api-howtos/create-microflows-calculations.md b/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/csharp/extensibility-api-howtos/create-microflows-calculations.md index 80781f1afa1..d4c263157ee 100644 --- a/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/csharp/extensibility-api-howtos/create-microflows-calculations.md +++ b/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/csharp/extensibility-api-howtos/create-microflows-calculations.md @@ -165,7 +165,7 @@ You can also see that the `DataType` of both parameters is integer. {{< figure src="/attachments/apidocs-mxsdk/apidocs/extensibility-api/multiplication-microflow.png" >}} - ### Addition Microflow +### Addition Microflow To create a microflow that performs addition between two decimal values, use the code below: diff --git a/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/csharp/extensibility-api-howtos/create-modal-web-view.md b/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/csharp/extensibility-api-howtos/create-modal-web-view.md index baf1010e34a..b8225e8c1ac 100644 --- a/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/csharp/extensibility-api-howtos/create-modal-web-view.md +++ b/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/csharp/extensibility-api-howtos/create-modal-web-view.md @@ -170,4 +170,4 @@ This code injects your controller class into the `MyMenuExtension` class. It add {{% alert type="info" %}} In this example, the `currentApp` parameter is required if the dialog needs to interact with the model. Additionally, `WebServerBaseUrl` is crucial; without the base path, navigating to the route defined in the web server extension would not be possible. -{{% /alert %}} \ No newline at end of file +{{% /alert %}} diff --git a/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/csharp/extensibility-api-howtos/interact-with-model-api.md b/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/csharp/extensibility-api-howtos/interact-with-model-api.md index 48d89b76079..6a6f21de9c8 100644 --- a/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/csharp/extensibility-api-howtos/interact-with-model-api.md +++ b/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/csharp/extensibility-api-howtos/interact-with-model-api.md @@ -7,7 +7,7 @@ weight: 11 ## Introduction -Once you have created basic extensions, you may want to interact with the Studio Pro model to make changes to your app. The Model API enables this functionality and is exposed via the` Mendix.StudioPro.ExtensionsAPI.Model` namespace. +Once you have created basic extensions, you may want to interact with the Studio Pro model to make changes to your app. The Model API enables this functionality and is exposed via the`Mendix.StudioPro.ExtensionsAPI.Model` namespace. ## Gaining Access to the Mendix Model SDK @@ -25,7 +25,6 @@ Any modification to the model must be done within a transaction; otherwise, a `S Transactions group changes, but do not provide a way to isolate them. Changes to a model are immediately visible to all code interacting with the model. When transaction is rolled back or is undone by a user, all included changes are reverted. - ## Start a Transaction To create transaction, call [`IModel.StartTransaction`](https://github.com/mendix/ExtensionAPI-Samples/blob/main/API%20Reference/Mendix.StudioPro.ExtensionsAPI.Model/IModel/StartTransaction.md). This method returns a transaction object that implements [`ITransaction`](https://github.com/mendix/ExtensionAPI-Samples/blob/main/API%20Reference/Mendix.StudioPro.ExtensionsAPI.Model/ITransaction.md). @@ -61,4 +60,4 @@ using (var transaction = model.StartTransaction("add entity")) var copyEntity = CurrentApp.Copy(entity); transaction.Commit(); } -``` \ No newline at end of file +``` diff --git a/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/web/get-started.md b/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/web/get-started.md index 11b52078396..bdd099eee78 100644 --- a/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/web/get-started.md +++ b/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/web/get-started.md @@ -30,7 +30,7 @@ This section will show you how to build and test an extension. ### Create a Test App 1. Create a new app using the **Blank Web App** template. -1. Install the [Studio Pro Web Extension Template](https://github.com/mendix/web-extension-template) from GitHub using the instructions in the repository. +2. Install the [Studio Pro Web Extension Template](https://github.com/mendix/web-extension-template) from GitHub using the instructions in the repository. ### Building the Extension @@ -54,7 +54,7 @@ You can explore the extension to understand what it does when it is installed. D Reading through the source code you should see the following: - a. Line 7 adds a menu + a. Line 7 adds a menu ```typescript await studioPro.ui.extensionsMenu.add({ @@ -64,24 +64,24 @@ You can explore the extension to understand what it does when it is installed. D }); ``` - 2. Line 14 opens a tab - - ```typescript - // Open a tab when the menu item is clicked - studioPro.ui.extensionsMenu.addEventListener("menuItemActivated", (args) => { - if (args.menuId === "myextension.ShowTabMenuItem") { - studioPro.ui.tabs.open( - { - title: "My Extension Tab", - }, - { - componentName: "extension/myextension", - uiEntrypoint: "tab", - } - ); - } - }); - ``` + b. Line 14 opens a tab + + ```typescript + // Open a tab when the menu item is clicked + studioPro.ui.extensionsMenu.addEventListener("menuItemActivated", (args) => { + if (args.menuId === "myextension.ShowTabMenuItem") { + studioPro.ui.tabs.open( + { + title: "My Extension Tab", + }, + { + componentName: "extension/myextension", + uiEntrypoint: "tab", + } + ); + } + }); + ``` When you install the extension, you will see a new menu item within Studio Pro. diff --git a/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/web/web-extensions-howtos/dockable-pane-api.md b/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/web/web-extensions-howtos/dockable-pane-api.md index 63d35b611f2..293734db1ff 100644 --- a/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/web/web-extensions-howtos/dockable-pane-api.md +++ b/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-10/extensibility-api/web/web-extensions-howtos/dockable-pane-api.md @@ -174,7 +174,7 @@ Your `loaded()` method should now look like this: Create a new web view endpoint where you define the user interface that will be rendered within the pane. You can use and rename the existing endpoint. Follow the steps below: 1. Rename `ui/index.tsx` to `ui/tab.tsx`. -1. Add the new endpoint file, `ui/dockablepane.tsx`, by copying `ui/tab.tsx`. +2. Add the new endpoint file, `ui/dockablepane.tsx`, by copying `ui/tab.tsx`. You must also alter the `vite.config.ts` and `manifest.json` files to bind to the correct endpoint, as described in the following sections: @@ -255,13 +255,13 @@ You will close your pane using a new menu item. Follow the steps below: 1. Add a new sub-menu item to the menu on line 11. -```typescript {linenos=table linenostart=11} - { menuId: "myextension.HideDockMenuItem", caption: "Hide dock pane" }, -``` + ```typescript {linenos=table linenostart=11} + { menuId: "myextension.HideDockMenuItem", caption: "Hide dock pane" }, + ``` 2. Alter the event handler for the new menu at the end of the loaded method: -```typescript + ```typescript // Open a tab when the menu item is clicked studioPro.ui.extensionsMenu.addEventListener( "menuItemActivated", @@ -285,7 +285,7 @@ You will close your pane using a new menu item. Follow the steps below: } } ); -``` + ``` The loaded method should now look like this: diff --git a/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-11/extensibility-api/csharp/extensibility-api-howtos/build-todo-example-extension.md b/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-11/extensibility-api/csharp/extensibility-api-howtos/build-todo-example-extension.md index db5565b37a7..8dfa7fdddad 100644 --- a/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-11/extensibility-api/csharp/extensibility-api-howtos/build-todo-example-extension.md +++ b/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-11/extensibility-api/csharp/extensibility-api-howtos/build-todo-example-extension.md @@ -452,7 +452,7 @@ To store to-do data on disk, create model classes that represent individual item } ``` - ### Create the To-do List Model +### Create the To-do List Model 1. Add another class file named *ToDoListModel.cs*. 2. Replace the contents of this file with the following code: @@ -750,27 +750,27 @@ This HTML page provides a simple interface styled with Tailwind CSS. The JavaScr 1. Add a helper function to simplify the call to the browser API: -```javascript -function postMessage(message, data) { - window.chrome.webview.postMessage({ message, data }); -} -``` + ```javascript + function postMessage(message, data) { + window.chrome.webview.postMessage({ message, data }); + } + ``` 2. Initialize message handling and respond to incoming messages: -```javascript -// Register message handler. -window.chrome.webview.addEventListener("message", handleMessage); -// Indicate that you are ready to receive messages. -postMessage("MessageListenerRegistered"); - -async function handleMessage(event) { - const { message, data } = event.data; - if (message === "RefreshToDos") { - await refreshToDos(); - } -} -``` + ```javascript + // Register message handler. + window.chrome.webview.addEventListener("message", handleMessage); + // Indicate that you are ready to receive messages. + postMessage("MessageListenerRegistered"); + + async function handleMessage(event) { + const { message, data } = event.data; + if (message === "RefreshToDos") { + await refreshToDos(); + } + } + ``` {{% alert color="warning" %}} diff --git a/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-11/extensibility-api/csharp/extensibility-api-howtos/create-microflows-calculations.md b/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-11/extensibility-api/csharp/extensibility-api-howtos/create-microflows-calculations.md index 7698dbe8591..5cead61ed41 100644 --- a/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-11/extensibility-api/csharp/extensibility-api-howtos/create-microflows-calculations.md +++ b/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-11/extensibility-api/csharp/extensibility-api-howtos/create-microflows-calculations.md @@ -165,7 +165,7 @@ You can also see that the `DataType` of both parameters is integer. {{< figure src="/attachments/apidocs-mxsdk/apidocs/extensibility-api/multiplication-microflow.png" >}} - ### Addition Microflow +### Addition Microflow To create a microflow that performs addition between two decimal values, use the code below: diff --git a/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-11/extensibility-api/web/web-extensions-howtos/preference-api.md b/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-11/extensibility-api/web/web-extensions-howtos/preference-api.md index d10e10707db..4740031de4e 100644 --- a/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-11/extensibility-api/web/web-extensions-howtos/preference-api.md +++ b/content/en/docs/apidocs-mxsdk/apidocs/studio-pro-11/extensibility-api/web/web-extensions-howtos/preference-api.md @@ -87,16 +87,12 @@ Import the preferences API and use it to fetch the user’s preferences. ); ``` -{{% alert color="info" %}} -The function is `async` in order for you to use `await` when fetching the preferences. -{{% /alert %}} + {{% alert color="info" %}} The function is `async` in order for you to use `await` when fetching the preferences. + {{% /alert %}} -3. Use the fetched preferences to update the text in the message box so you can see the user's current theme and language. - -The `getPreferences()` function returns an object with two properties: - -* Theme — either **Light** or **Dark**, representing the current theme setting in Studio Pro -* Language — a string representing the current language setting, such as `en_US` for English (United States) +3. Use the fetched preferences to update the text in the message box so you can see the user's current theme and language. The `getPreferences()` function returns an object with two properties: + * Theme – either **Light** or **Dark**, representing the current theme setting in Studio Pro + * Language – a string representing the current language setting, such as `en_US` for English (United States) The complete `src/main/index.ts` file should now look like this: diff --git a/content/en/docs/control-center/company/_index.md b/content/en/docs/control-center/company/_index.md index e5cbbb2cc83..707e6df2dbc 100644 --- a/content/en/docs/control-center/company/_index.md +++ b/content/en/docs/control-center/company/_index.md @@ -2,7 +2,7 @@ title: "Company" url: /control-center/company/ description: "Describes the Company category in the Mendix Control Center." -weight: 40 +weight: 60 no_list: false --- ## Introduction diff --git a/content/en/docs/control-center/content-curation/_index.md b/content/en/docs/control-center/content-curation/_index.md index 4cab5e0b3e4..c140fc9057b 100644 --- a/content/en/docs/control-center/content-curation/_index.md +++ b/content/en/docs/control-center/content-curation/_index.md @@ -2,7 +2,7 @@ title: "Content Curation" url: /control-center/content-curation/ description: "Describes the Content Curation category in the Mendix Control Center." -weight: 60 +weight: 80 no_list: false --- ## Introduction diff --git a/content/en/docs/control-center/entitlements/_index.md b/content/en/docs/control-center/entitlements/_index.md index d2af151e19c..0ee39ba2a93 100644 --- a/content/en/docs/control-center/entitlements/_index.md +++ b/content/en/docs/control-center/entitlements/_index.md @@ -2,7 +2,7 @@ title: "Entitlements" url: /control-center/entitlements/ description: "Describes the Entitlements category in the Mendix Control Center." -weight: 10 +weight: 30 no_list: false --- diff --git a/content/en/docs/control-center/genai-resources-self-service.md b/content/en/docs/control-center/genai-resources-self-service.md new file mode 100644 index 00000000000..da07e4d88fb --- /dev/null +++ b/content/en/docs/control-center/genai-resources-self-service.md @@ -0,0 +1,68 @@ +--- +title: "GenAI Resources" +url: /control-center/genai-resources-self-service +description: "Describes how to provision and deprovision GenAI Resources using self-service." +weight: 20 +--- + +## Introduction + +The **GenAI Resources** section provides a detailed overview of all Mendix GenAI resources available within your company, allowing Mendix Admins to seamlessly provision and deprovision GenAI resources as needed. With this feature, Mendix Admins can efficiently manage all GenAI resources directly within the [Control Center](https://controlcenter.mendix.com/index.html) through a self-service capability, ensuring streamlined operations and improved governance. For more information, refer to [Accessing GenAI Resources](/appstore/modules/genai/mx-cloud-genai/resource-packs/#accessing-genai-resources). + +## Prerequisites + +Self-service provisioning of GenAI resources using Mendix Cloud Tokens is available only if the users meets the following conditions: + +1. Sufficient token entitlements – The user should have an adequate number of available Mendix Cloud Token to allocate for GenAI resource provisioning. +2. Valid subscription plan – The user's Mendix subscription must be based on the FY21 price list or newer. Older subscription plans are not eligible for provisioning. +3. Single account ownership – The user should have a single account. Owning multiple accounts is not supported for self-service GenAI provisioning. +4. Enterprise platform subscription – The user should have a single active enterprise platform subscription. If no active subscription is found, the system will display a warning message with this text: "We couldn't retrieve your correct platform account, which is required to access available tokens and create resources. Please contact Mendix Support for assistance." + +## Overview of Deployed Resources + +The overview page provides a centralized view of all deployed GenAI resources, including text generation resources, embeddings generation resources, and knowledge base resources. From this page, you can easily review the status, basic information, and usage details of each deployed resource. The following list shows detailed information about your GenAI resource. + +* **Status** – The current status of the resource. +* **Name** – The name of the resource. +* **Model** – The model that is used, for example, Anthropic Claude Sonnet 4.0. +* **Plan** – The subscription plan used for resources, for example, small, medium, or large. +* **Created For** – For whom it is created. + +{{< figure src="/attachments/control-center/genai-resources/overview-genai-resources.png" >}} + +## Provisioning GenAI Resources + +You can provision any GenAI resources directly within the Control Center using the self-service capability. +To do so, select the appropriate resource type and click **Provision Resource**. + +{{% alert color="info" %}} +Ensure that you are on the correct resource tab before provisioning. For example, to create a new text generation resource, first select the **Text Generation Resources** tab. +{{% /alert %}} + +When provisioning a new resource, enter the following information: + +* **Display Name** – The name of the resource. +* **Environment** – The environment for which the resource is created, such as Test, Acceptance, or Production. +* **Mendix Cloud Region** – The cloud region where the resource will be hosted. +* **Cross-region inference** – Specifies whether the selected model supports cross-region inference. For more information, refer to the [Settings](/appstore/modules/genai/mx-cloud-genai/Navigate-MxGenAI/#settings) section of *Navigate through the Mendix Cloud GenAI Portal*. +* **Available Text Generation Models** – A list of the supported models you can choose from, for example, Anthropic Claude Sonnet V4. +* **Size** – The subscription plan with the tokens used for resources. +* **User** – The name of the user for whom the provisioning was initially created. +* **Email** – The user's email address. + +After filling in the required fields, you can review all entered details in the **Resource Specification**. To learn more, refer to [Mendix Cloud GenAI Resource Packs](/appstore/modules/genai/mx-cloud-genai/resource-packs/). + +Click **Provision Resource** to finalize the process. You are taken back to the **GenAI Resources** page, where the newly created resource is displayed in the list. Selecting the newly provisioned resource opens its details directly in the Mendix Cloud GenAI Portal in a new tab. + +## Deprovisioning GenAI Resources + +If you want to deprovision the resource, click the three dots icon ({{% icon name="three-dots-menu-horizontal" %}}) next to the selected resource and select **Deprovision Resource**. +A confirmation pop-up appears, displaying a message and the details of the selected resource, as shown in the example below. + +{{< figure src="/attachments/control-center/genai-resources/deprovisioning.png" >}} + +Click **Deprovision** to proceed. After confirmation, the resource status updates on the **GenAI Resource** page to reflect that deprovisioning is scheduled. + +{{% alert color="info" %}} +Your subscription plan operates on a monthly bundle cycle. When you deprovision a resource, the actual deprovisioning will occur at the end of the current subscription month. Until that date, you can still use the resource, and the scheduled deprovisioning date will appear in the resource's **Status**. +{{% /alert %}} diff --git a/content/en/docs/control-center/marketplace/_index.md b/content/en/docs/control-center/marketplace/_index.md index 9d89c5c626e..e691a35a91d 100644 --- a/content/en/docs/control-center/marketplace/_index.md +++ b/content/en/docs/control-center/marketplace/_index.md @@ -2,7 +2,7 @@ title: "Marketplace" url: /control-center/marketplace/ description: "Describes the Marketplace category in the Mendix Control Center." -weight: 50 +weight: 70 no_list: false --- ## Introduction diff --git a/content/en/docs/control-center/people/_index.md b/content/en/docs/control-center/people/_index.md index 014bf44f83b..fdd4545fbca 100644 --- a/content/en/docs/control-center/people/_index.md +++ b/content/en/docs/control-center/people/_index.md @@ -2,7 +2,7 @@ title: "People" url: /control-center/people/ description: "Describes the People category in the Mendix Control Center." -weight: 30 +weight: 50 no_list: false --- diff --git a/content/en/docs/control-center/resolve-shared-ownership-apps.md b/content/en/docs/control-center/resolve-shared-ownership-apps.md index 62eabd121c5..6c623ce50b7 100644 --- a/content/en/docs/control-center/resolve-shared-ownership-apps.md +++ b/content/en/docs/control-center/resolve-shared-ownership-apps.md @@ -2,7 +2,7 @@ title: "Resolving Shared Ownership of Apps" url: /control-center/resolve-shared-ownership-of-apps description: "Describe how to address the issue that you own an app together with another company." -weight: 90 +weight: 80 no_list: true --- diff --git a/content/en/docs/control-center/security/_index.md b/content/en/docs/control-center/security/_index.md index a1190c2333e..6568c6732a0 100644 --- a/content/en/docs/control-center/security/_index.md +++ b/content/en/docs/control-center/security/_index.md @@ -2,7 +2,7 @@ title: "Security" url: /control-center/security/ description: "Describes the Security category in the Mendix Control Center." -weight: 20 +weight: 30 no_list: false --- diff --git a/content/en/docs/deployment/general/populate-user-type.md b/content/en/docs/deployment/general/populate-user-type.md index d3d083b044a..6a614142c9f 100644 --- a/content/en/docs/deployment/general/populate-user-type.md +++ b/content/en/docs/deployment/general/populate-user-type.md @@ -15,11 +15,10 @@ This document helps you set up your apps to ensure accurate metering for your Ex {{% alert color="info" %}} **Definitions** -* *Named User*¹ – an individual authorized by you to have access to your apps with unique login credentials, or an authorized external system that accesses or is accessed by your application. +* *Named User* – an individual authorized by you to have access to your apps with unique login credentials, or an authorized external system that accesses or is accessed by your application. * *Internal User* – a *Named User* who is an employee or contractor of your business. * *External User* – a *Named User* who is not an employee or contractor of your business, and is designated as an External User in the Mendix Platform. -¹You may re-assign the entitlement to access and use your applications from one Named User to another Named User within the same entitlement category (internal or external) once per calendar month. {{% /alert %}} ## Background diff --git a/content/en/docs/deployment/mendix-cloud-deploy/change-plan.md b/content/en/docs/deployment/mendix-cloud-deploy/change-plan.md index 13552e65d05..6e3fa1de079 100644 --- a/content/en/docs/deployment/mendix-cloud-deploy/change-plan.md +++ b/content/en/docs/deployment/mendix-cloud-deploy/change-plan.md @@ -63,7 +63,7 @@ To change an environment's plan, follow these steps: {{% alert color="info" %}}Approval from a Mendix Admin only authorizes the plan change but does not immediately apply it. As a result, the environment will remain on its current plan until the new plan is [approved](/control-center/approval-requests/#approving-a-request), [scheduled](#scheduling-a-plan-change) and [successfully applied](#after-schedule). {{% /alert %}} -11. [Track and manage](#manage-plan-requests) your plan change requests from the [Change Requests](/developerportal/deploy/environments/#change-requests) tab on your app's environment's page. +10. [Track and manage](#manage-plan-requests) your plan change requests from the [Change Requests](/developerportal/deploy/environments/#change-requests) tab on your app's environment's page. {{% alert color="info" %}} Changing plan consumes [Mendix Cloud Tokens](/control-center/cloud-tokens/#cloud-tokens). Only one plan change request can exist per environment at a time. As a result, new requests cannot be submitted for the same environment until the current one is completed. diff --git a/content/en/docs/deployment/mendix-cloud-deploy/custom-domains.md b/content/en/docs/deployment/mendix-cloud-deploy/custom-domains.md index ad2799d8947..26453fbee4a 100644 --- a/content/en/docs/deployment/mendix-cloud-deploy/custom-domains.md +++ b/content/en/docs/deployment/mendix-cloud-deploy/custom-domains.md @@ -126,23 +126,26 @@ Once you have a signed SSL/TLS certificate, you can upload it by following these 6. Paste the signed **TLS Certificate** (in PEM format). -7. Paste an **Intermediate Certificate Chain**. This is optional, but highly recommended. The intermediate certificate chain is provided by your certificate authority. +7. Paste an **Intermediate Certificate Chain**. While optional for modern browsers, it is mandatory for programmatic access and service consumption (like [OData services](/refguide/consumed-odata-services/)). The intermediate certificate chain is provided by your certificate authority. {{< figure src="/attachments/deployment/mendix-cloud-deploy/custom-domains/signed-certificate.png" width=80% class="no-border" >}} 8. Click **Save** to complete the process. {{% alert color="warning" %}} -The intermediate certificates of the main certificate authorities are included in the built-in CA databases of modern browsers. Therefore, you do not need to include an intermediate certificate to serve your website through SSL/TLS to users of modern browsers. +The intermediate certificates of the main certificate authorities are included in the built-in CA databases of modern browsers. Therefore, you do not need to include an intermediate certificate to serve your website through SSL/TLS for users with modern browsers. -However, you cannot predict how your users will attempt to connect to your website; not including an intermediate certificate may result in connection issues for some users. +However, intermediate certificate chains are mandatory for programmatic access and [service consumption](https://www.mendix.com/evaluation-guide/app-lifecycle/develop/integration/service-exposure/), and missing intermediate certificates will cause service consumption failures even when browser access works normally. Tools such as curl, programming languages, and operating systems do not automatically resolve missing intermediate certificates. -Tools such as curl do not recognize intermediate certificates automatically. Because of this, intermediate certificates are highly recommended but optional. - +You cannot predict how your users will attempt to connect to your website, and not including an intermediate certificate may result in connection issues for some users. To this end, Mendix recommends always including the intermediate certificate chain to ensure reliable connectivity for all use cases. {{% /alert %}} You can now configure your custom domain. See [Configuring a Custom Domain](#Configuring), below. +{{% alert color="info" %}} +After uploading, always verify your certificate using an SSL checker to identify any missing intermediate certificates before they cause service disruptions. +{{% /alert %}} + ## Uploading Your Own Custom Domain Certificate{#Uploading} To upload a custom domain certificate, you need to have the following things prepared: @@ -163,7 +166,7 @@ To upload the custom domain certificate, follow these steps: 5. Paste the **TLS Private Key**. -6. Paste an **Intermediate Certificate Chain**. This is optional, but most browsers require it. The intermediate certificate chain is provided by your certificate authority. +6. Paste an **Intermediate Certificate Chain**. While optional for modern browsers, it is mandatory for programmatic access and service consumption (like [OData services](/refguide/consumed-odata-services/)). The intermediate certificate chain is provided by your certificate authority. {{< figure src="/attachments/deployment/mendix-cloud-deploy/custom-domains/new-certificate.png" width=60% class="no-border" >}} @@ -204,7 +207,7 @@ You can do this by editing an existing custom domain certificate. To update an e 1. Click the **More Options** ({{% icon name="three-dots-menu-horizontal" %}}) icon on the CSR of interest. 2. Select **Edit**. 3. Paste the signed **TLS Certificate**. -4. Paste the **Intermediate Certificate Chain**. This is optional, but most browsers require it. The intermediate certificate chain is provided by your certificate authority. +4. Paste an **Intermediate Certificate Chain**. While optional for modern browsers, it is mandatory for programmatic access and service consumption (like [OData services](/refguide/consumed-odata-services/)). The intermediate certificate chain is provided by your certificate authority. {{% alert color="warning" %}} To edit an existing custom domain certificate, you need the following: diff --git a/content/en/docs/deployment/mendix-cloud-deploy/environments.md b/content/en/docs/deployment/mendix-cloud-deploy/environments.md index f51bb73c2a1..68cc1308bc9 100644 --- a/content/en/docs/deployment/mendix-cloud-deploy/environments.md +++ b/content/en/docs/deployment/mendix-cloud-deploy/environments.md @@ -146,9 +146,10 @@ Follow these steps to deploy packages to selected environments using the **Deplo 2. Perform one of the following actions, depending on whether you selected the package or the environment first: * If you launched the wizard by selecting an environment, the first screen of the wizard is the **Select Package** tab. Use it to select a package from the repository. * If you launched the wizard by selecting a package, the first screen of the wizard is the **Select Environment** tab. Use it to select the target environment for your package. -3. On the **Configure Environment** tab, review the [constants](/refguide/constants/) and adjust them as required. -4. In the **Other Options** tab, choose whether to stage the package without deploying, and when to create the backup: either before or after deploying the new package. The app is unavailable while the backup runs. You can also choose to deploy with [zero-downtime](/developerportal/deploy/zero-downtime/). -5. On the **Deploy** tab, review the deployment settings: +3. The **Clean Environment** tab appears only when deploying a package with a different model than the currently deployed one. For more information on cleaning environments, see [Clearing an Environment](/developerportal/deploy/environments-details/#clear-environment) in *Environment Details*. +4. On the **Configure Environment** tab, review the [constants](/refguide/constants/) and adjust them as required. +5. In the **Other Options** tab, choose whether to stage the package without deploying, and when to create the backup: either before or after deploying the new package. The app is unavailable while the backup runs. You can also choose to deploy with [zero-downtime](/developerportal/deploy/zero-downtime/). +6. On the **Deploy** tab, review the deployment settings: 1. To see an overview of the configuration for this deployment, click **View Summary**. This summary displays the selected package, selected backup option, and any changed constants or [scheduled events](/refguide/scheduled-events/). 2. Review this summary, then click **Deploy Now**. @@ -220,4 +221,4 @@ Once a service has been enabled for an app, Technical Contacts can selectively e ## Read More -* [Version Pinning](/developerportal/deploy/version-pinning/) \ No newline at end of file +* [Version Pinning](/developerportal/deploy/version-pinning/) diff --git a/content/en/docs/deployment/mendix-cloud-deploy/migrating-to-different-cloud.md b/content/en/docs/deployment/mendix-cloud-deploy/migrating-to-different-cloud.md index f8ed7ba4d38..04a33e1955e 100644 --- a/content/en/docs/deployment/mendix-cloud-deploy/migrating-to-different-cloud.md +++ b/content/en/docs/deployment/mendix-cloud-deploy/migrating-to-different-cloud.md @@ -139,6 +139,8 @@ Make sure you have downloaded the latest backup and deployment package before li 4. Select the target node by clicking **Use this Node** and linking it to your app. The currently linked (temporary) app will unlink automatically and can be deleted. +5. (Re)Deploy your app. + For more information, see [Licensing Mendix Cloud Apps](/developerportal/deploy/licensing-apps/). ### Changing the App URL diff --git a/content/en/docs/deployment/mx-azure/configuration/mx-azure-direct-database-access.md b/content/en/docs/deployment/mx-azure/configuration/mx-azure-direct-database-access.md index bbbf0d55be5..9f620fb558d 100644 --- a/content/en/docs/deployment/mx-azure/configuration/mx-azure-direct-database-access.md +++ b/content/en/docs/deployment/mx-azure/configuration/mx-azure-direct-database-access.md @@ -30,7 +30,7 @@ By default, the read replica for Postgres database is disabled. To enable it, pe 1. On the **Provision > Database Settings** section of the **Initialize Cluster** page, set the **Enable Read Replica** option to **Yes**. -{{% alert color="info" %}} For existing clusters, you can also enable or disable the read replica in the **Edit Cluster** flow.{{% /alert %}} + {{% alert color="info" %}} For existing clusters, you can also enable or disable the read replica in the **Edit Cluster** flow.{{% /alert %}} 2. Click **Next** to initialize the cluster. diff --git a/content/en/docs/deployment/mx-azure/mx-azure-backups.md b/content/en/docs/deployment/mx-azure/mx-azure-backups.md index a266d603fb6..7b3d75c9863 100644 --- a/content/en/docs/deployment/mx-azure/mx-azure-backups.md +++ b/content/en/docs/deployment/mx-azure/mx-azure-backups.md @@ -25,17 +25,18 @@ You must have **Manage Apps Backups** permission for the namespace to use this f 2. Click **Backups** in the navigation pane. 3. Choose the environment to back up from the environment dropdown. -{{% alert color="info" %}} + {{% alert color="info" %}} + Backups cannot be created while the environment is in any of these states: * Creation in progress * Creation failed * Deployment package is being deployed -* Environment is in transition state (runtime processing) -{{% /alert %}} +* Environment is in transition state (runtime processing) + {{% /alert %}} -4. Click **Create Backup**. -5. Monitor progress in the **Status** column. +1. Click **Create Backup**. +1. Monitor progress in the **Status** column. {{% alert color="info" %}} Tables are locked during backup creation, so if you attempt to start the environment while a backup is in progress, you may encounter a timeout error. Wait for backup completion before restarting. diff --git a/content/en/docs/deployment/mx-azure/mx-azure-support.md b/content/en/docs/deployment/mx-azure/mx-azure-support.md index d2593b7013b..17a03eac1d4 100644 --- a/content/en/docs/deployment/mx-azure/mx-azure-support.md +++ b/content/en/docs/deployment/mx-azure/mx-azure-support.md @@ -241,8 +241,9 @@ Customers can completely off-board from the service by deleting the Managed Appl * Delete the cluster registration from the Mendix on Azure and Mendix on Kubernetes Portals. * While Mendix does have an emergency procedure available to help revive an environment and restore data in case the Managed Application gets deleted by accident, it is a higheffort manual process requiring close collaboration between Mendix and the customer. Given this, we advise customers to exercise extreme caution when deleting the Managed Application from their Azure subscription to avoid the need of this emergency procedure to be executed. -## Known Limitations +## Known Limitations {#limitations} * Only apps on Mendix version 10.10 or later are supported. Deployment for earlier versions will fail. * Certain Mendix on Kubernetes APIs (Create, Edit, or Delete cluster and namespace operations) are unavailable in Mendix on Azure due to managed architecture. Other APIs function normally. * Downtime or issues with Mendix on Kubernetes may affect Mendix on Azure availability (for example, cluster creation may not be possible). +* [Remote microflow debugging](/refguide/debug-microflows-remotely/) is not currently available for Mendix on Azure, because the remote debugger does not support single-instance apps. This issue will be resolved in a future release. diff --git a/content/en/docs/deployment/private-cloud/private-cloud-cluster/_index.md b/content/en/docs/deployment/private-cloud/private-cloud-cluster/_index.md index 55132a0170c..f499c350644 100644 --- a/content/en/docs/deployment/private-cloud/private-cloud-cluster/_index.md +++ b/content/en/docs/deployment/private-cloud/private-cloud-cluster/_index.md @@ -1359,14 +1359,14 @@ You can invite additional members to the namespace, and configure their role dep 2. **Administrator** – a standard set of rights needed by an administrator, these are listed on the screen 3. **Custom** – This option is now deprecated. -{{% alert color="info" %}} -The custom permission if needed to be edited, a role need to be assigned with appropriate permissions. See [Roles and Permissions](/developerportal/deploy/private-cloud-cluster/#rolesandpermissions) for more information. -{{% /alert %}} - -{{% alert color="info" %}} -If an application is in the Stopped state, the scaling does not come into effect until the application is Started. This means that you have to click **Start application** in order for the changes to be sent to the cluster. -Along with this, we have also decoupled the permission for modifying the MxAdmin password and managing environments. -{{% /alert %}} + {{% alert color="info" %}} + The custom permission if needed to be edited, a role need to be assigned with appropriate permissions. See [Roles and Permissions](/developerportal/deploy/private-cloud-cluster/#rolesandpermissions) for more information. + {{% /alert %}} + + {{% alert color="info" %}} + If an application is in the Stopped state, the scaling does not come into effect until the application is Started. This means that you have to click **Start application** in order for the changes to be sent to the cluster. + Along with this, we have also decoupled the permission for modifying the MxAdmin password and managing environments. + {{% /alert %}} 6. Click **Send Invite** to send an invite to this person. diff --git a/content/en/docs/deployment/private-cloud/private-cloud-cluster/networking/_index.md b/content/en/docs/deployment/private-cloud/private-cloud-cluster/networking/_index.md index 9bdb597ef6a..eb53809a173 100644 --- a/content/en/docs/deployment/private-cloud/private-cloud-cluster/networking/_index.md +++ b/content/en/docs/deployment/private-cloud/private-cloud-cluster/networking/_index.md @@ -77,7 +77,7 @@ OpenShift Routes remain a suitable choice if meet your current needs and you do ## Known Issues -* Application load balancers do not work correctly with HTTP2 WebSockets. +* AWS Application Load Balancers do not work correctly with HTTP2 WebSockets. As a workaround, you can use HTTP1 as the ingress backend protocol: `alb.ingress.kubernetes.io/backend-protocol-version: HTTP1` diff --git a/content/en/docs/deployment/private-cloud/private-cloud-cluster/networking/private-cloud-advanced-ingress-settings.md b/content/en/docs/deployment/private-cloud/private-cloud-cluster/networking/private-cloud-advanced-ingress-settings.md index c41e89a18d1..7b0110da034 100644 --- a/content/en/docs/deployment/private-cloud/private-cloud-cluster/networking/private-cloud-advanced-ingress-settings.md +++ b/content/en/docs/deployment/private-cloud/private-cloud-cluster/networking/private-cloud-advanced-ingress-settings.md @@ -69,15 +69,19 @@ In this way, you can configure the following settings: * Specify the name of an existing TLS certificate secret. * Provide TLS Certificate and Private Key values directly in the environment specification. -## Configuring Headers in NGINX Ingress +## Configuring HTTP Headers -For NGINX Ingress, you can set headers in a namespace which will further be propagated across all apps in that namespace by using a configuration snippet in the OperatorConfiguration object. Alternatively, you can configure headers for individual app environments by adding the `nginx.ingress.kubernetes.io/configuration-snippet` annotation in the Mendix on Kubernetes Portal. +You can configure HTTP headers for NGINX Ingress and for Mendix Runtime. For more information, refer to the following sections. + +### Configuring Headers in NGINX Ingress + +For NGINX Ingress (from F5 Networks), you can use a configuration snippet in the `OperatorConfiguration` object to set headers in a namespace. The headers that you set are then further propagated across all apps in that namespace. Alternatively, you can configure headers for individual app environments by adding the `nginx.org/location-snippets` annotation in the Mendix on Kubernetes Portal. {{< figure src="/attachments/deployment/private-cloud/private-cloud-cluster/private-cloud-networking/advanced-headers.png" class="no-border" >}} -Mendix only supports unencrypted HTTP between the Ingress controller and the app. However, there is no higher level of security with service-to-service encryption and policy controls. In such situation, integrating Ingress controllers with Istio Service Mesh or Linkerd can help you manage both external traffic entering your Kubernetes cluster (by using an Ingress Controller) and internal traffic between services (by using Istio or Linkerd). +Mendix only supports unencrypted HTTP between the Ingress controller and the app. However, there is no higher level of security with service-to-service encryption and policy controls. In such situations, integrating Ingress controllers with Istio Service Mesh or Linkerd can help you manage both external traffic entering your Kubernetes cluster (by using an Ingress Controller) and internal traffic between services (by using Istio or Linkerd). -Istio Service Mesh and Linkerd help manage service-to-service communication within a Kubernetes cluster. It provides features such as the following: +Istio Service Mesh and Linkerd help manage service-to-service communication within a Kubernetes cluster. It provides the following features: * Traffic management (for example, canary releases) * Service discovery @@ -91,7 +95,15 @@ In an Istio- or Linkerd-enabled Kubernetes cluster, an Ingress controller can be AWS Application Load Balancer and Azure Application Gateway Ingress Controller only work with Istio. {{% /alert %}} -### Istio Service Mesh Integration with Ingress Controller +### Configuring Headers in the Mendix Runtime + +Starting from Mendix 10.24.1, the Mendix Runtime can set headers natively, without relying on an external Ingress controller. + +This allows specifying security headers such as `Content-Security-Policy` with any Ingress controller, not just NGINX Ingress. + +To set headers, use the [Network Tab](/developerportal/deploy/private-cloud-deploy/#network-tab) (for Connected environments) or the [Headers](/refguide/custom-settings/#Headers) Custom Runtime Setting the [.spec.runtime.customConfiguration field](/developerportal/deploy/private-cloud-operator/#edit-cr) in the MendixApp CR. + +## Istio Service Mesh Integration with Ingress Controller To integrate the Istio Service Mesh with an Ingress Controller, perform the following steps: @@ -111,7 +123,6 @@ To integrate the Istio Service Mesh with an Ingress Controller, perform the foll 6. In Istio, configure a [Gateway](https://istio.io/latest/docs/reference/config/networking/gateway/) resource to allow traffic through the ingress gateway. 7. Define a [VirtualService](https://istio.io/latest/docs/reference/config/networking/virtual-service/) to route traffic from the gateway to a service in the mesh. -#### Configuring the Istio Service Mesh in the Mxpc-cli Tool To configure the Istio Service Mesh for Mendix on Kubernetes, set up the following settings: @@ -124,7 +135,7 @@ To configure the Istio Service Mesh for Mendix on Kubernetes, set up the followi {{< figure src="/attachments/deployment/private-cloud/private-cloud-cluster/private-cloud-networking/advanced-istio.png" class="no-border" >}} -### Installing Linkerd +## Installing Linkerd To install Linkerd, perform the following steps: @@ -141,7 +152,7 @@ To install Linkerd, perform the following steps: kubectl annotate {namespace} linkerd.io/inject=enabled ``` -#### Configuring Linkerd Ingress in the Mxpc-cli Tool +### Configuring Linkerd Ingress in the Mxpc-cli Tool To configure Linkerd for Mendix on Kubernetes, set up the following settings: diff --git a/content/en/docs/deployment/private-cloud/private-cloud-cluster/networking/private-cloud-ingress.md b/content/en/docs/deployment/private-cloud/private-cloud-cluster/networking/private-cloud-ingress.md index 3857d97e99f..3d70b5b82fe 100644 --- a/content/en/docs/deployment/private-cloud/private-cloud-cluster/networking/private-cloud-ingress.md +++ b/content/en/docs/deployment/private-cloud/private-cloud-cluster/networking/private-cloud-ingress.md @@ -24,23 +24,27 @@ To ensure proper routing, the DNS server must be configured to direct all subdom The following sections describe the installation and configuration of various supported Ingress Controllers. -### NGINX Ingress Controller +### NGINX Ingress Controller (F5) -The [NGINX Ingress Controller](https://docs.nginx.com/nginx-ingress-controller/) is an open-source solution that leverages NGINX as a reverse proxy and load balancer to manage Kubernetes Ingress resources. +{{% alert color="info" %}} +This section documents how to use the [NGINX Ingress Controller](https://github.com/nginx/kubernetes-ingress) from the NGINX project (F5 Networks). +{{% /alert %}} {{% alert color="info" %}} -NGINX path based routing is supported for Operator version 2.19.0 and newer, and Mendix version 10.3.0 and newer. To support this feature, NGINX Ingress uses `nginx.ingress.kubernetes.io/rewrite-target/(.*)` in the ingress path. +NGINX path based routing is supported for Operator version 2.19.0 and newer, and Mendix version 10.3.0 and newer. To support this feature, NGINX Ingress uses `nginx.org/rewrite-target=/$1` annotation that rewrites a `(.*)` regular expresion in the ingress path. {{% /alert %}} -#### Installing NGINX +#### Installing NGINX Ingress Controller -The recommended way to install NGINX is [Helm](https://docs.nginx.com/nginx-ingress-controller/installation/installing-nic/installation-with-helm/). Alternatively, you can also install NGINX with a [manifest](https://kubernetes.github.io/ingress-nginx/deploy/). +The recommended way to install NGINX is [Helm](https://docs.nginx.com/nginx-ingress-controller/installation/installing-nic/installation-with-helm/). -##### Configuring NGINX in the Mxpc-cli Tool +Some cloud providers might offer NGINX Ingress as a managed service. + +##### Configuring NGINX Ingress in the Mxpc-cli Tool To configure NGINX for Mendix on Kubernetes, set up the following settings: -* **Ingress Type** - Select **kubernetes-ingress**; this option configures the Ingress according to the additional domain name you supply. +* **Ingress Type** - Select **kubernetes-ingress**; this option configures the Ingress according to the additional domain name you supply. * **Ingress Domain Name** - Provide the domain name which you want to set for the Ingress resource file. * **Ingress Path** - Optional. You can use this option to specify the Ingress path. The default value is `/`. * **Enable TLS** - Enable or disable TLS for your app's Ingress. @@ -50,6 +54,63 @@ To configure NGINX for Mendix on Kubernetes, set up the following settings: {{< figure src="/attachments/deployment/private-cloud/private-cloud-cluster/private-cloud-networking/configure-nginx.png" class="no-border" >}} +Additionally, you can add NGINX-specific annotations to the **Ingress** section of your configuration. The following section shows example annotations. Adjust them as needed based on your specific requirements. + +```text +apiVersion: privatecloud.mendix.com/v1alpha1 +kind: OperatorConfiguration +# ... +# omitted lines for brevity +# ... +spec: + # Endpoint (Network) configuration + endpoint: + type: ingress + ingress: + annotations: + # Example: allow uploads of files up to 500MB in size + nginx.org/client-max-body-size: 500m + # Example: rewrite path for path-based routing + nginx.org/rewrite-target: /$1 + # Example: enable regular expressions for path-based routing + nginx.org/path-regex: case_sensitive + # The following parameters are already configured by mxpc-cli + domain: mendix.example.com + enableTLS: true + ingressClassName: nginx + # Set the path to "/(.*)" when using path-based routing + # When not using path-based routing, set the path to "/" + path: "/(.*)" + pathType: ImplementationSpecific +# ... +# omitted lines for brevity +# ... +``` + +### HAProxy Ingress Controller + +{{% alert color="info" %}} +This section documents how to use the [HAProxy Kubernetes Ingress Controller](https://github.com/haproxytech/kubernetes-ingress). +{{% /alert %}} + +#### Installing HAProxy Ingress Controller + +For more information about the recommended installation process, see [installation instructions for your platform](https://www.haproxy.com/documentation/kubernetes-ingress/community/installation/). + +##### Configuring HAProxy Ingress in the Mxpc-cli Tool + +To configure HAProxy Ingress for Mendix on Kubernetes, set up the following settings: + +* **Ingress Type** - Select **kubernetes-ingress**; this option configures the Ingress according to the additional domain name you supply. +* **Ingress Domain Name** - Provide the domain name which you want to set for the Ingress resource file. +* **Ingress Path** - Select `/` from the dropdown. +* **Enable TLS** - Enable or disable TLS for your app's Ingress. +* **Custom Ingress Class** - Set to **enabled**. +* **Ingress Class Name** - Enter **haproxy**. This setting requires Custom Ingress Class to be enabled. +* **Set Ingress Class as Annotation** - Set to **disabled**. This option adds the legacy `kubernetes.io/ingress.class` annotation to set the Ingress class, instead of using the Ingress class name. + +Additionally, you can add HAProxy-specific annotations to the **Ingress** section of your configuration. The following section shows example annotations. Adjust them as needed based on your specific requirements. + ### AWS Load Balancer Ingress Controller [AWS Load Balancer Controller](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/) is the AWS-recommended way to provide ingress capability on EKS. @@ -74,7 +135,7 @@ To configure the AWS Load Balancer for Mendix on Kubernetes, perform the followi 1. Set up the following settings: - * **Ingress Type** - Select **kubernetes-ingress**; this option configures the Ingress according to the additional domain name you supply. + * **Ingress Type** - Select **kubernetes-ingress**; this option configures the Ingress according to the additional domain name you supply. * **Ingress Domain Name** - Provide the domain name which which was registered for AWS Load Balancer. * **Ingress Path** - Set to `/*`. * **Enable TLS** - Set to **disabled**. In AWS Load Balancer, TLS is enabled through annotations. @@ -157,7 +218,7 @@ To configure AGIC for Mendix on Kubernetes, perform the following steps: 1. Set up the following settings: - * **Ingress Type** - Select **kubernetes-ingress**; this option configures the Ingress according to the additional domain name you supply. + * **Ingress Type** - Select **kubernetes-ingress**; this option configures the Ingress according to the additional domain name you supply. * **Ingress Domain Name** - Provide the domain name which which was registered for AGIS. * **Ingress Path** - Set to `/*`. * **Enable TLS** - Enable or disable TLS for your app's Ingress. @@ -226,13 +287,64 @@ Traefik uses 2 types of providers: CRDs or Kubernetes Ingress. Ensure that you i #### Configuring Traefik in the Mxpc-cli Tool To configure Traefik for Mendix on Kubernetes, set up the following settings: - -* **Ingress Type** - Select **kubernetes-ingress**; this option configures the Ingress according to the additional domain name you supply. +* **Ingress Type** - Select **kubernetes-ingress**; this option configures the Ingress according to the additional domain name you supply. * **Ingress Domain Name** - Provide the domain name which was registered for Traefik -* **Ingress Path** - Set to `/*`. +* **Ingress Path** - Set to `/*`. * **Enable TLS** - Enable or disable TLS for your app's Ingress. * **Custom Ingress Class** - Set to **enabled**. * **Ingress Class Name** - Enter **traefik**. This setting requires Custom Ingress Class to be enabled. * **Set Ingress Class as Annotation** - Set to **disabled**. This option adds the legacy `kubernetes.io/ingress.class` annotation to set the Ingress class, instead of using the Ingress class name. {{< figure src="/attachments/deployment/private-cloud/private-cloud-cluster/private-cloud-networking/configure-traefik.png" class="no-border" >}} + +### Istio Ingress Controller + +Istio is a service mesh that includes a simple [ingress contoller](https://istio.io/latest/docs/tasks/traffic-management/ingress/kubernetes-ingress/). + +#### Installing Istio + +To install Istio, follow the [installation instructions](https://istio.io/latest/docs/overview/quickstart/). + +Ensure that you also install an [Istio IngressClass](https://istio.io/latest/docs/tasks/traffic-management/ingress/kubernetes-ingress/). + +{{% alert color="info" %}} +Istio is a feature-rich system with many configuration options. To validate an Istio configuration, it is highly recommended to test with a simple (non-Mendix) app to validate configuration. +{{% /alert %}} + +#### Configuring Istio in the Mxpc-cli Tool + +To configure Istio for Mendix on Kubernetes, configure the following settings: + +* **Ingress Type** - Select **kubernetes-ingress**; this option configures the Ingress according to the additional domain name you supply. +* **Ingress Domain Name** - Provide the domain name which was registered for Istio +* **Ingress Path** - Set to `/*`. +* **Enable TLS** - Enable or disable TLS for your app's Ingress. +* **Custom Ingress Class** - Set to **enabled**. +* **Ingress Class Name** - Enter **istio**. This setting requires **Custom Ingress Class** to be enabled. +* **Set Ingress Class as Annotation** - Set to **disabled**. This option adds the legacy `kubernetes.io/ingress.class` annotation to set the Ingress class, instead of using the Ingress class name. + +### NGINX Ingress Controller (Deprecated) + +{{% alert color="warning" %}} +The [Kubernetes Ingress NGINX Controller](https://kubernetes.github.io/ingress-nginx/) will be supported [until March 2026](https://kubernetes.io/blog/2025/11/11/ingress-nginx-retirement/). + +We recommend switching to another Ingress controller. The [NGINX Ingress Controller](https://github.com/nginx/kubernetes-ingress) from the NGINX project (F5 Networks) has a similar feature set. In most cases, switching from the deprecated Kubernetes controller to controller from F5 Networks only requires renaming Ingress annotations. +{{% /alert %}} + +{{% alert color="info" %}} +NGINX path based routing is supported for Operator version 2.19.0 and newer, and Mendix version 10.3.0 and newer. To support this feature, NGINX Ingress uses `nginx.ingress.kubernetes.io/rewrite-target=/$1` annotation that rewrites a `(.*)` regular expresion in the ingress path. +{{% /alert %}} + +##### Configuring the NGINX in the Mxpc-cli Tool + +To configure the deprecated NGINX ingress controller with Mendix on Kubernetes, set up the following settings: + +* **Ingress Type** - Select **kubernetes-ingress**; this option configures the Ingress according to the additional domain name you supply. +* **Ingress Domain Name** - Provide the domain name which you want to set for the Ingress resource file. +* **Ingress Path** - Optional. You can use this option to specify the Ingress path. The default value is `/`. +* **Enable TLS** - Enable or disable TLS for your app's Ingress. +* **Custom Ingress Class** - Set to **enabled**. +* **Ingress Class Name** - Enter **nginx**. This setting requires **Custom Ingress Class** to be enabled. +* **Set Ingress Class as Annotation** - Set to **disabled**. This option adds the legacy `kubernetes.io/ingress.class` annotation to set the Ingress class, instead of using the Ingress class name. + +{{< figure src="/attachments/deployment/private-cloud/private-cloud-cluster/private-cloud-networking/configure-nginx.png" class="no-border" >}} diff --git a/content/en/docs/deployment/private-cloud/private-cloud-cluster/private-cloud-global-operator.md b/content/en/docs/deployment/private-cloud/private-cloud-cluster/private-cloud-global-operator.md index cb4ab3dcd2d..0f6712d0cfa 100644 --- a/content/en/docs/deployment/private-cloud/private-cloud-cluster/private-cloud-global-operator.md +++ b/content/en/docs/deployment/private-cloud/private-cloud-cluster/private-cloud-global-operator.md @@ -51,7 +51,7 @@ To install and configure the Global Operator, perform the following steps: 2. [Sign into the Platform](/developerportal/deploy/standard-operator/#openshift-signin). 3. Perform the [Base Installation](/developerportal/deploy/standard-operator/#base-installation). - {{< figure src="/attachments/deployment/private-cloud/global-operator/global-operator6.png" class="no-border" >}} + {{< figure src="/attachments/deployment/private-cloud/global-operator/global-operator6.png" class="no-border" >}} 4. You can apply the custom TLS and proxy settings in the Global Operator main namespace by just selecting only the **Custom TLS** and **Proxy** options in the Configuration Tool. diff --git a/content/en/docs/deployment/private-cloud/private-cloud-supported-environments.md b/content/en/docs/deployment/private-cloud/private-cloud-supported-environments.md index 2ba2bdb4a56..4b6c59d1fdc 100644 --- a/content/en/docs/deployment/private-cloud/private-cloud-supported-environments.md +++ b/content/en/docs/deployment/private-cloud/private-cloud-supported-environments.md @@ -354,12 +354,7 @@ Mendix on Kubernetes will use the existing ingress controller. {{% /alert %}} {{% alert color="warning" %}} -We strongly recommend using the [NGINX Ingress Controller](https://kubernetes.github.io/ingress-nginx/), even if other Ingress controllers or OpenShift Routes are available. You may need to check which of the [several versions of the NGINX Ingress Controller](https://www.nginx.com/blog/guide-to-choosing-ingress-controller-part-4-nginx-ingress-controller-options/#NGINX-vs.-Kubernetes-Community-Ingress-Controller) is installed in your cluster. Mendix recommends the "community version". - -NGINX Ingress can be used to deny access to sensitive URLs, add HTTP headers, enable compression, and cache static content. -NGINX Ingress is fully compatible with [cert-manager](https://cert-manager.io/), removing the need to manually manage TLS certificates. In addition, NGINX Ingress can use a [Linkerd](https://linkerd.io/) Service Mesh to encrypt network traffic between the Ingress Controller and the Pod running a Mendix app. - -These features will likely be required once your application is ready for production. +The [Kubernetes Ingress NGINX Controller](https://kubernetes.github.io/ingress-nginx/) will be supported [until March 2026](https://kubernetes.io/blog/2025/11/11/ingress-nginx-retirement/). We recommend switching to another Ingress controller. The [NGINX Ingress Controller](https://github.com/nginx/kubernetes-ingress) from the NGINX project (F5 Networks) has a similar feature set. In most cases, switching from the deprecated Kubernetes controller to controller from F5 Networks only requires renaming Ingress annotations. {{% /alert %}} ### OpenShift Route @@ -386,11 +381,14 @@ It is also possible to provide a custom TLS configuration for individual environ Mendix on Kubernetes is compatible with the following ingress controllers: -* [NGINX Ingress Controller](https://kubernetes.github.io/ingress-nginx/) +* [NGINX Ingress Controller](https://github.com/nginx/kubernetes-ingress) from the NGINX project * [Traefik](https://traefik.io/traefik/) +* [Istio Kubernetes Ingress](https://istio.io/latest/docs/tasks/traffic-management/ingress/kubernetes-ingress/) +* [HAProxy Kubernetes Ingress Controller](https://github.com/haproxytech/kubernetes-ingress) * [AWS Application Load Balancer](https://docs.aws.amazon.com/eks/latest/userguide/alb-ingress.html) * [Ingress for External Application Load Balancer](https://cloud.google.com/kubernetes-engine/docs/concepts/ingress-xlb) * [Azure Application Gateway Ingress Controller](https://learn.microsoft.com/en-us/azure/application-gateway/ingress-controller-overview) +* [Deprecated Kubernetes Ingress NGINX Controller](https://kubernetes.github.io/ingress-nginx/) from the Kubernetes project - ⚠️ supported only until March 2026 For ingress, it is possible to do the following: diff --git a/content/en/docs/developerportal/app-insights/feedback.md b/content/en/docs/developerportal/app-insights/feedback.md index f29dec02b5e..9438479fc75 100644 --- a/content/en/docs/developerportal/app-insights/feedback.md +++ b/content/en/docs/developerportal/app-insights/feedback.md @@ -133,7 +133,8 @@ On the **Groups** tab, you can open group details by clicking the group in the l The following options are available: * **Ungroup** – Ungroup all feedback in the group. This action does not delete the group. -* **Delete Group** – Delete the group and all feedback within it. This action is destructive and, once you delete a group with feedback, the feedback is also deleted. +* **Delete Group** – Delete the group. + {{% alert color="warning" %}}
  • This action is destructive and, once you delete a group, all metadata belonging to the group is also deleted.
  • The feedback within the group is not deleted.
{{% /alert %}} * **Group Name** – The name of the group, which you can edit by clicking it. * **Description** – The description of the group. * **Tags** – Any tags assigned to the group. diff --git a/content/en/docs/howto9/monitoring-troubleshooting/populate-user-type.md b/content/en/docs/howto9/monitoring-troubleshooting/populate-user-type.md index 5e2cd6b47fc..09b5db3284d 100644 --- a/content/en/docs/howto9/monitoring-troubleshooting/populate-user-type.md +++ b/content/en/docs/howto9/monitoring-troubleshooting/populate-user-type.md @@ -11,11 +11,10 @@ In your Mendix Pricing Plan there is a distinction between Internal and External {{% alert color="info" %}} **Definitions** -* *Named User*¹ – an individual authorized by you to have access to your apps with unique login credentials, or an authorized external system that accesses or is accessed by your application. +* *Named User* – an individual authorized by you to have access to your apps with unique login credentials, or an authorized external system that accesses or is accessed by your application. * *Internal User* – a *Named User* who is an employee or contractor of your business. * *External User* – a *Named User* who is not an employee or contractor of your business, and is designated as an External User in the Mendix Platform. -¹You may re-assign the entitlement to access and use your applications from one Named User to another Named User within the same entitlement category (internal or external) once per calendar month. {{% /alert %}} ## Background diff --git a/content/en/docs/marketplace/deprecate-content/_index.md b/content/en/docs/marketplace/deprecate-content/_index.md new file mode 100755 index 00000000000..2f01add6d3a --- /dev/null +++ b/content/en/docs/marketplace/deprecate-content/_index.md @@ -0,0 +1,37 @@ +--- +title: "Deprecating Marketplace Content" +url: /appstore/deprecate-content/ +weight: 4 +description_list: true +description: "Describes how to deprecate components on the Mendix Marketplace." +--- + +## Introduction + +You can deprecate components that are no longer supported or maintained, or that have better alternatives. This offers Marketplace users a clear view of which components are not recommended, as well as which components they can use instead. + +You can deprecate components from several places: + +* The **My Components** page in the **Personal** section +* The **My Company Components** page in the **Company** section +* The component page in the Marketplace itself + +The steps are the same no matter where you are: + +1. Find the component you want to deprecate, and click its contextual menu. + On the **My Components** and **My Company Components** pages, this menu is available in the **Actions** column. +2. Click **Deprecate**. +3. In the **Deprecate Component** window that opens, fill in the following information: + + * Add a **Reason for Deprecation**. This is a mandatory field. + * Choose one or more alternative components that can be used instead of the one you are deprecating. This is optional. + +4. Click **Deprecate Component**. + +A badge is now displayed across the component's Marketplace page, letting users know why it was deprecated, and what alternative components are recommended by Mendix. + +## Permissions + +If you are a company admin or a component developer, you can deprecate both personal components, and company components. +However, if the component is part of a content group, you need to be a member of that group to be able to deprecate components. +For details, refer to the [Content Group](/appstore/home-page/#content-groups) section in *Marketplace Home Page*. \ No newline at end of file diff --git a/content/en/docs/marketplace/genai/_index.md b/content/en/docs/marketplace/genai/_index.md index 6e9e08cbf32..84b846e1bc8 100644 --- a/content/en/docs/marketplace/genai/_index.md +++ b/content/en/docs/marketplace/genai/_index.md @@ -3,7 +3,7 @@ title: "Enrich Your Mendix App with GenAI Capabilities" url: /appstore/modules/genai/ linktitle: "GenAI Capabilities of Mendix" description: "Describes the general properties and common concepts of generative AI in the context of developing Mendix applications and illustrates the preferred way of leveraging platform-supported connectors in applications following the GenAI Commons patterns." -weight: 6 +weight: 7 --- ## Introduction {#introduction} diff --git a/content/en/docs/marketplace/genai/mendix-cloud-genai/mendix-cloud-grp.md b/content/en/docs/marketplace/genai/mendix-cloud-genai/mendix-cloud-grp.md index a9387064823..fa979a13469 100644 --- a/content/en/docs/marketplace/genai/mendix-cloud-genai/mendix-cloud-grp.md +++ b/content/en/docs/marketplace/genai/mendix-cloud-genai/mendix-cloud-grp.md @@ -45,6 +45,28 @@ Customers looking to leverage other models in addition to the above can also tak | Anthropic Claude (any version) (Tokens out/month) | 1.25 million | 2.5 million | 5 million | | Cohere Embed V3 (Tokens in/month) | 5 million | 10 million | 20 million | +## Accessing GenAI Resources + +Developers can easily obtain access to GenAI resources through a self-service capability, enabling them to access and manage GenAI resources independently. +Developers with the required prerequisites can use the self-service capability to provision, deprovision, and manage GenAI resources directly from the Control Center. This enables faster provisioning and reduces manual dependency. +For developers who do not have self-service capabilities, GenAI resources can still be provisioned or deprovisioned by contacting sales representatives or customer success manager (CSM) to order an existing stock keeping unit (SKU). +Both approaches allow users to scale GenAI resources efficiently and explore more generative AI solutions with Mendix. + +### Provisioning GenAI Resources Using the Self-Service Capability + +When using the self-service capability, Mendix Admins can manage the provisioning and deprovisioning of GenAI resources directly through the [Control Center](https://controlcenter.mendix.com/index.html). They can provision the new resource, review it, and open it in a new tab of the [Mendix Cloud GenAI portal](https://genai.home.mendix.com/p/homepage). For more information, refer to [GenAI Resources](/control-center/genai-resources-self-service/). + +To provision GenAI resources successfully using self-service, ensure that you meet the requirements below: + +1. Mendix Admins can access the Control Center to provision or deprovision the GenAI resources. +2. You have sufficient free Mendix Cloud Tokens. These tokens are required to allocate GenAI capacity. For more information, refer to [Cloud Tokens](/control-center/cloud-tokens/). + +For further details, refer to the [Prerequisites](/control-center/genai-resources-self-service/#prerequisites) section of *GenAI Resources*. + +### Provisioning GenAI Resources Without Using the Self-Service Capability + +If the self-service capability is not available in your environment, you can still provision your GenAI resources by ordering the existing SKU associated to your Mendix subscription. To do so, you can contact your sales representative or CSM. + ## Knowledge Bases Mendix Cloud Knowledge Base Resource Packs provide customers with an elastic, logically isolated vector database, to use for standard Generative AI architectural patterns such as Retrieval-Augmented Generation (RAG), semantic similarity search, and other Generative AI use cases. The Knowledge Bases on Mendix Cloud are based on AWS's highly secure Amazon Bedrock Knowledge Bases capability, combined with AWS' OpenSearch Serverless database— a widely adopted standard infrastructure for Generative AI Knowledge Bases on AWS, ensuring fast & accurate information retrieval. diff --git a/content/en/docs/marketplace/genai/mendix-cloud-genai/navigate_mxgenai.md b/content/en/docs/marketplace/genai/mendix-cloud-genai/navigate_mxgenai.md index e2ba353b2d5..5516d22be94 100644 --- a/content/en/docs/marketplace/genai/mendix-cloud-genai/navigate_mxgenai.md +++ b/content/en/docs/marketplace/genai/mendix-cloud-genai/navigate_mxgenai.md @@ -23,14 +23,14 @@ The **Settings** tab contains the details of a GenAI resource. It shows the foll * **Display Name**: indicates the name of the resource. * **ID**: indicates the resource ID. * **Region(s)**: the region where the resource is hosted. -* **Cross Region Inference (CRI)**: shows if the model supports cross-region inference*. +* **Cross Region Inference (CRI)**: shows if the model supports cross-region inference ¹. * **Cloud Provider**: indicates the cloud provider, for example, AWS. * **Type**: this is the type of resource, for example, Text Generation, Embedding, Knowledge Base, etc. * **Model**: indicates which model is used, for example, Anthropic Claude Sonnet 3.5. * **Plan**: indicates the subscription plan used for compute resources (for example, embedding or text generation resources). * **Environment**: shows which environment is used, for example, test, acceptance, or production. -\* Cross-region inference (CRI) allows a model to redirect requests to another region, helping to distribute the load across multiple regions within the same area. So, EU requests always stay within EU regions. Connecting to a cross-region inference profile does not change how the request is sent; the redirection happens on the server side, determining the region to handle the request to get the fastest response. For more information, see [Increase throughput with cross-Region inference](https://docs.aws.amazon.com/bedrock/latest/userguide/cross-region-inference.html). If applicable, CRI profiles are selected during provisioning of a model resource. +¹ Cross-region inference (CRI) allows a model to redirect requests to another region, helping to distribute the load across multiple regions within the same area. So, EU requests always stay within EU regions. Connecting to a cross-region inference profile does not change how the request is sent; the redirection happens on the server side, determining the region to handle the request to get the fastest response. For more information, see [Increase throughput with cross-Region inference](https://docs.aws.amazon.com/bedrock/latest/userguide/cross-region-inference.html). If applicable, CRI profiles are selected during provisioning of a model resource. New models are available under the CRI inferencing type by default. #### Additional Details for Knowledge Base Resources diff --git a/content/en/docs/marketplace/overview/component-details.md b/content/en/docs/marketplace/overview/component-details.md index 2ab04bfb1cb..d669bf24f63 100644 --- a/content/en/docs/marketplace/overview/component-details.md +++ b/content/en/docs/marketplace/overview/component-details.md @@ -10,8 +10,6 @@ description: "Presents information on the component details page." Clicking the tile of a [Marketplace](https://marketplace.mendix.com/) component brings you to its details page with the sections described in this document. -{{< figure src="/attachments/appstore/component-details/marketplace_module.png">}} - ## Component Header {#header} The header for a component includes the following details: @@ -32,6 +30,15 @@ The header for a component includes the following details: * **Download** for other content types – Click this to download the component. * **Contact Us** – Click this to contact Mendix or the community supplier. +* Contextual menu – Allows you to perform the following actions on the component: + + * **Add New Release** – Add a new version of the component. + * **Manage Versions** – Edit or unpublish any version of the component. + * **Deprecate Component** – Deprecate the component, and select alternatives. + For details on deprecating components, refer to [Deprecating Marketplace Content](/appstore/deprecate-content/). + + If a component has already been deprecated, the only option available in the contextual menu is **Unpublish Component**. + The **Publisher** section includes the following information, depending on the type of component: * The name of the company that created the component @@ -45,9 +52,9 @@ The **Requirements** section includes the following: * The Studio Pro version required for the component to work * The type of [license](/appstore/submit-content/#license) for the component -The **Support** section presents the category of support Mendix offers for the component (for more details, see the [Marketplace Content Support](/appstore/marketplace-content-support/) section below). +The **Support** section presents the category of support Mendix offers for the component. For more details, refer to the [Marketplace Content Support](/appstore/marketplace-content-support/) section. -A **GitHub** link will take you to the GitHub source files of the component. +A **GitHub** link takes you to the GitHub source files of the component. ## Component Tabs diff --git a/content/en/docs/marketplace/overview/marketplace-home-page.md b/content/en/docs/marketplace/overview/marketplace-home-page.md index f42c778581c..52b2875c3ac 100644 --- a/content/en/docs/marketplace/overview/marketplace-home-page.md +++ b/content/en/docs/marketplace/overview/marketplace-home-page.md @@ -40,28 +40,16 @@ You can refine search results using the following filters: For details on finding and installing Marketplace content in Studio Pro, see the [Finding and Downloading Content in Studio Pro](/appstore/use-content/#downloading) section of *Using Marketplace Content*. {{% /alert %}} -## Add Content - -Share new Marketplace content you have developed. - -For details, see [Uploading Content to the Marketplace](/appstore/submit-content/). - -## Get Studio Pro - -Download the latest version of [Studio Pro](/releasenotes/studio-pro/). - ## Personal {#personal} The **Personal** category contains the items described in the following sections. -### My Drafts {#my-drafts} +### Drafts {#my-drafts} -On this page, you can see and manage the drafts for all the Marketplace content you have started. +Clicking **Drafts** opens the **My Drafts** page, where you can see and manage the drafts for all the Marketplace content you have started. You can also find details on how many total drafts you have, which drafts are ready to publish or are awaiting approval, and which drafts have been declined. -{{< figure src="/attachments/appstore/marketplace-home-page/my-drafts.png" class="no-border" >}} - These are the possible **Status** entries for each item: * **Incomplete draft** – The draft is incomplete and requires additional information before you can submit it. @@ -76,29 +64,37 @@ Click **More Options** ({{% icon name="three-dots-menu-horizontal" %}}) on a com * **Withdraw Draft** – Withdraw content from the review process after you have submitted it for approval. This returns the content to draft state. * **Delete** – Delete the draft. -### My Content {#my-content} +Keep in mind the following: -On this page, you can see the Marketplace content for which you have created at least one version. +* Only one draft version of a component can exist at a time, so when one draft version is in progress, you cannot initiate another. +* If there is a draft version in progress, you can edit or delete it. +* If there is a draft version in progress, and it is assigned to another user, you can reassign it to to yourself. -Click the name of the component to access its [details page](/appstore/component-details/). +For more information on creating a draft version, refer to the [Updating Existing Marketplace Content](/appstore/submit-content/#updating) section of *Uploading to the Marketplace*. -Click the context menu to access options for managing your content: +### Components {#my-content} -{{< figure src="/attachments/appstore/marketplace-home-page/my-content.png" width="400" class="no-border" >}} +Clicking **Components** opens the **My Components** page, where you can see a list of the Marketplace components for which you have created at least one version. +Clicking the name of a component in the list opens its [details page](/appstore/component-details/). -* **Manage Drafts** – Manage the drafts of the component. - * Only one draft version of a component can exist at a time, so when one draft version is in progress, you cannot initiate another. - * If there is a draft version in progress, you can edit or delete it. - * If there is a draft version in progress, and it is assigned to another user, you can reassign it to to yourself. +Click the contextual **Actions** menu to access options for managing your content: + +* **Add New Release** – Add a new version of the component. +* **Manage Versions** – Edit or unpublish any version of the component. + Keep in mind the following: - For more information on creating a draft version, see the [Updating Existing Marketplace Content](/appstore/submit-content/#updating) section of *Uploading to the Marketplace*. -* **Edit a Version** – Edit the component. For details on editing, see the [Adding New Marketplace Content](/appstore/submit-content/#adding) section of *Uploading to the Marketplace*. -* **Unpublish a Version** – Remove one or all versions of the component. * If the component is [protected](#group-content) within a [content group](#content-groups), a [group member](#members) can unpublish any version. * If the component is not protected within a content group, you can only unpublish a version that you have published yourself. - * Select **Unpublish All My Versions** to remove all your versions of the component. + * Select **Unpublish** to remove all your versions of the component. + * The option to unpublish is only available for deprecated components. + + For details on editing, refer to the [Adding New Marketplace Content](/appstore/submit-content/#adding) section of *Uploading to the Marketplace*. + +* **Deprecate Component** – Deprecate the component, and select alternatives. + For details on deprecating components, refer to [Deprecating Marketplace Content](/appstore/deprecate-content/). -A **Private** label on a component means the component is your company's private Marketplace content. For details on how this is configured, see the [Adding New Marketplace Content](/appstore/submit-content/#adding) section of *Uploading to the Marketplace*. This content can be shared with [guests](#guests). + +A **Private** label on a component means the component is your company's private Marketplace content. For details on how this is configured, refer to the [Adding New Marketplace Content](/appstore/submit-content/#adding) section of *Uploading to the Marketplace*. This content can be shared with [guests](#guests). A component assigned as [group content](#group-content) will have a label for the [content group](#content-groups) to which it is assigned. @@ -106,48 +102,44 @@ A component assigned as [group content](#group-content) will have a label for th This page contains private content shared with you by other companies who have marked you as a [guest](#guests). -### Saved Content {#saved-components} +### Saved {#saved-components} -This page presents the Marketplace content you have [saved](/appstore/component-details/). +Clicking **Saved** opens the **Saved Content** page, which presents the Marketplace content you have [saved](/appstore/component-details/). Click the name of the component to access its [details page](/appstore/component-details/). -Click the context menu to access options for managing this component: - -{{< figure src="/attachments/appstore/marketplace-home-page/saved.png" width="400" class="no-border" >}} +Click the contextual menu to access options for managing this component: * **Receive/Stop Email Notifications** – Start receiving email notifications, or stop the notifications if they are enabled. * **Unsave** – Remove the component from your saved content. -### My Reviews {#my-reviews} +### Reviews {#my-reviews} -This page contains reviews of [My Content](#my-content) by other users, as well as **My reviews** that you have written for other content. +Clicking **Reviews** opens the **My Reviews** page, which contains reviews of [My Components](#my-content) by other users, as well as **My reviews** that you have written for other content. ## Company {#company} The **Company** category contains the items described in the following sections. -### Company Content {#company-content} +### Components {#company-content} -On this page, you can see all the content your company has published to the Marketplace as private. +Clicking **Components** opens the **My Company Components** page, where you can see all the content your company has published to the Marketplace as private. Click the name of the component to access its [details page](/appstore/component-details/). -Click the context menu to access options for managing this content. - -{{< figure src="/attachments/appstore/marketplace-home-page/company-content.png" width="400" class="no-border" >}} +Click the contextual menu to access options for managing this content. -The options in this menu are the same as those for the [My Content](#my-content) section. However, the **Edit a Version** and **Unpublish a Version** options are only available for your own versions of company content. +The options in this menu are the same as those for the [My Components](#my-content) section. -### Content Group {#content-groups} +### Groups {#content-groups} -The **Content Group** menu item and page are visible to all users. However, only [Mendix Admins](/control-center/company-settings/) can create and delete content groups. Both [Group Admins](#members) and Mendix Admins can manage content group members. +Clicking **Groups** opens the **Content Groups** page. This is visible to all users, but only [Mendix Admins](/control-center/company-settings/) can create and delete content groups. Both [Group Admins](#members) and Mendix Admins can manage content group members. You can configure content groups for various levels of access to your company content. The available configuration tabs for each content group page are described in the following sections. This table breaks down the roles and permissions for content groups: -| Roles | Manage Groups (Create & Delete) | Manage Group Members | Assign Content to Group | Manage Content (Edit, Add New Version & Unpublish) | View & Download Group Content | View Group List | +| Roles | Manage Groups (Create & Delete) | Manage Group Members | Assign Content to Group | Manage Content (Add New Release, Manage Versions) | View & Download Group Content | View Group List | | ------------------------------------------- | ------------------------------- | -------------------- | ----------------------- | -------------------------------------------------- | ----------------------------- | --------------- | | Mendix Admin | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | | Group Admin | ✘ | ✔ | ✔ | ✔ | ✔ | ✔ | @@ -159,17 +151,13 @@ This table breaks down the roles and permissions for content groups: On this tab, you can assign content that can only be managed by members of this group. To assign a component to a content group, click **Assign Content**, and select a Marketplace component from the dialog box. -{{< figure src="/attachments/appstore/marketplace-home-page/group-content.png" width="400" class="no-border" >}} - {{% alert color="info" %}} A component can only be assigned to one content group at a time. If a component is already assigned to another content group, it will not be displayed in this dialog box. {{% /alert %}} -Click the context menu to access options for managing this content. - -{{< figure src="/attachments/appstore/marketplace-home-page/group-content-context.png" width="400" class="no-border" >}} +Click the contextual menu to access options for managing this content. -The options in this menu are the same as those for the [My Content](#my-content) section. The **Unassign from Group** button is only available for [Group Admins](#members), and can be used to remove content from the content group. +The options in this menu are the same as those for the [My Components](#my-content) section. The **Unassign from Group** button is only available for [Group Admins](#members), and can be used to remove content from the content group. #### Members Tab {#members} @@ -203,8 +191,13 @@ On this tab, you can enter a **Group Name** and a **Group Description**. To delete a content group, a Group Admin or Mendix Admin can click **Delete Group**. -## Data {#data} +## Download Studio Pro + +Download the latest version of [Studio Pro](/releasenotes/studio-pro/). + +## Publish Component + +Share new Marketplace content that you have developed. -The **Data** category contains the following items: +For details, refer to [Uploading Content to the Marketplace](/appstore/submit-content/). -* Catalog – Open the [Mendix Catalog](https://catalog.mendix.com/). diff --git a/content/en/docs/marketplace/partner-solutions/_index.md b/content/en/docs/marketplace/partner-solutions/_index.md index 1a911a4be7d..e31a30abf62 100644 --- a/content/en/docs/marketplace/partner-solutions/_index.md +++ b/content/en/docs/marketplace/partner-solutions/_index.md @@ -2,7 +2,7 @@ title: "Partner Solutions" url: /appstore/partner-solutions/ description: "Presents details on the partner solutions available in the Mendix Marketplace." -weight: 7 +weight: 8 no_list: false description_list: true --- diff --git a/content/en/docs/marketplace/platform-supported-content/_index.md b/content/en/docs/marketplace/platform-supported-content/_index.md index dccc24e0d57..2eb7563427e 100644 --- a/content/en/docs/marketplace/platform-supported-content/_index.md +++ b/content/en/docs/marketplace/platform-supported-content/_index.md @@ -1,7 +1,7 @@ --- title: "Platform-Supported Content" url: /appstore/platform-supported-content/ -weight: 5 +weight: 6 description: "" no_list: false --- diff --git a/content/en/docs/marketplace/platform-supported-content/modules/SAML/_index.md b/content/en/docs/marketplace/platform-supported-content/modules/SAML/_index.md index c0d85094895..0abcefa1579 100644 --- a/content/en/docs/marketplace/platform-supported-content/modules/SAML/_index.md +++ b/content/en/docs/marketplace/platform-supported-content/modules/SAML/_index.md @@ -524,20 +524,6 @@ Page URLs and Microflow URLs are supported with SAML for Mendix version 10.6 and 1. In the **Runtime** tab of the **App Settings**, configure the page **URL prefix** to **link** instead of the default **P** to maintain compatibility with existing URLs. 2. Ensure to remove the Deep Link module from your app to start the app successfully. For more information, see the [Migrating to Page and Microflow URLs](/appstore/modules/deep-link/#migrate-page-micro) section of the *Deep Link*. -#### Steps for SAML Versions Below v3.6.15 and v4.0.0 - -1. To implement the SSO redirection, add the following lines of code to your login page (for example, `login.html`): - * Extract the return URL: `var returnURL = window.location.hash.substring(1) + window.location.search;` - * For automatic redirection: use `window.onload` to automatically redirect users to the SSO login page. - `window.location.href = 'sso/login' + (returnURL ? '?cont=link' + encodeURIComponent(returnURL) : '');` or, - * For manual redirection: add an onclick event to the button that manually triggers the SSO login. - `this.href = 'sso/login' + (returnURL ? '?cont=link' + encodeURIComponent(returnURL) : '');` -2. To allow the end users to navigate to the desired page, URL can be formed as follows: - * If a single IdP is configured, the URL will be the base URL of your application followed by `SSO/login?cont={page/Microflowurl}`. - For example, `http://localhost:8080/SSO/login?cont=link/pagepath`. - * If Multiple IdPs are configured, you can specify which IdP should be used by adding the alias (MyIdPAlias) `SSO/login?_idp_id={MyIdPAlias}&cont={page/Microflowurl}`. - For example, `http://localhost:8080/SSO/login?_idp_id=Okta&cont=link/pagepath`. - #### Steps for SAML Versions above v3.6.17 and v4.0.1 1. To use the Page URL functionality, replace the content of *login.html* with the content of *login-with-mendixsso-automatically.html* (located in the **resources** > **mendixsso** > **templates** folder) without changing the file name. diff --git a/content/en/docs/marketplace/platform-supported-content/modules/azure/azure-blob-storage-connector.md b/content/en/docs/marketplace/platform-supported-content/modules/azure/azure-blob-storage-connector.md index 9dcce9d9697..53a265c5c95 100644 --- a/content/en/docs/marketplace/platform-supported-content/modules/azure/azure-blob-storage-connector.md +++ b/content/en/docs/marketplace/platform-supported-content/modules/azure/azure-blob-storage-connector.md @@ -121,7 +121,7 @@ To use this operation in your microflow, perform the following steps: 7. Configure a method to trigger the `ACT_PutBlob` microflow. For example, you can call the microflow with a custom button on a page in your app. For an example of how this can be implemented, see [Creating a Custom Save Button with a Microflow](/refguide/creating-a-custom-save-button/). -The operation returns a **PutBlobRequestResponse** object, which is empty on itself, only its generization AbstractResponse entity contains the http status code and optional the http reason phrase. +The operation returns a **PutBlobRequestResponse** object, which is empty on itself, only its generalization AbstractResponse entity contains the http status code and optional the http reason phrase. #### GET_v1_Azure_GetBlob @@ -142,7 +142,7 @@ To use this operation in your microflow, perform the following steps: 3. Call the **GET_v1_Azure_GetBlob** action in your microflow. The operation returns a **GetBlobResponse** object with the returned Blob associated with it. -Its generization AbstractResponse entity contains the http status code and optional the http reason phrase. +Its generalization AbstractResponse entity contains the http status code and optional the http reason phrase. #### DELETE_v1_Azure_DeleteBlob @@ -157,11 +157,11 @@ To use this operation in your microflow, perform the following steps: * `BlobName` - Required; name of the blob to delete * `ContainerName` - Required; name of the container where the blob is stored -3. Provide a valid credentials object by using the **AbstractCredentials** parameter. -4. Call the **DELETE_v1_Azure_DeleteBlob** action in your microflow. +2. Provide a valid credentials object by using the **AbstractCredentials** parameter. +3. Call the **DELETE_v1_Azure_DeleteBlob** action in your microflow. The operation returns a **DeleteBlobResponse** object, which is a generalization of **AbstractResponse** and contains the **StatusCode** and **ReasonPhrase**. -Its generization AbstractResponse entity contains the http status code and optional the http reason phrase. +Its generalization AbstractResponse entity contains the http status code and optional the http reason phrase. #### GET_v1_Azure_ListBlobs @@ -178,11 +178,11 @@ To use this operation in your microflow, perform the following steps: * `MaxResults` - Optional; the maximum number of results listed by the **ListBlobs** operation. * `Marker` - Optional; the marker used to get the next (sub)set of blobs from the specified location.. -3. Provide a valid credentials object by using the **AbstractCredentials** parameter. -4. Call the **GET_v1_Azure_ListBlobs** action in your microflow. +2. Provide a valid credentials object by using the **AbstractCredentials** parameter. +3. Call the **GET_v1_Azure_ListBlobs** action in your microflow. The operation returns a list of **Blob** objects associated to the **ListBlobResponse**, which is a generalization of **AbstractResponse** and contains the **StatusCode** and **ReasonPhrase**. -Its generization AbstractResponse entity contains the http status code and optional the http reason phrase. +Its generalization AbstractResponse entity contains the http status code and optional the http reason phrase. #### GET_v1_Azure_ListContainers @@ -202,7 +202,7 @@ To use this operation in your microflow, perform the following steps: 3. Call the **GET_v1_Azure_ListContainers** action in your microflow. The operation returns a list of **Container** objects associated to the **ListContainersResponse**, which is a generalization of **AbstractResponse** and contains the **StatusCode** and **ReasonPhrase**. -Its generization AbstractResponse entity contains the http status code and optional the http reason phrase. +Its generalization AbstractResponse entity contains the http status code and optional the http reason phrase. #### POST_v1_Azure_GetApplicationBearerToken @@ -219,7 +219,7 @@ To use this operation in your microflow, perform the following steps: 2. Call the **POST_v1_Azure_GetApplicationBearerToken** action in your microflow. The operation returns a **GetApplicationBearerTokenResponse** object with the returned **EntraCredentialsUsage** associated to it. The **EntraCredentialsUsage** entity is a specialization of the **EntraCredentials** entity so the returned object can be used to authenticate Blob operations. -Its generization AbstractResponse entity contains the http status code and optional the http reason phrase. +Its generalization AbstractResponse entity contains the http status code and optional the http reason phrase. #### POST_v1_Azure_GetUserDelegationKey{#get-user-delegation-key} diff --git a/content/en/docs/marketplace/platform-supported-content/modules/databricks-edc.md b/content/en/docs/marketplace/platform-supported-content/modules/databricks-edc.md index fea86ccdf8a..c6d666ccfa5 100644 --- a/content/en/docs/marketplace/platform-supported-content/modules/databricks-edc.md +++ b/content/en/docs/marketplace/platform-supported-content/modules/databricks-edc.md @@ -43,12 +43,12 @@ To connect your Mendix application to Databricks with the External Database conn {{< figure src="/attachments/appstore/platform-supported-content/modules/databricks/PAT.png" >}} -7. In your Databricks account find the JDBC URL related to the SQL warehouse or cluster which you are using. -8. Copy the URL into the **JDBC URL** field and add *UID=token;PWD=`PAT`*, where `PAT` is your actual PAT. +6. In your Databricks account find the JDBC URL related to the SQL warehouse or cluster which you are using. +7. Copy the URL into the **JDBC URL** field and add *UID=token;PWD=`PAT`*, where `PAT` is your actual PAT. {{< figure src="/attachments/appstore/platform-supported-content/modules/databricks/JDBC_URL.png" >}} -9. Click **Test Connection** to verify the connection details, and then click **Save**. +8. Click **Test Connection** to verify the connection details, and then click **Save**. Your Mendix app now connects to Databricks with the provided connection details. When the connection is successful, you can see your Databricks tables in your Mendix app. @@ -112,11 +112,11 @@ After you have created a table with some entries, you can now be query from your 5. Double-click the **Query External Database** microflow activity to configure the required parameters. 6. In the **Database** section, select your Databricks database. 7. In the **Query** list, select the query name that you entered in step 2. - 10. In the **Output** section, provide the following values: + 8. In the **Output** section, provide the following values: * **Return type** - **List of *{your module name}*.customerdata** * **Use return value** - set to **Yes** * **List name** - enter *Customerdata_list* - 11. Click **OK**. + 9. Click **OK**. {{< figure src="/attachments/appstore/platform-supported-content/modules/databricks/JA_Query.png" >}} diff --git a/content/en/docs/marketplace/platform-supported-content/modules/document-generation.md b/content/en/docs/marketplace/platform-supported-content/modules/document-generation.md index 309221558dc..bde9ba60cdb 100644 --- a/content/en/docs/marketplace/platform-supported-content/modules/document-generation.md +++ b/content/en/docs/marketplace/platform-supported-content/modules/document-generation.md @@ -25,8 +25,9 @@ The [PDF Document Generation](https://marketplace.mendix.com/link/component/2115 * [Mendix Cloud](/developerportal/deploy/mendix-cloud-deploy/) * [Mendix Cloud Dedicated](/developerportal/deploy/mendix-cloud-deploy/) * [Mendix on Kubernetes Connected](/developerportal/deploy/private-cloud/) + * [Private PDF Document Generation Service](#run-private-service) * [On-Premises](/developerportal/deploy/on-premises-design/) - * A privately hosted Docker containerized PDF Document Generation service. It is available starting with module versions 1.11.0 for Studio Pro 9 and 2.1.0 for Studio Pro 10. For more information, refer to [Private PDF Document Generation Service](/appstore/services/private-document-generation-service/). + {{% alert color="info" %}}We only support apps that allow bi-directional communication with the PDF Service in Mendix Cloud for all deployment types except for on-premises, and for the [Private PDF Document Generation Service](/appstore/services/private-document-generation-service/).{{% /alert %}} * The maximum file size is 25 MB per document. If your document exceeds this limit, the action will result in an exception. We recommend compressing high-resolution images to reduce their file size. * If your app is configured to [restrict access for incoming requests](/developerportal/deploy/access-restrictions/) using client certificates, our cloud service will not be able to reach your app, and the module will not work properly. @@ -67,14 +68,16 @@ Follow the instructions in [How to Use Marketplace Content](/appstore/use-conten 5. To test the module locally, perform the procedure as described in the [Running locally from Studio Pro](#run-locally) section. 6. When deploying your app, consider that we currently support two types of deployments: - 1. [Running on Mendix Cloud](#run-on-mendix-cloud) using the PDF service in the Mendix Public Platform. This option is available for apps that are deployed to the following environments: + 1. [Running on Mendix Cloud](#run-on-mendix-cloud) using the PDF Service in the Mendix Public Platform. This option is available for apps that are deployed to the following environments: * [Mendix Cloud](/developerportal/deploy/mendix-cloud-deploy/) * [Mendix Cloud Dedicated](/developerportal/deploy/mendix-cloud-deploy/) * [Mendix on Kubernetes Connected](/developerportal/deploy/private-cloud/) - 2. [Running On-Premises](#run-on-premises) using a local version of the PDF service. This option is available for apps that are deployed to the following environments: - * [Microsoft Windows](/developerportal/deploy/deploy-mendix-on-microsoft-windows/) - * [Linux](/developerportal/deploy/linux/) + 2. [Running on self-hosted for airgapped and on-premises](#run-private-service-and-on-premises) using a self-hosted version of the PDF Service: + * Using [Private PDF Document Generation Service](#run-private-service) (recommended) + * Using a local version of the PDF Service, available for [Microsoft Windows](/developerportal/deploy/deploy-mendix-on-microsoft-windows/) and [Linux](/developerportal/deploy/linux/) + + {{% alert color="info" %}}The PDF Service in the Mendix Public Platform is also available for any other deployment type that allows bidirectional communication with the PDF Service. In this case, [submit a support request](/support/submit-support-request/) with the details of the app environment(s) to register your app.{{% /alert %}} ### Running Locally from Studio Pro {#run-locally} @@ -156,7 +159,17 @@ To allow the module to send and receive document generation requests on your Men If your app is configured to [restrict access for incoming requests](/developerportal/deploy/access-restrictions/) using IP restrictions, you must add the [outbound IP addresses of the DocGen service](/developerportal/deploy/mendix-ip-addresses/#global-platform-ips-outbound) to the list of allowed addresses. -### Running On-Premises {#run-on-premises} +### Running on self-hosted for airgapped and on-premises {#run-private-service-and-on-premises} + +{{% alert color="info" %}} When self-hosting the Document Generation Service in an airgapped environment, the browser does not have access to the internet. As such, note that any external dependencies such as fonts, stylesheets, or images are not loaded. This could cause the document generation process to fail or result in incomplete documents. {{% /alert %}} + +#### Running Private PDF Document Generation Service {#run-private-service} + +When access to the public Mendix PDF generation Service is restricted, particularly in isolated or airgapped environments, Mendix offers a privately hosted, Docker containerized PDF Document Generation Service as an alternative. With this deployment type, you can host the document generation service on your own infrastructure and have full control over resources, availability and scalability. In addition, this option offers configurable limits, such as the maximum file size and maximum page rendering time. + +It is available starting with module versions 1.11.0 for Studio Pro 9, and 2.1.0 for Studio Pro 10. For more detailed information, installation guide and configuration, refer to [Private PDF Document Generation Service](/appstore/services/private-document-generation-service/). + +#### Running a local version of the PDF Service on Windows or Linux {#run-on-premises} To configure the module to generate documents on your on-premises environments, you need to perform the following steps: @@ -164,23 +177,29 @@ To configure the module to generate documents on your on-premises environments, 2. Configure the module to use the local service. 3. Enable the DocGen request handler. -#### Installing the Prerequisite Software {#install-prerequisites} +##### Installing the Prerequisite Software {#install-prerequisites} You should pre-install and actively maintain the following software. Mendix does not provide support for the installation, configuration, and maintenance of these packages. -##### Chromium +**Chromium** You should have installed a stable release of the Chromium browser. The currently supported stable release is 112.0.5615.0 ([Windows](https://storage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Win_x64/1109252/). [Linux](https://storage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Linux_x64/1109252/)). {{% alert color="info" %}}Even though we advise using Chromium, you can also use Google Chrome instead. The configuration remains the same.{{% /alert %}} -##### Node.js +**Node.js** You should have installed a stable release of [Node.js](https://nodejs.org/). Mendix recommends installing the same version that is shipped with the Studio Pro version that is used to build the project. You can find this version by locating and executing the `node` executable within the `modeler/tools/node` folder of your Studio Pro installation. {{% alert color="info" %}}Make sure that the Mendix Runtime has the applicable permissions to run the *node* executable.{{% /alert %}} -#### Configuring the Module to use the Local Service {#configure-local-service} +##### Certificate Requirements + +Both the Mendix and Node.js runtime need to trust the SSL/TLS certificate that is used to secure connections to the Mendix app. If you are using a custom Certificate Authority (CA), make sure that the Node.js runtime trusts the CA. If Node.js does not recognize the CA by default, set the `NODE_EXTRA_CA_CERTS` environment variable to point to the applicable certificate file, which should be in a `.cert` or `.pem` format. + +The user account that is used to execute the Mendix runtime needs read access to the certificate file. + +##### Configuring the Module to use the Local Service {#configure-local-service} 1. Set the **OverrideServiceType** constant to *Local* in the **_UseMe** > **Configuration** folder. This enforces the use of the local service instead of the cloud service. @@ -188,7 +207,7 @@ You should have installed a stable release of [Node.js](https://nodejs.org/). M 3. Configure the path to the *node* executable in the **CustomNodePath** constant in the **_UseMe** > **Configuration** folder. -#### Enabling the DocGen Request Handler {#setup-inbound-rules} +##### Enabling the DocGen Request Handler {#setup-inbound-rules} In case you deploy on [Microsoft Windows](/developerportal/deploy/deploy-mendix-on-microsoft-windows/), you need to add the following rules when configuring the [reverse proxy inbound rules](/developerportal/deploy/deploy-mendix-on-microsoft-windows/#reverse-proxy-rules): diff --git a/content/en/docs/marketplace/platform-supported-content/modules/external-database-connector.md b/content/en/docs/marketplace/platform-supported-content/modules/external-database-connector.md index 4202a82a806..d01800aa25f 100644 --- a/content/en/docs/marketplace/platform-supported-content/modules/external-database-connector.md +++ b/content/en/docs/marketplace/platform-supported-content/modules/external-database-connector.md @@ -215,20 +215,20 @@ To test SSL-based connections from the Database Connection wizard, use the Certi 1. Import the CA certificate file {{% /alert %}} -2. If the PostgreSQL server requires Mendix to authenticate using a client certificate, add the client certificate details to the App Settings by clicking **Configuration** > **Edit** > **Custom**. See the [Running Locally](/developerportal/deploy/use-a-client-certificate/) section of *Use a Client Certificate* for further instructions of how to add the certificate details. +1. If the PostgreSQL server requires Mendix to authenticate using a client certificate, add the client certificate details to the App Settings by clicking **Configuration** > **Edit** > **Custom**. See the [Running Locally](/developerportal/deploy/use-a-client-certificate/) section of *Use a Client Certificate* for further instructions of how to add the certificate details. {{< figure src="/attachments/appstore/platform-supported-content/modules/external-database-connector/edit-configuration.png" class="no-border" >}} -3. Add the connection details to the [Database Connection wizard](#connect-database). Fill in the following details: +1. Add the connection details to the [Database Connection wizard](#connect-database). Fill in the following details: * Set SSL encryption to **Yes** * Set SSL mode as per your requirement * Add the Client certificate identifier; this must match the value provided in the custom settings dialog {{< figure src="/attachments/appstore/platform-supported-content/modules/external-database-connector/example-SSL-connection.png" class="no-border" >}} -4. Click **Test Connection**. +1. Click **Test Connection**. -5. Run your application to test the connection for local runtime. +1. Run your application to test the connection for local runtime. ### Running in the Cloud diff --git a/content/en/docs/marketplace/platform-supported-content/modules/sap/sap-xsuaa-connector.md b/content/en/docs/marketplace/platform-supported-content/modules/sap/sap-xsuaa-connector.md index 339fbb6cc03..a2e53b8bedf 100644 --- a/content/en/docs/marketplace/platform-supported-content/modules/sap/sap-xsuaa-connector.md +++ b/content/en/docs/marketplace/platform-supported-content/modules/sap/sap-xsuaa-connector.md @@ -128,6 +128,8 @@ By default, the Mendix login page will not allow the user to enter their SSO cre To configure a page/microflow URL, follow the steps mentioned in the subsections below. If you are using the Deep Link module, make sure the **LoginLocation** constant is set to `/xsauaalogin/login?ret=`. {{% /alert %}} +After XSUAA login, the `SetAccessTokenCookie` constant is used to determine whether to set the access token in a cookie. By default, this constant is set to `True`. If you do not want to set the access token in a cookie, change the value of this constant to `False`. + #### Adding the SSO Login Button to the Login Page {#adding} {{% alert color="info" %}} diff --git a/content/en/docs/marketplace/platform-supported-content/modules/siemens/capital-connector.md b/content/en/docs/marketplace/platform-supported-content/modules/siemens/capital-connector.md index ba0219d587e..3f87292c77b 100644 --- a/content/en/docs/marketplace/platform-supported-content/modules/siemens/capital-connector.md +++ b/content/en/docs/marketplace/platform-supported-content/modules/siemens/capital-connector.md @@ -18,7 +18,7 @@ The Capital connector is licensed under the [Apache V2.0 License](https://www.ap ### Prerequisites * Studio Pro version 10.24.3 or above -* A Capital instance +* A Capital instance, with licensed Capital Integration Server (CIS) enabled and running ### Dependencies {#dependencies} diff --git a/content/en/docs/marketplace/platform-supported-content/modules/snowflake/snowflake-rest-sql.md b/content/en/docs/marketplace/platform-supported-content/modules/snowflake/snowflake-rest-sql.md index f7c8bded1f9..89732246c39 100644 --- a/content/en/docs/marketplace/platform-supported-content/modules/snowflake/snowflake-rest-sql.md +++ b/content/en/docs/marketplace/platform-supported-content/modules/snowflake/snowflake-rest-sql.md @@ -54,11 +54,7 @@ To use the Snowflake REST SQL connector, you must also install and configure the * [Community Commons](https://marketplace.mendix.com/link/component/170) – This module is a required dependency for the Snowflake REST SQL connector. * [Encryption](https://marketplace.mendix.com/link/component/1011) – This module is a required dependency for the Snowflake REST SQL connector. The EncryptionKey constant must be set up in your application settings. -* GenAI Commons module ver. 3.x from the [GenAI For Mendix](https://marketplace.mendix.com/link/component/227931) bundle – Only required for the Snowflake REST Connector version 2.x. This module is a required dependency for the Snowflake Cortex Analyst. - -{{% alert color="info" %}} -The Snowflake REST SQL connector currently requires version 3.x of the GenAI Commons module. Newer versions of the module are not supported yet. -{{% /alert %}} +* GenAI Commons module from the [GenAI For Mendix](https://marketplace.mendix.com/link/component/227931) bundle – Only required for the Snowflake REST Connector version 2.x. This module is a required dependency for the Snowflake Cortex Analyst. ### Licensing and Cost diff --git a/content/en/docs/marketplace/platform-supported-content/services/business-events.md b/content/en/docs/marketplace/platform-supported-content/services/business-events.md index c99ee813afc..5f4c9cc6350 100644 --- a/content/en/docs/marketplace/platform-supported-content/services/business-events.md +++ b/content/en/docs/marketplace/platform-supported-content/services/business-events.md @@ -88,16 +88,16 @@ To define what information is included in your events and what the service will 1. Define what information is included in this event. -* In the **General** field, provide the **Event name** and **Description** to let others know what the service is about. -* In the **Attributes** field, click **Add** to define attributes. - * Changes you make here later could lead to breaking changes if the entity the attribute belongs to is consumed. Related entities will be updated automatically. + * In the **General** field, provide the **Event name** and **Description** to let others know what the service is about. + * In the **Attributes** field, click **Add** to define attributes. + * Changes you make here later could lead to breaking changes if the entity the attribute belongs to is consumed. Related entities will be updated automatically. {{< figure src="/attachments/appstore/platform-supported-content/services/business-events/wizard-step-1.png" class="no-border" width="400" >}} 2. Decide what other apps can do and what service this will implement. -* In the **Other apps can** field, you can select how other apps can use the service. The **This Business Events service implements** field defines whether the service will be responsible for publishing events, subscribing to events, or both. -* Below is an explanation of the possibilities for what other apps can do and what the service implements: + * In the **Other apps can** field, you can select how other apps can use the service. The **This Business Events service implements** field defines whether the service will be responsible for publishing events, subscribing to events, or both. + * Below is an explanation of the possibilities for what other apps can do and what the service implements: | If you say that other apps can: | Then the service itself must implement: | The service could also implement: | The following are automatically created: | | ---------- | ---------- | ---------- | ---------- | @@ -107,7 +107,7 @@ To define what information is included in your events and what the service will 3. Click **Done** to exit the wizard and view the defined service document. -* **Export AsyncAPI Document** exports the YAML file of the business event service so other apps can [use your newly created service](#two-way-be-existing). + * **Export AsyncAPI Document** exports the YAML file of the business event service so other apps can [use your newly created service](#two-way-be-existing). ### Attribute Types {#attribute-types} diff --git a/content/en/docs/marketplace/platform-supported-content/services/event-broker.md b/content/en/docs/marketplace/platform-supported-content/services/event-broker.md index e29940a62ed..45f98cfc6d6 100644 --- a/content/en/docs/marketplace/platform-supported-content/services/event-broker.md +++ b/content/en/docs/marketplace/platform-supported-content/services/event-broker.md @@ -137,7 +137,7 @@ Technical Contacts with a license to the Mendix Event Broker can manage this fea 1. Click **Create a Bridge** to create a new bridge. 2. Select either an **AWS SQS** or an **HTTP** service to configure. -* An AWS SQS bridge uses the [Amazon Simple Queue Service](https://aws.amazon.com/sqs/). The HTTP Bridge uses HTTP requests to send events from external systems to the Mendix Event Broker. The HTTP bridge is one-way: **HTTP to Event Broker**. + * An AWS SQS bridge uses the [Amazon Simple Queue Service](https://aws.amazon.com/sqs/). The HTTP Bridge uses HTTP requests to send events from external systems to the Mendix Event Broker. The HTTP bridge is one-way: **HTTP to Event Broker**. 3. Click **Next** to continue with creating your bridge. @@ -152,7 +152,7 @@ The creation process for AWS SQS bridges includes two further steps on the Mendi 1. Select a [Space](#spaces), Name, and Region for the bridge to operate in. -{{< figure src="/attachments/appstore/platform-supported-content/services/event-broker/bridges/event_broker_bridges_create_3_sqs.png" class="no-border" >}} + {{< figure src="/attachments/appstore/platform-supported-content/services/event-broker/bridges/event_broker_bridges_create_3_sqs.png" class="no-border" >}} 2. Click **Next** to continue the configuration. diff --git a/content/en/docs/marketplace/upload-content/_index.md b/content/en/docs/marketplace/upload-content/_index.md index a70189246b5..a4aff9dc0c9 100755 --- a/content/en/docs/marketplace/upload-content/_index.md +++ b/content/en/docs/marketplace/upload-content/_index.md @@ -3,7 +3,7 @@ title: "Uploading Content to the Marketplace" url: /appstore/submit-content/ weight: 3 description_list: true -description: "Describes how to submit content to the Mendix Marketplace content." +description: "Describes how to submit content to the Mendix Marketplace." tags: ["marketplace", "public marketplace", "private marketplace", widget", "module"] aliases: - /appstore/overview/share-content/ diff --git a/content/en/docs/marketplace/use-content/_index.md b/content/en/docs/marketplace/use-content/_index.md index 7b6fd275aca..4a0aa6313eb 100644 --- a/content/en/docs/marketplace/use-content/_index.md +++ b/content/en/docs/marketplace/use-content/_index.md @@ -1,7 +1,7 @@ --- title: "Using Marketplace Content" url: /appstore/use-content/ -weight: 4 +weight: 5 description: "Covers the basics of how to access the Marketplace from Studio Pro and provides examples of how to add a widget and module to your app." no_list: false aliases: diff --git a/content/en/docs/private-platform/configuration/pmp-configure-azure-key-vault.md b/content/en/docs/private-platform/configuration/pmp-configure-azure-key-vault.md index e01613ab7eb..18f2956e1de 100644 --- a/content/en/docs/private-platform/configuration/pmp-configure-azure-key-vault.md +++ b/content/en/docs/private-platform/configuration/pmp-configure-azure-key-vault.md @@ -200,29 +200,29 @@ To modify the configuration, perform the following steps: Set `runtimeAutomountServiceAccountToken: true` to allow Mendix app pods to get a Kubernetes Service Account token. -```text -apiVersion: privatecloud.mendix.com/v1alpha1 -kind: OperatorConfiguration -spec: - # Optional: provide Mendix app Pods to get a Kubernetes Service Account token - runtimeAutomountServiceAccountToken: true -``` + ```text + apiVersion: privatecloud.mendix.com/v1alpha1 + kind: OperatorConfiguration + spec: + # Optional: provide Mendix app Pods to get a Kubernetes Service Account token + runtimeAutomountServiceAccountToken: true + ``` 2. Add a custom pod label which informs the Operator to use workload identities. For more information, see [General Pod Labels](https://docs.mendix.com/developerportal/deploy/private-cloud-cluster/#general-pod-labels). -```text -apiVersion: privatecloud.mendix.com/v1alpha1 -kind: OperatorConfiguration -spec: - # ... - # Other configuration options values - # Optional: custom pod labels - customPodLabels: - # Optional: general pod labels (applied to all app-related pods) - general: - # Example: enable Azure Workload Identity - azure.workload.identity/use: "true" -``` + ```text + apiVersion: privatecloud.mendix.com/v1alpha1 + kind: OperatorConfiguration + spec: + # ... + # Other configuration options values + # Optional: custom pod labels + customPodLabels: + # Optional: general pod labels (applied to all app-related pods) + general: + # Example: enable Azure Workload Identity + azure.workload.identity/use: "true" + ``` #### Configuring the Kubernetes Service Account @@ -235,25 +235,25 @@ To configure the Kubernetes service account, perform the following steps: 1. Create a Kubernetes service account with the name you specified above (for example, **pmp-secret-accessor**). 2. Annotate this service account to link it to your User-Assigned Managed Identity. -```text -kubectl -n <{Kubernetes namespace}> create serviceaccount <{environment name}> -kubectl -n <{Kubernetes namespace}> annotate serviceaccount <{environment name}> privatecloud.mendix.com/environment-account=true -kubectl -n <{Kubernetes namespace}> annotate serviceaccount <{environment name}> azure.workload.identity/client-id=<{managed identity client id}> -``` + ```text + kubectl -n <{Kubernetes namespace}> create serviceaccount <{environment name}> + kubectl -n <{Kubernetes namespace}> annotate serviceaccount <{environment name}> privatecloud.mendix.com/environment-account=true + kubectl -n <{Kubernetes namespace}> annotate serviceaccount <{environment name}> azure.workload.identity/client-id=<{managed identity client id}> + ``` 3. Apply this service account to your cluster by using the following command: `kubectl apply -f .yaml`. 4. Update your Private Mendix Platform deployment YAML to use this service account: -```text -apiVersion: apps/v1 -kind: Deployment -metadata: - name: pmp-deployment -spec: - template: - spec: - serviceAccountName: pmp-secret-accessor -``` + ```text + apiVersion: apps/v1 + kind: Deployment + metadata: + name: pmp-deployment + spec: + template: + spec: + serviceAccountName: pmp-secret-accessor + ``` 5. Apply the changes to your deployment by using the following command: `kubectl apply -f .yaml`. diff --git a/content/en/docs/private-platform/configuration/pmp-configure-hashicorp-vault.md b/content/en/docs/private-platform/configuration/pmp-configure-hashicorp-vault.md index 4a9c36097ca..f3e60e00454 100644 --- a/content/en/docs/private-platform/configuration/pmp-configure-hashicorp-vault.md +++ b/content/en/docs/private-platform/configuration/pmp-configure-hashicorp-vault.md @@ -52,9 +52,10 @@ Do not use a nested `value=` key structure. 1. Log in to the Vault CLI with appropriate permissions (for example, `set VAULT_ADDR` and `VAULT_TOKEN`). 2. If your target mount path (for example, `pmp-dev/`) does not exist, or is not a KV v2 engine, run the following command: -```bash -vault secrets enable -path=pmp-dev kv-v2 -``` + ```bash + vault secrets enable -path=pmp-dev kv-v2 + ``` + If the path is already in use, the command fails safely. 3. Run the `vault kv put` command once for the central secret path (for example, `pmp-dev/admin`), listing all non-empty key-value pairs as arguments. @@ -159,10 +160,10 @@ Configure the Kubernetes authentication method to allows pod to authenticate usi 1. Enable the Kubernetes authentication method by running the following command: -```bash -# Ensure VAULT_ADDR and VAULT_TOKEN are set appropriately -vault auth enable kubernetes -``` + ```bash + # Ensure VAULT_ADDR and VAULT_TOKEN are set appropriately + vault auth enable kubernetes + ``` 2. Configure the following properties to enable Vault to find and trust your Kubernetes cluster's API server and OIDC issuer: @@ -235,9 +236,8 @@ vault auth enable kubernetes kubernetes_ca_cert="$K8S_CA_CERT" ``` -{{% alert color="info" %}} -For AKS without OIDC, if OIDC Issuer is unavailable, use the Token Reviewer JWT method. For more information, see *For generic Kubernetes* below. -{{% /alert %}} + {{% alert color="info" %}} For AKS without OIDC, if OIDC Issuer is unavailable, use the Token Reviewer JWT method. For more information, see *For generic Kubernetes* below. + {{% /alert %}} * For Openshift: @@ -353,7 +353,6 @@ For AKS without OIDC, if OIDC Issuer is unavailable, use the Token Reviewer JWT ``` 4. Create a `pmp-policy.hcl` Vault Terraform policy. - Grant read-only access to the single central secret path. If the central path is pmp-dev/admin, the policy path is pmp-dev/data/admin. ```terraform @@ -410,18 +409,18 @@ To configure the Mendix Operator, perform the following steps: 1. To ensure that the Mendix Operator allows pods to mount their Service Account token, edit the `OperatorConfiguration`: - ```bash - # Replace with the namespace where the Mendix Operator runs - kubectl edit operatorconfiguration mendix-operator-configuration -n - ``` + ```bash + # Replace with the namespace where the Mendix Operator runs + kubectl edit operatorconfiguration mendix-operator-configuration -n + ``` 2. Add or confirm the following line in the `spec:` section: - ```yaml - spec: - runtimeAutomountServiceAccountToken: true - # ... other existing spec fields ... - ``` + ```yaml + spec: + runtimeAutomountServiceAccountToken: true + # ... other existing spec fields ... + ``` #### Choosing and Configuring the Service Account @@ -440,6 +439,7 @@ Using a custom Service Account, for example, `pmp-secret-accessor`, is recommend ```bash kubectl create serviceaccount pmp-secret-accessor --namespace feature-test --dry-run=client -o yaml | kubectl apply -f - ``` + 2. Assign the Service Account to your Mendix app by editing the Mendix Runtime custom resource. Replace `mxplatform` and `feature-test` with your own values if needed. ```bash @@ -489,4 +489,4 @@ The application will use its assigned Service Account (`pmp-secret-accessor` or ### Storing the Credentials Directly in the Database -Instead of using the Hashicorp Vault, you can still use the legacy option to store the credentials in the Private Mendix Platform database. To do this, you must select **Database** from the list of storage options, and then enter the credentials directly in an input field. The credentials are encrypted and stored in the Private Mendix Platform database. \ No newline at end of file +Instead of using the Hashicorp Vault, you can still use the legacy option to store the credentials in the Private Mendix Platform database. To do this, you must select **Database** from the list of storage options, and then enter the credentials directly in an input field. The credentials are encrypted and stored in the Private Mendix Platform database. diff --git a/content/en/docs/private-platform/pmp-prerequisites.md b/content/en/docs/private-platform/pmp-prerequisites.md index 4a181889fc4..8b8c2cd6935 100644 --- a/content/en/docs/private-platform/pmp-prerequisites.md +++ b/content/en/docs/private-platform/pmp-prerequisites.md @@ -37,7 +37,7 @@ For performance reasons, Mendix recommends at least the following minimum hardwa | Tool | Version | | --- | --- | -| Grafana | 10.3.3 | +| Grafana | 12.2.1 | | Prometheus | 2.41.0 | ## General Requirements diff --git a/content/en/docs/private-platform/pmp-quickstart.md b/content/en/docs/private-platform/pmp-quickstart.md index db1b936c4f2..e242a1119b0 100644 --- a/content/en/docs/private-platform/pmp-quickstart.md +++ b/content/en/docs/private-platform/pmp-quickstart.md @@ -47,6 +47,7 @@ Before starting the installation process, make sure that you have all the necess * An optional Redis server version 6.2.0 or higher, for the task queue and cache. Using Redis is recommended for high availability, where you expect a high volume of webhook calls, or if you have multiple Svix servers. As a best practice, enable persistence in Redis so that tasks are persisted across Redis server restarts and upgrades. * If you plan to use the AWS Secret Manager, install an AWS provider at your cluster, as described in [Kubernetes Secrets Store CSI Driver](https://secrets-store-csi-driver.sigs.k8s.io/). +* If you plan to use Azure Key Vault, see [Configuring a Secret Store with Azure Key Vault](/developerportal/deploy/secret-store-credentials/#azure-key-vault). ## Installing and Configuring the Mendix Operator {#install-operator} @@ -156,7 +157,7 @@ To use the secret provider option for your database plan or storage plan, config | Data Type | Key | Example Value | | --- | --- | --- | | Database type (for example, PostgreSQL) | **database-type** | `PostgreSQL` | -| Database Jdbc Url | **database-jdbc-url** | `jdbc:postgresql://pg.example.com:5432/my-app-1?sslmode=prefer` | +| Database Jdbc URL | **database-jdbc-url** | `jdbc:postgresql://pg.example.com:5432/my-app-1?sslmode=prefer` | | Database host | **database-host** | `pg.example.com:5432` | | Database name | **database-name** | `my-app-1` | | Database user name | **database-username** | `my-app-user-1` | @@ -183,7 +184,43 @@ Currently, only AWS S3 or S3-compatible providers are supported. | PCLM admin password | **pclm-admin-password** | | Private Mendix Platform admin password | **mx-admin-password** | -### Installing Private Cloud License Manager {#install-pclm} +## Optional: Configuring Azure Key Vault + +To use the secret provider option for your database plan or storage plan, configure the following keys in your Azure Key Vault. All keys are required unless noted otherwise. + +### Database Plan Keys + +| Data Type | Key | Example Value | +| --- | --- | --- | +| Database type (for example, SQLSERVER or PostgreSQL) | **database-type** | `PostgreSQL` | +| Database Jdbc URL | **database-jdbc-url** | `jdbc:postgresql://test.database.azure.com:5432/testpmp?sslmode=prefer` | +| Database host | **database-host** | `test.database.azure.com:5432` | +| Database name | **database-name** | `testpmp` | +| Database user name | **database-username** | `pxx` | +| Database password | **database-password** | `passxx` | + +### Storage Plan Keys + +| Data Type | Key | Example Value | Notes | +| --- | --- | --- | --- | +| Storage service name | **storage-service-name** | `com.mendix.storage.azure` | | +| Azure storage account | **storage-azure-account-name** | `examplename` | This value is required only for Azure Blob Storage with the static authentication method. | +| Azure storage account key | **storage-azure-account-key** | `examplekey` | This value is required only for Azure Blob Storage with the static authentication method. | +| Azure storage container name | **storage-azure-container** | `examplecontainer` | | +| Use configured CA trust for file storage | **storage-use-ca-certificates** | `true` | | +| Use HTTP for Azure | **storage-azure-use-https** | `true` | | +| Delete files from storage when deleted in the app | **storage-perform-delete** | `true` | | +| Use managed identity authentication for Azure Blob Storage | **storage-azure-use-default-azure-credential** | `false` | Set to `true` to use managed identity authentication for Azure Blob Storage. | +| Azure Blob Storage endpoint | **storage-azure-blob-endpoint** | `https://example.blob.core.windows.net/` | | + +### Administrator Passwords + +| Data Type | Key | +| --- | --- | +| PCLM admin password | **pclm-admin-password** | +| Private Mendix Platform admin password | **mx-admin-password** | + +## Installing Private Cloud License Manager {#install-pclm} Private Cloud License Manager is a required component of Private Mendix Platform. Before you install the Platform, install PCLM by doing the following steps: @@ -264,11 +301,21 @@ Svix is required if you want to use webhooks. Install the Svix component by doin 4. Select **Svix**, and then specify the following parameters: * **Image** - The Svix image path. The default path is `svix/svix-server:v1.25.0`. If you are using a self-signed TLS certificate, set this path to `{customer-private-image-registry-url}/svix/svix-server:v1.25.tls`. - * **Use Secret Provider** - Optional. Select this option to use the AWS Secret Manager. Selecting this option enables the following additional fields: + * **Use Secret Provider** - Optional. Select this option to use the AWS Secret Manager or the Azure Key Vault. Selecting this option enables the following additional fields: + + * For AWS Secret Manager: - * **Secret Provider** - Set to **AWS** by default. - * **AWS-Role-ARN** - An AWS role ARN which can access the specified Secret Manager. - * **AWS SecretManager Name** - The AWS Secret Manager name where the sensitive data is stored. + * **Secret Provider** - Set to **AWS**. + * **AWS-Role-ARN** - An AWS role ARN which can access the specified Secret Manager. + * **AWS SecretManager Name** - The AWS Secret Manager name where the sensitive data is stored. + + * For Azure Key Vault: + + * **Secret Provider** - Set to **Azure**. + * **Client ID** - Enter a Client ID assigned to the Azure Managed Identity which enables Private Mendix Platform to access Azure resources. + * **Tenant ID** - Enter the Directory ID of the key vault. + * **Key Vault Name** - Enter the key vault name. + * **Use identity auth for Blob** - Set to **True** if you use the Azure Blob Storage with managed identity auth; the default value is **false**. * **POSTGRES_DSN** - Available only if you do not use the AWS Secret Manager. A Postgres DSN, for example, `postgresql://postgres:postgres@pgbouncer/postgres`. * **Use Redis** - Optional. Select this check box if you want to use Redis for message cache and queues. @@ -309,10 +356,21 @@ Install the Private Mendix Platform by doing the following steps: * **MxAdminPassword** - Optional. The password for the admin user, required if you are not planning to use the AWS Secret Manager. It must have at least one number, one upper case letter, one lower case letter and one symbol, with a minimum length of 12 characters. * **dtapmode** - For production deployments, leave this value set to **P**. For the development of the app, for example acceptance testing, set the value to **D**. * **ApplicationRootUrl** - Optional. Manually specify the URL of your Private Mendix Platform, for example, for use with SSO or when sending emails. For more information about this functionality, see [ApplicationRootUrl Needs to be Set Manually](/developerportal/deploy/private-cloud-operator/#applicationrooturl-needs-to-be-set-manually). - * **Use Secret Provider** - Optional. Select this option to use the AWS Secret Manager. Selecting this option enables the following additional fields: - * **Secret Provider** - Set to **AWS** by default. - * **AWS-Role-ARN** - An [AWS role ARN](https://docs.mendix.com/developerportal/deploy/secret-store-credentials/#aws-secrets-manager) which can access the specified Secret Manager. - * **AWS SecretManager Name** - The AWS Secret Manager name where the sensitive data is stored. + * **Use Secret Provider** - Optional. Select this option to use the AWS Secret Manager or the Azure Key Vault. Selecting this option enables the following additional fields: + + * For AWS Secret Manager: + + * **Secret Provider** - Set to **AWS**. + * **AWS-Role-ARN** - An [AWS role ARN](https://docs.mendix.com/developerportal/deploy/secret-store-credentials/#aws-secrets-manager) which can access the specified Secret Manager. + * **AWS SecretManager Name** - The AWS Secret Manager name where the sensitive data is stored. + + * For Azure Key Vault: + + * **Secret Provider** - Set to **Azure**. + * **Client ID** - Enter a Client ID assigned to the Azure Managed Identity which enables Private Mendix Platform to access Azure resources. + * **Tenant ID** - Enter the Directory ID of the key vault. + * **Key Vault Name** - Enter the key vault name. + * **Use identity auth for Blob** - Set to **True** if you use the Azure Blob Storage with managed identity auth; the default value is **false**. 5. In the **Enabled Functions** section, select or clear the functions that you want to enable or disable: diff --git a/content/en/docs/private-platform/pmp-uninstall.md b/content/en/docs/private-platform/pmp-uninstall.md index eabb8973cc3..288f97633c8 100644 --- a/content/en/docs/private-platform/pmp-uninstall.md +++ b/content/en/docs/private-platform/pmp-uninstall.md @@ -15,11 +15,11 @@ If required, you can uninstall the Private Mendix Platform by performing the fol 4. Delete Svix resources by running the following command: `helm uninstall svix-server -n=`. 5. Uninstall PCLM by running the following commands: -```text -kubectl delete svc/mx-privatecloud-license-manager -n= -kubectl delete deployments/mendix-pclm -n= -kubectl delete secret/mendix-pclm mendix-operator-pclm pclm-admin -n= -``` + ```text + kubectl delete svc/mx-privatecloud-license-manager -n= + kubectl delete deployments/mendix-pclm -n= + kubectl delete secret/mendix-pclm mendix-operator-pclm pclm-admin -n= + ``` 6. Uninstall the Mendix Operator, as described in [Private Cloud Cluster: Namespace Management](/developerportal/deploy/private-cloud-cluster/#namespace-management). 7. If you want to also delete the Private Mendix Platform namespace, run the following command: `kubectl delete namespace `. diff --git a/content/en/docs/refguide/java-programming/managed-dependencies/custom-repositories.md b/content/en/docs/refguide/java-programming/managed-dependencies/custom-repositories.md index e6c4831aae0..3660d131841 100644 --- a/content/en/docs/refguide/java-programming/managed-dependencies/custom-repositories.md +++ b/content/en/docs/refguide/java-programming/managed-dependencies/custom-repositories.md @@ -24,6 +24,12 @@ This is also the recommended setup when there is limited or no access to the int * **JFrog Artifactory** and **Sonatype Nexus** are popular tools that act as these "personal libraries." They can store your own libraries, and also "proxy" public repositories, meaning they download from the internet once and then serve it to everyone in your team from their local cache. * **Local repository:** This is a folder on your network which contains your project dependencies. The folder can either follow the Maven-style layout or can be a simple folder containing your dependencies. +## Custom Repositories and the Build Process + +When building Mendix applications in Mendix Cloud, dependencies are not downloaded. Instead, the build process relies on the dependencies being present in the `vendorlib` folder. + +Studio Pro manages this by downloading dependencies from the configured repositories using Gradle and then committing the `vendorlib` folder to version control. When you set up a custom Gradle repository, this is used during the download phase, meaning all dependencies stored in vendorlib originate from that repository. + ## How to Set up a Remote Repository ### Prerequisites diff --git a/content/en/docs/refguide/mobile/distributing-mobile-apps/building-native-apps/how-to-devapps.md b/content/en/docs/refguide/mobile/distributing-mobile-apps/building-native-apps/how-to-devapps.md index e6e497f19c7..f3ade5cbda8 100644 --- a/content/en/docs/refguide/mobile/distributing-mobile-apps/building-native-apps/how-to-devapps.md +++ b/content/en/docs/refguide/mobile/distributing-mobile-apps/building-native-apps/how-to-devapps.md @@ -24,7 +24,6 @@ Even custom developer apps on iOS must be provisioned and signed. However, we do Instead, use an ad-hoc provisioning profile, which allows you to register your testers' devices with Apple and distribute the app outside the App Store. For more information on ad-hoc provisioning, see [Apple's documentation](https://developer.apple.com/help/account/provisioning-profiles/create-an-ad-hoc-provisioning-profile/). {{% /alert %}} - ## Building Your Developer App with Bitrise {#build-your-developer-app} When using Bitrise to build your native mobile app in the cloud, you can configure the settings below to generate a custom developer app instead of a release app. Once configured, the app can be built and installed similarly to a release version. diff --git a/content/en/docs/refguide/modeling/application-logic/microflows-and-nanoflows/debug-microflows-and-nanoflows/debug-microflows-remotely.md b/content/en/docs/refguide/modeling/application-logic/microflows-and-nanoflows/debug-microflows-and-nanoflows/debug-microflows-remotely.md index 45194aaf15e..a0f182a5a62 100644 --- a/content/en/docs/refguide/modeling/application-logic/microflows-and-nanoflows/debug-microflows-and-nanoflows/debug-microflows-remotely.md +++ b/content/en/docs/refguide/modeling/application-logic/microflows-and-nanoflows/debug-microflows-and-nanoflows/debug-microflows-remotely.md @@ -37,7 +37,7 @@ Before starting this how-to, make sure you have completed the following prerequi In Mendix Cloud, the debugger is always listening for connections so you cannot turn it on or off. To debug your app in the cloud, you need to get a URL and a password from the app environment and provide that information to Studio Pro. The steps below explain how to do this. {{% alert color="info" %}} -The debugger supports only debugging of single-instance environments. Multi-instance environments need to be scaled down to one instance before the debugger can be used. See [Scaling Your Environment in Mendix Cloud](/developerportal/deploy/scale-environment/) for more information. +The debugger supports only debugging of single-instance environments. Multi-instance environments need to be scaled down to one instance before the debugger can be used. See [Scaling Your Environment in Mendix Cloud](/developerportal/deploy/scale-environment/) for more information. Because of this, remote debugging is not currently available for [Mendix on Azure](/developerportal/deploy/mendix-on-azure/support/#limitations). {{% /alert %}} ### Obtain Debugging Credentials diff --git a/content/en/docs/refguide/modeling/application-logic/microflows-and-nanoflows/return-value-mapping.md b/content/en/docs/refguide/modeling/application-logic/microflows-and-nanoflows/return-value-mapping.md index 7ac95be498f..0abb05f82b7 100644 --- a/content/en/docs/refguide/modeling/application-logic/microflows-and-nanoflows/return-value-mapping.md +++ b/content/en/docs/refguide/modeling/application-logic/microflows-and-nanoflows/return-value-mapping.md @@ -74,4 +74,4 @@ For example: * A decimal return value can be assigned directly to a decimal page variable * A decimal return value can be transformed with an expression like `formatDecimal($ActionReturnValue, '#,##0.00')` and assigned to a string page variable -* An object attribute can be extracted and assigned to a matching primitive variable \ No newline at end of file +* An object attribute can be extracted and assigned to a matching primitive variable diff --git a/content/en/docs/refguide/modeling/best-practices/_index.md b/content/en/docs/refguide/modeling/best-practices/_index.md new file mode 100644 index 00000000000..adf6394ecf7 --- /dev/null +++ b/content/en/docs/refguide/modeling/best-practices/_index.md @@ -0,0 +1,15 @@ +--- +title: "Modeling Best Practices" +linktitle: "Modeling Best Practices" +url: /refguide/modeling-best-practices/ +weight: 9 +description: "Guides which help you understand the most efficient ways to model." +no_list: false +description_list: true +--- + +## Introduction + +Modeling with Mendix is faster than traditional development. But by learning these best practices, you can model apps more quickly and effectively than other Mendix developers. See the documents below for advice on modeling tools, how make apps more accessible, and more. + +## Documents in this Category diff --git a/content/en/docs/refguide/modeling/best-practices/accessibility-best-practices.md b/content/en/docs/refguide/modeling/best-practices/accessibility-best-practices.md new file mode 100644 index 00000000000..124e449ac7a --- /dev/null +++ b/content/en/docs/refguide/modeling/best-practices/accessibility-best-practices.md @@ -0,0 +1,267 @@ +--- +title: "Introduction to Accessibility in Mendix" +linktitle: "Accessibility Introduction" +url: /refguide/accessibility-introduction/ +weight: 20 +description: "Describes an introduction on accessibility in general and how to get started making your apps more accessible." +--- + +## Introduction + +This guide will give an overview on what accessibility is, what the Web Content Accessibility Guidelines (WCAG) are, and how they apply to you. This guide will also cover the accessibility options in Studio Pro. + +## Accessibility Overview + +Accessibility enables various types of people to use your application, leading to wider user bases and easier development. To achieve an accessible app, consider people with all levels of ability. Take blindness (partial or full) as an example. Being blind means being dependent on assistive technologies, such as screen readers, to read websites out to you. + +However, screen readers must be able to programmatically understand the website to accurately read it out to the user. Something that can hinder this is if the component only looks like something, like a `div` styled and scripted like a button. This button would be inaccessible to visually-impaired users, because screen readers would not detect it. To fix this, you can either use ARIA ([ARIA - Accessibility | MDN](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA)) to add to that `div` and patch that functionality back in. Ideally, though, you should add a semantic HTML button instead: + +```html + +``` + +Screen readers would pick the button up, and no extra configuration is needed to help them understand it. + +However, accessibility serves more than visually-impaired users; it also includes (but is not limited to) users such as: + +* People who are deaf or hard of hearing and rely on subtitles to understand a video +* People with a cognitive disability who struggle to recall the required information they need to enter +* People who get too distracted by flashy animations on your webpage, and therefore cannot read it +* Neurodivergent people who may encounter barriers that make it difficult, if not impossible, to use a website + +Another often overlooked accessibility concern is situational accessibility. For instance, people trying to use their laptops outside in the sun usually have trouble reading webpages. WCAG also covers those kinds of scenarios, requiring websites to have enough contrast so that they are readable in various contexts. New parents, for example, probably recognize the situational disability of having a child on their arm and trying to use a touchscreen. + +## Web Content Accessibility Guidelines (WCAG) + +Considering all these aspects of accessibility is significant. If everyone had to start from scratch, making apps accessible would take significant time. That is why the World Wide Web Consortium (W3C) created the Web Content Accessibility Guidelines (WCAG). These guidelines help you make your application accessible to a larger audience and improve its usability for everyone else. (Improving accessibility for a small group and finding out that a considerable group benefits from it is called the [curb cut effect](https://en.wikipedia.org/wiki/Curb_cut_effect).) + +These guidelines are also the basis for various laws, including those of the EU and the US. The European Accessibility Act (EAA) is based on version 2.1 level AA. + +Version 2.2 of these guidelines is available, and the expectation is that you will adopt 2.2 over 2.1 in the near future. Since the difference between 2.1 and 2.2 is minimal, 2.2 is the version you want to target. For more information, see the [Web Content Accessibility Guidelines (WCAG) 2.2](https://www.w3.org/TR/WCAG22/). + +The version currently used by the EAA is Web Content Accessibility Guidelines (WCAG) 2.1 + +The guidelines are organized into four distinct categories. Each category has a subset of Success Criteria (SC), which are the specific rules you have to comply with. + +### Perceivable + +Software components (SCs) that fall under the [perceivable](https://www.w3.org/TR/WCAG22/#perceivable) principle are about contrast, correctly labeling your interactive components, and providing text alternatives for things that are only visual (for example, an informative image that gives context to a page needs to have a description in the alt text attribute). + +### Operable + +SCs that fall under the [Operable Principle](https://www.w3.org/TR/WCAG22/#operable) are about being able to operate your application. This concerns focus, keyboard navigability, and supporting different types of input devices. + +### Understandable + +SCs that fall under the [Understandable Principle](https://www.w3.org/TR/WCAG22/#understandable) make the page or action as easy to understand as possible. If you have a menu bar, for example, it should function consistently across all pages. If you encounter errors on your page, the system should provide you with as much information as possible. + +The instruction *"Please fill out all the input fields"* is insufficient for someone to quickly understand what is happening. They might think they have already done so, and will therefore not understand this as an error message. A message like *"Error: The required field' address' was not provided"* gives more information on where and how that user made an error. + +### Robust + +The [Robust Principle](https://www.w3.org/TR/WCAG22/#robust) SCs are specifically about compatibility with assistive technology, like the previously mentioned screen reader. + +## Using Mendix's Accessibility Options + +{{< figure src="/attachments/refguide/modeling/best-practices/accessibility-best-practices/text-box-label.png" alt="Text box widget properties showing label, aria-required and autocomplete options." width="300" >}} + +### Labels + +When a screen reader reaches an input field, it will read the label text aloud. This label must clearly describe the information required. + +### Aria-Required + +Various input widgets have the option to add `aria-required` to the input field. It will inform users of screen readers that this is a required field. Usually, you would have this information in styling (for example, using a star to indicate required fields). Adding this attribute makes sure the programming of your application matches the visuals required by [Success Criterion 1.3.1 Info and Relationships](https://www.w3.org/TR/WCAG22/#info-and-relationships). + +{{% alert color="info" %}} +Do not set the **Validation Type** to **Required**. If you do, a validation message will appear as soon as the user exits the input field. Instead, validation for required fields should occur only when the user submits the form or attempts to proceed to the next step. +{{% /alert %}} + +### Autocomplete + +Adding autocomplete to input fields can help individuals with reduced cognitive abilities by reducing the effort needed to fill out forms (per the [Success Criterion 1.3.5 Identify Input Purpose](https://www.w3.org/TR/WCAG22/#identify-input-purpose)). When the first name and last name fields are correctly tagged, browsers can auto-fill these inputs. However, while beneficial for some, autocomplete can hinder users of assistive technologies, as it complicates the form-filling process. In such cases, it may be better to turn off this feature. + +You should avoid using autocomplete in the following situations: + +* **Sensitive Information** — Fields that collect sensitive data, such as credit card numbers, government IDs, or personal identification numbers. It helps protect user privacy and prevents unauthorized access to sensitive information. +* **Public Computers** — If forms are likely to be filled out on public or shared computers, disabling autocomplete can prevent users from accessing previously entered information. +* **One-Time Inputs** — For fields that require unique, one-time entries (like a temporary PIN), autocomplete can be unnecessary and may confuse users. +* **Complex Forms** — In lengthy or complex forms, autocomplete might lead to incorrect autofill suggestions, which can frustrate users and lead to errors. +* **Regulatory Compliance** — Certain regulations may require that sensitive information not be stored or auto-filled. Disabling autocomplete can help ensure compliance with such regulations. + +### Aria Labels + +ARIA labels are available in several widgets. ARIA labels take precedent over anything else available for that element. A good ARIA label should describe the element the user is currently interacting with. It is helpful in situations where a visible label would be redundant due to the context of the input field. The ARIA label provides an opportunity to add extra context for [Success Criterion 4.1.2 Name, Role, Value](https://www.w3.org/TR/WCAG22/#name-role-value): + +{{< figure src="/attachments/refguide/modeling/best-practices/accessibility-best-practices/combobox-aria-labels.png" alt="Combobox widget properties showing ARIA labels options." width="300" >}} + +{{% alert color="info" %}} +While ARIA labels are very useful for adding context, using them excessively can even hurt accessibility. An example could be a situation where you have a button that says **Send**, if you add an ARIA label with a description such as **Click this button to reserve your spot in line!** that new text takes precedent over the **Send** text of the button. It would impact voice control. If a user who uses voice control said *Press send*, it would no longer activate that button. +{{% /alert %}} + +### Alternative Text (Image widget) + +{{< figure src="/attachments/refguide/modeling/best-practices/accessibility-best-practices/static-image-alt-text.png" alt="Static Image widget properties showing the Alternative Text option." width="300" >}} + +Adding alternative text that explains an image helps visually impaired users understand the page (as required by [Success Criterion 1.1.1 Non-text Content](https://www.w3.org/TR/WCAG22/#non-text-content)). It should be left empty if the image is purely decorative. Informative images require alt text, which should be a brief description explaining what is happening in the image. If there is text in the image that is not available in another form, it should be included in the alt text. + +#### Decorative vs. Informative Images + +There is a key difference between decorative images and informative images. Decorative images add no extra context to the page. Informative images do contain information the user is intended to learn. One decorative example would be a festive page with images of confetti all over it; they do not each ne to be tagged as **Piece of confetti**. That would not enhance the user's understanding of the page. It would actually make it harder to navigate since they would hear **Piece of confetti** repeatedly as they are trying to read the page. + +### Tab Index + +{{< figure src="/attachments/refguide/modeling/best-practices/accessibility-best-practices/static-image-alt-text.png" alt="Static Image widget properties showing the Tab index option." width="300" >}} + +The `tabindex` helps users who only use a keyboard navigate the page (as required by [Guideline 2.1 Keyboard Accessible](https://www.w3.org/TR/WCAG22/#keyboard-accessible)). The Tab key allows users to navigate through interactive elements on a website, such as links, buttons, and form fields. Any element that can be interacted with should have a tab index. + +The way someone with a screen reader navigates the page involves more than just the tab. There is a special key to navigate the page and have it read out paragraphs (for example with the VoiceOver key + arrows in Mac OS). Assigning a `tabindex` to every element on the page is unnecessary, as it makes the page more challenging to navigate. + +To ensure that all interactive elements are accessible via the Tab key: + +* Make sure all clickable elements are focusable. +* Use the `tabindex` attribute correctly. A value of 0 allows an element to be part of the default tab order. + +{{% alert color="info" %}} +Avoid using positive `tabindex` values, as they can confuse users by altering the natural focus order. +{{% /alert %}} + +### Role Type + +{{< figure src="/attachments/refguide/modeling/best-practices/accessibility-best-practices/action-button-role-type.png" alt="Action button widget properties showing role type option." width="300" >}} + +Changing the role type helps screen readers understand the kind of element you added ([Success Criterion 4.1.2 Name, Role, Value](https://www.w3.org/TR/WCAG22/#name-role-value)). You may have added a link, but the function performed is that of a button (instead of navigating to a new page, it performs an action on that page). In this case, it is better to change the element to a button. Changing role types can lead to confusion for users of assistive technologies, as incorrect roles may misrepresent the function of an element, making it harder for users to navigate and interact with content. Whenever possible, always choose semantic HTML over [ARIA (Accessible Rich Internet Applications)](https://www.w3.org/TR/wai-aria/) roles. + +### Accessibility Helper + +{{< figure src="/attachments/refguide/modeling/best-practices/accessibility-best-practices/accessibility-helper.png" alt="The Accessibility helper widget." width="300" >}} + +If you need additional settings or attributes for your page, you can add them using the accessibility helper. It allows you to add attributes to widgets that are not available in the settings. It ensures you can add the necessary extra attributes without needing access to the codebase of that widget. + +## Key Styling Considerations + +The key elements to consider when styling are contrast and the focus indicator. + +### Contrast {#contrast} + +There are two specific requirements related to contrast: [Success Criterion 1.4.3 Contrast (Minimum)](https://www.w3.org/TR/WCAG22/#contrast-minimum) for text contrast, and [Success Criterion 1.4.11 Non-text Contrast](https://www.w3.org/TR/WCAG22/#non-text-contrast) for user interface components and graphical objects. + +#### Text Contrast {#non-textcontrast} + +In the WCAG, you can find the calculation method, and there are many contrast checkers available, such as the [WebAIM Contrast Checker](https://webaim.org/resources/contrastchecker/). There are some exceptions, such as for big text, but we recommend sticking to 4.5:1. + +In **custom-variables.scss**, you can find the following for font color: + +```css +// Default Font Size & Color +$font-size-default: 14px; +$font-color-default: #0a1325; +``` + +Further on in the same document, the background color should be defined: + +```css +// Background Colors +// Backgrounds +$bg-color: #f8f8f8; +$bg-color-secondary: #fff; +``` + +In this case with the text color being “`#0a1325`“ and background color being “`#f8f8f8`” the contrast ratio here is 17.45:1, well over 4.5:1. + +#### Non-Text Contrast + +Non-text contrast needs to be 3:1; this means that any critical inputs or buttons need to have this contrast with the background. An example could be an input field. There needs to be sufficient contrast so that the input field is clearly visible. It could be the contrast of the field itself with the background, or a border line around the input field with the background. + +In **custom-variables.scss**, you could define the button background as such: + +```css +//== Step 1: Brand Colors +$brand-default: $gray-primary; +$brand-primary: #264ae5; +... +// Background Colors +// Backgrounds +$bg-color: #f8f8f8; +$bg-color-secondary: #fff; +... +// Button Background Color +$btn-default-bg: #fff; +$btn-primary-bg: $brand-primary; +``` + +Our button color is the same as $brand-primary, with the value `#264AE5`, and its background is `#F8F8F8`. The contrast here is 6.19:1, also well over 3:1. + +A situation where this would fail would be if you change your button color to `$gray-light`, also defined in the `custom-variables.scss` file. The color contrast of `#A9ACB3` and `#F8F8F8` is only 2.14, which is insufficient for everyone to see the button. + +### Focus + +{{< figure src="/attachments/refguide/modeling/best-practices/accessibility-best-practices/group-box-focus-indicator.png" alt="A group box widget with an active focus indicator" width="300" >}} + +The focus indicator helps users identify where the focus currently is on the page. There are a few success criteria that describe what the focus indicator should look like. + +[Focus visible](https://www.w3.org/TR/WCAG22/#focus-visible) The focus should be visible at all times; however, this criterion does not specify how. In theory, for this SC, it could be a single pixel on the right of the element. However, other criteria provide more specific guidance on what it should look like. + +[Use of color](https://www.w3.org/TR/WCAG22/#use-of-color): This indicates that a single sensory characteristic alone is insufficient to convey meaning. It counts for everything and thus also applies to the focus indicator. Using only color to indicate a focus change would fail this criterion. The focus indicator should use an alternative method. The most common thing is to change the shape of the element while it has focus. It could be something as simple as a box around the element that counts as changing the shape of the component. + +The rules as described in [Non-Text Contrast](#non-textcontrast) also apply to the focus indicator. You can set the color of the input focus indicator here: + +```css +// Form Input styling +... +$form-input-border-focus-color: $brand-primary; +``` + +## Other Accessibility Quick Wins + +### Page Titled + +{{< figure src="/attachments/refguide/modeling/best-practices/accessibility-best-practices/page-properties-title.png" alt="Page properties title option." width="300" >}} + +[Page titled](https://www.w3.org/TR/WCAG22/#page-titled): Every page needs a meaningful name that describes the page. Entitling one just **Page**, for example, is not enough to make the page easy to find among other tabs. + +### Error Messages + +Make sure you app has comprehensive error messages. Do they describe the situation clearly? Do they provide sufficient guidance on how to resolve the error? An example of a poor error message would be **Please fill in all required fields**. Since the user might be under the impression that they have already done that, saying **Please fill in address** would give the user more information on how they can resolve the error. + +More information on this can be found in the following SCs: + +* [WCAG Error Identification](https://www.w3.org/TR/WCAG22/#error-identification) +* [WCAG Error Suggestion](https://www.w3.org/TR/WCAG22/#error-suggestion) +* [WCAG Error Prevention](https://www.w3.org/TR/WCAG22/#error-prevention-legal-financial-data) + +### Link Purpose + +[Link purpose](https://www.w3.org/TR/WCAG22/#link-purpose-in-context) refers to the naming of links in text. For example: + +`Click here to learn more about Nanoflows.` + +This is not good for accessibility, since the link itself only says 'Click here' and does not give information on what page the link will take you to. For example: + +`To learn more, you can visit our Nanoflow explanation page.` + + For ideal accessibility instead of using 'Click here' to be the link text, the link's destination should be clear from the link text ('Nanoflow explanation page' in the previous example). This would help users understand the purpose of each link, enabling them to decide whether to follow it. Also, assistive technology can provide users with a list of links on the website. Having the destination of the link in the link itself helps it stand out in that list and makes it clear where that link would take the user. + +## Testing Accessibility + +### Automated Accessibility Testing + +There are multiple options for running automatic tests on your pages. These tools are great for indicating the accessibility of your website and suggesting areas for improvement. W3C offers a [list of tools for checking if your web content meets accessibility guidelines.](https://www.w3.org/WAI/test-evaluate/tools/list/) + +### Manual Accessibility Testing + +Although it is the most time-consuming, a manual test is a good way to assess your application's accessibility when you lack access to users with different abilities. The best way to test your application is with real users. + +Doing just a few checks already goes a long way: + +* **Keyboard navigability** — Can you reach all the input elements with your keyboard? Does your Tab key take you through all the elements of your page? +* **Screen reader** — Is all the information clear to a sighted person also available to a low vision or non-sighted person? Are labels of input fields being read out correctly? +* **Color contrast** — Does both text and non-text content have enough contrast? + +Find more info on this in [the W3C Easy Checks – A First Review of Web Accessibility](https://www.w3.org/WAI/test-evaluate/preliminary/) + +## Read More + +* [Mendix Academy's Accessibility Learning Path](https://academy.mendix.com/link/paths/141/Improve-Your-App-Accessibility). +* [Mendix Accessibility Conformance: Ensure Your Apps Are Accessible](https://www.mendix.com/evaluation-guide/app-lifecycle/develop/ux-multi-channel-apps/accessibility/) + diff --git a/content/en/docs/refguide/modeling/app-performance/_index.md b/content/en/docs/refguide/modeling/best-practices/app-performance/_index.md similarity index 99% rename from content/en/docs/refguide/modeling/app-performance/_index.md rename to content/en/docs/refguide/modeling/best-practices/app-performance/_index.md index 52a73b1e46b..1e6d4a902b4 100644 --- a/content/en/docs/refguide/modeling/app-performance/_index.md +++ b/content/en/docs/refguide/modeling/best-practices/app-performance/_index.md @@ -2,7 +2,7 @@ title: "Community Best Practices for App Performance" linktitle: "App Performance" url: /refguide/community-best-practices-for-app-performance/ -weight: 15 +weight: 20 description: "Describes some best practices to apply during development to get a better performing app. This document is created by and for the Mendix community." aliases: - /howtogeneral/bestpractices/best-practices-for-app-performance-in-mendix-7.html @@ -13,9 +13,7 @@ aliases: ## Introduction {{% alert color="info" %}} - -This document is created by and for the Mendix community. It collects performance best practices in the form of dos and don'ts. - +This document is created by and for the Mendix community. It collects performance best practices in the form of "Do's" and "Don'ts". {{% /alert %}} A must-have for your app is that it performs well. Your users will not accept anything else, and they will choose alternatives if the performance is not good. This document outlines various best practices that should be used throughout development to produce an app that performs better. diff --git a/content/en/docs/refguide/installation/performance-tips/antivirus-exclusion.md b/content/en/docs/refguide/modeling/best-practices/app-performance/antivirus-exclusion.md similarity index 100% rename from content/en/docs/refguide/installation/performance-tips/antivirus-exclusion.md rename to content/en/docs/refguide/modeling/best-practices/app-performance/antivirus-exclusion.md diff --git a/content/en/docs/refguide/modeling/app-performance/detect-and-resolve-performance-issues.md b/content/en/docs/refguide/modeling/best-practices/app-performance/detect-and-resolve-performance-issues.md similarity index 100% rename from content/en/docs/refguide/modeling/app-performance/detect-and-resolve-performance-issues.md rename to content/en/docs/refguide/modeling/best-practices/app-performance/detect-and-resolve-performance-issues.md diff --git a/content/en/docs/refguide/modeling/app-performance/manage-app-performance-with-new-relic.md b/content/en/docs/refguide/modeling/best-practices/app-performance/manage-app-performance-with-new-relic.md similarity index 100% rename from content/en/docs/refguide/modeling/app-performance/manage-app-performance-with-new-relic.md rename to content/en/docs/refguide/modeling/best-practices/app-performance/manage-app-performance-with-new-relic.md diff --git a/content/en/docs/refguide/modeling/dev-best-practices.md b/content/en/docs/refguide/modeling/best-practices/dev-best-practices.md similarity index 99% rename from content/en/docs/refguide/modeling/dev-best-practices.md rename to content/en/docs/refguide/modeling/best-practices/dev-best-practices.md index 686c0ac648d..c1100b17367 100644 --- a/content/en/docs/refguide/modeling/dev-best-practices.md +++ b/content/en/docs/refguide/modeling/best-practices/dev-best-practices.md @@ -2,7 +2,7 @@ title: "Mendix Best Practices for Development" linktitle: "Best Practices for Development" url: /refguide/dev-best-practices/ -weight: 12 +weight: 30 description: "Describes Mendix best practices for developing Mendix applications." aliases: - /howto/general/dev-best-practices/ diff --git a/content/en/docs/refguide/general/developer-tools.md b/content/en/docs/refguide/modeling/best-practices/developer-tools.md similarity index 100% rename from content/en/docs/refguide/general/developer-tools.md rename to content/en/docs/refguide/modeling/best-practices/developer-tools.md diff --git a/content/en/docs/refguide/modeling/domain-model/entities/_index.md b/content/en/docs/refguide/modeling/domain-model/entities/_index.md index e94ce0e2e76..8876d09fedd 100644 --- a/content/en/docs/refguide/modeling/domain-model/entities/_index.md +++ b/content/en/docs/refguide/modeling/domain-model/entities/_index.md @@ -25,11 +25,6 @@ For example, you have a collection of CDs like the one in the table below: The rows in the table are CDs. The type of the two rows is *CD* and this is the entity name. A specific CD like *How to Dismantle an Atomic Bomb* from the band *U2* is called an object of the entity *CD*. Characteristics like the title and artist are called attributes. ## Types of Entities {#entity-types} - -{{% alert color="info" %}} -View entities is currently in beta. -{{% /alert %}} - The entity type defines how the data is handled and there are four types: 1. Persistable entity @@ -38,7 +33,7 @@ The entity type defines how the data is handled and there are four types: * Non-persistable entities are stored in the runtime memory and never get committed to the database. These type of entities are colored *orange* in the domain model. 3. External entity * External entities represent the link to datasets that are made available through shared data sources registered in Mendix Catalog. These type of entities are colored *purple* in the domain model. -4. View entity (beta) +4. View entity * View entities represent the result sets of stored OQL queries on one or more entities, similar to database views, and are read-only. These entities are colored *green* in the domain model. {{< figure src="/attachments/refguide/modeling/domain-model/entities/type-of-entities.png" width=="300" >}} diff --git a/content/en/docs/refguide/modeling/domain-model/entities/view-entities/charting-with-view-entities.md b/content/en/docs/refguide/modeling/domain-model/entities/view-entities/charting-with-view-entities.md index 754c39b093e..8f8415a4186 100644 --- a/content/en/docs/refguide/modeling/domain-model/entities/view-entities/charting-with-view-entities.md +++ b/content/en/docs/refguide/modeling/domain-model/entities/view-entities/charting-with-view-entities.md @@ -54,22 +54,22 @@ Use the new view entity to create a chart. Follow the steps below: 3. Double-click the chart and in the **Data Source** field, click **New**. 4. Configure the chart by filling out the following: - * Data set - **Multiple series** - * Data source - **YearlySalesByCategoryVE** - * Group by - **CategoryId** - * X axis attribute - **OrderYear** - * Y axis attribute - **TotalSales* + * Data set – **Multiple series** + * Data source – **YearlySalesByCategoryVE** + * Group by – **CategoryId** + * X axis attribute – **OrderYear** + * Y axis attribute – **TotalSales** 5. Set the series name to reflect the category name. Do the following: - * In the **Series name** field, click **Edit** and add **{1}** in the **Template** field. - * In the **Parameters** field, click **New** > **Select** > **CategoryName** > **Select** > **OK**. + * In the **Series name** field, click **Edit** and add **{1}** in the **Template** field. + * In the **Parameters** field, click **New** > **Select** > **CategoryName** > **Select** > **OK**. - {{< figure src="/attachments/refguide/modeling/domain-model/view-entities/charting-with-view-entities/series-name.png" width="400" >}} + {{< figure src="/attachments/refguide/modeling/domain-model/view-entities/charting-with-view-entities/series-name.png" width="400" >}} - The chart should be configured as seen below: + The chart should be configured as seen below: - {{< figure src="/attachments/refguide/modeling/domain-model/view-entities/charting-with-view-entities/chart-final.png" width="400" >}} + {{< figure src="/attachments/refguide/modeling/domain-model/view-entities/charting-with-view-entities/chart-final.png" width="400" >}} 6. Click **OK** to save. diff --git a/content/en/docs/refguide/modeling/domain-model/entities/view-entities/create-pivot-table.md b/content/en/docs/refguide/modeling/domain-model/entities/view-entities/create-pivot-table.md index 74a11ee9d0d..ac6f0d95b21 100644 --- a/content/en/docs/refguide/modeling/domain-model/entities/view-entities/create-pivot-table.md +++ b/content/en/docs/refguide/modeling/domain-model/entities/view-entities/create-pivot-table.md @@ -51,11 +51,9 @@ Create a view entity that shows each order together with its total value, calcul GROUP BY o.OrderId, o.OrderDate, o.RequiredDate, o.ShippedDate ``` -{{% alert color="info" %}} + {{% alert color="info" %}}With view entities, you can take the relevant component of `DateTime` as a column using the `DATEPART` function. For more information, see the [`DATEPART` and `DATEDIFF`](/refguide/oql-v2/#date-validations) section of *OQL Version 2 Features*. -With view entities, you can take the relevant component of `DateTime` as a column using the `DATEPART` function. For more information, see the [`DATEPART` and `DATEDIFF`](/refguide/oql-v2/#date-validations) section of *OQL Version 2 Features*. - -{{% /alert %}} + {{% /alert %}} 3. Add another view entity to the domain model and name it *OrderQuarterlyPivotVE*. This entity will show a table, similar to the format above. 4. Add the following query to the OQL editor: diff --git a/content/en/docs/refguide/modeling/domain-model/entities/view-entities/decoupling-apis.md b/content/en/docs/refguide/modeling/domain-model/entities/view-entities/decoupling-apis.md index ede11ce9b08..9d84458f4d8 100644 --- a/content/en/docs/refguide/modeling/domain-model/entities/view-entities/decoupling-apis.md +++ b/content/en/docs/refguide/modeling/domain-model/entities/view-entities/decoupling-apis.md @@ -23,17 +23,17 @@ Create a single view entity and expose it as an OData resource. To do this, foll 1. Open your domain model and create a view entity called *ProductCategoryVE*. 2. Add the following query to the OQL editor: - ```sql - SELECT - p.ProductId as ProductId - , p.ProductName as ProductName - , p.QuantityPerUnit as QuantityPerUnit - , p.Discontinued as Discontinued - , c.CategoryName as Category - , c.CategoryId as CategoryId - FROM Shop.Product as p - JOIN p/Shop.Product_Category/Shop.Category as c - ``` + ```sql + SELECT + p.ProductId as ProductId + , p.ProductName as ProductName + , p.QuantityPerUnit as QuantityPerUnit + , p.Discontinued as Discontinued + , c.CategoryName as Category + , c.CategoryId as CategoryId + FROM Shop.Product as p + JOIN p/Shop.Product_Category/Shop.Category as c + ``` 3. Right-click this entity and select **Publish in OData service**. Name this service *POS_ProductCategory*. 4. Add `ProductId` as a key attribute, then click **OK**. diff --git a/content/en/docs/refguide/modeling/domain-model/entities/view-entities/multilingual-apps.md b/content/en/docs/refguide/modeling/domain-model/entities/view-entities/multilingual-apps.md index c11a8ba015d..5219fcb6c0e 100644 --- a/content/en/docs/refguide/modeling/domain-model/entities/view-entities/multilingual-apps.md +++ b/content/en/docs/refguide/modeling/domain-model/entities/view-entities/multilingual-apps.md @@ -73,41 +73,41 @@ Combine the languages in the two entities into a single view. To do this, join t {{< figure src="/attachments/refguide/modeling/domain-model/view-entities/multilingual-apps/translated-product-ve.png" width="200" >}} -Alternatively, you can also combine the view entities into one with a nested query: - -```sql -SELECT - cp.ProductId as ProductId, - cp.ProductName as ProductName, - cp.QuantityPerUnit as QuantityPerUnit, - cp.Discontinued as Discontinued, - cp.Description as Description, - cp.LanguageCode as LanguageCode -FROM -( - SELECT - p.ProductId as ProductId, - p.ProductName as ProductName, - p.QuantityPerUnit as QuantityPerUnit, - p.Discontinued as Discontinued, - pt.LanguageCode as LanguageCode, - coalesce(pt.Description, p.Description) as Description - FROM Shop.Product p - JOIN p/Shop.ProductTranslation_Product/Shop.ProductTranslation pt - UNION - SELECT - p.ProductId as ProductId, - p.ProductName as ProductName, - p.QuantityPerUnit as QuantityPerUnit, - p.Discontinued as Discontinued, - cast('en_US' as STRING) as LanguageCode, - p.Description as Description - FROM Shop.Product p -) as cp - LEFT JOIN System.User as u on (u.ID = '[%CurrentUser%]') - LEFT JOIN u/System.User_Language/System.Language as l -WHERE (l.Code = cp.LanguageCode) -``` + Alternatively, you can also combine the view entities into one with a nested query: + + ```sql + SELECT + cp.ProductId as ProductId, + cp.ProductName as ProductName, + cp.QuantityPerUnit as QuantityPerUnit, + cp.Discontinued as Discontinued, + cp.Description as Description, + cp.LanguageCode as LanguageCode + FROM + ( + SELECT + p.ProductId as ProductId, + p.ProductName as ProductName, + p.QuantityPerUnit as QuantityPerUnit, + p.Discontinued as Discontinued, + pt.LanguageCode as LanguageCode, + coalesce(pt.Description, p.Description) as Description + FROM Shop.Product p + JOIN p/Shop.ProductTranslation_Product/Shop.ProductTranslation pt + UNION + SELECT + p.ProductId as ProductId, + p.ProductName as ProductName, + p.QuantityPerUnit as QuantityPerUnit, + p.Discontinued as Discontinued, + cast('en_US' as STRING) as LanguageCode, + p.Description as Description + FROM Shop.Product p + ) as cp + LEFT JOIN System.User as u on (u.ID = '[%CurrentUser%]') + LEFT JOIN u/System.User_Language/System.Language as l + WHERE (l.Code = cp.LanguageCode) + ``` 5. Generate an overview page for the view entity by right-clicking **TranslatedProductVE** > **Generate overview pages**. 6. Open the new page and remove the columns you do not need from the data grid. diff --git a/content/en/docs/refguide/modeling/domain-model/entities/view-entities/view-entity-export-data.md b/content/en/docs/refguide/modeling/domain-model/entities/view-entities/view-entity-export-data.md index af0be5e3a99..4a69bb672c7 100644 --- a/content/en/docs/refguide/modeling/domain-model/entities/view-entities/view-entity-export-data.md +++ b/content/en/docs/refguide/modeling/domain-model/entities/view-entities/view-entity-export-data.md @@ -40,7 +40,7 @@ Create a view entity to join the customer and address tables. To do this, follow LEFT JOIN c/Shop.DeliveryAddress/Shop.Address da ``` -3. Click **Run Query** to view the data. Then, click **OK**. +4. Click **Run Query** to view the data. Then, click **OK**. ### Create a JSON Structure diff --git a/content/en/docs/refguide/modeling/domain-model/entities/view-entities/view-entity-overview-pages.md b/content/en/docs/refguide/modeling/domain-model/entities/view-entities/view-entity-overview-pages.md index 6116f6a4f1a..068b0997d89 100644 --- a/content/en/docs/refguide/modeling/domain-model/entities/view-entities/view-entity-overview-pages.md +++ b/content/en/docs/refguide/modeling/domain-model/entities/view-entities/view-entity-overview-pages.md @@ -43,11 +43,9 @@ Create a view entity that combines only the relevant attributes of the entities JOIN p/Shop.Product_Category/Shop.Category as c ``` -{{% alert color="info" %}} - -This query uses OQL to take the four attributes of each product and combines them with the associated supplier and category. If there is no supplier or category, the product will not be included. For more information, see [OQL Expressions](/refguide/oql-expressions/). + {{% alert color="info" %}} This query uses OQL to take the four attributes of each product and combines them with the associated supplier and category. If there is no supplier or category, the product will not be included. For more information, see [OQL Expressions](/refguide/oql-expressions/). -{{% /alert %}} + {{% /alert %}} 4. Click **OK**. The view entity is added to your domain model. @@ -120,12 +118,11 @@ You can calculate the total value of an order by joining the `OrderLine` and `Or JOIN o/Shop.OrderLine_Order/Shop.OrderLine as ol GROUP BY o.OrderId, o.OrderDate, o.RequiredDate, o.ShippedDate ``` - -This results in a view entity that shows the total value of every order. + + This results in a view entity that shows the total value of every order. -{{% alert color="info" %}} -Notice the quotation marks in `Shop.”Order”`. This is because `Order` is a reserved keyword in OQL. To avoid ambiguity, quotation marks are put around the word. -{{% /alert %}} + {{% alert color="info" %}} Notice the quotation marks in `Shop.”Order”`. This is because `Order` is a reserved keyword in OQL. To avoid ambiguity, quotation marks are put around the word. + {{% /alert %}} 3. Generate an overview page by right-clicking the view entity > **Generate overview pages**. 4. Add the new overview page to the navigation. diff --git a/content/en/docs/refguide/modeling/domain-model/oql/oql-expression-syntax.md b/content/en/docs/refguide/modeling/domain-model/oql/oql-expression-syntax.md index 1ebd249554b..995b8256f5d 100644 --- a/content/en/docs/refguide/modeling/domain-model/oql/oql-expression-syntax.md +++ b/content/en/docs/refguide/modeling/domain-model/oql/oql-expression-syntax.md @@ -270,7 +270,10 @@ The operator throws an error in PostgresSQL and SQL Server when one of the opera #### = (Equal To) -Returns `TRUE` if both `expression` inputs are equal. When used with `NULL`, it will always return a `FALSE` result. To compare to `NULL` values, use the [IS](#is-operator) operator. +Returns `TRUE` if both `expression` inputs are equal. + +When used with a `NULL` literal or a parameter with a `NULL` value, the condition will be converted to use the [IS NULL](#is-operator) operator. +In other cases when comparing to a `NULL` value, it will always return a `FALSE` result. {{% alert color="info" %}} Note that `DECIMAL` values have to match exactly. Use [`ROUND`](#round) to compare with less precision. diff --git a/content/en/docs/refguide/modeling/domain-model/oql/oql-statements.md b/content/en/docs/refguide/modeling/domain-model/oql/oql-statements.md index b014a089f09..776eab10e09 100644 --- a/content/en/docs/refguide/modeling/domain-model/oql/oql-statements.md +++ b/content/en/docs/refguide/modeling/domain-model/oql/oql-statements.md @@ -71,9 +71,9 @@ WHERE `entity` is the entity whose objects are being updated. -`attribute` is an attribute of the entity that is being updated. `association` is an association that is being updated. Multiple attributes and associations can be updated in the same statement. +`attribute` is an attribute of the entity that is being updated. `association` is an association that is being updated. Multiple attributes and associations can be updated in the same statement. An attribute of type `autonumber` can not be updated. The `ID` field of an entity cannot be updated. -`expression` is a new value of an attribute or association. Any [OQL expression](/refguide/oql-expressions/) is allowed. When updating attributes, the value type of the expression should match the attribute type according to [type coercion precedence](/refguide/oql-expression-syntax/#type-coercion). In the case of associations, association and entity expressions must match the target association type. Values of type LONG can also be used as association values, but they must be valid ids of associations which are of the target association type. +`expression` is a new value of an attribute or association. Any [OQL expression](/refguide/oql-expressions/) is allowed. When updating attributes, the value type of the expression should match the attribute type according to [type coercion precedence](/refguide/oql-expression-syntax/#type-coercion). When updating an enumeration attribute using a literal, the literal must be a valid value for the enumeration. When updating an enumeration attribute using another enumeration, the expression enumeration must be a subset of the attribute enumeration. When updating a string attribute using a string literal, the literal length must be equal to or less than the length of the attribute. In the case of associations, association and entity expressions must match the target association type. Values of type LONG can also be used as association values, but they must be valid ids of associations which are of the target association type. `condition` can be anything that can appear in an OQL [WHERE clause](/refguide/oql-clauses/#where). diff --git a/content/en/docs/refguide/modeling/security/security-overview.md b/content/en/docs/refguide/modeling/security/security-overview.md index d3a48a25231..19c07076327 100644 --- a/content/en/docs/refguide/modeling/security/security-overview.md +++ b/content/en/docs/refguide/modeling/security/security-overview.md @@ -73,11 +73,11 @@ To export the **Security Overview**, click the **Export to Excel** button. This 2. Module: The module containing the entity. 3. Entity: The name of the entity. 4. Can create: Specifies wether create access has been granted - 4. Can delete: Specifies wether delete access has been granted - 5. XPath: The XPath constraint. - 6. XPath Caption: The XPath constraint caption, when set. - 7. Access: The access level (None, Read or ReadWrite). - 8. Anonymous role: Specifies whether this access is connected to an anonymous user role. + 5. Can delete: Specifies wether delete access has been granted + 6. XPath: The XPath constraint. + 7. XPath Caption: The XPath constraint caption, when set. + 8. Access: The access level (None, Read or ReadWrite). + 9. Anonymous role: Specifies whether this access is connected to an anonymous user role. 3. Document Access -- This sheet includes the accessible pages, microflows and nanoflows, including the following: 1. Document type -- The type of the accessible document (page, microflow, nanoflow). 2. User Role. diff --git a/content/en/docs/refguide/runtime/log-levels.md b/content/en/docs/refguide/runtime/log-levels.md deleted file mode 100644 index 23e88f1c6ee..00000000000 --- a/content/en/docs/refguide/runtime/log-levels.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -title: "Set Log Levels" -url: /refguide/log-levels/ -description: "Describes how to configure the log levels for the various occurrence of logging within your app." -aliases: - - /howto/monitoring-troubleshooting/log-levels/ ---- - -## Introduction - -Each application has a log to which it writes log messages to monitor the health of the running application. Log levels are used to label the log messages and to highlight the highest priority ones so that they can be easily identified and responded to. - -This how-to teaches you how to do the following: - -* Configure the log levels for the various types of logging within your app - -## Logging Basics - -### Log Messages - -Log messages appear in the log of your Mendix application and present contextualized and detailed information, including the following: - -* Date and time the log message was created -* Level -* Log node -* Message -* Stack trace - -#### Log Node - -The log node describes the source of the log message. For example, in a log message from the email module, the log node could be set to **Email Module**. - -#### Message - -Most messages in the log are auto-generated by the system (for example, **Mendix Runtime successfully started, the application is now available**). However, log messages that are created via a microflow, can be customized by the developer. - -Customized log messages are created by defining a **Template**. The template is the structure of the message, and can be composed of parameters and free text. - -{{< figure src="/attachments/refguide/runtime/log-levels/log-message-template.png" class="no-border" >}} - -In the image above, the template for the message is *Email not sent to department {1}*. With this example template, when the error occurs the customer’s email address is inserted into the parameter placeholder **{1}** (for example, the log message would be *Email not sent to department Customer Support*. Thus, the log message is customized with data that is specific to the error. - -#### Stack Trace - -The stack trace is a list of current method calls from the point when the application was started to the point where the exception occurred. - -In Studio Pro, log messages that include a stack trace are marked with a paperclip icon ({{% icon name="paperclip" %}}). Double-clicking this icon shows the stack trace. - -### Level {#level} - -The log level defines the severity of the log message. In Studio Pro, this is represented by different colors and an icon. - -These are the log levels used by Mendix: - -| Level | Icon | Color | Description -| --- | --- | --- | --- | -| Trace | | | More detailed information. These are only written to logs. | -| Debug | | | Detailed information, typically of interest only when diagnosing problems. | -| Info | | | Confirmation that things are working as expected. | -| Warning | {{< figure src="/attachments/refguide/runtime/log-levels/warning.png" class="no-border" >}} | Orange | Indicates that something unexpected happened or that there is some problem in the near future (for example, "disk space low"). The application is still working as expected. | -| Error | {{< figure src="/attachments/refguide/runtime/log-levels/error.png" class="no-border" >}} | Red | Due to a more serious problem, the application has not been able to perform some function. | -| Critical | {{< figure src="/attachments/refguide/runtime/mendix-client/log-levels/critical.png" class="no-border" >}} | White (text), red (background) | A serious error has occurred, indicating that the application itself may be unable to continue running. | - -## Setting the Log Levels - -In this section you will learn how to specify which log messages are generated, based on the level of the log messages. Log messages with lower levels than the configured log level will not be generated. The different [levels](#level) can be applied both to the predefined logging produced by Mendix Studio Pro and to custom logging. - -### Configuring Log Levels via Script - -Log levels can be configured through the runtime admin port before the actual log levels exist. You can therefore create a script that sets all the required log levels at once. - -This is a Python script that sets `ConnectionBus` and `ActionManager` to the Trace and Debug levels, respectively: - -```py -import requests, base64, json, sys - -payload = { - 'action':'set_log_level', - 'params': {'nodes' : [ - { 'name':'ConnectionBus', 'level':'TRACE'}, - { 'name':'ActionManager', 'level':'DEBUG'} - ], 'force':True} -} -``` - -You can run this script as follows: - -```powershell -C:\temp\LogDemoApp\python -λ python setlogs.py 87a32a3e-c6db-4bc8-9fa3-7cd5b108eaec 8090 -{"feedback":{},"result":0} -``` - -### Configuring Log Levels Within Studio Pro {#configure-log-levels-from-studio-pro} - -To set the log levels within Studio Pro, follow these steps: - -1. Ensure that your app is running locally – if not, the option to set log levels will not be clickable. -2. In the **Console** pane, click **Advanced** to open the menu of advanced options. -3. Click **Set log levels**. -4. For the relevant **Log node**, select the desired level from the drop-down in the **Log level** column. - -{{< figure src="/attachments/refguide/runtime/log-levels/set-log-levels.png" class="no-border" >}} - -{{% alert color="info" %}} -You can override the log level for log messages in each environment when your app is deployed to Mendix Cloud. See the [Log Levels Tab](/developerportal/deploy/environments-details/#log-levels) section in *Environment Details* for more information. -{{% /alert %}} - -## Setting the Log Levels for Custom Log Messages - -To set the level of custom log messages that you have created via a microflow, follow these steps: - -1. Open the microflow in which you intend to change the log message level. -2. Double-click the log message activity. -3. In the **Log level** drop-down, select the desired level. - -{{< figure src="/attachments/refguide/runtime/log-levels/custom-log-messages.png" class="no-border" >}} - -## Read More - -* [Find the Root Cause of Runtime Errors](/howto/monitoring-troubleshooting/finding-the-root-cause-of-runtime-errors/) -* [Clear Warning Messages in Mendix](/howto/monitoring-troubleshooting/clear-warning-messages/) -* [Monitor Mendix Using JMX](/howto/monitoring-troubleshooting/monitoring-mendix-using-jmx/) -* [Debugging Microflows and Nanoflows](/refguide/debug-microflows-and-nanoflows/) -* [Debug Java Actions](/howto/monitoring-troubleshooting/debug-java-actions/) diff --git a/content/en/docs/refguide10/modeling/domain-model/entities/view-entities/charting-with-view-entities.md b/content/en/docs/refguide10/modeling/domain-model/entities/view-entities/charting-with-view-entities.md index 2935ec8b7dd..c5f6f7fd7ee 100644 --- a/content/en/docs/refguide10/modeling/domain-model/entities/view-entities/charting-with-view-entities.md +++ b/content/en/docs/refguide10/modeling/domain-model/entities/view-entities/charting-with-view-entities.md @@ -54,22 +54,22 @@ Use the new view entity to create a chart. Follow the steps below: 3. Double-click the chart and in the **Data Source** field, click **New**. 4. Configure the chart by filling out the following: - * Data set - **Multiple series** - * Data source - **YearlySalesByCategoryVE** - * Group by - **CategoryId** - * X axis attribute - **OrderYear** - * Y axis attribute - **TotalSales* + * Data set – **Multiple series** + * Data source – **YearlySalesByCategoryVE** + * Group by – **CategoryId** + * X axis attribute – **OrderYear** + * Y axis attribute – **TotalSales** 5. Set the series name to reflect the category name. Do the following: - * In the **Series name** field, click **Edit** and add **{1}** in the **Template** field. - * In the **Parameters** field, click **New** > **Select** > **CategoryName** > **Select** > **OK**. + * In the **Series name** field, click **Edit** and add **{1}** in the **Template** field. + * In the **Parameters** field, click **New** > **Select** > **CategoryName** > **Select** > **OK**. - {{< figure src="/attachments/refguide10/modeling/domain-model/view-entities/charting-with-view-entities/series-name.png" width="400" >}} + {{< figure src="/attachments/refguide10/modeling/domain-model/view-entities/charting-with-view-entities/series-name.png" width="400" >}} - The chart should be configured as seen below: + The chart should be configured as seen below: - {{< figure src="/attachments/refguide10/modeling/domain-model/view-entities/charting-with-view-entities/chart-final.png" width="400" >}} + {{< figure src="/attachments/refguide10/modeling/domain-model/view-entities/charting-with-view-entities/chart-final.png" width="400" >}} 6. Click **OK** to save. diff --git a/content/en/docs/refguide10/modeling/domain-model/entities/view-entities/create-pivot-table.md b/content/en/docs/refguide10/modeling/domain-model/entities/view-entities/create-pivot-table.md index 4826f25c469..3442d78ed56 100644 --- a/content/en/docs/refguide10/modeling/domain-model/entities/view-entities/create-pivot-table.md +++ b/content/en/docs/refguide10/modeling/domain-model/entities/view-entities/create-pivot-table.md @@ -51,11 +51,9 @@ Create a view entity that shows each order together with its total value, calcul GROUP BY o.OrderId, o.OrderDate, o.RequiredDate, o.ShippedDate ``` -{{% alert color="info" %}} + {{% alert color="info" %}} With view entities, you can take the relevant component of `DateTime` as a column using the `DATEPART` function. For more information, see the [`DATEPART` and `DATEDIFF`](/refguide10/oql-v2/#date-validations) section of *OQL Version 2 Features*. -With view entities, you can take the relevant component of `DateTime` as a column using the `DATEPART` function. For more information, see the [`DATEPART` and `DATEDIFF`](/refguide10/oql-v2/#date-validations) section of *OQL Version 2 Features*. - -{{% /alert %}} + {{% /alert %}} 3. Add another view entity to the domain model and name it *OrderQuarterlyPivotVE*. This entity will show a table, similar to the format above. 4. Add the following query to the OQL editor: diff --git a/content/en/docs/refguide10/modeling/domain-model/entities/view-entities/decoupling-apis.md b/content/en/docs/refguide10/modeling/domain-model/entities/view-entities/decoupling-apis.md index 64ace058160..4b4e72120d2 100644 --- a/content/en/docs/refguide10/modeling/domain-model/entities/view-entities/decoupling-apis.md +++ b/content/en/docs/refguide10/modeling/domain-model/entities/view-entities/decoupling-apis.md @@ -23,17 +23,17 @@ Create a single view entity and expose it as an OData resource. To do this, foll 1. Open your domain model and create a view entity called *ProductCategoryVE*. 2. Add the following query to the OQL editor: - ```sql - SELECT - p.ProductId as ProductId - , p.ProductName as ProductName - , p.QuantityPerUnit as QuantityPerUnit - , p.Discontinued as Discontinued - , c.CategoryName as Category - , c.CategoryId as CategoryId - FROM Shop.Product as p - JOIN p/Shop.Product_Category/Shop.Category as c - ``` + ```sql + SELECT + p.ProductId as ProductId + , p.ProductName as ProductName + , p.QuantityPerUnit as QuantityPerUnit + , p.Discontinued as Discontinued + , c.CategoryName as Category + , c.CategoryId as CategoryId + FROM Shop.Product as p + JOIN p/Shop.Product_Category/Shop.Category as c + ``` 3. Right-click this entity and select **Publish in OData service**. Name this service *POS_ProductCategory*. 4. Add `ProductId` as a key attribute, then click **OK**. diff --git a/content/en/docs/refguide10/modeling/domain-model/entities/view-entities/multilingual-apps.md b/content/en/docs/refguide10/modeling/domain-model/entities/view-entities/multilingual-apps.md index a0830cf7e9e..8ae85f0e08c 100644 --- a/content/en/docs/refguide10/modeling/domain-model/entities/view-entities/multilingual-apps.md +++ b/content/en/docs/refguide10/modeling/domain-model/entities/view-entities/multilingual-apps.md @@ -57,58 +57,58 @@ Combine the languages in the two entities into a single view. To do this, join t 3. Filter the translation that corresponds to the user’s current language by creating a new view entity. Name this new entity *TranslatedProductVE*. 4. Add the query below to your entity: + ```sql + SELECT + pt.ProductId as ProductId, + pt.ProductName as ProductName, + pt.QuantityPerUnit as QuantityPerUnit, + pt.Discontinued as Discontinued, + pt.LanguageCode as LanguageCode, + pt.Description as Description + FROM Shop.AllProductTranslationVE pt + LEFT JOIN System.User as u on (u.ID = '[%CurrentUser%]') + LEFT JOIN u/System.User_Language/System.Language as l + WHERE (l.Code = pt.LanguageCode) + ``` + + {{< figure src="/attachments/refguide10/modeling/domain-model/view-entities/multilingual-apps/translated-product-ve.png" width="200" >}} + + Alternatively, you can also combine the view entities into one with a nested query: + ```sql SELECT - pt.ProductId as ProductId, - pt.ProductName as ProductName, - pt.QuantityPerUnit as QuantityPerUnit, - pt.Discontinued as Discontinued, + cp.ProductId as ProductId, + cp.ProductName as ProductName, + cp.QuantityPerUnit as QuantityPerUnit, + cp.Discontinued as Discontinued, + cp.Description as Description, + cp.LanguageCode as LanguageCode + FROM + ( + SELECT + p.ProductId as ProductId, + p.ProductName as ProductName, + p.QuantityPerUnit as QuantityPerUnit, + p.Discontinued as Discontinued, pt.LanguageCode as LanguageCode, - pt.Description as Description - FROM Shop.AllProductTranslationVE pt - LEFT JOIN System.User as u on (u.ID = '[%CurrentUser%]') - LEFT JOIN u/System.User_Language/System.Language as l - WHERE (l.Code = pt.LanguageCode) + coalesce(pt.Description, p.Description) as Description + FROM Shop.Product p + JOIN p/Shop.ProductTranslation_Product/Shop.ProductTranslation pt + UNION + SELECT + p.ProductId as ProductId, + p.ProductName as ProductName, + p.QuantityPerUnit as QuantityPerUnit, + p.Discontinued as Discontinued, + cast('en_US' as STRING) as LanguageCode, + p.Description as Description + FROM Shop.Product p + ) as cp + LEFT JOIN System.User as u on (u.ID = '[%CurrentUser%]') + LEFT JOIN u/System.User_Language/System.Language as l + WHERE (l.Code = cp.LanguageCode) ``` - {{< figure src="/attachments/refguide10/modeling/domain-model/view-entities/multilingual-apps/translated-product-ve.png" width="200" >}} - -Alternatively, you can also combine the view entities into one with a nested query: - -```sql -SELECT - cp.ProductId as ProductId, - cp.ProductName as ProductName, - cp.QuantityPerUnit as QuantityPerUnit, - cp.Discontinued as Discontinued, - cp.Description as Description, - cp.LanguageCode as LanguageCode -FROM -( - SELECT - p.ProductId as ProductId, - p.ProductName as ProductName, - p.QuantityPerUnit as QuantityPerUnit, - p.Discontinued as Discontinued, - pt.LanguageCode as LanguageCode, - coalesce(pt.Description, p.Description) as Description - FROM Shop.Product p - JOIN p/Shop.ProductTranslation_Product/Shop.ProductTranslation pt - UNION - SELECT - p.ProductId as ProductId, - p.ProductName as ProductName, - p.QuantityPerUnit as QuantityPerUnit, - p.Discontinued as Discontinued, - cast('en_US' as STRING) as LanguageCode, - p.Description as Description - FROM Shop.Product p -) as cp - LEFT JOIN System.User as u on (u.ID = '[%CurrentUser%]') - LEFT JOIN u/System.User_Language/System.Language as l -WHERE (l.Code = cp.LanguageCode) -``` - 5. Generate an overview page for the view entity by right-clicking **TranslatedProductVE** > **Generate overview pages**. 6. Open the new page and remove the columns you do not need from the data grid. 7. Run your app locally. You should see the product description in the language that corresponds to the user’s current language. diff --git a/content/en/docs/refguide10/modeling/domain-model/entities/view-entities/view-entity-overview-pages.md b/content/en/docs/refguide10/modeling/domain-model/entities/view-entities/view-entity-overview-pages.md index 270a743a231..07b2eca13bd 100644 --- a/content/en/docs/refguide10/modeling/domain-model/entities/view-entities/view-entity-overview-pages.md +++ b/content/en/docs/refguide10/modeling/domain-model/entities/view-entities/view-entity-overview-pages.md @@ -43,11 +43,9 @@ Create a view entity that combines only the relevant attributes of the entities JOIN p/Shop.Product_Category/Shop.Category as c ``` -{{% alert color="info" %}} - -This query uses OQL to take the four attributes of each product and combines them with the associated supplier and category. If there is no supplier or category, the product will not be included. For more information, see [OQL Expressions](/refguide10/oql-expressions/). + {{% alert color="info" %}} This query uses OQL to take the four attributes of each product and combines them with the associated supplier and category. If there is no supplier or category, the product will not be included. For more information, see [OQL Expressions](/refguide10/oql-expressions/). -{{% /alert %}} + {{% /alert %}} 4. Click **OK**. The view entity is added to your domain model. @@ -121,11 +119,10 @@ You can calculate the total value of an order by joining the `OrderLine` and `Or GROUP BY o.OrderId, o.OrderDate, o.RequiredDate, o.ShippedDate ``` -This results in a view entity that shows the total value of every order. + This results in a view entity that shows the total value of every order. -{{% alert color="info" %}} -Notice the quotation marks in `Shop.”Order”`. This is because `Order` is a reserved keyword in OQL. To avoid ambiguity, quotation marks are put around the word. -{{% /alert %}} + {{% alert color="info" %}} Notice the quotation marks in `Shop.”Order”`. This is because `Order` is a reserved keyword in OQL. To avoid ambiguity, quotation marks are put around the word. + {{% /alert %}} 3. Generate an overview page by right-clicking the view entity > **Generate overview pages**. 4. Add the new overview page to the navigation. diff --git a/content/en/docs/refguide10/modeling/security/security-overview.md b/content/en/docs/refguide10/modeling/security/security-overview.md index 964e24a6683..0b4b474f416 100644 --- a/content/en/docs/refguide10/modeling/security/security-overview.md +++ b/content/en/docs/refguide10/modeling/security/security-overview.md @@ -78,11 +78,11 @@ To export the **Security Overview**, click the **Export to Excel** button. This 2. Module: The module containing the entity. 3. Entity: The name of the entity. 4. Can create: Specifies wether create access has been granted - 4. Can delete: Specifies wether delete access has been granted - 5. XPath: The XPath constraint. - 6. XPath Caption: The XPath constraint caption, when set. - 7. Access: The access level (None, Read or ReadWrite). - 8. Anonymous role: Specifies whether this access is connected to an anonymous user role. + 5. Can delete: Specifies wether delete access has been granted + 6. XPath: The XPath constraint. + 7. XPath Caption: The XPath constraint caption, when set. + 8. Access: The access level (None, Read or ReadWrite). + 9. Anonymous role: Specifies whether this access is connected to an anonymous user role. 3. Document Access -- This sheet includes the accessible pages, microflows and nanoflows, including the following: 1. Document type -- The type of the accessible document (page, microflow, nanoflow). 2. User Role. diff --git a/content/en/docs/refguide10/runtime/log-levels.md b/content/en/docs/refguide10/runtime/log-levels.md deleted file mode 100644 index 0f4b3918cb4..00000000000 --- a/content/en/docs/refguide10/runtime/log-levels.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -title: "Set Log Levels" -url: /refguide10/log-levels/ -description: "Describes how to configure the log levels for the various occurrence of logging within your app." -aliases: - - /howto10/monitoring-troubleshooting/log-levels/ ---- - -## Introduction - -Each application has a log to which it writes log messages to monitor the health of the running application. Log levels are used to label the log messages and to highlight the highest priority ones so that they can be easily identified and responded to. - -This how-to teaches you how to do the following: - -* Configure the log levels for the various types of logging within your app - -## Logging Basics - -### Log Messages - -Log messages appear in the log of your Mendix application and present contextualized and detailed information, including the following: - -* Date and time the log message was created -* Level -* Log node -* Message -* Stack trace - -#### Log Node - -The log node describes the source of the log message. For example, in a log message from the email module, the log node could be set to **Email Module**. - -#### Message - -Most messages in the log are auto-generated by the system (for example, **Mendix Runtime successfully started, the application is now available**). However, log messages that are created via a microflow, can be customized by the developer. - -Customized log messages are created by defining a **Template**. The template is the structure of the message, and can be composed of parameters and free text. - -{{< figure src="/attachments/refguide10/runtime/log-levels/log-message-template.png" class="no-border" >}} - -In the image above, the template for the message is *Email not sent to department {1}*. With this example template, when the error occurs the customer’s email address is inserted into the parameter placeholder **{1}** (for example, the log message would be *Email not sent to department Customer Support*. Thus, the log message is customized with data that is specific to the error. - -#### Stack Trace - -The stack trace is a list of current method calls from the point when the application was started to the point where the exception occurred. - -In Studio Pro, log messages that include a stack trace are marked with a paperclip icon ({{% icon name="paperclip" %}}). Double-clicking this icon shows the stack trace. - -### Level {#level} - -The log level defines the severity of the log message. In Studio Pro, this is represented by different colors and an icon. - -These are the log levels used by Mendix: - -| Level | Icon | Color | Description -| --- | --- | --- | --- | -| Trace | | | More detailed information. These are only written to logs. | -| Debug | | | Detailed information, typically of interest only when diagnosing problems. | -| Info | | | Confirmation that things are working as expected. | -| Warning | {{< figure src="/attachments/refguide10/runtime/log-levels/warning.png" class="no-border" >}} | Orange | Indicates that something unexpected happened or that there is some problem in the near future (for example, "disk space low"). The application is still working as expected. | -| Error | {{< figure src="/attachments/refguide10/runtime/log-levels/error.png" class="no-border" >}} | Red | Due to a more serious problem, the application has not been able to perform some function. | -| Critical | {{< figure src="/attachments/refguide10/runtime/mendix-client/log-levels/critical.png" class="no-border" >}} | White (text), red (background) | A serious error has occurred, indicating that the application itself may be unable to continue running. | - -## Setting the Log Levels - -In this section you will learn how to specify which log messages are generated, based on the level of the log messages. Log messages with lower levels than the configured log level will not be generated. The different [levels](#level) can be applied both to the predefined logging produced by Mendix Studio Pro and to custom logging. - -### Configuring Log Levels via Script - -Log levels can be configured through the runtime admin port before the actual log levels exist. You can therefore create a script that sets all the required log levels at once. - -This is a Python script that sets `ConnectionBus` and `ActionManager` to the Trace and Debug levels, respectively: - -```py -import requests, base64, json, sys - -payload = { - 'action':'set_log_level', - 'params': {'nodes' : [ - { 'name':'ConnectionBus', 'level':'TRACE'}, - { 'name':'ActionManager', 'level':'DEBUG'} - ], 'force':True} -} -``` - -You can run this script as follows: - -```powershell -C:\temp\LogDemoApp\python -λ python setlogs.py 87a32a3e-c6db-4bc8-9fa3-7cd5b108eaec 8090 -{"feedback":{},"result":0} -``` - -### Configuring Log Levels Within Studio Pro {#configure-log-levels-from-studio-pro} - -To set the log levels within Studio Pro, follow these steps: - -1. Ensure that your app is running locally – if not, the option to set log levels will not be clickable. -2. In the **Console** pane, click **Advanced** to open the menu of advanced options. -3. Click **Set log levels**. -4. For the relevant **Log node**, select the desired level from the drop-down in the **Log level** column. - -{{< figure src="/attachments/refguide10/runtime/log-levels/set-log-levels.png" class="no-border" >}} - -{{% alert color="info" %}} -You can override the log level for log messages in each environment when your app is deployed to Mendix Cloud. See the [Log Levels Tab](/developerportal/deploy/environments-details/#log-levels) section in *Environment Details* for more information. -{{% /alert %}} - -## Setting the Log Levels for Custom Log Messages - -To set the level of custom log messages that you have created via a microflow, follow these steps: - -1. Open the microflow in which you intend to change the log message level. -2. Double-click the log message activity. -3. In the **Log level** drop-down, select the desired level. - -{{< figure src="/attachments/refguide10/runtime/log-levels/custom-log-messages.png" class="no-border" >}} - -## Read More - -* [Find the Root Cause of Runtime Errors](/howto10/monitoring-troubleshooting/finding-the-root-cause-of-runtime-errors/) -* [Clear Warning Messages in Mendix](/howto10/monitoring-troubleshooting/clear-warning-messages/) -* [Monitor Mendix Using JMX](/developerportal/deploy/monitoring-mendix-using-jmx/) -* [Debugging Microflows and Nanoflows](/refguide10/debug-microflows-and-nanoflows/) -* [Debug Java Actions](/howto10/monitoring-troubleshooting/debug-java-actions/) diff --git a/content/en/docs/releasenotes/deployment/_index.md b/content/en/docs/releasenotes/deployment/_index.md index 06ba5893ed7..478e31ed239 100644 --- a/content/en/docs/releasenotes/deployment/_index.md +++ b/content/en/docs/releasenotes/deployment/_index.md @@ -15,7 +15,7 @@ Follow the links in the table below to see the release notes you want: | Type of Deployment | Last Updated | | --- | --- | -| [Mendix Cloud](/releasenotes/developer-portal/mendix-cloud/) | November 23, 2025 | +| [Mendix Cloud](/releasenotes/developer-portal/mendix-cloud/) | December 06, 2025 | | [Mendix on Kubernetes](/releasenotes/developer-portal/mendix-for-private-cloud/) | November 6, 2025 | | [Mendix on Azure](/releasenotes/developer-portal/mendix-on-azure/) | November 6, 2025 | | [SAP Business Technology Platform (SAP BTP)](/releasenotes/developer-portal/sap-cloud-platform/) | August 27, 2024 | diff --git a/content/en/docs/releasenotes/deployment/mendix-cloud.md b/content/en/docs/releasenotes/deployment/mendix-cloud.md index 6c542198ddf..fb1258335f9 100644 --- a/content/en/docs/releasenotes/deployment/mendix-cloud.md +++ b/content/en/docs/releasenotes/deployment/mendix-cloud.md @@ -16,6 +16,12 @@ For information on the current status of deployment to Mendix Cloud and any plan ## 2025 +### December 06, 2025 + +#### Improvements + +* We have upgraded Mendix Dock to support contract expiry banners. Mendix Cloud can now provide timely information when contracts are approaching their expiry dates. + ### November 23, 2025 #### New Features diff --git a/content/en/docs/releasenotes/deployment/mendix-for-private-cloud.md b/content/en/docs/releasenotes/deployment/mendix-for-private-cloud.md index c2abe4e09bc..8683832c5a4 100644 --- a/content/en/docs/releasenotes/deployment/mendix-for-private-cloud.md +++ b/content/en/docs/releasenotes/deployment/mendix-for-private-cloud.md @@ -50,8 +50,8 @@ For information on the current status of deployment to Mendix on Kubernetes and Under these conditions, you can expect no downtime during the update process, as long as the application is using the same MDA and base OS image. -* Exporting **Scheduled events**, **Application details**, **PCLM Statistics** is now possible in CSV format, replacing the XLSX format. -* We have incorporated the use of fallback license for Connected environments using Subscription Secrets. If an environment fails to communicate with the licensing server, it will use the fallback license instead of switching into Trial mode. This option is enabled by default. +* Exporting **Scheduled events**, **Application details**, **PCLM Statistics** is now possible in CSV format, replacing the XLSX format. +* We have incorporated the use of fallback license for Connected environments using Subscription Secrets. If an environment fails to communicate with the licensing server, it will use the fallback license instead of switching into Trial mode. This option is enabled by default. ### October 21, 2025 diff --git a/content/en/docs/releasenotes/developer-portal/_index.md b/content/en/docs/releasenotes/developer-portal/_index.md index f9b532b95bd..0866786579a 100644 --- a/content/en/docs/releasenotes/developer-portal/_index.md +++ b/content/en/docs/releasenotes/developer-portal/_index.md @@ -21,6 +21,17 @@ To see the current status of the Mendix Portal, see [Mendix Status](https://stat ## 2025 +### December 4 + +#### Improvements + +* We have changed the behavior of deleting [feedback](/developerportal/app-insights/feedback/) groups. Now, when you delete a feedback group, the group itself is deleted, but the feedback included in it is not. + +#### Fixes + +* We have fixed an issue where clicking through the [Feedback](/developerportal/app-insights/feedback/) page would sometimes result in errors. +* We have fixed an issue where you were no longer notified of newly received feedback items. + ### October 30 #### New Features diff --git a/content/en/docs/releasenotes/feature-release-calendar/_index.md b/content/en/docs/releasenotes/feature-release-calendar/_index.md index d2b47ff44b0..65f93eec5fc 100644 --- a/content/en/docs/releasenotes/feature-release-calendar/_index.md +++ b/content/en/docs/releasenotes/feature-release-calendar/_index.md @@ -43,8 +43,8 @@ General Availability means that a feature is available for all users. This type | MCP Client | General Availability: Mx 11.2 + Mx 10.24 | | Mendix Cloud GenAI Resource Packs | General Availability: Mx 11.2 + Mx 10.24 | | Mendix Cloud GenAI Resource Packs Guardrails | Public Beta: Mx 11.9 | -| Agent Builder in Studio Pro | Private Beta: Mx 11.6 | -| Agent Observability | Public Beta: Mx 11.9 | +| Agent Builder in Studio Pro | Private Preview: Mx 11.9 | +| Agent Observability | General Availability: Mx 11.5 + Mx 10.24 | ## Developer Experience (Studio Pro) diff --git a/content/en/docs/releasenotes/marketplace/general-marketplace.md b/content/en/docs/releasenotes/marketplace/general-marketplace.md index 0e6c24dc9ca..be3454bc665 100644 --- a/content/en/docs/releasenotes/marketplace/general-marketplace.md +++ b/content/en/docs/releasenotes/marketplace/general-marketplace.md @@ -12,6 +12,13 @@ aliases: These release notes cover changes made to the [Mendix Marketplace](/appstore/). +### December 11, 2025 + +### New Features + +* You can now deprecate Marketplace components that are no longer maintained. This helps keep a clean and reliable Marketplace ecosystem, with full visibility into the content that is no longer supported, as well as its recommended alternatives. + For details, refer to [Deprecating Marketplace Content](/appstore/deprecate-content/). + ### October 9, 2025 #### Improvements diff --git a/content/en/docs/releasenotes/mendix-cloud-genai-resource-packs/_index.md b/content/en/docs/releasenotes/mendix-cloud-genai-resource-packs/_index.md index 515003e6ddd..d0592c3681d 100644 --- a/content/en/docs/releasenotes/mendix-cloud-genai-resource-packs/_index.md +++ b/content/en/docs/releasenotes/mendix-cloud-genai-resource-packs/_index.md @@ -52,5 +52,15 @@ You can access them through the [Mendix Cloud GenAI Portal](https://genai.home.m #### Improvements * Users can now open GenAI resources directly in a new tab for easier access from the Control Center. -* The default **Cross Region Interface** (CRI) settings is now enabled when creating text generation resources. +* The default **Cross Region Inference** (CRI) settings is now enabled when creating text generation resources. * When creating a knowledge base resource, users can open the **Create Embeddings Resource** in a new tab to help prevent data loss. + +### December 11, 2025 + +#### New Features + +* Users can now change the model for Text Generation Resources, selecting only those available in the same region and supported by their subscription plan. + +#### Fixes + +* We fixed an issue that prevented the consumption page from loading in some cases. diff --git a/content/en/docs/releasenotes/mobile/mendix-native-mobile-builder.md b/content/en/docs/releasenotes/mobile/mendix-native-mobile-builder.md index b76015bb6fa..414b7bf5d1a 100644 --- a/content/en/docs/releasenotes/mobile/mendix-native-mobile-builder.md +++ b/content/en/docs/releasenotes/mobile/mendix-native-mobile-builder.md @@ -33,7 +33,7 @@ To fix this issue, do the following: ## Fixes -- We fixed an issue where native builds failed with the error "`@notifee/react-native` is not a known dependency." +* We fixed an issue where native builds failed with the error "`@notifee/react-native` is not a known dependency." ## Release 1.0.142 {#10142} diff --git a/content/en/docs/releasenotes/mobile/native-template/nt-studio-pro-10-parent/nt-14-rn.md b/content/en/docs/releasenotes/mobile/native-template/nt-studio-pro-10-parent/nt-14-rn.md index 630fed83855..ca48eab6ce3 100644 --- a/content/en/docs/releasenotes/mobile/native-template/nt-studio-pro-10-parent/nt-14-rn.md +++ b/content/en/docs/releasenotes/mobile/native-template/nt-studio-pro-10-parent/nt-14-rn.md @@ -5,6 +5,14 @@ weight: 6 description: "Native Template 14" --- +## 14.1.9 {#1419} + +**Release date: December 3, 2025** + +### Improvements + +* We improved the styling when edge-to-edge mode is enabled. + ## 14.1.8 {#1418} **Release date: November 21, 2025** diff --git a/content/en/docs/releasenotes/studio-pro/10/10.24.md b/content/en/docs/releasenotes/studio-pro/10/10.24.md index c7a7702a5e6..88019851205 100644 --- a/content/en/docs/releasenotes/studio-pro/10/10.24.md +++ b/content/en/docs/releasenotes/studio-pro/10/10.24.md @@ -10,6 +10,64 @@ weight: 76 This is the [LTS](/releasenotes/studio-pro/lts-mts/#lts) version 10 release for apps in production. {{% /alert %}} +## 10.24.13 {#102413} + +**Release date: December 2, 2025** + +{{% button color="info" href="https://marketplace.mendix.com/link/studiopro/10.24.13" text="Go to Marketplace" title="Download version 10.24.13 from the Marketplace" %}} + +### Improvements + +- We added support for the following database versions: + - PostgreSQL 18 + - Microsoft SQL Server 2025 +- We introduced the [batch conversion](/refguide/mendix-client/batch-conversion/) capability in Studio Pro for converting the old widgets that are no longer supported by the [React client](/refguide/mendix-client/react/). +- We now cleanup expired sessions in batches instead of all at once. + +### Fixes + +- We fixed an error in the Studio Pro installer when the installer is checking if the .NET version is already installed or not. (Ticket 253218) +- We fixed an issue where unsaved changes of the System Text editor would be committed when running the app locally. (Ticket 259664) +- We fixed an issue that prevented some users to authenticate in Studio Pro. (Ticket 259700) +- SQLite files are now included in the service worker’s pre-cache list to ensure they are available offline. (Ticket 264140, Ticket 264910) +- We fixed an error when typing invalid values in the zoom combo box on the page editor in **Structure** mode. +- We fixed an issue where scheduled events with **On overlap** configured as **Delay next** would cause multiple "Skipping the update of ScheduledEvent because it's running; retrying in 7 seconds." log messages if the application was started with some time between the shutdown and the restart. +- We fixed the issue that invalid sessions without an associated user were never removed from the database. +- Only log 404 errors in development mode to reduce log noise in production environments. Server access logs should be used for 404 tracking in production. +- We fixed a bug where the File Uploader would not be clickable when nested in a container. + +## 10.24.12 {#102412} + +**Release date: December 1, 2025** + +{{% button color="info" href="https://marketplace.mendix.com/link/studiopro/10.24.12" text="Go to Marketplace" title="Download version 10.24.12 from the Marketplace" %}} + +### Improvements +* We implemented a feature that allows filtering out spans by their name. For more information, see the [Testing](/refguide/tracing-in-runtime/#testing) section of *Tracing*. +* The logout API in the new client `mx-api` now supports an optional params object with `reloadOnSuccess` flag. By default, `mx-api/logout` automatically reloads the page after a successful logout if you call it with no params object. If you pass a params object `{reloadOnSuccess: false}`, the automatic reload is disabled so you can implement your own custom logout flow and trigger reload yourself when needed. +* We now log a warning when runtime operation parameters are missing during a database retrieval with an XPath constraint. + This can happen, for example, when a nanoflow retrieve activity uses an XPath constraint that references an associated object that is not yet available in the nanoflow scope. In such cases, that would lead to unresolvable XPath. (Ticket 260339) + +### Fixes + +* We upgraded the JDBC driver for Microsoft SQL Server to version 12.8.2, because of [CVE-2025-59250](https://www.cve.org/CVERecord?id=CVE-2025-59250). + * If you connect to SQL Server using integrated security in a module such as [Database Connector](https://marketplace.mendix.com/link/component/2888), you may need to update the JDBC driver in `userlib` as well. +* We fixed an issue where OQL query parsing would fail if the query included a numeric WHEN clause without an accompanying ELSE condition. (Ticket 255719) +* We fixed an issue where XPath access rules on a view entity could lead to an "Object hash is invalid!" error. (Ticket 255889) +* We fixed an issue that caused the microflow execution to abort when the **Sync to Device** action failed in offline apps due to missing files. (Ticket 261053) +* We fixed an issue where undoing a widget update could lead to an inconsistent model, causing an error when attempting to reopen the project. We now prevent **Undo** actions for widget updates to safeguard against similar issues. (Tickets 256004, 260822) +* We fixed an issue that prevented a dialog from closing when users pressed Escape while editing an [access rule](/refguide/access-rules/). (Ticket 257016) +* We fixed an issue where conditional editability expressions in snippet calls incorrectly references variables when nested snippets were involved. (Tickets 257120, 262408) +* We fixed an issue where source maps for pluggable widgets were not included correctly in the React client bundle when **Optimize bundle** is set to **No**. (Ticket 261353) +* We fixed an issue where widgets with unbounded dynamic imports (for example, `await import(path);`) would result in a bundling error when using the React client. They are now marked as external, which means they will be resolved when the widget is loaded in the browser. (Ticket 261630) +* We fixed an issue for the Message Definitions editor where custom values for editable fields like 'External Name' disappeared. (Tickets 263144, 263609, 263817, 264535, 264805, 264850) +* We fixed an issue for **Import Mappings** and **Export Mappings** where after reopening and saving in the 'Select elements' dialog previously selected elements deep in the tree structure were no longer selected. (Ticket 264531) +* We now allow first-time users to use Studio Pro without logging in. +* We fixed memory leaks related to the style document editor. +* We fixed an issue in consumed OData services in Studio Pro where importing a metadata file with incorrect XML namespaces would show an "Importing..." progress dialog without ever completing the import. +* We fixed an issue where `Core.getLicenseInformation().products()` did not return a numeric value if the value was larger than `2147483647`. +* We fixed a bug where nanoflows would not be exported when re-added to a page after a full deployment cycle. The issue occurred when a nanoflow was removed from a page during hot-reload, followed by a full deployment, and then re-added during another hot-reload. + ## 10.24.11 {#102411} **Release date: November 4, 2025** diff --git a/content/en/docs/releasenotes/studio-pro/11/11.5.md b/content/en/docs/releasenotes/studio-pro/11/11.5.md index 74cdc1a8eab..faef479e3a2 100644 --- a/content/en/docs/releasenotes/studio-pro/11/11.5.md +++ b/content/en/docs/releasenotes/studio-pro/11/11.5.md @@ -13,64 +13,65 @@ weight: 95 ### New Features -- Pages and snippets can now capture and use return values when calling microflows or nanoflows by specifying an [action return value mapping](/refguide/return-value-mapping/). For primitive return values, the value can be assigned to any matching attribute, page variable, or snippet variable. For object return values, select one or more attributes to map to different variables — useful for assigning multiple computed values from a single flow call. Return values can be transformed using expressions before assignment, such as applying formatting when assigning a number to a string variable. This feature enhances microflow and nanoflow reusability by allowing pages to update local values based on flow return values without needing to pass objects containing those attributes to the flow. It also enables changing variables on pages and snippets based on business logic modeled in the flows. -- The [Call external action](/refguide/call-external-action/) activity now allows adding additional attributes for parameters that are open types. -- We introduced a new UI element in the [Integration pane](/refguide/integration-pane/) to separate catalog services from already consumed services. The new UI shows them in dedicated segments with independent search functionality. -- It is now possible to filter on date in the beta [History pane](/refguide/history-dialog/). -- The beta [History pane](/refguide/history-dialog/) now shows an icon for changed documents to indicate the document type. -- We now render the `href` property for link buttons and navigation items linking to a Mendix page that have a page URL or have a literal value address, improving accessibility and enabling **open‑in‑new‑tab** and **copy‑link** browser actions. +* Pages and snippets can now capture and use return values when calling microflows or nanoflows by specifying an [action return value mapping](/refguide/return-value-mapping/). For primitive return values, the value can be assigned to any matching attribute, page variable, or snippet variable. For object return values, select one or more attributes to map to different variables — useful for assigning multiple computed values from a single flow call. Return values can be transformed using expressions before assignment, such as applying formatting when assigning a number to a string variable. This feature enhances microflow and nanoflow reusability by allowing pages to update local values based on flow return values without needing to pass objects containing those attributes to the flow. It also enables changing variables on pages and snippets based on business logic modeled in the flows. +* The [Call external action](/refguide/call-external-action/) activity now allows adding additional attributes for parameters that are open types. +* We introduced a new UI element in the [Integration pane](/refguide/integration-pane/) to separate catalog services from already consumed services. The new UI shows them in dedicated segments with independent search functionality. +* It is now possible to filter on date in the beta [History pane](/refguide/history-dialog/). +* The beta [History pane](/refguide/history-dialog/) now shows an icon for changed documents to indicate the document type. +* We now render the `href` property for link buttons and navigation items linking to a Mendix page that have a page URL or have a literal value address, improving accessibility and enabling **open‑in‑new‑tab** and **copy‑link** browser actions. #### Optimistic Locking -- We made optimistic locking publicly available as a beta feature. This allows apps to safe-guard for concurrent modifications. It can be enabled in the Runtime tab of the project settings dialog. Enabling this feature gives each entity an extra system attribute (`MxObjectVersion` of type `Long`). Its behavior will be automatically handled by the system. More details can be found in the documentation: http://docs.mendix.com/refguide/optimistic-locking. +* We made optimistic locking publicly available as a beta feature. This allows apps to safe-guard for concurrent modifications. It can be enabled in the Runtime tab of the project settings dialog. Enabling this feature gives each entity an extra system attribute (`MxObjectVersion` of type `Long`). Its behavior will be automatically handled by the system. More details can be found in the documentation: http://docs.mendix.com/refguide/optimistic-locking. ### Improvements -- When manually resizing a popup dialog in Studio Pro, it will remember the new size and use it next time the dialog is opened again. This feature can be switched off with a new setting in the **Environment** tab of **Preferences**. To forget the stored dialog sizes again, we added an option to the **Restore Default Layout** popup dialog that can be opened from the **View** menu. +* When manually resizing a popup dialog in Studio Pro, it will remember the new size and use it next time the dialog is opened again. This feature can be switched off with a new setting in the **Environment** tab of **Preferences**. To forget the stored dialog sizes again, we added an option to the **Restore Default Layout** popup dialog that can be opened from the **View** menu. + * We upgraded the JDBC driver for Microsoft SQL Server to version 13.2.1. * If you connect to SQL Server using integrated security in a module such as [Database Connector](https://marketplace.mendix.com/link/component/2888), you may need to update the JDBC driver in `userlib` as well. -- We switched from IndexedDB storage for the Offline PWA database to OPFS storage. This will enhance the performance of synchronization and SQL queries in general. The first time the Offline PWA is opened or refreshed on this new Mendix version, it will trigger the migration of data from the IndexedDB storage. It will take some time and the application start will be delayed until that is finished, depending on the size of the offline database for that browser. -- We added support for the following [language](/refguide/language-settings/): Georgian. -- We added Enter key press handler to expand or collapse nodes in the modernized app explorer. -- When an OQL UPDATE statement has a SET expression that returns multiple rows, we now throw a `CardinalityViolationException` instead of a generic `ConnectionBusException`. -- We improved the way Studio Pro updates attributes and associations based on the OQL query of a view entity. It now renames existing attributes and associations when the expression is the same but the alias is different. -- We improved the Send REST Request activity in Studio Pro. It now indicates whether parameters are required or not. -- We implemented a new [Tracing](/refguide/tracing-in-runtime/#testing) feature that allows filtering out spans by their name. -- We have improved the UX of the managed dependencies and **userlib** *.JAR* exclusions dialogs. Now checking the rows will exclude the **.JAR**s instead of including them. -- The logout API in the new client `mx-api` now supports an optional params object with `reloadOnSuccess` flag. By default, `mx-api/logout` automatically reloads the page after a successful logout if you call it with no params object. If you pass a params object `{reloadOnSuccess: false}`, the automatic reload is disabled so you can implement your own custom logout flow and trigger reload yourself when needed. -- Mendix 11 introduces a change in the versioning schema by dropping the fourth element, known as the build number. Versions will now follow a SemVer pattern `major.minor.patch` with the occasional pre-release suffix (for example, `beta.1` for planned pre-releases). This semantic version will also be the version that is returned by `Core.getRuntimeVersion()`. Apps build with a pre-release can be identified internally by their exact version. +* We switched from IndexedDB storage for the Offline PWA database to OPFS storage. This will enhance the performance of synchronization and SQL queries in general. The first time the Offline PWA is opened or refreshed on this new Mendix version, it will trigger the migration of data from the IndexedDB storage. It will take some time and the application start will be delayed until that is finished, depending on the size of the offline database for that browser. +* We added support for the following [language](/refguide/language-settings/): Georgian. +* We added Enter key press handler to expand or collapse nodes in the modernized app explorer. +* When an OQL UPDATE statement has a SET expression that returns multiple rows, we now throw a `CardinalityViolationException` instead of a generic `ConnectionBusException`. +* We improved the way Studio Pro updates attributes and associations based on the OQL query of a view entity. It now renames existing attributes and associations when the expression is the same but the alias is different. +* We improved the Send REST Request activity in Studio Pro. It now indicates whether parameters are required or not. +* We implemented a new [Tracing](/refguide/tracing-in-runtime/#testing) feature that allows filtering out spans by their name. +* We have improved the UX of the managed dependencies and **userlib** *.JAR* exclusions dialogs. Now checking the rows will exclude the **.JAR**s instead of including them. +* The logout API in the new client `mx-api` now supports an optional params object with `reloadOnSuccess` flag. By default, `mx-api/logout` automatically reloads the page after a successful logout if you call it with no params object. If you pass a params object `{reloadOnSuccess: false}`, the automatic reload is disabled so you can implement your own custom logout flow and trigger reload yourself when needed. +* Mendix 11 introduces a change in the versioning schema by dropping the fourth element, known as the build number. Versions will now follow a SemVer pattern `major.minor.patch` with the occasional pre-release suffix (for example, `beta.1` for planned pre-releases). This semantic version will also be the version that is returned by `Core.getRuntimeVersion()`. Apps build with a pre-release can be identified internally by their exact version. ### Fixes -- We fixed an issue in which incompatible React client widgets did not emit an error when they are nested inside a pluggable widget. (Ticket 253896) -- We fixed an issue where XPath access rules on a view entity could lead to an "Object hash is invalid!" error. (Ticket 255889) -- We fixed an issue where undoing a widget update could lead to an inconsistent model, causing an error when attempting to reopen the project. We now prevent undo actions for widget updates to safeguard against similar issues. (Tickets 256004, 260822) -- We fixed an issue where conditional editability expressions in snippet calls incorrectly references variables when nested snippets were involved. (Tickets 257120, 262408) -- We fixed an issue where JSON Import mappings stopped finding objects. (Ticket 258507) -- We now log a warning when runtime operation parameters are missing during a database retrieval with an XPath constraint.This can happen, for example, when a nanoflow retrieve activity uses an XPath constraint that references an associated object that is not yet available in the nanoflow scope. In such cases, that would lead to unresolvable XPath. (Ticket 260339) -- We fixed an issue where source maps for pluggable widgets were not included correctly in the React client bundle when **Optimize bundle** is set to **No**. (Ticket 261353) -- We fixed an issue where widgets with unbounded dynamic imports (e.g. `await import(path);`) would result in a bundling error when using the React client. They are now marked as external which means they will be resolved when the widget is loaded in the browser. (Ticket 261630) -- We fixed a "no such column" error upon a "CREATE INDEX" query when upgrading an offline app that has an association added to an entity. (Ticket 261700) -- We fixed an issue for the Message Definitions editor where custom values for editable fields like 'External Name' disappeared. (Ticket 263144, 263609, 263817, 264535, 264805, 264850) -- We fixed an issue where a Timer activity could get stuck when its workflow was upgraded while the activity was active. (Ticket 263288) -- We fixed memory leaks related to the style document editor. -- We fixed a migration issue from 10.24 to 11.x that attempted to recreate an already existing column in a table in the offline app database. -- We fixed a bug where the JavaScript Action code editor would overlap with the errors pane after resizing it. -- We reduced the size of the Studio Pro installer on Windows. -- When editing a Page Template it is no longer possible to select the option 'shown when generating select pages' if the app uses the React client. -- We fixed the following bugs in the version selector: - - When opening a widget .mpk the file was kept on hold even after closing the dialog, preventing it to be renamed or opened. - - Closing the "Version not found" dialog popup launched the selected Studio Pro version instead of just closing the dialog popup. - - The Studio Pro versions were not displayed with the correct format. -- We now allow first time users to use Studio Pro without login in when opening Studio Pro for the first time. -- We fixed in issue in Studio Pro that could result in an "System.InvalidOperationException: No undo context." error while building apps with offline profiles. -- We fixed auto scrolling to the first matched node after search in the modernized app explorer. -- We removed unnecessary auto scroll after converting, creating, or duplicating a document if document is already in the view in the modernized app explorer. -- We fixed an issue in consumed OData services in Studio Pro. Studio Pro would not recognize optional parameters in metadata files containing a reference to the core vocabulary. -- We fixed an issue with OpenAPI v3 exports for Publish REST services where contracts with reference schema were not showing attributes for referenced objects. -- We fixed an issue in consumed OData services in Studio Pro, where importing a metadata file with incorrect XML namespaces would show and **Importing...** progress dialog without ever completing the import. -- We fixed issues where green checkmarks were inconsistently displayed in the Integration pane after dragging remote entities from OData services and the catalog to the domain model. -- We fixed an issue where search criteria were not properly retained in the beta history pane. -- We fixed an issue where the search criteria were not properly cleared when closing the beta history pane. -- We fixed a bug where nanoflows would not be exported when re-added to a page after a full deployment cycle. The issue occurred when a nanoflow was removed from a page during hot-reload, followed by a full deployment, and then re-added during another hot-reload. -- Added an example of the client Data#get() API for a Get-By-Path situation and made the entity parameter optional for offline apps (as is the case for online apps). +* We fixed an issue in which incompatible React client widgets did not emit an error when they are nested inside a pluggable widget. (Ticket 253896) +* We fixed an issue where XPath access rules on a view entity could lead to an "Object hash is invalid!" error. (Ticket 255889) +* We fixed an issue where undoing a widget update could lead to an inconsistent model, causing an error when attempting to reopen the project. We now prevent undo actions for widget updates to safeguard against similar issues. (Tickets 256004, 260822) +* We fixed an issue where conditional editability expressions in snippet calls incorrectly references variables when nested snippets were involved. (Tickets 257120, 262408) +* We fixed an issue where JSON Import mappings stopped finding objects. (Ticket 258507) +* We now log a warning when runtime operation parameters are missing during a database retrieval with an XPath constraint.This can happen, for example, when a nanoflow retrieve activity uses an XPath constraint that references an associated object that is not yet available in the nanoflow scope. In such cases, that would lead to unresolvable XPath. (Ticket 260339) +* We fixed an issue where source maps for pluggable widgets were not included correctly in the React client bundle when **Optimize bundle** is set to **No**. (Ticket 261353) +* We fixed an issue where widgets with unbounded dynamic imports (e.g. `await import(path);`) would result in a bundling error when using the React client. They are now marked as external which means they will be resolved when the widget is loaded in the browser. (Ticket 261630) +* We fixed a "no such column" error upon a "CREATE INDEX" query when upgrading an offline app that has an association added to an entity. (Ticket 261700) +* We fixed an issue for the Message Definitions editor where custom values for editable fields like 'External Name' disappeared. (Ticket 263144, 263609, 263817, 264535, 264805, 264850) +* We fixed an issue where a Timer activity could get stuck when its workflow was upgraded while the activity was active. (Ticket 263288) +* We fixed memory leaks related to the style document editor. +* We fixed a migration issue from 10.24 to 11.x that attempted to recreate an already existing column in a table in the offline app database. +* We fixed a bug where the JavaScript Action code editor would overlap with the errors pane after resizing it. +* We reduced the size of the Studio Pro installer on Windows. +* When editing a Page Template it is no longer possible to select the option 'shown when generating select pages' if the app uses the React client. +* We fixed the following bugs in the version selector: + * When opening a widget .mpk the file was kept on hold even after closing the dialog, preventing it to be renamed or opened. + * Closing the "Version not found" dialog popup launched the selected Studio Pro version instead of just closing the dialog popup. + * The Studio Pro versions were not displayed with the correct format. +* We now allow first time users to use Studio Pro without login in when opening Studio Pro for the first time. +* We fixed in issue in Studio Pro that could result in an "System.InvalidOperationException: No undo context." error while building apps with offline profiles. +* We fixed auto scrolling to the first matched node after search in the modernized app explorer. +* We removed unnecessary auto scroll after converting, creating, or duplicating a document if document is already in the view in the modernized app explorer. +* We fixed an issue in consumed OData services in Studio Pro. Studio Pro would not recognize optional parameters in metadata files containing a reference to the core vocabulary. +* We fixed an issue with OpenAPI v3 exports for Publish REST services where contracts with reference schema were not showing attributes for referenced objects. +* We fixed an issue in consumed OData services in Studio Pro, where importing a metadata file with incorrect XML namespaces would show and **Importing...** progress dialog without ever completing the import. +* We fixed issues where green checkmarks were inconsistently displayed in the Integration pane after dragging remote entities from OData services and the catalog to the domain model. +* We fixed an issue where search criteria were not properly retained in the beta history pane. +* We fixed an issue where the search criteria were not properly cleared when closing the beta history pane. +* We fixed a bug where nanoflows would not be exported when re-added to a page after a full deployment cycle. The issue occurred when a nanoflow was removed from a page during hot-reload, followed by a full deployment, and then re-added during another hot-reload. +* Added an example of the client Data#get() API for a Get-By-Path situation and made the entity parameter optional for offline apps (as is the case for online apps). diff --git a/content/en/docs/releasenotes/workstation/_index.md b/content/en/docs/releasenotes/workstation/_index.md index 83aca9bdee2..4961e5a50ac 100644 --- a/content/en/docs/releasenotes/workstation/_index.md +++ b/content/en/docs/releasenotes/workstation/_index.md @@ -10,9 +10,69 @@ cascade: These release notes cover changes made to the [Mendix Workstation](/mendix-workstation/). +## 3.2.0 + +### Release date: December 4, 2025 + +### Workstation Management + +#### New Features + +##### Exporting and Importing Station Configuration + +You can now export the configurations of a list of stations from a workspace to a file and import them into the same or a different workspace. This feature includes options to export all stations, with or without applications and devices. + +{{% alert color="info" %}} +This feature is available only for accounts which have a license for Mendix Workstation Client. +{{% /alert %}} + +##### Remote Workstation Client Refresh + +On the **Station** page, have added a new **Refresh Client** action. You can use this action to remotely trigger a refresh of a Workstation Client's configuration. + +#### Fixes + +* Dark mode display - We have resolved some display issues which could occur when using Workstation Management in dark mode. +* Workspace sorting - We have corrected an issue affecting the sorting behavior of workspaces. +* Application configuration duplication - We have fixed a problem that could lead to users inadvertently creating duplicate application configurations by adding a space before or after the key or URL. + +#### Known Bugs and Limitations + +* Importing duplicate app configurations - Attempting to import a configuration that includes applications already defined (for example, with an existing URL and Public Key) results in UI errors. + +{{% alert color="info" %}} +To work around this issue, you can can import the configuration by excluding the applications and then manually setting them up afterward. +{{% /alert %}} + +* Indistinguishable station duplicates - Importing the same station multiple times creates duplicates that are currently not distinguishable within the system. +* Duplicate application creation on import - When importing multiple stations that all use the same application, and applications are included in the import, the application is created multiple times (once for each station). + +### Workstation Client + +#### New Features + +##### Configuration Refresh on Launch + +Upon each launch, the Workstation Client now automatically checks for updates to its configuration, ensuring it is always running with the latest settings. + +##### Automatic Client Reset + +The Workstation Client automatically resets on the next refresh when its associated computer is unregistered from Workstation Management. + +#### Fixes and Other Changes + +* Linux ARM64 executable name - For improved consistency, we have removed the spaces from the executable name of the Workstation Client (Linux ARM64 version). +* Bluetooth LE device discovery - We have addressed an issue where the discovery process for Bluetooth LE devices did not correctly recognize the full device name, which previously led to failed connection attempts. The Workstation Client now accurately matches Bluetooth BT advertisement names. + +### Workstation Connector + +#### Fixes + +* Refresh of the updated device list - We have fixed an issue where updates to the device list were not immediately sent to the web application after a configuration update, requiring a manual refresh. The list is now updated immediately. + ## 3.1.0 -#### Release date: November 7, 2025 +### Release date: November 7, 2025 ### Workstation Management @@ -39,7 +99,7 @@ You can now copy the station configuration to the clipboard, or download it to a #### Fixes * Computer registration: We fixed an issue where the Workstation Client could not connect to Workstation Management over a network connection that required a certificate. With this new release, the Workstation Client now uses the client operating system's certificates to establish a connection with Workstation Management. -* Smartcard reader interface: We fixed an issue in the Workstation Client where the client would freeze if **Detect card readers** was enabled and the operating system's smartcard service was stopped. +* smart card reader interface: We fixed an issue in the Workstation Client where the client would freeze if **Detect card readers** was enabled and the operating system's smart card service was stopped. * Bluetooth LE interface: We fixed issues in the Workstation Client and Connector when subscribing to Bluetooth properties. Wait and sleep times between subscriptions are no longer required, and multiple series of subscriptions and unsubscriptions are supported. ## 3.0.0 @@ -71,7 +131,7 @@ When editing a device, device settings are edited in a side panel. It makes devi ### Known Bugs and Limitations -* Windows Workstation Client hangs when Smartcard reader detection is enabled and the *Smart Cards for Windows Service* is disabled. +* Windows Workstation Client hangs when smart card reader detection is enabled and the *Smart Cards for Windows Service* is disabled. * The Workstation Client window is not visible when opened on a secondary screen and the secondary screen is no longer available. ## 2.6.0 @@ -110,7 +170,7 @@ The Mendix Workstation Client Sample App showcases how to build applications int The app includes reusable peripheral modules for: -* PC/SC Smartcard Reader (ADPU protocol), for example Omnikey, 5427 G2, ACR122U +* PC/SC smart card Reader (ADPU protocol), for example Omnikey, 5427 G2, ACR122U * Barcode Scanner (configured on Serial Port), for example, NETUM C750 * Industrial Scale (MT-SICS protocol), for example, Mettler Toledo ICS425, OHAUS Scout STX 620, 6200 * Label Printer (ZPL protocol), for example, Zebra ZD421D diff --git a/content/en/docs/support/security-findings-faq.md b/content/en/docs/support/security-findings-faq.md index f19082525aa..184a742797f 100644 --- a/content/en/docs/support/security-findings-faq.md +++ b/content/en/docs/support/security-findings-faq.md @@ -74,9 +74,9 @@ Hiding pages for end-users is not the way to restrict access to data, you should When an XPath query is received by the runtime, the runtime will always apply entity access to the XPath query, based on the access rules connected with the role (or roles) of the end-user making the request. So, although an end-user might be able to change the XPath query before sending it to the runtime, the runtime will still apply access rules, and only return data the end-user is allowed to access. -### HTTP Verb Tampering +### HTTP Message Tampering -The `/xas/` request handler is not a RESTful API, so the conventions that you would usually apply to RESTful APIs, do not apply in this case. The `/xas/` API does not look at the HTTP verb used, this is ignored. Only published REST services make a distinction between HTTP verbs. +The `/xas/` request handler is not a RESTful API, so the conventions that you would usually apply to RESTful APIs, do not apply in this case. The `/xas/` API does not look at the HTTP verb used, this is ignored. If the content of the HTTP message is altered, security restrictions continue to be applied server-side and the end-user will only see data which they have access to. See the example below. ### Example diff --git a/content/en/docs/workstation/_index.md b/content/en/docs/workstation/_index.md index 0a960fe3224..b0c95cba363 100644 --- a/content/en/docs/workstation/_index.md +++ b/content/en/docs/workstation/_index.md @@ -14,9 +14,9 @@ Mendix Workstation Client is [Limited Availability](https://docs.mendix.com/rele ## Introduction -Mendix Workstation Client is designed to help you build smarter, faster, and more operator-friendly applications for shopfloor operators. It enables Mendix cloud applications to directly interact with peripheral devices on a local workstation, without relying on intermediate servers or heavy network traffic. +Mendix Workstation Client is designed to help you build smarter, faster, and more operator-friendly applications for shop floor operators. It enables Mendix cloud applications to directly interact with peripheral devices on a local workstation, without relying on intermediate servers or heavy network traffic. -By connecting applications directly to the PC's local resources, Workstation allows for near real-time communication with devices like printers, barcode scanners, smartcard readers, and industrial scales, all from within a Mendix app. This setup ensures low-latency performance and reduces infrastructure complexity. +By connecting applications directly to the PC's local resources, Workstation allows for near real-time communication with devices like printers, barcode scanners, smart card readers, and industrial scales, all from within a Mendix app. This setup ensures low-latency performance and reduces infrastructure complexity. Workstation is especially valuable in manufacturing and industrial environments where precision, speed, and reliability are key to operator efficiency. @@ -31,7 +31,7 @@ Mendix Workstation Client has the following features: * Interactions with the local PC, such as sending and receiving on-event messages, are handled with Mendix nanoflows. * Supports multiple interfaces: - * PCSC (Smartcard Reader) - APDU protocol + * PCSC (smart card Reader) - APDU protocol * Serial Port (COM Port) RS232 standard * TCP-IP (Ethernet) * Bluetooth LE (BLE) - ATT protocol @@ -53,7 +53,7 @@ Mendix Workstation Client has the following features: Mendix Workstation Client can be used to create apps that handle use cases such as the following: * Printing labels on an industrial thermal label printer (for example, a Zebra printer) -* Badge operators with an NFC smartcard reader and PC/SC specification +* Badge operators with an NFC smart card reader and PC/SC specification * Scanning and parsing barcodes (for example, GS1 specifications) * Weighing materials with an industrial scale (for example, a Mettler Toledo SICS-compatible scale) * Connected smart tools (for example, screwdrivers with torque control) @@ -88,9 +88,9 @@ Used by Mendix developers. The App Connector is a plug-and-play Mendix module th The connector handles the following tasks: -* Retrieving local station configuration (name and device list). -* Connecting and disconnecting devices. -* Exchanging messages with the device. -* Subscribing for triggering app logic on event when receiving messages from the device. +* Retrieving local station configuration (name and device list) +* Connecting and disconnecting devices +* Exchanging messages with devices +* Subscribing for triggering app logic on event when receiving messages from a device ## Read More diff --git a/content/en/docs/workstation/wks-build-app.md b/content/en/docs/workstation/wks-build-app.md index 8a6ba81e4fb..03d4234aa6b 100644 --- a/content/en/docs/workstation/wks-build-app.md +++ b/content/en/docs/workstation/wks-build-app.md @@ -18,47 +18,44 @@ The Workstation Connector establishes connection with the Device through the Wor When a client browser or tab instance tries to connect to a device, previously connected browser or tab instances are disconnected from the device. -The Workstation Connector connects with Workstation Client using a local websocket on port 8094. Communication with each configured device uses another websocket on port 8095 for the first device, 8096 for the second, and so on, so that the range of ports used is port *8094* to *8094+n*, where *n* is the number of devices you have. Make sure that the Runtime or Admin port of your local development server in Studio Pro (**App Settings** > **Configurations** > **Server**) is not configured on a port greater or equal to 8094. +The Workstation Connector connects with Workstation Client using a local WebSocket on port 8094. Communication with each configured device uses another WebSocket on port 8095 for the first device, 8096 for the second, and so on, so that the range of ports used is port *8094* to *8094+n*, where *n* is the number of devices you have. Make sure that the Runtime or Admin port of your local development server in Studio Pro (**App Settings** > **Configurations** > **Server**) is not configured on a port greater or equal to 8094. ## Prerequisites -* Mendix Workstation Client 2.4.0 +* Mendix Workstation Client 3.0.0 * Mendix Studio Pro 9.24.11 or newer ## Installing and Configuring the Workstation Connector To install and configure the Workstation Connector, perform the following steps: -1. Open Mendix Studio Pro and create a new app using a blank or starter template. +1. Open an existing app to extend with Workstation functionality in Mendix Studio Pro, or create a new app. +2. Import the [Mendix Workstation Connector](https://marketplace.mendix.com/link/component/247460) from the Mendix Marketplace. +3. Configure the station in Workstation Management by performing the following steps: - The starter template is suitable for new users who want a good starting point. Alternatively, you can also add the connector to an existing app. - -2. If you did not use the starter template, download the [Mendix Workstation Connector](https://marketplace.mendix.com/link/component/247460). -3. Configure the Station in Workstation Management by performing the following steps: - - 1. Navigate to the **Workspaces** page in the [Workstation Management](https://workstation.home.mendix.com/) (default home page). - 2. Click **Create Workspace** or click on an existing Workspace in the overview. - 4. Click **Create Station**. - 5. Give the station an identifying name, and optionally select or create a group to categorize it, such as *Assembly*. - 6. Add your devices in the **Devices** section. - 7. Register your computer by clicking **Register Computer**. - 8. Click **Download** to navigate to the Workstation Client listing in the marketplace, download the Client installer for Windows, install, and launch it. - 9. Copy and paste the registration token into the [Workstation Client](/mendix-workstation/installation/) registration field. + 1. Navigate to the **Workspaces** page in [Workstation Management](https://workstation.home.mendix.com/). + 2. Click **Create Workspace**, or select an existing workspace from the overview. + 3. Click **Create Station**. + 4. Enter a name for the station and optionally select or create a group to categorize it, such as *Assembly*. + 5. Add devices in the **Devices** section. + 6. Click **Register Computer** to register your computer. + 7. Click **Download** to navigate to the Workstation Client listing in the Marketplace, download the Client installer for Windows, install it, and launch it. + 8. Copy the registration token and paste it into the [Workstation Client](/mendix-workstation/installation/) registration field. 4. Configure your app as an allowed app by performing the following steps: - 1. In your app go to [App Security](https://docs.mendix.com/refguide/app-security/#user-roles) and assign the module role **StationConnector.Administrator** to the Administrator user role. - 2. In your app add the page **StationConnector_Security** to your navigation or link to it from an 'Open page button'. Alternatively, place the snippet **SNIPPET_StationAdminPage** on a page available to the Adminstrator user role. + 1. In your app go to [App Security](/refguide/app-security/#user-roles) and assign the module role **StationConnector.Administrator** to the Administrator user role. + 2. In your app add the page **StationConnector_Security** to your navigation or link to it from an **Open page** button. Alternatively, place the snippet **SNIPPET_StationAdminPage** on a page available to the Adminstrator user role. 3. Run the app. - 4. Login as an Administrator, navigate to the page you added in step 2 and copy the shown public key. - 6. Go back to the [Workstation Management](https://workstation.home.mendix.com/) and navigate to the workspace you created in step 3.2. - 7. Go to the **Apps** page in your workspace and click **Create App**. - 8. Enter your app's URL (for example, `http://localhost:8080`, which is the default when running an app locally) and paste the copied public key into the **Public Key** field. - 9. Perform one of the following actions: + 4. Log in as an Administrator, navigate to the page you added in step 2 and copy the shown public key. + 5. Go back to the [Workstation Management](https://workstation.home.mendix.com/) and navigate to the workspace you created in step 3.2. + 6. Go to the **Apps** page in your workspace and click **Create App**. + 7. Enter your app's URL (for example, `http://localhost:8080`, which is the default when running an app locally) and paste the copied public key into the **Public Key** field. + 8. Perform one of the following actions: * To enable the app for all stations, select **Enable in all stations** * To enable it for a specific station, go to **Stations** and navigate to your station. You will find the created app under the **Apps** section. Here you can enable the application just for this station by pressing the toggle. - 10. Refresh the Workstation Client. - 11. Optional: To recreate the key pair, additionally assign the module role **StationConnector.SecurityAdministrator** to your Administrator role. This adds a **Regenerate KeyPair** button to the **StationConnector_Security** page. Be mindful when using this button in a production scenario to avoid the need to reconfigure the app in the Management, and refresh all Workstation Clients. + 9. Refresh the Workstation Client. + 10. Optional: To recreate the key pair, additionally assign the module role **StationConnector.SecurityAdministrator** to your Administrator role. This adds a **Regenerate KeyPair** button to the **StationConnector_Security** page. Use caution when using this button in a production scenario to avoid the need to reconfigure the app in the Management, and refresh all Workstation Clients. ## Managing Apps @@ -66,15 +63,11 @@ The app that you created in the previous section is available on the **Apps** pa ## Managing Users -To invite users to your Workstation, click **Team** in the left navigation menu, and then click **Invite Team Member**. You can grant your users one of the following predefined roles: +You can invite other Workstation Management users to your workspace to share configurations and collaborate. This feature requires a Workstation license. -* Owner - The owner has full rights to manage the workspace. They can read and edit configurations, invite members, manage security, register computers, and manage workspace settings. They can also delete a workspace or give it to a new owner. -* Workspace admin - The workspace admin can manage the workspace in the same way as the owner, but they cannot delete workspaces or change their ownership. -* Station admin - Station admins can view and edit station configuration. They can also register computers to the workstation. They cannot manage any other settings. -* Computer admin - Computer admins can view the configuration without editing it. They can also register new computers. -* View only - This role grants access to viewing the configuration. +To invite a user, click **Team** in the left navigation menu, then click **Invite Team Member**. Enter the user's email address and select a role. For more information about the available roles, see [Workspace Team and Collaboration](/mendix-workstation/installation/#collaboration). -To change a user's role, or remove them from the workspace, click the three dot icon in the right column of the user list (prerequisite: Owner or Workspace admin role). +To change a user's role or remove them from the workspace, click the three-dot icon in the right column of the user list. This action requires the Owner or Workspace Admin role. ## Getting Started with Custom Logic for Device Interaction @@ -82,8 +75,8 @@ Now that you are ready to start using Mendix Workstation Client, you can impleme * **GetStation** - Retrieves the computer information connected to the Client. * **SendMessage** - Sends data or commands to the connected device. For more information about the supported message syntax, see [Message Syntax for File, Smart Card, and Bluetooth Devices](/mendix-workstation/device-syntax/). -* **SubscribeToMessages** - Subscribe a nanoflow to be called when the device is sending a message. -* **SubscribeToErrors** - Subscribe a nanoflow to be called on device connection errors. +* **SubscribeToMessages** - Subscribes to device messages and triggers a nanoflow when messages are received. +* **SubscribeToErrors** - Subscribes to device connection errors and triggers a nanoflow when errors occur. * **Unsubscribe** - End the subscription to device messages or errors. * **UnsubscribeByContext** - End all subscriptions related to a context object. * **UnsubscribeByDevice** - End all subscriptions related to a specific device. @@ -105,7 +98,7 @@ The following section provides more information about using the nanoflows and Ja #### GetStation -Call `GetStation` to retrieve configuration of the current Client computer. `GetStation` can be used multiple times, but it queries the Workstation Client only the first time. The following calls return the current object loaded in the session. If connection with Workstation Client does not work, `GetStation` returns an empty object. +Call `GetStation` to retrieve configuration of the current Client computer by using the Workstation Client. `GetStation` can be used multiple times, but it queries the Workstation Client only the first time. The following calls return the current object loaded in the session. If connection with Workstation Client does not work, `GetStation` returns an empty object. #### SendMessage @@ -113,7 +106,7 @@ Call `SendMessage` to send a message to a device. `SendMessage` includes the opt #### SubscribeToMessages -Call `SubscribeToMessages` to trigger a nanoflow when a message is received from a device. `SubscribeToMessages` includes the option to configure a context object to be passed to the callback nanoflow each time a message is received. +Call `SubscribeToMessages` to trigger a nanoflow when a message is received from a device. `SubscribeToMessages` provides an option to specify a context object that will be passed to the callback nanoflow whenever a message is received. The callback nanoflow must have the following parameters: @@ -140,31 +133,6 @@ Call `Unsubscribe` to end a subscription. Call `UnsubscribeByContext` to end all subscriptions related to a context object. -## Creating a File Device in Workstation Management - -### Allowed Folder Configuration - -The *Allowed Folder* feature supports flexible path configuration through environment variables, providing cross-platform compatibility for both Windows and Unix-based systems. This functionality allows administrators to define the allowed folder where the Workstation Client is allowed to perform actions. - -#### Environment Variable Support - -The system accepts environment variables in the allowed folder configuration within the Workstation Management interface. Notably, both Windows and Unix syntax formats are supported on all platforms, meaning you can use Windows-style environment variables on Unix systems and vice versa. - -#### Supported Path Formats - -Windows and Unix style paths can be used independently from the operating system the Workstation Client is running on. The following examples demonstrate the various syntax options available: - -##### Basic Examples - -* **Windows-style with backslash**: `%AppData%\test` -* **Windows-style with forward slash**: `%AppData%/test` -* **Unix-style with backslash**: `$EnvVar\test` -* **Unix-style with forward slash**: `$EnvVar/test` - -#### Allowed Actions - -The administrator can choose to allow either one or a combination of the following permissions: subscribe to change events, read files and write files. - ## Error Logs Logs for the Workstation Management, Client, and Connector are available in case of issues. For more information about accessing the logs, see [Troubleshooting Mendix Workstation Client](/mendix-workstation/troubleshooting/). diff --git a/content/en/docs/workstation/wks-installation.md b/content/en/docs/workstation/wks-installation.md index 030a0033228..82ee79c2f77 100644 --- a/content/en/docs/workstation/wks-installation.md +++ b/content/en/docs/workstation/wks-installation.md @@ -2,23 +2,26 @@ title: "Installing and Configuring Mendix Workstation Client" linktitle: "Installation and Configuration" url: /mendix-workstation/installation/ -description: "Documents the installation process for Mendix Workstation Client." +description: "Quick start and advanced guide for installing and configuring the Mendix Workstation Client, including setting up workspaces, stations, and devices for initial testing from the Workstation Management." weight: 20 --- ## Introduction -This document provides a quick start guide for installing Mendix Workstation Client, and then configuring its basic settings. Mendix Workstation Client is available for the following operating systems: +This document outlines the installation and basic configuration of the Mendix Workstation Client. It provides a quick-start guide for initial setup, followed by detailed instructions on advanced configurations for workspaces and stations. -* [Microsoft Windows (global installer)](https://marketplace.mendix.com/link/component/247448) -* [Microsoft Windows (portable)](https://marketplace.mendix.com/link/component/247456) -* [Linux ARM 64](https://marketplace.mendix.com/link/component/247459) +## Quick Start Guide -To configure Mendix Workstation Client, perform the following steps: +This guide helps you configure and test a minimum working version of the Mendix Workstation Client. By following these steps, you will complete the following: + +* Create a basic configuration within Workstation Management. +* Set up a pair of virtual TCP/IP Client and Server devices for testing. +* Install the Workstation Client on your computer. +* Verify the connection between your virtual devices directly from Workstation Management. ### Creating a Workspace and Station -A *station* represents a workstation on the shopfloor. It can connect to one or more apps or devices. A *workspace* is a grouping of one or more stations. For example, a workspace may group together all the stations which belong to the same factory or factory line. +A *station* represents a workstation on the shop floor. It can connect to one or more apps or devices. A *workspace* is a grouping of one or more stations. For example, a workspace may group together all the stations which belong to the same factory or factory line. 1. Go to [Mendix Workstation Management](https://workstation.home.mendix.com/) and sign in with your Mendix account. 2. In **Workspace Overview**, click **Create Workspace**. @@ -29,27 +32,29 @@ A *station* represents a workstation on the shopfloor. It can connect to one or {{< figure src="/attachments/workstation/wks-install2.png" class="no-border" >}} -3. After the workspace is created, in the **Stations** page, click **Create a New Station**. +4. After the workspace is created, in the **Stations** page, click **Create a New Station**. {{< figure src="/attachments/workstation/wks-install3.png" class="no-border" >}} -4. Enter a name for the station, and then click **Create Station**. +5. Enter a name for the station, and then click **Create Station**. {{< figure src="/attachments/workstation/wks-install4.png" class="no-border" >}} -5. Optional: If you do not want Workstation Management to detect smart card readers, in **Station** view, set the **Detect Card Readers** toggle to **Off**. +6. Optional: If you do not want Workstation Management to detect smart card readers, in **Station** view, set the **Detect Card Readers** toggle to **Off**. {{< figure src="/attachments/workstation/wks-install16.png" class="no-border" >}} -## Downloading and Running the Workstation Client +### Downloading and Running the Workstation Client The Workstation Client is a connector between the devices and your local PC. You can download and enable the client by performing the following steps: -1. Open a station and click **Register Computer**. +1. Open the station that you created, and click **Register Computer**. {{< figure src="/attachments/workstation/wks-install5.png" class="no-border" >}} -2. In the **Computer Registration** dialog, click **Download**. The [Workstation Client](https://marketplace.mendix.com/link/component/247448) page on the Mendix Marketplace opens for the Windows installer. Alternatively, you can find the component on the Mendix Marketplace by searching for "Workstation Client". You can also find the [portable](https://marketplace.mendix.com/link/component/247456) and [Linux](https://marketplace.mendix.com/link/component/247459) version by using the search, or navigate to them through the above links. +2. In the **Computer Registration** dialog, click **Download**. + + This will open the Mendix Marketplace page for the [Workstation Client Windows Installer](https://marketplace.mendix.com/link/component/247448). Alternatively, you can find the component on the Mendix Marketplace by searching for "Workstation Client". You can also find the [portable](https://marketplace.mendix.com/link/component/247456) and [Linux](https://marketplace.mendix.com/link/component/247459) version by using the search, or navigate to them through the above links. {{< figure src="/attachments/workstation/wks-install6.png" class="no-border" >}} @@ -57,23 +62,23 @@ The Workstation Client is a connector between the devices and your local PC. You * For Windows: - * If you have administrator rights for your computer, click **Download** and run the Workstation Client installer in the form of an NSIS installer package. If you get a prompt from Windows Access Control, click **Yes** to allow Workstation Client to be installed; for a silent installation, you can also run the installer as an administrator with the `/S` argument, that is, `MendixWorkstationX.Y.Z.exe /S`. The default installation folder is *C:\Program Files\Mendix Workstation*. The app data folder can be found at *C:\ProgramData\Mendix Workstation*. The client runs automatically after the installation is completed. - * If you do not have administrator rights for your computer, download the [Workstation Client Portable](https://marketplace.mendix.com/link/component/247456) instead. As a best practice, put the portable client in a new folder in your Documents folders, and then click the .exe file to run the client. + * If you have administrator rights for your computer, click **Download** and run the Workstation Client installer in the form of an NSIS installer package. If you get a prompt from Windows User Account Control, click **Yes** to allow Workstation Client to be installed; for a silent installation, you can also run the installer as an administrator with the `/S` argument, that is, `MendixWorkstationX.Y.Z.exe /S`. The default installation folder is *C:\Program Files\Mendix Workstation*. The app data folder can be found at *C:\ProgramData\Mendix Workstation*. The client runs automatically after the installation is completed. + * If you do not have administrator rights for your computer, download the [Workstation Client Portable](https://marketplace.mendix.com/link/component/247456) instead. As a best practice, put the portable client in a new folder (for example, in your Documents folder), and then click the .exe file to run the client. * For Linux: * Download the [Linux](https://marketplace.mendix.com/link/component/247459) version of the Client - * Install: `sudo apt install ./workstation_X.X.X_arm64.deb` + * Run the following command to install: `sudo apt install ./MendixWorkstation_X.X.X.X_arm64.deb` (replace *X.X.X.X* with the actual version and build number of the downloaded .deb package) * Install card reader dependencies: `sudo apt install pcscd libcap2-bin` * Enable card reader dependencies: `sudo systemctl enable pcscd --now` - * Start the application from the applications menu > Accessories > Mendix Workstation - * Bluetooth support requires starting the application with `CAP_NET_RAW` privilege: `sudo capsh --user=$(whoami) --iab="^cap_net_raw" -- -c "'/opt/Mendix Workstation/Mendix Workstation'"` + * Start the application from the applications menu > **Accessories > Mendix Workstation** + * Bluetooth support requires starting the application with `CAP_NET_RAW` privilege (for raw network packet access): `sudo capsh --user=$(whoami) --iab="^cap_net_raw" -- -c "'/opt/Mendix Workstation/Mendix Workstation'"` -## Registering your Computer +### Registering your Computer With the Workstation Client running on your computer, you must now register your computer in the Workstation Management. 1. Go to [Mendix Workstation Management](https://workstation.home.mendix.com/) and navigate to the **Station Overview** in the workspace which contains the station that you want to register to your computer. -2. Click the menu in the overview and select **Register computer**. +2. Click the menu associated with your station in the overview, and then select **Register computer**. 3. Click **Copy** to copy the registration token to your clipboard. {{< figure src="/attachments/workstation/wks-install7.png" class="no-border" >}} @@ -91,11 +96,11 @@ The **Stations** page now shows your station's status as **Computer Registered** {{< figure src="/attachments/workstation/wks-install10.png" class="no-border" >}} -## Configuring and Testing Virtual Devices +### Configuring and Testing Virtual Devices After registering your computer, test your connectivity by creating a pair of virtual devices: a TCP/IP server that will emulate a device, and a TCP/IP client that will connect to the emulated device. -### Creating a TCP/IP Server +#### Creating a TCP/IP Server 1. Go to [Mendix Workstation Management](https://workstation.home.mendix.com/). 2. In the **Station** page, click **Add Device**. @@ -111,7 +116,7 @@ The emulated device, a local TCP/IP server listening on port 1705, is added to t {{< figure src="/attachments/workstation/wks-install13.png" class="no-border" >}} -### Creating a TCP/IP Client +#### Creating a TCP/IP Client 1. Go to [Mendix Workstation Management](https://workstation.home.mendix.com/). 2. In the **Station** page, click **Add Device**. @@ -126,14 +131,14 @@ The emulated device, a local TCP/IP server listening on port 1705, is added to t The device, which will be used to connect to the TCP/IP server running in Workstation Client, is added to the **Devices** list in the **Station** page. -### Testing the Devices +#### Testing the Devices After configuring the server and client pair, test their connectivity by performing the following steps: 1. In the left navigation menu of the current workspace, click **Settings**, and ensure that the **Enable Local Device Testing** toggle is set to **On**. 2. In the left navigation menu, click **Test Your Station**. - The page refreshes and displays a list of all your devices. If you do not want the list to show any smart card readers available on your computer, make sure to set the **Detect Card Readers** toggle to **Off**. + The page refreshes and displays a list of all your devices. This includes detected smart card readers available on your computer if you did not disable detecting card readers as described [in step 6](/mendix-workstation/installation/#creating-a-workspace-and-station). 3. In your web browser, duplicate the tab where you have opened the **Test Your Station** page. 4. Arrange the two opened tabs so that you can view the two **Test Your Station** pages side by side. @@ -146,6 +151,110 @@ After configuring the server and client pair, test their connectivity by perform Different device types have different requirements for the message syntax. For more information, see [Message Syntax for File, Smart Card, and Bluetooth Devices](/mendix-workstation/device-syntax/). {{% /alert %}} -## Quitting the Workstation Client +### Quitting the Workstation Client + +The **Close** button closes the Client window but does not terminate the application; it continues to run in the background. To completely quit the Client, right-click its icon in the Windows systray and select **Quit**. This action is only available if [Developer Mode](#developer-mode) is enabled. Alternatively, the Workstation Client process can always be stopped via Windows Task Manager. + +## Advanced Configurations + +### Workspace Apps + +It is crucial to configure the Mendix apps that are allowed to connect to the Workstation Client via the Workstation Connector. To do so, apps are managed on a workspace level and can be enabled or disabled for all stations in workspace, by station station groups, or individually per station. + +### Workspace Settings + +Navigate to the **Settings** page in a workspace to configure settings that are applied to all stations in that workspace. + +#### Log Settings + +The Workstation Client always stores logs to the file system it is installed on (c.f. [Troubleshooting - Workstation Client](/mendix-workstation/troubleshooting/#workstation-client)). No logs are send to the Workstation Management. However, you can configure the log level and retention policy of all the Workstation Clients that are registered to stations in the workspace. + +##### Log Level + +Configure the log level of the logs stored by the Workstation Client(s). + +* Info (default) - Logs normal operation and key application events. For example, the time when the Client was launched or terminated. +* Warn - Info logs and potential issues or suboptimal conditions. For example, if a request to refresh the Client's configuration timed out. +* Error - Warning logs and visible problem, something is not working as expected. For example, if a port to connect to a device is already in use. +* Debug - Error logs and detailed internal state for developer diagnostics. For example, requests to the Workstation Management, communication with devices. + +#### Retention Policy + +Verbosity and thus log file size increases with each log level. To constrain this, the logs are limited to 10 MB in size and stored for 7 days by default. + +Modify these settings to the needs of your logging policy, especially if you require to keep debug level logs in production for retrospective troubleshooting. + +#### Local Device Testing + +By default, the Workstation Management is pre-configured as an allowed app to connect to the Workstation Client on the **Test your Station** page in a workspace. To disable this, navigate to the tab "Local Device Testing" on the **Settings** page and toggle it off. + +### Workspace Team and Collaboration {#collaboration} + +Note: Collaborating with other users in a workspace requires a Workstation license. + +Invite and manage members of a Workspace on the Team page. Only users who have signed into Workstation Management can be invited via email. One of the following roles can be assigned: + +* Owner - The owner has full rights to manage the workspace. They can read and edit configurations, manage the team, register computers, and manage workspace settings. They can also delete a workspace or transfer ownership to a new owner. By default, the user who created a workspace is assigned the owner role. Contact Mendix Support if a Workspace owner has left the company to transfer the ownership. +* Workspace admin - The workspace admin can manage the workspace in the same way as the owner, but they cannot delete the workspace or change its ownership. +* Station admin - Station admins can view and edit station configurations. They can also register computers to stations. They cannot manage any other settings. +* Computer admin - Computer admins can view configurations without editing them. They can also register computers to stations. +* View only - This role grants access to viewing the configuration but cannot perform any actions. + +All members except for the Workspace owner can leave a workspace. + +### Advanced Station Settings + +#### Station Developer Mode {#developer-mode} + +Developer mode can be configured on a **Station** page by toggling **Enable Developer Mode**. + +*Developer Mode* is enabled by default for each station. This allows users of the Workstation Client to +* quit the program from the start menu, +* unlink the Workstation Client so that it can be registered to another station, +* gives access to debug level live logs displayed in the **Logs** pane of the Workstation Client even if the workspace's log level is set to a different level, +* give access to developer tools (available by pressing *Ctrl + Shift + I*). + +For production environments, it is recommended to disable *Developer Mode* to prevent Workstation operators from accidentally quitting or unlinking the Workstation Client. + +#### Device Settings + +##### Card Readers + +Card reader devices cannot be configured as separate devices in the **Devices** overview of a **Station** page. Instead, they are automatically detected by the Workstation Client and added to the device list of the Client. + +Auto detecting card readers is enabled by default. This setting can be configured on a **Station** page by toggling **Detect Card Readers**. + +Refer to [Message Syntax - Card Readers](/mendix-workstation/device-syntax/#card-readers) for a more in-depth explaination how to communicate with card readers. + +##### File Device + +This section explains the configuration of a file device. Refer to [Message Syntax - File Device](/mendix-workstation/device-syntax/#file-device) for a more in-depth explaination how to communicate with file devices. + +###### Allowed Folder Configuration + +The *Allowed Folder* feature supports flexible path configuration through environment variables, providing cross-platform compatibility for both Windows and Unix-based systems. This functionality allows administrators to define the allowed folder where the Workstation Client can perform actions. + +###### Environment Variable Support + +The system accepts environment variables in the allowed folder configuration within the Workstation Management interface. Both Windows and Unix syntax formats are supported on all platforms, meaning you can use Windows-style environment variables on Unix systems and vice versa. + +###### Supported Path Formats + +Windows and Unix-style paths can be used independently of the operating system the Workstation Client is running on. The following examples demonstrate the various syntax options available: + +###### Basic Examples + +* **Windows-style with backslash**: `%AppData%\test` +* **Windows-style with forward slash**: `%AppData%/test` +* **Unix-style with backslash**: `$EnvVar\test` +* **Unix-style with forward slash**: `$EnvVar/test` + +###### Allowed Actions + +The administrator can choose to allow either one or a combination of the following permissions: subscribe to change events, read files, and write files. + +##### Bluetooth Devices + +Simply add Bluetooth LE (BLE) devices that use the ATT protocol by entering the exact device name as displayed in your OS' device manager -The **Close** button closes the Client but does not stop it. The Client continues to run in the background. To quit the Client, right-click on its icon in the Windows systray, and then click **Quit**. +Refer to [Message Syntax - Bluetooth](/mendix-workstation/device-syntax/#bluetooth) for a more in-depth explaination how to communicate with bluetooth devices. diff --git a/content/en/docs/workstation/wks-message-syntax.md b/content/en/docs/workstation/wks-message-syntax.md index 39e0b2d7094..c24d5bb0a0c 100644 --- a/content/en/docs/workstation/wks-message-syntax.md +++ b/content/en/docs/workstation/wks-message-syntax.md @@ -10,7 +10,7 @@ weight: 40 To enable Mendix Workstation Client to communicate with your devices, you must ensure that the messages you send have the correct syntax. This syntax varies depending on the type of device. The following sections show the required syntax for file system, smart card, and Bluetooth devices. -## Bluetooth +## Bluetooth {#bluetooth} This device type requires the following message and response: @@ -25,7 +25,7 @@ This device type requires the following message and response: * `CharacteristicUUID#Response` -## File System +## File Device {#file-device} This device type requires the following message and response:   @@ -59,18 +59,18 @@ The section below shows a sample test that you can run to verify the configurati 5. In your Workspace, navigate to **Test Your Station** and click on the configured file device. 6. Enter `3#test.txt#Hello from Mendix` in the **Send Message** field, and then press **Send Message**. - The test should show a response like `S#3#C:\MyTestFolder\test.txt` to indicate that the text file *test.txt* was succesfully written to *MyTestFolder*. + The test should show a response like `S#3#C:\MyTestFolder\test.txt` to indicate that the text file *test.txt* was successfully written to *MyTestFolder*. 7. Go to *C:\MyTestFolder* and verify that it contains the text file. 8. Open the test file and verify that it contains the text *Hello from Mendix*. -## Smart Cards +## Card Readers {#card-readers} This device type requires the following message and response: ### Message -Send instruction in hexadecimal as a string, for example, *FFCA000000*. The messages exchanged with the smart card are APDU messages. For more information, refer to the documentation of the APDU command for your smart card reader. +Send instruction in hexadecimal as a string, for example, *FFCA000000* to read the smart card ID. The messages exchanged with the smart card are APDU messages. For more information, refer to the documentation of the APDU command for your smart card reader. ### Response diff --git a/content/en/docs/workstation/wks-prerequisites.md b/content/en/docs/workstation/wks-prerequisites.md index 40220663c29..56f2e53e158 100644 --- a/content/en/docs/workstation/wks-prerequisites.md +++ b/content/en/docs/workstation/wks-prerequisites.md @@ -10,6 +10,14 @@ weight: 10 This document presents the system requirements for Mendix Workstation Client. +## Workstation Client Download Links + +Mendix Workstation Client can be downloaded from the Mendix Marketplace: + +* [Microsoft Windows (global installer)](https://marketplace.mendix.com/link/component/247448) +* [Microsoft Windows (portable)](https://marketplace.mendix.com/link/component/247456) +* [Linux ARM 64](https://marketplace.mendix.com/link/component/247459) + ## System Requirements * Operating System - Windows 10 or Windows 11 (64-bit); Linux ARM64 @@ -19,7 +27,7 @@ This document presents the system requirements for Mendix Workstation Client. ## Access Requirements * A Mendix account -* Access to the Mendix Workstation Management for configuration +* Access to Mendix Workstation Management for configuration ## Network Configuration @@ -29,6 +37,16 @@ Before implementing Mendix Workstation Client, perform the following steps: 2. Open the required ports for communication (for example, TCP 443 for HTTPS). 3. Add the Workstation Client to the Allow list for any firewall or antivirus software, if applicable. +### Custom Certificates and Proxy Settings + +The Workstation Client uses the operating system's certificates and proxy environment variables to establish a connection with Workstation Management. In most controlled corporate environments, these settings are preconfigured on employee computers by IT departments. + +To use a custom proxy configuration, you must start the Workstation Client from the command line and set the environment variables as described [here](https://github.com/nodejs/undici/blob/main/docs/docs/api/EnvHttpProxyAgent.md#class-envhttpproxyagent). For example, from the Windows Command Prompt, run the following command: + +``` +set HTTPS_PROXY=[PROXY_IP_ADDRESS] && "C:\Program Files\Mendix Workstation\Mendix Workstation.exe" +``` + ## Device Connectivity Before connecting devices with Mendix Workstation Client perform the following steps: diff --git a/content/en/docs/workstation/wks-security.md b/content/en/docs/workstation/wks-security.md index ed0d93ce58f..7f263a67b79 100644 --- a/content/en/docs/workstation/wks-security.md +++ b/content/en/docs/workstation/wks-security.md @@ -10,7 +10,7 @@ weight: 15 Security is one of the most important aspects of a deployment, because misconfiguration or failing security can have large consequences. The Mendix Workstation Client gives many configuration options for permissions that can have an impact on the security of your deployment. -This document describes the common aspects you should consider when deploying the Mendix Workstation Client in production. +This document describes the security aspects you should consider when deploying the Mendix Workstation Client in production. ## Assignment of Workspace Roles {#workspace-roles} @@ -22,13 +22,13 @@ Workspace roles should be assigned following the principle of least privilege. A * Workspace Admins can allow Workstation Clients to access malicious apps. * Conduct regular permissions audits to make sure that temporary privilege elevations are reverted once they are no longer necessary. -## Station Set Up {#setup-stations} +## Station Setup {#setup-stations} Setting up stations involves a variety of options, some of which have important security implications. To help ensure a secure deployment, follow these best practices: * Keep stations lean by disabling unused apps and deleting unused devices. * Any unused device represents a potential attack surface (for example, a forgotten card reader that leaks a token, or a TCP device that exposes a device on the network). - * Any unused but enabled app may gain unintended access to devices that were not meant to be exposed to it. + * Any enabled but unused app may gain unintended access to devices that were not meant to be exposed to it. * Verify that all devices configured on a station are safe for all enabled applications. * Devices are shared across all applications in a station. If a device should not be accessible by a particular app, it should not be present on that station. * Configure File devices carefully. diff --git a/content/en/docs/workstation/wks-troubleshooting.md b/content/en/docs/workstation/wks-troubleshooting.md index 54d59587f5f..70313ed609c 100644 --- a/content/en/docs/workstation/wks-troubleshooting.md +++ b/content/en/docs/workstation/wks-troubleshooting.md @@ -22,19 +22,24 @@ Manually unregister the station in Workstation Management. ### Workspace Owner Account Deactivated -The Workspace's owner account has been deactivated and the owner did not transfer the ownership to another Workspace member. +The Workspace's owner account has been deactivated, and the owner did not transfer the ownership to another Workspace member. -#### Solution - -Raise a ticket to support to transfer Workspace ownership. +Contact Mendix Support to transfer workspace ownership. ## Workstation Client -The Client retains logs for the last eight days. You can access the logs by clicking the **Logs** button on the Client UI, and then optionally selecting the level of logs that you want to see. Opening the client's console through the browser developer tools (**Ctrl + Shift + I**) can also provide additional information about encountered errors in the UI of the Client. +By default, the Client retains logs of up to 10 MB for the past seven days locally on your computer. Access logs by clicking the **Logs** button on the Client UI, then optionally selecting the level of logs you want to see. Opening the Client's console through the browser developer tools (**Ctrl + Shift + I**) can also provide additional information about encountered errors in the UI of the Client. + +Log files are also available by day in the Client's app data folder. On Windows, press **Win + R** and enter: + +* If you installed the Client using the installer for all users: `%ProgramData%\Mendix Workstation\logs` +* If you are using the portable version: `%AppData%\Mendix Workstation\logs` -You can also find log files by day in the Client's app data folder. To do so on Windows, press **Win + R**. If you installed the Client using the installer for all users, enter `%ProgramData%\Mendix Workstation\logs`. If you are using the portable version, enter `%AppData%\Mendix Workstation\logs`. On Linux the Mendix *Workstation/logs* folder is either located at `$XDG_CONFIG_HOME` or `~/.config`. +On Linux, the *Mendix Workstation/logs* folder is located at either `$XDG_CONFIG_HOME` or `~/.config`. -Alternatively, you can start the Workstation Client from Powershell to view logs: `start "C:\Program Files\Mendix Workstation\Mendix Workstation.exe" -ArgumentList "--log-level=debug" -wait`. +**Live logs** are available in two ways: +* Start the Workstation Client. Click the three-dot icon in the top tight, then click **Logs**. Debug level logs are only available in *Developer Mode* +* Start the Workstation Client from PowerShell: `start "C:\Program Files\Mendix Workstation\Mendix Workstation.exe" -ArgumentList "--log-level=debug" -wait`. ### Registration Token Could Not Be Parsed @@ -46,7 +51,7 @@ You entered a registration token with an invalid format. #### Solution -Ensure that you copied and pasted the token as displayed by the management and that you did not enter additional characters by accident. Create a new registration token if the issue persists. +Ensure you copied and pasted the token exactly as displayed in Workstation Management without any additional characters. Create a new registration token if the issue persists. ### Registration Token Denied by Workstation Management @@ -54,11 +59,15 @@ The Client shows an error like the following: *Register token denied by Workstat #### Cause -The registration token is no longer valid because it has either expired after one hour, the token was recreated in the Management application (using the **Refresh** button or reopening the registration window) or the token has already been used by another Workstation Client. +The registration token is no longer valid. This can occur if: + +* The token expired after one hour +* The token was recreated in Workstation Management (using the **Refresh** button or reopening the registration window) +* The token has already been used by another Workstation Client #### Solution -If the status of the Station displayed in the Management is still *No computer registered*, regenerate the token and try again. Otherwise, check if the correct computer and Client is registered to that station and unregister it if not. +If the station status in Workstation Management is still *No computer registered*, regenerate the token and try again. Otherwise, verify the correct computer and Client are registered to that station and unregister if not. ### Access Denied by Workstation Management @@ -66,29 +75,65 @@ The Client shows an error like the following: *Station could not be synchronized #### Cause -This error occurs if the credentials provided by the Workstation Client are no longer valid, for example, if it got deregistered in the Management or if the APIKey is expired. +This error occurs when the credentials provided by the Workstation Client are no longer valid, such as when it was deregistered in Workstation Management or the API key has expired. #### Solution -You can continue using the Workstation Client with the current configuration, but it will no longer receive updates. To fix this, press **Unlink** in the Workstation Client and then re-register the workstation. +You can continue using the Workstation Client with the current configuration, but it will no longer receive updates. To resolve this, click **Unlink** in the Workstation Client, then re-register the workstation. + +### HTTPError: Request failed with status code 503 Service Temporarily Unavailable + +The Client shows an error like the following: *Station could not be synchronized with Management. Error invoking remote method 'refresh-station-config': HTTPError: Request failed with status code 503 Service Temporarily Unavailable: GET.* + +#### Cause + +Workstation Management is temporarily offline, most likely due to maintenance. + +#### Solution + +Check out the [Mendix Status Page](https://status.mendix.com/) to see if there is a scheduled maintenance for the Workstation Management. If there is no maintenance message and the issue persists after a few minutes, report an incident via the status page. + +### TimeoutError: Request timed out + +The Client shows an error like the following: *Station could not be synchronized with Management. Error invoking remote method 'refresh-station-config': TimeoutError: Request timed out: GET [yourStationURL]* + +#### Cause + +The Client request to Workstation Management is not forwarded to the Workstation Management server and times out. This issue may occur if your network traffic is routed through a proxy server, as is common in protected corporate IT environments, and the proxy server is offline. + +#### Solution + +Verify whether your computer's network traffic is routed through a proxy server and configure your proxy settings accordingly. See [Network Configuration](/mendix-workstation/prerequisites/#network-configuration). + +### Workstation Management URL cannot be resolved + +The Client shows an error like the following: *Station could not be synchronized with Management. Error invoking remote method 'refresh-station-config': Error: Workstation Management URL cannot be resolved. This might be an DNS issue or the host is offline.* + +#### Cause + +The Client cannot resolve the URL to Workstation Management. This can have several causes, most commonly when the machine running the Workstation Client has no internet connection. + +#### Solution + +First, verify you have a working internet connection. Then verify you can access [Workstation Management](https://workstation.home.mendix.com/) from your browser. If your browser cannot resolve that address, there may be an issue with your DNS server or configuration. On Windows, verify your DNS settings for your Ethernet or wireless LAN adapter using the command prompt and entering `ipconfig`. The command `nslookup www.mendix.com` provides further information about the IP address your DNS server resolved for the Mendix domain. ## Workstation Connector -Logs for the Connector can be found in Studio Pro's console during local development or within the environment logs of your running environment. Since the Connector performs most operations client-sided in nanoflows, you can also inspect the local logs that can be found in the browser console. +Connector logs are available in Studio Pro's console during local development or in the environment logs of your running environment. Since the Connector performs most operations client-side in nanoflows, you can also inspect local logs in the browser console. ### Workstation Client Did Not Respond Within 3 Seconds. Connection Failed. -If the **StationConnector.GetStation** nanoflow fails to connect to your Workstation Client, this error log message is visible in the browser console and in the Studio Pro's Console on the **Client_Nanoflow** log node. +If the **StationConnector.GetStation** nanoflow fails to connect to the Workstation Client, this error appears in the browser console and in Studio Pro's Console on the **Client_Nanoflow** log node. #### Cause -The connection between the Client and the Connector cannot be established either because the Workstation Client cannot be found on the local computer or the current application is not allowed to establish a connection. +The connection between the Client and Connector cannot be established. This occurs either because the Workstation Client cannot be found on the local computer, or because the current application is not allowed to establish a connection. #### Solution -* Verify that the Workstation Client is running and registered on the same computer as the browser that is trying to establish a connection via the StationConnector. -* Verify that the Client is registered in the correct Workspace by comparing the Workspace name and ID displayed in the Client UI with the Workspace in the Management. -* Verify that the application that is attempting a connection is properly configured as an allowed app in the Workspace and on the Station. To do so check that your application, for example, running on `http://localhost:8080`, is added in the **Apps** section of your Workspace. If the app is added, check that the public key of the configured workspace app is up to date with the public key displayed in your app that is using the connector. If not, update the public key value of the workspace app with the latest value displayed in the app. Next, check that the app is also enabled as an allowed app in the Station configuration by going to the respective Station detail page in that workspace. Always press the **Refresh** button in the Workstation Client after applying any changes in the Management. +* Verify the Workstation Client is running and registered on the same computer as the browser attempting to connect via the StationConnector. +* Verify the Client is registered in the correct workspace by comparing the workspace name and ID displayed in the Client UI with the workspace in Workstation Management. +* Verify the application attempting to connect is properly configured as an allowed app in the workspace and on the station. To do so, check that your application (such as `http://localhost:8080`) is added in the **Apps** section of your workspace. If the app is added, verify the public key of the configured workspace app matches the public key displayed in your app using the Connector. If not, update the public key value of the workspace app with the latest value displayed in the app. Next, verify the app is also enabled as an allowed app in the station configuration by navigating to the respective station detail page in that workspace. Always click the **Refresh** button in the Workstation Client after applying any changes in Workstation Management. ### The Client Requested a Session for a Time That Is Ahead of the Server @@ -96,20 +141,20 @@ This is a warning log for the Mendix runtime on the **StationConnector - GetWebs #### Cause -For security reasons, the Connector only allows the time of the computer running the Workstation Client to be 24 hours behind the Mendix runtime server that hosts the app before establishing a session. +For security reasons, the Connector only allows establishing a session when the computer running the Workstation Client has a time within 24 hours of the Mendix runtime server hosting the app. #### Solution -Change the time of the computer running the Workstation Client to be within 24 hours of the Mendix runtime server. If that is not an option, you can customize this yourself in the **StationConnector.GetWebsocketsSession** microflow, but must maintain this setting after updating the module to a newer version. +Set the time on the computer running the Workstation Client to within 24 hours of the Mendix runtime server. If this is not possible, you can customize this behavior in the **StationConnector.GetWebsocketsSession** microflow, but you must maintain this customization when updating the module to a newer version. ### Context Entity Is Not Updated After Sending a Message -The Context Entity on your page is not getting updated after sending a message. More specifically, modifying a context entity shortly after sending a message for the first time does not always work. +The context entity on your page is not updated after sending a message. Specifically, modifying a context entity shortly after sending a message for the first time does not always work. #### Cause -Sending a message for the first time sets the Connected state to true and triggers a commit on the device. This in turn refreshes the device and all data sources that are nested within a device data source. Some of these data sources may create a new blank entity instead of showing the updated entity. +Sending a message for the first time sets the **Connected** state to **true** and triggers a commit on the device. This refreshes the device and all data sources nested within a device data source. Some of these data sources may create a new blank entity instead of displaying the updated entity. #### Solution -Make sure that all data sources nested within a device data source follow a Singleton (also: GetCreate) pattern, where an entity is created if it does not exist and retrieved if it does. +Ensure all data sources nested within a device data source follow a Singleton (also known as GetCreate) pattern, where an entity is created if it does not exist or retrieved if it does. \ No newline at end of file diff --git a/layouts/partials/landingpage/latest-releases.html b/layouts/partials/landingpage/latest-releases.html index 95262691929..28b09503b4b 100644 --- a/layouts/partials/landingpage/latest-releases.html +++ b/layouts/partials/landingpage/latest-releases.html @@ -10,10 +10,10 @@

Latest Releases

  • Apps -

    October 30, 2025

    +

    December 4, 2025

  • Deployment -

    November 27, 2025

    +

    December 06, 2025

  • diff --git a/static/attachments/appstore/platform-supported-content/modules/genai/navigate_mxgenai/GenAIResource_Settings.png b/static/attachments/appstore/platform-supported-content/modules/genai/navigate_mxgenai/GenAIResource_Settings.png deleted file mode 100644 index 2d444359a35..00000000000 Binary files a/static/attachments/appstore/platform-supported-content/modules/genai/navigate_mxgenai/GenAIResource_Settings.png and /dev/null differ diff --git a/static/attachments/appstore/platform-supported-content/services/event-broker/event_broker_ede_create_1_errors.png b/static/attachments/appstore/platform-supported-content/services/event-broker/event_broker_ede_create_1_errors.png deleted file mode 100644 index 9d5e7d9acc0..00000000000 Binary files a/static/attachments/appstore/platform-supported-content/services/event-broker/event_broker_ede_create_1_errors.png and /dev/null differ diff --git a/static/attachments/control-center/genai-resources/deprovisioning.png b/static/attachments/control-center/genai-resources/deprovisioning.png new file mode 100644 index 00000000000..4794c1230c0 Binary files /dev/null and b/static/attachments/control-center/genai-resources/deprovisioning.png differ diff --git a/static/attachments/control-center/genai-resources/overview-genai-resources.png b/static/attachments/control-center/genai-resources/overview-genai-resources.png new file mode 100644 index 00000000000..b55c6ec4c7e Binary files /dev/null and b/static/attachments/control-center/genai-resources/overview-genai-resources.png differ diff --git a/static/attachments/control-center/genai-resources/warning-message.png b/static/attachments/control-center/genai-resources/warning-message.png new file mode 100644 index 00000000000..237e5c4559a Binary files /dev/null and b/static/attachments/control-center/genai-resources/warning-message.png differ diff --git a/static/attachments/refguide/modeling/best-practices/accessibility-best-practices/accessibility-helper.png b/static/attachments/refguide/modeling/best-practices/accessibility-best-practices/accessibility-helper.png new file mode 100644 index 00000000000..9521e55554e Binary files /dev/null and b/static/attachments/refguide/modeling/best-practices/accessibility-best-practices/accessibility-helper.png differ diff --git a/static/attachments/refguide/modeling/best-practices/accessibility-best-practices/action-button-role-type.png b/static/attachments/refguide/modeling/best-practices/accessibility-best-practices/action-button-role-type.png new file mode 100644 index 00000000000..3712063961f Binary files /dev/null and b/static/attachments/refguide/modeling/best-practices/accessibility-best-practices/action-button-role-type.png differ diff --git a/static/attachments/refguide/modeling/best-practices/accessibility-best-practices/combobox-aria-labels.png b/static/attachments/refguide/modeling/best-practices/accessibility-best-practices/combobox-aria-labels.png new file mode 100644 index 00000000000..10384f93448 Binary files /dev/null and b/static/attachments/refguide/modeling/best-practices/accessibility-best-practices/combobox-aria-labels.png differ diff --git a/static/attachments/refguide/modeling/best-practices/accessibility-best-practices/group-box-focus-indicator.png b/static/attachments/refguide/modeling/best-practices/accessibility-best-practices/group-box-focus-indicator.png new file mode 100644 index 00000000000..ed9d8c96941 Binary files /dev/null and b/static/attachments/refguide/modeling/best-practices/accessibility-best-practices/group-box-focus-indicator.png differ diff --git a/static/attachments/refguide/modeling/best-practices/accessibility-best-practices/page-properties-title.png b/static/attachments/refguide/modeling/best-practices/accessibility-best-practices/page-properties-title.png new file mode 100644 index 00000000000..e2133c91660 Binary files /dev/null and b/static/attachments/refguide/modeling/best-practices/accessibility-best-practices/page-properties-title.png differ diff --git a/static/attachments/refguide/modeling/best-practices/accessibility-best-practices/static-image-alt-text.png b/static/attachments/refguide/modeling/best-practices/accessibility-best-practices/static-image-alt-text.png new file mode 100644 index 00000000000..77983c37cf0 Binary files /dev/null and b/static/attachments/refguide/modeling/best-practices/accessibility-best-practices/static-image-alt-text.png differ diff --git a/static/attachments/refguide/modeling/best-practices/accessibility-best-practices/text-box-label.png b/static/attachments/refguide/modeling/best-practices/accessibility-best-practices/text-box-label.png new file mode 100644 index 00000000000..fb61c51bbfd Binary files /dev/null and b/static/attachments/refguide/modeling/best-practices/accessibility-best-practices/text-box-label.png differ diff --git a/static/openapi-spec/project-category-api.yaml b/static/openapi-spec/project-category-api.yaml new file mode 100644 index 00000000000..fbd416c6dbd --- /dev/null +++ b/static/openapi-spec/project-category-api.yaml @@ -0,0 +1,601 @@ +openapi: 3.0.0 +info: + version: '1.0' + title: customfields-api + termsOfService: https://www.mendix.com/terms-of-use/ + description: API for managing company custom fields. + contact: + name: Mendix Support + url: 'https://support.mendix.com' + email: support@mendix.com +servers: + - url: 'https://customfields-api.home.mendix.com/v1' +security: + - PersonalAccessToken: [] +paths: + /companies/{company-id}/custom-fields: + get: + tags: + - Companies + summary: Get custom fields for a company + description: | + Returns the list of custom fields for the company. + The user PAT needs to have the scope `mx:app:customfields:read`. + operationId: getCompanyCustomFields + parameters: + - name: company-id + in: path + required: true + schema: + type: string + - name: limit + in: query + required: false + schema: + type: integer + minimum: 1 + maximum: 100 + default: 5 + description: Maximum number of items to return + - name: offset + in: query + required: false + schema: + type: integer + minimum: 0 + default: 0 + description: Number of items to skip before starting to collect the result set + responses: + '200': + description: List of custom fields + content: + application/json: + schema: + type: object + properties: + links: + $ref: '#/components/schemas/PaginationLinks' + meta: + $ref: '#/components/schemas/PaginationMeta' + items: + type: array + items: + $ref: '#/components/schemas/CustomField' + '400': + $ref: '#/components/responses/Http400' + '401': + $ref: '#/components/responses/Http401' + '404': + $ref: '#/components/responses/Http404' + '500': + $ref: '#/components/responses/Http500' + + post: + tags: + - Companies + summary: Create a custom field for a company + description: | + Creates a custom field for the company. The field must include at least 2 inner values. + Validation: A company can have a maximum of 5 custom fields. + The user PAT needs to have the scope `mx:app:customfields:write`. + The user must be a company admin. + The code of the provided values can be passed as an empty string. A code will be generated based on the provided input for the values. + operationId: createCompanyCustomField + parameters: + - name: company-id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CustomFieldCreate' + responses: + '201': + description: Custom field created + content: + application/json: + schema: + type: object + properties: + fieldId: + type: string + description: Unique identifier for the custom field + name: + type: string + description: Name of the custom field + values: + type: array + description: List of values for the custom field + items: + $ref: '#/components/schemas/CustomFieldValue' + '400': + $ref: '#/components/responses/Http400' + '401': + $ref: '#/components/responses/Http401' + '404': + $ref: '#/components/responses/Http404' + '409': + $ref: '#/components/responses/Http409' + '422': + $ref: '#/components/responses/Http422' + '500': + $ref: '#/components/responses/Http500' + /custom-fields/{field-id}: + put: + tags: + - CustomFields + summary: Update a custom field + description: | + Updates a custom field. + The user PAT needs to have the scope `mx:app:customfields:write`. + The user must be a company admin. + operationId: updateCustomField + parameters: + - name: field-id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CustomFieldNameUpdate' + responses: + '200': + description: Custom field updated + content: + application/json: + schema: + $ref: '#/components/schemas/CustomField' + '400': + $ref: '#/components/responses/Http400' + '401': + $ref: '#/components/responses/Http401' + '404': + $ref: '#/components/responses/Http404' + '409': + $ref: '#/components/responses/Http409' + '500': + $ref: '#/components/responses/Http500' + + delete: + tags: + - CustomFields + summary: Delete a custom field + description: Deletes a custom field. The user needs to have the scope `mx:app:customfields:write`. The user must be a company admin. + operationId: deleteCustomField + parameters: + - name: field-id + in: path + required: true + schema: + type: string + responses: + '204': + description: Custom field deleted + '401': + $ref: '#/components/responses/Http401' + '404': + $ref: '#/components/responses/Http404' + '500': + $ref: '#/components/responses/Http500' + /custom-fields/{field-id}/values: + get: + tags: + - CustomFields + summary: Get values for a custom field + description: | + Returns the list of values for a custom field. A maximum of 100 values can be returned per page. + The user PAT needs to have the scope `mx:app:customfields:read`. + operationId: getCustomFieldValues + parameters: + - name: field-id + in: path + required: true + schema: + type: string + - name: limit + in: query + required: false + schema: + type: integer + minimum: 1 + maximum: 100 + default: 100 + description: Maximum number of items to return + - name: offset + in: query + required: false + schema: + type: integer + minimum: 0 + default: 0 + description: Number of items to skip before starting to collect the result set + responses: + '200': + description: List of values + content: + application/json: + schema: + type: object + properties: + links: + $ref: '#/components/schemas/PaginationLinks' + meta: + $ref: '#/components/schemas/PaginationMeta' + items: + type: array + items: + $ref: '#/components/schemas/CustomFieldValue' + '400': + $ref: '#/components/responses/Http400' + '401': + $ref: '#/components/responses/Http401' + '404': + $ref: '#/components/responses/Http404' + '500': + $ref: '#/components/responses/Http500' + + post: + tags: + - CustomFields + summary: Add values to a custom field + description: | + Adds values to a custom field. + Validation: A company allows a maximum of 250 values per custom field. + The user PAT needs to have the scope `mx:app:customfields:write`. + The user must be a company admin. + The code of the provided values can be passed as an empty string. A code will be generated based on the provided input for the values. + operationId: addCustomFieldValues + parameters: + - name: field-id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + values: + type: array + minItems: 1 + maxItems: 250 + items: + $ref: '#/components/schemas/CustomFieldValueCreate' + responses: + '201': + description: Values added + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/CustomFieldValue' + '400': + $ref: '#/components/responses/Http400' + '401': + $ref: '#/components/responses/Http401' + '404': + $ref: '#/components/responses/Http404' + '409': + $ref: '#/components/responses/Http409' + '422': + $ref: '#/components/responses/Http422' + '500': + $ref: '#/components/responses/Http500' + /custom-fields/{field-id}/values/{value-id}: + put: + tags: + - CustomFields + summary: Update a value of a custom field + description: | + Updates the value of a custom field. + The user PAT needs to have the scope `mx:app:customfields:write`. + The user must be a company admin. + The code of the provided value can be passed as an empty string. A code will be generated based on the provided input for the values. + operationId: updateCustomFieldValue + parameters: + - name: field-id + in: path + required: true + schema: + type: string + - name: value-id + in: path + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CustomFieldValueCreate' + responses: + '200': + description: Value updated + content: + application/json: + schema: + $ref: '#/components/schemas/CustomFieldValue' + '400': + $ref: '#/components/responses/Http400' + '401': + $ref: '#/components/responses/Http401' + '404': + $ref: "#/components/responses/Http404" + '409': + $ref: '#/components/responses/Http409' + '500': + $ref: '#/components/responses/Http500' + + delete: + tags: + - CustomFields + summary: Delete a value of a custom field + description: | + Deletes a value of a custom field. + Validation: At least two values must remain. + The user PAT needs to have the scope `mx:app:customfields:write`. + The user must be a company admin. + operationId: deleteCustomFieldValue + parameters: + - name: field-id + in: path + required: true + schema: + type: string + - name: value-id + in: path + required: true + schema: + type: string + responses: + '204': + description: Value deleted (at least two values must remain) + '401': + $ref: '#/components/responses/Http401' + '404': + $ref: '#/components/responses/Http404' + '409': + $ref: '#/components/responses/Http409' + '500': + $ref: '#/components/responses/Http500' +tags: + - name: Companies + description: 'Companies in the Mendix platform' + - name: CustomFields + description: 'Company custom fields' + +components: + securitySchemes: + PersonalAccessToken: + type: apiKey + name: Authorization + in: header + description: 'MxToken ' + schemas: + CustomFieldCreate: + type: object + properties: + name: + type: string + description: Name of the custom field + values: + type: array + description: List of values for the custom field + minItems: 2 + items: + $ref: '#/components/schemas/CustomFieldValueCreate' + CustomFieldValueCreate: + type: object + properties: + code: + type: string + description: Code for the value + value: + type: string + description: The actual value + CustomField: + type: object + properties: + fieldId: + type: string + description: Unique identifier for the custom field + name: + type: string + description: Name of the custom field + CustomFieldValue: + type: object + properties: + valueId: + type: string + description: Unique identifier for the value + code: + type: string + description: Code for the value + value: + type: string + description: The actual value + CustomFieldNameUpdate: + type: object + properties: + name: + type: string + description: New name for the custom field + PaginationLinks: + type: object + properties: + self: + type: string + description: URL to the current page of results + next: + type: string + description: URL to the next page of results + prev: + type: string + description: URL to the previous page of results + first: + type: string + description: URL to the first page of results + last: + type: string + description: URL to the last page of results + PaginationMeta: + type: object + properties: + page: + type: object + properties: + totalElements: + type: integer + description: Total number of elements available + offset: + type: integer + description: Number of items skipped before starting to collect the result set + elements: + type: integer + description: Number of elements returned on this page + responses: + Http400: + description: 'Bad Request' + content: + application/json: + schema: + type: object + properties: + error: + type: object + description: 'Detailed information on the error' + properties: + message: + type: string + description: 'A short, human-readable title for the general error type' + default: 'Bad Request' + detail: + type: string + description: 'A human-readable description of the specific error' + code: + type: integer + description: 'HTTP status code' + default: 400 + Http401: + description: 'Unauthorized' + content: + application/json: + schema: + type: object + properties: + error: + type: object + description: 'Detailed information on the error' + properties: + message: + type: string + description: 'A short, human-readable title for the general error type' + default: 'Unauthorized' + detail: + type: string + description: 'A human-readable description of the specific error' + code: + type: integer + description: 'HTTP status code' + default: 401 + Http404: + description: 'Not Found' + content: + application/json: + schema: + type: object + properties: + error: + type: object + description: 'Detailed information on the error' + properties: + message: + type: string + description: 'A short, human-readable title for the general error type' + default: 'Not Found' + detail: + type: string + description: 'A human-readable description of the specific error' + code: + type: integer + description: 'HTTP status code' + default: 404 + Http422: + description: 'Unprocessable content' + content: + application/json: + schema: + type: object + properties: + error: + type: object + description: 'Detailed information on the error' + properties: + message: + type: string + description: 'A short, human-readable title for the general error type' + default: 'Exceeding the number of objects allowed' + detail: + type: string + description: 'A human-readable description of the specific error' + code: + type: integer + description: 'HTTP status code' + default: 422 + Http409: + description: 'Conflict' + content: + application/json: + schema: + type: object + properties: + error: + type: object + description: 'Detailed information on the error' + properties: + message: + type: string + description: 'A short, human-readable title for the general error type' + default: 'Conflict' + detail: + type: string + description: 'A human-readable description of the specific error' + code: + type: integer + description: 'HTTP status code' + default: 409 + Http500: + description: 'Internal Server Error' + content: + application/json: + schema: + type: object + properties: + error: + type: object + description: 'Detailed information on the error' + properties: + message: + type: string + description: 'A short, human-readable title for the general error type' + default: 'Internal Server Error' + detail: + type: string + description: 'A human-readable description of the specific error' + code: + type: integer + description: 'HTTP status code' + default: 500 \ No newline at end of file