{"version":3,"file":"calendar.js","sources":["../../../../../node_modules/page/page.mjs","../src/lib/width-observer.js","../src/lib/linked-update-modal.js","../src/lib/outside-clicks.js","../src/webcomponents/post-likes-display.js","../src/webcomponents/post-like-button.js","../src/webcomponents/train-post.js","../src/webcomponents/meal-date-row.js","../src/webcomponents/recent-activity-row.js","../src/webcomponents/calendar-display.js","../src/webcomponents/calendar-list.js","../src/calendar.js"],"sourcesContent":["var isarray = Array.isArray || function (arr) {\n return Object.prototype.toString.call(arr) == '[object Array]';\n};\n\n/**\n * Expose `pathToRegexp`.\n */\nvar pathToRegexp_1 = pathToRegexp;\nvar parse_1 = parse;\nvar compile_1 = compile;\nvar tokensToFunction_1 = tokensToFunction;\nvar tokensToRegExp_1 = tokensToRegExp;\n\n/**\n * The main path matching regexp utility.\n *\n * @type {RegExp}\n */\nvar PATH_REGEXP = new RegExp([\n // Match escaped characters that would otherwise appear in future matches.\n // This allows the user to escape special characters that won't transform.\n '(\\\\\\\\.)',\n // Match Express-style parameters and un-named parameters with a prefix\n // and optional suffixes. Matches appear as:\n //\n // \"/:test(\\\\d+)?\" => [\"/\", \"test\", \"\\d+\", undefined, \"?\", undefined]\n // \"/route(\\\\d+)\" => [undefined, undefined, undefined, \"\\d+\", undefined, undefined]\n // \"/*\" => [\"/\", undefined, undefined, undefined, undefined, \"*\"]\n '([\\\\/.])?(?:(?:\\\\:(\\\\w+)(?:\\\\(((?:\\\\\\\\.|[^()])+)\\\\))?|\\\\(((?:\\\\\\\\.|[^()])+)\\\\))([+*?])?|(\\\\*))'\n].join('|'), 'g');\n\n/**\n * Parse a string for the raw tokens.\n *\n * @param {String} str\n * @return {Array}\n */\nfunction parse (str) {\n var tokens = [];\n var key = 0;\n var index = 0;\n var path = '';\n var res;\n\n while ((res = PATH_REGEXP.exec(str)) != null) {\n var m = res[0];\n var escaped = res[1];\n var offset = res.index;\n path += str.slice(index, offset);\n index = offset + m.length;\n\n // Ignore already escaped sequences.\n if (escaped) {\n path += escaped[1];\n continue\n }\n\n // Push the current path onto the tokens.\n if (path) {\n tokens.push(path);\n path = '';\n }\n\n var prefix = res[2];\n var name = res[3];\n var capture = res[4];\n var group = res[5];\n var suffix = res[6];\n var asterisk = res[7];\n\n var repeat = suffix === '+' || suffix === '*';\n var optional = suffix === '?' || suffix === '*';\n var delimiter = prefix || '/';\n var pattern = capture || group || (asterisk ? '.*' : '[^' + delimiter + ']+?');\n\n tokens.push({\n name: name || key++,\n prefix: prefix || '',\n delimiter: delimiter,\n optional: optional,\n repeat: repeat,\n pattern: escapeGroup(pattern)\n });\n }\n\n // Match any characters still remaining.\n if (index < str.length) {\n path += str.substr(index);\n }\n\n // If the path exists, push it onto the end.\n if (path) {\n tokens.push(path);\n }\n\n return tokens\n}\n\n/**\n * Compile a string to a template function for the path.\n *\n * @param {String} str\n * @return {Function}\n */\nfunction compile (str) {\n return tokensToFunction(parse(str))\n}\n\n/**\n * Expose a method for transforming tokens into the path function.\n */\nfunction tokensToFunction (tokens) {\n // Compile all the tokens into regexps.\n var matches = new Array(tokens.length);\n\n // Compile all the patterns before compilation.\n for (var i = 0; i < tokens.length; i++) {\n if (typeof tokens[i] === 'object') {\n matches[i] = new RegExp('^' + tokens[i].pattern + '$');\n }\n }\n\n return function (obj) {\n var path = '';\n var data = obj || {};\n\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n\n if (typeof token === 'string') {\n path += token;\n\n continue\n }\n\n var value = data[token.name];\n var segment;\n\n if (value == null) {\n if (token.optional) {\n continue\n } else {\n throw new TypeError('Expected \"' + token.name + '\" to be defined')\n }\n }\n\n if (isarray(value)) {\n if (!token.repeat) {\n throw new TypeError('Expected \"' + token.name + '\" to not repeat, but received \"' + value + '\"')\n }\n\n if (value.length === 0) {\n if (token.optional) {\n continue\n } else {\n throw new TypeError('Expected \"' + token.name + '\" to not be empty')\n }\n }\n\n for (var j = 0; j < value.length; j++) {\n segment = encodeURIComponent(value[j]);\n\n if (!matches[i].test(segment)) {\n throw new TypeError('Expected all \"' + token.name + '\" to match \"' + token.pattern + '\", but received \"' + segment + '\"')\n }\n\n path += (j === 0 ? token.prefix : token.delimiter) + segment;\n }\n\n continue\n }\n\n segment = encodeURIComponent(value);\n\n if (!matches[i].test(segment)) {\n throw new TypeError('Expected \"' + token.name + '\" to match \"' + token.pattern + '\", but received \"' + segment + '\"')\n }\n\n path += token.prefix + segment;\n }\n\n return path\n }\n}\n\n/**\n * Escape a regular expression string.\n *\n * @param {String} str\n * @return {String}\n */\nfunction escapeString (str) {\n return str.replace(/([.+*?=^!:${}()[\\]|\\/])/g, '\\\\$1')\n}\n\n/**\n * Escape the capturing group by escaping special characters and meaning.\n *\n * @param {String} group\n * @return {String}\n */\nfunction escapeGroup (group) {\n return group.replace(/([=!:$\\/()])/g, '\\\\$1')\n}\n\n/**\n * Attach the keys as a property of the regexp.\n *\n * @param {RegExp} re\n * @param {Array} keys\n * @return {RegExp}\n */\nfunction attachKeys (re, keys) {\n re.keys = keys;\n return re\n}\n\n/**\n * Get the flags for a regexp from the options.\n *\n * @param {Object} options\n * @return {String}\n */\nfunction flags (options) {\n return options.sensitive ? '' : 'i'\n}\n\n/**\n * Pull out keys from a regexp.\n *\n * @param {RegExp} path\n * @param {Array} keys\n * @return {RegExp}\n */\nfunction regexpToRegexp (path, keys) {\n // Use a negative lookahead to match only capturing groups.\n var groups = path.source.match(/\\((?!\\?)/g);\n\n if (groups) {\n for (var i = 0; i < groups.length; i++) {\n keys.push({\n name: i,\n prefix: null,\n delimiter: null,\n optional: false,\n repeat: false,\n pattern: null\n });\n }\n }\n\n return attachKeys(path, keys)\n}\n\n/**\n * Transform an array into a regexp.\n *\n * @param {Array} path\n * @param {Array} keys\n * @param {Object} options\n * @return {RegExp}\n */\nfunction arrayToRegexp (path, keys, options) {\n var parts = [];\n\n for (var i = 0; i < path.length; i++) {\n parts.push(pathToRegexp(path[i], keys, options).source);\n }\n\n var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options));\n\n return attachKeys(regexp, keys)\n}\n\n/**\n * Create a path regexp from string input.\n *\n * @param {String} path\n * @param {Array} keys\n * @param {Object} options\n * @return {RegExp}\n */\nfunction stringToRegexp (path, keys, options) {\n var tokens = parse(path);\n var re = tokensToRegExp(tokens, options);\n\n // Attach keys back to the regexp.\n for (var i = 0; i < tokens.length; i++) {\n if (typeof tokens[i] !== 'string') {\n keys.push(tokens[i]);\n }\n }\n\n return attachKeys(re, keys)\n}\n\n/**\n * Expose a function for taking tokens and returning a RegExp.\n *\n * @param {Array} tokens\n * @param {Array} keys\n * @param {Object} options\n * @return {RegExp}\n */\nfunction tokensToRegExp (tokens, options) {\n options = options || {};\n\n var strict = options.strict;\n var end = options.end !== false;\n var route = '';\n var lastToken = tokens[tokens.length - 1];\n var endsWithSlash = typeof lastToken === 'string' && /\\/$/.test(lastToken);\n\n // Iterate over the tokens and create our regexp string.\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n\n if (typeof token === 'string') {\n route += escapeString(token);\n } else {\n var prefix = escapeString(token.prefix);\n var capture = token.pattern;\n\n if (token.repeat) {\n capture += '(?:' + prefix + capture + ')*';\n }\n\n if (token.optional) {\n if (prefix) {\n capture = '(?:' + prefix + '(' + capture + '))?';\n } else {\n capture = '(' + capture + ')?';\n }\n } else {\n capture = prefix + '(' + capture + ')';\n }\n\n route += capture;\n }\n }\n\n // In non-strict mode we allow a slash at the end of match. If the path to\n // match already ends with a slash, we remove it for consistency. The slash\n // is valid at the end of a path match, not in the middle. This is important\n // in non-ending mode, where \"/test/\" shouldn't match \"/test//route\".\n if (!strict) {\n route = (endsWithSlash ? route.slice(0, -2) : route) + '(?:\\\\/(?=$))?';\n }\n\n if (end) {\n route += '$';\n } else {\n // In non-ending mode, we need the capturing groups to match as much as\n // possible by using a positive lookahead to the end or next path segment.\n route += strict && endsWithSlash ? '' : '(?=\\\\/|$)';\n }\n\n return new RegExp('^' + route, flags(options))\n}\n\n/**\n * Normalize the given path string, returning a regular expression.\n *\n * An empty array can be passed in for the keys, which will hold the\n * placeholder key descriptions. For example, using `/user/:id`, `keys` will\n * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.\n *\n * @param {(String|RegExp|Array)} path\n * @param {Array} [keys]\n * @param {Object} [options]\n * @return {RegExp}\n */\nfunction pathToRegexp (path, keys, options) {\n keys = keys || [];\n\n if (!isarray(keys)) {\n options = keys;\n keys = [];\n } else if (!options) {\n options = {};\n }\n\n if (path instanceof RegExp) {\n return regexpToRegexp(path, keys, options)\n }\n\n if (isarray(path)) {\n return arrayToRegexp(path, keys, options)\n }\n\n return stringToRegexp(path, keys, options)\n}\n\npathToRegexp_1.parse = parse_1;\npathToRegexp_1.compile = compile_1;\npathToRegexp_1.tokensToFunction = tokensToFunction_1;\npathToRegexp_1.tokensToRegExp = tokensToRegExp_1;\n\n/**\n * Module dependencies.\n */\n\n \n\n /**\n * Short-cuts for global-object checks\n */\n\n var hasDocument = ('undefined' !== typeof document);\n var hasWindow = ('undefined' !== typeof window);\n var hasHistory = ('undefined' !== typeof history);\n var hasProcess = typeof process !== 'undefined';\n\n /**\n * Detect click event\n */\n var clickEvent = hasDocument && document.ontouchstart ? 'touchstart' : 'click';\n\n /**\n * To work properly with the URL\n * history.location generated polyfill in https://github.com/devote/HTML5-History-API\n */\n\n var isLocation = hasWindow && !!(window.history.location || window.location);\n\n /**\n * The page instance\n * @api private\n */\n function Page() {\n // public things\n this.callbacks = [];\n this.exits = [];\n this.current = '';\n this.len = 0;\n\n // private things\n this._decodeURLComponents = true;\n this._base = '';\n this._strict = false;\n this._running = false;\n this._hashbang = false;\n\n // bound functions\n this.clickHandler = this.clickHandler.bind(this);\n this._onpopstate = this._onpopstate.bind(this);\n }\n\n /**\n * Configure the instance of page. This can be called multiple times.\n *\n * @param {Object} options\n * @api public\n */\n\n Page.prototype.configure = function(options) {\n var opts = options || {};\n\n this._window = opts.window || (hasWindow && window);\n this._decodeURLComponents = opts.decodeURLComponents !== false;\n this._popstate = opts.popstate !== false && hasWindow;\n this._click = opts.click !== false && hasDocument;\n this._hashbang = !!opts.hashbang;\n\n var _window = this._window;\n if(this._popstate) {\n _window.addEventListener('popstate', this._onpopstate, false);\n } else if(hasWindow) {\n _window.removeEventListener('popstate', this._onpopstate, false);\n }\n\n if (this._click) {\n _window.document.addEventListener(clickEvent, this.clickHandler, false);\n } else if(hasDocument) {\n _window.document.removeEventListener(clickEvent, this.clickHandler, false);\n }\n\n if(this._hashbang && hasWindow && !hasHistory) {\n _window.addEventListener('hashchange', this._onpopstate, false);\n } else if(hasWindow) {\n _window.removeEventListener('hashchange', this._onpopstate, false);\n }\n };\n\n /**\n * Get or set basepath to `path`.\n *\n * @param {string} path\n * @api public\n */\n\n Page.prototype.base = function(path) {\n if (0 === arguments.length) return this._base;\n this._base = path;\n };\n\n /**\n * Gets the `base`, which depends on whether we are using History or\n * hashbang routing.\n\n * @api private\n */\n Page.prototype._getBase = function() {\n var base = this._base;\n if(!!base) return base;\n var loc = hasWindow && this._window && this._window.location;\n\n if(hasWindow && this._hashbang && loc && loc.protocol === 'file:') {\n base = loc.pathname;\n }\n\n return base;\n };\n\n /**\n * Get or set strict path matching to `enable`\n *\n * @param {boolean} enable\n * @api public\n */\n\n Page.prototype.strict = function(enable) {\n if (0 === arguments.length) return this._strict;\n this._strict = enable;\n };\n\n\n /**\n * Bind with the given `options`.\n *\n * Options:\n *\n * - `click` bind to click events [true]\n * - `popstate` bind to popstate [true]\n * - `dispatch` perform initial dispatch [true]\n *\n * @param {Object} options\n * @api public\n */\n\n Page.prototype.start = function(options) {\n var opts = options || {};\n this.configure(opts);\n\n if (false === opts.dispatch) return;\n this._running = true;\n\n var url;\n if(isLocation) {\n var window = this._window;\n var loc = window.location;\n\n if(this._hashbang && ~loc.hash.indexOf('#!')) {\n url = loc.hash.substr(2) + loc.search;\n } else if (this._hashbang) {\n url = loc.search + loc.hash;\n } else {\n url = loc.pathname + loc.search + loc.hash;\n }\n }\n\n this.replace(url, null, true, opts.dispatch);\n };\n\n /**\n * Unbind click and popstate event handlers.\n *\n * @api public\n */\n\n Page.prototype.stop = function() {\n if (!this._running) return;\n this.current = '';\n this.len = 0;\n this._running = false;\n\n var window = this._window;\n this._click && window.document.removeEventListener(clickEvent, this.clickHandler, false);\n hasWindow && window.removeEventListener('popstate', this._onpopstate, false);\n hasWindow && window.removeEventListener('hashchange', this._onpopstate, false);\n };\n\n /**\n * Show `path` with optional `state` object.\n *\n * @param {string} path\n * @param {Object=} state\n * @param {boolean=} dispatch\n * @param {boolean=} push\n * @return {!Context}\n * @api public\n */\n\n Page.prototype.show = function(path, state, dispatch, push) {\n var ctx = new Context(path, state, this),\n prev = this.prevContext;\n this.prevContext = ctx;\n this.current = ctx.path;\n if (false !== dispatch) this.dispatch(ctx, prev);\n if (false !== ctx.handled && false !== push) ctx.pushState();\n return ctx;\n };\n\n /**\n * Goes back in the history\n * Back should always let the current route push state and then go back.\n *\n * @param {string} path - fallback path to go back if no more history exists, if undefined defaults to page.base\n * @param {Object=} state\n * @api public\n */\n\n Page.prototype.back = function(path, state) {\n var page = this;\n if (this.len > 0) {\n var window = this._window;\n // this may need more testing to see if all browsers\n // wait for the next tick to go back in history\n hasHistory && window.history.back();\n this.len--;\n } else if (path) {\n setTimeout(function() {\n page.show(path, state);\n });\n } else {\n setTimeout(function() {\n page.show(page._getBase(), state);\n });\n }\n };\n\n /**\n * Register route to redirect from one path to other\n * or just redirect to another route\n *\n * @param {string} from - if param 'to' is undefined redirects to 'from'\n * @param {string=} to\n * @api public\n */\n Page.prototype.redirect = function(from, to) {\n var inst = this;\n\n // Define route from a path to another\n if ('string' === typeof from && 'string' === typeof to) {\n page.call(this, from, function(e) {\n setTimeout(function() {\n inst.replace(/** @type {!string} */ (to));\n }, 0);\n });\n }\n\n // Wait for the push state and replace it with another\n if ('string' === typeof from && 'undefined' === typeof to) {\n setTimeout(function() {\n inst.replace(from);\n }, 0);\n }\n };\n\n /**\n * Replace `path` with optional `state` object.\n *\n * @param {string} path\n * @param {Object=} state\n * @param {boolean=} init\n * @param {boolean=} dispatch\n * @return {!Context}\n * @api public\n */\n\n\n Page.prototype.replace = function(path, state, init, dispatch) {\n var ctx = new Context(path, state, this),\n prev = this.prevContext;\n this.prevContext = ctx;\n this.current = ctx.path;\n ctx.init = init;\n ctx.save(); // save before dispatching, which may redirect\n if (false !== dispatch) this.dispatch(ctx, prev);\n return ctx;\n };\n\n /**\n * Dispatch the given `ctx`.\n *\n * @param {Context} ctx\n * @api private\n */\n\n Page.prototype.dispatch = function(ctx, prev) {\n var i = 0, j = 0, page = this;\n\n function nextExit() {\n var fn = page.exits[j++];\n if (!fn) return nextEnter();\n fn(prev, nextExit);\n }\n\n function nextEnter() {\n var fn = page.callbacks[i++];\n\n if (ctx.path !== page.current) {\n ctx.handled = false;\n return;\n }\n if (!fn) return unhandled.call(page, ctx);\n fn(ctx, nextEnter);\n }\n\n if (prev) {\n nextExit();\n } else {\n nextEnter();\n }\n };\n\n /**\n * Register an exit route on `path` with\n * callback `fn()`, which will be called\n * on the previous context when a new\n * page is visited.\n */\n Page.prototype.exit = function(path, fn) {\n if (typeof path === 'function') {\n return this.exit('*', path);\n }\n\n var route = new Route(path, null, this);\n for (var i = 1; i < arguments.length; ++i) {\n this.exits.push(route.middleware(arguments[i]));\n }\n };\n\n /**\n * Handle \"click\" events.\n */\n\n /* jshint +W054 */\n Page.prototype.clickHandler = function(e) {\n if (1 !== this._which(e)) return;\n\n if (e.metaKey || e.ctrlKey || e.shiftKey) return;\n if (e.defaultPrevented) return;\n\n // ensure link\n // use shadow dom when available if not, fall back to composedPath()\n // for browsers that only have shady\n var el = e.target;\n var eventPath = e.path || (e.composedPath ? e.composedPath() : null);\n\n if(eventPath) {\n for (var i = 0; i < eventPath.length; i++) {\n if (!eventPath[i].nodeName) continue;\n if (eventPath[i].nodeName.toUpperCase() !== 'A') continue;\n if (!eventPath[i].href) continue;\n\n el = eventPath[i];\n break;\n }\n }\n\n // continue ensure link\n // el.nodeName for svg links are 'a' instead of 'A'\n while (el && 'A' !== el.nodeName.toUpperCase()) el = el.parentNode;\n if (!el || 'A' !== el.nodeName.toUpperCase()) return;\n\n // check if link is inside an svg\n // in this case, both href and target are always inside an object\n var svg = (typeof el.href === 'object') && el.href.constructor.name === 'SVGAnimatedString';\n\n // Ignore if tag has\n // 1. \"download\" attribute\n // 2. rel=\"external\" attribute\n if (el.hasAttribute('download') || el.getAttribute('rel') === 'external') return;\n\n // ensure non-hash for the same path\n var link = el.getAttribute('href');\n if(!this._hashbang && this._samePath(el) && (el.hash || '#' === link)) return;\n\n // Check for mailto: in the href\n if (link && link.indexOf('mailto:') > -1) return;\n\n // check target\n // svg target is an object and its desired value is in .baseVal property\n if (svg ? el.target.baseVal : el.target) return;\n\n // x-origin\n // note: svg links that are not relative don't call click events (and skip page.js)\n // consequently, all svg links tested inside page.js are relative and in the same origin\n if (!svg && !this.sameOrigin(el.href)) return;\n\n // rebuild path\n // There aren't .pathname and .search properties in svg links, so we use href\n // Also, svg href is an object and its desired value is in .baseVal property\n var path = svg ? el.href.baseVal : (el.pathname + el.search + (el.hash || ''));\n\n path = path[0] !== '/' ? '/' + path : path;\n\n // strip leading \"/[drive letter]:\" on NW.js on Windows\n if (hasProcess && path.match(/^\\/[a-zA-Z]:\\//)) {\n path = path.replace(/^\\/[a-zA-Z]:\\//, '/');\n }\n\n // same page\n var orig = path;\n var pageBase = this._getBase();\n\n if (path.indexOf(pageBase) === 0) {\n path = path.substr(pageBase.length);\n }\n\n if (this._hashbang) path = path.replace('#!', '');\n\n if (pageBase && orig === path && (!isLocation || this._window.location.protocol !== 'file:')) {\n return;\n }\n\n e.preventDefault();\n this.show(orig);\n };\n\n /**\n * Handle \"populate\" events.\n * @api private\n */\n\n Page.prototype._onpopstate = (function () {\n var loaded = false;\n if ( ! hasWindow ) {\n return function () {};\n }\n if (hasDocument && document.readyState === 'complete') {\n loaded = true;\n } else {\n window.addEventListener('load', function() {\n setTimeout(function() {\n loaded = true;\n }, 0);\n });\n }\n return function onpopstate(e) {\n if (!loaded) return;\n var page = this;\n if (e.state) {\n var path = e.state.path;\n page.replace(path, e.state);\n } else if (isLocation) {\n var loc = page._window.location;\n page.show(loc.pathname + loc.search + loc.hash, undefined, undefined, false);\n }\n };\n })();\n\n /**\n * Event button.\n */\n Page.prototype._which = function(e) {\n e = e || (hasWindow && this._window.event);\n return null == e.which ? e.button : e.which;\n };\n\n /**\n * Convert to a URL object\n * @api private\n */\n Page.prototype._toURL = function(href) {\n var window = this._window;\n if(typeof URL === 'function' && isLocation) {\n return new URL(href, window.location.toString());\n } else if (hasDocument) {\n var anc = window.document.createElement('a');\n anc.href = href;\n return anc;\n }\n };\n\n /**\n * Check if `href` is the same origin.\n * @param {string} href\n * @api public\n */\n Page.prototype.sameOrigin = function(href) {\n if(!href || !isLocation) return false;\n\n var url = this._toURL(href);\n var window = this._window;\n\n var loc = window.location;\n\n /*\n When the port is the default http port 80 for http, or 443 for\n https, internet explorer 11 returns an empty string for loc.port,\n so we need to compare loc.port with an empty string if url.port\n is the default port 80 or 443.\n Also the comparition with `port` is changed from `===` to `==` because\n `port` can be a string sometimes. This only applies to ie11.\n */\n return loc.protocol === url.protocol &&\n loc.hostname === url.hostname &&\n (loc.port === url.port || loc.port === '' && (url.port == 80 || url.port == 443)); // jshint ignore:line\n };\n\n /**\n * @api private\n */\n Page.prototype._samePath = function(url) {\n if(!isLocation) return false;\n var window = this._window;\n var loc = window.location;\n return url.pathname === loc.pathname &&\n url.search === loc.search;\n };\n\n /**\n * Remove URL encoding from the given `str`.\n * Accommodates whitespace in both x-www-form-urlencoded\n * and regular percent-encoded form.\n *\n * @param {string} val - URL component to decode\n * @api private\n */\n Page.prototype._decodeURLEncodedURIComponent = function(val) {\n if (typeof val !== 'string') { return val; }\n return this._decodeURLComponents ? decodeURIComponent(val.replace(/\\+/g, ' ')) : val;\n };\n\n /**\n * Create a new `page` instance and function\n */\n function createPage() {\n var pageInstance = new Page();\n\n function pageFn(/* args */) {\n return page.apply(pageInstance, arguments);\n }\n\n // Copy all of the things over. In 2.0 maybe we use setPrototypeOf\n pageFn.callbacks = pageInstance.callbacks;\n pageFn.exits = pageInstance.exits;\n pageFn.base = pageInstance.base.bind(pageInstance);\n pageFn.strict = pageInstance.strict.bind(pageInstance);\n pageFn.start = pageInstance.start.bind(pageInstance);\n pageFn.stop = pageInstance.stop.bind(pageInstance);\n pageFn.show = pageInstance.show.bind(pageInstance);\n pageFn.back = pageInstance.back.bind(pageInstance);\n pageFn.redirect = pageInstance.redirect.bind(pageInstance);\n pageFn.replace = pageInstance.replace.bind(pageInstance);\n pageFn.dispatch = pageInstance.dispatch.bind(pageInstance);\n pageFn.exit = pageInstance.exit.bind(pageInstance);\n pageFn.configure = pageInstance.configure.bind(pageInstance);\n pageFn.sameOrigin = pageInstance.sameOrigin.bind(pageInstance);\n pageFn.clickHandler = pageInstance.clickHandler.bind(pageInstance);\n\n pageFn.create = createPage;\n\n Object.defineProperty(pageFn, 'len', {\n get: function(){\n return pageInstance.len;\n },\n set: function(val) {\n pageInstance.len = val;\n }\n });\n\n Object.defineProperty(pageFn, 'current', {\n get: function(){\n return pageInstance.current;\n },\n set: function(val) {\n pageInstance.current = val;\n }\n });\n\n // In 2.0 these can be named exports\n pageFn.Context = Context;\n pageFn.Route = Route;\n\n return pageFn;\n }\n\n /**\n * Register `path` with callback `fn()`,\n * or route `path`, or redirection,\n * or `page.start()`.\n *\n * page(fn);\n * page('*', fn);\n * page('/user/:id', load, user);\n * page('/user/' + user.id, { some: 'thing' });\n * page('/user/' + user.id);\n * page('/from', '/to')\n * page();\n *\n * @param {string|!Function|!Object} path\n * @param {Function=} fn\n * @api public\n */\n\n function page(path, fn) {\n // \n if ('function' === typeof path) {\n return page.call(this, '*', path);\n }\n\n // route to \n if ('function' === typeof fn) {\n var route = new Route(/** @type {string} */ (path), null, this);\n for (var i = 1; i < arguments.length; ++i) {\n this.callbacks.push(route.middleware(arguments[i]));\n }\n // show with [state]\n } else if ('string' === typeof path) {\n this['string' === typeof fn ? 'redirect' : 'show'](path, fn);\n // start [options]\n } else {\n this.start(path);\n }\n }\n\n /**\n * Unhandled `ctx`. When it's not the initial\n * popstate then redirect. If you wish to handle\n * 404s on your own use `page('*', callback)`.\n *\n * @param {Context} ctx\n * @api private\n */\n function unhandled(ctx) {\n if (ctx.handled) return;\n var current;\n var page = this;\n var window = page._window;\n\n if (page._hashbang) {\n current = isLocation && this._getBase() + window.location.hash.replace('#!', '');\n } else {\n current = isLocation && window.location.pathname + window.location.search;\n }\n\n if (current === ctx.canonicalPath) return;\n page.stop();\n ctx.handled = false;\n isLocation && (window.location.href = ctx.canonicalPath);\n }\n\n /**\n * Escapes RegExp characters in the given string.\n *\n * @param {string} s\n * @api private\n */\n function escapeRegExp(s) {\n return s.replace(/([.+*?=^!:${}()[\\]|/\\\\])/g, '\\\\$1');\n }\n\n /**\n * Initialize a new \"request\" `Context`\n * with the given `path` and optional initial `state`.\n *\n * @constructor\n * @param {string} path\n * @param {Object=} state\n * @api public\n */\n\n function Context(path, state, pageInstance) {\n var _page = this.page = pageInstance || page;\n var window = _page._window;\n var hashbang = _page._hashbang;\n\n var pageBase = _page._getBase();\n if ('/' === path[0] && 0 !== path.indexOf(pageBase)) path = pageBase + (hashbang ? '#!' : '') + path;\n var i = path.indexOf('?');\n\n this.canonicalPath = path;\n var re = new RegExp('^' + escapeRegExp(pageBase));\n this.path = path.replace(re, '') || '/';\n if (hashbang) this.path = this.path.replace('#!', '') || '/';\n\n this.title = (hasDocument && window.document.title);\n this.state = state || {};\n this.state.path = path;\n this.querystring = ~i ? _page._decodeURLEncodedURIComponent(path.slice(i + 1)) : '';\n this.pathname = _page._decodeURLEncodedURIComponent(~i ? path.slice(0, i) : path);\n this.params = {};\n\n // fragment\n this.hash = '';\n if (!hashbang) {\n if (!~this.path.indexOf('#')) return;\n var parts = this.path.split('#');\n this.path = this.pathname = parts[0];\n this.hash = _page._decodeURLEncodedURIComponent(parts[1]) || '';\n this.querystring = this.querystring.split('#')[0];\n }\n }\n\n /**\n * Push state.\n *\n * @api private\n */\n\n Context.prototype.pushState = function() {\n var page = this.page;\n var window = page._window;\n var hashbang = page._hashbang;\n\n page.len++;\n if (hasHistory) {\n window.history.pushState(this.state, this.title,\n hashbang && this.path !== '/' ? '#!' + this.path : this.canonicalPath);\n }\n };\n\n /**\n * Save the context state.\n *\n * @api public\n */\n\n Context.prototype.save = function() {\n var page = this.page;\n if (hasHistory) {\n page._window.history.replaceState(this.state, this.title,\n page._hashbang && this.path !== '/' ? '#!' + this.path : this.canonicalPath);\n }\n };\n\n /**\n * Initialize `Route` with the given HTTP `path`,\n * and an array of `callbacks` and `options`.\n *\n * Options:\n *\n * - `sensitive` enable case-sensitive routes\n * - `strict` enable strict matching for trailing slashes\n *\n * @constructor\n * @param {string} path\n * @param {Object=} options\n * @api private\n */\n\n function Route(path, options, page) {\n var _page = this.page = page || globalPage;\n var opts = options || {};\n opts.strict = opts.strict || _page._strict;\n this.path = (path === '*') ? '(.*)' : path;\n this.method = 'GET';\n this.regexp = pathToRegexp_1(this.path, this.keys = [], opts);\n }\n\n /**\n * Return route middleware with\n * the given callback `fn()`.\n *\n * @param {Function} fn\n * @return {Function}\n * @api public\n */\n\n Route.prototype.middleware = function(fn) {\n var self = this;\n return function(ctx, next) {\n if (self.match(ctx.path, ctx.params)) {\n ctx.routePath = self.path;\n return fn(ctx, next);\n }\n next();\n };\n };\n\n /**\n * Check if this route matches `path`, if so\n * populate `params`.\n *\n * @param {string} path\n * @param {Object} params\n * @return {boolean}\n * @api private\n */\n\n Route.prototype.match = function(path, params) {\n var keys = this.keys,\n qsIndex = path.indexOf('?'),\n pathname = ~qsIndex ? path.slice(0, qsIndex) : path,\n m = this.regexp.exec(decodeURIComponent(pathname));\n\n if (!m) return false;\n\n delete params[0];\n\n for (var i = 1, len = m.length; i < len; ++i) {\n var key = keys[i - 1];\n var val = this.page._decodeURLEncodedURIComponent(m[i]);\n if (val !== undefined || !(hasOwnProperty.call(params, key.name))) {\n params[key.name] = val;\n }\n }\n\n return true;\n };\n\n\n /**\n * Module exports.\n */\n\n var globalPage = createPage();\n var page_js = globalPage;\n var default_1 = globalPage;\n\npage_js.default = default_1;\n\nexport default page_js;\n","const DEFAULT_OBSERVED_WIDTH = 800;\r\n\r\nexport class WidthObserver {\r\n // A single ResizeObserver to watch all tagged elements\r\n static observer = (typeof (ResizeObserver) === \"undefined\") ? null : new ResizeObserver(entries => {\r\n for (const entry of entries) {\r\n const observeWidth = parseInt(entry.target.dataset.observeWidth, 10) || DEFAULT_OBSERVED_WIDTH;\r\n // Set the 'data-observe-wider' attribute to 'true' or 'false'\r\n entry.target.setAttribute(\"data-observe-wider\", entry.contentRect.width > observeWidth);\r\n entry.target.style.setProperty(\"--observed-width\", `${Math.floor(entry.contentRect.width)}px`);\r\n }\r\n });\r\n\r\n /** Iterate through each element with a 'data-observe-width' attribute and watch for resizes. Elements already being observed won't be duplicated. */\r\n static PerformWireup() {\r\n if (this.observer) {\r\n const elementsToObserve = document.querySelectorAll(\"[data-observe-width]\");\r\n for (const element of elementsToObserve) {\r\n this.observer.observe(element);\r\n }\r\n }\r\n }\r\n}\r\n","import BootstrapModal from \"bootstrap/js/dist/modal\";\r\nimport page from \"page\";\r\n\r\nimport { PostJSONWithLoadError } from \"./fetchers\";\r\n\r\nexport async function ShowLinkedUpdate(updateid) {\r\n const modalDiv = document.getElementById(\"modalLinkedUpdate\");\r\n if (!modalDiv) return;\r\n // Rewrite the url to base train when modal is closed\r\n modalDiv.addEventListener(\"hide.bs.modal\", () => { page(\"/\"); });\r\n const modal = BootstrapModal.getOrCreateInstance(modalDiv);\r\n modal.show();\r\n\r\n // Let other code know the user has already been shown a modal\r\n window.ShownAModal = true;\r\n\r\n const updateDiv = modalDiv.querySelector(\"[data-replacement-target]\");\r\n const update = await PostJSONWithLoadError(updateDiv, \"/trains/\" + window.CurrentTrain.Id + \"/updates/\" + updateid + \"/get\");\r\n const infoCard = document.createElement(\"train-info-card\");\r\n const trainPost = document.createElement(\"train-post\");\r\n trainPost.entity = update;\r\n trainPost.isInModal = true;\r\n updateDiv.innerHTML = \"\";\r\n updateDiv.append(infoCard, trainPost);\r\n}\r\n","/** Utility to watch for clicks outside of specified elements and fire callbacks */\r\nexport class OutsideClickWatcher {\r\n static clickOutsideListeners = [];\r\n static lastListenerId = 0;\r\n static isInitialized = false;\r\n\r\n /** Called internally if a listener is added but no global listener is created yet */\r\n static Initialize() {\r\n this.isInitialized = true;\r\n // On every click, check if anyone's listening for outside clicks\r\n window.addEventListener(\"click\", e => {\r\n for (const listener of this.clickOutsideListeners) {\r\n // If the click is outside the listener's element, fire the callback\r\n if (!listener[0].contains(e.target)) {\r\n listener[1].call();\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Listen for clicks outside an element\r\n * @param {HTMLElement} insideElement Any clicks inside this element will be ignored\r\n * @param {Function} callback Will be run when a click outside is detected\r\n * @returns A numeric ID that can be used later to remove the listener\r\n */\r\n static AddListener(insideElement, callback) {\r\n if (!this.isInitialized) this.Initialize();\r\n this.lastListenerId += 1;\r\n this.clickOutsideListeners.push([insideElement, callback, this.lastListenerId]);\r\n // Return an id we can use for later removal\r\n return this.lastListenerId;\r\n }\r\n\r\n /**\r\n * Remove an existing click-outside listener\r\n * @param {Number} id ID of the listener we received at creation time\r\n */\r\n static RemoveListener(id) {\r\n const index = this.clickOutsideListeners.findIndex(l => l[2] === id);\r\n if (index >= 0) {\r\n this.clickOutsideListeners.splice(index, 1);\r\n }\r\n }\r\n}\r\n","import BootstrapModal from \"bootstrap/js/dist/modal\";\r\n\r\nimport { UnshadowedElement, html } from \"../lib/unshadowed.js\";\r\nimport { UserAvatar } from \"./user-avatar.js\";\r\n\r\nUserAvatar.Register();\r\n\r\n/**\r\n * Display totals of all types of likes on an entity, clickable to see individual like details\r\n * Expects the entity property to be a vwPost\r\n */\r\nexport class PostLikesDisplay extends UnshadowedElement {\r\n static elementName() { return \"post-likes-display\" }\r\n\r\n static properties = {\r\n entity: { type: Array },\r\n isInModal: { type: Boolean },\r\n\r\n showingModal: { state: true, type: Boolean },\r\n };\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n window.addEventListener(\"postLikeChange\", e => this.ExternalLikeChange(e));\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n window.removeEventListener(\"postLikeChange\", e => this.ExternalLikeChange(e));\r\n }\r\n\r\n /** When likes are modified externally, update the array */\r\n ExternalLikeChange(e) {\r\n if (!this.entity) return;\r\n if (e && this.entity && this.entity.Post && e.detail.postId === this.entity.Post.Id) {\r\n this.entity.PostLikes = e.detail.likes;\r\n this.requestUpdate();\r\n }\r\n }\r\n\r\n render() {\r\n if (!this.entity || !this.entity.PostLikes || !this.entity.PostLikes.length) return null\r\n const bins = new Map();\r\n // Sort the array of likes into a map of arrays by TypeId\r\n for (const like of this.entity.PostLikes) {\r\n const bin = bins.get(like.TypeId);\r\n if (bin) {\r\n bin.push(like);\r\n } else {\r\n bins.set(like.TypeId, [like]);\r\n }\r\n }\r\n const icons = [];\r\n bins.forEach((value, key) => {\r\n // Note: Could do title with value.length if we want hover counts\r\n icons.push(html``);\r\n });\r\n\r\n return html`\r\n ${this.isInModal ? html`\r\n
\r\n
${icons}
\r\n
${this.entity.PostLikes.length}
\r\n
\r\n ` : html`\r\n \r\n `}\r\n ${this.showingModal ? html`\r\n
\r\n
\r\n
\r\n
\r\n

\r\n Reactions\r\n

\r\n \r\n
\r\n
\r\n ${this.entity.PostLikes.map(like => html`\r\n
\r\n
\r\n \r\n
\r\n

\r\n ${like.Author.FullName}\r\n

\r\n
\r\n
\r\n \r\n
\r\n
\r\n `)}\r\n
\r\n
\r\n
\r\n
\r\n ` : null}\r\n `;\r\n }\r\n\r\n // We have to show the bootstrap modal if we made one in render()\r\n updated() {\r\n const modalDiv = document.getElementById(\"modalShowLikes\");\r\n if (modalDiv) {\r\n const modal = BootstrapModal.getOrCreateInstance(modalDiv);\r\n modal.show();\r\n // When the modal is hidden, turn off showingModalDay so we don't reshow the modal\r\n modalDiv.addEventListener(\"hidden.bs.modal\", () => { this.showingModal = undefined; });\r\n }\r\n }\r\n}\r\n\r\nexport const LikeSvgSmall = {\r\n 0: \"reaction-hug-sm\",\r\n 1: \"reaction-heart-sm\",\r\n 2: \"reaction-like-sm\",\r\n 3: \"reaction-smile-sm\",\r\n}\r\nexport const LikeSvgLarge = {\r\n 0: \"reaction-hug-lg\",\r\n 1: \"reaction-heart-lg\",\r\n 2: \"reaction-like-lg\",\r\n 3: \"reaction-smile-lg\",\r\n}","import { UnshadowedElement, html } from \"../lib/unshadowed.js\";\r\nimport { PostJSON } from \"../lib/fetchers.js\";\r\nimport { OutsideClickWatcher } from \"../lib/outside-clicks.js\";\r\n\r\n/**\r\n * Like Button, with popout to choose a like or prompt for login\r\n * Expects the entity property to be a vwPost\r\n */\r\nexport class PostLikeButton extends UnshadowedElement {\r\n static elementName() { return \"post-like-button\" }\r\n\r\n static properties = {\r\n entity: { type: Object },\r\n\r\n showingPopout: { state: true, type: Boolean },\r\n error: { state: true, type: Boolean },\r\n };\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n window.addEventListener(\"postLikeChange\", e => this.ExternalLikeChange(e));\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n window.removeEventListener(\"postLikeChange\", e => this.ExternalLikeChange(e));\r\n }\r\n\r\n /** When likes are modified internally or externally, update the array */\r\n ExternalLikeChange(e) {\r\n if (!this.entity) return;\r\n if (e && this.entity && this.entity.Post && e.detail.postId === this.entity.Post.Id) {\r\n this.entity.PostLikes = e.detail.likes;\r\n this.requestUpdate();\r\n }\r\n }\r\n\r\n async Like(typeId) {\r\n try {\r\n const like = await PostJSON(\"/trains/\" + window.CurrentTrain.Id + \"/updates/\" + this.entity.Post.Id + \"/likes\", { typeId });\r\n if (!this.entity.PostLikes || !this.entity.PostLikes.length) this.entity.PostLikes = [];\r\n this.entity.PostLikes.push(like);\r\n } catch {\r\n this.error = true;\r\n }\r\n this.showingPopout = false;\r\n window.dispatchEvent(new CustomEvent(\"postLikeChange\", { detail: { postId: this.entity.Post.Id, likes: this.entity.PostLikes }}));\r\n }\r\n\r\n async Unlike() {\r\n if (this.entity.PostLikes && this.entity.PostLikes.length) {\r\n const myLikeIdx = this.entity.PostLikes.findIndex(item => item.Author.Id === window.UserHash);\r\n if (myLikeIdx >= 0) {\r\n try {\r\n await PostJSON(\"/trains/\" + window.CurrentTrain.Id + \"/updates/\" + this.entity.Post.Id + \"/likes/\" + this.entity.PostLikes[myLikeIdx].Id + \"/delete\");\r\n this.entity.PostLikes.splice(myLikeIdx, 1);\r\n } catch {\r\n this.error = true;\r\n }\r\n }\r\n }\r\n window.dispatchEvent(new CustomEvent(\"postLikeChange\", { detail: { postId: this.entity.Post.Id, likes: this.entity.PostLikes } }));\r\n }\r\n\r\n render() {\r\n if (!this.entity) return;\r\n if (this.error) return html``;\r\n let myLike = null;\r\n if (this.entity.PostLikes && this.entity.PostLikes.length) {\r\n myLike = this.entity.PostLikes.find(item => item.Author.Id === window.UserHash);\r\n }\r\n // Preserve query params and hash for return URL\r\n const relativeUrl = window.location.pathname + window.location.search + window.location.hash;\r\n return html`\r\n ${myLike ? html`\r\n \r\n ` : html`\r\n \r\n `}\r\n ${this.showingPopout ? html`\r\n
\r\n ${window.UserHash ? html`\r\n
\r\n \r\n \r\n \r\n \r\n ` : html`\r\n

Sign in to add your reaction.

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n `}\r\n
\r\n ` : null}\r\n `;\r\n }\r\n\r\n clickOutsideHandlerId = null;\r\n\r\n // Clean up after DOM elements are created\r\n updated() {\r\n if (this.showingPopout) {\r\n const likeOptions = document.getElementById(\"popoutLikeOptions\");\r\n if (likeOptions) {\r\n // Click event propagates upwards, so window.click fires after the listener is created. Have to ignore the first immediate click event.\r\n setTimeout(() => { this.clickOutsideHandlerId = OutsideClickWatcher.AddListener(likeOptions, () => { this.showingPopout = false; }); }, 100);\r\n }\r\n } else {\r\n // If we previously registered a click outside handler, remove it\r\n if (this.clickOutsideHandlerId) {\r\n OutsideClickWatcher.RemoveListener(this.clickOutsideHandlerId);\r\n this.clickOutsideHandlerId = null;\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport const LikeSvgSmall = {\r\n 0: \"reaction-hug-sm\",\r\n 1: \"reaction-heart-sm\",\r\n 2: \"reaction-like-sm\",\r\n 3: \"reaction-smile-sm\",\r\n}\r\nexport const LikeSvgLarge = {\r\n 0: \"reaction-hug-lg\",\r\n 1: \"reaction-heart-lg\",\r\n 2: \"reaction-like-lg\",\r\n 3: \"reaction-smile-lg\",\r\n}","import BootstrapModal from \"bootstrap/js/dist/modal\";\r\n\r\nimport { UnshadowedElement, html } from \"../lib/unshadowed.js\";\r\n\r\nimport { OutsideClickWatcher } from \"../lib/outside-clicks.js\";\r\nimport { PostJSON } from \"../lib/fetchers.js\";\r\nimport { IsoDateFormatter } from \"../lib/date-utilities.js\";\r\nimport { TrackClickById } from \"../lib/click-tracking.js\";\r\n\r\nimport { UserAvatar } from \"./user-avatar.js\";\r\nimport { ShareOptions } from \"./share-options.js\";\r\nimport { TextRevealer } from \"./text-revealer.js\";\r\nimport { PostLikesDisplay } from \"./post-likes-display\";\r\nimport { PostLikeButton } from \"./post-like-button\";\r\n\r\nUserAvatar.Register();\r\nShareOptions.Register();\r\nTextRevealer.Register();\r\nPostLikesDisplay.Register();\r\nPostLikeButton.Register();\r\n\r\n/**\r\n * Full display of a single train update post\r\n * Expects the entity property to be a vwPost\r\n */\r\nexport class TrainPost extends UnshadowedElement {\r\n static elementName() { return \"train-post\" }\r\n\r\n static properties = {\r\n entity: { type: Object },\r\n isInModal: { type: Boolean },\r\n showingMoreActions: { state: true, type: Boolean },\r\n showingDeleteConfirm: { state: true, type: Boolean },\r\n showingShare: { state: true, type: Boolean },\r\n };\r\n\r\n async PerformDelete() {\r\n const button = this.querySelector(\"[data-button-delete]\");\r\n if (button) button.classList.add(\"button-loading\");\r\n try {\r\n await PostJSON(`/trains/${this.entity.Post.TrainId}/updates/${this.entity.Post.Id}/delete`);\r\n this.showingDeleteConfirm = false;\r\n window.location = `/trains/${this.entity.Post.TrainId}/updates`;\r\n } catch (err) {\r\n const errorRow = this.querySelector(\"[data-error-message]\");\r\n if (err && err.message) {\r\n errorRow.querySelector(\".alert-message\").innerText = err.message;\r\n }\r\n errorRow.classList.remove(\"hidden\");\r\n console.error(err);\r\n if (button) button.classList.remove(\"button-loading\");\r\n }\r\n }\r\n\r\n render() {\r\n /** Contains the action buttons available for this post */\r\n let adminButton = null;\r\n if (window.CurrentTrain.IsAdmin && !this.isInModal) {\r\n adminButton = html`\r\n \r\n `;\r\n }\r\n\r\n /** If we expanded the \"...\" button, contains code for the popout tooltip menu */\r\n let moreActionsPopout = null;\r\n if (this.showingMoreActions) {\r\n moreActionsPopout = html`\r\n `;\r\n }\r\n\r\n /** If we are confirming post deletion, contains code for the confirmation modal */\r\n let deleteConfirmModal = null;\r\n if (this.showingDeleteConfirm) {\r\n deleteConfirmModal = html`\r\n
\r\n
\r\n
\r\n
\r\n

