At the DOM manipulation level, this is made largely possible by our adoption of IE10 for Orion 2.0, since it includes many HTML5 features that were not available in in IE9. Since we no longer need to rely on shims and other workarounds for missing features, we should be able to use the browser native API for things like events, CSS class manipulation, etc.
For UI components, or widgets, that we need in the UI, we will look at existing small, library-independent implementations of the functionality, as well as considering our own implementation. Any custom implementations should be as small/simplified as possible, satisfying Orion use cases but not starting out with the intention to be an independently consumable component.
This document outlines what would be needed to reduce or eliminate our dependence on dojo in favor of these other approaches.
- 1 Advantages of library independence
- 2 Existing dependencies and proposed replacements
Advantages of library independence
- Orion consumers who use the same libraries as us (such as dojo) wish to switch versions at their own pace.
- Simplified learning curve for consumers
- theming doesn't require understanding of a separate library/widget level theming mechanism
- we don't force consumers to learn multiple conventions/life cycles in the UI (dijit lifecycle vs. Orion, dijit layout vs. raw CSS, etc.).
Existing dependencies and proposed replacements
The remainder of this document categorizes our dependencies and gives status on the replacement candidates.
We extensively use the dojo.* utility methods. Many of these are now available in our supported browser set. The following list shows method usage and replacement. A small library (orion/webui/littlelib) implements a few methods. Examples referring to "lib" are using this module.
document.getElementById(id); lib.node(id); // when you aren't sure if you have an id or node, useful for inbound API calls
element.querySelector(selector, parentNode); element.querySelectorAll(selector, parentNode); lib.$(selector, parentNode); // one node lib.$$(selector, parentNode); // node list lib.$$array(selector.parentNode); // array of nodes
- dojo.addClass, removeClass, toggleClass
element.classList.add('class'); // one at a time element.classList.remove('class'); element.classList.contains('class'); element.classList.toggle('class');
element.style.visibility = "hidden"; element.style.left = "1px";
For node placement, use the addChild/appendChild/insertBefore DOM equivalents. If placing HTML, use innerHTML, or convert to dynamic DOM node creation when security is an issue.
(See bug bug 392469 for security discussion).
- dojo.attr, removeAttr
- dojo.hitch Function.bind
- dojo.keys constants
hash and hash change
- dojo.hash, hashchange events - use HTML5 equivalents. window.location.hash contains the # whereas dojo.hash() did not
- dojo.string substitution (use i18nUtil.formatMessage)
Deferred / Promise support
- dojo.Deferred (use orion.Deferred)
dijit Menu support
- bug 393813
- replace dijit.Dialogs with simple div-based equivalent
- client templating of content
- conversion of all existing Orion dijit dialogs (approximately 20)
- small js add-ons for special features
- modal support
- lightweight, automatic dismissal
dijit Layout support
- Replace common page use of dijit BorderContainer, ContentPane, Splitter
- Settings page uses custom dijit layouts
- Some pages (compare, shell) use internal dijit layout such as BorderContainer
Orion custom dijits
- domain-specific widgets don't need a framework, replace with application level code
- plugin related widgets (plugin entry, plugin list, service carousel)
- site editor
- settings layout widgets replaced with CSS/splitter (SettingsContainer, SplitSelectionLayout)
- settings custom field widgets (TextField, Select, Toggles, Buttoms) replaced with HTML5 dom elements
- settings section moved to existing Orion section support
move unused dijit-based experiments out of orion repository
- plugin maker