with undefined tabIndex (To work around Win8 bug #622245)
- if ((_elms[i].tagName !== "DIV") || (_elms[i].getAttribute("tabIndex") !== null)) {
- _elms[i].focus();
-
- if (_elms[i] === _Global.document.activeElement) {
- break;
- }
- }
- }
- }
- },
-
- _focusOnFirstFocusableElementFromParent: function SettingsFlyout_focusOnFirstFocusableElementFromParent() {
- var active = _Global.document.activeElement;
- if (!active || !_ElementUtilities.hasClass(active, _Constants.finalDivClass)) {
- return;
- }
- var _elms = this.parentElement.getElementsByTagName("*");
-
- // There should be at least 1 element in addition to the firstDiv & finalDiv
- if (_elms.length <= 2) {
- return;
- }
-
- // Get the tabIndex set to the firstDiv (which is the lowest)
- var _lowestTabIndex = _elms[0].tabIndex;
-
- // If there are positive tabIndices, set focus to the element with the lowest tabIndex.
- // Otherwise set focus to the first focusable element in DOM order.
- var i;
- if (_lowestTabIndex) {
- for (i = 1; i < _elms.length - 1; i++) {
- if (_elms[i].tabIndex === _lowestTabIndex) {
- _elms[i].focus();
- break;
- }
- }
- } else {
- for (i = 1; i < _elms.length - 1; i++) {
- // Skip
with undefined tabIndex (To work around Win8 bug #622245)
- if ((_elms[i].tagName !== "DIV") || (_elms[i].getAttribute("tabIndex") !== null)) {
- _elms[i].focus();
-
- if (_elms[i] === _Global.document.activeElement) {
- break;
- }
- }
- }
- }
- },
-
- // Create and add a new first div to the beginning of the list
- _addFirstDiv: function SettingsFlyout_addFirstDiv() {
- var _elms = this._element.getElementsByTagName("*");
- var _minTab = 0;
- for (var i = 0; i < _elms.length; i++) {
- if ((0 < _elms[i].tabIndex) && (_minTab === 0 || _elms[i].tabIndex < _minTab)) {
- _minTab = _elms[i].tabIndex;
- }
- }
- var firstDiv = _Global.document.createElement("div");
- firstDiv.className = _Constants.firstDivClass;
- firstDiv.style.display = "inline";
- firstDiv.setAttribute("role", "menuitem");
- firstDiv.setAttribute("aria-hidden", "true");
- firstDiv.tabIndex = _minTab;
- _ElementUtilities._addEventListener(firstDiv, "focusin", this._focusOnLastFocusableElementFromParent, false);
-
- // add to beginning
- if (this._element.children[0]) {
- this._element.insertBefore(firstDiv, this._element.children[0]);
- } else {
- this._element.appendChild(firstDiv);
- }
- },
-
- // Create and add a new final div to the end of the list
- _addFinalDiv: function SettingsFlyout_addFinalDiv() {
- var _elms = this._element.getElementsByTagName("*");
- var _maxTab = 0;
- for (var i = 0; i < _elms.length; i++) {
- if (_elms[i].tabIndex > _maxTab) {
- _maxTab = _elms[i].tabIndex;
- }
- }
- var finalDiv = _Global.document.createElement("div");
- finalDiv.className = _Constants.finalDivClass;
- finalDiv.style.display = "inline";
- finalDiv.setAttribute("role", "menuitem");
- finalDiv.setAttribute("aria-hidden", "true");
- finalDiv.tabIndex = _maxTab;
- _ElementUtilities._addEventListener(finalDiv, "focusin", this._focusOnFirstFocusableElementFromParent, false);
-
- this._element.appendChild(finalDiv);
- },
-
- _writeProfilerMark: function SettingsFlyout_writeProfilerMark(text) {
- _WriteProfilerMark("WinJS.UI.SettingsFlyout:" + this._id + ":" + text);
- }
- });
-
- // Statics
- SettingsFlyout.show = function () {
- ///
- ///
- /// Shows the SettingsPane UI, if hidden, regardless of other states.
- ///
- ///
- ///
- /// Show the main settings pane
- if (_WinRT.Windows.UI.ApplicationSettings.SettingsPane) {
- _WinRT.Windows.UI.ApplicationSettings.SettingsPane.show();
- }
- // And hide the WWA one
- var elements = _Global.document.querySelectorAll('div[data-win-control="WinJS.UI.SettingsFlyout"]');
- var len = elements.length;
- for (var i = 0; i < len; i++) {
- var settingsFlyout = elements[i].winControl;
- if (settingsFlyout) {
- settingsFlyout._dismiss();
- }
- }
- };
-
- var _settingsEvent = { event: undefined };
- SettingsFlyout.populateSettings = function (e) {
- ///
- ///
- /// Loads a portion of the SettingsFlyout. Your app calls this when the user invokes a settings command and the WinJS.Application.onsettings event occurs.
- ///
- ///
- /// An object that contains information about the event, received from the WinJS.Application.onsettings event. The detail property of this object contains
- /// the applicationcommands sub-property that you set to an array of settings commands.
- ///
- ///
- ///
- _settingsEvent.event = e.detail;
-
- if (_settingsEvent.event.applicationcommands) {
- var n = _WinRT.Windows.UI.ApplicationSettings;
- Object.keys(_settingsEvent.event.applicationcommands).forEach(function (name) {
- var setting = _settingsEvent.event.applicationcommands[name];
- if (!setting.title) { setting.title = name; }
- var command = new n.SettingsCommand(name, setting.title, SettingsFlyout._onSettingsCommand);
- _settingsEvent.event.e.request.applicationCommands.append(command);
- });
- }
- };
-
- SettingsFlyout._onSettingsCommand = function (command) {
- var id = command.id;
- if (_settingsEvent.event.applicationcommands && _settingsEvent.event.applicationcommands[id]) {
- SettingsFlyout.showSettings(id, _settingsEvent.event.applicationcommands[id].href);
- }
- };
-
- SettingsFlyout.showSettings = function (id, path) {
- ///
- ///
- /// Show the SettingsFlyout using the settings element identifier (ID) and the path of the page that contains the settings element.
- ///
- ///
- /// The ID of the settings element.
- ///
- ///
- /// The path of the page that contains the settings element.
- ///
- ///
- ///
- var control = _getChildSettingsControl(_Global.document, id);
- if (control) {
- control.show();
- } else if (path) {
- var divElement = _Global.document.createElement("div");
- divElement = _Global.document.body.appendChild(divElement);
- Pages.render(path, divElement).then(function () {
- control = _getChildSettingsControl(divElement, id);
- if (control) {
- control._fragmentDiv = divElement;
- control.show();
- } else {
- _Global.document.body.removeChild(divElement);
- }
- });
- } else {
- throw new _ErrorFromName("WinJS.UI.SettingsFlyout.BadReference", strings.badReference);
- }
- };
-
- var strings = {
- get ariaLabel() { return _Resources._getWinJSString("ui/settingsFlyoutAriaLabel").value; },
- get badReference() { return "Invalid argument: Invalid href to settings flyout fragment"; },
- get backbuttonAriaLabel() { return _Resources._getWinJSString("ui/backbuttonarialabel").value; },
- get widthDeprecationMessage() { return "SettingsFlyout.width may be altered or unavailable in future versions. Instead, style the CSS width property on elements with the .win-settingsflyout class."; },
- get settingsFlyoutIsDeprecated() { return "SettingsFlyout is deprecated and may not be available in future releases. Instead, put settings on their own page within the app."; }
- };
-
- return SettingsFlyout;
- })
- });
-
-
-});
-
-// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/NavBar/_Command',[
- 'exports',
- '../../Core/_Global',
- '../../Core/_Base',
- '../../Core/_ErrorFromName',
- '../../Core/_Resources',
- '../../ControlProcessor',
- '../../Navigation',
- '../../Utilities/_Control',
- '../../Utilities/_ElementUtilities',
- '../AppBar/_Icon'
- ], function NavBarCommandInit(exports, _Global, _Base, _ErrorFromName, _Resources, ControlProcessor, Navigation, _Control, _ElementUtilities, _Icon) {
- "use strict";
-
- _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
- _WinPressed: _Base.Namespace._lazy(function () {
- var WinPressed = _Base.Class.define(function _WinPressed_ctor(element) {
- // WinPressed is the combination of :hover:active
- // :hover is delayed by trident for touch by 300ms so if you want :hover:active to work quickly you need to
- // use this behavior.
- // :active does not bubble to its parent like :hover does so this is also useful for that scenario.
- this._element = element;
- _ElementUtilities._addEventListener(this._element, "pointerdown", this._MSPointerDownButtonHandler.bind(this));
- }, {
- _MSPointerDownButtonHandler: function _WinPressed_MSPointerDownButtonHandler(ev) {
- if (!this._pointerUpBound) {
- this._pointerUpBound = this._MSPointerUpHandler.bind(this);
- this._pointerCancelBound = this._MSPointerCancelHandler.bind(this);
- this._pointerOverBound = this._MSPointerOverHandler.bind(this);
- this._pointerOutBound = this._MSPointerOutHandler.bind(this);
- }
-
- if (ev.isPrimary) {
- if (this._pointerId) {
- this._resetPointer();
- }
-
- if (!_ElementUtilities._matchesSelector(ev.target, ".win-interactive, .win-interactive *")) {
- this._pointerId = ev.pointerId;
-
- _ElementUtilities._addEventListener(_Global, "pointerup", this._pointerUpBound, true);
- _ElementUtilities._addEventListener(_Global, "pointercancel", this._pointerCancelBound), true;
- _ElementUtilities._addEventListener(this._element, "pointerover", this._pointerOverBound, true);
- _ElementUtilities._addEventListener(this._element, "pointerout", this._pointerOutBound, true);
-
- _ElementUtilities.addClass(this._element, WinPressed.winPressed);
- }
- }
- },
-
- _MSPointerOverHandler: function _WinPressed_MSPointerOverHandler(ev) {
- if (this._pointerId === ev.pointerId) {
- _ElementUtilities.addClass(this._element, WinPressed.winPressed);
- }
- },
-
- _MSPointerOutHandler: function _WinPressed_MSPointerOutHandler(ev) {
- if (this._pointerId === ev.pointerId) {
- _ElementUtilities.removeClass(this._element, WinPressed.winPressed);
- }
- },
-
- _MSPointerCancelHandler: function _WinPressed_MSPointerCancelHandler(ev) {
- if (this._pointerId === ev.pointerId) {
- this._resetPointer();
- }
- },
-
- _MSPointerUpHandler: function _WinPressed_MSPointerUpHandler(ev) {
- if (this._pointerId === ev.pointerId) {
- this._resetPointer();
- }
- },
-
- _resetPointer: function _WinPressed_resetPointer() {
- this._pointerId = null;
-
- _ElementUtilities._removeEventListener(_Global, "pointerup", this._pointerUpBound, true);
- _ElementUtilities._removeEventListener(_Global, "pointercancel", this._pointerCancelBound, true);
- _ElementUtilities._removeEventListener(this._element, "pointerover", this._pointerOverBound, true);
- _ElementUtilities._removeEventListener(this._element, "pointerout", this._pointerOutBound, true);
-
- _ElementUtilities.removeClass(this._element, WinPressed.winPressed);
- },
-
- dispose: function _WinPressed_dispose() {
- if (this._disposed) {
- return;
- }
- this._disposed = true;
-
- this._resetPointer();
- }
- }, {
- winPressed: "win-pressed"
- });
-
- return WinPressed;
- }),
- ///
- ///
- /// Represents a navigation command in an NavBarContainer.
- ///
- ///
- ///
- ///
- ///
- ///
]]>
- ///
Styles the entire NavBarCommand control.
- ///
Styles the main button in a NavBarCommand.
- ///
Styles the split button in a NavBarCommand
- ///
Styles the icon in the main button of a NavBarCommand.
- ///
Styles the label in the main button of a NavBarCommand.
- ///
- ///
- NavBarCommand: _Base.Namespace._lazy(function () {
- var Key = _ElementUtilities.Key;
-
- var strings = {
- get duplicateConstruction() { return "Invalid argument: Controls may only be instantiated one time for each DOM element"; }
- };
-
- var NavBarCommand = _Base.Class.define(function NavBarCommand_ctor(element, options) {
- ///
- ///
- /// Creates a new NavBarCommand.
- ///
- ///
- /// The DOM element that will host the new NavBarCommand control.
- ///
- ///
- /// An object that contains one or more property/value pairs to apply to the new control.
- /// Each property of the options object corresponds to one of the control's properties or events.
- /// Event names must begin with "on".
- ///
- ///
- /// The new NavBarCommand.
- ///
- ///
- ///
- element = element || _Global.document.createElement("DIV");
- options = options || {};
-
- if (element.winControl) {
- throw new _ErrorFromName("WinJS.UI.NavBarCommand.DuplicateConstruction", strings.duplicateConstruction);
- }
-
- // Attaching JS control to DOM element
- element.winControl = this;
- this._element = element;
- _ElementUtilities.addClass(this.element, NavBarCommand._ClassName.navbarcommand);
- _ElementUtilities.addClass(this.element, "win-disposable");
-
- this._tooltip = null;
- this._splitOpened = false;
- this._buildDom();
- element.addEventListener('keydown', this._keydownHandler.bind(this));
-
- _Control.setOptions(this, options);
- }, {
- ///
- /// Gets the DOM element that hosts the NavBarCommand.
- ///
- ///
- element: {
- get: function () {
- return this._element;
- }
- },
-
- ///
- /// Gets or sets the label of the NavBarCommand.
- ///
- ///
- label: {
- get: function () {
- return this._label;
- },
- set: function (value) {
- this._label = value;
- this._labelEl.textContent = value;
- }
- },
-
- ///
- /// Gets or sets the tooltip of the NavBarCommand.
- ///
- ///
- tooltip: {
- get: function () {
- return this._tooltip;
- },
- set: function (value) {
- this._tooltip = value;
- if (this._tooltip || this._tooltip === "") {
- this._element.setAttribute('title', this._tooltip);
- } else {
- this._element.removeAttribute('title');
- }
- }
- },
-
- ///
- /// Gets or sets the icon of the NavBarCommand. This value is either one of the values of the AppBarIcon enumeration or the path of a custom PNG file.
- ///
- ///
- icon: {
- get: function () {
- return this._icon;
- },
- set: function (value) {
- this._icon = (_Icon[value] || value);
-
- // If the icon's a single character, presume a glyph
- if (this._icon && this._icon.length === 1) {
- // Set the glyph
- this._imageSpan.textContent = this._icon;
- this._imageSpan.style.backgroundImage = "";
- this._imageSpan.style.msHighContrastAdjust = "";
- this._imageSpan.style.display = "";
- } else if (this._icon && this._icon.length > 1) {
- // Must be an image, set that
- this._imageSpan.textContent = "";
- this._imageSpan.style.backgroundImage = this._icon;
- this._imageSpan.style.msHighContrastAdjust = "none";
- this._imageSpan.style.display = "";
- } else {
- this._imageSpan.textContent = "";
- this._imageSpan.style.backgroundImage = "";
- this._imageSpan.style.msHighContrastAdjust = "";
- this._imageSpan.style.display = "none";
- }
- }
- },
-
- ///
- /// Gets or sets the command's target location.
- ///
- ///
- location: {
- get: function () {
- return this._location;
- },
- set: function (value) {
- this._location = value;
- }
- },
-
- ///
- /// Gets or sets the state value used for navigation. The command passes this object to the WinJS.Navigation.navigate function.
- ///
- ///
- state: {
- get: function () {
- return this._state;
- },
- set: function (value) {
- this._state = value;
- }
- },
-
- ///
- /// Gets or sets a value that specifies whether the NavBarCommand has a split button.
- ///
- ///
- splitButton: {
- get: function () {
- return this._split;
- },
- set: function (value) {
- this._split = value;
- if (this._split) {
- this._splitButtonEl.style.display = "";
- } else {
- this._splitButtonEl.style.display = "none";
- }
- }
- },
-
- ///
- /// Gets or sets a value that specifies whether the split button is open.
- ///
- ///
- splitOpened: {
- get: function () {
- return this._splitOpened;
- },
- set: function (value) {
- if (this._splitOpened !== !!value) {
- this._toggleSplit();
- }
- }
- },
-
- _toggleSplit: function NavBarCommand_toggleSplit() {
- this._splitOpened = !this._splitOpened;
- if (this._splitOpened) {
- _ElementUtilities.addClass(this._splitButtonEl, NavBarCommand._ClassName.navbarcommandsplitbuttonopened);
- this._splitButtonEl.setAttribute("aria-expanded", "true");
- } else {
- _ElementUtilities.removeClass(this._splitButtonEl, NavBarCommand._ClassName.navbarcommandsplitbuttonopened);
- this._splitButtonEl.setAttribute("aria-expanded", "false");
- }
- this._fireEvent(NavBarCommand._EventName._splitToggle);
- },
-
- _rtl: {
- get: function () {
- return _Global.getComputedStyle(this.element).direction === "rtl";
- }
- },
-
- _keydownHandler: function NavBarCommand_keydownHandler(ev) {
- if (_ElementUtilities._matchesSelector(ev.target, ".win-interactive, .win-interactive *")) {
- return;
- }
-
- var leftStr = this._rtl ? Key.rightArrow : Key.leftArrow;
- var rightStr = this._rtl ? Key.leftArrow : Key.rightArrow;
-
- if (!ev.altKey && (ev.keyCode === leftStr || ev.keyCode === Key.home || ev.keyCode === Key.end) && ev.target === this._splitButtonEl) {
- _ElementUtilities._setActive(this._buttonEl);
- if (ev.keyCode === leftStr) {
- ev.stopPropagation();
- }
- ev.preventDefault();
- } else if (!ev.altKey && ev.keyCode === rightStr && this.splitButton && (ev.target === this._buttonEl || this._buttonEl.contains(ev.target))) {
- _ElementUtilities._setActive(this._splitButtonEl);
- if (ev.keyCode === rightStr) {
- ev.stopPropagation();
- }
- ev.preventDefault();
- } else if ((ev.keyCode === Key.space || ev.keyCode === Key.enter) && (ev.target === this._buttonEl || this._buttonEl.contains(ev.target))) {
- if (this.location) {
- Navigation.navigate(this.location, this.state);
- }
- this._fireEvent(NavBarCommand._EventName._invoked);
- } else if ((ev.keyCode === Key.space || ev.keyCode === Key.enter) && ev.target === this._splitButtonEl) {
- this._toggleSplit();
- }
- },
-
- _getFocusInto: function NavBarCommand_getFocusInto(keyCode) {
- var leftStr = this._rtl ? Key.rightArrow : Key.leftArrow;
- if ((keyCode === leftStr) && this.splitButton) {
- return this._splitButtonEl;
- } else {
- return this._buttonEl;
- }
- },
-
- _buildDom: function NavBarCommand_buildDom() {
- var markup =
- '
' +
- '
';
- this.element.insertAdjacentHTML("afterBegin", markup);
-
- this._buttonEl = this.element.firstElementChild;
- this._buttonPressedBehavior = new exports._WinPressed(this._buttonEl);
- this._contentEl = this._buttonEl.firstElementChild;
- this._imageSpan = this._contentEl.firstElementChild;
- this._imageSpan.style.display = "none";
- this._labelEl = this._imageSpan.nextElementSibling;
- this._splitButtonEl = this._buttonEl.nextElementSibling;
- this._splitButtonPressedBehavior = new exports._WinPressed(this._splitButtonEl);
- this._splitButtonEl.style.display = "none";
-
- _ElementUtilities._ensureId(this._buttonEl);
- this._splitButtonEl.setAttribute("aria-labelledby", this._buttonEl.id);
-
- this._buttonEl.addEventListener("click", this._handleButtonClick.bind(this));
-
- var mutationObserver = new _ElementUtilities._MutationObserver(this._splitButtonAriaExpandedPropertyChangeHandler.bind(this));
- mutationObserver.observe(this._splitButtonEl, { attributes: true, attributeFilter: ["aria-expanded"] });
- this._splitButtonEl.addEventListener("click", this._handleSplitButtonClick.bind(this));
-
- // reparent any other elements.
- var tempEl = this._splitButtonEl.nextSibling;
- while (tempEl) {
- this._buttonEl.insertBefore(tempEl, this._contentEl);
- if (tempEl.nodeName !== "#text") {
- ControlProcessor.processAll(tempEl);
- }
- tempEl = this._splitButtonEl.nextSibling;
- }
- },
-
- _handleButtonClick: function NavBarCommand_handleButtonClick(ev) {
- var srcElement = ev.target;
- if (!_ElementUtilities._matchesSelector(srcElement, ".win-interactive, .win-interactive *")) {
- if (this.location) {
- Navigation.navigate(this.location, this.state);
- }
- this._fireEvent(NavBarCommand._EventName._invoked);
- }
- },
-
- _splitButtonAriaExpandedPropertyChangeHandler: function NavBarCommand_splitButtonAriaExpandedPropertyChangeHandler() {
- if ((this._splitButtonEl.getAttribute("aria-expanded") === "true") !== this._splitOpened) {
- this._toggleSplit();
- }
- },
-
- _handleSplitButtonClick: function NavBarCommand_handleSplitButtonClick() {
- this._toggleSplit();
- },
-
- _fireEvent: function NavBarCommand_fireEvent(type, detail) {
- var event = _Global.document.createEvent("CustomEvent");
- event.initCustomEvent(type, true, false, detail);
- this.element.dispatchEvent(event);
- },
-
- dispose: function NavBarCommand_dispose() {
- ///
- ///
- /// Disposes this control.
- ///
- ///
- ///
- if (this._disposed) {
- return;
- }
- this._disposed = true;
-
- this._buttonPressedBehavior.dispose();
- this._splitButtonPressedBehavior.dispose();
- }
- }, {
- _ClassName: {
- navbarcommand: "win-navbarcommand",
- navbarcommandbutton: "win-navbarcommand-button",
- navbarcommandbuttoncontent: "win-navbarcommand-button-content",
- navbarcommandsplitbutton: "win-navbarcommand-splitbutton",
- navbarcommandsplitbuttonopened: "win-navbarcommand-splitbutton-opened",
- navbarcommandicon: "win-navbarcommand-icon",
- navbarcommandlabel: "win-navbarcommand-label"
- },
- _EventName: {
- _invoked: "_invoked",
- _splitToggle: "_splittoggle"
- }
- });
- _Base.Class.mix(NavBarCommand, _Control.DOMEventMixin);
- return NavBarCommand;
- })
- });
-
-});
-// Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/NavBar/_Container',[
- 'exports',
- '../../Core/_Global',
- '../../Core/_Base',
- '../../Core/_BaseUtils',
- '../../Core/_ErrorFromName',
- '../../Core/_Events',
- '../../Core/_Log',
- '../../Core/_Resources',
- '../../Core/_WriteProfilerMark',
- '../../Animations',
- '../../Animations/_TransitionAnimation',
- '../../BindingList',
- '../../ControlProcessor',
- '../../Navigation',
- '../../Promise',
- '../../Scheduler',
- '../../Utilities/_Control',
- '../../Utilities/_ElementUtilities',
- '../../Utilities/_KeyboardBehavior',
- '../../Utilities/_UI',
- '../_LegacyAppBar/_Constants',
- '../Repeater',
- './_Command'
-], function NavBarContainerInit(exports, _Global, _Base, _BaseUtils, _ErrorFromName, _Events, _Log, _Resources, _WriteProfilerMark, Animations, _TransitionAnimation, BindingList, ControlProcessor, Navigation, Promise, Scheduler, _Control, _ElementUtilities, _KeyboardBehavior, _UI, _Constants, Repeater, _Command) {
- "use strict";
-
- function nobodyHasFocus() {
- return _Global.document.activeElement === null || _Global.document.activeElement === _Global.document.body;
- }
-
- _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
- ///
- ///
- /// Contains a group of NavBarCommand objects in a NavBar.
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- /// ]]>
- ///