22

Ninext project

good evening to all, 

I create this post to organize the Ninext project. For those who are new to it, it is composed of several JavaScript modules that allow you to add badges on tabs and buttons, catch selection events on views, execute JavaScript from Ninox script, inspect dependencies between database fields.

This post is here to talk about the project and the procedure for those who would like to implement it in your databases. I would like to take this opportunity to remind you that this is a test project that evolves regularly and I invite you to be cautious and not to use it on commercial databases for the moment.

The sources of the project are available and downloadable on Github
Thanks to all of you for all your messages of support and for your help to debug and make the project progress a little more every day 🙏.

I made the project initiation procedure evolve thanks to the precious help of M. Daaboul who told me that we could use the Ninox dialog box with HTML code. It is no longer necessary to create a window and an HTML field for this. You just have to copy the code below in the Trigger after open in the Options

 

var code := http("GET", "https://raw.githubusercontent.com/JacquesTur/Ninext/main/loadModules.html").result;
dialog("Ninext intialization", "<script>
window.exConfigLoadModules = {
    completion: false,
    badges: true,
    evalJS: true,
    viewEvent: true,
    buttonEvent : true,
    fieldsInspector: true,
    nativeJS: true,

    autoCloseDialog: true
};
</script>" + code, ["close"])

The dialog box will be displayed stealthily then disappear. If you want it to stay displayed with its "close" button, set the autoCloseDialog parameter to false.

292 replies

null
    • Fred
    • 13 days ago
    • Reported - view

    I got motivated by ' post about using Ninext's HTML helping functions. So here is my first attempt:

    function newPopup(irecord : number) do
        let getRec := record(Teams,irecord);
        popupRecord(getRec)
    end;
    html(---
      <button id = "1" onclick='ninext.callNinoxFunction("newPopup", this, this.Value)'>Push to try it</button>
    ---)
    

    And sadly it didn't get me anywhere. I know the function works cause if I try it without the html:

    newPopup(1)

    It pops up the record. Again and Again and Again. Glad I didn't break my DB.

    But when I add the html nothing works. I'm not sure how to pass along the value of 1. It is only one button, but I would like to build a table of records and have the buttons generated with the rId.

    Thanks,

      • Ninox developper
      • Jacques_TUR
      • 13 days ago
      • Reported - view

       You can reuse the installation procedure you already have. Nothing more is required.

    • Fred
    • 12 days ago
    • Reported - view

    Now I have a question about what to reference in place of this in the callNinoxFunction.

    function newPopup(irecord : number) do
        let getRec := record(Teams,irecord);
        popupRecord(getRec)
    end;
    let allTeams := (select Teams);
    html(for x in allTeams do
        ---
      <button onclick='ninext.callNinoxFunction("newPopup", 'x', ' number(x.Id) ')'>{ x.Name }</button>
        ---
    end)
    

    On line 8, I replaced this (the second argument in the callNinoxFunction) with the variable x, but I still don't get the popup, so I'm lost at what I need or how to reference the correct record.

    I've tried various ways. I used double quotes. I used curly brackets. The curly brackets worked for the Name field. 

    Thanks,

      • szormpas
      • 12 days ago
      • Reported - view

        Hi,

      Could you try the following script?

      function newPopup(irecord : number) do
          let getRec := record(Teams,irecord);
          popupRecord(getRec)
      end;
      let allTeams := (select Teams);
      let _html := ---
      { for x in allTeams do }
        <button onclick='ninext.callNinoxFunction("newPopup", this, { number(x.Id) })'>{ x.Name }</button>{ end }
          ---;
      html(_html)
      
      • Fred
      • 12 days ago
      • Reported - view

       Thanks, that was it. I always get lost when trying to figure out how to escape out of HTML so you can call Ninox.

      • szormpas
      • 12 days ago
      • Reported - view

        Hi,

      I too struggle to find my way without my references!

      • Rafael Sanchis
      • Rafael_Sanchis
      • 11 days ago
      • Reported - view

       

      function newPopup(irecord : number) do

       let getRec := record(Teams,irecord);

       popupRecord(getRec)

      end;

      let allTeams := (select Teams);

      let _html := ---

      { for x in allTeams do }

        <button style="padding: 8px 16px; margin: 5px; background-color: #4CAF50; color: white; border: none; border-radius: 4px; cursor: pointer; font-size: 14px;" 

                onmouseover="this.style.backgroundColor='#45a049'" 

                onmouseout="this.style.backgroundColor='#4CAF50'" 

      onclick='ninext.callNinoxFunction("newPopup", this, { number(x.Id) })'>{ x.Name }

        </button>{ end }

       ---;

      html(_html)

    • Ninox developper
    • Jacques_TUR
    • 11 days ago
    • Reported - view

    Ninext version 2.3.3 is now available

    This update fixes two display issues:

    • Script function names are now visible in dark mode in Schema Overview.
    • The Ninext icon is now visible regardless of the team color configured.

    Thanks to for reporting these bugs here.

    Full update details available here: https://docs.ninext.fr/update-history-46#_luCVSiWD

    Happy New Year 2026! 🥳

    • szormpas
    • 11 days ago
    • Reported - view

     Hi,

    I noticed a minor issue. When I try to open a page immediately after Ninext's dialog, there is a layout disruption on the page. However, this does not happen if I run Ninext's initialization code after opening the page.

    var options := {
            badges: true,
            viewEvent: true,
            buttonEvent: true,
            fieldsInspector: true,
            nativeJS: true,
            tableView: true,
            debugTracer: true,
            languages: false,
            helper: true,
            errorsViewer: true,
            codeFinder: true,
            schemaOverview: true,
            autoCloseDialog: true
        };
    var res := http("GET", "https://www.ninext.fr/_functions/ninext").result.code;
    dialog("Ninext initialization", html(---
    <script ninext=''>{ res }; ninext.start({ formatJSON(options) })</script>
    ---), ["close"]);
    openPage("ΣΥΝΤΑΓΟΓΡΑΦΗΣΗ");
    
      • szormpas
      • 11 days ago
      • Reported - view

      I reproduced the issue on the #Ninext 2-1 app, also.

      • Ninox developper
      • Jacques_TUR
      • 11 days ago
      • Reported - view

       I’m really interested in fixing this bug, but I can’t reproduce it on my side. Could you send me an app where the bug occurs so I can analyze it and fix it?

      • szormpas
      • 11 days ago
      • Reported - view

        please find attached the database where the bug appers.

    • Ninox developper
    • Jacques_TUR
    • 10 days ago
    • Reported - view

    Hi everyone,

    We’ve just released a new version of Ninext 2.3.4, which of course remains fully usable for free, as it has always been.

    There is one important addition, though:
    👉 it is now possible, for those who wish, to support us through donations.

    Ninext is a project we continue to develop in our personal time, with the goal of providing useful, stable tools that integrate well with Ninox.
    These contributions are therefore entirely optional, have no impact on features or access to the extension, and are simply a way to support the ongoing development and maintenance of the project.

    Thank you all for your feedback, ideas, testing, and continued trust 🙏
    And as always, feel free to reach out if you have any questions or comments.

    Jan & Jacques

    • szormpas
    • 7 days ago
    • Reported - view

     Hi,

    I just wanted to let you know about a couple of things I noticed on the Finder module. They might be of interest to you.

    First, when a result refers to a page (like the last two on the screenshot), the wrench doesn't open the corresponding Ninox script editor.

    Second, when I try to move between the results by clicking the wrenches one at a time, a message pops up (see screenshot), even if I haven't made any changes.

      • Ninox developper
      • Jacques_TUR
      • 4 days ago
      • Reported - view

      Hi  ,

      Thank you for the detailed feedback!

      First point (wrench not opening script editor for pages): This has been fixed in version 2.3.5 beta.

      Second point (confirmation message appearing without changes): This behavior is intentional, and here's why:

      When you edit code in a column formula (within a Table View or Field View), the code editor window sits on top of Ninox's native column configuration dialog. The challenge is that I have no way to detect what happens in that underlying dialog.

      Even if you haven't modified the code itself, you might have:

      • Changed another column's settings
      • Added or removed a column
      • Modified sorting or other view parameters

      Since these changes occur in Ninox's native UI layer (which Ninext cannot monitor), I cannot reliably determine whether the view schema has been modified or not.

      Rather than risk losing your changes by closing windows automatically, I prefer to let you handle the confirmation yourself. This ensures you stay in control of when the schema gets saved.

      I understand it adds an extra click, but it's a safety measure to prevent unintended schema updates.

      Let me know if you have any other questions!

      • szormpas
      • 4 days ago
      • Reported - view

        Hi,

      I understand your point, and I agree that it's wiser to be safe than to risk losing something!

    • Ninox developper
    • Jacques_TUR
    • 5 days ago
    • Reported - view

    Ninext version 2.3.5 beta is now available! 🎉

    This update brings several fixes and improvements:

    Bug fixes:

    • Display after openTable() or openRecord() at startup is now correct.
    • Opening page formulas from "Fields & fx" and "Code Finder" now works correctly again.
    • The window splitter cursor now displays a more explicit resize cursor.
    • The root label in the hierarchical list now adapts to context (Tables or Pages).

    Full update details available here: https://docs.ninext.fr/update-history-46#_luGOXMW9

    • Ninox developper
    • Jacques_TUR
    • 3 days ago
    • Reported - view

    Ninext version 2.3.6 beta is now available! 🎉

    This update fixes an important issue with callNinoxFunction which did not work correctly when calling asynchronous Ninox functions (printing, server calls, etc.).

    You can now pass a callback function as the last argument to retrieve the result once the operation is complete:

    javascript

    callNinoxFunction(element, "myAsyncFunction", param1, param2, function(response) {
        if (response.error) {
            console.error(response.error);
        } else {
            console.log(response.result);
        }
    });

    Error handling has also been improved: callNinoxFunction now consistently returns an {error, result} object in case of error.

    👉 Update details: https://coda.io/d/_d-JLmZrpdE4/Update-history_suphN7yo#_luviwk5D 
    👉Function documentation: https://coda.io/d/_d-JLmZrpdE4/HTML-helping-functions_sull3D_P

    A big thank you to  for discovering this bug (https://forum.ninox.com/t/x2yp1qy?r=q6yp1hq), as well as for his valuable technical contributions and financial support for the project. 🙏

    Happy coding with Ninext!

Content aside

  • 22 Likes
  • 3 days agoLast active
  • 292Replies
  • 6806Views
  • 42 Following