Created
October 19, 2017 19:36
-
-
Save m1dnight/8197009aef479ccad32ff8d55345ea19 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function() { | |
'use strict'; | |
var globals = typeof global === 'undefined' ? self : global; | |
if (typeof globals.require === 'function') return; | |
var modules = {}; | |
var cache = {}; | |
var aliases = {}; | |
var has = {}.hasOwnProperty; | |
var expRe = /^\.\.?(\/|$)/; | |
var expand = function(root, name) { | |
var results = [], part; | |
var parts = (expRe.test(name) ? root + '/' + name : name).split('/'); | |
for (var i = 0, length = parts.length; i < length; i++) { | |
part = parts[i]; | |
if (part === '..') { | |
results.pop(); | |
} else if (part !== '.' && part !== '') { | |
results.push(part); | |
} | |
} | |
return results.join('/'); | |
}; | |
var dirname = function(path) { | |
return path.split('/').slice(0, -1).join('/'); | |
}; | |
var localRequire = function(path) { | |
return function expanded(name) { | |
var absolute = expand(dirname(path), name); | |
return globals.require(absolute, path); | |
}; | |
}; | |
var initModule = function(name, definition) { | |
var hot = hmr && hmr.createHot(name); | |
var module = {id: name, exports: {}, hot: hot}; | |
cache[name] = module; | |
definition(module.exports, localRequire(name), module); | |
return module.exports; | |
}; | |
var expandAlias = function(name) { | |
return aliases[name] ? expandAlias(aliases[name]) : name; | |
}; | |
var _resolve = function(name, dep) { | |
return expandAlias(expand(dirname(name), dep)); | |
}; | |
var require = function(name, loaderPath) { | |
if (loaderPath == null) loaderPath = '/'; | |
var path = expandAlias(name); | |
if (has.call(cache, path)) return cache[path].exports; | |
if (has.call(modules, path)) return initModule(path, modules[path]); | |
throw new Error("Cannot find module '" + name + "' from '" + loaderPath + "'"); | |
}; | |
require.alias = function(from, to) { | |
aliases[to] = from; | |
}; | |
var extRe = /\.[^.\/]+$/; | |
var indexRe = /\/index(\.[^\/]+)?$/; | |
var addExtensions = function(bundle) { | |
if (extRe.test(bundle)) { | |
var alias = bundle.replace(extRe, ''); | |
if (!has.call(aliases, alias) || aliases[alias].replace(extRe, '') === alias + '/index') { | |
aliases[alias] = bundle; | |
} | |
} | |
if (indexRe.test(bundle)) { | |
var iAlias = bundle.replace(indexRe, ''); | |
if (!has.call(aliases, iAlias)) { | |
aliases[iAlias] = bundle; | |
} | |
} | |
}; | |
require.register = require.define = function(bundle, fn) { | |
if (bundle && typeof bundle === 'object') { | |
for (var key in bundle) { | |
if (has.call(bundle, key)) { | |
require.register(key, bundle[key]); | |
} | |
} | |
} else { | |
modules[bundle] = fn; | |
delete cache[bundle]; | |
addExtensions(bundle); | |
} | |
}; | |
require.list = function() { | |
var list = []; | |
for (var item in modules) { | |
if (has.call(modules, item)) { | |
list.push(item); | |
} | |
} | |
return list; | |
}; | |
var hmr = globals._hmr && new globals._hmr(_resolve, require, modules, cache); | |
require._cache = cache; | |
require.hmr = hmr && hmr.wrap; | |
require.brunch = true; | |
globals.require = require; | |
})(); | |
(function() { | |
var global = typeof window === 'undefined' ? this : window; | |
var __makeRelativeRequire = function(require, mappings, pref) { | |
var none = {}; | |
var tryReq = function(name, pref) { | |
var val; | |
try { | |
val = require(pref + '/node_modules/' + name); | |
return val; | |
} catch (e) { | |
if (e.toString().indexOf('Cannot find module') === -1) { | |
throw e; | |
} | |
if (pref.indexOf('node_modules') !== -1) { | |
var s = pref.split('/'); | |
var i = s.lastIndexOf('node_modules'); | |
var newPref = s.slice(0, i).join('/'); | |
return tryReq(name, newPref); | |
} | |
} | |
return none; | |
}; | |
return function(name) { | |
if (name in mappings) name = mappings[name]; | |
if (!name) return; | |
if (name[0] !== '.' && pref) { | |
var val = tryReq(name, pref); | |
if (val !== none) return val; | |
} | |
return require(name); | |
} | |
}; | |
require.register("phoenix/priv/static/phoenix.js", function(exports, require, module) { | |
require = __makeRelativeRequire(require, {}, "phoenix"); | |
(function() { | |
(function(exports){ | |
"use strict"; | |
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; | |
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | |
Object.defineProperty(exports, "__esModule", { | |
value: true | |
}); | |
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } | |
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | |
// Phoenix Channels JavaScript client | |
// | |
// ## Socket Connection | |
// | |
// A single connection is established to the server and | |
// channels are multiplexed over the connection. | |
// Connect to the server using the `Socket` class: | |
// | |
// let socket = new Socket("/ws", {params: {userToken: "123"}}) | |
// socket.connect() | |
// | |
// The `Socket` constructor takes the mount point of the socket, | |
// the authentication params, as well as options that can be found in | |
// the Socket docs, such as configuring the `LongPoll` transport, and | |
// heartbeat. | |
// | |
// ## Channels | |
// | |
// Channels are isolated, concurrent processes on the server that | |
// subscribe to topics and broker events between the client and server. | |
// To join a channel, you must provide the topic, and channel params for | |
// authorization. Here's an example chat room example where `"new_msg"` | |
// events are listened for, messages are pushed to the server, and | |
// the channel is joined with ok/error/timeout matches: | |
// | |
// let channel = socket.channel("room:123", {token: roomToken}) | |
// channel.on("new_msg", msg => console.log("Got message", msg) ) | |
// $input.onEnter( e => { | |
// channel.push("new_msg", {body: e.target.val}, 10000) | |
// .receive("ok", (msg) => console.log("created message", msg) ) | |
// .receive("error", (reasons) => console.log("create failed", reasons) ) | |
// .receive("timeout", () => console.log("Networking issue...") ) | |
// }) | |
// channel.join() | |
// .receive("ok", ({messages}) => console.log("catching up", messages) ) | |
// .receive("error", ({reason}) => console.log("failed join", reason) ) | |
// .receive("timeout", () => console.log("Networking issue. Still waiting...") ) | |
// | |
// | |
// ## Joining | |
// | |
// Creating a channel with `socket.channel(topic, params)`, binds the params to | |
// `channel.params`, which are sent up on `channel.join()`. | |
// Subsequent rejoins will send up the modified params for | |
// updating authorization params, or passing up last_message_id information. | |
// Successful joins receive an "ok" status, while unsuccessful joins | |
// receive "error". | |
// | |
// ## Duplicate Join Subscriptions | |
// | |
// While the client may join any number of topics on any number of channels, | |
// the client may only hold a single subscription for each unique topic at any | |
// given time. When attempting to create a duplicate subscription, | |
// the server will close the existing channel, log a warning, and | |
// spawn a new channel for the topic. The client will have their | |
// `channel.onClose` callbacks fired for the existing channel, and the new | |
// channel join will have its receive hooks processed as normal. | |
// | |
// ## Pushing Messages | |
// | |
// From the previous example, we can see that pushing messages to the server | |
// can be done with `channel.push(eventName, payload)` and we can optionally | |
// receive responses from the push. Additionally, we can use | |
// `receive("timeout", callback)` to abort waiting for our other `receive` hooks | |
// and take action after some period of waiting. The default timeout is 5000ms. | |
// | |
// | |
// ## Socket Hooks | |
// | |
// Lifecycle events of the multiplexed connection can be hooked into via | |
// `socket.onError()` and `socket.onClose()` events, ie: | |
// | |
// socket.onError( () => console.log("there was an error with the connection!") ) | |
// socket.onClose( () => console.log("the connection dropped") ) | |
// | |
// | |
// ## Channel Hooks | |
// | |
// For each joined channel, you can bind to `onError` and `onClose` events | |
// to monitor the channel lifecycle, ie: | |
// | |
// channel.onError( () => console.log("there was an error!") ) | |
// channel.onClose( () => console.log("the channel has gone away gracefully") ) | |
// | |
// ### onError hooks | |
// | |
// `onError` hooks are invoked if the socket connection drops, or the channel | |
// crashes on the server. In either case, a channel rejoin is attempted | |
// automatically in an exponential backoff manner. | |
// | |
// ### onClose hooks | |
// | |
// `onClose` hooks are invoked only in two cases. 1) the channel explicitly | |
// closed on the server, or 2). The client explicitly closed, by calling | |
// `channel.leave()` | |
// | |
// | |
// ## Presence | |
// | |
// The `Presence` object provides features for syncing presence information | |
// from the server with the client and handling presences joining and leaving. | |
// | |
// ### Syncing initial state from the server | |
// | |
// `Presence.syncState` is used to sync the list of presences on the server | |
// with the client's state. An optional `onJoin` and `onLeave` callback can | |
// be provided to react to changes in the client's local presences across | |
// disconnects and reconnects with the server. | |
// | |
// `Presence.syncDiff` is used to sync a diff of presence join and leave | |
// events from the server, as they happen. Like `syncState`, `syncDiff` | |
// accepts optional `onJoin` and `onLeave` callbacks to react to a user | |
// joining or leaving from a device. | |
// | |
// ### Listing Presences | |
// | |
// `Presence.list` is used to return a list of presence information | |
// based on the local state of metadata. By default, all presence | |
// metadata is returned, but a `listBy` function can be supplied to | |
// allow the client to select which metadata to use for a given presence. | |
// For example, you may have a user online from different devices with a | |
// a metadata status of "online", but they have set themselves to "away" | |
// on another device. In this case, they app may choose to use the "away" | |
// status for what appears on the UI. The example below defines a `listBy` | |
// function which prioritizes the first metadata which was registered for | |
// each user. This could be the first tab they opened, or the first device | |
// they came online from: | |
// | |
// let state = {} | |
// state = Presence.syncState(state, stateFromServer) | |
// let listBy = (id, {metas: [first, ...rest]}) => { | |
// first.count = rest.length + 1 // count of this user's presences | |
// first.id = id | |
// return first | |
// } | |
// let onlineUsers = Presence.list(state, listBy) | |
// | |
// | |
// ### Example Usage | |
// | |
// // detect if user has joined for the 1st time or from another tab/device | |
// let onJoin = (id, current, newPres) => { | |
// if(!current){ | |
// console.log("user has entered for the first time", newPres) | |
// } else { | |
// console.log("user additional presence", newPres) | |
// } | |
// } | |
// // detect if user has left from all tabs/devices, or is still present | |
// let onLeave = (id, current, leftPres) => { | |
// if(current.metas.length === 0){ | |
// console.log("user has left from all devices", leftPres) | |
// } else { | |
// console.log("user left from a device", leftPres) | |
// } | |
// } | |
// let presences = {} // client's initial empty presence state | |
// // receive initial presence data from server, sent after join | |
// myChannel.on("presences", state => { | |
// presences = Presence.syncState(presences, state, onJoin, onLeave) | |
// displayUsers(Presence.list(presences)) | |
// }) | |
// // receive "presence_diff" from server, containing join/leave events | |
// myChannel.on("presence_diff", diff => { | |
// presences = Presence.syncDiff(presences, diff, onJoin, onLeave) | |
// this.setState({users: Presence.list(room.presences, listBy)}) | |
// }) | |
// | |
var VSN = "1.0.0"; | |
var SOCKET_STATES = { connecting: 0, open: 1, closing: 2, closed: 3 }; | |
var DEFAULT_TIMEOUT = 10000; | |
var CHANNEL_STATES = { | |
closed: "closed", | |
errored: "errored", | |
joined: "joined", | |
joining: "joining", | |
leaving: "leaving" | |
}; | |
var CHANNEL_EVENTS = { | |
close: "phx_close", | |
error: "phx_error", | |
join: "phx_join", | |
reply: "phx_reply", | |
leave: "phx_leave" | |
}; | |
var TRANSPORTS = { | |
longpoll: "longpoll", | |
websocket: "websocket" | |
}; | |
var Push = function () { | |
// Initializes the Push | |
// | |
// channel - The Channel | |
// event - The event, for example `"phx_join"` | |
// payload - The payload, for example `{user_id: 123}` | |
// timeout - The push timeout in milliseconds | |
// | |
function Push(channel, event, payload, timeout) { | |
_classCallCheck(this, Push); | |
this.channel = channel; | |
this.event = event; | |
this.payload = payload || {}; | |
this.receivedResp = null; | |
this.timeout = timeout; | |
this.timeoutTimer = null; | |
this.recHooks = []; | |
this.sent = false; | |
} | |
_createClass(Push, [{ | |
key: "resend", | |
value: function resend(timeout) { | |
this.timeout = timeout; | |
this.cancelRefEvent(); | |
this.ref = null; | |
this.refEvent = null; | |
this.receivedResp = null; | |
this.sent = false; | |
this.send(); | |
} | |
}, { | |
key: "send", | |
value: function send() { | |
if (this.hasReceived("timeout")) { | |
return; | |
} | |
this.startTimeout(); | |
this.sent = true; | |
this.channel.socket.push({ | |
topic: this.channel.topic, | |
event: this.event, | |
payload: this.payload, | |
ref: this.ref | |
}); | |
} | |
}, { | |
key: "receive", | |
value: function receive(status, callback) { | |
if (this.hasReceived(status)) { | |
callback(this.receivedResp.response); | |
} | |
this.recHooks.push({ status: status, callback: callback }); | |
return this; | |
} | |
// private | |
}, { | |
key: "matchReceive", | |
value: function matchReceive(_ref) { | |
var status = _ref.status; | |
var response = _ref.response; | |
var ref = _ref.ref; | |
this.recHooks.filter(function (h) { | |
return h.status === status; | |
}).forEach(function (h) { | |
return h.callback(response); | |
}); | |
} | |
}, { | |
key: "cancelRefEvent", | |
value: function cancelRefEvent() { | |
if (!this.refEvent) { | |
return; | |
} | |
this.channel.off(this.refEvent); | |
} | |
}, { | |
key: "cancelTimeout", | |
value: function cancelTimeout() { | |
clearTimeout(this.timeoutTimer); | |
this.timeoutTimer = null; | |
} | |
}, { | |
key: "startTimeout", | |
value: function startTimeout() { | |
var _this = this; | |
if (this.timeoutTimer) { | |
return; | |
} | |
this.ref = this.channel.socket.makeRef(); | |
this.refEvent = this.channel.replyEventName(this.ref); | |
this.channel.on(this.refEvent, function (payload) { | |
_this.cancelRefEvent(); | |
_this.cancelTimeout(); | |
_this.receivedResp = payload; | |
_this.matchReceive(payload); | |
}); | |
this.timeoutTimer = setTimeout(function () { | |
_this.trigger("timeout", {}); | |
}, this.timeout); | |
} | |
}, { | |
key: "hasReceived", | |
value: function hasReceived(status) { | |
return this.receivedResp && this.receivedResp.status === status; | |
} | |
}, { | |
key: "trigger", | |
value: function trigger(status, response) { | |
this.channel.trigger(this.refEvent, { status: status, response: response }); | |
} | |
}]); | |
return Push; | |
}(); | |
var Channel = exports.Channel = function () { | |
function Channel(topic, params, socket) { | |
var _this2 = this; | |
_classCallCheck(this, Channel); | |
this.state = CHANNEL_STATES.closed; | |
this.topic = topic; | |
this.params = params || {}; | |
this.socket = socket; | |
this.bindings = []; | |
this.timeout = this.socket.timeout; | |
this.joinedOnce = false; | |
this.joinPush = new Push(this, CHANNEL_EVENTS.join, this.params, this.timeout); | |
this.pushBuffer = []; | |
this.rejoinTimer = new Timer(function () { | |
return _this2.rejoinUntilConnected(); | |
}, this.socket.reconnectAfterMs); | |
this.joinPush.receive("ok", function () { | |
_this2.state = CHANNEL_STATES.joined; | |
_this2.rejoinTimer.reset(); | |
_this2.pushBuffer.forEach(function (pushEvent) { | |
return pushEvent.send(); | |
}); | |
_this2.pushBuffer = []; | |
}); | |
this.onClose(function () { | |
_this2.rejoinTimer.reset(); | |
_this2.socket.log("channel", "close " + _this2.topic + " " + _this2.joinRef()); | |
_this2.state = CHANNEL_STATES.closed; | |
_this2.socket.remove(_this2); | |
}); | |
this.onError(function (reason) { | |
if (_this2.isLeaving() || _this2.isClosed()) { | |
return; | |
} | |
_this2.socket.log("channel", "error " + _this2.topic, reason); | |
_this2.state = CHANNEL_STATES.errored; | |
_this2.rejoinTimer.scheduleTimeout(); | |
}); | |
this.joinPush.receive("timeout", function () { | |
if (!_this2.isJoining()) { | |
return; | |
} | |
_this2.socket.log("channel", "timeout " + _this2.topic, _this2.joinPush.timeout); | |
_this2.state = CHANNEL_STATES.errored; | |
_this2.rejoinTimer.scheduleTimeout(); | |
}); | |
this.on(CHANNEL_EVENTS.reply, function (payload, ref) { | |
_this2.trigger(_this2.replyEventName(ref), payload); | |
}); | |
} | |
_createClass(Channel, [{ | |
key: "rejoinUntilConnected", | |
value: function rejoinUntilConnected() { | |
this.rejoinTimer.scheduleTimeout(); | |
if (this.socket.isConnected()) { | |
this.rejoin(); | |
} | |
} | |
}, { | |
key: "join", | |
value: function join() { | |
var timeout = arguments.length <= 0 || arguments[0] === undefined ? this.timeout : arguments[0]; | |
if (this.joinedOnce) { | |
throw "tried to join multiple times. 'join' can only be called a single time per channel instance"; | |
} else { | |
this.joinedOnce = true; | |
this.rejoin(timeout); | |
return this.joinPush; | |
} | |
} | |
}, { | |
key: "onClose", | |
value: function onClose(callback) { | |
this.on(CHANNEL_EVENTS.close, callback); | |
} | |
}, { | |
key: "onError", | |
value: function onError(callback) { | |
this.on(CHANNEL_EVENTS.error, function (reason) { | |
return callback(reason); | |
}); | |
} | |
}, { | |
key: "on", | |
value: function on(event, callback) { | |
this.bindings.push({ event: event, callback: callback }); | |
} | |
}, { | |
key: "off", | |
value: function off(event) { | |
this.bindings = this.bindings.filter(function (bind) { | |
return bind.event !== event; | |
}); | |
} | |
}, { | |
key: "canPush", | |
value: function canPush() { | |
return this.socket.isConnected() && this.isJoined(); | |
} | |
}, { | |
key: "push", | |
value: function push(event, payload) { | |
var timeout = arguments.length <= 2 || arguments[2] === undefined ? this.timeout : arguments[2]; | |
if (!this.joinedOnce) { | |
throw "tried to push '" + event + "' to '" + this.topic + "' before joining. Use channel.join() before pushing events"; | |
} | |
var pushEvent = new Push(this, event, payload, timeout); | |
if (this.canPush()) { | |
pushEvent.send(); | |
} else { | |
pushEvent.startTimeout(); | |
this.pushBuffer.push(pushEvent); | |
} | |
return pushEvent; | |
} | |
// Leaves the channel | |
// | |
// Unsubscribes from server events, and | |
// instructs channel to terminate on server | |
// | |
// Triggers onClose() hooks | |
// | |
// To receive leave acknowledgements, use the a `receive` | |
// hook to bind to the server ack, ie: | |
// | |
// channel.leave().receive("ok", () => alert("left!") ) | |
// | |
}, { | |
key: "leave", | |
value: function leave() { | |
var _this3 = this; | |
var timeout = arguments.length <= 0 || arguments[0] === undefined ? this.timeout : arguments[0]; | |
this.state = CHANNEL_STATES.leaving; | |
var onClose = function onClose() { | |
_this3.socket.log("channel", "leave " + _this3.topic); | |
_this3.trigger(CHANNEL_EVENTS.close, "leave", _this3.joinRef()); | |
}; | |
var leavePush = new Push(this, CHANNEL_EVENTS.leave, {}, timeout); | |
leavePush.receive("ok", function () { | |
return onClose(); | |
}).receive("timeout", function () { | |
return onClose(); | |
}); | |
leavePush.send(); | |
if (!this.canPush()) { | |
leavePush.trigger("ok", {}); | |
} | |
return leavePush; | |
} | |
// Overridable message hook | |
// | |
// Receives all events for specialized message handling | |
// before dispatching to the channel callbacks. | |
// | |
// Must return the payload, modified or unmodified | |
}, { | |
key: "onMessage", | |
value: function onMessage(event, payload, ref) { | |
return payload; | |
} | |
// private | |
}, { | |
key: "isMember", | |
value: function isMember(topic) { | |
return this.topic === topic; | |
} | |
}, { | |
key: "joinRef", | |
value: function joinRef() { | |
return this.joinPush.ref; | |
} | |
}, { | |
key: "sendJoin", | |
value: function sendJoin(timeout) { | |
this.state = CHANNEL_STATES.joining; | |
this.joinPush.resend(timeout); | |
} | |
}, { | |
key: "rejoin", | |
value: function rejoin() { | |
var timeout = arguments.length <= 0 || arguments[0] === undefined ? this.timeout : arguments[0]; | |
if (this.isLeaving()) { | |
return; | |
} | |
this.sendJoin(timeout); | |
} | |
}, { | |
key: "trigger", | |
value: function trigger(event, payload, ref) { | |
var close = CHANNEL_EVENTS.close; | |
var error = CHANNEL_EVENTS.error; | |
var leave = CHANNEL_EVENTS.leave; | |
var join = CHANNEL_EVENTS.join; | |
if (ref && [close, error, leave, join].indexOf(event) >= 0 && ref !== this.joinRef()) { | |
return; | |
} | |
var handledPayload = this.onMessage(event, payload, ref); | |
if (payload && !handledPayload) { | |
throw "channel onMessage callbacks must return the payload, modified or unmodified"; | |
} | |
this.bindings.filter(function (bind) { | |
return bind.event === event; | |
}).map(function (bind) { | |
return bind.callback(handledPayload, ref); | |
}); | |
} | |
}, { | |
key: "replyEventName", | |
value: function replyEventName(ref) { | |
return "chan_reply_" + ref; | |
} | |
}, { | |
key: "isClosed", | |
value: function isClosed() { | |
return this.state === CHANNEL_STATES.closed; | |
} | |
}, { | |
key: "isErrored", | |
value: function isErrored() { | |
return this.state === CHANNEL_STATES.errored; | |
} | |
}, { | |
key: "isJoined", | |
value: function isJoined() { | |
return this.state === CHANNEL_STATES.joined; | |
} | |
}, { | |
key: "isJoining", | |
value: function isJoining() { | |
return this.state === CHANNEL_STATES.joining; | |
} | |
}, { | |
key: "isLeaving", | |
value: function isLeaving() { | |
return this.state === CHANNEL_STATES.leaving; | |
} | |
}]); | |
return Channel; | |
}(); | |
var Socket = exports.Socket = function () { | |
// Initializes the Socket | |
// | |
// endPoint - The string WebSocket endpoint, ie, "ws://example.com/ws", | |
// "wss://example.com" | |
// "/ws" (inherited host & protocol) | |
// opts - Optional configuration | |
// transport - The Websocket Transport, for example WebSocket or Phoenix.LongPoll. | |
// Defaults to WebSocket with automatic LongPoll fallback. | |
// timeout - The default timeout in milliseconds to trigger push timeouts. | |
// Defaults `DEFAULT_TIMEOUT` | |
// heartbeatIntervalMs - The millisec interval to send a heartbeat message | |
// reconnectAfterMs - The optional function that returns the millsec | |
// reconnect interval. Defaults to stepped backoff of: | |
// | |
// function(tries){ | |
// return [1000, 5000, 10000][tries - 1] || 10000 | |
// } | |
// | |
// logger - The optional function for specialized logging, ie: | |
// `logger: (kind, msg, data) => { console.log(`${kind}: ${msg}`, data) } | |
// | |
// longpollerTimeout - The maximum timeout of a long poll AJAX request. | |
// Defaults to 20s (double the server long poll timer). | |
// | |
// params - The optional params to pass when connecting | |
// | |
// For IE8 support use an ES5-shim (https://github.com/es-shims/es5-shim) | |
// | |
function Socket(endPoint) { | |
var _this4 = this; | |
var opts = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; | |
_classCallCheck(this, Socket); | |
this.stateChangeCallbacks = { open: [], close: [], error: [], message: [] }; | |
this.channels = []; | |
this.sendBuffer = []; | |
this.ref = 0; | |
this.timeout = opts.timeout || DEFAULT_TIMEOUT; | |
this.transport = opts.transport || window.WebSocket || LongPoll; | |
this.heartbeatIntervalMs = opts.heartbeatIntervalMs || 30000; | |
this.reconnectAfterMs = opts.reconnectAfterMs || function (tries) { | |
return [1000, 2000, 5000, 10000][tries - 1] || 10000; | |
}; | |
this.logger = opts.logger || function () {}; // noop | |
this.longpollerTimeout = opts.longpollerTimeout || 20000; | |
this.params = opts.params || {}; | |
this.endPoint = endPoint + "/" + TRANSPORTS.websocket; | |
this.reconnectTimer = new Timer(function () { | |
_this4.disconnect(function () { | |
return _this4.connect(); | |
}); | |
}, this.reconnectAfterMs); | |
} | |
_createClass(Socket, [{ | |
key: "protocol", | |
value: function protocol() { | |
return location.protocol.match(/^https/) ? "wss" : "ws"; | |
} | |
}, { | |
key: "endPointURL", | |
value: function endPointURL() { | |
var uri = Ajax.appendParams(Ajax.appendParams(this.endPoint, this.params), { vsn: VSN }); | |
if (uri.charAt(0) !== "/") { | |
return uri; | |
} | |
if (uri.charAt(1) === "/") { | |
return this.protocol() + ":" + uri; | |
} | |
return this.protocol() + "://" + location.host + uri; | |
} | |
}, { | |
key: "disconnect", | |
value: function disconnect(callback, code, reason) { | |
if (this.conn) { | |
this.conn.onclose = function () {}; // noop | |
if (code) { | |
this.conn.close(code, reason || ""); | |
} else { | |
this.conn.close(); | |
} | |
this.conn = null; | |
} | |
callback && callback(); | |
} | |
// params - The params to send when connecting, for example `{user_id: userToken}` | |
}, { | |
key: "connect", | |
value: function connect(params) { | |
var _this5 = this; | |
if (params) { | |
console && console.log("passing params to connect is deprecated. Instead pass :params to the Socket constructor"); | |
this.params = params; | |
} | |
if (this.conn) { | |
return; | |
} | |
this.conn = new this.transport(this.endPointURL()); | |
this.conn.timeout = this.longpollerTimeout; | |
this.conn.onopen = function () { | |
return _this5.onConnOpen(); | |
}; | |
this.conn.onerror = function (error) { | |
return _this5.onConnError(error); | |
}; | |
this.conn.onmessage = function (event) { | |
return _this5.onConnMessage(event); | |
}; | |
this.conn.onclose = function (event) { | |
return _this5.onConnClose(event); | |
}; | |
} | |
// Logs the message. Override `this.logger` for specialized logging. noops by default | |
}, { | |
key: "log", | |
value: function log(kind, msg, data) { | |
this.logger(kind, msg, data); | |
} | |
// Registers callbacks for connection state change events | |
// | |
// Examples | |
// | |
// socket.onError(function(error){ alert("An error occurred") }) | |
// | |
}, { | |
key: "onOpen", | |
value: function onOpen(callback) { | |
this.stateChangeCallbacks.open.push(callback); | |
} | |
}, { | |
key: "onClose", | |
value: function onClose(callback) { | |
this.stateChangeCallbacks.close.push(callback); | |
} | |
}, { | |
key: "onError", | |
value: function onError(callback) { | |
this.stateChangeCallbacks.error.push(callback); | |
} | |
}, { | |
key: "onMessage", | |
value: function onMessage(callback) { | |
this.stateChangeCallbacks.message.push(callback); | |
} | |
}, { | |
key: "onConnOpen", | |
value: function onConnOpen() { | |
var _this6 = this; | |
this.log("transport", "connected to " + this.endPointURL(), this.transport.prototype); | |
this.flushSendBuffer(); | |
this.reconnectTimer.reset(); | |
if (!this.conn.skipHeartbeat) { | |
clearInterval(this.heartbeatTimer); | |
this.heartbeatTimer = setInterval(function () { | |
return _this6.sendHeartbeat(); | |
}, this.heartbeatIntervalMs); | |
} | |
this.stateChangeCallbacks.open.forEach(function (callback) { | |
return callback(); | |
}); | |
} | |
}, { | |
key: "onConnClose", | |
value: function onConnClose(event) { | |
this.log("transport", "close", event); | |
this.triggerChanError(); | |
clearInterval(this.heartbeatTimer); | |
this.reconnectTimer.scheduleTimeout(); | |
this.stateChangeCallbacks.close.forEach(function (callback) { | |
return callback(event); | |
}); | |
} | |
}, { | |
key: "onConnError", | |
value: function onConnError(error) { | |
this.log("transport", error); | |
this.triggerChanError(); | |
this.stateChangeCallbacks.error.forEach(function (callback) { | |
return callback(error); | |
}); | |
} | |
}, { | |
key: "triggerChanError", | |
value: function triggerChanError() { | |
this.channels.forEach(function (channel) { | |
return channel.trigger(CHANNEL_EVENTS.error); | |
}); | |
} | |
}, { | |
key: "connectionState", | |
value: function connectionState() { | |
switch (this.conn && this.conn.readyState) { | |
case SOCKET_STATES.connecting: | |
return "connecting"; | |
case SOCKET_STATES.open: | |
return "open"; | |
case SOCKET_STATES.closing: | |
return "closing"; | |
default: | |
return "closed"; | |
} | |
} | |
}, { | |
key: "isConnected", | |
value: function isConnected() { | |
return this.connectionState() === "open"; | |
} | |
}, { | |
key: "remove", | |
value: function remove(channel) { | |
this.channels = this.channels.filter(function (c) { | |
return c.joinRef() !== channel.joinRef(); | |
}); | |
} | |
}, { | |
key: "channel", | |
value: function channel(topic) { | |
var chanParams = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; | |
var chan = new Channel(topic, chanParams, this); | |
this.channels.push(chan); | |
return chan; | |
} | |
}, { | |
key: "push", | |
value: function push(data) { | |
var _this7 = this; | |
var topic = data.topic; | |
var event = data.event; | |
var payload = data.payload; | |
var ref = data.ref; | |
var callback = function callback() { | |
return _this7.conn.send(JSON.stringify(data)); | |
}; | |
this.log("push", topic + " " + event + " (" + ref + ")", payload); | |
if (this.isConnected()) { | |
callback(); | |
} else { | |
this.sendBuffer.push(callback); | |
} | |
} | |
// Return the next message ref, accounting for overflows | |
}, { | |
key: "makeRef", | |
value: function makeRef() { | |
var newRef = this.ref + 1; | |
if (newRef === this.ref) { | |
this.ref = 0; | |
} else { | |
this.ref = newRef; | |
} | |
return this.ref.toString(); | |
} | |
}, { | |
key: "sendHeartbeat", | |
value: function sendHeartbeat() { | |
if (!this.isConnected()) { | |
return; | |
} | |
this.push({ topic: "phoenix", event: "heartbeat", payload: {}, ref: this.makeRef() }); | |
} | |
}, { | |
key: "flushSendBuffer", | |
value: function flushSendBuffer() { | |
if (this.isConnected() && this.sendBuffer.length > 0) { | |
this.sendBuffer.forEach(function (callback) { | |
return callback(); | |
}); | |
this.sendBuffer = []; | |
} | |
} | |
}, { | |
key: "onConnMessage", | |
value: function onConnMessage(rawMessage) { | |
var msg = JSON.parse(rawMessage.data); | |
var topic = msg.topic; | |
var event = msg.event; | |
var payload = msg.payload; | |
var ref = msg.ref; | |
this.log("receive", (payload.status || "") + " " + topic + " " + event + " " + (ref && "(" + ref + ")" || ""), payload); | |
this.channels.filter(function (channel) { | |
return channel.isMember(topic); | |
}).forEach(function (channel) { | |
return channel.trigger(event, payload, ref); | |
}); | |
this.stateChangeCallbacks.message.forEach(function (callback) { | |
return callback(msg); | |
}); | |
} | |
}]); | |
return Socket; | |
}(); | |
var LongPoll = exports.LongPoll = function () { | |
function LongPoll(endPoint) { | |
_classCallCheck(this, LongPoll); | |
this.endPoint = null; | |
this.token = null; | |
this.skipHeartbeat = true; | |
this.onopen = function () {}; // noop | |
this.onerror = function () {}; // noop | |
this.onmessage = function () {}; // noop | |
this.onclose = function () {}; // noop | |
this.pollEndpoint = this.normalizeEndpoint(endPoint); | |
this.readyState = SOCKET_STATES.connecting; | |
this.poll(); | |
} | |
_createClass(LongPoll, [{ | |
key: "normalizeEndpoint", | |
value: function normalizeEndpoint(endPoint) { | |
return endPoint.replace("ws://", "http://").replace("wss://", "https://").replace(new RegExp("(.*)\/" + TRANSPORTS.websocket), "$1/" + TRANSPORTS.longpoll); | |
} | |
}, { | |
key: "endpointURL", | |
value: function endpointURL() { | |
return Ajax.appendParams(this.pollEndpoint, { token: this.token }); | |
} | |
}, { | |
key: "closeAndRetry", | |
value: function closeAndRetry() { | |
this.close(); | |
this.readyState = SOCKET_STATES.connecting; | |
} | |
}, { | |
key: "ontimeout", | |
value: function ontimeout() { | |
this.onerror("timeout"); | |
this.closeAndRetry(); | |
} | |
}, { | |
key: "poll", | |
value: function poll() { | |
var _this8 = this; | |
if (!(this.readyState === SOCKET_STATES.open || this.readyState === SOCKET_STATES.connecting)) { | |
return; | |
} | |
Ajax.request("GET", this.endpointURL(), "application/json", null, this.timeout, this.ontimeout.bind(this), function (resp) { | |
if (resp) { | |
var status = resp.status; | |
var token = resp.token; | |
var messages = resp.messages; | |
_this8.token = token; | |
} else { | |
var status = 0; | |
} | |
switch (status) { | |
case 200: | |
messages.forEach(function (msg) { | |
return _this8.onmessage({ data: JSON.stringify(msg) }); | |
}); | |
_this8.poll(); | |
break; | |
case 204: | |
_this8.poll(); | |
break; | |
case 410: | |
_this8.readyState = SOCKET_STATES.open; | |
_this8.onopen(); | |
_this8.poll(); | |
break; | |
case 0: | |
case 500: | |
_this8.onerror(); | |
_this8.closeAndRetry(); | |
break; | |
default: | |
throw "unhandled poll status " + status; | |
} | |
}); | |
} | |
}, { | |
key: "send", | |
value: function send(body) { | |
var _this9 = this; | |
Ajax.request("POST", this.endpointURL(), "application/json", body, this.timeout, this.onerror.bind(this, "timeout"), function (resp) { | |
if (!resp || resp.status !== 200) { | |
_this9.onerror(status); | |
_this9.closeAndRetry(); | |
} | |
}); | |
} | |
}, { | |
key: "close", | |
value: function close(code, reason) { | |
this.readyState = SOCKET_STATES.closed; | |
this.onclose(); | |
} | |
}]); | |
return LongPoll; | |
}(); | |
var Ajax = exports.Ajax = function () { | |
function Ajax() { | |
_classCallCheck(this, Ajax); | |
} | |
_createClass(Ajax, null, [{ | |
key: "request", | |
value: function request(method, endPoint, accept, body, timeout, ontimeout, callback) { | |
if (window.XDomainRequest) { | |
var req = new XDomainRequest(); // IE8, IE9 | |
this.xdomainRequest(req, method, endPoint, body, timeout, ontimeout, callback); | |
} else { | |
var req = window.XMLHttpRequest ? new XMLHttpRequest() : // IE7+, Firefox, Chrome, Opera, Safari | |
new ActiveXObject("Microsoft.XMLHTTP"); // IE6, IE5 | |
this.xhrRequest(req, method, endPoint, accept, body, timeout, ontimeout, callback); | |
} | |
} | |
}, { | |
key: "xdomainRequest", | |
value: function xdomainRequest(req, method, endPoint, body, timeout, ontimeout, callback) { | |
var _this10 = this; | |
req.timeout = timeout; | |
req.open(method, endPoint); | |
req.onload = function () { | |
var response = _this10.parseJSON(req.responseText); | |
callback && callback(response); | |
}; | |
if (ontimeout) { | |
req.ontimeout = ontimeout; | |
} | |
// Work around bug in IE9 that requires an attached onprogress handler | |
req.onprogress = function () {}; | |
req.send(body); | |
} | |
}, { | |
key: "xhrRequest", | |
value: function xhrRequest(req, method, endPoint, accept, body, timeout, ontimeout, callback) { | |
var _this11 = this; | |
req.timeout = timeout; | |
req.open(method, endPoint, true); | |
req.setRequestHeader("Content-Type", accept); | |
req.onerror = function () { | |
callback && callback(null); | |
}; | |
req.onreadystatechange = function () { | |
if (req.readyState === _this11.states.complete && callback) { | |
var response = _this11.parseJSON(req.responseText); | |
callback(response); | |
} | |
}; | |
if (ontimeout) { | |
req.ontimeout = ontimeout; | |
} | |
req.send(body); | |
} | |
}, { | |
key: "parseJSON", | |
value: function parseJSON(resp) { | |
return resp && resp !== "" ? JSON.parse(resp) : null; | |
} | |
}, { | |
key: "serialize", | |
value: function serialize(obj, parentKey) { | |
var queryStr = []; | |
for (var key in obj) { | |
if (!obj.hasOwnProperty(key)) { | |
continue; | |
} | |
var paramKey = parentKey ? parentKey + "[" + key + "]" : key; | |
var paramVal = obj[key]; | |
if ((typeof paramVal === "undefined" ? "undefined" : _typeof(paramVal)) === "object") { | |
queryStr.push(this.serialize(paramVal, paramKey)); | |
} else { | |
queryStr.push(encodeURIComponent(paramKey) + "=" + encodeURIComponent(paramVal)); | |
} | |
} | |
return queryStr.join("&"); | |
} | |
}, { | |
key: "appendParams", | |
value: function appendParams(url, params) { | |
if (Object.keys(params).length === 0) { | |
return url; | |
} | |
var prefix = url.match(/\?/) ? "&" : "?"; | |
return "" + url + prefix + this.serialize(params); | |
} | |
}]); | |
return Ajax; | |
}(); | |
Ajax.states = { complete: 4 }; | |
var Presence = exports.Presence = { | |
syncState: function syncState(currentState, newState, onJoin, onLeave) { | |
var _this12 = this; | |
var state = this.clone(currentState); | |
var joins = {}; | |
var leaves = {}; | |
this.map(state, function (key, presence) { | |
if (!newState[key]) { | |
leaves[key] = presence; | |
} | |
}); | |
this.map(newState, function (key, newPresence) { | |
var currentPresence = state[key]; | |
if (currentPresence) { | |
(function () { | |
var newRefs = newPresence.metas.map(function (m) { | |
return m.phx_ref; | |
}); | |
var curRefs = currentPresence.metas.map(function (m) { | |
return m.phx_ref; | |
}); | |
var joinedMetas = newPresence.metas.filter(function (m) { | |
return curRefs.indexOf(m.phx_ref) < 0; | |
}); | |
var leftMetas = currentPresence.metas.filter(function (m) { | |
return newRefs.indexOf(m.phx_ref) < 0; | |
}); | |
if (joinedMetas.length > 0) { | |
joins[key] = newPresence; | |
joins[key].metas = joinedMetas; | |
} | |
if (leftMetas.length > 0) { | |
leaves[key] = _this12.clone(currentPresence); | |
leaves[key].metas = leftMetas; | |
} | |
})(); | |
} else { | |
joins[key] = newPresence; | |
} | |
}); | |
return this.syncDiff(state, { joins: joins, leaves: leaves }, onJoin, onLeave); | |
}, | |
syncDiff: function syncDiff(currentState, _ref2, onJoin, onLeave) { | |
var joins = _ref2.joins; | |
var leaves = _ref2.leaves; | |
var state = this.clone(currentState); | |
if (!onJoin) { | |
onJoin = function onJoin() {}; | |
} | |
if (!onLeave) { | |
onLeave = function onLeave() {}; | |
} | |
this.map(joins, function (key, newPresence) { | |
var currentPresence = state[key]; | |
state[key] = newPresence; | |
if (currentPresence) { | |
var _state$key$metas; | |
(_state$key$metas = state[key].metas).unshift.apply(_state$key$metas, _toConsumableArray(currentPresence.metas)); | |
} | |
onJoin(key, currentPresence, newPresence); | |
}); | |
this.map(leaves, function (key, leftPresence) { | |
var currentPresence = state[key]; | |
if (!currentPresence) { | |
return; | |
} | |
var refsToRemove = leftPresence.metas.map(function (m) { | |
return m.phx_ref; | |
}); | |
currentPresence.metas = currentPresence.metas.filter(function (p) { | |
return refsToRemove.indexOf(p.phx_ref) < 0; | |
}); | |
onLeave(key, currentPresence, leftPresence); | |
if (currentPresence.metas.length === 0) { | |
delete state[key]; | |
} | |
}); | |
return state; | |
}, | |
list: function list(presences, chooser) { | |
if (!chooser) { | |
chooser = function chooser(key, pres) { | |
return pres; | |
}; | |
} | |
return this.map(presences, function (key, presence) { | |
return chooser(key, presence); | |
}); | |
}, | |
// private | |
map: function map(obj, func) { | |
return Object.getOwnPropertyNames(obj).map(function (key) { | |
return func(key, obj[key]); | |
}); | |
}, | |
clone: function clone(obj) { | |
return JSON.parse(JSON.stringify(obj)); | |
} | |
}; | |
// Creates a timer that accepts a `timerCalc` function to perform | |
// calculated timeout retries, such as exponential backoff. | |
// | |
// ## Examples | |
// | |
// let reconnectTimer = new Timer(() => this.connect(), function(tries){ | |
// return [1000, 5000, 10000][tries - 1] || 10000 | |
// }) | |
// reconnectTimer.scheduleTimeout() // fires after 1000 | |
// reconnectTimer.scheduleTimeout() // fires after 5000 | |
// reconnectTimer.reset() | |
// reconnectTimer.scheduleTimeout() // fires after 1000 | |
// | |
var Timer = function () { | |
function Timer(callback, timerCalc) { | |
_classCallCheck(this, Timer); | |
this.callback = callback; | |
this.timerCalc = timerCalc; | |
this.timer = null; | |
this.tries = 0; | |
} | |
_createClass(Timer, [{ | |
key: "reset", | |
value: function reset() { | |
this.tries = 0; | |
clearTimeout(this.timer); | |
} | |
// Cancels any previous scheduleTimeout and schedules callback | |
}, { | |
key: "scheduleTimeout", | |
value: function scheduleTimeout() { | |
var _this13 = this; | |
clearTimeout(this.timer); | |
this.timer = setTimeout(function () { | |
_this13.tries = _this13.tries + 1; | |
_this13.callback(); | |
}, this.timerCalc(this.tries + 1)); | |
} | |
}]); | |
return Timer; | |
}(); | |
})(typeof(exports) === "undefined" ? window.Phoenix = window.Phoenix || {} : exports); | |
})(); | |
}); | |
require.register("phoenix_html/priv/static/phoenix_html.js", function(exports, require, module) { | |
require = __makeRelativeRequire(require, {}, "phoenix_html"); | |
(function() { | |
"use strict"; | |
(function() { | |
function buildHiddenInput(name, value) { | |
var input = document.createElement("input"); | |
input.type = "hidden"; | |
input.name = name; | |
input.value = value; | |
return input; | |
} | |
function handleLinkClick(link) { | |
var message = link.getAttribute("data-confirm"); | |
if(message && !window.confirm(message)) { | |
return; | |
} | |
var to = link.getAttribute("data-to"), | |
method = buildHiddenInput("_method", link.getAttribute("data-method")), | |
csrf = buildHiddenInput("_csrf_token", link.getAttribute("data-csrf")), | |
form = document.createElement("form"); | |
form.method = (link.getAttribute("data-method") === "get") ? "get" : "post"; | |
form.action = to; | |
form.style.display = "hidden"; | |
form.appendChild(csrf); | |
form.appendChild(method); | |
document.body.appendChild(form); | |
form.submit(); | |
} | |
window.addEventListener("click", function(e) { | |
var element = e.target; | |
while (element && element.getAttribute) { | |
if(element.getAttribute("data-method")) { | |
handleLinkClick(element); | |
e.preventDefault(); | |
return false; | |
} else { | |
element = element.parentNode; | |
} | |
} | |
}, false); | |
})(); | |
})(); | |
}); | |
require.register("web/static/js/app.js", function(exports, require, module) { | |
"use strict"; | |
require("phoenix_html"); | |
require("./list.js"); | |
// Brunch automatically concatenates all files in your | |
// watched paths. Those paths can be configured at | |
// config.paths.watched in "brunch-config.js". | |
// | |
// However, those files will only be executed if | |
// explicitly imported. The only exception are files | |
// in vendor, which are never wrapped in imports and | |
// therefore are always executed. | |
// Import dependencies | |
// | |
// If you no longer want to use a dependency, remember | |
// to also remove its path from "config.paths.watched". | |
function deleted() { | |
console.log('hello'); | |
} | |
// Import local files | |
// | |
// Local files can be imported directly using relative | |
// paths "./socket" or full ones "web/static/js/socket". | |
// import socket from "./socket" | |
}); | |
;require.register("web/static/js/bootstrap.min.js", function(exports, require, module) { | |
"use strict"; | |
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; | |
/*! | |
* Bootstrap v3.3.7 (http://getbootstrap.com) | |
* Copyright 2011-2016 Twitter, Inc. | |
* Licensed under the MIT license | |
*/ | |
if ("undefined" == typeof jQuery) throw new Error("Bootstrap's JavaScript requires jQuery");+function (a) { | |
"use strict"; | |
var b = a.fn.jquery.split(" ")[0].split("."); | |
if (b[0] < 2 && b[1] < 9 || 1 == b[0] && 9 == b[1] && b[2] < 1 || b[0] > 3) throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4"); | |
}(jQuery), +function (a) { | |
"use strict"; | |
function b() { | |
var a = document.createElement("bootstrap"), | |
b = { | |
WebkitTransition: "webkitTransitionEnd", | |
MozTransition: "transitionend", | |
OTransition: "oTransitionEnd otransitionend", | |
transition: "transitionend" | |
}; | |
for (var c in b) { | |
if (void 0 !== a.style[c]) return { | |
end: b[c] | |
}; | |
}return !1; | |
} | |
a.fn.emulateTransitionEnd = function (b) { | |
var c = !1, | |
d = this; | |
a(this).one("bsTransitionEnd", function () { | |
c = !0; | |
}); | |
var e = function e() { | |
c || a(d).trigger(a.support.transition.end); | |
}; | |
return setTimeout(e, b), this; | |
}, a(function () { | |
a.support.transition = b(), a.support.transition && (a.event.special.bsTransitionEnd = { | |
bindType: a.support.transition.end, | |
delegateType: a.support.transition.end, | |
handle: function handle(b) { | |
if (a(b.target).is(this)) return b.handleObj.handler.apply(this, arguments); | |
} | |
}); | |
}); | |
}(jQuery), +function (a) { | |
"use strict"; | |
function b(b) { | |
return this.each(function () { | |
var c = a(this), | |
e = c.data("bs.alert"); | |
e || c.data("bs.alert", e = new d(this)), "string" == typeof b && e[b].call(c); | |
}); | |
} | |
var c = '[data-dismiss="alert"]', | |
d = function d(b) { | |
a(b).on("click", c, this.close); | |
}; | |
d.VERSION = "3.3.7", d.TRANSITION_DURATION = 150, d.prototype.close = function (b) { | |
function c() { | |
g.detach().trigger("closed.bs.alert").remove(); | |
} | |
var e = a(this), | |
f = e.attr("data-target"); | |
f || (f = e.attr("href"), f = f && f.replace(/.*(?=#[^\s]*$)/, "")); | |
var g = a("#" === f ? [] : f); | |
b && b.preventDefault(), g.length || (g = e.closest(".alert")), g.trigger(b = a.Event("close.bs.alert")), b.isDefaultPrevented() || (g.removeClass("in"), a.support.transition && g.hasClass("fade") ? g.one("bsTransitionEnd", c).emulateTransitionEnd(d.TRANSITION_DURATION) : c()); | |
}; | |
var e = a.fn.alert; | |
a.fn.alert = b, a.fn.alert.Constructor = d, a.fn.alert.noConflict = function () { | |
return a.fn.alert = e, this; | |
}, a(document).on("click.bs.alert.data-api", c, d.prototype.close); | |
}(jQuery), +function (a) { | |
"use strict"; | |
function b(b) { | |
return this.each(function () { | |
var d = a(this), | |
e = d.data("bs.button"), | |
f = "object" == (typeof b === "undefined" ? "undefined" : _typeof(b)) && b; | |
e || d.data("bs.button", e = new c(this, f)), "toggle" == b ? e.toggle() : b && e.setState(b); | |
}); | |
} | |
var c = function c(b, d) { | |
this.$element = a(b), this.options = a.extend({}, c.DEFAULTS, d), this.isLoading = !1; | |
}; | |
c.VERSION = "3.3.7", c.DEFAULTS = { | |
loadingText: "loading..." | |
}, c.prototype.setState = function (b) { | |
var c = "disabled", | |
d = this.$element, | |
e = d.is("input") ? "val" : "html", | |
f = d.data(); | |
b += "Text", null == f.resetText && d.data("resetText", d[e]()), setTimeout(a.proxy(function () { | |
d[e](null == f[b] ? this.options[b] : f[b]), "loadingText" == b ? (this.isLoading = !0, d.addClass(c).attr(c, c).prop(c, !0)) : this.isLoading && (this.isLoading = !1, d.removeClass(c).removeAttr(c).prop(c, !1)); | |
}, this), 0); | |
}, c.prototype.toggle = function () { | |
var a = !0, | |
b = this.$element.closest('[data-toggle="buttons"]'); | |
if (b.length) { | |
var c = this.$element.find("input"); | |
"radio" == c.prop("type") ? (c.prop("checked") && (a = !1), b.find(".active").removeClass("active"), this.$element.addClass("active")) : "checkbox" == c.prop("type") && (c.prop("checked") !== this.$element.hasClass("active") && (a = !1), this.$element.toggleClass("active")), c.prop("checked", this.$element.hasClass("active")), a && c.trigger("change"); | |
} else this.$element.attr("aria-pressed", !this.$element.hasClass("active")), this.$element.toggleClass("active"); | |
}; | |
var d = a.fn.button; | |
a.fn.button = b, a.fn.button.Constructor = c, a.fn.button.noConflict = function () { | |
return a.fn.button = d, this; | |
}, a(document).on("click.bs.button.data-api", '[data-toggle^="button"]', function (c) { | |
var d = a(c.target).closest(".btn"); | |
b.call(d, "toggle"), a(c.target).is('input[type="radio"], input[type="checkbox"]') || (c.preventDefault(), d.is("input,button") ? d.trigger("focus") : d.find("input:visible,button:visible").first().trigger("focus")); | |
}).on("focus.bs.button.data-api blur.bs.button.data-api", '[data-toggle^="button"]', function (b) { | |
a(b.target).closest(".btn").toggleClass("focus", /^focus(in)?$/.test(b.type)); | |
}); | |
}(jQuery), +function (a) { | |
"use strict"; | |
function b(b) { | |
return this.each(function () { | |
var d = a(this), | |
e = d.data("bs.carousel"), | |
f = a.extend({}, c.DEFAULTS, d.data(), "object" == (typeof b === "undefined" ? "undefined" : _typeof(b)) && b), | |
g = "string" == typeof b ? b : f.slide; | |
e || d.data("bs.carousel", e = new c(this, f)), "number" == typeof b ? e.to(b) : g ? e[g]() : f.interval && e.pause().cycle(); | |
}); | |
} | |
var c = function c(b, _c) { | |
this.$element = a(b), this.$indicators = this.$element.find(".carousel-indicators"), this.options = _c, this.paused = null, this.sliding = null, this.interval = null, this.$active = null, this.$items = null, this.options.keyboard && this.$element.on("keydown.bs.carousel", a.proxy(this.keydown, this)), "hover" == this.options.pause && !("ontouchstart" in document.documentElement) && this.$element.on("mouseenter.bs.carousel", a.proxy(this.pause, this)).on("mouseleave.bs.carousel", a.proxy(this.cycle, this)); | |
}; | |
c.VERSION = "3.3.7", c.TRANSITION_DURATION = 600, c.DEFAULTS = { | |
interval: 5e3, | |
pause: "hover", | |
wrap: !0, | |
keyboard: !0 | |
}, c.prototype.keydown = function (a) { | |
if (!/input|textarea/i.test(a.target.tagName)) { | |
switch (a.which) { | |
case 37: | |
this.prev(); | |
break; | |
case 39: | |
this.next(); | |
break; | |
default: | |
return; | |
} | |
a.preventDefault(); | |
} | |
}, c.prototype.cycle = function (b) { | |
return b || (this.paused = !1), this.interval && clearInterval(this.interval), this.options.interval && !this.paused && (this.interval = setInterval(a.proxy(this.next, this), this.options.interval)), this; | |
}, c.prototype.getItemIndex = function (a) { | |
return this.$items = a.parent().children(".item"), this.$items.index(a || this.$active); | |
}, c.prototype.getItemForDirection = function (a, b) { | |
var c = this.getItemIndex(b), | |
d = "prev" == a && 0 === c || "next" == a && c == this.$items.length - 1; | |
if (d && !this.options.wrap) return b; | |
var e = "prev" == a ? -1 : 1, | |
f = (c + e) % this.$items.length; | |
return this.$items.eq(f); | |
}, c.prototype.to = function (a) { | |
var b = this, | |
c = this.getItemIndex(this.$active = this.$element.find(".item.active")); | |
if (!(a > this.$items.length - 1 || a < 0)) return this.sliding ? this.$element.one("slid.bs.carousel", function () { | |
b.to(a); | |
}) : c == a ? this.pause().cycle() : this.slide(a > c ? "next" : "prev", this.$items.eq(a)); | |
}, c.prototype.pause = function (b) { | |
return b || (this.paused = !0), this.$element.find(".next, .prev").length && a.support.transition && (this.$element.trigger(a.support.transition.end), this.cycle(!0)), this.interval = clearInterval(this.interval), this; | |
}, c.prototype.next = function () { | |
if (!this.sliding) return this.slide("next"); | |
}, c.prototype.prev = function () { | |
if (!this.sliding) return this.slide("prev"); | |
}, c.prototype.slide = function (b, d) { | |
var e = this.$element.find(".item.active"), | |
f = d || this.getItemForDirection(b, e), | |
g = this.interval, | |
h = "next" == b ? "left" : "right", | |
i = this; | |
if (f.hasClass("active")) return this.sliding = !1; | |
var j = f[0], | |
k = a.Event("slide.bs.carousel", { | |
relatedTarget: j, | |
direction: h | |
}); | |
if (this.$element.trigger(k), !k.isDefaultPrevented()) { | |
if (this.sliding = !0, g && this.pause(), this.$indicators.length) { | |
this.$indicators.find(".active").removeClass("active"); | |
var l = a(this.$indicators.children()[this.getItemIndex(f)]); | |
l && l.addClass("active"); | |
} | |
var m = a.Event("slid.bs.carousel", { | |
relatedTarget: j, | |
direction: h | |
}); | |
return a.support.transition && this.$element.hasClass("slide") ? (f.addClass(b), f[0].offsetWidth, e.addClass(h), f.addClass(h), e.one("bsTransitionEnd", function () { | |
f.removeClass([b, h].join(" ")).addClass("active"), e.removeClass(["active", h].join(" ")), i.sliding = !1, setTimeout(function () { | |
i.$element.trigger(m); | |
}, 0); | |
}).emulateTransitionEnd(c.TRANSITION_DURATION)) : (e.removeClass("active"), f.addClass("active"), this.sliding = !1, this.$element.trigger(m)), g && this.cycle(), this; | |
} | |
}; | |
var d = a.fn.carousel; | |
a.fn.carousel = b, a.fn.carousel.Constructor = c, a.fn.carousel.noConflict = function () { | |
return a.fn.carousel = d, this; | |
}; | |
var e = function e(c) { | |
var d, | |
e = a(this), | |
f = a(e.attr("data-target") || (d = e.attr("href")) && d.replace(/.*(?=#[^\s]+$)/, "")); | |
if (f.hasClass("carousel")) { | |
var g = a.extend({}, f.data(), e.data()), | |
h = e.attr("data-slide-to"); | |
h && (g.interval = !1), b.call(f, g), h && f.data("bs.carousel").to(h), c.preventDefault(); | |
} | |
}; | |
a(document).on("click.bs.carousel.data-api", "[data-slide]", e).on("click.bs.carousel.data-api", "[data-slide-to]", e), a(window).on("load", function () { | |
a('[data-ride="carousel"]').each(function () { | |
var c = a(this); | |
b.call(c, c.data()); | |
}); | |
}); | |
}(jQuery), +function (a) { | |
"use strict"; | |
function b(b) { | |
var c, | |
d = b.attr("data-target") || (c = b.attr("href")) && c.replace(/.*(?=#[^\s]+$)/, ""); | |
return a(d); | |
} | |
function c(b) { | |
return this.each(function () { | |
var c = a(this), | |
e = c.data("bs.collapse"), | |
f = a.extend({}, d.DEFAULTS, c.data(), "object" == (typeof b === "undefined" ? "undefined" : _typeof(b)) && b); | |
!e && f.toggle && /show|hide/.test(b) && (f.toggle = !1), e || c.data("bs.collapse", e = new d(this, f)), "string" == typeof b && e[b](); | |
}); | |
} | |
var d = function d(b, c) { | |
this.$element = a(b), this.options = a.extend({}, d.DEFAULTS, c), this.$trigger = a('[data-toggle="collapse"][href="#' + b.id + '"],[data-toggle="collapse"][data-target="#' + b.id + '"]'), this.transitioning = null, this.options.parent ? this.$parent = this.getParent() : this.addAriaAndCollapsedClass(this.$element, this.$trigger), this.options.toggle && this.toggle(); | |
}; | |
d.VERSION = "3.3.7", d.TRANSITION_DURATION = 350, d.DEFAULTS = { | |
toggle: !0 | |
}, d.prototype.dimension = function () { | |
var a = this.$element.hasClass("width"); | |
return a ? "width" : "height"; | |
}, d.prototype.show = function () { | |
if (!this.transitioning && !this.$element.hasClass("in")) { | |
var b, | |
e = this.$parent && this.$parent.children(".panel").children(".in, .collapsing"); | |
if (!(e && e.length && (b = e.data("bs.collapse"), b && b.transitioning))) { | |
var f = a.Event("show.bs.collapse"); | |
if (this.$element.trigger(f), !f.isDefaultPrevented()) { | |
e && e.length && (c.call(e, "hide"), b || e.data("bs.collapse", null)); | |
var g = this.dimension(); | |
this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded", !0), this.$trigger.removeClass("collapsed").attr("aria-expanded", !0), this.transitioning = 1; | |
var h = function h() { | |
this.$element.removeClass("collapsing").addClass("collapse in")[g](""), this.transitioning = 0, this.$element.trigger("shown.bs.collapse"); | |
}; | |
if (!a.support.transition) return h.call(this); | |
var i = a.camelCase(["scroll", g].join("-")); | |
this.$element.one("bsTransitionEnd", a.proxy(h, this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i]); | |
} | |
} | |
} | |
}, d.prototype.hide = function () { | |
if (!this.transitioning && this.$element.hasClass("in")) { | |
var b = a.Event("hide.bs.collapse"); | |
if (this.$element.trigger(b), !b.isDefaultPrevented()) { | |
var c = this.dimension(); | |
this.$element[c](this.$element[c]())[0].offsetHeight, this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded", !1), this.$trigger.addClass("collapsed").attr("aria-expanded", !1), this.transitioning = 1; | |
var e = function e() { | |
this.transitioning = 0, this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse"); | |
}; | |
return a.support.transition ? void this.$element[c](0).one("bsTransitionEnd", a.proxy(e, this)).emulateTransitionEnd(d.TRANSITION_DURATION) : e.call(this); | |
} | |
} | |
}, d.prototype.toggle = function () { | |
this[this.$element.hasClass("in") ? "hide" : "show"](); | |
}, d.prototype.getParent = function () { | |
return a(this.options.parent).find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]').each(a.proxy(function (c, d) { | |
var e = a(d); | |
this.addAriaAndCollapsedClass(b(e), e); | |
}, this)).end(); | |
}, d.prototype.addAriaAndCollapsedClass = function (a, b) { | |
var c = a.hasClass("in"); | |
a.attr("aria-expanded", c), b.toggleClass("collapsed", !c).attr("aria-expanded", c); | |
}; | |
var e = a.fn.collapse; | |
a.fn.collapse = c, a.fn.collapse.Constructor = d, a.fn.collapse.noConflict = function () { | |
return a.fn.collapse = e, this; | |
}, a(document).on("click.bs.collapse.data-api", '[data-toggle="collapse"]', function (d) { | |
var e = a(this); | |
e.attr("data-target") || d.preventDefault(); | |
var f = b(e), | |
g = f.data("bs.collapse"), | |
h = g ? "toggle" : e.data(); | |
c.call(f, h); | |
}); | |
}(jQuery), +function (a) { | |
"use strict"; | |
function b(b) { | |
var c = b.attr("data-target"); | |
c || (c = b.attr("href"), c = c && /#[A-Za-z]/.test(c) && c.replace(/.*(?=#[^\s]*$)/, "")); | |
var d = c && a(c); | |
return d && d.length ? d : b.parent(); | |
} | |
function c(c) { | |
c && 3 === c.which || (a(e).remove(), a(f).each(function () { | |
var d = a(this), | |
e = b(d), | |
f = { | |
relatedTarget: this | |
}; | |
e.hasClass("open") && (c && "click" == c.type && /input|textarea/i.test(c.target.tagName) && a.contains(e[0], c.target) || (e.trigger(c = a.Event("hide.bs.dropdown", f)), c.isDefaultPrevented() || (d.attr("aria-expanded", "false"), e.removeClass("open").trigger(a.Event("hidden.bs.dropdown", f))))); | |
})); | |
} | |
function d(b) { | |
return this.each(function () { | |
var c = a(this), | |
d = c.data("bs.dropdown"); | |
d || c.data("bs.dropdown", d = new g(this)), "string" == typeof b && d[b].call(c); | |
}); | |
} | |
var e = ".dropdown-backdrop", | |
f = '[data-toggle="dropdown"]', | |
g = function g(b) { | |
a(b).on("click.bs.dropdown", this.toggle); | |
}; | |
g.VERSION = "3.3.7", g.prototype.toggle = function (d) { | |
var e = a(this); | |
if (!e.is(".disabled, :disabled")) { | |
var f = b(e), | |
g = f.hasClass("open"); | |
if (c(), !g) { | |
"ontouchstart" in document.documentElement && !f.closest(".navbar-nav").length && a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click", c); | |
var h = { | |
relatedTarget: this | |
}; | |
if (f.trigger(d = a.Event("show.bs.dropdown", h)), d.isDefaultPrevented()) return; | |
e.trigger("focus").attr("aria-expanded", "true"), f.toggleClass("open").trigger(a.Event("shown.bs.dropdown", h)); | |
} | |
return !1; | |
} | |
}, g.prototype.keydown = function (c) { | |
if (/(38|40|27|32)/.test(c.which) && !/input|textarea/i.test(c.target.tagName)) { | |
var d = a(this); | |
if (c.preventDefault(), c.stopPropagation(), !d.is(".disabled, :disabled")) { | |
var e = b(d), | |
g = e.hasClass("open"); | |
if (!g && 27 != c.which || g && 27 == c.which) return 27 == c.which && e.find(f).trigger("focus"), d.trigger("click"); | |
var h = " li:not(.disabled):visible a", | |
i = e.find(".dropdown-menu" + h); | |
if (i.length) { | |
var j = i.index(c.target); | |
38 == c.which && j > 0 && j--, 40 == c.which && j < i.length - 1 && j++, ~j || (j = 0), i.eq(j).trigger("focus"); | |
} | |
} | |
} | |
}; | |
var h = a.fn.dropdown; | |
a.fn.dropdown = d, a.fn.dropdown.Constructor = g, a.fn.dropdown.noConflict = function () { | |
return a.fn.dropdown = h, this; | |
}, a(document).on("click.bs.dropdown.data-api", c).on("click.bs.dropdown.data-api", ".dropdown form", function (a) { | |
a.stopPropagation(); | |
}).on("click.bs.dropdown.data-api", f, g.prototype.toggle).on("keydown.bs.dropdown.data-api", f, g.prototype.keydown).on("keydown.bs.dropdown.data-api", ".dropdown-menu", g.prototype.keydown); | |
}(jQuery), +function (a) { | |
"use strict"; | |
function b(b, d) { | |
return this.each(function () { | |
var e = a(this), | |
f = e.data("bs.modal"), | |
g = a.extend({}, c.DEFAULTS, e.data(), "object" == (typeof b === "undefined" ? "undefined" : _typeof(b)) && b); | |
f || e.data("bs.modal", f = new c(this, g)), "string" == typeof b ? f[b](d) : g.show && f.show(d); | |
}); | |
} | |
var c = function c(b, _c2) { | |
this.options = _c2, this.$body = a(document.body), this.$element = a(b), this.$dialog = this.$element.find(".modal-dialog"), this.$backdrop = null, this.isShown = null, this.originalBodyPad = null, this.scrollbarWidth = 0, this.ignoreBackdropClick = !1, this.options.remote && this.$element.find(".modal-content").load(this.options.remote, a.proxy(function () { | |
this.$element.trigger("loaded.bs.modal"); | |
}, this)); | |
}; | |
c.VERSION = "3.3.7", c.TRANSITION_DURATION = 300, c.BACKDROP_TRANSITION_DURATION = 150, c.DEFAULTS = { | |
backdrop: !0, | |
keyboard: !0, | |
show: !0 | |
}, c.prototype.toggle = function (a) { | |
return this.isShown ? this.hide() : this.show(a); | |
}, c.prototype.show = function (b) { | |
var d = this, | |
e = a.Event("show.bs.modal", { | |
relatedTarget: b | |
}); | |
this.$element.trigger(e), this.isShown || e.isDefaultPrevented() || (this.isShown = !0, this.checkScrollbar(), this.setScrollbar(), this.$body.addClass("modal-open"), this.escape(), this.resize(), this.$element.on("click.dismiss.bs.modal", '[data-dismiss="modal"]', a.proxy(this.hide, this)), this.$dialog.on("mousedown.dismiss.bs.modal", function () { | |
d.$element.one("mouseup.dismiss.bs.modal", function (b) { | |
a(b.target).is(d.$element) && (d.ignoreBackdropClick = !0); | |
}); | |
}), this.backdrop(function () { | |
var e = a.support.transition && d.$element.hasClass("fade"); | |
d.$element.parent().length || d.$element.appendTo(d.$body), d.$element.show().scrollTop(0), d.adjustDialog(), e && d.$element[0].offsetWidth, d.$element.addClass("in"), d.enforceFocus(); | |
var f = a.Event("shown.bs.modal", { | |
relatedTarget: b | |
}); | |
e ? d.$dialog.one("bsTransitionEnd", function () { | |
d.$element.trigger("focus").trigger(f); | |
}).emulateTransitionEnd(c.TRANSITION_DURATION) : d.$element.trigger("focus").trigger(f); | |
})); | |
}, c.prototype.hide = function (b) { | |
b && b.preventDefault(), b = a.Event("hide.bs.modal"), this.$element.trigger(b), this.isShown && !b.isDefaultPrevented() && (this.isShown = !1, this.escape(), this.resize(), a(document).off("focusin.bs.modal"), this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"), this.$dialog.off("mousedown.dismiss.bs.modal"), a.support.transition && this.$element.hasClass("fade") ? this.$element.one("bsTransitionEnd", a.proxy(this.hideModal, this)).emulateTransitionEnd(c.TRANSITION_DURATION) : this.hideModal()); | |
}, c.prototype.enforceFocus = function () { | |
a(document).off("focusin.bs.modal").on("focusin.bs.modal", a.proxy(function (a) { | |
document === a.target || this.$element[0] === a.target || this.$element.has(a.target).length || this.$element.trigger("focus"); | |
}, this)); | |
}, c.prototype.escape = function () { | |
this.isShown && this.options.keyboard ? this.$element.on("keydown.dismiss.bs.modal", a.proxy(function (a) { | |
27 == a.which && this.hide(); | |
}, this)) : this.isShown || this.$element.off("keydown.dismiss.bs.modal"); | |
}, c.prototype.resize = function () { | |
this.isShown ? a(window).on("resize.bs.modal", a.proxy(this.handleUpdate, this)) : a(window).off("resize.bs.modal"); | |
}, c.prototype.hideModal = function () { | |
var a = this; | |
this.$element.hide(), this.backdrop(function () { | |
a.$body.removeClass("modal-open"), a.resetAdjustments(), a.resetScrollbar(), a.$element.trigger("hidden.bs.modal"); | |
}); | |
}, c.prototype.removeBackdrop = function () { | |
this.$backdrop && this.$backdrop.remove(), this.$backdrop = null; | |
}, c.prototype.backdrop = function (b) { | |
var d = this, | |
e = this.$element.hasClass("fade") ? "fade" : ""; | |
if (this.isShown && this.options.backdrop) { | |
var f = a.support.transition && e; | |
if (this.$backdrop = a(document.createElement("div")).addClass("modal-backdrop " + e).appendTo(this.$body), this.$element.on("click.dismiss.bs.modal", a.proxy(function (a) { | |
return this.ignoreBackdropClick ? void (this.ignoreBackdropClick = !1) : void (a.target === a.currentTarget && ("static" == this.options.backdrop ? this.$element[0].focus() : this.hide())); | |
}, this)), f && this.$backdrop[0].offsetWidth, this.$backdrop.addClass("in"), !b) return; | |
f ? this.$backdrop.one("bsTransitionEnd", b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION) : b(); | |
} else if (!this.isShown && this.$backdrop) { | |
this.$backdrop.removeClass("in"); | |
var g = function g() { | |
d.removeBackdrop(), b && b(); | |
}; | |
a.support.transition && this.$element.hasClass("fade") ? this.$backdrop.one("bsTransitionEnd", g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION) : g(); | |
} else b && b(); | |
}, c.prototype.handleUpdate = function () { | |
this.adjustDialog(); | |
}, c.prototype.adjustDialog = function () { | |
var a = this.$element[0].scrollHeight > document.documentElement.clientHeight; | |
this.$element.css({ | |
paddingLeft: !this.bodyIsOverflowing && a ? this.scrollbarWidth : "", | |
paddingRight: this.bodyIsOverflowing && !a ? this.scrollbarWidth : "" | |
}); | |
}, c.prototype.resetAdjustments = function () { | |
this.$element.css({ | |
paddingLeft: "", | |
paddingRight: "" | |
}); | |
}, c.prototype.checkScrollbar = function () { | |
var a = window.innerWidth; | |
if (!a) { | |
var b = document.documentElement.getBoundingClientRect(); | |
a = b.right - Math.abs(b.left); | |
} | |
this.bodyIsOverflowing = document.body.clientWidth < a, this.scrollbarWidth = this.measureScrollbar(); | |
}, c.prototype.setScrollbar = function () { | |
var a = parseInt(this.$body.css("padding-right") || 0, 10); | |
this.originalBodyPad = document.body.style.paddingRight || "", this.bodyIsOverflowing && this.$body.css("padding-right", a + this.scrollbarWidth); | |
}, c.prototype.resetScrollbar = function () { | |
this.$body.css("padding-right", this.originalBodyPad); | |
}, c.prototype.measureScrollbar = function () { | |
var a = document.createElement("div"); | |
a.className = "modal-scrollbar-measure", this.$body.append(a); | |
var b = a.offsetWidth - a.clientWidth; | |
return this.$body[0].removeChild(a), b; | |
}; | |
var d = a.fn.modal; | |
a.fn.modal = b, a.fn.modal.Constructor = c, a.fn.modal.noConflict = function () { | |
return a.fn.modal = d, this; | |
}, a(document).on("click.bs.modal.data-api", '[data-toggle="modal"]', function (c) { | |
var d = a(this), | |
e = d.attr("href"), | |
f = a(d.attr("data-target") || e && e.replace(/.*(?=#[^\s]+$)/, "")), | |
g = f.data("bs.modal") ? "toggle" : a.extend({ | |
remote: !/#/.test(e) && e | |
}, f.data(), d.data()); | |
d.is("a") && c.preventDefault(), f.one("show.bs.modal", function (a) { | |
a.isDefaultPrevented() || f.one("hidden.bs.modal", function () { | |
d.is(":visible") && d.trigger("focus"); | |
}); | |
}), b.call(f, g, this); | |
}); | |
}(jQuery), +function (a) { | |
"use strict"; | |
function b(b) { | |
return this.each(function () { | |
var d = a(this), | |
e = d.data("bs.tooltip"), | |
f = "object" == (typeof b === "undefined" ? "undefined" : _typeof(b)) && b; | |
!e && /destroy|hide/.test(b) || (e || d.data("bs.tooltip", e = new c(this, f)), "string" == typeof b && e[b]()); | |
}); | |
} | |
var c = function c(a, b) { | |
this.type = null, this.options = null, this.enabled = null, this.timeout = null, this.hoverState = null, this.$element = null, this.inState = null, this.init("tooltip", a, b); | |
}; | |
c.VERSION = "3.3.7", c.TRANSITION_DURATION = 150, c.DEFAULTS = { | |
animation: !0, | |
placement: "top", | |
selector: !1, | |
template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>', | |
trigger: "hover focus", | |
title: "", | |
delay: 0, | |
html: !1, | |
container: !1, | |
viewport: { | |
selector: "body", | |
padding: 0 | |
} | |
}, c.prototype.init = function (b, c, d) { | |
if (this.enabled = !0, this.type = b, this.$element = a(c), this.options = this.getOptions(d), this.$viewport = this.options.viewport && a(a.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : this.options.viewport.selector || this.options.viewport), this.inState = { | |
click: !1, | |
hover: !1, | |
focus: !1 | |
}, this.$element[0] instanceof document.constructor && !this.options.selector) throw new Error("`selector` option must be specified when initializing " + this.type + " on the window.document object!"); | |
for (var e = this.options.trigger.split(" "), f = e.length; f--;) { | |
var g = e[f]; | |
if ("click" == g) this.$element.on("click." + this.type, this.options.selector, a.proxy(this.toggle, this));else if ("manual" != g) { | |
var h = "hover" == g ? "mouseenter" : "focusin", | |
i = "hover" == g ? "mouseleave" : "focusout"; | |
this.$element.on(h + "." + this.type, this.options.selector, a.proxy(this.enter, this)), this.$element.on(i + "." + this.type, this.options.selector, a.proxy(this.leave, this)); | |
} | |
} | |
this.options.selector ? this._options = a.extend({}, this.options, { | |
trigger: "manual", | |
selector: "" | |
}) : this.fixTitle(); | |
}, c.prototype.getDefaults = function () { | |
return c.DEFAULTS; | |
}, c.prototype.getOptions = function (b) { | |
return b = a.extend({}, this.getDefaults(), this.$element.data(), b), b.delay && "number" == typeof b.delay && (b.delay = { | |
show: b.delay, | |
hide: b.delay | |
}), b; | |
}, c.prototype.getDelegateOptions = function () { | |
var b = {}, | |
c = this.getDefaults(); | |
return this._options && a.each(this._options, function (a, d) { | |
c[a] != d && (b[a] = d); | |
}), b; | |
}, c.prototype.enter = function (b) { | |
var c = b instanceof this.constructor ? b : a(b.currentTarget).data("bs." + this.type); | |
return c || (c = new this.constructor(b.currentTarget, this.getDelegateOptions()), a(b.currentTarget).data("bs." + this.type, c)), b instanceof a.Event && (c.inState["focusin" == b.type ? "focus" : "hover"] = !0), c.tip().hasClass("in") || "in" == c.hoverState ? void (c.hoverState = "in") : (clearTimeout(c.timeout), c.hoverState = "in", c.options.delay && c.options.delay.show ? void (c.timeout = setTimeout(function () { | |
"in" == c.hoverState && c.show(); | |
}, c.options.delay.show)) : c.show()); | |
}, c.prototype.isInStateTrue = function () { | |
for (var a in this.inState) { | |
if (this.inState[a]) return !0; | |
}return !1; | |
}, c.prototype.leave = function (b) { | |
var c = b instanceof this.constructor ? b : a(b.currentTarget).data("bs." + this.type); | |
if (c || (c = new this.constructor(b.currentTarget, this.getDelegateOptions()), a(b.currentTarget).data("bs." + this.type, c)), b instanceof a.Event && (c.inState["focusout" == b.type ? "focus" : "hover"] = !1), !c.isInStateTrue()) return clearTimeout(c.timeout), c.hoverState = "out", c.options.delay && c.options.delay.hide ? void (c.timeout = setTimeout(function () { | |
"out" == c.hoverState && c.hide(); | |
}, c.options.delay.hide)) : c.hide(); | |
}, c.prototype.show = function () { | |
var b = a.Event("show.bs." + this.type); | |
if (this.hasContent() && this.enabled) { | |
this.$element.trigger(b); | |
var d = a.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]); | |
if (b.isDefaultPrevented() || !d) return; | |
var e = this, | |
f = this.tip(), | |
g = this.getUID(this.type); | |
this.setContent(), f.attr("id", g), this.$element.attr("aria-describedby", g), this.options.animation && f.addClass("fade"); | |
var h = "function" == typeof this.options.placement ? this.options.placement.call(this, f[0], this.$element[0]) : this.options.placement, | |
i = /\s?auto?\s?/i, | |
j = i.test(h); | |
j && (h = h.replace(i, "") || "top"), f.detach().css({ | |
top: 0, | |
left: 0, | |
display: "block" | |
}).addClass(h).data("bs." + this.type, this), this.options.container ? f.appendTo(this.options.container) : f.insertAfter(this.$element), this.$element.trigger("inserted.bs." + this.type); | |
var k = this.getPosition(), | |
l = f[0].offsetWidth, | |
m = f[0].offsetHeight; | |
if (j) { | |
var n = h, | |
o = this.getPosition(this.$viewport); | |
h = "bottom" == h && k.bottom + m > o.bottom ? "top" : "top" == h && k.top - m < o.top ? "bottom" : "right" == h && k.right + l > o.width ? "left" : "left" == h && k.left - l < o.left ? "right" : h, f.removeClass(n).addClass(h); | |
} | |
var p = this.getCalculatedOffset(h, k, l, m); | |
this.applyPlacement(p, h); | |
var q = function q() { | |
var a = e.hoverState; | |
e.$element.trigger("shown.bs." + e.type), e.hoverState = null, "out" == a && e.leave(e); | |
}; | |
a.support.transition && this.$tip.hasClass("fade") ? f.one("bsTransitionEnd", q).emulateTransitionEnd(c.TRANSITION_DURATION) : q(); | |
} | |
}, c.prototype.applyPlacement = function (b, c) { | |
var d = this.tip(), | |
e = d[0].offsetWidth, | |
f = d[0].offsetHeight, | |
g = parseInt(d.css("margin-top"), 10), | |
h = parseInt(d.css("margin-left"), 10); | |
isNaN(g) && (g = 0), isNaN(h) && (h = 0), b.top += g, b.left += h, a.offset.setOffset(d[0], a.extend({ | |
using: function using(a) { | |
d.css({ | |
top: Math.round(a.top), | |
left: Math.round(a.left) | |
}); | |
} | |
}, b), 0), d.addClass("in"); | |
var i = d[0].offsetWidth, | |
j = d[0].offsetHeight; | |
"top" == c && j != f && (b.top = b.top + f - j); | |
var k = this.getViewportAdjustedDelta(c, b, i, j); | |
k.left ? b.left += k.left : b.top += k.top; | |
var l = /top|bottom/.test(c), | |
m = l ? 2 * k.left - e + i : 2 * k.top - f + j, | |
n = l ? "offsetWidth" : "offsetHeight"; | |
d.offset(b), this.replaceArrow(m, d[0][n], l); | |
}, c.prototype.replaceArrow = function (a, b, c) { | |
this.arrow().css(c ? "left" : "top", 50 * (1 - a / b) + "%").css(c ? "top" : "left", ""); | |
}, c.prototype.setContent = function () { | |
var a = this.tip(), | |
b = this.getTitle(); | |
a.find(".tooltip-inner")[this.options.html ? "html" : "text"](b), a.removeClass("fade in top bottom left right"); | |
}, c.prototype.hide = function (b) { | |
function d() { | |
"in" != e.hoverState && f.detach(), e.$element && e.$element.removeAttr("aria-describedby").trigger("hidden.bs." + e.type), b && b(); | |
} | |
var e = this, | |
f = a(this.$tip), | |
g = a.Event("hide.bs." + this.type); | |
if (this.$element.trigger(g), !g.isDefaultPrevented()) return f.removeClass("in"), a.support.transition && f.hasClass("fade") ? f.one("bsTransitionEnd", d).emulateTransitionEnd(c.TRANSITION_DURATION) : d(), this.hoverState = null, this; | |
}, c.prototype.fixTitle = function () { | |
var a = this.$element; | |
(a.attr("title") || "string" != typeof a.attr("data-original-title")) && a.attr("data-original-title", a.attr("title") || "").attr("title", ""); | |
}, c.prototype.hasContent = function () { | |
return this.getTitle(); | |
}, c.prototype.getPosition = function (b) { | |
b = b || this.$element; | |
var c = b[0], | |
d = "BODY" == c.tagName, | |
e = c.getBoundingClientRect(); | |
null == e.width && (e = a.extend({}, e, { | |
width: e.right - e.left, | |
height: e.bottom - e.top | |
})); | |
var f = window.SVGElement && c instanceof window.SVGElement, | |
g = d ? { | |
top: 0, | |
left: 0 | |
} : f ? null : b.offset(), | |
h = { | |
scroll: d ? document.documentElement.scrollTop || document.body.scrollTop : b.scrollTop() | |
}, | |
i = d ? { | |
width: a(window).width(), | |
height: a(window).height() | |
} : null; | |
return a.extend({}, e, h, i, g); | |
}, c.prototype.getCalculatedOffset = function (a, b, c, d) { | |
return "bottom" == a ? { | |
top: b.top + b.height, | |
left: b.left + b.width / 2 - c / 2 | |
} : "top" == a ? { | |
top: b.top - d, | |
left: b.left + b.width / 2 - c / 2 | |
} : "left" == a ? { | |
top: b.top + b.height / 2 - d / 2, | |
left: b.left - c | |
} : { | |
top: b.top + b.height / 2 - d / 2, | |
left: b.left + b.width | |
}; | |
}, c.prototype.getViewportAdjustedDelta = function (a, b, c, d) { | |
var e = { | |
top: 0, | |
left: 0 | |
}; | |
if (!this.$viewport) return e; | |
var f = this.options.viewport && this.options.viewport.padding || 0, | |
g = this.getPosition(this.$viewport); | |
if (/right|left/.test(a)) { | |
var h = b.top - f - g.scroll, | |
i = b.top + f - g.scroll + d; | |
h < g.top ? e.top = g.top - h : i > g.top + g.height && (e.top = g.top + g.height - i); | |
} else { | |
var j = b.left - f, | |
k = b.left + f + c; | |
j < g.left ? e.left = g.left - j : k > g.right && (e.left = g.left + g.width - k); | |
} | |
return e; | |
}, c.prototype.getTitle = function () { | |
var a, | |
b = this.$element, | |
c = this.options; | |
return a = b.attr("data-original-title") || ("function" == typeof c.title ? c.title.call(b[0]) : c.title); | |
}, c.prototype.getUID = function (a) { | |
do { | |
a += ~~(1e6 * Math.random()); | |
} while (document.getElementById(a)); | |
return a; | |
}, c.prototype.tip = function () { | |
if (!this.$tip && (this.$tip = a(this.options.template), 1 != this.$tip.length)) throw new Error(this.type + " `template` option must consist of exactly 1 top-level element!"); | |
return this.$tip; | |
}, c.prototype.arrow = function () { | |
return this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow"); | |
}, c.prototype.enable = function () { | |
this.enabled = !0; | |
}, c.prototype.disable = function () { | |
this.enabled = !1; | |
}, c.prototype.toggleEnabled = function () { | |
this.enabled = !this.enabled; | |
}, c.prototype.toggle = function (b) { | |
var c = this; | |
b && (c = a(b.currentTarget).data("bs." + this.type), c || (c = new this.constructor(b.currentTarget, this.getDelegateOptions()), a(b.currentTarget).data("bs." + this.type, c))), b ? (c.inState.click = !c.inState.click, c.isInStateTrue() ? c.enter(c) : c.leave(c)) : c.tip().hasClass("in") ? c.leave(c) : c.enter(c); | |
}, c.prototype.destroy = function () { | |
var a = this; | |
clearTimeout(this.timeout), this.hide(function () { | |
a.$element.off("." + a.type).removeData("bs." + a.type), a.$tip && a.$tip.detach(), a.$tip = null, a.$arrow = null, a.$viewport = null, a.$element = null; | |
}); | |
}; | |
var d = a.fn.tooltip; | |
a.fn.tooltip = b, a.fn.tooltip.Constructor = c, a.fn.tooltip.noConflict = function () { | |
return a.fn.tooltip = d, this; | |
}; | |
}(jQuery), +function (a) { | |
"use strict"; | |
function b(b) { | |
return this.each(function () { | |
var d = a(this), | |
e = d.data("bs.popover"), | |
f = "object" == (typeof b === "undefined" ? "undefined" : _typeof(b)) && b; | |
!e && /destroy|hide/.test(b) || (e || d.data("bs.popover", e = new c(this, f)), "string" == typeof b && e[b]()); | |
}); | |
} | |
var c = function c(a, b) { | |
this.init("popover", a, b); | |
}; | |
if (!a.fn.tooltip) throw new Error("Popover requires tooltip.js"); | |
c.VERSION = "3.3.7", c.DEFAULTS = a.extend({}, a.fn.tooltip.Constructor.DEFAULTS, { | |
placement: "right", | |
trigger: "click", | |
content: "", | |
template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>' | |
}), c.prototype = a.extend({}, a.fn.tooltip.Constructor.prototype), c.prototype.constructor = c, c.prototype.getDefaults = function () { | |
return c.DEFAULTS; | |
}, c.prototype.setContent = function () { | |
var a = this.tip(), | |
b = this.getTitle(), | |
c = this.getContent(); | |
a.find(".popover-title")[this.options.html ? "html" : "text"](b), a.find(".popover-content").children().detach().end()[this.options.html ? "string" == typeof c ? "html" : "append" : "text"](c), a.removeClass("fade top bottom left right in"), a.find(".popover-title").html() || a.find(".popover-title").hide(); | |
}, c.prototype.hasContent = function () { | |
return this.getTitle() || this.getContent(); | |
}, c.prototype.getContent = function () { | |
var a = this.$element, | |
b = this.options; | |
return a.attr("data-content") || ("function" == typeof b.content ? b.content.call(a[0]) : b.content); | |
}, c.prototype.arrow = function () { | |
return this.$arrow = this.$arrow || this.tip().find(".arrow"); | |
}; | |
var d = a.fn.popover; | |
a.fn.popover = b, a.fn.popover.Constructor = c, a.fn.popover.noConflict = function () { | |
return a.fn.popover = d, this; | |
}; | |
}(jQuery), +function (a) { | |
"use strict"; | |
function b(c, d) { | |
this.$body = a(document.body), this.$scrollElement = a(a(c).is(document.body) ? window : c), this.options = a.extend({}, b.DEFAULTS, d), this.selector = (this.options.target || "") + " .nav li > a", this.offsets = [], this.targets = [], this.activeTarget = null, this.scrollHeight = 0, this.$scrollElement.on("scroll.bs.scrollspy", a.proxy(this.process, this)), this.refresh(), this.process(); | |
} | |
function c(c) { | |
return this.each(function () { | |
var d = a(this), | |
e = d.data("bs.scrollspy"), | |
f = "object" == (typeof c === "undefined" ? "undefined" : _typeof(c)) && c; | |
e || d.data("bs.scrollspy", e = new b(this, f)), "string" == typeof c && e[c](); | |
}); | |
} | |
b.VERSION = "3.3.7", b.DEFAULTS = { | |
offset: 10 | |
}, b.prototype.getScrollHeight = function () { | |
return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight); | |
}, b.prototype.refresh = function () { | |
var b = this, | |
c = "offset", | |
d = 0; | |
this.offsets = [], this.targets = [], this.scrollHeight = this.getScrollHeight(), a.isWindow(this.$scrollElement[0]) || (c = "position", d = this.$scrollElement.scrollTop()), this.$body.find(this.selector).map(function () { | |
var b = a(this), | |
e = b.data("target") || b.attr("href"), | |
f = /^#./.test(e) && a(e); | |
return f && f.length && f.is(":visible") && [[f[c]().top + d, e]] || null; | |
}).sort(function (a, b) { | |
return a[0] - b[0]; | |
}).each(function () { | |
b.offsets.push(this[0]), b.targets.push(this[1]); | |
}); | |
}, b.prototype.process = function () { | |
var a, | |
b = this.$scrollElement.scrollTop() + this.options.offset, | |
c = this.getScrollHeight(), | |
d = this.options.offset + c - this.$scrollElement.height(), | |
e = this.offsets, | |
f = this.targets, | |
g = this.activeTarget; | |
if (this.scrollHeight != c && this.refresh(), b >= d) return g != (a = f[f.length - 1]) && this.activate(a); | |
if (g && b < e[0]) return this.activeTarget = null, this.clear(); | |
for (a = e.length; a--;) { | |
g != f[a] && b >= e[a] && (void 0 === e[a + 1] || b < e[a + 1]) && this.activate(f[a]); | |
} | |
}, b.prototype.activate = function (b) { | |
this.activeTarget = b, this.clear(); | |
var c = this.selector + '[data-target="' + b + '"],' + this.selector + '[href="' + b + '"]', | |
d = a(c).parents("li").addClass("active"); | |
d.parent(".dropdown-menu").length && (d = d.closest("li.dropdown").addClass("active")), d.trigger("activate.bs.scrollspy"); | |
}, b.prototype.clear = function () { | |
a(this.selector).parentsUntil(this.options.target, ".active").removeClass("active"); | |
}; | |
var d = a.fn.scrollspy; | |
a.fn.scrollspy = c, a.fn.scrollspy.Constructor = b, a.fn.scrollspy.noConflict = function () { | |
return a.fn.scrollspy = d, this; | |
}, a(window).on("load.bs.scrollspy.data-api", function () { | |
a('[data-spy="scroll"]').each(function () { | |
var b = a(this); | |
c.call(b, b.data()); | |
}); | |
}); | |
}(jQuery), +function (a) { | |
"use strict"; | |
function b(b) { | |
return this.each(function () { | |
var d = a(this), | |
e = d.data("bs.tab"); | |
e || d.data("bs.tab", e = new c(this)), "string" == typeof b && e[b](); | |
}); | |
} | |
var c = function c(b) { | |
this.element = a(b); | |
}; | |
c.VERSION = "3.3.7", c.TRANSITION_DURATION = 150, c.prototype.show = function () { | |
var b = this.element, | |
c = b.closest("ul:not(.dropdown-menu)"), | |
d = b.data("target"); | |
if (d || (d = b.attr("href"), d = d && d.replace(/.*(?=#[^\s]*$)/, "")), !b.parent("li").hasClass("active")) { | |
var e = c.find(".active:last a"), | |
f = a.Event("hide.bs.tab", { | |
relatedTarget: b[0] | |
}), | |
g = a.Event("show.bs.tab", { | |
relatedTarget: e[0] | |
}); | |
if (e.trigger(f), b.trigger(g), !g.isDefaultPrevented() && !f.isDefaultPrevented()) { | |
var h = a(d); | |
this.activate(b.closest("li"), c), this.activate(h, h.parent(), function () { | |
e.trigger({ | |
type: "hidden.bs.tab", | |
relatedTarget: b[0] | |
}), b.trigger({ | |
type: "shown.bs.tab", | |
relatedTarget: e[0] | |
}); | |
}); | |
} | |
} | |
}, c.prototype.activate = function (b, d, e) { | |
function f() { | |
g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded", !1), b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded", !0), h ? (b[0].offsetWidth, b.addClass("in")) : b.removeClass("fade"), b.parent(".dropdown-menu").length && b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded", !0), e && e(); | |
} | |
var g = d.find("> .active"), | |
h = e && a.support.transition && (g.length && g.hasClass("fade") || !!d.find("> .fade").length); | |
g.length && h ? g.one("bsTransitionEnd", f).emulateTransitionEnd(c.TRANSITION_DURATION) : f(), g.removeClass("in"); | |
}; | |
var d = a.fn.tab; | |
a.fn.tab = b, a.fn.tab.Constructor = c, a.fn.tab.noConflict = function () { | |
return a.fn.tab = d, this; | |
}; | |
var e = function e(c) { | |
c.preventDefault(), b.call(a(this), "show"); | |
}; | |
a(document).on("click.bs.tab.data-api", '[data-toggle="tab"]', e).on("click.bs.tab.data-api", '[data-toggle="pill"]', e); | |
}(jQuery), +function (a) { | |
"use strict"; | |
function b(b) { | |
return this.each(function () { | |
var d = a(this), | |
e = d.data("bs.affix"), | |
f = "object" == (typeof b === "undefined" ? "undefined" : _typeof(b)) && b; | |
e || d.data("bs.affix", e = new c(this, f)), "string" == typeof b && e[b](); | |
}); | |
} | |
var c = function c(b, d) { | |
this.options = a.extend({}, c.DEFAULTS, d), this.$target = a(this.options.target).on("scroll.bs.affix.data-api", a.proxy(this.checkPosition, this)).on("click.bs.affix.data-api", a.proxy(this.checkPositionWithEventLoop, this)), this.$element = a(b), this.affixed = null, this.unpin = null, this.pinnedOffset = null, this.checkPosition(); | |
}; | |
c.VERSION = "3.3.7", c.RESET = "affix affix-top affix-bottom", c.DEFAULTS = { | |
offset: 0, | |
target: window | |
}, c.prototype.getState = function (a, b, c, d) { | |
var e = this.$target.scrollTop(), | |
f = this.$element.offset(), | |
g = this.$target.height(); | |
if (null != c && "top" == this.affixed) return e < c && "top"; | |
if ("bottom" == this.affixed) return null != c ? !(e + this.unpin <= f.top) && "bottom" : !(e + g <= a - d) && "bottom"; | |
var h = null == this.affixed, | |
i = h ? e : f.top, | |
j = h ? g : b; | |
return null != c && e <= c ? "top" : null != d && i + j >= a - d && "bottom"; | |
}, c.prototype.getPinnedOffset = function () { | |
if (this.pinnedOffset) return this.pinnedOffset; | |
this.$element.removeClass(c.RESET).addClass("affix"); | |
var a = this.$target.scrollTop(), | |
b = this.$element.offset(); | |
return this.pinnedOffset = b.top - a; | |
}, c.prototype.checkPositionWithEventLoop = function () { | |
setTimeout(a.proxy(this.checkPosition, this), 1); | |
}, c.prototype.checkPosition = function () { | |
if (this.$element.is(":visible")) { | |
var b = this.$element.height(), | |
d = this.options.offset, | |
e = d.top, | |
f = d.bottom, | |
g = Math.max(a(document).height(), a(document.body).height()); | |
"object" != (typeof d === "undefined" ? "undefined" : _typeof(d)) && (f = e = d), "function" == typeof e && (e = d.top(this.$element)), "function" == typeof f && (f = d.bottom(this.$element)); | |
var h = this.getState(g, b, e, f); | |
if (this.affixed != h) { | |
null != this.unpin && this.$element.css("top", ""); | |
var i = "affix" + (h ? "-" + h : ""), | |
j = a.Event(i + ".bs.affix"); | |
if (this.$element.trigger(j), j.isDefaultPrevented()) return; | |
this.affixed = h, this.unpin = "bottom" == h ? this.getPinnedOffset() : null, this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix", "affixed") + ".bs.affix"); | |
} | |
"bottom" == h && this.$element.offset({ | |
top: g - b - f | |
}); | |
} | |
}; | |
var d = a.fn.affix; | |
a.fn.affix = b, a.fn.affix.Constructor = c, a.fn.affix.noConflict = function () { | |
return a.fn.affix = d, this; | |
}, a(window).on("load", function () { | |
a('[data-spy="affix"]').each(function () { | |
var c = a(this), | |
d = c.data(); | |
d.offset = d.offset || {}, null != d.offsetBottom && (d.offset.bottom = d.offsetBottom), null != d.offsetTop && (d.offset.top = d.offsetTop), b.call(c, d); | |
}); | |
}); | |
}(jQuery); | |
}); | |
require.register("web/static/js/list.js", function(exports, require, module) { | |
"use strict"; | |
var _socket = require("./socket"); | |
var _socket2 = _interopRequireDefault(_socket); | |
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | |
/* | |
This file handles the changes in the textbox of the list page. | |
Whenever the user typed a few keystrokes they are sent over the websocket to the phoenix server. | |
This server will then broadcast them to all the other lcients that are looking at this page. | |
*/ | |
// Now that you are connected, you can join channels with a topic: | |
var channel = _socket2.default.channel("list:1", {}); | |
channel.join().receive("ok", function (resp) { | |
console.log("Joined successfully", resp); | |
}).receive("error", function (resp) { | |
console.log("Unable to join", resp); | |
}); | |
channel.on("ping", function (_ref) { | |
var count = _ref.count; | |
return console.log("PING, count)"); | |
}); | |
var handleInput = function handleInput(event) { | |
var new_text = event.srcElement.value; | |
console.log(new_text); | |
var payload = { "new_text": new_text }; | |
channel.push("text_changed", payload); | |
}; | |
var e = document.getElementById('item-add-textbox'); | |
e.oninput = handleInput; | |
e.onpropertychange = e.oninput; | |
var deleted = function deleted() { | |
console.log('you clicked me'); | |
}; | |
console.log('hello from list.js'); | |
}); | |
require.register("web/static/js/socket.js", function(exports, require, module) { | |
"use strict"; | |
Object.defineProperty(exports, "__esModule", { | |
value: true | |
}); | |
var _phoenix = require("phoenix"); | |
var socket = new _phoenix.Socket("/socket", { | |
params: { | |
token: window.userToken | |
} | |
}); | |
// When you connect, you'll often need to authenticate the client. | |
// For example, imagine you have an authentication plug, `MyAuth`, | |
// which authenticates the session and assigns a `:current_user`. | |
// If the current user exists you can assign the user's token in | |
// the connection for use in the layout. | |
// | |
// In your "web/router.ex": | |
// | |
// pipeline :browser do | |
// ... | |
// plug MyAuth | |
// plug :put_user_token | |
// end | |
// | |
// defp put_user_token(conn, _) do | |
// if current_user = conn.assigns[:current_user] do | |
// token = Phoenix.Token.sign(conn, "user socket", current_user.id) | |
// assign(conn, :user_token, token) | |
// else | |
// conn | |
// end | |
// end | |
// | |
// Now you need to pass this token to JavaScript. You can do so | |
// inside a script tag in "web/templates/layout/app.html.eex": | |
// | |
// <script>window.userToken = "<%= assigns[:user_token] %>";</script> | |
// | |
// You will need to verify the user token in the "connect/2" function | |
// in "web/channels/user_socket.ex": | |
// | |
// def connect(%{"token" => token}, socket) do | |
// # max_age: 1209600 is equivalent to two weeks in seconds | |
// case Phoenix.Token.verify(socket, "user socket", token, max_age: 1209600) do | |
// {:ok, user_id} -> | |
// {:ok, assign(socket, :user, user_id)} | |
// {:error, reason} -> | |
// :error | |
// end | |
// end | |
// | |
// Finally, pass the token on connect as below. Or remove it | |
// from connect if you don't care about authentication. | |
// NOTE: The contents of this file will only be executed if | |
// you uncomment its entry in "web/static/js/app.js". | |
// To use Phoenix channels, the first step is to import Socket | |
// and connect at the socket path in "lib/my_app/endpoint.ex": | |
socket.connect(); | |
// // Now that you are connected, you can join channels with a topic: | |
// let channel = socket.channel("shopping:1", {}) | |
// channel.join() | |
// .receive("ok", resp => { console.log("Joined successfully", resp) }) | |
// .receive("error", resp => { console.log("Unable to join", resp) }) | |
exports.default = socket; | |
}); | |
require.alias("phoenix/priv/static/phoenix.js", "phoenix"); | |
require.alias("phoenix_html/priv/static/phoenix_html.js", "phoenix_html");require.register("___globals___", function(exports, require, module) { | |
});})();require('___globals___'); | |
require('web/static/js/app'); | |
//# sourceMappingURL=app.js.map |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment