I’ve been playing with the idea to add new functionality to the CaseBuilder in order to overcome a few design issues my clients have been facing.
For instance i figured it would be nice to be able to add additional css properties to widgets, instead of only being able to set the width/height in px/%. Another idea was to create a tab-container widget to accommodate other widgets while preserving the wiring.
Great ideas and all, but after starting the development of the latter i discovered there isn’t actually a plugin model for the CaseBuilder. Of course it is possible to develop widgets, but unfortunately the widget’s json only has a few preview-icons, when it comes to the design-time part.
Eventually i figured the only way to execute code was to inject a bootstrap as part of the widget title. Anyway, this is what i came up with:
My widget json:
{ "Name":"IvoJonker.nl - Widgets", "Description":"Custom widgets made by Ivo", "Locale":"", "Version":"1.0", "Categories":[ { "id":"nl.ivojonker.icm", "title":"IvoJonker.nl - Widgets" } ], "Widgets":[ { "id":"AdvancedLayoutingAdapterWidget", "title":"Advanced Layouting Adapter<img onload='require({paths:{\"AdvancedLayoutingAdapterBootstrap\": \"/AdvancedLayoutingAdapter/AdvancedLayoutingAdapterBootstrap\"}});require([\"AdvancedLayoutingAdapterBootstrap/bootstrap\"], function(bootstrap){});' src='data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'>", "category":"nl.ivojonker.icm", "description":"Advanced Layouting Adapter", "definition":"AdvancedLayoutingAdapter.json", "preview":"images/comment_preview.png", "icon":"images/comment_icon.png", "runtimeClassName":"nl.ivojonker.icm.advancedlayoutingadapter.AdvancedLayoutingAdapter", "help":"", "previewThumbnail":"images/comment_thumb.png" } ] }
Notice the javascript that is part of the title:
require({ paths: { "AdvancedLayoutingAdapterBootstrap": "/AdvancedLayoutingAdapter/AdvancedLayoutingAdapterBootstrap" } }); require(["AdvancedLayoutingAdapterBootstrap/bootstrap"], function(bootstrap) { });
So, wrapping it up: When the widget is displayed as part of the catalog, an image onload triggers the bootstrap code stored in an accomodating .ear file.
Now, as this hardly seems to be a future-proof way, i was wondering if any of my readers have better suggestions 🙂