Confirm Delete

\r\n \r\n
\r\n
\r\n

Are you sure you want to delete this post? You won't be able to undo this.

\r\n
\r\n \r\n \r\n \r\n There was a problem removing this update, try again later.\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
`;\r\n }\r\n\r\n /** Code for the share modal, if we are showing it */\r\n let shareModal = null;\r\n if (this.showingShare) {\r\n const updateurl = window.CurrentTrain.FullUrl + \"/updates/\" + this.entity.Post.Id;\r\n let imageHolder = html`
`;\r\n const photoPath = this.entity.Post.PhotoPath || window.CurrentTrain.PhotoUrl;\r\n if (photoPath) {\r\n imageHolder = html`
\"${this.entity.Post.Name}\"
`;\r\n }\r\n shareModal = html`\r\n
\r\n
\r\n
\r\n
\r\n

\r\n Share Update\r\n

\r\n \r\n
\r\n
\r\n
\r\n
\r\n ${imageHolder}\r\n
\r\n

Meal Train Update for ${window.CurrentTrain.Name}

\r\n

${this.entity.Post.Title}

\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
`;\r\n }\r\n return html`\r\n
\r\n

${this.entity.Post.Title}

\r\n
\r\n \r\n

${IsoDateFormatter.LongDate(this.entity.Post.DateLocal)} by ${this.entity.Post.Author.FullName}

