Add-In Manager enables you to easily build and re-build Add-In files, manage versions of an add-in over time, directly access source files, and have extra customizations for your add-in. Now with version 2.0 of Add-In Manager, you can control your entire JSL application development life-cycle now that you can deploy your add-ins out to your users directly from Add-In Manager!
The fundamental feature of Add-In Manager is the ability to build a JMP add-in file directly from source files. This feature was initially included in my Custom Add-In Builder add-in and Add-In Manager has taken the basics of that add-in and improved upon it.
With version 2.0 of Add-In Manager, you can now deploy (or push) add-ins out to your users directly from Add-In Manager. You can deploy to a TEST location for your users to test out your add-in and you can also deploy to a PROD location.
When deploying to PROD, a JSL script with an Associative Array is automatically updated with the latest publish date/time. This Associative Array can be used by an auto-generated 'updateCheck.jsl' script that can compare the build date of the user's add-in to the build date according to the Associative Array. If a newer version of the add-in is available, the user will see the following window, where they can choose to update to the latest version. This concept using an Associative Array to check for updates was adapted from @brady_brady's method of using a table with publish dates. This method is described in @Jeff_Perkinson's post How to write self-updating JMP add-ins.
Add-In Manager has the ability to automatically keep a version history of an add-in file each time a new one is built. It allows you to install, restore, or delete a previous version of an add-in. You can optionally include a comment for each build so you can keep track of what changes went into each version.
Add-In Manager allows you to make a few customizations to your add-in that previously required manual changes to XML. Below are the extra customizations available in Add-In Manager.
On the Files tab within Add-In Manager, you can open files in your source folder directly from JMP by double-clicking on the desired file in the table.
With Add-In Manager version 2.0, you can create your own custom metadata in addition to the metadata automatically included and managed by Add-In Manager.
From the Installed tab, you can enable, disable, or register installed add-ins as well register add-ins that are not installed.
This add-in is supported on Windows and Mac operating systems with JMP 13 or higher.
Add-In Manager, Part 1: Defining and building a JMP add-In
Add-In Manager, Part 2: Deploying auto-updating add-ins to users
Add-In Manager, Part 3: Advanced customization
Version 1.1-1.3 (October 16, 2017)
Version 2.0 (November 22, 2017)
Version 2.1 (February 26, 2018)
Version 2.2 (March 8, 2018)
Version 2.3 (April 6, 2018)
Version 2.4 (January 9, 2020)
Version 2.5 (February 5, 2020)
Version 2.6 (June 4, 2020)
Version 2.7 (June 10, 2020)
Version 2.8 (September 24, 2020)
Version 2.9 (February 4, 2021)
Version 3.0 (January 18, 2022)
Version 3.1 (March 4, 2022)
Version 3.2 (September 25, 2023)
Let me know if you find any issues!
Current Version=3.2
2.9
The add-in does not seem to get installed on my computer. This seems to be the issue with some of the recently uploaded add-ins. Does this add-in require JMP-13?
I have JMP 12.2 on my computer.
Hi @tejvishnu,
Yes, JMP 13 is required to install this add-in. Unfortunately, I was not able to make this add-in compatible with JMP 12. I have updated the post to include this this information.
Thanks,
Justin
I want to be so good, and charitable and thank JMP developers for the 13th version of a software program that I love to teach with. I've had it since version 5.0, with it's well thumbed paper manuals and to be honest nothing has been added that is of any value to me since that version. But loving version 5.0 as I did, I have happily and willingly upgraded each year. And then the ROC-Curve & partial Area Under the Curve Analysis script came along which was beautiful in JMP12. I have set up a teaching session to show my students about ROC curves.... and I upgraded to v13...... and now it doesn't display the curves. boo.
Thank you for this! Now creating and updating add-ins so easy that I develop and improve my own add-ins more often than in the dark ages before this tool.
Thanks again for this addin. I am finally getting up to speed with the new version and taking advantage of some of your improvments on what I was doing manually :) My one ask, and I'm not sure if this is possible, is to be able to build several addins at once. I know the bottom panels for information and directories are addin specific, but perhaps those could disappear if more than one addin is selected. Then all selected could be DEVd/Deployed/etc.
I manange over 40 addins right now and I often make updates in batches so being able to do a bunch of all of the addins at once would be amazing!
Hi Justin,
In JMP 14.0.1, I keep getting this error:
Error Message: {"argument should be list"(1, 2, "Concat Items", Concat Items /*###*/(errorList, " "))} Error: argument should be list 1 time(s). Type: Error Function Name: Concat Items Function being executed: Concat Items /*###*/(errorList, " ") Call Stack: getLastModifiedDateOfNewestFile getStatusIcon refreshAddinTableBox initialize
Any ideas? This is Manager 2.2.
John
If you still have version 1.3 of the add-in, you can change the ID and menu item name for that version and use it along side the new version. Version 1 allows you to use check boxes to build multiple at a time and should be able to hook up with the data table used by version 2. There were a lot of architectural changes in v2.0 so unfortunately I had to remove the checkboxes. I have it on my list to add those back in the future.
Thanks for reporting this! It looks like you are using a Mac, and you must have renamed or deleted one of your source folders. I have added a check for this now (v2.3) so it should not fail anymore.
Justin,
Version 2.3 works like a charm on my Mac! Thank you!!!
John
Justin,
I'm having an issue with the autoupdate feature. I have traced the issue back to the updateCheck.jsl script.
The following line fails, then the try statement exits.
customMetadata_aa = Include("customMetadata.jsl" );
If I add the following to the file path there are no issues and it looks like things work as advertised.
$ADDIN_HOME(my_addin_here)
Am I supposed to be doing this for each addin or should this be automatic?
Thanks,
Aubrey
Hi Aubrey,
The Include statement within the updateCheck.jsl script uses a relative path to the customMetadata.jsl file. As long as both of those files are in the same folder, it should work properly. What does the folder structure look like for your add-in?
Feel free to send me a private message if you need to send anything you don't want on this public post.
Thanks,
Justin
Hello Justin,
Add-In Manager v2.3 is working wonderfully in all aspects for me but one, I am unable to get the updateCheck to correctly push updates. Some facts:
- My code outside of the update check runs correctly.
- My PROD folders "Metadata" and "Deployment" are both on server locations under the same parent folder, and I have verified users have access to them both.
- Within the Preferences section, I have selected "Include Update Check Script", and copied the include statement provided in this section into my code. I have edited the add-in ID section of this statement from (com.jmp.myaddin) to match my add-in. I did not edit anything else within this statement and did not edit anything within the updateCheck.jsl script.
- When making changes to the add-in and deploying to PROD, I have verified that the "pubDate" within the publishedAddins.jsl file located in the Metadata server file has changed with each deployment
- I have had users download an existing version of the file located within the PROD folder, close JMP, reopen JMP, and run the add-in with success.
- I have deployed a newer iteration to PROD, verified the pubDate changed, and requested the previous user to reopen JMP and run the existing add-in. The user is never prompted to update the add-in.
- I have had the same user go into the PROD folder and reinstall the add-in, which has successfully updated the Add-In.
Hi @Adam_R,
Thanks for all the work on the details! A few questions and things to try:
Let me know if you have any questions.
Regards,
Justin
Hello Justin,
As this is my first Add-In and I am an infant in regards to JMP experience (around 11 months of use), I may begin asking simple questions now as I work through activating the update-check function. I have created a simple test add-in to focus on only the update function so I can understand this functionality before applying it to my more robust program.
THE SCRIPT:
aa = Include( "$ADDIN_HOME(com.jmpTest.myjmpaddin)\customMetadata.jsl" );
Include( "$ADDIN_HOME(com.jmpTest.myjmpaddin)\updateCheck.jsl" );
com.jmp.juchil.addinmanager:checkForUpdate();
New Window ("Test 3",
Panel Box ("Test 3",
Text Box("Test 3")
)
);
Responding to your questions:
Thank you for your assistance!
-Adam
Hi Adam,
Appologies for the delayed reply. Based on the error message you are seeing when removing the try, it looks like my assumption about the updateCheck script being able to find the customMetadata file was correct. I see where you have the '
aa = Include( "$ADDIN_HOME(com.jmpTest.myjmpaddin)\customMetadata.jsl" );' part of your script. However, you don't actually need to include the file there. Instead, you want to change the include within the updateCheck.jsl script. It should look something like the following (around line 11).
customMetadata_aa = Include( "$ADDIN_HOME(com.jmpTest.myjmpaddin)\customMetadata.jsl" );
Let me know if you have any additional questions.
Regards,
Justin
Hi there, I have started using Add-In manager after many years of managing changes manually. However, I recently had an issue with the Menu items not being visible I updated to JMP 14.3.0 recently, not sure if this is related. I had no issues with this before.
As you can see there are no errors in the build or deployment flagged so I'm at a loss as to what is happening.
Any help or suggestions are appreciated as I really don't want to have to rebuild it from scratch.
Regards,
Derek.
Hi Justin,
I'm having a couple of issues with Add-In manager under JMP 15/Mac OS 10.15.
(1) [trivial] maximum/minimum JMP version options needs to include 15
(2) [less trivial] Entering text into text boxes in a number of panes within the manager seems (partially) broken. I can enter text (e.g. Add-In Name, Version etc) by pasting, but not by typing.
Thanks.
John Madden
Hi @john_madden,
Thanks for reaching out and apologies for the delay.
#1 should be addressed in v2.4 which I just uploaded here.
For #2, I am not able to replicate this issue on Windows, but I will investigate further on Mac. Do you happen to know if this issue started with a specific JMP version number (i.e. JMP 14/15) or with a macOS version (10.14/15) or has it always happened for you?
Thanks,
Justin
Thanks, Justin!!
#2 started with JMP15/OSX15, but I haven't tried out 2.4 yet and will get back to you.
Running on JMP15 Windows 10, addin manager can no longer parse the menu structure from an existing add-in.
To reproduce: Create a new addin and rename the top level menu using custom. Create a command and save the addin definition.
Close addin manager, re-open and try to see the menu items tab for the just created Add-in (make sure you view this one first before looking at any of your other addins menu structure).
To get this to work, create a second add-in where you do not change the top menu item but leave it at the default "Add-Ins". Save this addin. Close add-in manager, open again, first view the menu structure of the one with the default top level name and then go view the menu structure of the custom one. It all works again.
Hello everybody,
Does anyone have a tips or experience for encrypting scripts before they're zipped up in the jmpaddin file?
Thanks
Regards,
Guillaume
@vince_faller might have some tips on encrypting scripts. However, I would need to add a feature to Add-In Manager to be able to allow modifying the files to be added before the zip process.
I think @vince_faller also did a presentation/webcast yesterday that might be useful to you here: https://www.brighttalk.com/webcast/18305/412912
- Justin
@Justin_Chilton thanks for your answer.
it might be useful to have a jsl capabale function that can encrypt other jsl files (or some other way to do that).
I watched @vince_faller presentation this morning (french time). Nice one.
We also have some Devops process but need to automate more.
Guillaume
Thanks for reporting that issue with the custom menu add-ins. I just uploaded a new version that should fix this.
-Justin
@guillaumebugnon So I use this function in a for loop for encrypting the scripts.
encryptScript = Function({filepath},
{defaultLocal},
errortxt = "";
winCount = N Items (Window ());
scriptWin = Open (filePath);
scriptWin << Bring Window to Front;
Wait (1);
Main Menu ("Encrypt Script");
windowList = Window ();
encryptedWin = windowList[nitems(windowList)]; // get reference to encrypted script window (i.e. the last window)
//TODO: Implement without Try
Try (
encryptedScript = encryptedWin[Script Box(1)] << Get Text;
save text file(filePath, encryptedScript);
ConsoleMsg("File Encrypted: "||filepath); // hoping this goes to stdout
,
errortxt ||= char(exception_msg) || "\!r\!n";
);
Try (scriptWin << Close WIndow());
Try (encryptedWin << Close WIndow());
Return (errortxt)
);
Then I have another autoit script that goes through and types in the password and presses enter.
It's definitely not a perfect solution and your wish list item would be way better.
Thanks a lot for sharing... will try it next week.
Justin,
I am getting an Error with your Add In as part of the JMP16EA programs. You want me to file a bug report there or should i post it here ?
Henning
Hi @vohwinkelh0,
Thanks for reporting this. I saw that error a few days ago and your comment reminded me, so I finally was able to track down the issue to an bug with one of the file/directory functions.
I have updated the add-in on this page to workaround this issue for now, but I also noted the issue in JMP so that we can address it before JMP 16 is released.
Thanks,
Justin
works like a charm. Thank you Henning
@Justin_Chilton When adding a add-in from a existing .jmpaddin file we have a bug at this screen:
You cannot leave the source folder blank and if you put anything in there you get a warning that it needs to be blank when starting from a jmpaddin file..
@pauldeen The source folder is where the jmpaddin file will get unzipped too (I probably should have made it automatically create the folder, but I guess I didn't). I suggest creating a folder called "ASM Training Material" within the "Desktop" folder and setting that as the source folder. The source folder can't have anything in it because it would all end up zipped in the add-in.
@Justin_Chilton Ah yes creating an empty folder gets you past this screen. The name of the folder seems to not be important, only the fact that it is empty.
On testing I found this other bug:
If I take your Add-In Manager v2.7.jmpaddin and create the empty folder then load it up like this, I get past the adding screen but with a big error: The same happens with other add ins that have sub folders inside them.
Really cool addin. Works Really well. However, I've been struggling to use auto-update function. In particular, I'm confused with the appropriate file/location to add the following code snippet
Include( "$ADDIN_HOME(com.jmp.myaddin)\updateCheck.jsl" );
com.jmp.juchil.addinmanager:checkForUpdate();
Best
Sebastien
@Sburel, You can add that code anywhere you would like to check for an update, such as at the start of a menu item command. This could make it so that when a user clicks on the command, it will check for a new version before launching the add-in.
If I recall correctly, there was an issue with using this code in the addinLoad.jsl file, which would cause it to check at JMP start-up time, but there were issues with re-installing the add-in while the add-in is still being loaded. This issue may or may not be still an issue.
-Justin
@pauldeen, I just uploaded a new version (v2.8) which fixes that subfolder issue you were seeing. I also added a checkbox option to automatically create a folder for you, like you originally had expected it to work.
Thanks for the 2.8 fix on the folders!
I have a new one for you:
Opened Add-in manager, selected an add-in:
Running JMP 16EA8.
No problem with the same thing on JMP 15.2.0 both under windows 10
Thanks @pauldeen. I think there were several different factors colliding for this. For one, the error should be resolved in the final JMP 16.0 release, but was in there for EA8. Additionally, this error likely happens because your Locale does not support the date format I used. To fix this, and be more Locale friendly, I have updated some places where I format dates to use Locale Date Time instead of specific formats. This should fix the error and put the dates in a more friendly format.
Confirmed, it works again, thanks!
@Justin_Chilton can I clarify a response you provided Sebastien previously ? So, will the auto-update statement (below) work if I place it in the "start-up Script" (snapshot) ? Or we should only include the auto-update statement under each command script ?
Include( "$ADDIN_HOME(com.jmp.myaddin)\updateCheck.jsl" );
com.jmp.juchil.addinmanager:checkForUpdate();
Thanks
Daniel
I would recommend putting the statement in each command to have the check whenever the add-in is used and not every time the user launches JMP. Also, there have been issues with updating add-ins at startup, so doing that when a user clicks and add-in command is a safer way to do it.
Thanks for clarifying Justin!
Follow up question, I receive the following error message as I was trying to deploy to production. The destination folder is actually a sharepoint. I'm not sure if that's the reason or perhaps there's a workaround.
Error Message:
{"File not open in Write mode. "(1, {1}, 2, "Save Text File", Save Text File /*###*/(filepath, str))}
Error: File not open in Write mode.
1 time(s).
Data Table Indices: 1
Type: Error
Function Name: Save Text File
Function being executed: Save Text File /*###*/(filepath, str)
Call Stack:
deploySelected
@Djtjhin, it sounds like it is very likely related to it being a sharepoint location. Can you confirm that you have write access to that location by creating a file in File Explorer? Even if you do have permission, JMP may not have permission as an application. Are you using a regular network path or are you saving through a mounted network drive? Mounting your sharepoint server as a network drive can resolve issues around permissions, as JMP can just save to the mounted drive. With the regular network path, credentials may be required, which is something JMP does not support.
@Justin_Chilton I believe I do have write access as I can see that the old addin was archived correctly and the new addin was updated, yet I still see the error. I'm not sure which step specifically that failed. With regards to the mounted network drive, unfortunately I'm probably out of depth on that one. I'm not sure about that status, but perhaps I can ask around my colleagues to find out more.
Hey @Justin_Chilton ,
I am using v2.9 of the add-in on JMP 15.1 running on MacOS. I encounter a VERY slow response time any time I need to enter text into any of the text boxes of the add-in. This is so slow that it renders the add-in unusable.
A second, smaller issue, is that none of the color schemes work properly with JMP set in dark-mode. The color of the text in the text boxes is too light and cannot be read against the background color.
Hi @alavy ,
I am not sure what is going on with the slow response time. I will have to do some further investigating to see if it is an issue with my add-in or a problem with JMP. However, I did find a decent workaround. The first time you click into a text edit box, hold the escape key until the text is no longer in focus. Now all of the edit boxes should work without any delay after you click into them.
As for the color scheme, I am not sure what would cause this. Any version of the add-in after 2.5 should have proper coloring for dark themes. I think the only way to reproduce that issue is if you switch from light to dark theme while JMP is open. I always get the view below with the gray theme.
Thank you for your reply @Justin_Chilton ! I ended up enforcing a light-theme for jmp to avoid the color issue altogether. I will try your suggestions, clicking on the escape key to solve the lag time.
Hi @Justin_Chilton ,
I have just discovered your Add-in Manager and am intrigued. I have been manually managing add-ins for years now, up to and including manually editing .jmpcust files. I see opportunity to make my life much easier with your Add-in manager. However, I am wondering how to make it support what I want to do.
I will refer to the attached image of the proposed folder structure. The idea is there is a folder containing JMP code, we'll call it RepositoryRoot here. This folder is in a GIT lab repository and is shared and sync'd between two or more JSL developers.
Each developer owns an Add-in with in the repository. Let's call them Addin_1 and Addin_2. Those Add-ins are in their own respective sub-folders within the Repository.
There is also a folder we'll call CommonFiles within the Repository which contains some standard JSL library files that both Add-ins use.
These standard library files are included in the individual add-ins, for example a JSL file within Addin_1\Source might have a line like
include("..\..\CommonFiles\LibraryFile1.jsl");
So the question is how could we leverage this structure with the Add-in Manager ? I run into problems with two possible options :
1) If in the Add-in Manager I let "RepositoryRoot" be the Source Folder, then it creates Addin.def and Addin.jmpcust in RepositoryRoot. This doesn't work because we can only have one addin.def in a given source folder and we want to have separate add-ins with separate developers, but sharing code.
2) If I let "RespositoryRoot\Addin_1\Source" be the Source Folder, then addin.def and addin.jmpcust get created in the Source folder of Addin_1's sub folder. And that's good because it's contained in its own folder. BUT, I can't see any way to add the CommonFiles folder from two levels up in the directory tree to the add-in. The code requires that common files folder, but we want to keep it at the higher level for code sharing and sync'ing.
I understand that ultimately the "CommonFiles" folder does have to get duplicated into each final .jmpaddin file before the Add-in is released.
The hope was that we could find an Add-in manager capability that would manage that for us. Our alternate is to manually create .zip file and set up the folder structure the way we need it , then change the extension to .jmpaddin prior to publishing.
If you have ideas or would consider having the Add-in manager support this capability, that would be great.
many thanks
Tom