{"version":3,"file":"campus-1b271b5b.js","sources":["../../../app/frontend/javascripts/lib/showHide.ts","../../../app/frontend/javascripts/lib/util/index.ts","../../../app/frontend/javascripts/lib/cookies.ts","../../../app/frontend/javascripts/application/toast.ts","../../../app/frontend/javascripts/application/campus.ts"],"sourcesContent":["\nexport function toggleVisibleByCss(match: string, nomatch: string) {\n $(nomatch).each(function() {\n const $elem = $(this)\n if ($elem.data('toggle') == 'tab') {\n // bootstrap tab - don't hide\n return\n }\n\n $elem.removeClass('active').removeClass('show')\n })\n $(match).each(function() {\n const $elem = $(this)\n if ($elem.data('toggle') == 'tab') {\n // handle tabs using the bootstrap JS\n $elem.tab('show')\n return\n }\n\n $elem.addClass('active').addClass('show')\n })\n}\n","\n\nexport interface Stringable {\n toString(): string\n}\n\n/**\n * This is a shorthand to pass into array.map() when you want to call toString() on each item\n */\nexport function toString(value: Stringable): string {\n return value.toString()\n}\n\n/**\n * A single tuple from the array returned by Object.entries\n */\nexport type EntriesTuple = [keyof T, T[keyof T]]\n/**\n * The array returned by Object.entries\n */\nexport type EntriesArray = EntriesTuple[]\n\n/**\n * Gets the entries of an object as an array of tuples, with typescript type safety\n */\nexport function entries(obj: T): EntriesArray {\n return Object.entries(obj) as EntriesArray\n}\n\n/**\n * Test whether the item exists (i.e. is not null or undefined).\n *\n * @example\n * const myArr: Array = ['a', null, undefined, 'b', false, 0]\n * const filtered: string[] = myArr.filter(exists) // ['a', 'b', false, 0]\n */\nexport function exists(item: T | null | undefined): item is T {\n return item !== null && item !== undefined\n}\n\nexport function present(value: T): value is Exclude {\n if (typeof value == 'string') {\n return value.length > 0\n }\n if (typeof value == 'number') {\n // 0 is considered present\n return true\n }\n\n return !!value\n}\n\nexport function assert(value: T, key?: string, msg?: string): asserts value is Exclude {\n if (!present(value)) {\n throw new Error(msg || 'assert failed! Value was not present')\n }\n}\n\n/**\n * Returns a new array where duplicate values have been removed\n */\nexport function uniq(arr: T[]): T[] {\n return arr.filter((item, index) => arr.indexOf(item) === index)\n}\n\nexport function uniqBy(arr: T[], keyOrFn: keyof T | ((item: T) => any)): T[] {\n const fn: (item: T) => any = typeof(keyOrFn) == 'function' ?\n keyOrFn :\n (i: T) => i[keyOrFn]\n\n return arr.filter((item, index) => {\n const search = fn(item)\n return arr.findIndex((i) => fn(i) == search) === index\n })\n}\n\ndeclare global {\n \n interface Array {\n /**\n * Returns a new array where duplicate values have been removed\n */\n uniq(): T[]\n\n /**\n * Returns a new array where duplicate values have been removed, as selected\n * by the key function\n */\n uniqBy(keyOrFn: keyof T | ((item: T) => any)): T[]\n }\n\n interface Window {\n refTagger?: { tag: (node: HTMLElement) => void }\n }\n}\n\nArray.prototype.uniq = function() {\n return uniq(this)\n}\nArray.prototype.uniqBy = function(keyOrFn) {\n return uniqBy(this, keyOrFn)\n}\n","// https://www.quirksmode.org/js/cookies.html\n\nexport function createCookie(name: string, value: string, days?: number) {\n\n const date = new Date()\n date.setTime(date.getTime() + ((days || 365) * 24 * 60 * 60 * 1000))\n const expires = '; expires=' + date.toUTCString()\n\n document.cookie = name + '=' + value + expires + '; path=/'\n}\n\nexport function readCookie(name: string) {\n const nameEQ = name + '='\n const ca = document.cookie.split(';')\n \n for (let i = 0; i < ca.length; i++) {\n let c = ca[i]\n while (c.charAt(0) == ' ') { c = c.substring(1, c.length) }\n if (c.indexOf(nameEQ) == 0) { return c.substring(nameEQ.length, c.length) }\n }\n return null\n}\n\nexport function eraseCookie(name: string) {\n createCookie(name, '', -1)\n}\n\ndeclare global {\n \n interface Window {\n eraseCookie: typeof eraseCookie\n }\n}\nif (typeof window != 'undefined') {\n window.eraseCookie = eraseCookie\n}\n","import { eraseCookie, readCookie } from '../lib/cookies'\nimport { changeCampus, getCampus, getCampusSlug } from './campus'\n\nexport default function toastInit() {\n const showToast: string | null = readCookie('render-toast')\n const currentPath = document.location.pathname.split('/').pop()\n\n const cookieCampus = getCampus(getCampusSlug(readCookie('campus')))\n if (cookieCampus && cookieCampus.state == 'external') {\n renderCampusToast(cookieCampus.slug)\n } else if (cookieCampus) {\n if (showToast && showToast === 'true') {\n renderCampusToast(cookieCampus.slug)\n } else if (getCampus(currentPath)) {\n if (cookieCampus.slug !== currentPath) {\n renderCampusConflictToast(cookieCampus.slug)\n }\n }\n }\n\n $('[data-dismiss=\"campus-conflict\"]').on('click', (evt) => {\n evt.preventDefault()\n\n hideToast('campus-conflict')\n })\n\n $('.campus-undo').on('click', (evt) => {\n const prevCampus = evt.currentTarget.getAttribute('data-prev-campus')\n\n if (prevCampus && prevCampus.length > 0) {\n hideToast(`toast-${evt.currentTarget.getAttribute('data-current-campus')}`)\n changeCampus(prevCampus, evt.currentTarget)\n if (evt.currentTarget.getAttribute('data-current-page-campus-aware') === 'false') {\n evt.preventDefault()\n }\n }\n })\n}\n\nfunction renderCampusConflictToast(campusSlug: string) {\n const campusFromCookieElem = document.getElementById('campus-from-cookie')\n const campusSlugText = document.createTextNode(`${campusSlug}`)\n\n if (campusFromCookieElem) {\n campusFromCookieElem.appendChild(campusSlugText)\n renderToast('campus-conflict')\n }\n}\n\nexport function renderCampusToast(\n campusSlug: string = getCampusSlug() || 'default',\n previousSlug: string | null = readCookie('previous-campus'),\n) {\n const undoCampusButton: HTMLAnchorElement | null =\n document.querySelector(`.toast-${campusSlug} .toast-header .campus-undo`)\n\n if (previousSlug && previousSlug.length > 0) {\n hideToast(`toast-${previousSlug}`)\n\n if (undoCampusButton && campusSlug != previousSlug) {\n renderUndoCampusButton(undoCampusButton, previousSlug)\n }\n }\n\n // This event is fired when the toast has finished being hidden from the user.\n $(`.toast-${campusSlug}`).on('hidden.bs.toast', () => {\n if (undoCampusButton) {\n hideUndoCampusButton(undoCampusButton)\n }\n })\n\n renderToast(`toast-${campusSlug}`)\n eraseCookie('render-toast')\n}\n\nfunction renderToast(className: string) {\n $(`.${className}`).toast('show')\n}\n\nfunction hideToast(className: string) {\n $(`.${className}`).toast('hide')\n}\n\nfunction renderUndoCampusButton(undoCampusButton: HTMLAnchorElement, previousSlug: string) {\n undoCampusButton.setAttribute('data-prev-campus', `${previousSlug}`)\n undoCampusButton.href = document.referrer\n undoCampusButton.classList.add('show')\n}\n\nfunction hideUndoCampusButton(undoCampusButton: HTMLAnchorElement) {\n undoCampusButton.classList.remove('show')\n}\n","import WCC from 'wcc'\nimport { createCookie, readCookie } from '../lib/cookies'\nimport { toggleVisibleByCss } from '../lib/showHide'\nimport { renderCampusToast } from './toast'\n\nfunction setCampusSlug(campusSlug: string) {\n createCookie('campus', 'watermark-' + campusSlug)\n}\n\nfunction setPrevCampusSlug(campusSlug: string) {\n createCookie('previous-campus', campusSlug)\n}\n\nexport function getCampusSlug(campusSlug: string | null = readCookie('campus')) {\n if (!campusSlug) { return null }\n\n return campusSlug.replace('watermark-', '')\n}\n\nexport default function campusInit() {\n $('.dropdown-item[data-campus]').on('click', function(evt) {\n const href = evt.currentTarget.getAttribute('href')\n const campusSlug = $(this).data('campus')\n\n if (campusSlug && campusSlug.length > 0) {\n changeCampus(campusSlug, this)\n }\n\n if (!href || (href == '#')) {\n evt.preventDefault()\n renderCampusToast(campusSlug)\n }\n })\n\n updateVisibleCampus()\n}\n\nexport function changeCampus(slug: string, source: Element = document.body) {\n const previous = getCampus()\n if (previous && slug == previous.slug) {\n return\n }\n\n setCampusSlug(slug)\n if (previous && previous.slug.length > 0) {\n setPrevCampusSlug(previous.slug)\n }\n updateVisibleCampus(slug)\n if (!source.classList.contains('campus-undo')) {\n createCookie('render-toast', 'true')\n }\n $(source).trigger('change.campus', { slug, previous })\n}\n\nexport function onChangeCampus(handler: CampusEventHandler) {\n $(document).on('change.campus', handler)\n}\n\ntype ICampusEvent = JQuery.TriggeredEvent\nexport type CampusEventHandler =\n (this: TElement, t: ICampusEvent, params: { slug: string, previous: string }) => any\n\ndeclare global {\n \n interface JQuery {\n on(events: 'change.campus', handler: CampusEventHandler): this\n }\n}\n\nexport function getCampus(campusSlug: string | null = getCampusSlug()) {\n if (campusSlug && campusSlug.length > 0) {\n return WCC.activeCampuses.find((c) => c.slug == campusSlug)\n }\n}\n\nfunction updateVisibleCampus(campusSlug: string = getCampusSlug() || 'default') {\n toggleVisibleByCss(`[data-campus=\"${campusSlug}\"]`, '[data-campus]')\n}\n"],"names":["toggleVisibleByCss","match","nomatch","$elem","toString","value","entries","obj","exists","item","present","assert","key","msg","uniq","arr","index","uniqBy","keyOrFn","fn","i","search","createCookie","name","days","date","expires","readCookie","nameEQ","ca","c","eraseCookie","toastInit","showToast","currentPath","cookieCampus","getCampus","getCampusSlug","renderCampusToast","renderCampusConflictToast","evt","hideToast","prevCampus","changeCampus","campusSlug","campusFromCookieElem","campusSlugText","renderToast","previousSlug","undoCampusButton","renderUndoCampusButton","hideUndoCampusButton","className","WCC","setCampusSlug","setPrevCampusSlug","campusInit","href","updateVisibleCampus","slug","source","previous"],"mappings":"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"}