\r\n
\r\n ${adminButton}\r\n ${moreActionsPopout}\r\n
\r\n
\r\n \r\n ${this.entity.Post.PhotoPath ? html`
` : null}\r\n \r\n
\r\n \r\n \r\n
\r\n ${deleteConfirmModal}\r\n ${shareModal}\r\n
\r\n `;\r\n }\r\n\r\n clickOutsideHandlerId = null;\r\n\r\n // Clean up after DOM elements are created\r\n updated() {\r\n const deleteModal = document.getElementById(\"deleteConfirmModal\");\r\n // If we created the modal, have to show it via bootstrap JS\r\n if (deleteModal) {\r\n const modal = BootstrapModal.getOrCreateInstance(deleteModal);\r\n modal.show();\r\n // When the modal is hidden, turn off showingModalDay so we don't reshow the modal\r\n deleteModal.addEventListener(\"hidden.bs.modal\", () => { this.showingDeleteConfirm = false; });\r\n }\r\n\r\n const shareModal = document.getElementById(\"shareModal\");\r\n // If we created the modal, have to show it via bootstrap JS\r\n if (shareModal) {\r\n TrackClickById(\"btn-share-update\");\r\n const modal = BootstrapModal.getOrCreateInstance(shareModal);\r\n modal.show();\r\n // When the modal is hidden, turn off showingModalDay so we don't reshow the modal\r\n shareModal.addEventListener(\"hidden.bs.modal\", () => { this.showingShare = false; });\r\n }\r\n\r\n if (this.showingMoreActions) {\r\n const moreActions = document.getElementById(\"popoutMoreActions\");\r\n if (moreActions) {\r\n // Click event propagates upwards, so window.click fires after the listener is created. Have to ignore the first immediate click event.\r\n setTimeout(() => { this.clickOutsideHandlerId = OutsideClickWatcher.AddListener(moreActions, () => { this.showingMoreActions = false; }); }, 100);\r\n }\r\n } else {\r\n // If we previously registered a click outside handler, remove it\r\n if (this.clickOutsideHandlerId) {\r\n OutsideClickWatcher.RemoveListener(this.clickOutsideHandlerId);\r\n this.clickOutsideHandlerId = null;\r\n }\r\n }\r\n }\r\n}\r\n","import { UnshadowedElement, html } from \"../lib/unshadowed.js\";\r\nimport { UserAvatar } from \"./user-avatar.js\";\r\nimport { TextRevealer } from \"./text-revealer.js\";\r\nimport { IsDateInPast, IsoDateFormatter } from \"../lib/date-utilities.js\";\r\n\r\nUserAvatar.Register();\r\nTextRevealer.Register();\r\n\r\n/**\r\n* Get the proper edit / message buttons for a date, depending on admin status etc\r\n* Used both for meal-date-row, and the mobile detail of calendar-display\r\n* @param trainDate an nMealTrainDate\r\n* */\r\nfunction GetActionButtons(trainDate) {\r\n return html`\r\n \r\n Message\r\n \r\n \r\n Edit\r\n \r\n \r\n Edit\r\n `;\r\n}\r\n\r\n/**\r\n * Display an available or assigned meal train date, with action buttons\r\n * Expects trainDate to be a nAccessibleEntity\r\n */\r\nexport class MealDateRow extends UnshadowedElement {\r\n static elementName() { return \"meal-date-row\" }\r\n\r\n static properties = {\r\n trainDate: { type: Object },\r\n };\r\n\r\n render() {\r\n let rowContent = \"\";\r\n let actionContent = \"\";\r\n\r\n // May have an AssignedUser object with everything set to null, so check Id\r\n if (this.trainDate.Entity.AssignedUser && this.trainDate.Entity.AssignedUser.Id) {\r\n // Note: for non-meals (Plus) there is no description, so the notes get promoted to the description area\r\n rowContent = html`\r\n
\r\n
\r\n \r\n
\r\n

