2018-10-23 01:05:09 +03:00
|
|
|
define(["viewcontainer", "focusManager", "queryString", "layoutManager"], function(viewcontainer, focusManager, queryString, layoutManager) {
|
|
|
|
"use strict";
|
|
|
|
|
|
|
|
function onViewChange(view, options, isRestore) {
|
|
|
|
var lastView = currentView;
|
|
|
|
lastView && dispatchViewEvent(lastView, null, "viewhide"), currentView = view;
|
|
|
|
var eventDetail = getViewEventDetail(view, options, isRestore);
|
|
|
|
isRestore ? layoutManager.mobile || (view.activeElement && document.body.contains(view.activeElement) && focusManager.isCurrentlyFocusable(view.activeElement) ? focusManager.focus(view.activeElement) : focusManager.autoFocus(view)) : !1 !== options.autoFocus && focusManager.autoFocus(view), view.dispatchEvent(new CustomEvent("viewshow", eventDetail)), dispatchPageEvents && view.dispatchEvent(new CustomEvent("pageshow", eventDetail))
|
|
|
|
}
|
|
|
|
|
|
|
|
function getProperties(view) {
|
|
|
|
var props = view.getAttribute("data-properties");
|
|
|
|
return props ? props.split(",") : []
|
|
|
|
}
|
|
|
|
|
|
|
|
function dispatchViewEvent(view, eventInfo, eventName, isCancellable) {
|
|
|
|
eventInfo || (eventInfo = {
|
|
|
|
detail: {
|
|
|
|
type: view.getAttribute("data-type"),
|
|
|
|
properties: getProperties(view)
|
|
|
|
},
|
|
|
|
bubbles: !0,
|
|
|
|
cancelable: isCancellable
|
|
|
|
}), eventInfo.cancelable = isCancellable || !1;
|
|
|
|
var eventResult = view.dispatchEvent(new CustomEvent(eventName, eventInfo));
|
|
|
|
return dispatchPageEvents && (eventInfo.cancelable = !1, view.dispatchEvent(new CustomEvent(eventName.replace("view", "page"), eventInfo))), eventResult
|
|
|
|
}
|
|
|
|
|
|
|
|
function getViewEventDetail(view, options, isRestore) {
|
|
|
|
var url = options.url,
|
|
|
|
index = url.indexOf("?"),
|
|
|
|
params = -1 === index ? {} : queryString.parse(url.substring(index + 1));
|
|
|
|
return {
|
|
|
|
detail: {
|
|
|
|
type: view.getAttribute("data-type"),
|
|
|
|
properties: getProperties(view),
|
|
|
|
params: params,
|
|
|
|
isRestored: isRestore,
|
|
|
|
state: options.state,
|
|
|
|
options: options.options || {}
|
|
|
|
},
|
|
|
|
bubbles: !0,
|
|
|
|
cancelable: !1
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function resetCachedViews() {
|
|
|
|
viewcontainer.reset()
|
|
|
|
}
|
|
|
|
|
|
|
|
function ViewManager() {}
|
|
|
|
var currentView, dispatchPageEvents;
|
|
|
|
return viewcontainer.setOnBeforeChange(function(newView, isRestored, options) {
|
|
|
|
var lastView = currentView;
|
|
|
|
if (lastView) {
|
|
|
|
dispatchViewEvent(lastView, null, "viewbeforehide", !0)
|
|
|
|
}
|
|
|
|
var eventDetail = getViewEventDetail(newView, options, isRestored);
|
|
|
|
if (!newView.initComplete) {
|
|
|
|
if (newView.initComplete = !0, options.controllerFactory) {
|
|
|
|
new options.controllerFactory(newView, eventDetail.detail.params)
|
|
|
|
}
|
|
|
|
options.controllerFactory && !dispatchPageEvents || dispatchViewEvent(newView, eventDetail, "viewinit")
|
|
|
|
}
|
|
|
|
dispatchViewEvent(newView, eventDetail, "viewbeforeshow")
|
|
|
|
}), document.addEventListener("skinunload", resetCachedViews), ViewManager.prototype.loadView = function(options) {
|
|
|
|
var lastView = currentView;
|
|
|
|
lastView && (lastView.activeElement = document.activeElement), options.cancel || viewcontainer.loadView(options).then(function(view) {
|
|
|
|
onViewChange(view, options)
|
|
|
|
})
|
|
|
|
}, ViewManager.prototype.tryRestoreView = function(options, onViewChanging) {
|
|
|
|
return options.cancel ? Promise.reject({
|
|
|
|
cancelled: !0
|
|
|
|
}) : (currentView && (currentView.activeElement = document.activeElement), viewcontainer.tryRestoreView(options).then(function(view) {
|
|
|
|
onViewChanging(), onViewChange(view, options, !0)
|
|
|
|
}))
|
|
|
|
}, ViewManager.prototype.currentView = function() {
|
|
|
|
return currentView
|
|
|
|
}, ViewManager.prototype.dispatchPageEvents = function(value) {
|
|
|
|
dispatchPageEvents = value
|
|
|
|
}, new ViewManager
|
|
|
|
});
|