${this.trainDate.Entity.AssignedUser.FullName}

\r\n

\r\n ${this.trainDate.Entity.CategoryName === \"Meal\" ? html`` : html``}\r\n

\r\n
\r\n
\r\n ${(this.trainDate.Entity.CategoryName === \"Meal\" && this.trainDate.Entity.Notes) ? html`

` : null}\r\n
\r\n `;\r\n actionContent = GetActionButtons(this.trainDate.Entity);\r\n } else {\r\n if (IsDateInPast(this.trainDate.Entity.Date)) {\r\n // Unclaimed past dates\r\n rowContent = html`This date has passed`;\r\n } else {\r\n // Unclaimed future dates\r\n rowContent = html`${!window.CurrentTrain.IsPlus ? html`

Available

` : null}`;\r\n actionContent = html`Volunteer`;\r\n }\r\n }\r\n\r\n return html`\r\n
\r\n
\r\n

${IsoDateFormatter.ShortMonth(this.trainDate.Entity.Date)} ${IsoDateFormatter.ShortestDay(this.trainDate.Entity.Date)}\r\n ${IsoDateFormatter.ShortWeekday(this.trainDate.Entity.Date)}

\r\n
\r\n
\r\n
\r\n ${window.CurrentTrain.IsPlus ? html`\r\n
\r\n ${this.trainDate.Entity.CategoryName}:\r\n \r\n
` : null}\r\n ${rowContent}\r\n
\r\n
\r\n ${actionContent}\r\n
\r\n
\r\n
\r\n `;\r\n }\r\n}\r\n","import BootstrapModal from \"bootstrap/js/dist/modal\";\r\n\r\nimport { UnshadowedElement, html } from \"../lib/unshadowed.js\";\r\nimport { UserAvatar } from \"./user-avatar.js\";\r\nimport { ShowLinkedUpdate } from \"../lib/linked-update-modal.js\";\r\n\r\nUserAvatar.Register();\r\n\r\n/**\r\n * Display a row of recent activity\r\n * Expects activity to be a nMealTrainActivity\r\n */\r\nexport class RecentActivityRow extends UnshadowedElement {\r\n static elementName() { return \"recent-activity-row\" }\r\n\r\n static properties = {\r\n activity: { type: Object },\r\n isInModal: { type: Boolean },\r\n };\r\n\r\n HideActivityModal() {\r\n const modalElement = document.getElementById(\"modalTrainActivity\");\r\n if (modalElement) {\r\n const modal = BootstrapModal.getOrCreateInstance(modalElement);\r\n modal.hide();\r\n }\r\n }\r\n\r\n ShowUpdate(activity) {\r\n this.HideActivityModal();\r\n ShowLinkedUpdate(activity.ObjectId);\r\n }\r\n\r\n render() {\r\n const contents = html`\r\n \r\n
\r\n

${this.activity.FullName}

\r\n
  • ${this.activity.Description}
  • ${this.activity.TimeAgo}
\r\n
\r\n `;\r\n if (this.activity.TypeId === 4 && !this.isInModal) {\r\n return html`${contents}`;\r\n } else if (this.activity.TypeId === 5) {\r\n return html` this.ShowUpdate(this.activity)}>${contents}`;\r\n } else {\r\n return html`
${contents}
`;\r\n }\r\n }\r\n}\r\n","import BootstrapModal from \"bootstrap/js/dist/modal\";\r\nimport { parseISO } from \"date-fns\";\r\n\r\nimport { UnshadowedElement, html } from \"../lib/unshadowed.js\";\r\nimport { UserAvatar } from \"./user-avatar.js\";\r\nimport { MealDateRow } from \"./meal-date-row.js\";\r\nimport { TextRevealer } from \"./text-revealer.js\";\r\nimport { AreMonthsEqual, IsDateInPast, IsoDateFormatter } from \"../lib/date-utilities.js\";\r\nimport { WidthObserver } from \"../lib/width-observer.js\";\r\n\r\nUserAvatar.Register();\r\nMealDateRow.Register();\r\nTextRevealer.Register();\r\n\r\n/**\r\n* Get the proper edit / message buttons for a date, depending on admin status etc\r\n* Used both for meal-date-row, and the mobile detail of calendar-display\r\n* @param trainDate an nMealTrainDate\r\n* */\r\nfunction GetActionButtons(trainDate) {\r\n return html`\r\n \r\n Message\r\n \r\n \r\n Edit\r\n \r\n \r\n Edit\r\n `;\r\n}\r\n\r\nexport class CalendarDisplay extends UnshadowedElement {\r\n static elementName() { return \"calendar-display\" }\r\n\r\n static properties = {\r\n // All dates ever for the train, past and future. Array of nAccessibleEntity\r\n dates: { type: Array },\r\n // Start date of the current month\r\n startDate: { type: Date },\r\n // On mobile, day object currently selected\r\n selectedDay: { type: Object },\r\n // If we are showing the Meal Details modal, this is the day to display\r\n showingModalDay: { type: Object },\r\n };\r\n\r\n constructor() {\r\n super();\r\n this.changeMonthToday();\r\n this.selectedDay = undefined;\r\n this.showingModalDay = undefined;\r\n }\r\n\r\n changeMonth(future) {\r\n const newMonth = new Date(this.startDate);\r\n newMonth.setMonth(newMonth.getMonth() + (future ? 1 : -1));\r\n this.startDate = newMonth;\r\n this.selectedDay = undefined;\r\n }\r\n\r\n changeMonthToday() {\r\n const thisMonth = new Date();\r\n thisMonth.setHours(0, 0, 0, 0);\r\n thisMonth.setDate(1);\r\n this.startDate = thisMonth;\r\n }\r\n\r\n hasEverScrolled = false;\r\n\r\n selectDayMobile(day) {\r\n this.selectedDay = day;\r\n // The first selection should scroll the info box into view\r\n if (!this.hasEverScrolled) {\r\n this.hasEverScrolled = true;\r\n // Give a moment to update the component for proper sizing\r\n setTimeout(() => {\r\n const infoBox = this.querySelector(\".meal-calendar-info-box\");\r\n if (infoBox) infoBox.scrollIntoView(false);\r\n }, 100);\r\n }\r\n }\r\n\r\n closeMobileDetail() {\r\n // Save a ref to the button we got here from\r\n const dayButton = this.querySelector(`[data-day-of-month=\"${this.selectedDay.daynum}\"] button`);\r\n // Hide the info box\r\n this.selectedDay = undefined;\r\n // Focus the button\r\n if (dayButton) dayButton.focus();\r\n }\r\n\r\n /**\r\n * Conditionally create mobile content for each day\r\n * Broken out because it gets a little complicated\r\n */\r\n getMobileDayContent(day) {\r\n if (day.status === \"booked\" || day.status === \"partial-booked\" || (!day.isPast && day.status === \"available\")) {\r\n return html``;\r\n } else {\r\n return html`
`;\r\n }\r\n }\r\n\r\n /**\r\n * Conditionally create desktop content for each day\r\n * Broken out because it gets a little complicated\r\n */\r\n getDesktopDayContent(day) {\r\n const MAX_ENTRIES_PER_DAY = 4;\r\n const nodes = [];\r\n for (const [index, schedule] of day.scheduledDates.entries()) {\r\n const status = (schedule.Entity && schedule.Entity.AssignedUser && schedule.Entity.AssignedUser.Id) ? \"booked\" : \"available\";\r\n // If we're on the 3rd entry for a day and there are more to come, put an \"x more\" entry and finish the day\r\n if (index === MAX_ENTRIES_PER_DAY - 1 && day.scheduledDates.length > MAX_ENTRIES_PER_DAY) {\r\n nodes.push(html`
  • +${day.scheduledDates.length - MAX_ENTRIES_PER_DAY + 1} more
  • `);\r\n break;\r\n } else if (window.CurrentTrain.IsPlus) {\r\n if (!day.isPast || status === \"booked\") {\r\n nodes.push(html`
  • ${schedule.Entity.CategoryName}: ${schedule.Entity.Title}
  • `);\r\n }\r\n } else {\r\n // Non-plus, just one node\r\n if (status === \"booked\") {\r\n nodes.push(html`
  • ${schedule.Entity.Description}
  • `);\r\n } else if (day.status === \"available\" && !day.isPast) {\r\n nodes.push(html`
  • Available
  • `);\r\n }\r\n }\r\n }\r\n if (nodes.length) {\r\n if (window.CurrentTrain.IsPlus || day.status === \"booked\") {\r\n // Entire day is a button containing the list of nodes\r\n return html``;\r\n } else {\r\n // Direct page link, only for non-plus non-booked\r\n return html`
    • Available
    `;\r\n }\r\n } else {\r\n // Empty day\r\n return html`
    `;\r\n }\r\n }\r\n\r\n /** Generate the mobile \"date info\" popover */\r\n getMobileDetail(noDatesForMonth) {\r\n if (!this.selectedDay) {\r\n if (noDatesForMonth) {\r\n return html`
    There are no available dates this month
    `;\r\n } else {\r\n return html`
    Tap a highlighted date for more info
    `;\r\n }\r\n }\r\n let conditionalContent;\r\n if (this.selectedDay.status === \"booked\" || this.selectedDay.status === \"partial\") {\r\n conditionalContent = html`\r\n
    \r\n \r\n
    \r\n

    ${this.selectedDay.scheduledDates[0].Entity.AssignedUser.FullName}

    \r\n

    ${this.selectedDay.scheduledDates[0].Entity.Description}

    \r\n
    \r\n
    \r\n ${this.selectedDay.scheduledDates[0].Entity.Notes ? html`

    ` : null}\r\n
    \r\n ${GetActionButtons(this.selectedDay.scheduledDates[0].Entity)}\r\n
    \r\n `;\r\n } else {\r\n conditionalContent = html`\r\n
    \r\n

    Available

    \r\n
    \r\n Volunteer\r\n `;\r\n }\r\n return html`\r\n
    \r\n
    \r\n
    \r\n

    Selected Date:${IsoDateFormatter.LongDate(this.selectedDay.date)}

    \r\n

    ${IsoDateFormatter.LongWeekday(this.selectedDay.date)}

    \r\n
    \r\n \r\n
    \r\n ${conditionalContent}\r\n
    \r\n `;\r\n }\r\n\r\n /** Generate the mobile \"date info\" popover for a plus train */\r\n getMobileDetailPlus(noDatesForMonth) {\r\n if (!this.selectedDay) {\r\n if (noDatesForMonth) {\r\n return html`
    There are no available dates this month
    `;\r\n } else {\r\n return html`
    Tap a highlighted date for more info
    `;\r\n }\r\n }\r\n const nodes = [];\r\n for (const schedule of this.selectedDay.scheduledDates) {\r\n nodes.push(html``);\r\n }\r\n return html`\r\n
    \r\n
    \r\n
    \r\n

    Selected Date:${IsoDateFormatter.LongDate(this.selectedDay.date)}${this.selectedDay.status === \"booked\" ? html` Fully Booked` : null}

    \r\n

    ${IsoDateFormatter.LongWeekday(this.selectedDay.date)}

    \r\n
    \r\n \r\n
    \r\n ${nodes}\r\n
    \r\n `;\r\n }\r\n\r\n /** Generate the bootstrap modal for a \"booked\" date on desktop */\r\n getDesktopModal() {\r\n if (!this.showingModalDay) return null;\r\n // Note that this modal won't display until bootstrap is told to in javascript - we'll do that post render in updated()\r\n return html`\r\n
    \r\n
    \r\n
    \r\n
    \r\n

    Meal Details

    \r\n \r\n
    \r\n
    \r\n
    \r\n

    Date

    \r\n

    ${IsoDateFormatter.LongestDate(this.showingModalDay.date)}

    \r\n
    \r\n
    \r\n

    Volunteer

    \r\n
    \r\n \r\n

    ${this.showingModalDay.scheduledDates[0].Entity.AssignedUser.FullName}

    \r\n ${this.showingModalDay.scheduledDates[0].Entity.AssignedUser.Id !== window.UserHash ? html`\r\n
    \r\n Message\r\n
    \r\n ` : null}\r\n
    \r\n
    \r\n
    \r\n

    Description

    \r\n

    ${this.showingModalDay.scheduledDates[0].Entity.Description}

    \r\n
    \r\n ${this.showingModalDay.scheduledDates[0].Entity.Notes ? html`\r\n
    \r\n

    Notes

    \r\n

    ${this.showingModalDay.scheduledDates[0].Entity.Notes}

    \r\n
    \r\n ` : null}\r\n ${((this.showingModalDay.scheduledDates[0].CanAdminister && !IsDateInPast(this.showingModalDay.date)) || window.CurrentTrain.IsAdmin) ? html`\r\n
    \r\n \r\n \r\n Edit\r\n \r\n
    \r\n ` : null}\r\n
    \r\n
    \r\n
    \r\n
    \r\n `;\r\n }\r\n\r\n /** Generate the bootstrap modal for a \"booked\" date on desktop for a plus train */\r\n getDesktopModalPlus() {\r\n if (!this.showingModalDay) return null;\r\n\r\n const nodes = [];\r\n for (const schedule of this.showingModalDay.scheduledDates) {\r\n nodes.push(html``);\r\n }\r\n\r\n // Note that this modal won't display until bootstrap is told to in javascript - we'll do that post render in updated()\r\n return html`\r\n
    \r\n
    \r\n
    \r\n
    \r\n

    Requests for ${IsoDateFormatter.LongestDate(this.showingModalDay.date)}

    \r\n \r\n
    \r\n
    \r\n
    \r\n ${nodes}\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n `;\r\n }\r\n\r\n render() {\r\n if (!this.dates) return html`Loading`;\r\n /** @type {{ Entity: any, CanAdminister: boolean }[]} */\r\n const trainDatesForMonth = this.dates.filter(d => AreMonthsEqual(d.Entity.Date, this.startDate));\r\n const calendarDays = [];\r\n let noDatesForMonth = true;\r\n for (const dateIterator = new Date(this.startDate.getTime()); dateIterator.getMonth() === this.startDate.getMonth(); dateIterator.setDate(dateIterator.getDate() + 1)) {\r\n const scheduled = trainDatesForMonth.filter(item => parseISO(item.Entity.Date).getDate() === dateIterator.getDate());\r\n if (scheduled.length) noDatesForMonth = false;\r\n const fullyBooked = scheduled.every(s => s.Entity && s.Entity.AssignedUser && s.Entity.AssignedUser.Id);\r\n const partiallyBooked = scheduled.some(s => s.Entity && s.Entity.AssignedUser && s.Entity.AssignedUser.Id);\r\n const day = {\r\n date: new Date(dateIterator.getTime()),\r\n daynum: dateIterator.getDate(),\r\n scheduledDates: scheduled,\r\n isPast: IsDateInPast(dateIterator),\r\n status: scheduled.length ? (fullyBooked ? \"booked\" : (partiallyBooked ? \"partial-booked\" : \"available\")) : \"\",\r\n isSelected: this.selectedDay && this.selectedDay.date && (this.selectedDay.date.getTime() === dateIterator.getTime()),\r\n };\r\n calendarDays.push(day);\r\n }\r\n const startDayOfWeek = this.startDate.getDay();\r\n const dayHeaderLabels = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\r\n\r\n return html`\r\n
    ${window.CurrentTrain.IsPlus ? \"Fully \" : null}BookedAvailable
    \r\n
    \r\n
    \r\n \r\n
    ${IsoDateFormatter.LongMonthYear(this.startDate)}
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n ${dayHeaderLabels.map(day => html`${day}`)}\r\n
    \r\n
    \r\n ${calendarDays.map(day => html`\r\n
    \r\n ${this.getMobileDayContent(day)}\r\n ${this.getDesktopDayContent(day)}\r\n
    \r\n `)}\r\n
    \r\n ${window.CurrentTrain.IsPlus ? this.getMobileDetailPlus(noDatesForMonth) : this.getMobileDetail(noDatesForMonth)}\r\n ${window.CurrentTrain.IsPlus ? this.getDesktopModalPlus() : this.getDesktopModal()}\r\n
    \r\n `;\r\n }\r\n\r\n // We have to show the bootstrap modal if we made one in render()\r\n updated() {\r\n const modalDiv = document.getElementById(\"calendarDayModal\");\r\n if (modalDiv) {\r\n const modal = BootstrapModal.getOrCreateInstance(modalDiv);\r\n modal.show();\r\n // When the modal is hidden, turn off showingModalDay so we don't reshow the modal\r\n modalDiv.addEventListener(\"hidden.bs.modal\", () => { this.showingModalDay = undefined; });\r\n }\r\n // Need to rescan width observers because the rendered DOM can have them (desktop plus modal)\r\n WidthObserver.PerformWireup();\r\n }\r\n}\r\n","import { UnshadowedElement, html } from \"../lib/unshadowed.js\";\r\nimport { MealDateRow } from \"./meal-date-row.js\";\r\nimport { AreMonthsEqual, IsDateInPast, IsoDateFormatter } from \"../lib/date-utilities.js\";\r\n\r\nMealDateRow.Register();\r\n\r\nconst INITIAL_DATE_COUNT = 14;\r\nconst MAX_INITIAL_DATE_COUNT = 16;\r\n\r\nexport class CalendarList extends UnshadowedElement {\r\n static elementName() { return \"calendar-list\" }\r\n\r\n static properties = {\r\n // All dates ever for the train, past and future. Array of nAccessibleEntity\r\n dates: { type: Array },\r\n // Show past dates vs future\r\n past: { type: Boolean },\r\n // Show all dates vs just first n\r\n expanded: { type: Boolean },\r\n };\r\n\r\n render() {\r\n if (!this.dates) return html`Loading`;\r\n\r\n let filtered;\r\n if (this.past) {\r\n // Past only\r\n filtered = this.dates.filter(item => IsDateInPast(item.Entity.Date));\r\n } else {\r\n // Future only\r\n filtered = this.dates.filter(item => !IsDateInPast(item.Entity.Date));\r\n }\r\n const nodes = [];\r\n // If showing future, and there are past dates, show a link for the modal\r\n if (!this.past && filtered.length < this.dates.length) {\r\n nodes.push(html`View Past Dates`);\r\n }\r\n\r\n // If we have dates, show them\r\n if (filtered.length) {\r\n /** Maximum number of dates to show */\r\n let max = filtered.length;\r\n if (!this.expanded && filtered.length > MAX_INITIAL_DATE_COUNT) {\r\n max = INITIAL_DATE_COUNT;\r\n }\r\n // Show all date rows, with month dividers if needed\r\n for (let i = 0; i < max; i++) {\r\n if (i === 0 || !AreMonthsEqual(filtered[i].Entity.Date, filtered[i - 1].Entity.Date)) {\r\n nodes.push(html`
    ${IsoDateFormatter.LongMonthYear(filtered[i].Entity.Date)}
    `);\r\n }\r\n nodes.push(html``);\r\n }\r\n\r\n // If there are remaining dates, show expander button\r\n const remaining = filtered.length - max;\r\n if (remaining > 0) {\r\n nodes.push(html``);\r\n }\r\n } else {\r\n // No dates, show one of many \"no dates\" messages\r\n // Here we can assume we are in \"past = false\" mode since we never show the past dates modal if there are none\r\n\r\n const emptynodes = [];\r\n /** Have there been any past dates */\r\n const hasPast = (filtered.length < this.dates.length);\r\n if (hasPast) {\r\n // There are past dates\r\n emptynodes.push(html`

    No upcoming dates

    `);\r\n } else {\r\n emptynodes.push(html`

    No dates added

    `);\r\n }\r\n if (window.CurrentTrain.IsAdmin) {\r\n emptynodes.push(html`

    Add dates to the calendar.

    `);\r\n } else {\r\n // There are past dates\r\n if (window.CurrentTrain.ShowDonations) {\r\n emptynodes.push(html`

    Please contact the organizer to request ${hasPast ? \"more \" : \"\"}dates, or make a donation to ${window.CurrentTrain.Name}.

    `);\r\n } else if (window.CurrentTrain.ShowGiftCards) {\r\n emptynodes.push(html`

    Please contact the organizer to request ${hasPast ? \"more \" : \"\"}dates, or send a gift card to ${window.CurrentTrain.Name}.

    `);\r\n } else {\r\n emptynodes.push(html`

    Please contact the organizer to request ${hasPast ? \"more \" : \"\"}dates.

    `);\r\n }\r\n }\r\n // Wrap up the whole \"no dates\" message and dump to nodes\r\n nodes.push(html`\r\n
    \r\n \r\n ${emptynodes}\r\n
    \r\n `);\r\n }\r\n\r\n return html`${nodes}`;\r\n }\r\n}\r\n","// Master JS for Calendar view\r\n// Assumes existence of global variable window.CurrentTrain\r\n\r\nimport BootstrapModal from \"bootstrap/js/dist/modal\";\r\nimport page from \"page\";\r\n\r\nimport { PostJSON, PostJSONMultiLoader, PostJSONWithLoadError } from \"./lib/fetchers.js\";\r\nimport { SetElementsVisible, WireupHandlers } from \"./lib/data-wireup.js\";\r\nimport { WidthObserver } from \"./lib/width-observer.js\";\r\nimport { IsDateInPast } from \"./lib/date-utilities.js\";\r\nimport { TrackClick } from \"./lib/click-tracking.js\";\r\nimport { ShowParticipantsModal } from \"./lib/participants-modal.js\";\r\nimport { ShowLinkedUpdate } from \"./lib/linked-update-modal.js\";\r\n\r\nimport { TextRevealer } from \"./webcomponents/text-revealer.js\";\r\nimport { TrainPost } from \"./webcomponents/train-post.js\";\r\nimport { MealDateRow } from \"./webcomponents/meal-date-row.js\";\r\nimport { RecentActivityRow } from \"./webcomponents/recent-activity-row.js\";\r\nimport { CalendarDisplay } from \"./webcomponents/calendar-display.js\";\r\nimport { CalendarList } from \"./webcomponents/calendar-list.js\";\r\nimport { ShareOptions } from \"./webcomponents/share-options.js\";\r\nimport { ProgressBar } from \"./webcomponents/progress-bar.js\";\r\nimport { TrainInfoCard } from \"./webcomponents/train-info-card.js\";\r\nimport { FacePile } from \"./webcomponents/face-pile.js\";\r\n\r\n// Register required webcomponents\r\nTextRevealer.Register();\r\nTrainPost.Register();\r\nMealDateRow.Register();\r\nRecentActivityRow.Register();\r\nCalendarDisplay.Register();\r\nCalendarList.Register();\r\nShareOptions.Register();\r\nProgressBar.Register();\r\nTrainInfoCard.Register();\r\nFacePile.Register();\r\n\r\n// Activate the resizeObserver\r\nWidthObserver.PerformWireup();\r\n\r\n////// PARTICIPANTS MODAL\r\n\r\n// Wire up the \"View all\" button\r\nWireupHandlers(\"showparticipants\", \"click\", () => ShowParticipantsModal(\"modalTrainParticipants\"));\r\n\r\n////// UPDATES\r\n\r\nasync function ShowRemainingUpdates() {\r\n const prependElement = document.getElementById(\"trainUpdates\").querySelector(\"[data-prepend-target]\");\r\n const posts = await PostJSONWithLoadError(prependElement, \"/trains/\" + window.CurrentTrain.Id + \"/more_updates\");\r\n const parent = prependElement.parentNode;\r\n for (const post of posts) {\r\n const postElement = parent.insertBefore(document.createElement(\"train-post\"), prependElement);\r\n postElement.entity = post;\r\n }\r\n}\r\nWireupHandlers(\"showupdates\", \"click\", ShowRemainingUpdates);\r\n\r\n////// CALENDAR VIEW\r\n\r\n// Populate calendars on page load\r\nwindow.addEventListener(\"DOMContentLoaded\", async () => {\r\n const listDiv = document.querySelector(\"[data-toggle-list]\");\r\n const calendarDiv = document.querySelector(\"[data-toggle-calendar]\");\r\n const pastModalDiv = document.querySelector(\"#modalPastDates [data-replacement-target]\");\r\n\r\n if (!listDiv || !calendarDiv || !pastModalDiv) return;\r\n\r\n const result = await PostJSONMultiLoader([listDiv, calendarDiv], \"/trains/\" + window.CurrentTrain.Id + \"/calendar\");\r\n const dates = result.obj;\r\n\r\n const calendarDisplay = document.createElement(\"calendar-display\");\r\n calendarDisplay.dates = dates;\r\n calendarDiv.innerHTML = \"\";\r\n calendarDiv.append(calendarDisplay);\r\n\r\n const calendarList = document.createElement(\"calendar-list\");\r\n calendarList.dates = dates;\r\n listDiv.innerHTML = \"\";\r\n listDiv.append(calendarList);\r\n\r\n const pastList = document.createElement(\"calendar-list\");\r\n pastList.dates = dates;\r\n pastList.expanded = true;\r\n pastList.past = true;\r\n pastModalDiv.innerHTML = \"\";\r\n pastModalDiv.append(pastList);\r\n\r\n const futureDates = dates.filter(item => !IsDateInPast(item.Entity.Date));\r\n if (futureDates.length > 0) {\r\n SetElementsVisible(\"futuredates\");\r\n }\r\n const allBooked = (futureDates.length > 0 && futureDates.every(item => item.Entity.AssignedUser && item.Entity.AssignedUser.Id));\r\n if (allBooked) {\r\n SetElementsVisible(\"allbooked\");\r\n document.body.classList.add(\"no-open-dates\");\r\n }\r\n\r\n // Load last selected calendar view on load\r\n if (typeof (Storage) !== \"undefined\") {\r\n try {\r\n const selectedView = localStorage.getItem(\"selectedView\");\r\n // Switch to calendar view if that's their last used view, but not if there aren't any future dates\r\n if (selectedView === \"calendar\" && futureDates.length > 0) {\r\n Array.from(document.querySelectorAll(\"[data-wireup-radiocalendar]\")).map(item => { item.checked = true; });\r\n await ShowCalendarView(false);\r\n }\r\n } catch {\r\n // OK to ignore\r\n }\r\n }\r\n});\r\n\r\n/** Toggle between list view and calendar view*/\r\nasync function ShowCalendarView(isList) {\r\n const listDiv = document.querySelector(\"[data-toggle-list]\");\r\n const calendarDiv = document.querySelector(\"[data-toggle-calendar]\");\r\n if (typeof (Storage) !== \"undefined\") {\r\n try {\r\n localStorage.setItem(\"selectedView\", isList ? \"list\" : \"calendar\");\r\n } catch {\r\n // OK to ignore\r\n }\r\n }\r\n if (isList) {\r\n listDiv.classList.remove(\"hidden\");\r\n calendarDiv.classList.add(\"hidden\");\r\n } else {\r\n calendarDiv.classList.remove(\"hidden\");\r\n listDiv.classList.add(\"hidden\");\r\n }\r\n}\r\nWireupHandlers(\"radiocalendar\", \"click\", () => ShowCalendarView(false));\r\nWireupHandlers(\"radiolist\", \"click\", () => ShowCalendarView(true));\r\n\r\n////// RECENT ACTIVITY\r\n\r\n// Populate from JSON on page load\r\nwindow.addEventListener(\"DOMContentLoaded\", async () => {\r\n // This is a little weird because there are now two recent activity widgets, one for desktop and one for mobile\r\n const widgetElements = Array.from(document.querySelectorAll(\"[data-populate-recentactivity]\"));\r\n if (widgetElements.length === 0) return;\r\n const replaceElements = widgetElements.map(e => e.querySelector(\"[data-replacement-target]\"));\r\n const activityPage = await PostJSONMultiLoader(replaceElements, \"/trains/\" + window.CurrentTrain.Id + \"/activities\");\r\n if (activityPage.rows.length === 0) {\r\n // No activity on this train yet, hide activity\r\n Array.from(document.querySelectorAll(\".train-activity\")).map(e => e.classList.add(\"hidden\"));\r\n } else {\r\n for (const replaceElement of replaceElements) {\r\n // Have to build an entirely new array of nodes for each element, since we can't reuse\r\n const nodes = [];\r\n for (const activity of activityPage.rows) {\r\n const node = document.createElement(\"recent-activity-row\");\r\n node.activity = activity;\r\n nodes.push(node);\r\n }\r\n replaceElement.innerHTML = \"\";\r\n replaceElement.append(...nodes);\r\n }\r\n }\r\n});\r\n\r\nlet fetchedActivityPages = 0;\r\nasync function ShowActivityModal() {\r\n const modalElement = document.getElementById(\"modalTrainActivity\");\r\n const modal = BootstrapModal.getOrCreateInstance(modalElement);\r\n modal.show();\r\n // If it's the first load, fetch some activities\r\n if (fetchedActivityPages === 0) {\r\n await LoadMoreActivities();\r\n }\r\n}\r\n\r\nasync function LoadMoreActivities() {\r\n const modalElement = document.getElementById(\"modalTrainActivity\");\r\n const buttonElement = modalElement.querySelector(\"[data-wireup-showmoreactivity]\");\r\n buttonElement.setAttribute(\"disabled\", \"disabled\");\r\n let totalPages = 999;\r\n try {\r\n const prependElement = modalElement.querySelector(\"[data-prepend-target]\");\r\n const activityPage = await PostJSONWithLoadError(prependElement, \"/trains/\" + window.CurrentTrain.Id + \"/activities\", { pageSize: 50, pageNumber: fetchedActivityPages + 1 });\r\n totalPages = Math.ceil(activityPage.total / 50);\r\n fetchedActivityPages += 1;\r\n const parent = prependElement.parentNode;\r\n for (const activity of activityPage.rows) {\r\n const node = parent.insertBefore(document.createElement(\"recent-activity-row\"), prependElement);\r\n node.activity = activity;\r\n node.isInModal = true;\r\n }\r\n } finally {\r\n // Reenable the button, or remove it if we're done loading\r\n if (fetchedActivityPages >= totalPages) {\r\n buttonElement.remove();\r\n } else {\r\n buttonElement.removeAttribute(\"disabled\");\r\n }\r\n }\r\n}\r\n\r\n// Wire up the \"View all\" button\r\nWireupHandlers(\"showactivity\", \"click\", ShowActivityModal);\r\nWireupHandlers(\"showmoreactivity\", \"click\", LoadMoreActivities);\r\n\r\n////// GIFT CARDS\r\n\r\n// Override all links to Incomm gift card shop to use the intake API\r\nWireupHandlers(\"gift-intake-link\", \"click\", async e => {\r\n /** @type {HTMLAnchorElement} */\r\n const link = e.currentTarget;\r\n if (link && link.href && link.href.startsWith(window.IncommBaseUrl)) {\r\n // Stop the original link from firing, we will handle from here\r\n e.preventDefault();\r\n let destination = link.href;\r\n try {\r\n const signed = await PostJSON(\"/trains/\" + window.CurrentTrain.Id + \"/giftcards/signedtransfer\", { redirectUrlKey: destination.substring(window.IncommBaseUrl.length + 1) });\r\n const intake = await PostJSON(window.IncommBaseUrl + \"/rest/V1/enhancedorder/intake\", signed.body, signed.headers);\r\n if (intake && intake.success && intake.redirectUrl) {\r\n // Intake process was successful, we can open the redirect URL rather than the original link\r\n destination = intake.redirectUrl;\r\n }\r\n } catch (ex) {\r\n // One of the API calls failed. We can still go to the original link, though\r\n console.error(ex.message);\r\n }\r\n // Whether we succeeded with the intake or not, open the destination in a new tab\r\n const openedTab = window.open(destination, \"_blank\");\r\n if (!openedTab) {\r\n // Popup was blocked, so open in the current tab instead\r\n console.log(\"Popup was blocked, navigating instead\");\r\n window.location.href = destination;\r\n }\r\n }\r\n});\r\n\r\n////// SUPPORT FOR: /trains/{id}/share url\r\n\r\nasync function ShowShareModal() {\r\n const modalElement = document.getElementById(\"modalTrainShare\");\r\n const modal = BootstrapModal.getOrCreateInstance(modalElement);\r\n modal.show();\r\n\r\n // Let other code know the user has already been shown a modal\r\n window.ShownAModal = true;\r\n}\r\n\r\n////// SUPPORT FOR: /trains/{id}/updates url\r\n\r\nfunction ShowUpdatesSection() {\r\n const updatesElement = document.getElementById(\"trainUpdates\");\r\n updatesElement.scrollIntoView();\r\n page(\"/\");\r\n}\r\n\r\n// Show a modal to prompt for donations on load in some circumstances\r\nasync function ShowFirstDonationModal() {\r\n // If the user has already been shown a modal, or their browser doesn't support LocalStorage, abort\r\n if ((typeof window.ShownAModal !== \"undefined\" && window.ShownAModal) || typeof Storage === \"undefined\") return;\r\n try {\r\n const shownFirstDonation = localStorage.getItem(\"shownFirstDonation\");\r\n // If we've never tried to show them this modal before, try now\r\n if (shownFirstDonation === null) {\r\n setTimeout(function () {\r\n const modalDiv = document.getElementById(\"modal-first-donation\");\r\n // Modal may be missing if for example donations are turned off or you're an admin, so ignore\r\n if (modalDiv) {\r\n localStorage.setItem(\"shownFirstDonation\", \"true\");\r\n const modal = BootstrapModal.getOrCreateInstance(modalDiv);\r\n modal.show();\r\n }\r\n }, 1500);\r\n }\r\n } catch {\r\n // OK to ignore\r\n }\r\n}\r\n\r\n////// CLIENT SIDE ROUTING\r\n\r\n// Needed because updates/:updateid encompasses updates/new\r\nfunction PassthroughRoute(ctx) {\r\n // Needed for chrome, to prevent duplicate history entries\r\n page.stop();\r\n ctx.handled = false;\r\n // Redirect to the path\r\n window.location.href = ctx.canonicalPath;\r\n}\r\n\r\npage.base(window.CurrentTrain.OpenUrl);\r\npage('/share', ShowShareModal);\r\npage('/updates', ShowUpdatesSection);\r\npage('/updates/new', PassthroughRoute);\r\npage('/updates/:updateid', (ctx) => ShowLinkedUpdate(ctx.params.updateid));\r\npage('/', ShowFirstDonationModal);\r\npage({ hashbang: false });\r\nconst modalShare = document.getElementById(\"modalTrainShare\");\r\nif (modalShare) modalShare.addEventListener(\"hide.bs.modal\", () => { page(\"/\"); });\r\n\r\n////// LOCAL STORAGE OF RECENT EVENTS\r\n\r\nasync function SaveToRecentList() {\r\n if (typeof (Storage) !== \"undefined\") {\r\n try {\r\n const result = await PostJSON(\"/trains/recent/\", { source: localStorage.getItem(\"recent\"), append: window.CurrentTrain.Id });\r\n if (result.ok) {\r\n localStorage.setItem(\"recent\", result.obj);\r\n }\r\n } catch {\r\n // OK to ignore\r\n }\r\n }\r\n}\r\nwindow.addEventListener(\"DOMContentLoaded\", async () => {\r\n SaveToRecentList();\r\n});\r\n\r\n////// CLICK TRACKING\r\nWireupHandlers(\"click-tracking\", \"click\", e => TrackClick(e.currentTarget));"],"names":["isarray","Array","isArray","arr","Object","prototype","toString","call","pathToRegexp_1","pathToRegexp","parse_1","parse","compile_1","str","tokensToFunction","tokensToFunction_1","tokensToRegExp_1","tokensToRegExp","PATH_REGEXP","RegExp","join","res","tokens","key","index","path","exec","m","escaped","offset","slice","length","push","prefix","name","capture","group","suffix","asterisk","repeat","optional","delimiter","pattern","escapeGroup","substr","matches","i","obj","data","token","segment","value","TypeError","j","encodeURIComponent","test","escapeString","replace","attachKeys","re","keys","flags","options","sensitive","strict","end","route","lastToken","endsWithSlash","groups","source","match","regexpToRegexp","parts","arrayToRegexp","stringToRegexp","compile","loaded","hasDocument","document","hasWindow","window","hasHistory","history","hasProcess","process","clickEvent","ontouchstart","isLocation","location","Page","this","callbacks","exits","current","len","_decodeURLComponents","_base","_strict","_running","_hashbang","clickHandler","bind","_onpopstate","page","fn","Route","arguments","middleware","start","unhandled","ctx","handled","_window","_getBase","hash","pathname","search","canonicalPath","stop","href","Context","state","pageInstance","_page","hashbang","pageBase","indexOf","title","querystring","_decodeURLEncodedURIComponent","params","split","globalPage","opts","method","regexp","configure","decodeURLComponents","_popstate","popstate","_click","click","addEventListener","removeEventListener","base","loc","protocol","enable","dispatch","url","show","prev","prevContext","pushState","back","setTimeout","redirect","from","to","inst","e","init","save","nextEnter","nextExit","exit","_which","metaKey","ctrlKey","shiftKey","defaultPrevented","el","target","eventPath","composedPath","nodeName","toUpperCase","parentNode","svg","constructor","hasAttribute","getAttribute","link","_samePath","baseVal","sameOrigin","orig","preventDefault","readyState","undefined","event","which","button","_toURL","URL","anc","createElement","hostname","port","val","decodeURIComponent","replaceState","self","next","routePath","qsIndex","hasOwnProperty","createPage","pageFn","apply","create","defineProperty","get","set","page_js","default_1","default","WidthObserver","_createClass","_classCallCheck","observer","_step","elementsToObserve","querySelectorAll","_iterator","_createForOfIteratorHelper","s","n","done","element","observe","err","f","ShowLinkedUpdate","_x","_ShowLinkedUpdate","_asyncToGenerator","_regeneratorRuntime","mark","_callee","updateid","modalDiv","updateDiv","update","infoCard","trainPost","wrap","_context","getElementById","abrupt","BootstrapModal","getOrCreateInstance","ShownAModal","querySelector","PostJSONWithLoadError","CurrentTrain","Id","sent","entity","isInModal","innerHTML","append","_defineProperty","ResizeObserver","entries","_step2","_iterator2","entry","observeWidth","parseInt","dataset","setAttribute","contentRect","width","style","setProperty","concat","Math","floor","OutsideClickWatcher","_this","isInitialized","clickOutsideListeners","listener","contains","insideElement","callback","Initialize","lastListenerId","id","findIndex","l","splice","UserAvatar","Register","PostLikesDisplay","_UnshadowedElement","_callSuper","_inherits","UnshadowedElement","_superPropGet","ExternalLikeChange","_this2","Post","detail","postId","PostLikes","likes","requestUpdate","_this3","bins","Map","like","bin","TypeId","icons","forEach","html","_templateObject","_taggedTemplateLiteral","LikeSvgSmall","_templateObject2","_templateObject3","_templateObject4","showingModal","_templateObject5","map","_templateObject6","Author","Avatar","Initials","FullName","_this4","type","Boolean","PostLikeButton","_len","args","_key","_Like","typeId","PostJSON","t0","error","showingPopout","dispatchEvent","CustomEvent","_Unlike","_callee2","myLikeIdx","_context2","item","UserHash","myLike","find","relativeUrl","Unlike","Like","LikeSvgLarge","_templateObject7","_this5","likeOptions","clickOutsideHandlerId","AddListener","RemoveListener","ShareOptions","TextRevealer","TrainPost","_PerformDelete","errorRow","classList","add","TrainId","showingDeleteConfirm","message","innerText","remove","console","adminButton","IsAdmin","showingMoreActions","moreActionsPopout","showingShare","deleteConfirmModal","PerformDelete","shareModal","updateurl","FullUrl","imageHolder","photoPath","PhotoPath","PhotoUrl","Name","Title","IsoDateFormatter","LongDate","DateLocal","Text","_templateObject8","deleteModal","TrackClickById","moreActions","MealDateRow","trainDate","rowContent","actionContent","Entity","AssignedUser","CategoryName","Description","Notes","IsDateInPast","Date","IsPlus","_templateObject9","_templateObject10","CanAdminister","ShortMonth","ShortestDay","ShortWeekday","_templateObject11","RecentActivityRow","modalElement","hide","activity","HideActivityModal","ObjectId","contents","User","TimeAgo","ShowUpdate","CalendarDisplay","changeMonthToday","selectedDay","showingModalDay","future","newMonth","startDate","setMonth","getMonth","thisMonth","setHours","setDate","day","hasEverScrolled","infoBox","scrollIntoView","dayButton","daynum","focus","status","isPast","selectDayMobile","nodes","scheduledDates","_step$value","_slicedToArray","schedule","MAX_ENTRIES_PER_DAY","noDatesForMonth","conditionalContent","_templateObject13","_templateObject14","_templateObject15","_templateObject16","date","LongWeekday","closeMobileDetail","_templateObject12","_this6","_templateObject17","_templateObject18","_templateObject21","_templateObject19","_templateObject20","_templateObject22","LongestDate","_templateObject23","_templateObject24","_templateObject25","_step3","_iterator3","_templateObject27","_templateObject26","_this7","dates","_templateObject28","trainDatesForMonth","filter","d","AreMonthsEqual","calendarDays","_loop","dateIterator","scheduled","parseISO","getDate","fullyBooked","every","partiallyBooked","some","getTime","isSelected","startDayOfWeek","getDay","_templateObject29","changeMonth","LongMonthYear","_templateObject30","_templateObject31","getMobileDayContent","getDesktopDayContent","getMobileDetailPlus","getMobileDetail","getDesktopModalPlus","getDesktopModal","_this8","PerformWireup","CalendarList","filtered","past","max","expanded","remaining","emptynodes","hasPast","ShowDonations","OrganizerId","OpenUrl","ShowGiftCards","_ShowRemainingUpdates","_callee5","prependElement","posts","parent","post","_context5","insertBefore","ShowCalendarView","_ShowCalendarView","_callee6","isList","listDiv","calendarDiv","_context6","Storage","localStorage","setItem","_unused2","ProgressBar","TrainInfoCard","FacePile","WireupHandlers","ShowParticipantsModal","pastModalDiv","result","calendarDisplay","calendarList","pastList","futureDates","PostJSONMultiLoader","SetElementsVisible","body","getItem","checked","widgetElements","replaceElements","activityPage","replaceElement","node","rows","fetchedActivityPages","_ShowActivityModal","_callee7","_context7","LoadMoreActivities","_LoadMoreActivities","_callee8","buttonElement","totalPages","_iterator4","_step4","_context8","pageSize","pageNumber","ceil","total","removeAttribute","finish","_ShowShareModal","_callee9","_context9","_ShowFirstDonationModal","_callee10","_context10","_unused3","_ref3","_callee3","destination","signed","intake","_context3","currentTarget","startsWith","IncommBaseUrl","redirectUrlKey","substring","headers","success","redirectUrl","open","log","_x2","modalShare","SaveToRecentList","_SaveToRecentList","_callee11","_context11","ok","_callee4","_context4","TrackClick"],"mappings":"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","x_google_ignoreList":[0]}