{"version":3,"file":"index-e3e6bba4.js","sources":["../../../../../../node_modules/@itslearning/atlas/network/postMessage.js","../../../../../../node_modules/@itslearning/atlas/frames/IframeClickEventHelper.js","../../../../../../node_modules/svelte/src/runtime/internal/utils.js","../../../../../../node_modules/svelte/src/runtime/internal/globals.js","../../../../../../node_modules/svelte/src/runtime/internal/dom.js","../../../../../../node_modules/svelte/src/runtime/internal/lifecycle.js","../../../../../../node_modules/svelte/src/runtime/internal/scheduler.js","../../../../../../node_modules/svelte/src/runtime/internal/transitions.js","../../../../../../node_modules/svelte/src/runtime/internal/each.js","../../../../../../node_modules/svelte/src/runtime/internal/spread.js","../../../../../../node_modules/svelte/src/runtime/internal/Component.js","../../../../../../node_modules/svelte/src/shared/version.js","../../../../../../node_modules/svelte/src/runtime/internal/disclose-version/index.js","../../../../../../node_modules/@itslearning/prometheus/assets/inputs/Button/v1/Button.svelte","../../../../../../node_modules/@itslearning/prometheus/assets/inputs/IconButton/v1/IconButton.svelte","../../../../../../node_modules/@itslearning/atlas/keyboard/keys.js","../../../../../../node_modules/@itslearning/atlas/keyboard/normalize.js","../../../../../../node_modules/@itslearning/prometheus/lib/helpers/TabTrapHelper.js","../../../../../../node_modules/@itslearning/prometheus/assets/dropdowns/Dropdown/v1/dropdownHelper.js","../../../../../../node_modules/@itslearning/prometheus/assets/dropdowns/Dropdown/v1/AnchorItem.svelte","../../../../../../node_modules/@itslearning/prometheus/assets/dropdowns/Dropdown/v1/ButtonItem.svelte","../../../../../../node_modules/@itslearning/atlas/detectors/UserAgentHelper.js","../../../../../../node_modules/@itslearning/prometheus/assets/dropdowns/Dropdown/v1/navigationHelper.js","../../../../../../node_modules/@itslearning/prometheus/assets/dropdowns/Dropdown/v1/ListItem.svelte","../../../../../../node_modules/@itslearning/atlas/generate/guid.js","../../../../../../node_modules/@itslearning/prometheus/assets/dropdowns/Dropdown/v1/List.svelte","../../../../../../node_modules/@itslearning/prometheus/assets/dropdowns/Dropdown/v1/Dropdown.svelte","../../../../../../node_modules/@itslearning/prometheus/assets/dropdowns/ButtonDropdown/v1/ButtonDropdown.svelte","../../../../../../node_modules/@itslearning/prometheus/assets/modals/Modal/v2/Modal.svelte","../../../../../../node_modules/@itslearning/prometheus/assets/feedback/Banner/v1/Banner.svelte","../../../planner-common/config.js","../../../planner-common/i18n.js","../../../../../../node_modules/@itslearning/atlas/network/NetworkError.js","../../../../../../node_modules/@itslearning/atlas/network/responseStatuses.js","../../../../../../node_modules/@itslearning/atlas/network/fetch.js","../../../planner-common/constants.js","../../../planner-common/api.js","../../../../../../node_modules/svelte/src/runtime/store/index.js","../../../../../../node_modules/@itslearning/prometheus/assets/Navigation/Link/v1/Link.svelte","../../../../../../node_modules/@itslearning/prometheus/assets/nodes/EmptyState/v1/EmptyState.svelte","../../../../../../node_modules/@itslearning/prometheus/assets/Navigation/Tabs/v1/Tabs.svelte","../../../../../../node_modules/@itslearning/atlas/strings/format.js","../../../../../../node_modules/@itslearning/prometheus/assets/inputs/Checkbox/v1/Checkbox.svelte","../../../../../../node_modules/@itslearning/prometheus/assets/modals/Tooltip/v1/Tooltip.svelte","../../../planner-common/components/ElementProgress/ElementProgress.svelte","../../../planner-common/components/PlanCompleted/PlanCompleted.svelte","../../../planner-common/helpers/backLinkHelper.js","../../../../../../node_modules/@itslearning/atlas/network/kpi.js","../../../planner-common/helpers/kpiHelper.js","../../../planner-common/components/ProgressPlanLink/ProgressPlanLink.svelte","../../../planner-common/components/ProgressBar/ProgressBar.svelte","../../../planner-common/helpers/planImageHelper.js","../../../planner-common/helpers/loadPlansHelper.js","../../../planner-common/helpers/dateHelper.js","../../../planner-common/helpers/isPlanCompletedHelper.js","../../../planner-common/helpers/visibilityHelper.js","../../../planner-common/components/PlanCard/PlanCard.svelte","../../../../../../node_modules/@itslearning/prometheus/assets/inputs/Switch/v1/Switch.svelte","../../../planner-common/helpers/loadTopicsHelper.js","../../../planner-common/logic/plans/stores.js","../../../planner-common/logic/plans/loadDataController.js","../../../../../../node_modules/@itslearning/atlas/dom/Ratecontrol.js","../../../planner-common/logic/topicPage/stores.js","../../../planner-common/components/PlansView/PlansView.svelte","../../../planner-common/components/TableViewLink/TableViewLink.svelte","../../../../../../node_modules/@itslearning/prometheus/assets/inputs/DatePicker/v1/dateHelpers.js","../../../../../../node_modules/@itslearning/prometheus/assets/inputs/TextField/v1/TextInput.svelte","../../../../../../node_modules/@itslearning/prometheus/assets/inputs/TextField/v1/TextField.svelte","../../../../../../node_modules/@itslearning/prometheus/assets/inputs/DatePicker/v1/DatePicker.svelte","../../../../../../node_modules/@itslearning/prometheus/assets/inputs/DatePickerField/v1/DatePickerField.svelte","../../../planner-common/components/ConnectToCalendarModal/ConnectToCalendarModalError.svelte","../../../../../../node_modules/@itslearning/prometheus/assets/inputs/Select/v1/Select.svelte","../../../planner-common/components/ConnectToCalendarModal/ConnectToCalendarSelector.svelte","../../../planner-common/components/ConnectToCalendarModal/ConnectToCalendarModal.svelte","../../../planner-common/components/CopyConfirmAndErrorModal/CopyConfirmAndErrorModal.svelte","../../../planner-common/components/DateTimePicker/TimeSelector.svelte","../../../planner-common/components/SetDatesModal/SetDatesModalError.svelte","../../../planner-common/components/SetDatesModal/SetDatesModal.svelte","../../../planner-common/logic/planPage/stores.js","../../../planner-common/controllers/updatePlanController.js","../../../planner-common/helpers/converters.js","../../../planner-common/helpers/makeCourseForDropdownHelper.js","../../../planner-common/components/PlanActions/PlanActions.svelte","../../../planner-common/components/UseReadyMadeContentLink/UseReadyMadeContentLink.svelte","../../../planner-common/components/PlansToolbar/PlansToolbar.svelte","../../../../../../node_modules/@itslearning/prometheus/assets/modals/Modal/v1/ModalEvents.js","../../../../../../node_modules/@itslearning/prometheus/assets/modals/Modal/v1/Modal.svelte","../../../../../../node_modules/@itslearning/prometheus/assets/inputs/ColorPicker/v1/ColorPicker.svelte","../../../planner-common/components/CreateTopicModal/CreateTopicModal.svelte","../../../planner-common/components/TopicActions/TopicActions.svelte","../../src/lib/TopicCard/TopicCard.svelte","../../src/lib/Topics/Topics.svelte","../../src/lib/PlanTabs/PlanTabs.svelte","../../src/lib/SelfPacedPlanTabs/SelfPacedPlanTabs.svelte","../../src/lib/App/App.svelte","../../src/main.js"],"sourcesContent":["/**\r\n * @module network/postMessage\r\n */\r\n\r\n/**\r\n * Executes a PostMessage to the current parent.\r\n * @param {*} message The message to be sent.\r\n */\r\nexport function postMessage(message, parentFrame = window.parent) {\r\n    if (window.self !== window.top) {\r\n        parentFrame.postMessage(JSON.stringify(message), '*');\r\n    }\r\n}\r\n\r\n/**\r\n * Executes a PostMessage to the topmost frame.\r\n * @param {*} message The message to be sent.\r\n */\r\nexport function postMessageToTopmostFrame(message, parentFrame = window.parent) {\r\n    postMessage(message);\r\n\r\n    if (parentFrame !== parentFrame.top) {\r\n        postMessageToTopmostFrame(message, parentFrame.parent);\r\n    }\r\n}\r\n\r\n/**\r\n * Attach to a post message\r\n * @param {*} window Window instance to which the listener will be attached\r\n * @param {*} messageName Name of message(event)\r\n * @param {*} handler Callback\r\n */\r\nexport function attachPostMessageEventListener(window, messageName, handler) {\r\n    window.addEventListener('message', (event) => {\r\n        if (event.data) {\r\n            try {\r\n                const message = JSON.parse(event.data);\r\n\r\n                if (message && message.messageName && message.messageName === messageName) {\r\n                    handler(message);\r\n                }\r\n            } catch (e) {\r\n                // ignore calls with incorrect json\r\n            }\r\n        }\r\n    });\r\n}\r\n","import { postMessageToTopmostFrame } from '../network/postMessage';\r\n\r\n/**\r\n * Helper class for bubbling up client script click event to the top frame from inner iframe.\r\n * @module frames/IFrameClickEventHelper\r\n */\r\n\r\n/**\r\n * Allows click events to bubble up to the parent frame.\r\n */\r\nexport const registerDocumentClickBubblingOnTop = () => {\r\n    const deviceAgent = navigator.userAgent.toLowerCase();\r\n    const agentId = deviceAgent.match(/(iphone|ipod|ipad)/);\r\n\r\n    const iframeClickBubbleMessage = { messageName: 'iframeClickBubble' };\r\n    document.addEventListener('click', () => { postMessageToTopmostFrame(iframeClickBubbleMessage); });\r\n\r\n    if (!agentId) {\r\n        const iframeTouchstartBubbleMessage = { messageName: 'iframeTouchstartBubble' };\r\n        document.addEventListener('touchstart', () => { postMessageToTopmostFrame(iframeTouchstartBubbleMessage); });\r\n    }\r\n};","/** @returns {void} */\nexport function noop() {}\n\nexport const identity = (x) => x;\n\n/**\n * @template T\n * @template S\n * @param {T} tar\n * @param {S} src\n * @returns {T & S}\n */\nexport function assign(tar, src) {\n\t// @ts-ignore\n\tfor (const k in src) tar[k] = src[k];\n\treturn /** @type {T & S} */ (tar);\n}\n\n// Adapted from https://github.com/then/is-promise/blob/master/index.js\n// Distributed under MIT License https://github.com/then/is-promise/blob/master/LICENSE\n/**\n * @param {any} value\n * @returns {value is PromiseLike<any>}\n */\nexport function is_promise(value) {\n\treturn (\n\t\t!!value &&\n\t\t(typeof value === 'object' || typeof value === 'function') &&\n\t\ttypeof (/** @type {any} */ (value).then) === 'function'\n\t);\n}\n\n/** @returns {void} */\nexport function add_location(element, file, line, column, char) {\n\telement.__svelte_meta = {\n\t\tloc: { file, line, column, char }\n\t};\n}\n\nexport function run(fn) {\n\treturn fn();\n}\n\nexport function blank_object() {\n\treturn Object.create(null);\n}\n\n/**\n * @param {Function[]} fns\n * @returns {void}\n */\nexport function run_all(fns) {\n\tfns.forEach(run);\n}\n\n/**\n * @param {any} thing\n * @returns {thing is Function}\n */\nexport function is_function(thing) {\n\treturn typeof thing === 'function';\n}\n\n/** @returns {boolean} */\nexport function safe_not_equal(a, b) {\n\treturn a != a ? b == b : a !== b || (a && typeof a === 'object') || typeof a === 'function';\n}\n\nlet src_url_equal_anchor;\n\n/**\n * @param {string} element_src\n * @param {string} url\n * @returns {boolean}\n */\nexport function src_url_equal(element_src, url) {\n\tif (element_src === url) return true;\n\tif (!src_url_equal_anchor) {\n\t\tsrc_url_equal_anchor = document.createElement('a');\n\t}\n\t// This is actually faster than doing URL(..).href\n\tsrc_url_equal_anchor.href = url;\n\treturn element_src === src_url_equal_anchor.href;\n}\n\n/** @param {string} srcset */\nfunction split_srcset(srcset) {\n\treturn srcset.split(',').map((src) => src.trim().split(' ').filter(Boolean));\n}\n\n/**\n * @param {HTMLSourceElement | HTMLImageElement} element_srcset\n * @param {string | undefined | null} srcset\n * @returns {boolean}\n */\nexport function srcset_url_equal(element_srcset, srcset) {\n\tconst element_urls = split_srcset(element_srcset.srcset);\n\tconst urls = split_srcset(srcset || '');\n\n\treturn (\n\t\turls.length === element_urls.length &&\n\t\turls.every(\n\t\t\t([url, width], i) =>\n\t\t\t\twidth === element_urls[i][1] &&\n\t\t\t\t// We need to test both ways because Vite will create an a full URL with\n\t\t\t\t// `new URL(asset, import.meta.url).href` for the client when `base: './'`, and the\n\t\t\t\t// relative URLs inside srcset are not automatically resolved to absolute URLs by\n\t\t\t\t// browsers (in contrast to img.src). This means both SSR and DOM code could\n\t\t\t\t// contain relative or absolute URLs.\n\t\t\t\t(src_url_equal(element_urls[i][0], url) || src_url_equal(url, element_urls[i][0]))\n\t\t)\n\t);\n}\n\n/** @returns {boolean} */\nexport function not_equal(a, b) {\n\treturn a != a ? b == b : a !== b;\n}\n\n/** @returns {boolean} */\nexport function is_empty(obj) {\n\treturn Object.keys(obj).length === 0;\n}\n\n/** @returns {void} */\nexport function validate_store(store, name) {\n\tif (store != null && typeof store.subscribe !== 'function') {\n\t\tthrow new Error(`'${name}' is not a store with a 'subscribe' method`);\n\t}\n}\n\nexport function subscribe(store, ...callbacks) {\n\tif (store == null) {\n\t\tfor (const callback of callbacks) {\n\t\t\tcallback(undefined);\n\t\t}\n\t\treturn noop;\n\t}\n\tconst unsub = store.subscribe(...callbacks);\n\treturn unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\n\n/**\n * Get the current value from a store by subscribing and immediately unsubscribing.\n *\n * https://svelte.dev/docs/svelte-store#get\n * @template T\n * @param {import('../store/public.js').Readable<T>} store\n * @returns {T}\n */\nexport function get_store_value(store) {\n\tlet value;\n\tsubscribe(store, (_) => (value = _))();\n\treturn value;\n}\n\n/** @returns {void} */\nexport function component_subscribe(component, store, callback) {\n\tcomponent.$$.on_destroy.push(subscribe(store, callback));\n}\n\nexport function create_slot(definition, ctx, $$scope, fn) {\n\tif (definition) {\n\t\tconst slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n\t\treturn definition[0](slot_ctx);\n\t}\n}\n\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n\treturn definition[1] && fn ? assign($$scope.ctx.slice(), definition[1](fn(ctx))) : $$scope.ctx;\n}\n\nexport function get_slot_changes(definition, $$scope, dirty, fn) {\n\tif (definition[2] && fn) {\n\t\tconst lets = definition[2](fn(dirty));\n\t\tif ($$scope.dirty === undefined) {\n\t\t\treturn lets;\n\t\t}\n\t\tif (typeof lets === 'object') {\n\t\t\tconst merged = [];\n\t\t\tconst len = Math.max($$scope.dirty.length, lets.length);\n\t\t\tfor (let i = 0; i < len; i += 1) {\n\t\t\t\tmerged[i] = $$scope.dirty[i] | lets[i];\n\t\t\t}\n\t\t\treturn merged;\n\t\t}\n\t\treturn $$scope.dirty | lets;\n\t}\n\treturn $$scope.dirty;\n}\n\n/** @returns {void} */\nexport function update_slot_base(\n\tslot,\n\tslot_definition,\n\tctx,\n\t$$scope,\n\tslot_changes,\n\tget_slot_context_fn\n) {\n\tif (slot_changes) {\n\t\tconst slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);\n\t\tslot.p(slot_context, slot_changes);\n\t}\n}\n\n/** @returns {void} */\nexport function update_slot(\n\tslot,\n\tslot_definition,\n\tctx,\n\t$$scope,\n\tdirty,\n\tget_slot_changes_fn,\n\tget_slot_context_fn\n) {\n\tconst slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn);\n\tupdate_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn);\n}\n\n/** @returns {any[] | -1} */\nexport function get_all_dirty_from_scope($$scope) {\n\tif ($$scope.ctx.length > 32) {\n\t\tconst dirty = [];\n\t\tconst length = $$scope.ctx.length / 32;\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\tdirty[i] = -1;\n\t\t}\n\t\treturn dirty;\n\t}\n\treturn -1;\n}\n\n/** @returns {{}} */\nexport function exclude_internal_props(props) {\n\tconst result = {};\n\tfor (const k in props) if (k[0] !== '$') result[k] = props[k];\n\treturn result;\n}\n\n/** @returns {{}} */\nexport function compute_rest_props(props, keys) {\n\tconst rest = {};\n\tkeys = new Set(keys);\n\tfor (const k in props) if (!keys.has(k) && k[0] !== '$') rest[k] = props[k];\n\treturn rest;\n}\n\n/** @returns {{}} */\nexport function compute_slots(slots) {\n\tconst result = {};\n\tfor (const key in slots) {\n\t\tresult[key] = true;\n\t}\n\treturn result;\n}\n\n/** @returns {(this: any, ...args: any[]) => void} */\nexport function once(fn) {\n\tlet ran = false;\n\treturn function (...args) {\n\t\tif (ran) return;\n\t\tran = true;\n\t\tfn.call(this, ...args);\n\t};\n}\n\nexport function null_to_empty(value) {\n\treturn value == null ? '' : value;\n}\n\nexport function set_store_value(store, ret, value) {\n\tstore.set(value);\n\treturn ret;\n}\n\nexport const has_prop = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);\n\nexport function action_destroyer(action_result) {\n\treturn action_result && is_function(action_result.destroy) ? action_result.destroy : noop;\n}\n\n/** @param {number | string} value\n * @returns {[number, string]}\n */\nexport function split_css_unit(value) {\n\tconst split = typeof value === 'string' && value.match(/^\\s*(-?[\\d.]+)([^\\s]*)\\s*$/);\n\treturn split ? [parseFloat(split[1]), split[2] || 'px'] : [/** @type {number} */ (value), 'px'];\n}\n\nexport const contenteditable_truthy_values = ['', true, 1, 'true', 'contenteditable'];\n","/** @type {typeof globalThis} */\nexport const globals =\n\ttypeof window !== 'undefined'\n\t\t? window\n\t\t: typeof globalThis !== 'undefined'\n\t\t? globalThis\n\t\t: // @ts-ignore Node typings have this\n\t\t  global;\n","import { contenteditable_truthy_values, has_prop } from './utils.js';\n\nimport { ResizeObserverSingleton } from './ResizeObserverSingleton.js';\n\n// Track which nodes are claimed during hydration. Unclaimed nodes can then be removed from the DOM\n// at the end of hydration without touching the remaining nodes.\nlet is_hydrating = false;\n\n/**\n * @returns {void}\n */\nexport function start_hydrating() {\n\tis_hydrating = true;\n}\n\n/**\n * @returns {void}\n */\nexport function end_hydrating() {\n\tis_hydrating = false;\n}\n\n/**\n * @param {number} low\n * @param {number} high\n * @param {(index: number) => number} key\n * @param {number} value\n * @returns {number}\n */\nfunction upper_bound(low, high, key, value) {\n\t// Return first index of value larger than input value in the range [low, high)\n\twhile (low < high) {\n\t\tconst mid = low + ((high - low) >> 1);\n\t\tif (key(mid) <= value) {\n\t\t\tlow = mid + 1;\n\t\t} else {\n\t\t\thigh = mid;\n\t\t}\n\t}\n\treturn low;\n}\n\n/**\n * @param {NodeEx} target\n * @returns {void}\n */\nfunction init_hydrate(target) {\n\tif (target.hydrate_init) return;\n\ttarget.hydrate_init = true;\n\t// We know that all children have claim_order values since the unclaimed have been detached if target is not <head>\n\n\tlet children = /** @type {ArrayLike<NodeEx2>} */ (target.childNodes);\n\t// If target is <head>, there may be children without claim_order\n\tif (target.nodeName === 'HEAD') {\n\t\tconst my_children = [];\n\t\tfor (let i = 0; i < children.length; i++) {\n\t\t\tconst node = children[i];\n\t\t\tif (node.claim_order !== undefined) {\n\t\t\t\tmy_children.push(node);\n\t\t\t}\n\t\t}\n\t\tchildren = my_children;\n\t}\n\t/*\n\t * Reorder claimed children optimally.\n\t * We can reorder claimed children optimally by finding the longest subsequence of\n\t * nodes that are already claimed in order and only moving the rest. The longest\n\t * subsequence of nodes that are claimed in order can be found by\n\t * computing the longest increasing subsequence of .claim_order values.\n\t *\n\t * This algorithm is optimal in generating the least amount of reorder operations\n\t * possible.\n\t *\n\t * Proof:\n\t * We know that, given a set of reordering operations, the nodes that do not move\n\t * always form an increasing subsequence, since they do not move among each other\n\t * meaning that they must be already ordered among each other. Thus, the maximal\n\t * set of nodes that do not move form a longest increasing subsequence.\n\t */\n\t// Compute longest increasing subsequence\n\t// m: subsequence length j => index k of smallest value that ends an increasing subsequence of length j\n\tconst m = new Int32Array(children.length + 1);\n\t// Predecessor indices + 1\n\tconst p = new Int32Array(children.length);\n\tm[0] = -1;\n\tlet longest = 0;\n\tfor (let i = 0; i < children.length; i++) {\n\t\tconst current = children[i].claim_order;\n\t\t// Find the largest subsequence length such that it ends in a value less than our current value\n\t\t// upper_bound returns first greater value, so we subtract one\n\t\t// with fast path for when we are on the current longest subsequence\n\t\tconst seq_len =\n\t\t\t(longest > 0 && children[m[longest]].claim_order <= current\n\t\t\t\t? longest + 1\n\t\t\t\t: upper_bound(1, longest, (idx) => children[m[idx]].claim_order, current)) - 1;\n\t\tp[i] = m[seq_len] + 1;\n\t\tconst new_len = seq_len + 1;\n\t\t// We can guarantee that current is the smallest value. Otherwise, we would have generated a longer sequence.\n\t\tm[new_len] = i;\n\t\tlongest = Math.max(new_len, longest);\n\t}\n\t// The longest increasing subsequence of nodes (initially reversed)\n\n\t/**\n\t * @type {NodeEx2[]}\n\t */\n\tconst lis = [];\n\t// The rest of the nodes, nodes that will be moved\n\n\t/**\n\t * @type {NodeEx2[]}\n\t */\n\tconst to_move = [];\n\tlet last = children.length - 1;\n\tfor (let cur = m[longest] + 1; cur != 0; cur = p[cur - 1]) {\n\t\tlis.push(children[cur - 1]);\n\t\tfor (; last >= cur; last--) {\n\t\t\tto_move.push(children[last]);\n\t\t}\n\t\tlast--;\n\t}\n\tfor (; last >= 0; last--) {\n\t\tto_move.push(children[last]);\n\t}\n\tlis.reverse();\n\t// We sort the nodes being moved to guarantee that their insertion order matches the claim order\n\tto_move.sort((a, b) => a.claim_order - b.claim_order);\n\t// Finally, we move the nodes\n\tfor (let i = 0, j = 0; i < to_move.length; i++) {\n\t\twhile (j < lis.length && to_move[i].claim_order >= lis[j].claim_order) {\n\t\t\tj++;\n\t\t}\n\t\tconst anchor = j < lis.length ? lis[j] : null;\n\t\ttarget.insertBefore(to_move[i], anchor);\n\t}\n}\n\n/**\n * @param {Node} target\n * @param {Node} node\n * @returns {void}\n */\nexport function append(target, node) {\n\ttarget.appendChild(node);\n}\n\n/**\n * @param {Node} target\n * @param {string} style_sheet_id\n * @param {string} styles\n * @returns {void}\n */\nexport function append_styles(target, style_sheet_id, styles) {\n\tconst append_styles_to = get_root_for_style(target);\n\tif (!append_styles_to.getElementById(style_sheet_id)) {\n\t\tconst style = element('style');\n\t\tstyle.id = style_sheet_id;\n\t\tstyle.textContent = styles;\n\t\tappend_stylesheet(append_styles_to, style);\n\t}\n}\n\n/**\n * @param {Node} node\n * @returns {ShadowRoot | Document}\n */\nexport function get_root_for_style(node) {\n\tif (!node) return document;\n\tconst root = node.getRootNode ? node.getRootNode() : node.ownerDocument;\n\tif (root && /** @type {ShadowRoot} */ (root).host) {\n\t\treturn /** @type {ShadowRoot} */ (root);\n\t}\n\treturn node.ownerDocument;\n}\n\n/**\n * @param {Node} node\n * @returns {CSSStyleSheet}\n */\nexport function append_empty_stylesheet(node) {\n\tconst style_element = element('style');\n\t// For transitions to work without 'style-src: unsafe-inline' Content Security Policy,\n\t// these empty tags need to be allowed with a hash as a workaround until we move to the Web Animations API.\n\t// Using the hash for the empty string (for an empty tag) works in all browsers except Safari.\n\t// So as a workaround for the workaround, when we append empty style tags we set their content to /* empty */.\n\t// The hash 'sha256-9OlNO0DNEeaVzHL4RZwCLsBHA8WBQ8toBp/4F5XV2nc=' will then work even in Safari.\n\tstyle_element.textContent = '/* empty */';\n\tappend_stylesheet(get_root_for_style(node), style_element);\n\treturn style_element.sheet;\n}\n\n/**\n * @param {ShadowRoot | Document} node\n * @param {HTMLStyleElement} style\n * @returns {CSSStyleSheet}\n */\nfunction append_stylesheet(node, style) {\n\tappend(/** @type {Document} */ (node).head || node, style);\n\treturn style.sheet;\n}\n\n/**\n * @param {NodeEx} target\n * @param {NodeEx} node\n * @returns {void}\n */\nexport function append_hydration(target, node) {\n\tif (is_hydrating) {\n\t\tinit_hydrate(target);\n\t\tif (\n\t\t\ttarget.actual_end_child === undefined ||\n\t\t\t(target.actual_end_child !== null && target.actual_end_child.parentNode !== target)\n\t\t) {\n\t\t\ttarget.actual_end_child = target.firstChild;\n\t\t}\n\t\t// Skip nodes of undefined ordering\n\t\twhile (target.actual_end_child !== null && target.actual_end_child.claim_order === undefined) {\n\t\t\ttarget.actual_end_child = target.actual_end_child.nextSibling;\n\t\t}\n\t\tif (node !== target.actual_end_child) {\n\t\t\t// We only insert if the ordering of this node should be modified or the parent node is not target\n\t\t\tif (node.claim_order !== undefined || node.parentNode !== target) {\n\t\t\t\ttarget.insertBefore(node, target.actual_end_child);\n\t\t\t}\n\t\t} else {\n\t\t\ttarget.actual_end_child = node.nextSibling;\n\t\t}\n\t} else if (node.parentNode !== target || node.nextSibling !== null) {\n\t\ttarget.appendChild(node);\n\t}\n}\n\n/**\n * @param {Node} target\n * @param {Node} node\n * @param {Node} [anchor]\n * @returns {void}\n */\nexport function insert(target, node, anchor) {\n\ttarget.insertBefore(node, anchor || null);\n}\n\n/**\n * @param {NodeEx} target\n * @param {NodeEx} node\n * @param {NodeEx} [anchor]\n * @returns {void}\n */\nexport function insert_hydration(target, node, anchor) {\n\tif (is_hydrating && !anchor) {\n\t\tappend_hydration(target, node);\n\t} else if (node.parentNode !== target || node.nextSibling != anchor) {\n\t\ttarget.insertBefore(node, anchor || null);\n\t}\n}\n\n/**\n * @param {Node} node\n * @returns {void}\n */\nexport function detach(node) {\n\tif (node.parentNode) {\n\t\tnode.parentNode.removeChild(node);\n\t}\n}\n\n/**\n * @returns {void} */\nexport function destroy_each(iterations, detaching) {\n\tfor (let i = 0; i < iterations.length; i += 1) {\n\t\tif (iterations[i]) iterations[i].d(detaching);\n\t}\n}\n\n/**\n * @template {keyof HTMLElementTagNameMap} K\n * @param {K} name\n * @returns {HTMLElementTagNameMap[K]}\n */\nexport function element(name) {\n\treturn document.createElement(name);\n}\n\n/**\n * @template {keyof HTMLElementTagNameMap} K\n * @param {K} name\n * @param {string} is\n * @returns {HTMLElementTagNameMap[K]}\n */\nexport function element_is(name, is) {\n\treturn document.createElement(name, { is });\n}\n\n/**\n * @template T\n * @template {keyof T} K\n * @param {T} obj\n * @param {K[]} exclude\n * @returns {Pick<T, Exclude<keyof T, K>>}\n */\nexport function object_without_properties(obj, exclude) {\n\tconst target = /** @type {Pick<T, Exclude<keyof T, K>>} */ ({});\n\tfor (const k in obj) {\n\t\tif (\n\t\t\thas_prop(obj, k) &&\n\t\t\t// @ts-ignore\n\t\t\texclude.indexOf(k) === -1\n\t\t) {\n\t\t\t// @ts-ignore\n\t\t\ttarget[k] = obj[k];\n\t\t}\n\t}\n\treturn target;\n}\n\n/**\n * @template {keyof SVGElementTagNameMap} K\n * @param {K} name\n * @returns {SVGElement}\n */\nexport function svg_element(name) {\n\treturn document.createElementNS('http://www.w3.org/2000/svg', name);\n}\n\n/**\n * @param {string} data\n * @returns {Text}\n */\nexport function text(data) {\n\treturn document.createTextNode(data);\n}\n\n/**\n * @returns {Text} */\nexport function space() {\n\treturn text(' ');\n}\n\n/**\n * @returns {Text} */\nexport function empty() {\n\treturn text('');\n}\n\n/**\n * @param {string} content\n * @returns {Comment}\n */\nexport function comment(content) {\n\treturn document.createComment(content);\n}\n\n/**\n * @param {EventTarget} node\n * @param {string} event\n * @param {EventListenerOrEventListenerObject} handler\n * @param {boolean | AddEventListenerOptions | EventListenerOptions} [options]\n * @returns {() => void}\n */\nexport function listen(node, event, handler, options) {\n\tnode.addEventListener(event, handler, options);\n\treturn () => node.removeEventListener(event, handler, options);\n}\n\n/**\n * @returns {(event: any) => any} */\nexport function prevent_default(fn) {\n\treturn function (event) {\n\t\tevent.preventDefault();\n\t\t// @ts-ignore\n\t\treturn fn.call(this, event);\n\t};\n}\n\n/**\n * @returns {(event: any) => any} */\nexport function stop_propagation(fn) {\n\treturn function (event) {\n\t\tevent.stopPropagation();\n\t\t// @ts-ignore\n\t\treturn fn.call(this, event);\n\t};\n}\n\n/**\n * @returns {(event: any) => any} */\nexport function stop_immediate_propagation(fn) {\n\treturn function (event) {\n\t\tevent.stopImmediatePropagation();\n\t\t// @ts-ignore\n\t\treturn fn.call(this, event);\n\t};\n}\n\n/**\n * @returns {(event: any) => void} */\nexport function self(fn) {\n\treturn function (event) {\n\t\t// @ts-ignore\n\t\tif (event.target === this) fn.call(this, event);\n\t};\n}\n\n/**\n * @returns {(event: any) => void} */\nexport function trusted(fn) {\n\treturn function (event) {\n\t\t// @ts-ignore\n\t\tif (event.isTrusted) fn.call(this, event);\n\t};\n}\n\n/**\n * @param {Element} node\n * @param {string} attribute\n * @param {string} [value]\n * @returns {void}\n */\nexport function attr(node, attribute, value) {\n\tif (value == null) node.removeAttribute(attribute);\n\telse if (node.getAttribute(attribute) !== value) node.setAttribute(attribute, value);\n}\n/**\n * List of attributes that should always be set through the attr method,\n * because updating them through the property setter doesn't work reliably.\n * In the example of `width`/`height`, the problem is that the setter only\n * accepts numeric values, but the attribute can also be set to a string like `50%`.\n * If this list becomes too big, rethink this approach.\n */\nconst always_set_through_set_attribute = ['width', 'height'];\n\n/**\n * @param {Element & ElementCSSInlineStyle} node\n * @param {{ [x: string]: string }} attributes\n * @returns {void}\n */\nexport function set_attributes(node, attributes) {\n\t// @ts-ignore\n\tconst descriptors = Object.getOwnPropertyDescriptors(node.__proto__);\n\tfor (const key in attributes) {\n\t\tif (attributes[key] == null) {\n\t\t\tnode.removeAttribute(key);\n\t\t} else if (key === 'style') {\n\t\t\tnode.style.cssText = attributes[key];\n\t\t} else if (key === '__value') {\n\t\t\t/** @type {any} */ (node).value = node[key] = attributes[key];\n\t\t} else if (\n\t\t\tdescriptors[key] &&\n\t\t\tdescriptors[key].set &&\n\t\t\talways_set_through_set_attribute.indexOf(key) === -1\n\t\t) {\n\t\t\tnode[key] = attributes[key];\n\t\t} else {\n\t\t\tattr(node, key, attributes[key]);\n\t\t}\n\t}\n}\n\n/**\n * @param {Element & ElementCSSInlineStyle} node\n * @param {{ [x: string]: string }} attributes\n * @returns {void}\n */\nexport function set_svg_attributes(node, attributes) {\n\tfor (const key in attributes) {\n\t\tattr(node, key, attributes[key]);\n\t}\n}\n\n/**\n * @param {Record<string, unknown>} data_map\n * @returns {void}\n */\nexport function set_custom_element_data_map(node, data_map) {\n\tObject.keys(data_map).forEach((key) => {\n\t\tset_custom_element_data(node, key, data_map[key]);\n\t});\n}\n\n/**\n * @returns {void} */\nexport function set_custom_element_data(node, prop, value) {\n\tconst lower = prop.toLowerCase(); // for backwards compatibility with existing behavior we do lowercase first\n\tif (lower in node) {\n\t\tnode[lower] = typeof node[lower] === 'boolean' && value === '' ? true : value;\n\t} else if (prop in node) {\n\t\tnode[prop] = typeof node[prop] === 'boolean' && value === '' ? true : value;\n\t} else {\n\t\tattr(node, prop, value);\n\t}\n}\n\n/**\n * @param {string} tag\n */\nexport function set_dynamic_element_data(tag) {\n\treturn /-/.test(tag) ? set_custom_element_data_map : set_attributes;\n}\n\n/**\n * @returns {void}\n */\nexport function xlink_attr(node, attribute, value) {\n\tnode.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);\n}\n\n/**\n * @param {HTMLElement} node\n * @returns {string}\n */\nexport function get_svelte_dataset(node) {\n\treturn node.dataset.svelteH;\n}\n\n/**\n * @returns {unknown[]} */\nexport function get_binding_group_value(group, __value, checked) {\n\tconst value = new Set();\n\tfor (let i = 0; i < group.length; i += 1) {\n\t\tif (group[i].checked) value.add(group[i].__value);\n\t}\n\tif (!checked) {\n\t\tvalue.delete(__value);\n\t}\n\treturn Array.from(value);\n}\n\n/**\n * @param {HTMLInputElement[]} group\n * @returns {{ p(...inputs: HTMLInputElement[]): void; r(): void; }}\n */\nexport function init_binding_group(group) {\n\t/**\n\t * @type {HTMLInputElement[]} */\n\tlet _inputs;\n\treturn {\n\t\t/* push */ p(...inputs) {\n\t\t\t_inputs = inputs;\n\t\t\t_inputs.forEach((input) => group.push(input));\n\t\t},\n\t\t/* remove */ r() {\n\t\t\t_inputs.forEach((input) => group.splice(group.indexOf(input), 1));\n\t\t}\n\t};\n}\n\n/**\n * @param {number[]} indexes\n * @returns {{ u(new_indexes: number[]): void; p(...inputs: HTMLInputElement[]): void; r: () => void; }}\n */\nexport function init_binding_group_dynamic(group, indexes) {\n\t/**\n\t * @type {HTMLInputElement[]} */\n\tlet _group = get_binding_group(group);\n\n\t/**\n\t * @type {HTMLInputElement[]} */\n\tlet _inputs;\n\n\tfunction get_binding_group(group) {\n\t\tfor (let i = 0; i < indexes.length; i++) {\n\t\t\tgroup = group[indexes[i]] = group[indexes[i]] || [];\n\t\t}\n\t\treturn group;\n\t}\n\n\t/**\n\t * @returns {void} */\n\tfunction push() {\n\t\t_inputs.forEach((input) => _group.push(input));\n\t}\n\n\t/**\n\t * @returns {void} */\n\tfunction remove() {\n\t\t_inputs.forEach((input) => _group.splice(_group.indexOf(input), 1));\n\t}\n\treturn {\n\t\t/* update */ u(new_indexes) {\n\t\t\tindexes = new_indexes;\n\t\t\tconst new_group = get_binding_group(group);\n\t\t\tif (new_group !== _group) {\n\t\t\t\tremove();\n\t\t\t\t_group = new_group;\n\t\t\t\tpush();\n\t\t\t}\n\t\t},\n\t\t/* push */ p(...inputs) {\n\t\t\t_inputs = inputs;\n\t\t\tpush();\n\t\t},\n\t\t/* remove */ r: remove\n\t};\n}\n\n/** @returns {number} */\nexport function to_number(value) {\n\treturn value === '' ? null : +value;\n}\n\n/** @returns {any[]} */\nexport function time_ranges_to_array(ranges) {\n\tconst array = [];\n\tfor (let i = 0; i < ranges.length; i += 1) {\n\t\tarray.push({ start: ranges.start(i), end: ranges.end(i) });\n\t}\n\treturn array;\n}\n\n/**\n * @param {Element} element\n * @returns {ChildNode[]}\n */\nexport function children(element) {\n\treturn Array.from(element.childNodes);\n}\n\n/**\n * @param {ChildNodeArray} nodes\n * @returns {void}\n */\nfunction init_claim_info(nodes) {\n\tif (nodes.claim_info === undefined) {\n\t\tnodes.claim_info = { last_index: 0, total_claimed: 0 };\n\t}\n}\n\n/**\n * @template {ChildNodeEx} R\n * @param {ChildNodeArray} nodes\n * @param {(node: ChildNodeEx) => node is R} predicate\n * @param {(node: ChildNodeEx) => ChildNodeEx | undefined} process_node\n * @param {() => R} create_node\n * @param {boolean} dont_update_last_index\n * @returns {R}\n */\nfunction claim_node(nodes, predicate, process_node, create_node, dont_update_last_index = false) {\n\t// Try to find nodes in an order such that we lengthen the longest increasing subsequence\n\tinit_claim_info(nodes);\n\tconst result_node = (() => {\n\t\t// We first try to find an element after the previous one\n\t\tfor (let i = nodes.claim_info.last_index; i < nodes.length; i++) {\n\t\t\tconst node = nodes[i];\n\t\t\tif (predicate(node)) {\n\t\t\t\tconst replacement = process_node(node);\n\t\t\t\tif (replacement === undefined) {\n\t\t\t\t\tnodes.splice(i, 1);\n\t\t\t\t} else {\n\t\t\t\t\tnodes[i] = replacement;\n\t\t\t\t}\n\t\t\t\tif (!dont_update_last_index) {\n\t\t\t\t\tnodes.claim_info.last_index = i;\n\t\t\t\t}\n\t\t\t\treturn node;\n\t\t\t}\n\t\t}\n\t\t// Otherwise, we try to find one before\n\t\t// We iterate in reverse so that we don't go too far back\n\t\tfor (let i = nodes.claim_info.last_index - 1; i >= 0; i--) {\n\t\t\tconst node = nodes[i];\n\t\t\tif (predicate(node)) {\n\t\t\t\tconst replacement = process_node(node);\n\t\t\t\tif (replacement === undefined) {\n\t\t\t\t\tnodes.splice(i, 1);\n\t\t\t\t} else {\n\t\t\t\t\tnodes[i] = replacement;\n\t\t\t\t}\n\t\t\t\tif (!dont_update_last_index) {\n\t\t\t\t\tnodes.claim_info.last_index = i;\n\t\t\t\t} else if (replacement === undefined) {\n\t\t\t\t\t// Since we spliced before the last_index, we decrease it\n\t\t\t\t\tnodes.claim_info.last_index--;\n\t\t\t\t}\n\t\t\t\treturn node;\n\t\t\t}\n\t\t}\n\t\t// If we can't find any matching node, we create a new one\n\t\treturn create_node();\n\t})();\n\tresult_node.claim_order = nodes.claim_info.total_claimed;\n\tnodes.claim_info.total_claimed += 1;\n\treturn result_node;\n}\n\n/**\n * @param {ChildNodeArray} nodes\n * @param {string} name\n * @param {{ [key: string]: boolean }} attributes\n * @param {(name: string) => Element | SVGElement} create_element\n * @returns {Element | SVGElement}\n */\nfunction claim_element_base(nodes, name, attributes, create_element) {\n\treturn claim_node(\n\t\tnodes,\n\t\t/** @returns {node is Element | SVGElement} */\n\t\t(node) => node.nodeName === name,\n\t\t/** @param {Element} node */\n\t\t(node) => {\n\t\t\tconst remove = [];\n\t\t\tfor (let j = 0; j < node.attributes.length; j++) {\n\t\t\t\tconst attribute = node.attributes[j];\n\t\t\t\tif (!attributes[attribute.name]) {\n\t\t\t\t\tremove.push(attribute.name);\n\t\t\t\t}\n\t\t\t}\n\t\t\tremove.forEach((v) => node.removeAttribute(v));\n\t\t\treturn undefined;\n\t\t},\n\t\t() => create_element(name)\n\t);\n}\n\n/**\n * @param {ChildNodeArray} nodes\n * @param {string} name\n * @param {{ [key: string]: boolean }} attributes\n * @returns {Element | SVGElement}\n */\nexport function claim_element(nodes, name, attributes) {\n\treturn claim_element_base(nodes, name, attributes, element);\n}\n\n/**\n * @param {ChildNodeArray} nodes\n * @param {string} name\n * @param {{ [key: string]: boolean }} attributes\n * @returns {Element | SVGElement}\n */\nexport function claim_svg_element(nodes, name, attributes) {\n\treturn claim_element_base(nodes, name, attributes, svg_element);\n}\n\n/**\n * @param {ChildNodeArray} nodes\n * @returns {Text}\n */\nexport function claim_text(nodes, data) {\n\treturn claim_node(\n\t\tnodes,\n\t\t/** @returns {node is Text} */\n\t\t(node) => node.nodeType === 3,\n\t\t/** @param {Text} node */\n\t\t(node) => {\n\t\t\tconst data_str = '' + data;\n\t\t\tif (node.data.startsWith(data_str)) {\n\t\t\t\tif (node.data.length !== data_str.length) {\n\t\t\t\t\treturn node.splitText(data_str.length);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnode.data = data_str;\n\t\t\t}\n\t\t},\n\t\t() => text(data),\n\t\ttrue // Text nodes should not update last index since it is likely not worth it to eliminate an increasing subsequence of actual elements\n\t);\n}\n\n/**\n * @returns {Text} */\nexport function claim_space(nodes) {\n\treturn claim_text(nodes, ' ');\n}\n\n/**\n * @param {ChildNodeArray} nodes\n * @returns {Comment}\n */\nexport function claim_comment(nodes, data) {\n\treturn claim_node(\n\t\tnodes,\n\t\t/** @returns {node is Comment} */\n\t\t(node) => node.nodeType === 8,\n\t\t/** @param {Comment} node */\n\t\t(node) => {\n\t\t\tnode.data = '' + data;\n\t\t\treturn undefined;\n\t\t},\n\t\t() => comment(data),\n\t\ttrue\n\t);\n}\n\nfunction get_comment_idx(nodes, text, start) {\n\tfor (let i = start; i < nodes.length; i += 1) {\n\t\tconst node = nodes[i];\n\t\tif (node.nodeType === 8 /* comment node */ && node.textContent.trim() === text) {\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn -1;\n}\n\n/**\n * @param {boolean} is_svg\n * @returns {HtmlTagHydration}\n */\nexport function claim_html_tag(nodes, is_svg) {\n\t// find html opening tag\n\tconst start_index = get_comment_idx(nodes, 'HTML_TAG_START', 0);\n\tconst end_index = get_comment_idx(nodes, 'HTML_TAG_END', start_index + 1);\n\tif (start_index === -1 || end_index === -1) {\n\t\treturn new HtmlTagHydration(is_svg);\n\t}\n\n\tinit_claim_info(nodes);\n\tconst html_tag_nodes = nodes.splice(start_index, end_index - start_index + 1);\n\tdetach(html_tag_nodes[0]);\n\tdetach(html_tag_nodes[html_tag_nodes.length - 1]);\n\tconst claimed_nodes = html_tag_nodes.slice(1, html_tag_nodes.length - 1);\n\tfor (const n of claimed_nodes) {\n\t\tn.claim_order = nodes.claim_info.total_claimed;\n\t\tnodes.claim_info.total_claimed += 1;\n\t}\n\treturn new HtmlTagHydration(is_svg, claimed_nodes);\n}\n\n/**\n * @param {Text} text\n * @param {unknown} data\n * @returns {void}\n */\nexport function set_data(text, data) {\n\tdata = '' + data;\n\tif (text.data === data) return;\n\ttext.data = /** @type {string} */ (data);\n}\n\n/**\n * @param {Text} text\n * @param {unknown} data\n * @returns {void}\n */\nexport function set_data_contenteditable(text, data) {\n\tdata = '' + data;\n\tif (text.wholeText === data) return;\n\ttext.data = /** @type {string} */ (data);\n}\n\n/**\n * @param {Text} text\n * @param {unknown} data\n * @param {string} attr_value\n * @returns {void}\n */\nexport function set_data_maybe_contenteditable(text, data, attr_value) {\n\tif (~contenteditable_truthy_values.indexOf(attr_value)) {\n\t\tset_data_contenteditable(text, data);\n\t} else {\n\t\tset_data(text, data);\n\t}\n}\n\n/**\n * @returns {void} */\nexport function set_input_value(input, value) {\n\tinput.value = value == null ? '' : value;\n}\n\n/**\n * @returns {void} */\nexport function set_input_type(input, type) {\n\ttry {\n\t\tinput.type = type;\n\t} catch (e) {\n\t\t// do nothing\n\t}\n}\n\n/**\n * @returns {void} */\nexport function set_style(node, key, value, important) {\n\tif (value == null) {\n\t\tnode.style.removeProperty(key);\n\t} else {\n\t\tnode.style.setProperty(key, value, important ? 'important' : '');\n\t}\n}\n\n/**\n * @returns {void} */\nexport function select_option(select, value, mounting) {\n\tfor (let i = 0; i < select.options.length; i += 1) {\n\t\tconst option = select.options[i];\n\t\tif (option.__value === value) {\n\t\t\toption.selected = true;\n\t\t\treturn;\n\t\t}\n\t}\n\tif (!mounting || value !== undefined) {\n\t\tselect.selectedIndex = -1; // no option should be selected\n\t}\n}\n\n/**\n * @returns {void} */\nexport function select_options(select, value) {\n\tfor (let i = 0; i < select.options.length; i += 1) {\n\t\tconst option = select.options[i];\n\t\toption.selected = ~value.indexOf(option.__value);\n\t}\n}\n\nexport function select_value(select) {\n\tconst selected_option = select.querySelector(':checked');\n\treturn selected_option && selected_option.__value;\n}\n\nexport function select_multiple_value(select) {\n\treturn [].map.call(select.querySelectorAll(':checked'), (option) => option.__value);\n}\n// unfortunately this can't be a constant as that wouldn't be tree-shakeable\n// so we cache the result instead\n\n/**\n * @type {boolean} */\nlet crossorigin;\n\n/**\n * @returns {boolean} */\nexport function is_crossorigin() {\n\tif (crossorigin === undefined) {\n\t\tcrossorigin = false;\n\t\ttry {\n\t\t\tif (typeof window !== 'undefined' && window.parent) {\n\t\t\t\tvoid window.parent.document;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tcrossorigin = true;\n\t\t}\n\t}\n\treturn crossorigin;\n}\n\n/**\n * @param {HTMLElement} node\n * @param {() => void} fn\n * @returns {() => void}\n */\nexport function add_iframe_resize_listener(node, fn) {\n\tconst computed_style = getComputedStyle(node);\n\tif (computed_style.position === 'static') {\n\t\tnode.style.position = 'relative';\n\t}\n\tconst iframe = element('iframe');\n\tiframe.setAttribute(\n\t\t'style',\n\t\t'display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; ' +\n\t\t\t'overflow: hidden; border: 0; opacity: 0; pointer-events: none; z-index: -1;'\n\t);\n\tiframe.setAttribute('aria-hidden', 'true');\n\tiframe.tabIndex = -1;\n\tconst crossorigin = is_crossorigin();\n\n\t/**\n\t * @type {() => void}\n\t */\n\tlet unsubscribe;\n\tif (crossorigin) {\n\t\tiframe.src = \"data:text/html,<script>onresize=function(){parent.postMessage(0,'*')}</script>\";\n\t\tunsubscribe = listen(\n\t\t\twindow,\n\t\t\t'message',\n\t\t\t/** @param {MessageEvent} event */ (event) => {\n\t\t\t\tif (event.source === iframe.contentWindow) fn();\n\t\t\t}\n\t\t);\n\t} else {\n\t\tiframe.src = 'about:blank';\n\t\tiframe.onload = () => {\n\t\t\tunsubscribe = listen(iframe.contentWindow, 'resize', fn);\n\t\t\t// make sure an initial resize event is fired _after_ the iframe is loaded (which is asynchronous)\n\t\t\t// see https://github.com/sveltejs/svelte/issues/4233\n\t\t\tfn();\n\t\t};\n\t}\n\tappend(node, iframe);\n\treturn () => {\n\t\tif (crossorigin) {\n\t\t\tunsubscribe();\n\t\t} else if (unsubscribe && iframe.contentWindow) {\n\t\t\tunsubscribe();\n\t\t}\n\t\tdetach(iframe);\n\t};\n}\nexport const resize_observer_content_box = /* @__PURE__ */ new ResizeObserverSingleton({\n\tbox: 'content-box'\n});\nexport const resize_observer_border_box = /* @__PURE__ */ new ResizeObserverSingleton({\n\tbox: 'border-box'\n});\nexport const resize_observer_device_pixel_content_box = /* @__PURE__ */ new ResizeObserverSingleton(\n\t{ box: 'device-pixel-content-box' }\n);\nexport { ResizeObserverSingleton };\n\n/**\n * @returns {void} */\nexport function toggle_class(element, name, toggle) {\n\t// The `!!` is required because an `undefined` flag means flipping the current state.\n\telement.classList.toggle(name, !!toggle);\n}\n\n/**\n * @template T\n * @param {string} type\n * @param {T} [detail]\n * @param {{ bubbles?: boolean, cancelable?: boolean }} [options]\n * @returns {CustomEvent<T>}\n */\nexport function custom_event(type, detail, { bubbles = false, cancelable = false } = {}) {\n\treturn new CustomEvent(type, { detail, bubbles, cancelable });\n}\n\n/**\n * @param {string} selector\n * @param {HTMLElement} parent\n * @returns {ChildNodeArray}\n */\nexport function query_selector_all(selector, parent = document.body) {\n\treturn Array.from(parent.querySelectorAll(selector));\n}\n\n/**\n * @param {string} nodeId\n * @param {HTMLElement} head\n * @returns {any[]}\n */\nexport function head_selector(nodeId, head) {\n\tconst result = [];\n\tlet started = 0;\n\tfor (const node of head.childNodes) {\n\t\tif (node.nodeType === 8 /* comment node */) {\n\t\t\tconst comment = node.textContent.trim();\n\t\t\tif (comment === `HEAD_${nodeId}_END`) {\n\t\t\t\tstarted -= 1;\n\t\t\t\tresult.push(node);\n\t\t\t} else if (comment === `HEAD_${nodeId}_START`) {\n\t\t\t\tstarted += 1;\n\t\t\t\tresult.push(node);\n\t\t\t}\n\t\t} else if (started > 0) {\n\t\t\tresult.push(node);\n\t\t}\n\t}\n\treturn result;\n}\n/** */\nexport class HtmlTag {\n\t/**\n\t * @private\n\t * @default false\n\t */\n\tis_svg = false;\n\t/** parent for creating node */\n\te = undefined;\n\t/** html tag nodes */\n\tn = undefined;\n\t/** target */\n\tt = undefined;\n\t/** anchor */\n\ta = undefined;\n\tconstructor(is_svg = false) {\n\t\tthis.is_svg = is_svg;\n\t\tthis.e = this.n = null;\n\t}\n\n\t/**\n\t * @param {string} html\n\t * @returns {void}\n\t */\n\tc(html) {\n\t\tthis.h(html);\n\t}\n\n\t/**\n\t * @param {string} html\n\t * @param {HTMLElement | SVGElement} target\n\t * @param {HTMLElement | SVGElement} anchor\n\t * @returns {void}\n\t */\n\tm(html, target, anchor = null) {\n\t\tif (!this.e) {\n\t\t\tif (this.is_svg)\n\t\t\t\tthis.e = svg_element(/** @type {keyof SVGElementTagNameMap} */ (target.nodeName));\n\t\t\t/** #7364  target for <template> may be provided as #document-fragment(11) */ else\n\t\t\t\tthis.e = element(\n\t\t\t\t\t/** @type {keyof HTMLElementTagNameMap} */ (\n\t\t\t\t\t\ttarget.nodeType === 11 ? 'TEMPLATE' : target.nodeName\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\tthis.t =\n\t\t\t\ttarget.tagName !== 'TEMPLATE'\n\t\t\t\t\t? target\n\t\t\t\t\t: /** @type {HTMLTemplateElement} */ (target).content;\n\t\t\tthis.c(html);\n\t\t}\n\t\tthis.i(anchor);\n\t}\n\n\t/**\n\t * @param {string} html\n\t * @returns {void}\n\t */\n\th(html) {\n\t\tthis.e.innerHTML = html;\n\t\tthis.n = Array.from(\n\t\t\tthis.e.nodeName === 'TEMPLATE' ? this.e.content.childNodes : this.e.childNodes\n\t\t);\n\t}\n\n\t/**\n\t * @returns {void} */\n\ti(anchor) {\n\t\tfor (let i = 0; i < this.n.length; i += 1) {\n\t\t\tinsert(this.t, this.n[i], anchor);\n\t\t}\n\t}\n\n\t/**\n\t * @param {string} html\n\t * @returns {void}\n\t */\n\tp(html) {\n\t\tthis.d();\n\t\tthis.h(html);\n\t\tthis.i(this.a);\n\t}\n\n\t/**\n\t * @returns {void} */\n\td() {\n\t\tthis.n.forEach(detach);\n\t}\n}\n\nexport class HtmlTagHydration extends HtmlTag {\n\t/** @type {Element[]} hydration claimed nodes */\n\tl = undefined;\n\n\tconstructor(is_svg = false, claimed_nodes) {\n\t\tsuper(is_svg);\n\t\tthis.e = this.n = null;\n\t\tthis.l = claimed_nodes;\n\t}\n\n\t/**\n\t * @param {string} html\n\t * @returns {void}\n\t */\n\tc(html) {\n\t\tif (this.l) {\n\t\t\tthis.n = this.l;\n\t\t} else {\n\t\t\tsuper.c(html);\n\t\t}\n\t}\n\n\t/**\n\t * @returns {void} */\n\ti(anchor) {\n\t\tfor (let i = 0; i < this.n.length; i += 1) {\n\t\t\tinsert_hydration(this.t, this.n[i], anchor);\n\t\t}\n\t}\n}\n\n/**\n * @param {NamedNodeMap} attributes\n * @returns {{}}\n */\nexport function attribute_to_object(attributes) {\n\tconst result = {};\n\tfor (const attribute of attributes) {\n\t\tresult[attribute.name] = attribute.value;\n\t}\n\treturn result;\n}\n\n/**\n * @param {HTMLElement} element\n * @returns {{}}\n */\nexport function get_custom_elements_slots(element) {\n\tconst result = {};\n\telement.childNodes.forEach(\n\t\t/** @param {Element} node */ (node) => {\n\t\t\tresult[node.slot || 'default'] = true;\n\t\t}\n\t);\n\treturn result;\n}\n\nexport function construct_svelte_component(component, props) {\n\treturn new component(props);\n}\n\n/**\n * @typedef {Node & {\n * \tclaim_order?: number;\n * \thydrate_init?: true;\n * \tactual_end_child?: NodeEx;\n * \tchildNodes: NodeListOf<NodeEx>;\n * }} NodeEx\n */\n\n/** @typedef {ChildNode & NodeEx} ChildNodeEx */\n\n/** @typedef {NodeEx & { claim_order: number }} NodeEx2 */\n\n/**\n * @typedef {ChildNodeEx[] & {\n * \tclaim_info?: {\n * \t\tlast_index: number;\n * \t\ttotal_claimed: number;\n * \t};\n * }} ChildNodeArray\n */\n","import { custom_event } from './dom.js';\n\nexport let current_component;\n\n/** @returns {void} */\nexport function set_current_component(component) {\n\tcurrent_component = component;\n}\n\nexport function get_current_component() {\n\tif (!current_component) throw new Error('Function called outside component initialization');\n\treturn current_component;\n}\n\n/**\n * Schedules a callback to run immediately before the component is updated after any state change.\n *\n * The first time the callback runs will be before the initial `onMount`\n *\n * https://svelte.dev/docs/svelte#beforeupdate\n * @param {() => any} fn\n * @returns {void}\n */\nexport function beforeUpdate(fn) {\n\tget_current_component().$$.before_update.push(fn);\n}\n\n/**\n * The `onMount` function schedules a callback to run as soon as the component has been mounted to the DOM.\n * It must be called during the component's initialisation (but doesn't need to live *inside* the component;\n * it can be called from an external module).\n *\n * If a function is returned _synchronously_ from `onMount`, it will be called when the component is unmounted.\n *\n * `onMount` does not run inside a [server-side component](/docs#run-time-server-side-component-api).\n *\n * https://svelte.dev/docs/svelte#onmount\n * @template T\n * @param {() => import('./private.js').NotFunction<T> | Promise<import('./private.js').NotFunction<T>> | (() => any)} fn\n * @returns {void}\n */\nexport function onMount(fn) {\n\tget_current_component().$$.on_mount.push(fn);\n}\n\n/**\n * Schedules a callback to run immediately after the component has been updated.\n *\n * The first time the callback runs will be after the initial `onMount`\n *\n * https://svelte.dev/docs/svelte#afterupdate\n * @param {() => any} fn\n * @returns {void}\n */\nexport function afterUpdate(fn) {\n\tget_current_component().$$.after_update.push(fn);\n}\n\n/**\n * Schedules a callback to run immediately before the component is unmounted.\n *\n * Out of `onMount`, `beforeUpdate`, `afterUpdate` and `onDestroy`, this is the\n * only one that runs inside a server-side component.\n *\n * https://svelte.dev/docs/svelte#ondestroy\n * @param {() => any} fn\n * @returns {void}\n */\nexport function onDestroy(fn) {\n\tget_current_component().$$.on_destroy.push(fn);\n}\n\n/**\n * Creates an event dispatcher that can be used to dispatch [component events](/docs#template-syntax-component-directives-on-eventname).\n * Event dispatchers are functions that can take two arguments: `name` and `detail`.\n *\n * Component events created with `createEventDispatcher` create a\n * [CustomEvent](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent).\n * These events do not [bubble](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Events#Event_bubbling_and_capture).\n * The `detail` argument corresponds to the [CustomEvent.detail](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/detail)\n * property and can contain any type of data.\n *\n * The event dispatcher can be typed to narrow the allowed event names and the type of the `detail` argument:\n * ```ts\n * const dispatch = createEventDispatcher<{\n *  loaded: never; // does not take a detail argument\n *  change: string; // takes a detail argument of type string, which is required\n *  optional: number | null; // takes an optional detail argument of type number\n * }>();\n * ```\n *\n * https://svelte.dev/docs/svelte#createeventdispatcher\n * @template {Record<string, any>} [EventMap=any]\n * @returns {import('./public.js').EventDispatcher<EventMap>}\n */\nexport function createEventDispatcher() {\n\tconst component = get_current_component();\n\treturn (type, detail, { cancelable = false } = {}) => {\n\t\tconst callbacks = component.$$.callbacks[type];\n\t\tif (callbacks) {\n\t\t\t// TODO are there situations where events could be dispatched\n\t\t\t// in a server (non-DOM) environment?\n\t\t\tconst event = custom_event(/** @type {string} */ (type), detail, { cancelable });\n\t\t\tcallbacks.slice().forEach((fn) => {\n\t\t\t\tfn.call(component, event);\n\t\t\t});\n\t\t\treturn !event.defaultPrevented;\n\t\t}\n\t\treturn true;\n\t};\n}\n\n/**\n * Associates an arbitrary `context` object with the current component and the specified `key`\n * and returns that object. The context is then available to children of the component\n * (including slotted content) with `getContext`.\n *\n * Like lifecycle functions, this must be called during component initialisation.\n *\n * https://svelte.dev/docs/svelte#setcontext\n * @template T\n * @param {any} key\n * @param {T} context\n * @returns {T}\n */\nexport function setContext(key, context) {\n\tget_current_component().$$.context.set(key, context);\n\treturn context;\n}\n\n/**\n * Retrieves the context that belongs to the closest parent component with the specified `key`.\n * Must be called during component initialisation.\n *\n * https://svelte.dev/docs/svelte#getcontext\n * @template T\n * @param {any} key\n * @returns {T}\n */\nexport function getContext(key) {\n\treturn get_current_component().$$.context.get(key);\n}\n\n/**\n * Retrieves the whole context map that belongs to the closest parent component.\n * Must be called during component initialisation. Useful, for example, if you\n * programmatically create a component and want to pass the existing context to it.\n *\n * https://svelte.dev/docs/svelte#getallcontexts\n * @template {Map<any, any>} [T=Map<any, any>]\n * @returns {T}\n */\nexport function getAllContexts() {\n\treturn get_current_component().$$.context;\n}\n\n/**\n * Checks whether a given `key` has been set in the context of a parent component.\n * Must be called during component initialisation.\n *\n * https://svelte.dev/docs/svelte#hascontext\n * @param {any} key\n * @returns {boolean}\n */\nexport function hasContext(key) {\n\treturn get_current_component().$$.context.has(key);\n}\n\n// TODO figure out if we still want to support\n// shorthand events, or if we want to implement\n// a real bubbling mechanism\n/**\n * @param component\n * @param event\n * @returns {void}\n */\nexport function bubble(component, event) {\n\tconst callbacks = component.$$.callbacks[event.type];\n\tif (callbacks) {\n\t\t// @ts-ignore\n\t\tcallbacks.slice().forEach((fn) => fn.call(this, event));\n\t}\n}\n","import { run_all } from './utils.js';\nimport { current_component, set_current_component } from './lifecycle.js';\n\nexport const dirty_components = [];\nexport const intros = { enabled: false };\nexport const binding_callbacks = [];\n\nlet render_callbacks = [];\n\nconst flush_callbacks = [];\n\nconst resolved_promise = /* @__PURE__ */ Promise.resolve();\n\nlet update_scheduled = false;\n\n/** @returns {void} */\nexport function schedule_update() {\n\tif (!update_scheduled) {\n\t\tupdate_scheduled = true;\n\t\tresolved_promise.then(flush);\n\t}\n}\n\n/** @returns {Promise<void>} */\nexport function tick() {\n\tschedule_update();\n\treturn resolved_promise;\n}\n\n/** @returns {void} */\nexport function add_render_callback(fn) {\n\trender_callbacks.push(fn);\n}\n\n/** @returns {void} */\nexport function add_flush_callback(fn) {\n\tflush_callbacks.push(fn);\n}\n\n// flush() calls callbacks in this order:\n// 1. All beforeUpdate callbacks, in order: parents before children\n// 2. All bind:this callbacks, in reverse order: children before parents.\n// 3. All afterUpdate callbacks, in order: parents before children. EXCEPT\n//    for afterUpdates called during the initial onMount, which are called in\n//    reverse order: children before parents.\n// Since callbacks might update component values, which could trigger another\n// call to flush(), the following steps guard against this:\n// 1. During beforeUpdate, any updated components will be added to the\n//    dirty_components array and will cause a reentrant call to flush(). Because\n//    the flush index is kept outside the function, the reentrant call will pick\n//    up where the earlier call left off and go through all dirty components. The\n//    current_component value is saved and restored so that the reentrant call will\n//    not interfere with the \"parent\" flush() call.\n// 2. bind:this callbacks cannot trigger new flush() calls.\n// 3. During afterUpdate, any updated components will NOT have their afterUpdate\n//    callback called a second time; the seen_callbacks set, outside the flush()\n//    function, guarantees this behavior.\nconst seen_callbacks = new Set();\n\nlet flushidx = 0; // Do *not* move this inside the flush() function\n\n/** @returns {void} */\nexport function flush() {\n\t// Do not reenter flush while dirty components are updated, as this can\n\t// result in an infinite loop. Instead, let the inner flush handle it.\n\t// Reentrancy is ok afterwards for bindings etc.\n\tif (flushidx !== 0) {\n\t\treturn;\n\t}\n\tconst saved_component = current_component;\n\tdo {\n\t\t// first, call beforeUpdate functions\n\t\t// and update components\n\t\ttry {\n\t\t\twhile (flushidx < dirty_components.length) {\n\t\t\t\tconst component = dirty_components[flushidx];\n\t\t\t\tflushidx++;\n\t\t\t\tset_current_component(component);\n\t\t\t\tupdate(component.$$);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t// reset dirty state to not end up in a deadlocked state and then rethrow\n\t\t\tdirty_components.length = 0;\n\t\t\tflushidx = 0;\n\t\t\tthrow e;\n\t\t}\n\t\tset_current_component(null);\n\t\tdirty_components.length = 0;\n\t\tflushidx = 0;\n\t\twhile (binding_callbacks.length) binding_callbacks.pop()();\n\t\t// then, once components are updated, call\n\t\t// afterUpdate functions. This may cause\n\t\t// subsequent updates...\n\t\tfor (let i = 0; i < render_callbacks.length; i += 1) {\n\t\t\tconst callback = render_callbacks[i];\n\t\t\tif (!seen_callbacks.has(callback)) {\n\t\t\t\t// ...so guard against infinite loops\n\t\t\t\tseen_callbacks.add(callback);\n\t\t\t\tcallback();\n\t\t\t}\n\t\t}\n\t\trender_callbacks.length = 0;\n\t} while (dirty_components.length);\n\twhile (flush_callbacks.length) {\n\t\tflush_callbacks.pop()();\n\t}\n\tupdate_scheduled = false;\n\tseen_callbacks.clear();\n\tset_current_component(saved_component);\n}\n\n/** @returns {void} */\nfunction update($$) {\n\tif ($$.fragment !== null) {\n\t\t$$.update();\n\t\trun_all($$.before_update);\n\t\tconst dirty = $$.dirty;\n\t\t$$.dirty = [-1];\n\t\t$$.fragment && $$.fragment.p($$.ctx, dirty);\n\t\t$$.after_update.forEach(add_render_callback);\n\t}\n}\n\n/**\n * Useful for example to execute remaining `afterUpdate` callbacks before executing `destroy`.\n * @param {Function[]} fns\n * @returns {void}\n */\nexport function flush_render_callbacks(fns) {\n\tconst filtered = [];\n\tconst targets = [];\n\trender_callbacks.forEach((c) => (fns.indexOf(c) === -1 ? filtered.push(c) : targets.push(c)));\n\ttargets.forEach((c) => c());\n\trender_callbacks = filtered;\n}\n","import { identity as linear, is_function, noop, run_all } from './utils.js';\nimport { now } from './environment.js';\nimport { loop } from './loop.js';\nimport { create_rule, delete_rule } from './style_manager.js';\nimport { custom_event } from './dom.js';\nimport { add_render_callback } from './scheduler.js';\n\n/**\n * @type {Promise<void> | null}\n */\nlet promise;\n\n/**\n * @returns {Promise<void>}\n */\nfunction wait() {\n\tif (!promise) {\n\t\tpromise = Promise.resolve();\n\t\tpromise.then(() => {\n\t\t\tpromise = null;\n\t\t});\n\t}\n\treturn promise;\n}\n\n/**\n * @param {Element} node\n * @param {INTRO | OUTRO | boolean} direction\n * @param {'start' | 'end'} kind\n * @returns {void}\n */\nfunction dispatch(node, direction, kind) {\n\tnode.dispatchEvent(custom_event(`${direction ? 'intro' : 'outro'}${kind}`));\n}\n\nconst outroing = new Set();\n\n/**\n * @type {Outro}\n */\nlet outros;\n\n/**\n * @returns {void} */\nexport function group_outros() {\n\toutros = {\n\t\tr: 0,\n\t\tc: [],\n\t\tp: outros // parent group\n\t};\n}\n\n/**\n * @returns {void} */\nexport function check_outros() {\n\tif (!outros.r) {\n\t\trun_all(outros.c);\n\t}\n\toutros = outros.p;\n}\n\n/**\n * @param {import('./private.js').Fragment} block\n * @param {0 | 1} [local]\n * @returns {void}\n */\nexport function transition_in(block, local) {\n\tif (block && block.i) {\n\t\toutroing.delete(block);\n\t\tblock.i(local);\n\t}\n}\n\n/**\n * @param {import('./private.js').Fragment} block\n * @param {0 | 1} local\n * @param {0 | 1} [detach]\n * @param {() => void} [callback]\n * @returns {void}\n */\nexport function transition_out(block, local, detach, callback) {\n\tif (block && block.o) {\n\t\tif (outroing.has(block)) return;\n\t\toutroing.add(block);\n\t\toutros.c.push(() => {\n\t\t\toutroing.delete(block);\n\t\t\tif (callback) {\n\t\t\t\tif (detach) block.d(1);\n\t\t\t\tcallback();\n\t\t\t}\n\t\t});\n\t\tblock.o(local);\n\t} else if (callback) {\n\t\tcallback();\n\t}\n}\n\n/**\n * @type {import('../transition/public.js').TransitionConfig}\n */\nconst null_transition = { duration: 0 };\n\n/**\n * @param {Element & ElementCSSInlineStyle} node\n * @param {TransitionFn} fn\n * @param {any} params\n * @returns {{ start(): void; invalidate(): void; end(): void; }}\n */\nexport function create_in_transition(node, fn, params) {\n\t/**\n\t * @type {TransitionOptions} */\n\tconst options = { direction: 'in' };\n\tlet config = fn(node, params, options);\n\tlet running = false;\n\tlet animation_name;\n\tlet task;\n\tlet uid = 0;\n\n\t/**\n\t * @returns {void} */\n\tfunction cleanup() {\n\t\tif (animation_name) delete_rule(node, animation_name);\n\t}\n\n\t/**\n\t * @returns {void} */\n\tfunction go() {\n\t\tconst {\n\t\t\tdelay = 0,\n\t\t\tduration = 300,\n\t\t\teasing = linear,\n\t\t\ttick = noop,\n\t\t\tcss\n\t\t} = config || null_transition;\n\t\tif (css) animation_name = create_rule(node, 0, 1, duration, delay, easing, css, uid++);\n\t\ttick(0, 1);\n\t\tconst start_time = now() + delay;\n\t\tconst end_time = start_time + duration;\n\t\tif (task) task.abort();\n\t\trunning = true;\n\t\tadd_render_callback(() => dispatch(node, true, 'start'));\n\t\ttask = loop((now) => {\n\t\t\tif (running) {\n\t\t\t\tif (now >= end_time) {\n\t\t\t\t\ttick(1, 0);\n\t\t\t\t\tdispatch(node, true, 'end');\n\t\t\t\t\tcleanup();\n\t\t\t\t\treturn (running = false);\n\t\t\t\t}\n\t\t\t\tif (now >= start_time) {\n\t\t\t\t\tconst t = easing((now - start_time) / duration);\n\t\t\t\t\ttick(t, 1 - t);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn running;\n\t\t});\n\t}\n\tlet started = false;\n\treturn {\n\t\tstart() {\n\t\t\tif (started) return;\n\t\t\tstarted = true;\n\t\t\tdelete_rule(node);\n\t\t\tif (is_function(config)) {\n\t\t\t\tconfig = config(options);\n\t\t\t\twait().then(go);\n\t\t\t} else {\n\t\t\t\tgo();\n\t\t\t}\n\t\t},\n\t\tinvalidate() {\n\t\t\tstarted = false;\n\t\t},\n\t\tend() {\n\t\t\tif (running) {\n\t\t\t\tcleanup();\n\t\t\t\trunning = false;\n\t\t\t}\n\t\t}\n\t};\n}\n\n/**\n * @param {Element & ElementCSSInlineStyle} node\n * @param {TransitionFn} fn\n * @param {any} params\n * @returns {{ end(reset: any): void; }}\n */\nexport function create_out_transition(node, fn, params) {\n\t/** @type {TransitionOptions} */\n\tconst options = { direction: 'out' };\n\tlet config = fn(node, params, options);\n\tlet running = true;\n\tlet animation_name;\n\tconst group = outros;\n\tgroup.r += 1;\n\t/** @type {boolean} */\n\tlet original_inert_value;\n\n\t/**\n\t * @returns {void} */\n\tfunction go() {\n\t\tconst {\n\t\t\tdelay = 0,\n\t\t\tduration = 300,\n\t\t\teasing = linear,\n\t\t\ttick = noop,\n\t\t\tcss\n\t\t} = config || null_transition;\n\n\t\tif (css) animation_name = create_rule(node, 1, 0, duration, delay, easing, css);\n\n\t\tconst start_time = now() + delay;\n\t\tconst end_time = start_time + duration;\n\t\tadd_render_callback(() => dispatch(node, false, 'start'));\n\n\t\tif ('inert' in node) {\n\t\t\toriginal_inert_value = /** @type {HTMLElement} */ (node).inert;\n\t\t\tnode.inert = true;\n\t\t}\n\n\t\tloop((now) => {\n\t\t\tif (running) {\n\t\t\t\tif (now >= end_time) {\n\t\t\t\t\ttick(0, 1);\n\t\t\t\t\tdispatch(node, false, 'end');\n\t\t\t\t\tif (!--group.r) {\n\t\t\t\t\t\t// this will result in `end()` being called,\n\t\t\t\t\t\t// so we don't need to clean up here\n\t\t\t\t\t\trun_all(group.c);\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (now >= start_time) {\n\t\t\t\t\tconst t = easing((now - start_time) / duration);\n\t\t\t\t\ttick(1 - t, t);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn running;\n\t\t});\n\t}\n\n\tif (is_function(config)) {\n\t\twait().then(() => {\n\t\t\t// @ts-ignore\n\t\t\tconfig = config(options);\n\t\t\tgo();\n\t\t});\n\t} else {\n\t\tgo();\n\t}\n\n\treturn {\n\t\tend(reset) {\n\t\t\tif (reset && 'inert' in node) {\n\t\t\t\tnode.inert = original_inert_value;\n\t\t\t}\n\t\t\tif (reset && config.tick) {\n\t\t\t\tconfig.tick(1, 0);\n\t\t\t}\n\t\t\tif (running) {\n\t\t\t\tif (animation_name) delete_rule(node, animation_name);\n\t\t\t\trunning = false;\n\t\t\t}\n\t\t}\n\t};\n}\n\n/**\n * @param {Element & ElementCSSInlineStyle} node\n * @param {TransitionFn} fn\n * @param {any} params\n * @param {boolean} intro\n * @returns {{ run(b: 0 | 1): void; end(): void; }}\n */\nexport function create_bidirectional_transition(node, fn, params, intro) {\n\t/**\n\t * @type {TransitionOptions} */\n\tconst options = { direction: 'both' };\n\tlet config = fn(node, params, options);\n\tlet t = intro ? 0 : 1;\n\n\t/**\n\t * @type {Program | null} */\n\tlet running_program = null;\n\n\t/**\n\t * @type {PendingProgram | null} */\n\tlet pending_program = null;\n\tlet animation_name = null;\n\n\t/** @type {boolean} */\n\tlet original_inert_value;\n\n\t/**\n\t * @returns {void} */\n\tfunction clear_animation() {\n\t\tif (animation_name) delete_rule(node, animation_name);\n\t}\n\n\t/**\n\t * @param {PendingProgram} program\n\t * @param {number} duration\n\t * @returns {Program}\n\t */\n\tfunction init(program, duration) {\n\t\tconst d = /** @type {Program['d']} */ (program.b - t);\n\t\tduration *= Math.abs(d);\n\t\treturn {\n\t\t\ta: t,\n\t\t\tb: program.b,\n\t\t\td,\n\t\t\tduration,\n\t\t\tstart: program.start,\n\t\t\tend: program.start + duration,\n\t\t\tgroup: program.group\n\t\t};\n\t}\n\n\t/**\n\t * @param {INTRO | OUTRO} b\n\t * @returns {void}\n\t */\n\tfunction go(b) {\n\t\tconst {\n\t\t\tdelay = 0,\n\t\t\tduration = 300,\n\t\t\teasing = linear,\n\t\t\ttick = noop,\n\t\t\tcss\n\t\t} = config || null_transition;\n\n\t\t/**\n\t\t * @type {PendingProgram} */\n\t\tconst program = {\n\t\t\tstart: now() + delay,\n\t\t\tb\n\t\t};\n\n\t\tif (!b) {\n\t\t\t// @ts-ignore todo: improve typings\n\t\t\tprogram.group = outros;\n\t\t\toutros.r += 1;\n\t\t}\n\n\t\tif ('inert' in node) {\n\t\t\tif (b) {\n\t\t\t\tif (original_inert_value !== undefined) {\n\t\t\t\t\t// aborted/reversed outro — restore previous inert value\n\t\t\t\t\tnode.inert = original_inert_value;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toriginal_inert_value = /** @type {HTMLElement} */ (node).inert;\n\t\t\t\tnode.inert = true;\n\t\t\t}\n\t\t}\n\n\t\tif (running_program || pending_program) {\n\t\t\tpending_program = program;\n\t\t} else {\n\t\t\t// if this is an intro, and there's a delay, we need to do\n\t\t\t// an initial tick and/or apply CSS animation immediately\n\t\t\tif (css) {\n\t\t\t\tclear_animation();\n\t\t\t\tanimation_name = create_rule(node, t, b, duration, delay, easing, css);\n\t\t\t}\n\t\t\tif (b) tick(0, 1);\n\t\t\trunning_program = init(program, duration);\n\t\t\tadd_render_callback(() => dispatch(node, b, 'start'));\n\t\t\tloop((now) => {\n\t\t\t\tif (pending_program && now > pending_program.start) {\n\t\t\t\t\trunning_program = init(pending_program, duration);\n\t\t\t\t\tpending_program = null;\n\t\t\t\t\tdispatch(node, running_program.b, 'start');\n\t\t\t\t\tif (css) {\n\t\t\t\t\t\tclear_animation();\n\t\t\t\t\t\tanimation_name = create_rule(\n\t\t\t\t\t\t\tnode,\n\t\t\t\t\t\t\tt,\n\t\t\t\t\t\t\trunning_program.b,\n\t\t\t\t\t\t\trunning_program.duration,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\teasing,\n\t\t\t\t\t\t\tconfig.css\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (running_program) {\n\t\t\t\t\tif (now >= running_program.end) {\n\t\t\t\t\t\ttick((t = running_program.b), 1 - t);\n\t\t\t\t\t\tdispatch(node, running_program.b, 'end');\n\t\t\t\t\t\tif (!pending_program) {\n\t\t\t\t\t\t\t// we're done\n\t\t\t\t\t\t\tif (running_program.b) {\n\t\t\t\t\t\t\t\t// intro — we can tidy up immediately\n\t\t\t\t\t\t\t\tclear_animation();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// outro — needs to be coordinated\n\t\t\t\t\t\t\t\tif (!--running_program.group.r) run_all(running_program.group.c);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\trunning_program = null;\n\t\t\t\t\t} else if (now >= running_program.start) {\n\t\t\t\t\t\tconst p = now - running_program.start;\n\t\t\t\t\t\tt = running_program.a + running_program.d * easing(p / running_program.duration);\n\t\t\t\t\t\ttick(t, 1 - t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn !!(running_program || pending_program);\n\t\t\t});\n\t\t}\n\t}\n\treturn {\n\t\trun(b) {\n\t\t\tif (is_function(config)) {\n\t\t\t\twait().then(() => {\n\t\t\t\t\tconst opts = { direction: b ? 'in' : 'out' };\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tconfig = config(opts);\n\t\t\t\t\tgo(b);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tgo(b);\n\t\t\t}\n\t\t},\n\t\tend() {\n\t\t\tclear_animation();\n\t\t\trunning_program = pending_program = null;\n\t\t}\n\t};\n}\n\n/** @typedef {1} INTRO */\n/** @typedef {0} OUTRO */\n/** @typedef {{ direction: 'in' | 'out' | 'both' }} TransitionOptions */\n/** @typedef {(node: Element, params: any, options: TransitionOptions) => import('../transition/public.js').TransitionConfig} TransitionFn */\n\n/**\n * @typedef {Object} Outro\n * @property {number} r\n * @property {Function[]} c\n * @property {Object} p\n */\n\n/**\n * @typedef {Object} PendingProgram\n * @property {number} start\n * @property {INTRO|OUTRO} b\n * @property {Outro} [group]\n */\n\n/**\n * @typedef {Object} Program\n * @property {number} a\n * @property {INTRO|OUTRO} b\n * @property {1|-1} d\n * @property {number} duration\n * @property {number} start\n * @property {number} end\n * @property {Outro} [group]\n */\n","import { transition_in, transition_out } from './transitions.js';\nimport { run_all } from './utils.js';\n\n// general each functions:\n\nexport function ensure_array_like(array_like_or_iterator) {\n\treturn array_like_or_iterator?.length !== undefined\n\t\t? array_like_or_iterator\n\t\t: Array.from(array_like_or_iterator);\n}\n\n// keyed each functions:\n\n/** @returns {void} */\nexport function destroy_block(block, lookup) {\n\tblock.d(1);\n\tlookup.delete(block.key);\n}\n\n/** @returns {void} */\nexport function outro_and_destroy_block(block, lookup) {\n\ttransition_out(block, 1, 1, () => {\n\t\tlookup.delete(block.key);\n\t});\n}\n\n/** @returns {void} */\nexport function fix_and_destroy_block(block, lookup) {\n\tblock.f();\n\tdestroy_block(block, lookup);\n}\n\n/** @returns {void} */\nexport function fix_and_outro_and_destroy_block(block, lookup) {\n\tblock.f();\n\toutro_and_destroy_block(block, lookup);\n}\n\n/** @returns {any[]} */\nexport function update_keyed_each(\n\told_blocks,\n\tdirty,\n\tget_key,\n\tdynamic,\n\tctx,\n\tlist,\n\tlookup,\n\tnode,\n\tdestroy,\n\tcreate_each_block,\n\tnext,\n\tget_context\n) {\n\tlet o = old_blocks.length;\n\tlet n = list.length;\n\tlet i = o;\n\tconst old_indexes = {};\n\twhile (i--) old_indexes[old_blocks[i].key] = i;\n\tconst new_blocks = [];\n\tconst new_lookup = new Map();\n\tconst deltas = new Map();\n\tconst updates = [];\n\ti = n;\n\twhile (i--) {\n\t\tconst child_ctx = get_context(ctx, list, i);\n\t\tconst key = get_key(child_ctx);\n\t\tlet block = lookup.get(key);\n\t\tif (!block) {\n\t\t\tblock = create_each_block(key, child_ctx);\n\t\t\tblock.c();\n\t\t} else if (dynamic) {\n\t\t\t// defer updates until all the DOM shuffling is done\n\t\t\tupdates.push(() => block.p(child_ctx, dirty));\n\t\t}\n\t\tnew_lookup.set(key, (new_blocks[i] = block));\n\t\tif (key in old_indexes) deltas.set(key, Math.abs(i - old_indexes[key]));\n\t}\n\tconst will_move = new Set();\n\tconst did_move = new Set();\n\t/** @returns {void} */\n\tfunction insert(block) {\n\t\ttransition_in(block, 1);\n\t\tblock.m(node, next);\n\t\tlookup.set(block.key, block);\n\t\tnext = block.first;\n\t\tn--;\n\t}\n\twhile (o && n) {\n\t\tconst new_block = new_blocks[n - 1];\n\t\tconst old_block = old_blocks[o - 1];\n\t\tconst new_key = new_block.key;\n\t\tconst old_key = old_block.key;\n\t\tif (new_block === old_block) {\n\t\t\t// do nothing\n\t\t\tnext = new_block.first;\n\t\t\to--;\n\t\t\tn--;\n\t\t} else if (!new_lookup.has(old_key)) {\n\t\t\t// remove old block\n\t\t\tdestroy(old_block, lookup);\n\t\t\to--;\n\t\t} else if (!lookup.has(new_key) || will_move.has(new_key)) {\n\t\t\tinsert(new_block);\n\t\t} else if (did_move.has(old_key)) {\n\t\t\to--;\n\t\t} else if (deltas.get(new_key) > deltas.get(old_key)) {\n\t\t\tdid_move.add(new_key);\n\t\t\tinsert(new_block);\n\t\t} else {\n\t\t\twill_move.add(old_key);\n\t\t\to--;\n\t\t}\n\t}\n\twhile (o--) {\n\t\tconst old_block = old_blocks[o];\n\t\tif (!new_lookup.has(old_block.key)) destroy(old_block, lookup);\n\t}\n\twhile (n) insert(new_blocks[n - 1]);\n\trun_all(updates);\n\treturn new_blocks;\n}\n\n/** @returns {void} */\nexport function validate_each_keys(ctx, list, get_context, get_key) {\n\tconst keys = new Map();\n\tfor (let i = 0; i < list.length; i++) {\n\t\tconst key = get_key(get_context(ctx, list, i));\n\t\tif (keys.has(key)) {\n\t\t\tlet value = '';\n\t\t\ttry {\n\t\t\t\tvalue = `with value '${String(key)}' `;\n\t\t\t} catch (e) {\n\t\t\t\t// can't stringify\n\t\t\t}\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot have duplicate keys in a keyed each: Keys at index ${keys.get(\n\t\t\t\t\tkey\n\t\t\t\t)} and ${i} ${value}are duplicates`\n\t\t\t);\n\t\t}\n\t\tkeys.set(key, i);\n\t}\n}\n","/** @returns {{}} */\nexport function get_spread_update(levels, updates) {\n\tconst update = {};\n\tconst to_null_out = {};\n\tconst accounted_for = { $$scope: 1 };\n\tlet i = levels.length;\n\twhile (i--) {\n\t\tconst o = levels[i];\n\t\tconst n = updates[i];\n\t\tif (n) {\n\t\t\tfor (const key in o) {\n\t\t\t\tif (!(key in n)) to_null_out[key] = 1;\n\t\t\t}\n\t\t\tfor (const key in n) {\n\t\t\t\tif (!accounted_for[key]) {\n\t\t\t\t\tupdate[key] = n[key];\n\t\t\t\t\taccounted_for[key] = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tlevels[i] = n;\n\t\t} else {\n\t\t\tfor (const key in o) {\n\t\t\t\taccounted_for[key] = 1;\n\t\t\t}\n\t\t}\n\t}\n\tfor (const key in to_null_out) {\n\t\tif (!(key in update)) update[key] = undefined;\n\t}\n\treturn update;\n}\n\nexport function get_spread_object(spread_props) {\n\treturn typeof spread_props === 'object' && spread_props !== null ? spread_props : {};\n}\n","import {\n\tadd_render_callback,\n\tflush,\n\tflush_render_callbacks,\n\tschedule_update,\n\tdirty_components\n} from './scheduler.js';\nimport { current_component, set_current_component } from './lifecycle.js';\nimport { blank_object, is_empty, is_function, run, run_all, noop } from './utils.js';\nimport {\n\tchildren,\n\tdetach,\n\tstart_hydrating,\n\tend_hydrating,\n\tget_custom_elements_slots,\n\tinsert,\n\telement,\n\tattr\n} from './dom.js';\nimport { transition_in } from './transitions.js';\n\n/** @returns {void} */\nexport function bind(component, name, callback) {\n\tconst index = component.$$.props[name];\n\tif (index !== undefined) {\n\t\tcomponent.$$.bound[index] = callback;\n\t\tcallback(component.$$.ctx[index]);\n\t}\n}\n\n/** @returns {void} */\nexport function create_component(block) {\n\tblock && block.c();\n}\n\n/** @returns {void} */\nexport function claim_component(block, parent_nodes) {\n\tblock && block.l(parent_nodes);\n}\n\n/** @returns {void} */\nexport function mount_component(component, target, anchor) {\n\tconst { fragment, after_update } = component.$$;\n\tfragment && fragment.m(target, anchor);\n\t// onMount happens before the initial afterUpdate\n\tadd_render_callback(() => {\n\t\tconst new_on_destroy = component.$$.on_mount.map(run).filter(is_function);\n\t\t// if the component was destroyed immediately\n\t\t// it will update the `$$.on_destroy` reference to `null`.\n\t\t// the destructured on_destroy may still reference to the old array\n\t\tif (component.$$.on_destroy) {\n\t\t\tcomponent.$$.on_destroy.push(...new_on_destroy);\n\t\t} else {\n\t\t\t// Edge case - component was destroyed immediately,\n\t\t\t// most likely as a result of a binding initialising\n\t\t\trun_all(new_on_destroy);\n\t\t}\n\t\tcomponent.$$.on_mount = [];\n\t});\n\tafter_update.forEach(add_render_callback);\n}\n\n/** @returns {void} */\nexport function destroy_component(component, detaching) {\n\tconst $$ = component.$$;\n\tif ($$.fragment !== null) {\n\t\tflush_render_callbacks($$.after_update);\n\t\trun_all($$.on_destroy);\n\t\t$$.fragment && $$.fragment.d(detaching);\n\t\t// TODO null out other refs, including component.$$ (but need to\n\t\t// preserve final state?)\n\t\t$$.on_destroy = $$.fragment = null;\n\t\t$$.ctx = [];\n\t}\n}\n\n/** @returns {void} */\nfunction make_dirty(component, i) {\n\tif (component.$$.dirty[0] === -1) {\n\t\tdirty_components.push(component);\n\t\tschedule_update();\n\t\tcomponent.$$.dirty.fill(0);\n\t}\n\tcomponent.$$.dirty[(i / 31) | 0] |= 1 << i % 31;\n}\n\n// TODO: Document the other params\n/**\n * @param {SvelteComponent} component\n * @param {import('./public.js').ComponentConstructorOptions} options\n *\n * @param {import('./utils.js')['not_equal']} not_equal Used to compare props and state values.\n * @param {(target: Element | ShadowRoot) => void} [append_styles] Function that appends styles to the DOM when the component is first initialised.\n * This will be the `add_css` function from the compiled component.\n *\n * @returns {void}\n */\nexport function init(\n\tcomponent,\n\toptions,\n\tinstance,\n\tcreate_fragment,\n\tnot_equal,\n\tprops,\n\tappend_styles = null,\n\tdirty = [-1]\n) {\n\tconst parent_component = current_component;\n\tset_current_component(component);\n\t/** @type {import('./private.js').T$$} */\n\tconst $$ = (component.$$ = {\n\t\tfragment: null,\n\t\tctx: [],\n\t\t// state\n\t\tprops,\n\t\tupdate: noop,\n\t\tnot_equal,\n\t\tbound: blank_object(),\n\t\t// lifecycle\n\t\ton_mount: [],\n\t\ton_destroy: [],\n\t\ton_disconnect: [],\n\t\tbefore_update: [],\n\t\tafter_update: [],\n\t\tcontext: new Map(options.context || (parent_component ? parent_component.$$.context : [])),\n\t\t// everything else\n\t\tcallbacks: blank_object(),\n\t\tdirty,\n\t\tskip_bound: false,\n\t\troot: options.target || parent_component.$$.root\n\t});\n\tappend_styles && append_styles($$.root);\n\tlet ready = false;\n\t$$.ctx = instance\n\t\t? instance(component, options.props || {}, (i, ret, ...rest) => {\n\t\t\t\tconst value = rest.length ? rest[0] : ret;\n\t\t\t\tif ($$.ctx && not_equal($$.ctx[i], ($$.ctx[i] = value))) {\n\t\t\t\t\tif (!$$.skip_bound && $$.bound[i]) $$.bound[i](value);\n\t\t\t\t\tif (ready) make_dirty(component, i);\n\t\t\t\t}\n\t\t\t\treturn ret;\n\t\t  })\n\t\t: [];\n\t$$.update();\n\tready = true;\n\trun_all($$.before_update);\n\t// `false` as a special case of no DOM component\n\t$$.fragment = create_fragment ? create_fragment($$.ctx) : false;\n\tif (options.target) {\n\t\tif (options.hydrate) {\n\t\t\tstart_hydrating();\n\t\t\t// TODO: what is the correct type here?\n\t\t\t// @ts-expect-error\n\t\t\tconst nodes = children(options.target);\n\t\t\t$$.fragment && $$.fragment.l(nodes);\n\t\t\tnodes.forEach(detach);\n\t\t} else {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t$$.fragment && $$.fragment.c();\n\t\t}\n\t\tif (options.intro) transition_in(component.$$.fragment);\n\t\tmount_component(component, options.target, options.anchor);\n\t\tend_hydrating();\n\t\tflush();\n\t}\n\tset_current_component(parent_component);\n}\n\nexport let SvelteElement;\n\nif (typeof HTMLElement === 'function') {\n\tSvelteElement = class extends HTMLElement {\n\t\t/** The Svelte component constructor */\n\t\t$$ctor;\n\t\t/** Slots */\n\t\t$$s;\n\t\t/** The Svelte component instance */\n\t\t$$c;\n\t\t/** Whether or not the custom element is connected */\n\t\t$$cn = false;\n\t\t/** Component props data */\n\t\t$$d = {};\n\t\t/** `true` if currently in the process of reflecting component props back to attributes */\n\t\t$$r = false;\n\t\t/** @type {Record<string, CustomElementPropDefinition>} Props definition (name, reflected, type etc) */\n\t\t$$p_d = {};\n\t\t/** @type {Record<string, Function[]>} Event listeners */\n\t\t$$l = {};\n\t\t/** @type {Map<Function, Function>} Event listener unsubscribe functions */\n\t\t$$l_u = new Map();\n\n\t\tconstructor($$componentCtor, $$slots, use_shadow_dom) {\n\t\t\tsuper();\n\t\t\tthis.$$ctor = $$componentCtor;\n\t\t\tthis.$$s = $$slots;\n\t\t\tif (use_shadow_dom) {\n\t\t\t\tthis.attachShadow({ mode: 'open' });\n\t\t\t}\n\t\t}\n\n\t\taddEventListener(type, listener, options) {\n\t\t\t// We can't determine upfront if the event is a custom event or not, so we have to\n\t\t\t// listen to both. If someone uses a custom event with the same name as a regular\n\t\t\t// browser event, this fires twice - we can't avoid that.\n\t\t\tthis.$$l[type] = this.$$l[type] || [];\n\t\t\tthis.$$l[type].push(listener);\n\t\t\tif (this.$$c) {\n\t\t\t\tconst unsub = this.$$c.$on(type, listener);\n\t\t\t\tthis.$$l_u.set(listener, unsub);\n\t\t\t}\n\t\t\tsuper.addEventListener(type, listener, options);\n\t\t}\n\n\t\tremoveEventListener(type, listener, options) {\n\t\t\tsuper.removeEventListener(type, listener, options);\n\t\t\tif (this.$$c) {\n\t\t\t\tconst unsub = this.$$l_u.get(listener);\n\t\t\t\tif (unsub) {\n\t\t\t\t\tunsub();\n\t\t\t\t\tthis.$$l_u.delete(listener);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tasync connectedCallback() {\n\t\t\tthis.$$cn = true;\n\t\t\tif (!this.$$c) {\n\t\t\t\t// We wait one tick to let possible child slot elements be created/mounted\n\t\t\t\tawait Promise.resolve();\n\t\t\t\tif (!this.$$cn) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tfunction create_slot(name) {\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tlet node;\n\t\t\t\t\t\tconst obj = {\n\t\t\t\t\t\t\tc: function create() {\n\t\t\t\t\t\t\t\tnode = element('slot');\n\t\t\t\t\t\t\t\tif (name !== 'default') {\n\t\t\t\t\t\t\t\t\tattr(node, 'name', name);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t * @param {HTMLElement} target\n\t\t\t\t\t\t\t * @param {HTMLElement} [anchor]\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tm: function mount(target, anchor) {\n\t\t\t\t\t\t\t\tinsert(target, node, anchor);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\td: function destroy(detaching) {\n\t\t\t\t\t\t\t\tif (detaching) {\n\t\t\t\t\t\t\t\t\tdetach(node);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t\treturn obj;\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst $$slots = {};\n\t\t\t\tconst existing_slots = get_custom_elements_slots(this);\n\t\t\t\tfor (const name of this.$$s) {\n\t\t\t\t\tif (name in existing_slots) {\n\t\t\t\t\t\t$$slots[name] = [create_slot(name)];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (const attribute of this.attributes) {\n\t\t\t\t\t// this.$$data takes precedence over this.attributes\n\t\t\t\t\tconst name = this.$$g_p(attribute.name);\n\t\t\t\t\tif (!(name in this.$$d)) {\n\t\t\t\t\t\tthis.$$d[name] = get_custom_element_value(name, attribute.value, this.$$p_d, 'toProp');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.$$c = new this.$$ctor({\n\t\t\t\t\ttarget: this.shadowRoot || this,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\t...this.$$d,\n\t\t\t\t\t\t$$slots,\n\t\t\t\t\t\t$$scope: {\n\t\t\t\t\t\t\tctx: []\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Reflect component props as attributes\n\t\t\t\tconst reflect_attributes = () => {\n\t\t\t\t\tthis.$$r = true;\n\t\t\t\t\tfor (const key in this.$$p_d) {\n\t\t\t\t\t\tthis.$$d[key] = this.$$c.$$.ctx[this.$$c.$$.props[key]];\n\t\t\t\t\t\tif (this.$$p_d[key].reflect) {\n\t\t\t\t\t\t\tconst attribute_value = get_custom_element_value(\n\t\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\t\tthis.$$d[key],\n\t\t\t\t\t\t\t\tthis.$$p_d,\n\t\t\t\t\t\t\t\t'toAttribute'\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (attribute_value == null) {\n\t\t\t\t\t\t\t\tthis.removeAttribute(this.$$p_d[key].attribute || key);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.setAttribute(this.$$p_d[key].attribute || key, attribute_value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.$$r = false;\n\t\t\t\t};\n\t\t\t\tthis.$$c.$$.after_update.push(reflect_attributes);\n\t\t\t\treflect_attributes(); // once initially because after_update is added too late for first render\n\n\t\t\t\tfor (const type in this.$$l) {\n\t\t\t\t\tfor (const listener of this.$$l[type]) {\n\t\t\t\t\t\tconst unsub = this.$$c.$on(type, listener);\n\t\t\t\t\t\tthis.$$l_u.set(listener, unsub);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.$$l = {};\n\t\t\t}\n\t\t}\n\n\t\t// We don't need this when working within Svelte code, but for compatibility of people using this outside of Svelte\n\t\t// and setting attributes through setAttribute etc, this is helpful\n\t\tattributeChangedCallback(attr, _oldValue, newValue) {\n\t\t\tif (this.$$r) return;\n\t\t\tattr = this.$$g_p(attr);\n\t\t\tthis.$$d[attr] = get_custom_element_value(attr, newValue, this.$$p_d, 'toProp');\n\t\t\tthis.$$c?.$set({ [attr]: this.$$d[attr] });\n\t\t}\n\n\t\tdisconnectedCallback() {\n\t\t\tthis.$$cn = false;\n\t\t\t// In a microtask, because this could be a move within the DOM\n\t\t\tPromise.resolve().then(() => {\n\t\t\t\tif (!this.$$cn) {\n\t\t\t\t\tthis.$$c.$destroy();\n\t\t\t\t\tthis.$$c = undefined;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t$$g_p(attribute_name) {\n\t\t\treturn (\n\t\t\t\tObject.keys(this.$$p_d).find(\n\t\t\t\t\t(key) =>\n\t\t\t\t\t\tthis.$$p_d[key].attribute === attribute_name ||\n\t\t\t\t\t\t(!this.$$p_d[key].attribute && key.toLowerCase() === attribute_name)\n\t\t\t\t) || attribute_name\n\t\t\t);\n\t\t}\n\t};\n}\n\n/**\n * @param {string} prop\n * @param {any} value\n * @param {Record<string, CustomElementPropDefinition>} props_definition\n * @param {'toAttribute' | 'toProp'} [transform]\n */\nfunction get_custom_element_value(prop, value, props_definition, transform) {\n\tconst type = props_definition[prop]?.type;\n\tvalue = type === 'Boolean' && typeof value !== 'boolean' ? value != null : value;\n\tif (!transform || !props_definition[prop]) {\n\t\treturn value;\n\t} else if (transform === 'toAttribute') {\n\t\tswitch (type) {\n\t\t\tcase 'Object':\n\t\t\tcase 'Array':\n\t\t\t\treturn value == null ? null : JSON.stringify(value);\n\t\t\tcase 'Boolean':\n\t\t\t\treturn value ? '' : null;\n\t\t\tcase 'Number':\n\t\t\t\treturn value == null ? null : value;\n\t\t\tdefault:\n\t\t\t\treturn value;\n\t\t}\n\t} else {\n\t\tswitch (type) {\n\t\t\tcase 'Object':\n\t\t\tcase 'Array':\n\t\t\t\treturn value && JSON.parse(value);\n\t\t\tcase 'Boolean':\n\t\t\t\treturn value; // conversion already handled above\n\t\t\tcase 'Number':\n\t\t\t\treturn value != null ? +value : value;\n\t\t\tdefault:\n\t\t\t\treturn value;\n\t\t}\n\t}\n}\n\n/**\n * @internal\n *\n * Turn a Svelte component into a custom element.\n * @param {import('./public.js').ComponentType} Component  A Svelte component constructor\n * @param {Record<string, CustomElementPropDefinition>} props_definition  The props to observe\n * @param {string[]} slots  The slots to create\n * @param {string[]} accessors  Other accessors besides the ones for props the component has\n * @param {boolean} use_shadow_dom  Whether to use shadow DOM\n * @param {(ce: new () => HTMLElement) => new () => HTMLElement} [extend]\n */\nexport function create_custom_element(\n\tComponent,\n\tprops_definition,\n\tslots,\n\taccessors,\n\tuse_shadow_dom,\n\textend\n) {\n\tlet Class = class extends SvelteElement {\n\t\tconstructor() {\n\t\t\tsuper(Component, slots, use_shadow_dom);\n\t\t\tthis.$$p_d = props_definition;\n\t\t}\n\t\tstatic get observedAttributes() {\n\t\t\treturn Object.keys(props_definition).map((key) =>\n\t\t\t\t(props_definition[key].attribute || key).toLowerCase()\n\t\t\t);\n\t\t}\n\t};\n\tObject.keys(props_definition).forEach((prop) => {\n\t\tObject.defineProperty(Class.prototype, prop, {\n\t\t\tget() {\n\t\t\t\treturn this.$$c && prop in this.$$c ? this.$$c[prop] : this.$$d[prop];\n\t\t\t},\n\t\t\tset(value) {\n\t\t\t\tvalue = get_custom_element_value(prop, value, props_definition);\n\t\t\t\tthis.$$d[prop] = value;\n\t\t\t\tthis.$$c?.$set({ [prop]: value });\n\t\t\t}\n\t\t});\n\t});\n\taccessors.forEach((accessor) => {\n\t\tObject.defineProperty(Class.prototype, accessor, {\n\t\t\tget() {\n\t\t\t\treturn this.$$c?.[accessor];\n\t\t\t}\n\t\t});\n\t});\n\tif (extend) {\n\t\t// @ts-expect-error - assigning here is fine\n\t\tClass = extend(Class);\n\t}\n\tComponent.element = /** @type {any} */ (Class);\n\treturn Class;\n}\n\n/**\n * Base class for Svelte components. Used when dev=false.\n *\n * @template {Record<string, any>} [Props=any]\n * @template {Record<string, any>} [Events=any]\n */\nexport class SvelteComponent {\n\t/**\n\t * ### PRIVATE API\n\t *\n\t * Do not use, may change at any time\n\t *\n\t * @type {any}\n\t */\n\t$$ = undefined;\n\t/**\n\t * ### PRIVATE API\n\t *\n\t * Do not use, may change at any time\n\t *\n\t * @type {any}\n\t */\n\t$$set = undefined;\n\n\t/** @returns {void} */\n\t$destroy() {\n\t\tdestroy_component(this, 1);\n\t\tthis.$destroy = noop;\n\t}\n\n\t/**\n\t * @template {Extract<keyof Events, string>} K\n\t * @param {K} type\n\t * @param {((e: Events[K]) => void) | null | undefined} callback\n\t * @returns {() => void}\n\t */\n\t$on(type, callback) {\n\t\tif (!is_function(callback)) {\n\t\t\treturn noop;\n\t\t}\n\t\tconst callbacks = this.$$.callbacks[type] || (this.$$.callbacks[type] = []);\n\t\tcallbacks.push(callback);\n\t\treturn () => {\n\t\t\tconst index = callbacks.indexOf(callback);\n\t\t\tif (index !== -1) callbacks.splice(index, 1);\n\t\t};\n\t}\n\n\t/**\n\t * @param {Partial<Props>} props\n\t * @returns {void}\n\t */\n\t$set(props) {\n\t\tif (this.$$set && !is_empty(props)) {\n\t\t\tthis.$$.skip_bound = true;\n\t\t\tthis.$$set(props);\n\t\t\tthis.$$.skip_bound = false;\n\t\t}\n\t}\n}\n\n/**\n * @typedef {Object} CustomElementPropDefinition\n * @property {string} [attribute]\n * @property {boolean} [reflect]\n * @property {'String'|'Boolean'|'Number'|'Array'|'Object'} [type]\n */\n","// generated during release, do not modify\n\n/**\n * The current version, as set in package.json.\n *\n * https://svelte.dev/docs/svelte-compiler#svelte-version\n * @type {string}\n */\nexport const VERSION = '4.2.2';\nexport const PUBLIC_VERSION = '4';\n","import { PUBLIC_VERSION } from '../../../shared/version.js';\n\nif (typeof window !== 'undefined')\n\t// @ts-ignore\n\t(window.__svelte || (window.__svelte = { v: new Set() })).v.add(PUBLIC_VERSION);\n","<script>\n  /** @type {'basic'|'basic-negative'|'primary'|'secondary'|'destructive'|'plain'} */\n  export let type = \"basic\";\n\n  /** @type {boolean} */\n  export let iconOnly = false;\n\n  /** @type {string} */\n  export let id = undefined;\n\n  /** @type {string} */\n  export let cssClass = \"\";\n\n  /** @type {string} */\n  export let text = \"\";\n\n  /** @type {boolean} */\n  export let large = false;\n\n  /** @type {boolean} */\n  export let disabled = false;\n\n  /** @type {boolean} */\n  export let loading = false;\n\n  /** @type {'submit'|'button'|'reset'} */\n  export let htmlType = \"submit\";\n\n  /** @type {'false'|'true'|'menu'|'listbox'|'tree'|'grid'|'dialog'} */\n  export let haspopup = undefined;\n\n  /** @type {boolean} */\n  export let expanded = undefined;\n\n  /** @type {string | undefined} */\n  export let ariaLabel = undefined;\n\n  /** @type {string | undefined} */\n  export let describedby = undefined;\n\n  /** @type {string | undefined} */\n  export let labelledby = undefined;\n\n  $: visuallyHidden = iconOnly ? \"prom-button__text--hidden\" : \"\";\n  $: isLarge = large ? \"prom-button--large\" : \"\";\n  $: isLoading = loading ? \"prom-button--loading\" : \"\";\n  $: isActive = !loading && !disabled;\n  $: ariaLabelText = ariaLabel \n    ? ariaLabel\n    : (iconOnly ? text : undefined);\n</script>\n\n<button\n  aria-haspopup={haspopup}\n  aria-expanded={expanded}\n  aria-label={ariaLabelText}\n  aria-labelledby={labelledby}\n  aria-describedby={describedby}\n  {id}\n  type={htmlType}\n  class=\"prom-button prom-button__{type} {cssClass} {isLoading} {isLarge}\"\n  {disabled}\n  data-active={isActive}\n  on:click\n  on:focus\n  on:blur\n  on:keyup\n  on:keydown\n>\n  <span class=\"prom-button__text\">\n    <span class={visuallyHidden}>{text}</span>\n  </span>\n</button>\n","{#if textOnly && iconOnly}\n    <Button\n        cssClass=\"prom-icon-button {iconPlacementClass} {iconClass}\"\n        {disabled}\n        {haspopup}\n        {expanded}\n        {id}\n        {large}\n        {loading}\n        {text}\n        {type}\n        {htmlType}\n        {ariaLabel}\n        {labelledby}\n        {describedby}\n        on:blur\n        on:click\n        on:focus\n        on:keyup\n        on:keydown\n    >\n    </Button>\n{:else if textOnly}\n    <Button\n        cssClass=\"prom-icon-button {textOnlyClass}\"\n        {disabled}\n        {haspopup}\n        {expanded}\n        {iconOnly}\n        {id}\n        {large}\n        {loading}\n        {text}\n        {type}\n        {htmlType}\n        {ariaLabel}\n        {labelledby}\n        {describedby}\n        on:blur\n        on:click\n        on:focus\n        on:keyup\n        on:keydown\n    >\n    </Button>\n{:else}\n    <Button\n        cssClass=\"prom-icon-button {iconOnlyClass} {iconPlacementClass} {iconClass}\"\n        {disabled}\n        {haspopup}\n        {expanded}\n        {iconOnly}\n        {id}\n        {large}\n        {loading}\n        {text}\n        {type}\n        {htmlType}\n        {ariaLabel}\n        {labelledby}\n        {describedby}\n        on:blur\n        on:click\n        on:focus\n        on:keyup\n        on:keydown\n    >\n    </Button>\n{/if}\n\n<script>\n    import Button from '../../Button/v1/Button.svelte';\n\n    /** @type {boolean} */\n    export let disabled = false;\n    /** @type {'false'|'true'|'menu'|'listbox'|'tree'|'grid'|'dialog'} */\n    export let haspopup = undefined;\n    /** @type {boolean} */\n    export let expanded = undefined;\n    /** @type {'submit'|'button'|'reset'} */\n    export let htmlType = 'submit';\n    /** @type {string} */\n    export let iconClass = '';\n    /** @type {boolean} */\n    export let iconOnly = false;\n    /** @type {'start'|'end'} */\n    export let iconPlacement = 'start';\n    /** @type {string} */\n    export let id = undefined;\n    /** @type {boolean} */\n    export let large = false;\n    /** @type {boolean} */\n    export let loading = false;\n    /** @type {string} */\n    export let text = '';\n    /** @type {boolean} */\n    export let textOnly = false;\n    /** @type {'basic'|'basic-negative'| 'primary'|'secondary'|'destructive'|'plain'} */\n    export let type = 'basic';\n    /** @type {string | undefined} */\n    export let ariaLabel = undefined;\n    /** @type {string | undefined} */\n    export let labelledby = undefined;\n    /** @type {string} */\n    export let describedby = undefined;\n\n    $: {\n        if (iconOnly && textOnly) {\n            console.warn('The attributes iconOnly and textOnly cannot be both set to false.');\n        }\n    }\n\n    $: {\n        if (!iconPlacement || typeof iconPlacement !== 'string' || (iconPlacement !== 'start' && iconPlacement !== 'end')) {\n            console.warn('Valid values for iconPlacement is \"start\" and \"end\".');\n        }\n    }\n\n    $: iconOnlyClass = iconOnly ? 'prom-icon-button--icon-only' : '';\n    $: textOnlyClass = textOnly ? 'prom-icon-button--text-only' : '';\n    $: iconPlacementClass = iconPlacement === 'end' ? 'prom-icon-button--icon-end' : '';\n</script>\n","/**\n * Known keys. You don't need to import this as you would still be able to use normalized string.\n * @module keyboard/keys\n */\nexport const Keys = {\n    BACKSPACE: 'Backspace',\n    DOWN: 'Down',\n    ENTER: 'Enter',\n    ESCAPE: 'Escape',\n    LEFT: 'Left',\n    RIGHT: 'Right',\n    SHIFT: 'Shift',\n    SPACE: 'Space',\n    TAB: 'Tab',\n    UP: 'Up',\n};\n","/**\n * Helper function to normalize key string identifiers.\n * @module keyboard/normalize\n */\n\nimport { Keys } from './keys';\n\n/**\n * Normalizes keys for convenience.\n *\n * @param {string} key The key that should be normalized.\n * @return {string} A normalized representation of the requested key.\n */\nexport function normalizeKey(key) {\n    switch (key) {\n        case 'Down':\n        case 'ArrowDown':\n            return Keys.DOWN;\n        case 'Left':\n        case 'ArrowLeft':\n            return Keys.LEFT;\n        case 'Right':\n        case 'ArrowRight':\n            return Keys.RIGHT;\n        case 'Up':\n        case 'ArrowUp':\n            return Keys.UP;\n        case 'Enter':\n            return Keys.ENTER;\n        case 'Esc':\n        case 'Escape':\n            return Keys.ESCAPE;\n        case 'Spacebar':\n        case ' ':\n            return Keys.SPACE;\n        case 'Tab':\n            return Keys.TAB;\n        case 'Backspace':\n            return Keys.BACKSPACE;\n\n        default:\n            return key;\n    }\n}\n","/**\n *  Make tab navigation loop within an element.\n */\n\n// Create attribute selectors to ignore when trying to find tabbables.\n/** @type {string} */\nconst nonTabbables = [\n    '[aria-hidden=\"true\"]',\n    '[disabled]',\n    '[hidden]',\n    '[type=\"hidden\"]',\n    '[tabindex=\"-1\"]'\n]\n    .map(selector => `:not(${selector})`)\n    .join('');\n\n// Select elements that are by default tabbable when tab navigating and\n// append the nonTabbables selectors to each.\n/** @type {string} */\nconst tabbables = [\n    `button`,\n    `[role=\"button\"]`,\n    `a[href]`,\n    `input`,\n    `[contentEditable=true]`,\n    `select`,\n    `textarea`,\n    `iframe`,\n    `[tabindex=\"0\"]`,\n    `audio`,\n    `video`\n]\n    .map(selector => `${selector}${nonTabbables}`)\n    .join(',');\n\nclass TabTrapper {\n    /**\n     * @param {HTMLElement} element\n     */\n    constructor(element) {\n        /** @type {Array<HTMLElement>} */\n        this.tabbables = [];\n\n        /** @type {HTMLElement} */\n        this.element = element;\n\n        /** @type {HTMLElement} */\n        this.innerDocBody = null;\n\n        this.element.addEventListener('keydown', this.maybeLoopFocus.bind(this));\n    }\n\n    teardown() {\n        this.element.removeEventListener('keydown', this.maybeLoopFocus);\n\n        if (this.innerDocBody) {\n            this.innerDocBody.removeEventListener('keydown', this.maybeLoopFocus.bind(this));\n        }\n    }\n\n    /**\n     * Reselects tabbable elements. This function should be called on each\n     * update of element contents.\n     */\n    init() {\n        /** @type {NodeListOf<Element>} */\n        const elements = this.element.querySelectorAll(tabbables);\n\n        /** @type {Array<HTMLElement>} */\n        const visibleTabbables = removeInvisibles(elements);\n\n        /** @type {HTMLElement} */\n        this.firstTabbable = visibleTabbables[0];\n\n        /** @type {HTMLElement} */\n        this.lastTabbable = visibleTabbables[visibleTabbables.length - 1];\n    }\n\n    /**\n     * Advance focus to next tabbable element if the event is a TAB key press\n     *\n     * @param {KeyboardEvent} event\n     */\n    maybeLoopFocus(event) {\n        if (event.key !== 'Tab') {\n            return;\n        }\n\n        if (!event.shiftKey && event.target === this.lastTabbable) {\n            event.preventDefault();\n            if (this.firstTabbable.nodeName === 'INPUT' && this.firstTabbable.type === 'radio') {\n                const selectedElement = document.querySelector(`input[name=\"${this.firstTabbable.name}\"]:checked`);\n                selectedElement\n                    ? selectedElement.focus()\n                    : this.firstTabbable.focus();\n            } else {\n                this.firstTabbable.focus();\n            }\n        }\n\n        if (event.shiftKey && (event.target === this.firstTabbable || isInSameRadioGroup(event.target, this.firstTabbable))) {\n            event.preventDefault();\n            this.lastTabbable.focus();\n        }\n    }\n\n    /**\n     * Update last tabbable if the last element is an iframe\n     *\n     * @param {HTMLElement} innerDocBody document body of inner iframe\n     */\n    updateLastTabbableIfIframeIsTheLastElement(innerDocBody) {\n        this.innerDocBody = innerDocBody;\n\n        const elements = innerDocBody.querySelectorAll(tabbables);\n        const visibleTabbables = removeInvisibles(elements);\n\n        if (visibleTabbables.length === 0) {\n            this.lastTabbable = innerDocBody;\n        } else {\n            this.lastTabbable = visibleTabbables[visibleTabbables.length - 1];\n        }\n\n        innerDocBody.addEventListener('keydown', this.maybeLoopFocus.bind(this));\n    }\n}\n\nexport default TabTrapper;\n\n/**\n * This may have an issue with screen reader only elements, it needs to be tested.\n *\n * @param {NodeListOf<Element>} elements\n * @return {Array<HTMLElement>} All elements that have computed style of visisble.\n */\nfunction removeInvisibles(elements) {\n    return [].filter.call(elements, element => {\n        return element.style.visibility !== 'hidden' &&\n            element.style.display !== 'none';\n    });\n}\n\nfunction isInSameRadioGroup(element1, element2) {\n    return element1.nodeName === 'INPUT' && element1.type === 'radio' &&\n        element2.nodeName === 'INPUT' && element2.type === 'radio' && element1.name === element2.name;\n}\n","/**\n* Focus first item in dropdown\n*\n* @param {Element} dropdown\n*/\n\nexport function focusFirstItemIn(dropdown) {\n    const firstItem = dropdown.querySelector('li > .prom-dropdown__listitem');\n\n    // @ts-ignore\n    firstItem.focus();\n}\n\n/**\n* Focus last item in dropdown\n*\n* @param {Element} dropdown\n*/\nexport function focusLastItemIn(dropdown) {\n    const lastItem = dropdown.children[dropdown.children.length - 1];\n\n    // @ts-ignore\n    lastItem.querySelector('.prom-dropdown__listitem').focus();\n}\n\n/**\n * Return focus to the parent dropdown when closing a submenu\n *\n */\nexport function returnFocusToParentDropdown() {\n    const button = document.querySelector('.prom-dropdown__listitems-menu.open');\n\n    if (button) {\n        // @ts-ignore\n        button.focus();\n        removeFocusFromParentDropdown();\n    }\n}\n\nexport function removeFocusFromParentDropdown() {\n    const button = document.querySelector('.prom-dropdown__listitems-menu.open');\n\n    if (button) {\n        button.classList.remove('open');\n    }\n}\n\n/**\n* Hide dropdown\n*\n* @param {HTMLElement} submenu\n*/\nexport function hide(submenu) {\n    submenu.setAttribute('hidden', 'hidden');\n}\n\n/**\n* Is submenu hidden?\n*\n* @param {HTMLElement} submenu\n* @returns {boolean}\n*/\nexport function hidden(submenu) {\n    return submenu && submenu.hasAttribute('hidden');\n}\n\n/**\n * Hide open submenus\n *\n */\nexport function hideOpenSubmenus() {\n    const submenus = Array.prototype.slice.call(document.querySelectorAll('.prom-dropdown__submenu'));\n\n    for (let i = 0; i < submenus.length; i++) {\n        hide(submenus[i]);\n    }\n\n    const menuButtons = document.querySelectorAll('.prom-dropdown__listitems-menu');\n\n    for (let i = 0; i < menuButtons.length; i++) {\n        menuButtons[i].setAttribute('aria-expanded', 'false');\n    }\n}\n\n/**\n* Show submenu\n*\n* @param {HTMLElement} submenu\n*/\nexport function show(submenu) {\n    submenu.style.right = null;\n    submenu.style.left = null;\n    submenu.style.top = null;\n\n    if (window.innerWidth > 480) {\n        const openerRect = submenu.parentElement.getBoundingClientRect();\n        const dropdownBody = getClosestParentByClass(submenu, 'prom-dropdown__body');\n\n        // If there is space to the right open there, otherwise open to the left\n        if (window.innerWidth - openerRect.right >= openerRect.width) {\n            submenu.style.left = openerRect.width + 'px';\n        } else {\n            submenu.style.right = openerRect.width + 'px';\n        }\n\n        // Set the submenu's top style to line up with the element that opened it\n        submenu.style.top = openerRect.top - dropdownBody.getBoundingClientRect().top - 5 + 'px';\n    }\n\n    submenu.removeAttribute('hidden');\n}\n\nfunction getClosestParentByClass(element, matchClass) {\n    while (element.parentElement !== null) {\n        element = element.parentElement;\n\n        if (element.classList.contains(matchClass)) {\n            return element;\n        }\n    }\n\n    return null;\n}\n\n/**\n * Are there any open submenus?\n *\n * @returns {boolean} True if open submenus\n */\nexport function openSubmenus() {\n    const submenus = document.querySelectorAll('.prom-dropdown__submenu');\n\n    let open = false;\n\n    if (submenus.length > 0) {\n        submenus.forEach((submenu) => {\n            if (submenu.hasAttribute('aria-expanded')) {\n                const expanded = submenu.getAttribute('aria-expanded');\n\n                if (expanded === 'true') {\n                    open = true;\n                }\n            }\n        });\n    }\n\n    return open;\n}\n\nexport function isMenuItem(button) {\n    return button.classList.contains('prom-dropdown__listitems-menu');\n}\n","<a\n    class=\"prom-dropdown__listitem prom-dropdown__listitem-link\"\n    href={option.url}\n    ping={option.ping}\n    id={option.id}\n    tabindex=\"-1\"\n    target={option.target ? option.target : 'mainmenu'}\n    on:click={onClick}\n    on:mouseenter={event => dispatch('mouseenter', { event, data: option })}\n    on:mouseleave={event => dispatch('mouseleave', { event, data: option })}\n>\n\n    {#if option.icon}\n    <img\n      alt=\"\"\n      class=\"prom-dropdown__listitems-icon\"\n      src=\"{option.icon}\"\n      height=\"{option.iconsize}\"\n      width=\"{option.iconsize}\" />\n    {:else if option.iconCssClass}\n    <span\n        class=\"{option.iconCssClass}\">\n    </span>\n    {/if}\n\n    <span class=\"prom-dropdown__listitems-text\">{option.label}\n    {#if option.ellipsis}\n    &#8230;\n    {/if}\n    </span>\n</a>\n\n<script>\n    import { createEventDispatcher } from 'svelte';\n    const dispatch = createEventDispatcher();\n\n    /** @type {object} */\n    export let option = null;\n\n    function onClick(event) {\n        dispatch('dropdownClose', event)\n        if (option && option.value) {\n            dispatch('click', { data: option });\n        }\n    }\n</script>\n","<button\n    class=\"prom-dropdown__listitem prom-dropdown__listitem-action {cssClass}\"\n    tabindex=\"-1\"\n    type=\"button\"\n    id={option.id}\n    aria-haspopup={hasPopup}\n    aria-expanded={hasPopup ? expanded : null}\n    on:click={event => dispatch('click', { event, data: option })}\n    on:mouseenter={event => dispatch('mouseenter', { event, data: option })}\n    on:mouseleave={event => dispatch('mouseleave', { event, data: option })}\n>\n    {#if option.icon}\n    <img\n      alt=\"\"\n      class=\"prom-dropdown__listitems-icon\"\n      src={option.icon}\n      height={option.iconsize}\n      width={option.iconsize} />\n    {:else if option.iconCssClass}\n    <span\n        class={option.iconCssClass}>\n    </span>\n    {/if}\n\n    <span class=\"prom-dropdown__listitems-text\">{option.label}\n    {#if option.ellipsis}\n    &#8230;\n    {/if}\n    </span>\n\n    <span class=\"prom-dropdown__listitems-menuicon\"></span>\n</button>\n\n\n<script>\n    import { createEventDispatcher } from 'svelte';\n    const dispatch = createEventDispatcher();\n\n    /** @type {string} */\n    export let cssClass = '';\n    /** @type {boolean} */\n    export let expanded = false;\n    /** @type {boolean} */\n    export let hasPopup = false;\n    /** @type {object} */\n    export let option = null;\n</script>\n","// @ts-check\r\n\r\n/**\r\n * Helper class detecting current device and browser.\r\n * @module detectors/UserAgentHelper\r\n */\r\n\r\n/** The current user agent. */\r\nconst ua = window.navigator.userAgent;\r\n\r\n/** Detects if browser is run on iOS device.\r\n *\r\n * @returns {boolean} True if the user agent contains iPod|iPhone|iPad\r\n */\r\nexport function isIos() {\r\n    return /(iPod|iPhone|iPad)/i.test(ua);\r\n}\r\n\r\n/** Detects if browser is run on iPadOS device or older iPad.\r\n *\r\n * @returns {boolean} True if the user agent contains iPad or is a \"Mac\" with touch points, ie iPadOS.\r\n */\r\nexport function isIpad() {\r\n    const isIpad = ua.toLowerCase().indexOf('ipad') !== -1;\r\n\r\n    if (!isIpad && ua.match(/Mac/) && navigator.maxTouchPoints && navigator.maxTouchPoints > 2) {\r\n        return true;\r\n    }\r\n\r\n    return isIpad;\r\n}\r\n\r\n/**\r\n * Detects if the user's device is a mobile device and not a 'computer'\r\n * @returns {boolean} True if the user agent contains a mobile value\r\n */\r\nexport function isMobile() {\r\n    return !!/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(ua);\r\n}\r\n\r\n/**\r\n * Detects if the user's device is a chromebook\r\n * @returns {boolean} True if the user agent contains CrOS\r\n */\r\nexport function isChromeBook() {\r\n    return !!ua.match(/(CrOS)/g);\r\n}\r\n\r\n/**\r\n * Detects if the user's browser is IE10 or greater\r\n @returns {boolean} True if the user agent is IE10 or greater\r\n */\r\nexport function isIE() {\r\n    return document.body.style.msTouchAction !== undefined;\r\n}\r\n\r\n/**\r\n * Detects if the user's browser is Edge\r\n @returns {boolean} True if the user agent is Edge\r\n */\r\nexport function isEdge() {\r\n    return ua.indexOf('Edge') > -1;\r\n}","import { focusFirstItemIn, focusLastItemIn } from './dropdownHelper.js';\n\n/**\n* Get lists of items\n*\n* @param {HTMLElement} currentItem\n* @returns\n*/\nfunction getLists(currentItem) {\n    const parentItem = currentItem.parentElement;\n    const children = parentItem.parentElement.parentElement.children;\n\n    if (children.length === 0) {\n        return;\n    }\n\n    const lists = [];\n\n    for (let i = 0; i < children.length; i++) {\n        const child = children[i];\n\n        if (child.nodeName.toLowerCase() === 'ul') {\n            lists.push(child);\n        }\n    }\n\n    return lists;\n}\n\n/**\n* Focus first item in next list\n*\n* @param {HTMLElement} currentItem\n*/\nexport function goToNextList(currentItem) {\n    const lists = getLists(currentItem);\n\n    if (lists.length <= 1) {\n        focusFirstItemIn(lists[0]);\n    }\n\n    const parentItem = currentItem.parentElement;\n\n    let nextSibling = parentItem.parentElement.nextElementSibling;\n\n    if (nextSibling) {\n        if (nextSibling.nodeName.toLowerCase() !== 'ul') {\n            nextSibling = nextSibling.nextElementSibling;\n        }\n\n        focusFirstItemIn(nextSibling);\n    } else {\n        focusFirstItemIn(lists[0]);\n    }\n}\n\n/**\n* Focus last item in previous list\n*\n* @param {HTMLElement} currentItem\n*/\nexport function goToPreviousList(currentItem) {\n    const lists = getLists(currentItem);\n\n    if (lists.length <= 1) {\n        focusLastItemIn(lists[0]);\n    } else {\n        const parentItem = currentItem.parentElement;\n\n        let previousSibling = parentItem.parentElement.previousElementSibling;\n\n        if (previousSibling) {\n            if (previousSibling.nodeName.toLowerCase() === 'h2') {\n                previousSibling = previousSibling.previousElementSibling;\n            }\n\n            if (previousSibling.nodeName.toLowerCase() === 'ul') {\n                focusLastItemIn(previousSibling);\n            } else {\n                focusLastItemIn(lists[lists.length - 1]);\n            }\n        } else {\n            focusLastItemIn(lists[lists.length - 1]);\n        }\n    }\n}\n\n/**\n *\n *\n * @param {HTMLElement} currentItem\n * @returns {boolean}\n */\nexport function focusPreviousListItem(currentItem) {\n    const parentItem = currentItem.parentElement;\n    const previousItem = parentItem.previousElementSibling;\n\n    if (previousItem) {\n        // @ts-ignore\n        previousItem.querySelector('.prom-dropdown__listitem').focus();\n\n        return true;\n    }\n\n    return false;\n}\n\n/**\n *\n *\n * @param {HTMLElement} currentItem\n * @returns {boolean}\n */\nexport function focusNextListItem(currentItem) {\n    const parentItem = currentItem.parentElement;\n    const nextItem = parentItem.nextElementSibling;\n\n    if (nextItem) {\n        // @ts-ignore\n        nextItem.querySelector('.prom-dropdown__listitem').focus();\n\n        return true;\n    }\n\n    return false;\n}\n","<li class=\"prom-dropdown__listitems {option.cssClass || ''}\"\n    class:prom-dropdown__listitems--divider={option.divider}\n    class:prom-dropdown__listitems--menu={option.items}\n    on:keyup={keyHandlerUp}\n    on:keydown={keyHandlerDown}\n    role=\"menuitem\"\n>\n    {#if option.link}\n        <AnchorItem\n            {option}\n            on:click\n            on:dropdownClose\n            on:mouseenter={mouseenterHandler}\n            on:mouseleave={mouseleaveHandler}\n        />\n    {:else}\n        {#if option.items}\n            <ButtonItem\n                {option}\n                cssClass=\"prom-dropdown__listitems-menu\"\n                hasPopup={true}\n                on:click={clickHandler}\n                on:mouseenter={mouseenterHandler}\n                on:mouseleave={mouseleaveHandler}\n            />\n\n            <section\n                hidden\n                class=\"prom-dropdown prom-dropdown__submenu\"\n            >\n                <section class=\"prom-dropdown__body\">\n                    {#each option.items as list, index}\n                    <List\n                        {index}\n                        {list}\n                        isSubmenu=\"true\"\n                        on:click\n                        on:dropdownClose\n                        on:keyup\n                    />\n                    {/each}\n                </section>\n            </section>\n        {:else}\n            <ButtonItem\n                {option}\n                hasPopup={false}\n                on:click\n                on:mouseenter={mouseenterHandler}\n                on:mouseleave={mouseleaveHandler}\n            />\n        {/if}\n    {/if}\n</li>\n\n<script>\n    import AnchorItem from './AnchorItem.svelte';\n    import ButtonItem from './ButtonItem.svelte';\n    import List from './List.svelte';\n    import { Keys } from '@itslearning/atlas/keyboard/keys';\n    import { isMobile } from '@itslearning/atlas/detectors/UserAgentHelper';\n    import { normalizeKey } from '@itslearning/atlas/keyboard/normalize';\n    import { focusPreviousListItem, focusNextListItem, goToNextList,\n             goToPreviousList } from './navigationHelper.js';\n    import { focusFirstItemIn, hide, hidden, hideOpenSubmenus, returnFocusToParentDropdown,\n        show, isMenuItem, removeFocusFromParentDropdown } from './dropdownHelper.js';\n\n    export let isSubmenu = false;\n\n    export let option = null;\n\n    function clickHandler({ detail: { event } }) {\n        const button = event.currentTarget;\n        const submenu = event.currentTarget.nextElementSibling;\n\n        toggleMenu(button, submenu, false);\n    }\n\n    function mouseenterHandler({ detail: { event } }) {\n        // TODO: should be removed in https://jira.itslearning.com/browse/TRK-6805\n        if (isMobile()) {\n            return;\n        }\n\n        const item = event.currentTarget;\n        const submenu = event.currentTarget.nextElementSibling;\n\n        if (isMenuItem(item)) {\n            openMenu(item, submenu, true);\n        } else if (!isSubmenu) {\n            hideOpenSubmenus();\n        }\n    }\n\n    function mouseleaveHandler({ detail: { event } }) {\n        // TODO: should be removed in https://jira.itslearning.com/browse/TRK-6805\n        if (isMobile()) {\n            return;\n        }\n\n        const submenu = event.currentTarget.nextElementSibling;\n\n        if (!isSubmenu && submenu && !submenu.contains(event.relatedTarget)) {\n            closeMenu(submenu, false);\n        }\n    }\n\n    function moveToNextItem(currentItem){\n        const nextItemFocused = focusNextListItem(currentItem);\n\n        if (!nextItemFocused) { goToNextList(currentItem); }\n    }\n\n    function moveToPreviousItem(currentItem){\n        const previousItemFocused = focusPreviousListItem(currentItem);\n\n        if (!previousItemFocused) { goToPreviousList(currentItem); }\n    }\n\n    function keyHandlerDown(event) {\n        const { key } = event;\n        const button = event.target;\n\n        switch (normalizeKey(key)) {\n            case Keys.UP:\n                event.preventDefault();\n                moveToPreviousItem(button);\n                break;\n            case Keys.DOWN:\n                event.preventDefault();\n                moveToNextItem(button);\n                break;\n        default:\n            return;\n        }\n    }\n\n    function keyHandlerUp(event) {\n        const { key } = event;\n        const button = event.target;\n        const submenu = event.target.nextElementSibling;\n\n        switch (normalizeKey(key)) {\n            case Keys.LEFT:\n                hideOpenSubmenus();\n                returnFocusToParentDropdown();\n                break;\n            case Keys.RIGHT:\n                if (isMenuItem(button)) {\n                    toggleMenu(button, submenu, false);\n                }\n                break;\n        default:\n            return;\n        }\n    }\n\n    function openMenu(button, submenu, isHover) {\n        hideOpenSubmenus();\n        removeFocusFromParentDropdown();\n        show(submenu);\n\n        button.classList.add('open');\n        button.setAttribute('aria-expanded', true);\n\n        if (!isHover) {\n            focusFirstItemIn(submenu);\n        }\n    }\n\n    function closeMenu(submenu, isHover) {\n        if (!hidden(submenu)) {\n            hide(submenu);\n            const button = document.querySelector('.prom-dropdown__listitems-menu.open');\n            button.setAttribute('aria-expanded', false);\n            button.classList.remove('open');\n\n            if (!isHover) {\n                returnFocusToParentDropdown();\n            }\n        }\n    }\n\n    function toggleMenu(button, submenu, isHover) {\n        hidden(submenu) ?\n            openMenu(button, submenu, isHover) :\n            closeMenu(submenu, true);\n    }\n</script>\n","/**\r\n * @module generate/guid\r\n */\r\n\r\n/**\r\n * Generates a valid v4 GUID as per http://www.ietf.org/rfc/rfc4122.txt\r\n *\r\n * <p>Important parts: xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx</p>\r\n * <p>Where M represents the version and the most significant bits of N represent the variant.</p>\r\n * <p>See http://guid.one/guid and http://guid.one/guid/make for more info.</p>\r\n *\r\n * @returns {string} a valid V4 GUID\r\n */\r\nexport function guidV4() {\r\n    // In Internet Explorer crypto is implemented as experimental so it is only available as msCrypto\r\n    const crypto = window.crypto || window.msCrypto;\r\n    const bytes = crypto.getRandomValues(new Uint8Array(16));\r\n\r\n    // Add version data to the byte at index 6\r\n    bytes[6] = (bytes[6] & 0x0f) | 0x40;\r\n    // Add variant data to the byte at index 8\r\n    bytes[8] = (bytes[8] & 0x3f) | 0x80;\r\n\r\n    let i = 0;\r\n\r\n    // Replace each x with 2 characters per byte from bytes to create a guid string\r\n    return ('xxxx-xx-xx-xx-xxxxxx').replace(/x/g, () => {\r\n        // Left-pad with 0 for single character values\r\n        const value = ('0' + bytes[i].toString(16)).slice(-2);\r\n\r\n        i += 1;\r\n\r\n        return value;\r\n    });\r\n}\r\n","{#if list.label}\n    <h2 id=\"{id}{index+1}\" class=\"prom-dropdown__listheader\">{list.label}</h2>\n{/if}\n\n<ul\n    on:keyup={(event) => dispatch('keyup', event)}\n    aria-labelledby=\"{list.label ? id + (index+1) : null}\"\n    role=\"menu\"\n>\n\n    {#each list.options as option}\n    <ListItem\n        {isSubmenu}\n        {option}\n        on:dropdownClose\n        on:click\n    />\n    {/each}\n</ul>\n\n<script>\n    import ListItem from './ListItem.svelte';\n    import { guidV4 } from '@itslearning/atlas/generate/guid';\n    import { createEventDispatcher } from 'svelte';\n\n    const dispatch = createEventDispatcher();\n\n    /** @type {string} */\n    export let id = guidV4();\n    /** @type {number} */\n    export let index = 0;\n    /** @type {boolean} */\n    export let isSubmenu = false;\n    /** @type {object} */\n    export let list = null;\n</script>\n","<svelte:window on:click={clickHandler} on:keyup={globalKeyHandler} />\n\n<section class=\"prom-dropdown {notResponsiveClass}\" {hidden} bind:this={root}>\n    <section class=\"{arrowClass}\"></section>\n    <header class=\"prom-dropdown__header\">\n        <slot name=\"header\"></slot>\n    </header>\n\n    <section class=\"prom-dropdown__body\">\n        <section class=\"prom-dropdown__bodygradient-top\"></section>\n        {#if items.length}\n            {#each items as list, index}\n                <List\n                    {id}\n                    {index}\n                    {list}\n                    on:click={selectOption}\n                    on:dropdownClose\n                    on:keyup={keyHandler}\n                />\n            {/each}\n        {:else}\n            <slot name=\"body\"></slot>\n        {/if}\n\n    </section>\n\n    <footer class=\"prom-dropdown__footer\">\n        <slot name=\"footer\"></slot>\n    </footer>\n</section>\n\n<script>\n    import { Keys } from '@itslearning/atlas/keyboard/keys';\n    import { normalizeKey } from '@itslearning/atlas/keyboard/normalize';\n    import TabTrapHelper from '../../../../lib/helpers/TabTrapHelper';\n    import { hideOpenSubmenus, openSubmenus, returnFocusToParentDropdown } from './dropdownHelper.js';\n    import List from './List.svelte';\n    import { createEventDispatcher, onMount } from 'svelte';\n\n    const dispatch = createEventDispatcher();\n\n    let root;\n    let tabTrapper;\n\n    /** @type {boolean} */\n    export let arrow = true;\n    /** @type {('top'|'bottom')} */\n    export let arrowPosition = 'top';\n    /** @type {boolean} */\n    export let expanded = false;\n    /** @type {string} */\n    export let id = 'prom-dropdown__list';\n    /** @type {{label: string, options: {icon: string, iconsize: number, label: string, link: boolean, url: string, ellipsis: boolean, divider: boolean, iconCssClass: string, target: string, value: string, options: [], cssClass: string } }[]} */\n    export let items = [];\n    /** @type {boolean} */\n    export let responsive = true;\n\n    $: arrowClass = arrow ? `arrow-${arrowPosition}` : '';\n\n    $: hidden = expanded ? '' : 'hidden';\n\n    $: notResponsiveClass = responsive ? '' : 'prom-dropdown--not-responsive';\n\n    $: if (items || expanded !== null) {\n        setTimeout(() => {\n            tabTrapper.init();\n        }, 0);\n    }\n\n    function clickHandler(event) {\n        if (!root.contains(event.target)) {\n            dispatch('dropdownClose', event);\n        }\n    }\n\n    function globalKeyHandler(event) {\n        const { key } = event;\n\n        switch (normalizeKey(key)) {\n            case Keys.ESCAPE:\n                if (expanded) {\n                    keyHandler(event);\n                }\n                break;\n            case Keys.TAB:\n                dispatch('dropdownClose', event);\n                break;\n            default:\n                return;\n        }\n    }\n\n    function keyHandler(event) {\n        const { key } = event;\n\n        switch (normalizeKey(key)) {\n            case Keys.ESCAPE:\n                if (openSubmenus()) {\n                    hideOpenSubmenus();\n                    returnFocusToParentDropdown();\n                    event.stopPropagation();\n                } else {\n                    dispatch('dropdownClose', event);\n                }\n                break;\n            case Keys.UP:\n                break;\n            case Keys.DOWN:\n                break;\n        default:\n            return;\n        }\n    }\n\n    function selectOption(event) {\n        dispatch('selectedOption', { event, data: event.detail.data.value });\n        dispatch('dropdownClose', event);\n    }\n\n    onMount(() => {\n        tabTrapper = new TabTrapHelper(root);\n    });\n</script>\n","<section\n    class=\"prom-button-dropdown-overlay {overlayClass}\"\n    on:click={toggle}\n>\n</section>\n\n<section\n    class=\"prom-button-dropdown prom-dropdown__{position}\"\n    {id}\n>\n    <IconButton\n        iconClass={cssClass}\n        id=\"{id}-button\"\n        {iconOnly}\n        {iconPlacement}\n        {expanded}\n        {large}\n        {text}\n        {textOnly}\n        {type}\n        {disabled}\n        {ariaLabel}\n        haspopup\n        htmlType=\"button\"\n        on:click={toggle}\n        on:keyup={keyUpHandler}\n        on:keydown={keyDownHandler}\n    />\n\n    <Dropdown\n        {arrow}\n        {arrowPosition}\n        {expanded}\n        {items}\n        {responsive}\n        id=\"{id}-list\"\n        on:dropdownClose={closeHandler}\n        on:submenuClose={submenuHandler}\n        on:selectedOption\n        >\n\n        <section slot=\"header\">\n            <slot name=\"header\"></slot>\n        </section>\n\n        <section slot=\"footer\">\n            <slot name=\"footer\"></slot>\n        </section>\n    </Dropdown>\n\n</section>\n\n<script>\n    import IconButton from '../../../inputs/IconButton/v1/IconButton.svelte';\n    import Dropdown from '../../Dropdown/v1/Dropdown.svelte';\n    import { focusFirstItemIn, hideOpenSubmenus, removeFocusFromParentDropdown } from '../../Dropdown/v1/dropdownHelper.js';\n    import { Keys } from '@itslearning/atlas/keyboard/keys';\n    import { normalizeKey } from '@itslearning/atlas/keyboard/normalize';\n    import { createEventDispatcher } from 'svelte';\n\n    const dispatch = createEventDispatcher();\n\n    $: arrowPosition = position === 'up' ? 'bottom' : 'top';\n    $: cssClass = textOnly ?  '' : iconClass;\n    $: overlayClass = responsive && expanded ? 'prom-button-dropdown-overlay--visible' : '';\n\n    /** @type {boolean} */\n    export let arrow = true;\n    /** @type {string} */\n    export let iconClass = 'prom-button-dropdown-icon';\n    /** @type {boolean} */\n    export let expanded = false;\n    /** @type {boolean} */\n    export let disabled = false;\n    /** @type {boolean} */\n    export let iconOnly = false;\n    /** @type {'start'|'end'} */\n    export let iconPlacement = 'start';\n    /** @type {string} */\n    export let id = 'button-dropdown';\n    /** @type {Object[]} */\n    export let items = [];\n    /** @type {boolean} */\n    export let large = false;\n    /** @type {string} */\n    export let position = 'down';\n    /** @type {boolean} */\n    export let responsive = true;\n    /** @type {string} */\n    export let text = 'ChangeMe';\n    /** @type {boolean} */\n    export let textOnly = true;\n    /** @type {string} */\n    export let type = 'primary';\n    /** @type {string} */\n    export let ariaLabel = undefined;\n\n    function closeHandler({ detail: event }) {\n        const buttonElement = document.querySelector('#' + id + '-button');\n\n        if (buttonElement && buttonElement.contains(event.target)) {\n            return;\n        }\n\n        const { key } = event;\n\n        expanded = false;\n\n        switch (normalizeKey(key)) {\n            case Keys.ESCAPE:\n                returnFocus();\n                break;\n            default:\n                return;\n        }\n    }\n\n    function submenuHandler(event) {\n        event.stopPropagation();\n        hideOpenSubmenus();\n    }\n\n    function keyDownHandler(event) {\n        const { key } = event;\n\n        switch (normalizeKey(key)) {\n            case Keys.DOWN: {\n                event.preventDefault();\n                expanded = true;\n                const dropdown = document.querySelector('#' + id);\n\n                setTimeout(() => focusFirstItemIn(dropdown), 0);\n                break;\n            }\n            case Keys.TAB:\n                hideOpenSubmenus();\n                removeFocusFromParentDropdown();\n                expanded = false;\n                break;\n            case Keys.ENTER:\n            case Keys.SPACE:\n                event.preventDefault();\n                toggle(event, true);\n                break;\n            default:\n                return;\n        }\n    }\n\n    function keyUpHandler(event) {\n        const { key } = event;\n\n        switch (normalizeKey(key)) {\n            case Keys.ESCAPE:\n                expanded = false;\n                returnFocus();\n                break;\n        default:\n            return;\n        }\n    }\n\n    function toggle(event, setFocus = false) {\n        event.preventDefault();\n        dispatch('beforeToggle', event);\n\n        expanded = !expanded;\n\n        if (items.length && setFocus) {\n            const dropdown = document.querySelector('#' + id);\n\n            setTimeout(() => focusFirstItemIn(dropdown), 0);\n        }\n    }\n\n    function returnFocus() {\n        const buttonElement = document.querySelector('#' + id + '-button');\n\n        buttonElement.focus();\n    }\n</script>\n","<!--htmlhint inline-style-disabled:false -->\n\n<svelte:window on:keyup={keyUpHandler} on:resize={windowResize} />\n\n{#if enabled}\n    <div class=\"prom-modal2__wrapper\">\n        <div class=\"prom-modal2__backdrop\" on:click={() => clickOutsideCloses && cancel()}></div>\n        <section\n            {id}\n            bind:this={dialogElement}\n            role=\"dialog\"\n            class=\"prom-modal2__dialog\"\n            class:prom-modal2__dialog--wide={wide}\n            style={modalStyle}\n            aria-labelledby=\"{id}-header\"\n            aria-describedby={describedById}\n            aria-modal=\"true\">\n\n            <h1 id=\"{id}-header\" class=\"prom-modal2__header\">\n                <slot name=\"title\" />\n                {#if titleText}{titleText}{/if}\n            </h1>\n\n            <div class=\"prom-modal2__inner\">\n                <div\n                    class=\"prom-modal2__content\"\n                    bind:this={contentElement}\n                    on:scroll={contentScroll}>\n\n                    {#if $$slots.banner}\n                        <div class=\"prom-modal2__banner-slot\">\n                            <slot name=\"banner\" />\n                        </div>\n                    {/if}\n\n                    {#if !titleOnly}\n                        <div id=\"{id}-body\" class=\"prom-modal2__body\" class:prom-modal2__body--scroll={scrollBody}>\n                            <slot name=\"body\" />\n                            {#if bodyText}{bodyText}{/if}\n                            {#if bodyHtml}{@html bodyHtml}{/if}\n                        </div>\n                    {/if}\n                </div>\n\n                <div class=\"prom-modal2__content-gradient\">\n                    <div\n                        class=\"prom-modal2__content-gradient--inner\"\n                        style={gradientStyle}\n                    ></div>\n                </div>\n\n                <div class=\"prom-modal2__footer\">\n                    <slot name=\"footer\">\n                        <Button\n                            type={confirmButtonType}\n                            htmlType=\"button\"\n                            on:click={confirm}\n                            text={confirmText}\n                            large\n                        />\n                        {#if showCancel}\n                        <Button\n                            type={cancelButtonType}\n                            htmlType=\"button\"\n                            on:click={cancel}\n                            text={cancelText}\n                            large\n                        />\n                        {/if}\n                    </slot>\n                </div>\n\n            </div>\n        </section>\n    </div>\n{/if}\n\n<script>\n    import TabTrapHelper from '../../../../lib/helpers/TabTrapHelper';\n    import { normalizeKey } from '@itslearning/atlas/keyboard/normalize';\n    import { Keys } from '@itslearning/atlas/keyboard/keys';\n    import Button from '../../../inputs/Button/v1/Button.svelte';\n    import { createEventDispatcher } from 'svelte';\n\n    const dispatch = createEventDispatcher();\n\n    /** @type {string} Defaults to a random string */\n    export let id = Math.random().toString(36).substr(2, 16);\n    /** @type {boolean} */\n    export let enabled = false;\n    /** @type {boolean} */\n    export let wide = false;\n    /** @type {boolean} */\n    export let titleOnly = false;\n    /** @type {string} */\n    export let confirmText = undefined;\n    /** @type {string} */\n    export let cancelText = undefined;\n    /** @type {string} */\n    export let titleText = undefined;\n    /** @type {string} */\n    export let bodyText = undefined;\n    /** @type {string} */\n    export let bodyHtml = undefined;\n    /** @type {boolean} If the cancel button should be included, remember even without it\n     * the modal can still be canceled with escape or clicking the backdrop.*/\n    export let showCancel = true;\n    /** @type {boolean} If the body slot should scroll on its own without the title.*/\n    export let scrollBody = false;\n    /** @type {string} */\n    export let describedBy = undefined;\n\n    /** @type {string|'basic'|'basic-negative'|'primary'|'secondary'|'destructive'|'plain'} */\n    export let confirmButtonType = 'primary';\n    /** @type {string|'basic'|'basic-negative'|'primary'|'secondary'|'destructive'|'plain'} */\n    export let cancelButtonType = 'secondary';\n\n    /** @type {boolean} */\n    export let clickOutsideCloses = true;\n\n    let hasScroll = false;\n    let contentScrollRemaining = 50;\n    let scrollContainer = document.querySelector('html');\n    let promptResolve = undefined;\n    let modalStyle = '';\n\n    let focusedBeforeModal = undefined;\n    let tabTrapper = undefined;\n\n    let dialogElement;\n    let contentElement;\n\n    let gradientStyle;\n\n    $: {\n        let height = 0;\n\n        if (hasScroll) {\n            height = Math.min(contentScrollRemaining, 30);\n        }\n\n        gradientStyle = `height: ${height}px;`;\n    }\n\n    $: describedById =describedBy || `${id}-body`;\n\n    let previouslyEnabled = false;\n\n    $: if (enabled && !previouslyEnabled) {\n        previouslyEnabled = enabled;\n        onOpen();\n    } else if (!enabled && previouslyEnabled) {\n        previouslyEnabled = enabled;\n        onClose();\n    }\n\n    $: if (enabled && wide) {\n        windowResize();\n    }\n\n    function onOpen() {\n        focusedBeforeModal = document.activeElement;\n\n        scrollContainer.classList.add('prom-modal2--open-within');\n\n        // Run window resize in case window sizes have changed while\n        // the modal was disabled\n        windowResize();\n\n        // Set timeout to let the dialog enter the DOM\n        setTimeout(() => {\n            if (dialogElement) {\n                const buttons = dialogElement.querySelectorAll('button');\n                tabTrapper = new TabTrapHelper(dialogElement);\n\n                tabTrapper.init();\n\n                // Focus the last button in the dialog, either the cancel button\n                // or confirm if there is only one\n                if (buttons.length) {\n                    buttons[buttons.length - 1].focus();\n                }\n            }\n        }, 0);\n\n        // Run windowResize again after animations have completed\n        setTimeout(() => windowResize(), 300);\n    }\n\n    export function reinitTabTrapper() {\n        if (tabTrapper) {\n            tabTrapper.init();\n        }\n    }\n\n    function onClose() {\n        scrollContainer.classList.remove('prom-modal2--open-within');\n\n        // Return focus to the element that was focused before opening\n        if (focusedBeforeModal) {\n            focusedBeforeModal.focus();\n        }\n\n        // Disable the tab trap\n        if (tabTrapper) {\n            tabTrapper.teardown();\n        }\n    }\n\n    function keyUpHandler(event) {\n        if (enabled && (normalizeKey(event.key) === Keys.ESCAPE)) {\n            cancel(event);\n        }\n    }\n\n    function windowResize() {\n        if (!enabled) {\n            return;\n        }\n\n        // size-700 from top and bottom\n        const verticalGap = 24 * 2;\n\n        // Max modal height is 600 and the page height\n        // Do not apply the 600 height limit on small screens, let\n        // the modal fill the screen in all dimensions\n        let maxHeight = window.innerWidth > 640\n            ? Math.min(window.innerHeight - verticalGap, wide ? 1200 : 600)\n            : window.innerHeight - verticalGap;\n\n        modalStyle = `max-height: ${maxHeight}px;`;\n\n        setTimeout(() => {\n            if (contentElement) {\n                hasScroll = contentElement.clientHeight !== contentElement.scrollHeight;\n            }\n        }, 0);\n    }\n\n    function cancel() {\n        enabled = false;\n\n        dispatch('close', { confirmed: false });\n        dispatch('cancel');\n\n        if (promptResolve) {\n            promptResolve(false);\n        }\n    }\n\n    function confirm() {\n        enabled = false;\n\n        dispatch('close', { confirmed: true });\n        dispatch('confirm');\n\n        if (promptResolve) {\n            promptResolve(true);\n        }\n    }\n\n    export function prompt(properties) {\n        if (properties.titleOnly !== undefined) titleOnly = properties.titleOnly;\n        if (properties.confirmText !== undefined) confirmText = properties.confirmText;\n        if (properties.cancelText !== undefined) cancelText = properties.cancelText;\n        if (properties.titleText !== undefined) titleText = properties.titleText;\n        if (properties.bodyText !== undefined) bodyText = properties.bodyText;\n        if (properties.bodyHtml !== undefined) bodyHtml = properties.bodyHtml;\n        if (properties.titleOnly !== undefined) titleOnly = properties.titleOnly;\n        if (properties.showCancel !== undefined) showCancel = properties.showCancel;\n        if (properties.describedBy !== undefined) describedBy = properties.describedBy;\n        if (properties.confirmButtonType !== undefined) confirmButtonType = properties.confirmButtonType;\n        if (properties.cancelButtonType !== undefined) cancelButtonType = properties.cancelButtonType;\n\n        enabled = true;\n\n        return new Promise(resolve => {\n            promptResolve = resolve;\n        });\n    }\n\n    function contentScroll() {\n        const scrollHeight = contentElement.scrollHeight;\n        const clientHeight = contentElement.clientHeight;\n        const scrollTop = contentElement.scrollTop;\n\n        contentScrollRemaining = scrollHeight - (clientHeight + scrollTop);\n    }\n</script>\n","<script>\n    import { onMount, createEventDispatcher } from 'svelte';\n    import IconButton from './../../../inputs/IconButton/v1/IconButton.svelte';\n\n    const dispatch = createEventDispatcher();\n\n    /** @type {'info'|'warning'|'loading'|'success'} */\n    export let type = 'info';\n    /** @type {boolean} */\n    export let visible = false;\n    /** @type {string} */\n    export let text = null;\n    /** @type {string} */\n    export let html = null;\n    /** @type {string} */\n    export let close = null;\n    /** @type {boolean} */\n    export let closable = true;\n    /** @type {'icon'|'secondary'} */\n    export let closeButtonType = 'icon';\n    /** @type {string} */\n    export let infoText = 'information';\n    /** @type {string} */\n    export let warningText = 'warning';\n    /** @type {string} */\n    export let loadingText = 'loading';\n    /** @type {string} */\n    export let successText = 'success';\n\n    /** internal */\n    let showMessage = false;\n\n    $: closeText =\n        close ||\n        !closable ||\n        console.warn('Banner close text is required but not included!');\n\n    let ariaLive = '';\n\n    $: {\n        ariaLive = { info: 'polite', warning: 'assertive' }[type] || 'polite';\n    }\n\n    let role = '';\n\n    $: {\n        role = { info: 'status', warning: 'alert' }[type] || 'status';\n    }\n\n    $: roleText = { info: infoText, warning: warningText, loading: loadingText, success: successText }[type];\n\n    $: onMount(() => {\n        if (visible) {\n            // Render the live-area container first, then show the message inside on the next frame\n            setTimeout(() => {\n                showMessage = visible;\n            }, 200);\n        }\n    });\n\n    $: {\n        // If the banner has been made visible show the message on the next frame\n        if (visible) {\n            setTimeout(() => {\n                showMessage = true;\n            }, 100);\n        } else {\n            showMessage = false;\n        }\n    }\n\n    function hide(event) {\n        visible = false;\n        dispatch('hidden', { event });\n    }\n</script>\n\n{#if visible}\n    <div class=\"prom-banner prom-banner--{type}\">\n        <div class=\"prom-banner__icon\" aria-hidden=\"true\"></div>\n        <span\n            class=\"prom-banner__message\"\n            aria-live=\"{ariaLive}\"\n            role=\"{role}\"\n            aria-atomic=\"true\">\n            {#if showMessage}\n                <span class=\"screen-reader\">{roleText}</span>\n                {#if text} {text} {/if}\n                {#if html} {@html html} {/if}\n                <slot />\n            {/if}\n        </span>\n        {#if closable}\n            <IconButton type=\"plain\" htmlType=\"button\" iconOnly={true} iconClass=\"close-button\" on:click=\"{hide}\"></IconButton>                     \n        {/if}\n    </div>\n{/if}\n","const config = window.plansConfig;\r\n\r\nexport default config;\r\n","const i18n = window.plansConfig.i18n;\r\n\r\nexport default i18n;\r\n","// @ts-check\r\n\r\n/**\r\n * @module network/NetworkError\r\n */\r\n\r\n/** Class representing a network error */\r\nexport default class NetworkError extends Error {\r\n    /**\r\n     * Create a NetworkError\r\n     * @param {string} message - Error description (inherited from Error)\r\n     * @param {Object} response - HTTP response object\r\n     */\r\n    constructor(\r\n        message,\r\n        response\r\n    ) {\r\n        super(message);\r\n\r\n        this.response = response;\r\n    }\r\n};\r\n","/**\r\n * HTTP Status Codes.\r\n * @module network/responseStatuses\r\n */\r\nexport const ResponseStatuses = Object.freeze({\r\n    // Success\r\n    ok: 200,\r\n    created: 201,\r\n    accepted: 202,\r\n    nonAuthoritativeInformation: 203,\r\n    noContent: 204,\r\n    resetContent: 205,\r\n    partialContent: 206,\r\n    // Redirection\r\n    multipleChoices: 300,\r\n    movedPermanently: 301,\r\n    found: 302,\r\n    seeOther: 303,\r\n    notModified: 304,\r\n    useProxy: 305,\r\n    temporaryRedirect: 307,\r\n    // Client error\r\n    badRequest: 400,\r\n    unauthorized: 401,\r\n    paymentRequired: 402,\r\n    forbidden: 403,\r\n    notFound: 404,\r\n    methodNotAllowed: 405,\r\n    notAcceptable: 406,\r\n    proxyAuthenticationRequired: 407,\r\n    requestTimeout: 408,\r\n    conflict: 409,\r\n    gone: 410,\r\n    // Server error\r\n    internalServerError: 500,\r\n    notImplemented: 501,\r\n    badGateway: 502,\r\n    serviceUnavailable: 503,\r\n    gatewayTimeout: 504,\r\n    httpVersionNotSupported: 505,\r\n});\r\n","// @ts-check\r\n\r\n/**\r\n * @module network/fetch\r\n */\r\n\r\nimport NetworkError from './NetworkError';\r\nimport { ResponseStatuses } from './responseStatuses';\r\n\r\n/**\r\n * Fires a networked POST request with data serialized to json to an api\r\n * endpoint with the required options for api calls in itslearning\r\n * @param {string} url - the url of the endpoint to post the data to\r\n * @param {object} data - data object to post with the request (will be JSON stringified)\r\n * @param {object} [options] - Optional options for overriding the fetch defaults\r\n * @param {string} [options.cache='default'] - cache mode of the request: default, reload, no-cache\r\n * @param {string} [options.mode=cors] - mode of the request: cors, no-cors, same-origin, navigate\r\n * @param {string} [options.credentials=same-origin] - credentials of the request: omit, same-origin, include\r\n * @param {object} [options.headers] - additional headers for the request\r\n * @returns {Promise} the json response returned by the api or the text if the response is not json\r\n */\r\nexport function post(url, data, options = {}) {\r\n    return new Promise((resolve, reject) => {\r\n        fetch(url, fetchOptions('POST', JSON.stringify(data), options))\r\n            .then(tryParseResponse)\r\n            .then(resolve)\r\n            .catch(reject);\r\n    });\r\n}\r\n\r\n/**\r\n * Fires a networked PUT request with data serialized to json to an api\r\n * endpoint with the required options for api calls in itslearning\r\n * @param {string} url - the url of the endpoint to post the data to\r\n * @param {object} data - data object to post with the request (will be JSON stringified)\r\n * @param {object} [options] - Optional options for overriding the fetch defaults\r\n * @param {string} [options.cache='default'] - cache mode of the request: default, reload, no-cache\r\n * @param {string} [options.mode=cors] - mode of the request: cors, no-cors, same-origin, navigate\r\n * @param {string} [options.credentials=same-origin] - credentials of the request: omit, same-origin, include\r\n * @param {object} [options.headers] - additional headers for the request\r\n * @returns {Promise} the json response returned by the api or the text if the response is not json\r\n */\r\nexport function put(url, data, options = {}) {\r\n    return new Promise((resolve, reject) => {\r\n        fetch(url, fetchOptions('PUT', JSON.stringify(data), options))\r\n            .then(tryParseResponse)\r\n            .then(resolve)\r\n            .catch(reject);\r\n    });\r\n}\r\n\r\n/**\r\n * Fires a networked PATCH request with data serialized to json to an api endpoint\r\n * @param {string} url - the url of the endpoint to post the data to\r\n * @param {object} data - data object to post with the request (will be JSON stringified)\r\n * @param {object} [options] - Optional options for overriding the fetch defaults\r\n * @param {string} [options.cache='default'] - cache mode of the request: default, reload, no-cache\r\n * @param {string} [options.mode=cors] - mode of the request: cors, no-cors, same-origin, navigate\r\n * @param {string} [options.credentials=same-origin] - credentials of the request: omit, same-origin, include\r\n * @param {object} [options.headers] - additional headers for the request\r\n * @returns {Promise} the json response returned by the api or the text if the response is not json\r\n */\r\nexport function patch(url, data, options = {}) {\r\n    return new Promise((resolve, reject) => {\r\n        fetch(url, fetchOptions('PATCH', JSON.stringify(data), options))\r\n            .then(tryParseResponse)\r\n            .then(resolve)\r\n            .catch(reject);\r\n    });\r\n}\r\n\r\n/**\r\n * Fires a networked DELETE request with data serialized to json to an api endpoint - delete is a reserved\r\n * word in javascript so this method is called del\r\n * @param {string} url - the url of the endpoint to post the data to\r\n * @param {object} data - data object to post with the request (will be JSON stringified)\r\n * @param {object} [options] - Optional options for overriding the fetch defaults\r\n * @param {string} [options.cache='default'] - cache mode of the request: default, reload, no-cache\r\n * @param {string} [options.mode=cors] - mode of the request: cors, no-cors, same-origin, navigate\r\n * @param {string} [options.credentials=same-origin] - credentials of the request: omit, same-origin, include\r\n * @param {object} [options.headers] - additional headers for the request\r\n * @returns {Promise} the json response returned by the api or the text if the response is not json\r\n */\r\nexport function del(url, data, options = {}) {\r\n    return new Promise((resolve, reject) => {\r\n        fetch(url, fetchOptions('DELETE', JSON.stringify(data), options))\r\n            .then(tryParseResponse)\r\n            .then(resolve)\r\n            .catch(reject);\r\n    });\r\n}\r\n\r\n/**\r\n * Fires a networked GET request to an endpoint\r\n * @param {string} url - the url of the endpoint to GET\r\n * @param {object} [options] - Optional options for overriding the fetch defaults\r\n * @param {string} [options.cache='default'] - cache mode of the request: default, reload, no-cache\r\n * @param {string} [options.mode=cors] - mode of the request: cors, no-cors, same-origin, navigate\r\n * @param {string} [options.credentials=same-origin] - credentials of the request: omit, same-origin, include\r\n * @param {object} [options.headers] - additional headers for the request\r\n * @returns {Promise} the json response returned by the api or the text if the response is not json\r\n */\r\nexport function get(url, options = {}) {\r\n    return new Promise((resolve, reject) => {\r\n        fetch(url, fetchOptions('GET', undefined, options))\r\n            .then(tryParseResponse)\r\n            .then(resolve)\r\n            .catch(reject);\r\n    });\r\n}\r\n\r\n/**\r\n * @param {Response} response The fetch response which may or may not be json\r\n * @returns {any} The parsed JSON response, undefined if there is no content or the text content of the response\r\n * @throws {Error} When response is not OK. And error object would have its response property initialized with rejected resonse object.\r\n */\r\nexport function tryParseResponse(response) {\r\n    if (!response.ok) {\r\n        throw new NetworkError(response.statusText, response);\r\n    }\r\n\r\n    // In case of 204 - NO CONTENT return undefined\r\n    if (response.status === ResponseStatuses.noContent) {\r\n        return new Promise((resolve) => resolve(undefined));\r\n    }\r\n\r\n    // response body can only be read once so clone before trying .json()\r\n    // so that we can fall back to .text() if needed\r\n    return response.clone().json().catch(() => response.text());\r\n}\r\n\r\n/**\r\n * Fires a networked GET request to an endpoint with the required options for\r\n * api calls in itslearning\r\n * @param {string} method - The method this fetch request will use (GET, PATCH, POST, DELETE, PUT)\r\n * @param {string} [body] - What to send as the fetch request's body\r\n * @param {object} [options] - Optional options for overriding the fetch defaults\r\n * @param {string} [options.cache='default'] - cache mode of the request: default, reload, no-cache\r\n * @param {string} [options.mode=cors] - mode of the request: cors, no-cors, same-origin, navigate\r\n * @param {string} [options.credentials=same-origin] - credentials of the request: omit, same-origin, include\r\n * @param {object} [options.headers] - additional headers for the request\r\n * @returns {object} A RequestInit object for fetch request options\r\n */\r\nexport function fetchOptions(method, body, options) {\r\n    return {\r\n        method,\r\n        mode: options.mode !== undefined ? options.mode : 'cors',\r\n        cache: options.cache !== undefined ? options.cache : 'default',\r\n        credentials: options.credentials !== undefined ? options.credentials : 'same-origin',\r\n        headers: Object.assign({\r\n            'Content-Type': 'application/json; charset=utf-8',\r\n        }, options.headers),\r\n        body,\r\n    };\r\n}\r\n","/**\r\n * Constants used in the App\r\n *  (ie: endpoints, images, ...)\r\n */\r\n\r\nexport const backLinkDestinations = {\r\n    current: 0,\r\n    past: 1,\r\n    withoutDate: 2,\r\n    topic: 3,\r\n    topics: 4,\r\n    overview: 5,\r\n    calendar: 6,\r\n    myPage: 7,\r\n    parentDashboard: 8,\r\n    all: 10,\r\n    tableView: 11\r\n};\r\n\r\nexport const plannerViews = {\r\n    notDefined: 0,\r\n    current: 1,\r\n    past: 2,\r\n    withoutDate: 3,\r\n    topic: 4,\r\n    tableView: 5\r\n};\r\n\r\nexport const plannerTabIds = {\r\n    current: 0,\r\n    past: 1,\r\n    withoutDate: 2,\r\n    topics: 3,\r\n    all: 10\r\n};\r\n\r\nexport const readyMadeContentImportStatus = {\r\n    none: 0,\r\n    notImported: 1,\r\n    fullyImported: 2\r\n}\r\n\r\nexport const plannerSelfPacedTabIds = {\r\n    topics: 0,\r\n    all: 1\r\n};\r\n\r\nexport const readyMadeContentTemplateTypes = {\r\n    yourCourses: 0,\r\n    courseTemplates: 1,\r\n    fromPublishers: 2,\r\n    otherSites: 3\r\n};\r\n\r\nexport const endpoints = {\r\n    // API Endpoints\r\n    addCloudFilesToCourseFolder: planId =>\r\n        `/restapi/personal/courses/{courseId}/folders/{folderId}/file/cloud/v1?planId=${planId}`,\r\n    addFileRepoFilesToCourseFolder: planId =>\r\n        `/restapi/personal/courses/{courseId}/folders/{folderId}/file/filerepo/v1?planId=${planId}`,\r\n    getRecentCloudElements:\r\n        \"/restapi/personal/cloudproxy/recentfiles/{cloudService}/{filesCount}/{includeFolders}/{includeSharedFiles}\",\r\n    getRecentElements:\r\n        \"/restapi/personal/courses/{courseId}/resources/lastupdated/v1?elementType={elementType}\",\r\n    printPlans: (courseId, planIds, selectedView) =>\r\n        `/plans/courses/${courseId}/printPlans?planIds=${planIds.join()}&selectedView=${selectedView}`,\r\n    printPlansTbl: (courseId, planIds, selectedView) =>\r\n        `/plans/courses/${courseId}/printPlansTbl?planIds=${planIds.join()}&selectedView=${selectedView}`,\r\n    printAllPlansTbl: (courseId, topicIds, selectedView) =>\r\n        `/plans/courses/${courseId}/printAllPlansTbl?topicIds=${topicIds.join()}&selectedView=${selectedView}`,\r\n    printTopics: (courseId, topicIds, planIds) =>\r\n        `/plans/courses/${courseId}/printTopics?topicIds=${topicIds.join()}${\r\n            planIds && planIds.length ? `&planIds=${planIds.join()}` : \"\"\r\n        }`,\r\n    hasAnyPlan: courseId => `/plans/courses/${courseId}/hasAnyPlan`,\r\n    getAvailabilityOfTemplateTypes: (courseId, topicId) =>\r\n        `/restapi/personal/course/${courseId}/plans/availableTemplates/v1?topicId=${topicId}`,\r\n    searchForCourses: (options, paging) =>\r\n        `/restapi/course/templates/v1?search=${options.title}&PageNumber=${paging.pageIndex}&PageSize=${paging.pageSize}&sortDescending=${options.sortDescending}&availabilityType=${options.availabilityType}&organisationId=${options.organisationId}&selectedCourseId=${options.selectedCourseId}&selectedTopicId=${options.selectedTopicId}&isPush=${options.isPush}&requireTopics=${options.requireTopics}`,\r\n    searchForPlannerTemplates: (options, paging) =>\r\n        `/restapi/course/templates/shareableplanner/v1?search=${options.title}&PageNumber=${paging.pageIndex}&PageSize=${paging.pageSize}&sortDescending=${options.sortDescending}&publishersOnly=${options.publishersOnly}&organisationId=${options.organisationId}`,\r\n    getTopicsFromCourse: (courseId, templateCourseId, paging) =>\r\n        `/restapi/course/${courseId}/import/templates/course/${templateCourseId}/topics/v2?PageIndex=${paging.pageIndex}&PageSize=${paging.pageSize}`,\r\n    getTopicsFromShareablePlanner: (courseId, templateCourseId, type) =>\r\n        `/restapi/course/${courseId}/import/templates/shareableplanner/${templateCourseId}/topics/v1?elementType=${type}`,\r\n    getPlansInTopicFromCourse: (courseId, templateCourseId, topicId, paging) =>\r\n        `/restapi/course/${courseId}/import/templates/course/${templateCourseId}/topics/${topicId}/plans/v1?PageIndex=${paging.pageIndex}&PageSize=${paging.pageSize}`,\r\n    getResourcesFromTemplateCourse: (courseId, templateCourseId, topicId, planId, paging, type) =>\r\n        `/restapi/course/${courseId}/import/templates/course/${templateCourseId}/topics/${topicId}/plans/${planId}/resources/v1?PageIndex=${paging.pageIndex}&PageSize=${paging.pageSize}&type=${type}`,\r\n    importResources: courseId => `/restapi/personal/course/${courseId}/plans/importResources/v1`,\r\n    saveUserPreferencePageSize: courseId =>\r\n        `/restapi/course/${courseId}/import/preferences/readymadecontent/pagesize/v1`\r\n};\r\n\r\nexport const pages = {\r\n    addTopic: courseId => `/plans/courses/${courseId}/addedittopic`,\r\n    editTopic: (courseId, topicId) => `/plans/courses/${courseId}/addedittopic/${topicId}`\r\n};\r\n\r\nexport const icons = {\r\n    assignment: \"icons/assignment.svg\",\r\n    course: \"icons/graduation_cap.svg\",\r\n    googleDrive: \"icons/xp/googledrive.svg\",\r\n    googleDriveDefault: \"icons/xp/google_file.svg\",\r\n    library: \"icons/library.svg\",\r\n    office365: \"icons/office365.svg\",\r\n    onedrive: \"icons/microsoft-onedrive-2019.svg\",\r\n    task: \"icons/task.svg\",\r\n    test: \"icons/test.svg\",\r\n    readyMadeContent: \"icons/graduation_cap.svg\"\r\n};\r\n\r\nexport const resourceIcons = {\r\n    AssignmentApp: icons.assignment,\r\n    Assignment: icons.assignment,\r\n    CustomActivity: icons.task,\r\n    TestApp: icons.test,\r\n    Test: icons.test\r\n};\r\n\r\n// Map received assignment and test element names to both possible menu items\r\n// because the endpoint does not differentiate between the two so it could be either\r\nexport const elementNameMenuNameMap = {\r\n    Assignment: [\"AssignmentApp\", \"Assignment\"],\r\n    Test: [\"TestApp\", \"Test\"],\r\n    CustomActivity: [\"CustomActivity\"],\r\n    Note: [\"Note\"],\r\n    Lesson: [\"Page\"],\r\n    WebLink: [\"Link\"]\r\n};\r\n\r\nexport const courseResourcesPageSize = 24;\r\nexport const getCoursesForCopyPageSize = 100;\r\nexport const pageSizeInCalendar = 3;\r\nexport const plansForTopicPageSize = 50;\r\nexport const defaultPageSize = 8;\r\nexport const defaultPageSizePaginationTableView = 15;\r\n\r\nexport const columnTypes = {\r\n    RichText: 0,\r\n    Topic: 1,\r\n    Plan: 3,\r\n    PlanDescription: 4,\r\n    Date: 5,\r\n    ClassHours: 6,\r\n    LearningObjectives: 7,\r\n    Resources: 8,\r\n    Activities: 9,\r\n    Term: 10,\r\n    Rubric: 11,\r\n    Elements: 12,\r\n    Thumbnail: 13,\r\n    TopicThumbnail: 14\r\n};\r\n\r\nexport const columnVisibility = {\r\n    All: 1,\r\n    Teacher: 0,\r\n    Nobody: 2\r\n};\r\n\r\nexport const learningObjectiveType = {\r\n    Subject: 1,\r\n    Folder: 2,\r\n    LearningObjective: 3,\r\n    Category: 4\r\n};\r\n\r\nexport const plannerFieldType = {\r\n    RichText: 0,\r\n    Topic: 1,\r\n    PlanTitle: 3,\r\n    PlanDescription: 4,\r\n    Date: 5,\r\n    ClassHours: 6,\r\n    LearningObjectives: 7,\r\n    Resources: 8,\r\n    Activities: 9,\r\n    Term: 10,\r\n    Rubric: 11,\r\n    Elements: 12,\r\n    Thumbnail: 13,\r\n    TopicThumbnail: 14\r\n};\r\n\r\nexport const resourceTypeToShow = {\r\n    everything: 0,\r\n    resources: 1,\r\n    activities: 2\r\n};\r\n\r\nexport const elementCategory = {\r\n    Resource: 0,\r\n    Activity: 1\r\n};\r\n\r\nexport const courseAvailabilityType = {\r\n    all: \"All\",\r\n    mineOnly: \"MineOnly\",\r\n    other: \"Other\"\r\n};\r\n\r\nexport const listTypes = {\r\n    courseList: 0,\r\n    topicList: 1,\r\n    planList: 2,\r\n    resourceList: 3\r\n};\r\n\r\nexport const plannerFieldTypeReversed = reverseObject(plannerFieldType);\r\n\r\nfunction reverseObject(obj) {\r\n    const newObj = {};\r\n\r\n    Object.keys(obj).forEach(key => (newObj[obj[key]] = key));\r\n\r\n    return newObj;\r\n}\r\n\r\nexport const defaultFromHour = \"08\";\r\nexport const defaultToHour = \"09\";\r\n\r\nexport const plannerFilesUploadStatus = {\r\n    none: 0,\r\n    inProgress: 1,\r\n    success: 2,\r\n    error: 3\r\n};\r\n\r\nexport const minTitleLength = 1;\r\nexport const maxTitleLength = 255;\r\n\r\nexport const topicsActionType = {\r\n    Copy: 0,\r\n    Print: 1,\r\n    Delete: 2\r\n};\r\n\r\nexport const plansActionType = {\r\n    MakeVisible: 0,\r\n    MakeNotVisible: 1,\r\n    SetDate: 2,\r\n    Copy: 3,\r\n    Print: 4,\r\n    Delete: 5,\r\n    ConnectToCalendar: 6\r\n};\r\n\r\nexport const plansCopyActionModal = {\r\n    SelectCourse: 0,\r\n    SelectTopic: 1,\r\n    SelectWithoutTopic: 2\r\n};\r\n\r\nexport const weekDays = {\r\n    // for setPlansTimeSpan and setPlansWeekAndDay api\r\n    Monday: 1,\r\n    Tuesday: 2,\r\n    Wednesday: 4,\r\n    Thursday: 8,\r\n    Friday: 16,\r\n    Saturday: 32,\r\n    Sunday: 64\r\n};\r\n\r\nexport const planSorting = {\r\n    NotSetValue: 1,\r\n    CreationDateValue: 2,\r\n    DateAscendingValue: 3,\r\n    DateDescendingValue: 4,\r\n    AlphabeticallyAZValue: 5,\r\n    AlphabeticallyZAValue: 6,\r\n    YourOwnSortingValue: 7\r\n};\r\n\r\nexport const plansOrder = Object.freeze({\r\n    default: 0,\r\n    topic: 1,\r\n    tableView: 2\r\n});\r\n\r\nexport const TABLE_VIEW_PLANS_REFRESH_RESOURCES_EVENT_NAME =\r\n    \"itsl-tableview-plans-refresh-resources\";\r\n\r\nexport const dateTimePickerModalFromSection = \"datetime-picker-modal__from\";\r\nexport const dateTimePickerModalToSection = \"datetime-picker-modal__to\";\r\nexport const datePickerButton = \"prom-date-picker__picker-button\";\r\nexport const fromDatePickerInputField = \"prom-input-date-picker-from-input\";\r\nexport const toDatePickerInputField = \"prom-input-date-picker-to-input\";\r\n\r\nexport const noTopicTopicId = 0;\r\n\r\nexport const BACK_DESTINATION_QUERY_STRING_PARAMETER = \"BackDestination\";\r\nexport const TABLE_VIEW_MODE_QUERY_STRING_PARAMETER = \"TableViewMode\";\r\nexport const TOPIC_ID_DESTINATION_QUERY_STRING_PARAMETER = \"TopicId\";\r\n\r\nexport const planType = Object.freeze({\r\n    deadLineDriven: 0,\r\n    onePlanAtATime: 1,\r\n    allPlansAtOnce: 2\r\n});\r\n\r\nexport const onePlanAtATimePlanStatus = Object.freeze({\r\n    locked: 0,\r\n    unlocked: 1,\r\n    inProgress: 2,\r\n    reopened: 3,\r\n    completed: 4\r\n});\r\n","/**\r\n * Api handlers for the App.\r\n * These will expose functions using the endpoints to call itslearning api's\r\n */\r\nimport { del, get, post, put } from \"@itslearning/atlas/network/fetch\";\r\nimport config from \"./config\";\r\nimport {\r\n    endpoints,\r\n    pageSizeInCalendar,\r\n    planSorting,\r\n    plansForTopicPageSize,\r\n    defaultPageSize,\r\n    defaultPageSizePaginationTableView\r\n} from \"./constants.js\";\r\n\r\nconst headers = () => ({\r\n    headers: {\r\n        [config.antiForgeryHeaderName]: config.antiForgeryHeaderValue\r\n    }\r\n});\r\n\r\nconst pageSize = defaultPageSize;\r\nconst pageSizeTableView = defaultPageSizePaginationTableView;\r\n\r\nconst getQueryStringPaging = (pageIndex, pageSize, childId) =>\r\n    `&PageIndex=${pageIndex}&PageSize=${pageSize}&ChildId=${childId}`;\r\n\r\n/**\r\n * Gets a dictionary containing all the counts for plans in a course (All plans, current plans, past plans, plans without date)\r\n *\r\n * @export\r\n * @return {Dictionary} All plan counts\r\n */\r\nexport const getAllPlanCounts = () =>\r\n    get(`/restapi/personal/course/${config.courseId}/plans/counts/v1`);\r\n\r\n/**\r\n * For public link, gets a dictionary containing all the counts for plans in a course (All plans, current plans, past plans, plans without date)\r\n *\r\n * @export\r\n * @return {Dictionary} All plan counts\r\n */\r\nexport const getAllPlanCountsPublic = () =>\r\n    get(`/restapi/planner/anonymous2/${config.publicAccessKey}/counts/v1`);\r\n\r\n/**\r\n * Gets plans for this week\r\n */\r\nexport const getPlansThisWeek = () =>\r\n    get(`/restapi/personal/course/${config.courseId}/plans/week/v1`);\r\n\r\n/**\r\n * Gets last opened plan\r\n */\r\nexport const getLastOpenedPlan = () =>\r\n    get(`/restapi/personal/course/${config.courseId}/plans/lastOpened/v1`);\r\n\r\nexport const getSelfPacedPlansToWorkOn = () =>\r\n    get(`/restapi/personal/course/${config.courseId}/plans/selfpaced/toworkon/v1`);\r\n\r\n/**\r\n * Gets all plans\r\n *\r\n * @export\r\n * @param {number} [pageIndex=0] - Current page index\r\n * @return {JSON entity list} - All plans\r\n */\r\nexport const getAllPlans = (pageIndex = 0) =>\r\n    get(\r\n        `/restapi/personal/course/${config.courseId}/plans/all/v1?${getQueryStringPaging(\r\n            pageIndex,\r\n            pageSize,\r\n            config.childId\r\n        )}`\r\n    );\r\n\r\n/**\r\n * Gets all plans for public link\r\n *\r\n * @export\r\n * @param {number} [pageIndex=0] - Current page index\r\n * @return {JSON entity list} - All public plans\r\n */\r\n\r\nexport const getAllPlansPublic = (pageIndex = 0) =>\r\n    get(\r\n        `/restapi/planner/anonymous2/${config.publicAccessKey}/all/v1?&PageIndex=${pageIndex}&PageSize=${pageSize}`\r\n    );\r\n\r\n/**\r\n * Gets plans by their IDs.\r\n */\r\nexport const getPlansForCalendar = (courseId, childId, planIds, viewForPersonId, pageIndex = 0) =>\r\n    get(\r\n        `/restapi/personal/course/${courseId}/plans/selected/v1?ChildId=${childId}&planIds=${planIds.join()}&viewForPersonId=${viewForPersonId}&PageIndex=${pageIndex}&PageSize=${pageSizeInCalendar}`\r\n    );\r\n\r\n/**\r\n * Gets plans for printing by their IDs.\r\n */\r\nexport const getPlansForPrinting = (planIds, selectedView) =>\r\n    get(\r\n        `/restapi/personal/course/${\r\n            config.courseId\r\n        }/plans/print/v1?planIds=${planIds.join()}&selectedView=${selectedView}`\r\n    );\r\n\r\n/**\r\n * Gets plans for printing by their IDs.\r\n */\r\nexport const getPlansForPrintingTable = planIds =>\r\n    get(\r\n        `/restapi/personal/course/${config.courseId}/plans/print/table/v1?planIds=${planIds.join()}`\r\n    );\r\n\r\n/**\r\n * Gets topics and their plans. Only single topic ID can be passed if topicIds is not null.\r\n */\r\nexport function getTopicsWithPlansForPrinting(topicIds, planIds) {\r\n    const planIdsParameter = planIds && planIds.length ? `&planIds=${planIds.join()}` : \"\";\r\n\r\n    return get(\r\n        `/restapi/personal/course/${config.courseId}/plans/print/topics/v1?topicIds=${topicIds}${planIdsParameter}`\r\n    );\r\n}\r\n\r\n/**\r\n * Gets plans that are ongoing or haven't started yet\r\n */\r\nexport const getCurrentPlans = (pageIndex = 0) =>\r\n    get(\r\n        `/restapi/personal/course/${config.courseId}/plans/current/v1?${getQueryStringPaging(\r\n            pageIndex,\r\n            pageSize,\r\n            config.childId\r\n        )}`\r\n    );\r\n\r\n/**\r\n * Gets plans that are ongoing or haven't started yet\r\n */\r\nexport const getCurrentPlansPublic = (pageIndex = 0) =>\r\n    get(\r\n        `/restapi/planner/anonymous2/${config.publicAccessKey}/current/v1?&PageIndex=${pageIndex}&PageSize=${pageSize}`\r\n    );\r\n\r\n/**\r\n * Gets plans that have no dates\r\n */\r\nexport const getWithoutDatePlans = (pageIndex = 0) =>\r\n    get(\r\n        `/restapi/personal/course/${config.courseId}/plans/without-date/v1?${getQueryStringPaging(\r\n            pageIndex,\r\n            pageSize,\r\n            config.childId\r\n        )}`\r\n    );\r\n\r\n/**\r\n * Gets plans that have no dates\r\n */\r\nexport const getWithoutDatePlansPublic = (pageIndex = 0) =>\r\n    get(\r\n        `/restapi/planner/anonymous2/${config.publicAccessKey}/without-date/v1?&PageIndex=${pageIndex}&PageSize=${pageSize}`\r\n    );\r\n\r\n/**\r\n * Gets plans that have already finished\r\n */\r\nexport const getPastPlans = (pageIndex = 0) =>\r\n    get(\r\n        `/restapi/personal/course/${config.courseId}/plans/past/v1?${getQueryStringPaging(\r\n            pageIndex,\r\n            pageSize,\r\n            config.childId\r\n        )}`\r\n    );\r\n\r\n/**\r\n * Gets plans that have already finished\r\n */\r\nexport const getPastPlansPublic = (pageIndex = 0) =>\r\n    get(\r\n        `/restapi/planner/anonymous2/${config.publicAccessKey}/past/v1?&PageIndex=${pageIndex}&PageSize=${pageSize}`\r\n    );\r\n\r\n/**\r\n * Gets all Topics for plans\r\n */\r\nexport const getTopics = () =>\r\n    get(`/restapi/personal/course/${config.courseId}/plans/topics/v1?ChildId=${config.childId}`);\r\n\r\n/**\r\n * Gets all Topics for plans\r\n */\r\nexport const getTopicsPublic = () =>\r\n    get(`/restapi/planner/anonymous2/${config.publicAccessKey}/topics/v1`);\r\n\r\n/**\r\n * Gets a single plan by its id\r\n */\r\nexport const getPlan = (planId = config.planId) =>\r\n    get(`/restapi/personal/course/${config.courseId}/plans/${planId}/v2?ChildId=${config.childId}`);\r\n\r\n/**\r\n * Gets a single plan by its id\r\n */\r\nexport const getPlanPublic = (planId = config.planId) =>\r\n    get(`/restapi/planner/anonymous2/${config.publicAccessKey}/${planId}/v2`);\r\n\r\n/**\r\n * Gets a single topic by its id\r\n */\r\nexport const getTopic = (topicId = config.topic) =>\r\n    get(\r\n        `/restapi/personal/course/${config.courseId}/plans/topics/${topicId}/v1?ChildId=${config.childId}`\r\n    );\r\n\r\n/**\r\n * Gets a single topic by its id\r\n */\r\nexport const getTopicPublic = (topicId = config.topic) =>\r\n    get(`/restapi/planner/anonymous2/${config.publicAccessKey}/topics/${topicId}/v1`);\r\n\r\n/**\r\n * Gets a random colour for topic\r\n * Re-using endpoint for old planner\r\n * First parameter in post is endpoint, second data (undefined), third is options\r\n * There is a tech-debt for anti-forgery check (TRK-6737, or this could be a GET instead).\r\n */\r\nexport const getTopicRandomColour = () =>\r\n    post(\r\n        `/restapi/planner/topic/getRandomColorSchemeForNewTopic/${config.courseId}`,\r\n        undefined,\r\n        headers()\r\n    );\r\n\r\nexport const createTopic = (title, colour) =>\r\n    post(\r\n        `/restapi/planner/topic/addTopic`,\r\n        { CourseId: config.courseId, topicName: title, topicColorSchema: colour },\r\n        headers()\r\n    );\r\n\r\nexport const updateTopicColor = (topicId, colorId) =>\r\n    post(\r\n        `/restapi/planner/topic/setTopicColorSchema`,\r\n        { CourseId: config.courseId, topicId, topicColorSchema: colorId },\r\n        headers()\r\n    );\r\n\r\nexport const updateTopicTitle = (topicId, title) =>\r\n    post(\r\n        `/restapi/planner/column/updatetopictitle/v2`,\r\n        { courseId: config.courseId, topicId, data: title },\r\n        headers()\r\n    );\r\n\r\nexport const getPlansInTopic = (topicId, pageIndex = 0, planOrder = planSorting.NotSetValue) =>\r\n    get(\r\n        `/restapi/personal/course/${\r\n            config.courseId\r\n        }/plans/topics/${topicId}/plans/v1?${getQueryStringPaging(\r\n            pageIndex,\r\n            pageSize,\r\n            config.childId\r\n        )}&PlanOrder=${planOrder}`\r\n    );\r\n\r\nexport const getPlansInTopicPublic = (\r\n    topicId,\r\n    pageIndex = 0,\r\n    planOrder = planSorting.NotSetValue\r\n) =>\r\n    get(\r\n        `/restapi/planner/anonymous2/${config.publicAccessKey}/topics/${topicId}/plans/v1?PageIndex=${pageIndex}&PageSize=${pageSize}&PlanOrder=${planOrder}`\r\n    );\r\n\r\nexport const setPlanTitle = (planId, title) =>\r\n    post(\r\n        \"/restapi/planner/column/updateplantitle/v2\",\r\n        { courseId: config.courseId, planId: planId, data: title },\r\n        headers()\r\n    );\r\n\r\nexport const setPlanClassHours = (planId, classHours) =>\r\n    post(\r\n        \"/restapi/planner/column/updateplanclasshours/v2\",\r\n        { courseId: config.courseId, planId: planId, data: classHours },\r\n        headers()\r\n    );\r\n\r\nexport const setPlanDescription = (planId, description) =>\r\n    post(\r\n        \"/restapi/planner/column/updateplandescription\",\r\n        {\r\n            courseId: config.courseId,\r\n            planId: planId,\r\n            data: description,\r\n            skipPlainTextDataTrimming: true\r\n        },\r\n        headers()\r\n    );\r\n\r\nexport const setPlanTimeSpan = (planId, startTime, stopTime) =>\r\n    put(\r\n        \"/restapi/planner/plandate/timespan/v2\",\r\n        {\r\n            courseId: config.courseId,\r\n            planId,\r\n            showPlanDates: true,\r\n            start: startTime,\r\n            stop: stopTime\r\n        },\r\n        headers()\r\n    );\r\n\r\nexport const setPlanWeekAndDay = (planId, startTime, stopTime) =>\r\n    post(\r\n        \"/restapi/planner/plandate/weekandday\",\r\n        {\r\n            CourseId: config.courseId,\r\n            PlanId: planId,\r\n            showPlanDates: true,\r\n            start: startTime,\r\n            stop: stopTime\r\n        },\r\n        headers()\r\n    );\r\n\r\n/**\r\n * Update the course events.\r\n * If array of activity ids is empty, all existing connections will be removed.\r\n */\r\nexport const updatePlanEvents = (planId, activityIds) =>\r\n    post(\r\n        `/restapi/planner/planDate/events`,\r\n        {\r\n            courseId: config.courseId,\r\n            planId: planId,\r\n            activityIds: activityIds,\r\n            filterStartDate: null,\r\n            filterStopDate: null,\r\n            showPlanDates: true\r\n        },\r\n        headers()\r\n    );\r\n\r\nexport const createPlan = planParams =>\r\n    post(\r\n        \"/restapi/planner/plan/add\",\r\n        {\r\n            TopicId: planParams.topic ? planParams.topic.id : null,\r\n            Start: planParams.start,\r\n            End: planParams.stop,\r\n            CourseId: config.courseId\r\n        },\r\n        headers()\r\n    );\r\n\r\nexport const startPlan = (courseId, planId) =>\r\n    put(`/restapi/course/${courseId}/plans/${planId}/progress/start/v1`, undefined, headers());\r\n\r\nexport const completePlan = (courseId, planId) =>\r\n    put(`/restapi/course/${courseId}/plans/${planId}/progress/completion/v1`, undefined, headers());\r\n\r\nexport const uncompletePlan = (courseId, planId) =>\r\n    del(`/restapi/course/${courseId}/plans/${planId}/progress/completion/v1`, undefined, headers());\r\n\r\nexport const togglePlansStatus = (\r\n    planIds,\r\n    activate,\r\n    toggleElementsActivation,\r\n    isBulkAction,\r\n    executeForAllPlans = false,\r\n    topicIds = []\r\n) => {\r\n    const requestModel = {\r\n        courseId: config.courseId,\r\n        activate,\r\n        toggleElementsActivation,\r\n        isBulkAction\r\n    };\r\n\r\n    if (executeForAllPlans) {\r\n        requestModel.executeForAllPlans = true;\r\n        requestModel.topicIds = topicIds;\r\n    } else {\r\n        requestModel.planIds = planIds;\r\n    }\r\n\r\n    return put(\"/restapi/planner/plan/multiple/status/v2\", requestModel, headers());\r\n};\r\n\r\nexport function getLearningObjectives(nodeId, params = {}) {\r\n    const loPageSize = 100;\r\n    const pageIndex = 0;\r\n\r\n    const defaultParams = {\r\n        omitItems: false,\r\n        omitFolders: false,\r\n        includeUnpublished: false,\r\n        setRootAsParent: false,\r\n        selectableCategory: false,\r\n        selectableLearningObjective: true,\r\n        SelectableSubject: false,\r\n        cutOffLoStructure: true,\r\n        encoding: 1\r\n    };\r\n\r\n    params = { ...defaultParams, ...params };\r\n\r\n    const paramString = Object.keys(params)\r\n        .map(p => `${p}=${params[p]}`)\r\n        .join(\"&\");\r\n\r\n    return get(\r\n        `/restapi/course/learningobjective/repository/all/v1?CourseID=${config.courseId}&nodeId=${nodeId}&page=${pageIndex}&pageSize=${loPageSize}&${paramString}`\r\n    );\r\n}\r\n\r\nexport const setPlanLearningObjectives = (planId, learningObjectiveIds) =>\r\n    post(\r\n        \"/restapi/planner/learningObjective/plan\",\r\n        { courseId: config.courseId, planId, learningObjectiveIds },\r\n        headers()\r\n    );\r\n\r\nexport const removePlanLearningObjective = (planId, learningObjectiveId) =>\r\n    del(\r\n        \"/restapi/planner/learningObjective/plan\",\r\n        { courseId: config.courseId, planId, learningObjectiveId },\r\n        headers()\r\n    );\r\n\r\nexport async function setPlanImage(planId, file) {\r\n    const formData = new FormData();\r\n\r\n    formData.append(\"file\", file, file.name);\r\n\r\n    const rawResult = await fetch(\r\n        `/restapi/planner/plan/thumbnail/${config.courseId}/${planId}/v1`,\r\n        {\r\n            body: formData,\r\n            method: \"post\",\r\n            mode: \"cors\",\r\n            cache: \"default\",\r\n            credentials: \"same-origin\",\r\n            headers: { [config.antiForgeryHeaderName]: config.antiForgeryHeaderValue }\r\n        }\r\n    );\r\n\r\n    return await rawResult.json();\r\n}\r\n\r\nexport const uploadPlanImage = (planId, uploadImageFileRepoId, uploadImageSignedFileRepoId, uploadImageDescriptionText, uploadImageChanged) =>\r\n    post(\r\n        `/restapi/planner/plan/planImage/v1`,\r\n        { planId, courseId: config.courseId, uploadImageFileRepoId, uploadImageSignedFileRepoId, uploadImageDescriptionText, uploadImageChanged },\r\n        headers()\r\n    );\r\n\r\nexport const removePlanImage = planId =>\r\n    del(\r\n        config.isImageUploaderInPlansEnabled\r\n            ? \"/restapi/planner/plan/planImage/v1\"\r\n            : \"/restapi/planner/plan/thumbnail/v1\",\r\n        { PlanId: planId, CourseId: config.courseId },\r\n        headers()\r\n    );\r\n\r\nexport const addElementsToPlan = (elementIds, planId, columnId, partialUpdate) =>\r\n    post(\r\n        `/restapi/planner/element/updatePlanElements`,\r\n        { planId, courseId: config.courseId, columnId, elementIds, partialUpdate },\r\n        headers()\r\n    );\r\n\r\nexport async function getRecentElements(elementType) {\r\n    const endpoint = endpoints.getRecentElements\r\n        .replace(\"{courseId}\", config.courseId)\r\n        .replace(\"{elementType}\", elementType);\r\n\r\n    const result = await get(endpoint);\r\n\r\n    return result.EntityArray;\r\n}\r\n\r\nexport const getRecentCloudElements = async (cloudService, recentCloudElementsSettings) =>\r\n    get(\r\n        endpoints.getRecentCloudElements\r\n            .replace(\"{cloudService}\", cloudService)\r\n            .replace(\"{filesCount}\", recentCloudElementsSettings.filesCount)\r\n            .replace(\"{includeSharedFiles}\", recentCloudElementsSettings.includeSharedFiles)\r\n            .replace(\"{includeFolders}\", recentCloudElementsSettings.includeFolders)\r\n    );\r\n\r\n/**\r\n * Connect plan to a topic\r\n */\r\nexport const connectToTopic = (planId, topicId) =>\r\n    post(\r\n        `/restapi/planner/plan/connectToTopic`,\r\n        { CourseId: config.courseId, PlanId: planId, TopicId: topicId },\r\n        headers()\r\n    );\r\n\r\n/**\r\n * Connect plan to a topic with option to move elements to new topic folder\r\n */\r\nexport const connectToTopicV2 = (planId, sourceTopicId, destinationTopicId) =>\r\n    post(\r\n        `/restapi/planner/plan/connectToTopic/v2`,\r\n        { CourseId: config.courseId, PlanId: planId, SourceTopicId: sourceTopicId, DestinationTopicId: destinationTopicId },\r\n        headers()\r\n    );\r\n\r\n/**\r\n * Move any elements that could be moved to new folder when changing topic in plan\r\n */\r\nexport const moveElementsInTopicFolderForPlan = (planId, sourceTopicId, destinationTopicId) =>\r\n    post(\r\n        `/restapi/planner/plan/moveElementsInTopicFolderForPlan`,\r\n        { CourseId: config.courseId, PlanId: planId, SourceTopicId: sourceTopicId, DestinationTopicId: destinationTopicId },\r\n        headers()\r\n    );\r\n\r\n/**\r\n * Remove topic from a plan\r\n */\r\nexport const removeTopic = planId =>\r\n    post(\r\n        `/restapi/planner/plan/removeTopic`,\r\n        { CourseId: config.courseId, PlanId: planId },\r\n        headers()\r\n    );\r\n\r\nexport const deletePlanElement = (planId, elementId) =>\r\n    post(\r\n        `/restapi/planner/element/deletePlanElement`,\r\n        {\r\n            CourseId: config.courseId,\r\n            PlanId: planId,\r\n            ElementId: elementId,\r\n            DeleteFromCourse: false\r\n        },\r\n        headers()\r\n    );\r\n\r\nexport function deletePlanElementFromCourse(planId, elementId) {\r\n    return post(\r\n        `/restapi/planner/element/deletePlanElement`,\r\n        {\r\n            CourseId: config.courseId,\r\n            PlanId: planId,\r\n            ElementId: elementId,\r\n            DeleteFromCourse: true\r\n        },\r\n        { headers: { [config.antiForgeryHeaderName]: config.antiForgeryHeaderValue } }\r\n    );\r\n}\r\n\r\nexport function getCourseResources(elementType, learningToolType, pageIndex, pageSize) {\r\n    const queryParams = [\r\n        `PageIndex=${pageIndex}`,\r\n        `PageSize=${pageSize}`,\r\n        elementType !== undefined && `ElementType=${elementType}`,\r\n        learningToolType !== undefined && `LearningToolType=${learningToolType}`\r\n    ]\r\n        .filter(p => !!p)\r\n        .join(\"&\");\r\n\r\n    return get(`/restapi/personal/courses/${config.courseId}/resources/v1?${queryParams}`);\r\n}\r\n\r\nexport function getCourseFolderResources(\r\n    folderId,\r\n    elementType,\r\n    learningToolType,\r\n    pageIndex,\r\n    pageSize\r\n) {\r\n    const queryParams = [\r\n        `PageIndex=${pageIndex}`,\r\n        `PageSize=${pageSize}`,\r\n        elementType !== undefined && `ElementType=${elementType}`,\r\n        learningToolType !== undefined && `LearningToolType=${learningToolType}`\r\n    ]\r\n        .filter(p => !!p)\r\n        .join(\"&\");\r\n\r\n    return get(\r\n        `/restapi/personal/courses/${config.courseId}/folders/${folderId}/resources/v1?${queryParams}`\r\n    );\r\n}\r\n\r\n/**\r\n * Get terms for course\r\n */\r\nexport const getCourseTerms = () =>\r\n    get(`/restapi/terms/current/${config.courseId}/v1`);\r\n\r\n\r\n/**\r\n * Update the term for a topic\r\n */\r\nexport const updateTopicTerm = (termId) =>\r\n    put(\r\n        `/restapi/planner/topicTerm/set`,\r\n        { CourseId: config.courseId, TermId: termId, TopicId: config.topicId },\r\n        headers()\r\n    );\r\n\r\n/**\r\n * Temove the term for a topic\r\n */\r\nexport const removeTopicTerm = () =>\r\n    del(\r\n        `/restapi/planner/topicTerm/remove`,\r\n        { CourseId: config.courseId, CourseTermId: 0, TopicId: config.topicId },\r\n        headers()\r\n    );\r\n\r\n/**\r\n * Remove single plan from course (i.e. when cancel a new plan creation)\r\n */\r\nexport const removePlan = planId =>\r\n    post(\r\n        `/restapi/planner/plan/multiple/remove`,\r\n        { CourseId: config.courseId, PlanIds: planId, IsBulkAction: false },\r\n        headers()\r\n    );\r\n\r\n/**\r\n * Remove multiple plans from course\r\n */\r\nexport const removePlans = (planIds, executeForAllPlans = false, topicIds = []) => {\r\n    const requestModel = { courseId: config.courseId, isBulkAction: true };\r\n\r\n    if (executeForAllPlans) {\r\n        requestModel.executeForAllPlans = true;\r\n        requestModel.topicIds = topicIds;\r\n    } else {\r\n        requestModel.planIds = planIds;\r\n    }\r\n\r\n    return del(`/restapi/planner/plan/multiple/remove/v2`, requestModel, headers());\r\n};\r\n\r\nexport const setCustomFieldText = (entityId, columnId, data) =>\r\n    post(\r\n        `/restapi/planner/column/updatecustomcolumncontent`,\r\n        {\r\n            courseId: config.courseId,\r\n            columnId: columnId,\r\n            entityId: entityId,\r\n            data: data,\r\n            replaceElementsWithPlaceholders: false,\r\n            skipPlainTextDataTrimming: true\r\n        },\r\n        headers()\r\n    );\r\n\r\nexport const setTopicLearningObjectives = (topicId, columnId, learningObjectiveIds) =>\r\n    post(\r\n        \"/restapi/planner/learningObjective/topic\",\r\n        { courseId: config.courseId, topicId, columnId, learningObjectiveIds },\r\n        headers()\r\n    );\r\n\r\nexport const removeTopicLearningObjective = (topicId, columnId, learningObjectiveId) =>\r\n    del(\r\n        \"/restapi/planner/learningObjective/topic\",\r\n        { courseId: config.courseId, topicId, columnId, learningObjectiveId },\r\n        headers()\r\n    );\r\n\r\n/**\r\n * Gets status of uploaded files to the plan\r\n */\r\nexport const getPlanFilesUploadStatus = planId =>\r\n    get(\r\n        `/restapi/planner/element/planFilesUploadStatus?courseId=${config.courseId}&planId=${planId}`\r\n    );\r\n\r\nexport const setElementOrder = (planId, columnId, elementId, elementIds) =>\r\n    post(\r\n        \"/restapi/planner/element/movePlanElement\",\r\n        {\r\n            courseId: config.courseId,\r\n            sourcePlanId: planId,\r\n            targetPlanId: planId,\r\n            columnId,\r\n            elementId,\r\n            elementIds\r\n        },\r\n        headers()\r\n    );\r\n\r\nexport const setTopicOrder = topicIds =>\r\n    put(\"/restapi/planner/topic/reorder\", { courseId: config.courseId, topicIds }, headers());\r\n\r\n/**\r\n * Gets courses for a person, with a small set of details. Used for copy plans.\r\n */\r\nexport async function getCourses(pageIndex = 0) {\r\n    const result = await get(`/restapi/personal/courses/basicinfo/v1?PageIndex=${pageIndex}`);\r\n\r\n    return result.EntityArray;\r\n}\r\n\r\n/**\r\n * Copy plan(s) from course\r\n */\r\nexport const copyPlans = (\r\n    targetCourseId,\r\n    targetTopicId,\r\n    copyDates,\r\n    copyResourcesAndActivities,\r\n    overwriteAssessmentCriteria,\r\n    plansIds,\r\n    copyWithoutTopic,\r\n    executeForAllPlans = false,\r\n    topicIds = []\r\n) => {\r\n    return post(\r\n        `/restapi/planner/copyPlanner/copyPlans/v2`,\r\n        {\r\n            SourceCourseId: config.courseId,\r\n            targetCourseId,\r\n            targetTopicId,\r\n            copyDates,\r\n            copyResourcesAndActivities,\r\n            overwriteAssessmentCriteria,\r\n            ElementIds: executeForAllPlans ? [] : plansIds,\r\n            copyWithoutTopic,\r\n            executeForAllPlans,\r\n            topicIds\r\n        },\r\n        headers()\r\n    );\r\n};\r\n\r\n/**\r\n * Gets topics name and id for a specific course (used in copy plans)\r\n */\r\nexport const getTopicsForCopyPlans = (\r\n    targetCourseId,\r\n    originalTopicId = 0 // TODO: Change this value when adding the logic to create new topic, 0 = Without topic\r\n) =>\r\n    post(\r\n        `/restapi/planner/copyPlanner/getTopicsForCopyPlans`,\r\n        {\r\n            CourseId: config.courseId,\r\n            TargetCourseId: targetCourseId,\r\n            OriginalTopicId: originalTopicId\r\n        },\r\n        { headers: { [config.antiForgeryHeaderName]: config.antiForgeryHeaderValue } }\r\n    );\r\n\r\n/**\r\n * Get available course event dates.\r\n */\r\nexport const getCalendarAvailableDates = (start, end) =>\r\n    post(\r\n        `/restapi/calendar/courseEventsInTimeFrame`,\r\n        {\r\n            CourseId: config.courseId,\r\n            StartDate: JSON.stringify(start),\r\n            EndDate: JSON.stringify(end)\r\n        },\r\n        headers()\r\n    );\r\n\r\n/**\r\n * Delete topics (move to trash can)\r\n */\r\nexport const deleteTopics = topicIds =>\r\n    post(\r\n        `/restapi/planner/topic/deleteTopics`,\r\n        { CourseId: config.courseId, TopicIds: topicIds },\r\n        headers()\r\n    );\r\n\r\n/**\r\n * Copy topics\r\n */\r\nexport const copyTopics = (\r\n    targetCourseId,\r\n    copyDates,\r\n    copyResourcesAndActivities,\r\n    overwriteAssessmentCriteria,\r\n    topicIds\r\n) =>\r\n    post(\r\n        `/restapi/planner/copyPlanner/copyTopics`,\r\n        {\r\n            SourceCourseId: config.courseId,\r\n            TargetCourseId: targetCourseId,\r\n            TargetTopicId: null,\r\n            CopyDates: copyDates,\r\n            CopyResourcesAndActivities: copyResourcesAndActivities,\r\n            OverwriteAssessmentCriteria: overwriteAssessmentCriteria,\r\n            ElementIds: topicIds\r\n        },\r\n        headers()\r\n    );\r\n\r\n/**\r\n * Set plan order for plans (i.e. under \"Without date\", \"All plans\" tabs)\r\n */\r\nexport function dragAndDropPlanInLesson(sourceId, targetId, topicId, after) {\r\n    if (sourceId === targetId) {\r\n        return;\r\n    }\r\n\r\n    return post(\r\n        `/restapi/planner/plan/dragAndDrop`,\r\n        {\r\n            sourceId: sourceId,\r\n            targetId: targetId,\r\n            insertAfterTargetItem: after,\r\n            courseId: config.courseId,\r\n            topicId: topicId\r\n        },\r\n        headers()\r\n    );\r\n}\r\n\r\n/**\r\n * Set plan order for a (single) topic after drag and drop\r\n */\r\nexport function dragAndDropPlanInTopic(sourceId, targetId, topicId, after, order) {\r\n    if (sourceId === targetId) {\r\n        return;\r\n    }\r\n\r\n    return post(\r\n        `/restapi/planner/plan/dragAndDropInTopic`,\r\n        {\r\n            sourceId,\r\n            targetId,\r\n            insertAfterTargetItem: after,\r\n            courseId: config.courseId,\r\n            topicId,\r\n            plansInTopicOrder: order\r\n        },\r\n        headers()\r\n    );\r\n}\r\n\r\n/**\r\n * Gets the plan Id for plan that is last in order\r\n */\r\nexport const getPlanLastInOrder = () =>\r\n    get(`/restapi/planner/plan/course/${config.courseId}/noTopic/order/last`);\r\n\r\n/**\r\n * Gets the plan Id for plan that is last in order for a topic\r\n */\r\nexport const getPlanLastInOrderTopic = topicId =>\r\n    get(`/restapi/planner/plan/course/${config.courseId}/topic/${topicId}/order/last`);\r\n\r\n/**\r\n * Toggle element activation\r\n */\r\nexport const activatePlanElement = (\r\n    elementId,\r\n    activate,\r\n    isFolder,\r\n    changeActivationForFolderContent\r\n) =>\r\n    put(\r\n        `/restapi/elements/${elementId}/activation/v1`,\r\n        {\r\n            IsFolder: isFolder,\r\n            Activate: activate,\r\n            ChangeActivationForFolderContent: changeActivationForFolderContent\r\n        },\r\n        headers()\r\n    );\r\n\r\n/**\r\n * Gets count of usages of element across plans in a course.\r\n */\r\nexport const getElementUsageCount = elementId =>\r\n    get(`/restapi/planner/element/getElementUsageCount?elementId=${elementId}`);\r\n\r\n/**\r\n * KPI for opening a plan card.\r\n */\r\nexport const measurePlanCardKpi = () =>\r\n    post(`/restapi/personal/course/${config.courseId}/plans/measurePlanCardKpi/v1`, {}, headers());\r\n\r\n/**\r\n * Gets the plan that is pinned.\r\n */\r\nexport const getPinnedPlan = () => get(`/restapi/planner/plan/pinned?courseId=${config.courseId}`);\r\n\r\n/**\r\n * Sets the pinned field for the given plan id.\r\n */\r\nexport const updatePlanPinned = (planId, pinned) =>\r\n    put(\r\n        `/restapi/planner/plan/pinned`,\r\n        {\r\n            CourseId: config.courseId,\r\n            PlanId: planId,\r\n            Pinned: pinned\r\n        },\r\n        { headers: { [config.antiForgeryHeaderName]: config.antiForgeryHeaderValue } }\r\n    );\r\n\r\nexport const setPlansTimeSpan = (\r\n    planIds,\r\n    startDate,\r\n    stopDate,\r\n    weekNumber,\r\n    weekDays,\r\n    order,\r\n    executeForAllPlans,\r\n    topicIds\r\n) =>\r\n    post(\r\n        `/restapi/planner/planDate/timeSpan/multiple/v2`,\r\n        getSetDateRequestModel(\r\n            planIds,\r\n            startDate,\r\n            stopDate,\r\n            weekNumber,\r\n            weekDays,\r\n            order,\r\n            executeForAllPlans,\r\n            topicIds\r\n        ),\r\n        headers()\r\n    );\r\n\r\nexport const setPlansWeekAndDay = (\r\n    planIds,\r\n    startDate,\r\n    stopDate,\r\n    weekNumber,\r\n    weekDays,\r\n    order,\r\n    executeForAllPlans,\r\n    topicIds\r\n) =>\r\n    post(\r\n        `/restapi/planner/planDate/weekAndDay/multiple/v2`,\r\n        getSetDateRequestModel(\r\n            planIds,\r\n            startDate,\r\n            stopDate,\r\n            weekNumber,\r\n            weekDays,\r\n            order,\r\n            executeForAllPlans,\r\n            topicIds\r\n        ),\r\n        headers()\r\n    );\r\n\r\nexport const setPlansTimeSpanEvents = (\r\n    planIds,\r\n    firstPlanEventIds,\r\n    executeForAllPlans = false,\r\n    topicIds = []\r\n) => {\r\n    const requestModel = {\r\n        courseId: config.courseId,\r\n        firstPlanEventIds,\r\n        filterStartDate: \"\",\r\n        filterStopDate: \"\",\r\n        isDateColumnDisplayed: true\r\n    };\r\n\r\n    if (executeForAllPlans) {\r\n        requestModel.executeForAllPlans = true;\r\n        requestModel.topicIds = topicIds;\r\n    } else {\r\n        requestModel.planIds = planIds;\r\n    }\r\n\r\n    return post(`/restapi/planner/planDate/events/multiple/v3`, requestModel, headers());\r\n};\r\n/**\r\n * Checks if plans has been reordered in topic\r\n */\r\nexport const hasPlansForTopicBeenReordered = topicId =>\r\n    get(\r\n        `/restapi/planner/plan/hasPlansForTopicBeenReordered?courseId=${config.courseId}&topicId=${topicId}`\r\n    );\r\n\r\n/**\r\n * Get plan order within topic\r\n */\r\nexport const getPlanOrderInTopic = topicId =>\r\n    get(`/restapi/planner/topic/planOrder?courseId=${config.courseId}&topicId=${topicId}`);\r\n\r\n/**\r\n * Set plan order within topic\r\n */\r\nexport const setPlanOrderInTopic = (topicId, planOrder) =>\r\n    put(\r\n        `/restapi/planner/topic/planOrder`,\r\n        {\r\n            CourseId: config.courseId,\r\n            TopicId: topicId,\r\n            PlanOrder: planOrder\r\n        },\r\n        headers()\r\n    );\r\n\r\n/**\r\n * Reset plan order within topic\r\n */\r\nexport const resetPlansInTopicOrder = (topicId, plansInTopicOrder) =>\r\n    put(\r\n        `/restapi/planner/plan/resetPlansInTopicOrder`,\r\n        {\r\n            CourseId: config.courseId,\r\n            TopicId: topicId,\r\n            PlansInTopicOrder: plansInTopicOrder\r\n        },\r\n        headers()\r\n    );\r\n\r\n/**\r\n * Copy the current order to the order in topic (e.g. case when switching from old to new planner)\r\n */\r\nexport const copyOrderToOrderInTopic = topicId =>\r\n    put(\r\n        `/restapi/planner/plan/copyOrderToOrderInTopic`,\r\n        {\r\n            CourseId: config.courseId,\r\n            TopicId: topicId\r\n        },\r\n        headers()\r\n    );\r\n\r\n/**\r\n * Stop sharing planner\r\n */\r\nexport const stopSharingPlanner = plannerShareableObjectId =>\r\n    post(\r\n        `/restapi/planner/shareablePlanner/stop`,\r\n        {\r\n            CourseId: config.courseId,\r\n            plannerShareableObjectId: plannerShareableObjectId\r\n        },\r\n        headers()\r\n    );\r\n\r\nexport const togglePlanElementsActivation = (planId, activate) =>\r\n    put(\r\n        \"/restapi/planner/plan/elements/activation\",\r\n        {\r\n            courseId: config.courseId,\r\n            planId: planId,\r\n            activateElements: activate\r\n        },\r\n        headers()\r\n    );\r\n\r\nexport const getTopicsForTableView = (pageIndex = 0, pageSize = pageSizeTableView) =>\r\n    get(\r\n        `/restapi/course/${config.courseId}/plans/tableview/topics/v1?PageIndex=${pageIndex}&PageSize=${pageSize}`\r\n    );\r\n\r\nexport const getPlansForTopicInTableView = (courseId, topicId, pageIndex) =>\r\n    get(\r\n        `/restapi/course/${courseId}/plans/tableview/topics/${topicId}/plans/v1?pageIndex=${pageIndex}&pageSize=${pageSize}`\r\n    );\r\n\r\nexport const getPlansWithoutTopicInTableView = (courseId, pageIndex) =>\r\n    get(\r\n        `/restapi/course/${courseId}/plans/tableview/topics/withoutTopic/plans/v1?pageIndex=${pageIndex}&pageSize=${pageSize}`\r\n    );\r\n\r\nexport const getTableViewPlans = (topicIds = [], pageIndex = 0, pageSize = pageSizeTableView) =>\r\n    post(\r\n        `/restapi/course/${config.courseId}/plans/tableview/v1?PageIndex=${pageIndex}&PageSize=${pageSize}&ChildId=${config.childId}`,\r\n        {\r\n            topicIds\r\n        },\r\n        headers()\r\n    );\r\n\r\nconst getSetDateRequestModel = (\r\n    planIds,\r\n    startDate,\r\n    stopDate,\r\n    weekNumber,\r\n    weekDays,\r\n    order,\r\n    executeForAllPlans,\r\n    topicIds\r\n) => {\r\n    const requestModel = {\r\n        courseId: config.courseId,\r\n        start: startDate,\r\n        stop: stopDate,\r\n        weekNumber: weekNumber,\r\n        weekDays: JSON.stringify(weekDays),\r\n        order\r\n    };\r\n\r\n    if (executeForAllPlans) {\r\n        requestModel.executeForAllPlans = true;\r\n        requestModel.topicIds = topicIds;\r\n    } else {\r\n        requestModel.planIds = planIds;\r\n    }\r\n\r\n    return requestModel;\r\n};\r\n\r\nexport const getAllPlansForPrintingTable = topicIds =>\r\n    get(\r\n        `/restapi/personal/course/${config.courseId}/plans/print/table/all/v1?topicIds=${topicIds.join()}`\r\n    );\r\n\r\nexport const getTopicCurrentPlans = (\r\n    topicId,\r\n    pageIndex = 0,\r\n    pageSize = plansForTopicPageSize,\r\n    planOrder = planSorting.NotSetValue\r\n) =>\r\n    get(\r\n        `/restapi/personal/course/${\r\n            config.courseId\r\n        }/plans/topics/${topicId}/current/v1?${getQueryStringPaging(\r\n            pageIndex,\r\n            pageSize,\r\n            config.childId\r\n        )}&PlanOrder=${planOrder}`\r\n    );\r\n\r\nexport const getTopicPastPlans = (\r\n    topicId,\r\n    pageIndex = 0,\r\n    pageSize = plansForTopicPageSize,\r\n    planOrder = planSorting.NotSetValue\r\n) =>\r\n    get(\r\n        `/restapi/personal/course/${\r\n            config.courseId\r\n        }/plans/topics/${topicId}/past/v1?${getQueryStringPaging(\r\n            pageIndex,\r\n            pageSize,\r\n            config.childId\r\n        )}&PlanOrder=${planOrder}`\r\n    );\r\n\r\nexport const getTopicWithoutDatePlans = (\r\n    topicId,\r\n    pageIndex = 0,\r\n    pageSize = plansForTopicPageSize,\r\n    planOrder = planSorting.NotSetValue\r\n) =>\r\n    get(\r\n        `/restapi/personal/course/${\r\n            config.courseId\r\n        }/plans/topics/${topicId}/without-date/v1?${getQueryStringPaging(\r\n            pageIndex,\r\n            pageSize,\r\n            config.childId\r\n        )}&PlanOrder=${planOrder}`\r\n    );\r\n\r\nexport const getTopicAllPlans = (\r\n    topicId,\r\n    pageIndex = 0,\r\n    pageSize = plansForTopicPageSize,\r\n    planOrder = planSorting.NotSetValue\r\n) =>\r\n    get(\r\n        `/restapi/personal/course/${\r\n            config.courseId\r\n        }/plans/topics/${topicId}/all/v1?${getQueryStringPaging(\r\n            pageIndex,\r\n            pageSize,\r\n            config.childId\r\n        )}&PlanOrder=${planOrder}`\r\n    );\r\n\r\n/**\r\n * Move element to another plan\r\n */\r\nexport const moveElementToPlan = (\r\n    elementId,\r\n    targetPlanId,\r\n    sourcePlanId = config.planId,\r\n    columnId = config.elementColumnId\r\n) =>\r\n    post(\r\n        `/restapi/planner/element/moveElementToPlan`,\r\n        {\r\n            courseId: config.courseId,\r\n            elementId: elementId,\r\n            sourcePlanId: sourcePlanId,\r\n            targetPlanId: targetPlanId,\r\n            columnId: columnId\r\n        },\r\n        headers()\r\n    );\r\n\r\n/**\r\n * Gets all available course template types\r\n */\r\nexport const getAvailabilityOfTemplateTypes = (courseId, topicId) =>\r\n    get(endpoints.getAvailabilityOfTemplateTypes(courseId, topicId));\r\n\r\n/**\r\n * Gets my or other course templates\r\n */\r\nexport const searchForCourses = async (options, paging) =>\r\n    get(endpoints.searchForCourses(options, paging));\r\n\r\n/**\r\n * Gets from publishers or other templates\r\n */\r\nexport const searchForPlannerTemplates = async (options, paging) =>\r\n    get(endpoints.searchForPlannerTemplates(options, paging));\r\n\r\n/**\r\n * Gets topics from course\r\n */\r\nexport const getTopicsFromCourse = (courseId, templateCourseId, paging) =>\r\n    get(endpoints.getTopicsFromCourse(courseId, templateCourseId, paging));\r\n\r\n/**\r\n * Gets topics from shareable planner\r\n */\r\nexport const getTopicsFromShareablePlanner = (courseId, templateCourseId, type) =>\r\n    get(endpoints.getTopicsFromShareablePlanner(courseId, templateCourseId, type));\r\n\r\n/**\r\n * Gets plans in topic from course\r\n */\r\nexport const getPlansInTopicFromCourse = (courseId, templateCourseId, topicId, paging) =>\r\n    get(endpoints.getPlansInTopicFromCourse(courseId, templateCourseId, topicId, paging));\r\n\r\n/**\r\n * Gets resourses from plan.\r\n * type parameter is of type ElementCategory.\r\n */\r\nexport const getResourcesFromTemplateCourse = (courseId, templateCourseId, topicId, planId, paging, type) =>\r\n    get(endpoints.getResourcesFromTemplateCourse(courseId, templateCourseId, topicId, planId, paging, type)\r\n    );\r\n\r\n/**\r\n * Import resourses\r\n */\r\nexport const importResources = (courseId, importResourcesModel) =>\r\n    post(\r\n        endpoints.importResources(courseId),\r\n        importResourcesModel,\r\n        headers()\r\n    );\r\n\r\n/**\r\n * Save user preference page size.\r\n */\r\nexport const saveUserPreferencePageSize = (courseId, pageSize) =>\r\n    put(\r\n        endpoints.saveUserPreferencePageSize(courseId),\r\n        pageSize,\r\n        headers()\r\n    );\r\n\r\n/**\r\n * Get assigned plan participants\r\n */\r\nexport const getAssignedPlanParticipants = (planId = config.planId) =>\r\n    get(`/restapi/personal/course/${config.courseId}/plans/${planId}/assigned/participants/v1`);\r\n\r\n/**\r\n * Get assigned plan groups\r\n */\r\nexport const getAssignedPlanGroups = (planId = config.planId) =>\r\n    get(`/restapi/personal/course/${config.courseId}/plans/${planId}/assigned/groups/v1`);\r\n\r\n/**\r\n * Create new plan V2\r\n */\r\nexport const createPlanV2 = planParams =>\r\n    post(\r\n        \"/restapi/planner/plan/add/v2\",\r\n        {\r\n            TopicId: planParams.topic ? planParams.topic.id : null,\r\n            Start: planParams.start,\r\n            End: planParams.stop,\r\n            CourseId: config.courseId\r\n        },\r\n        headers()\r\n    );\r\n\r\n/**\r\n * Assign a plan\r\n */\r\nexport const assignPlan = (planId, participantIds, groupIds) =>\r\n    post(\r\n        \"/restapi/planner/plan/assignto\",\r\n        {\r\n            PlanId: planId,\r\n            ParticipantIds: participantIds,\r\n            GroupIds: groupIds,\r\n            CourseId: config.courseId\r\n        },\r\n        headers()\r\n    );\r\n\r\n","import {\n\trun_all,\n\tsubscribe,\n\tnoop,\n\tsafe_not_equal,\n\tis_function,\n\tget_store_value\n} from '../internal/index.js';\n\nconst subscriber_queue = [];\n\n/**\n * Creates a `Readable` store that allows reading by subscription.\n *\n * https://svelte.dev/docs/svelte-store#readable\n * @template T\n * @param {T} [value] initial value\n * @param {import('./public.js').StartStopNotifier<T>} [start]\n * @returns {import('./public.js').Readable<T>}\n */\nexport function readable(value, start) {\n\treturn {\n\t\tsubscribe: writable(value, start).subscribe\n\t};\n}\n\n/**\n * Create a `Writable` store that allows both updating and reading by subscription.\n *\n * https://svelte.dev/docs/svelte-store#writable\n * @template T\n * @param {T} [value] initial value\n * @param {import('./public.js').StartStopNotifier<T>} [start]\n * @returns {import('./public.js').Writable<T>}\n */\nexport function writable(value, start = noop) {\n\t/** @type {import('./public.js').Unsubscriber} */\n\tlet stop;\n\t/** @type {Set<import('./private.js').SubscribeInvalidateTuple<T>>} */\n\tconst subscribers = new Set();\n\t/** @param {T} new_value\n\t * @returns {void}\n\t */\n\tfunction set(new_value) {\n\t\tif (safe_not_equal(value, new_value)) {\n\t\t\tvalue = new_value;\n\t\t\tif (stop) {\n\t\t\t\t// store is ready\n\t\t\t\tconst run_queue = !subscriber_queue.length;\n\t\t\t\tfor (const subscriber of subscribers) {\n\t\t\t\t\tsubscriber[1]();\n\t\t\t\t\tsubscriber_queue.push(subscriber, value);\n\t\t\t\t}\n\t\t\t\tif (run_queue) {\n\t\t\t\t\tfor (let i = 0; i < subscriber_queue.length; i += 2) {\n\t\t\t\t\t\tsubscriber_queue[i][0](subscriber_queue[i + 1]);\n\t\t\t\t\t}\n\t\t\t\t\tsubscriber_queue.length = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @param {import('./public.js').Updater<T>} fn\n\t * @returns {void}\n\t */\n\tfunction update(fn) {\n\t\tset(fn(value));\n\t}\n\n\t/**\n\t * @param {import('./public.js').Subscriber<T>} run\n\t * @param {import('./private.js').Invalidator<T>} [invalidate]\n\t * @returns {import('./public.js').Unsubscriber}\n\t */\n\tfunction subscribe(run, invalidate = noop) {\n\t\t/** @type {import('./private.js').SubscribeInvalidateTuple<T>} */\n\t\tconst subscriber = [run, invalidate];\n\t\tsubscribers.add(subscriber);\n\t\tif (subscribers.size === 1) {\n\t\t\tstop = start(set, update) || noop;\n\t\t}\n\t\trun(value);\n\t\treturn () => {\n\t\t\tsubscribers.delete(subscriber);\n\t\t\tif (subscribers.size === 0 && stop) {\n\t\t\t\tstop();\n\t\t\t\tstop = null;\n\t\t\t}\n\t\t};\n\t}\n\treturn { set, update, subscribe };\n}\n\n/**\n * Derived value store by synchronizing one or more readable stores and\n * applying an aggregation function over its input values.\n *\n * https://svelte.dev/docs/svelte-store#derived\n * @template {import('./private.js').Stores} S\n * @template T\n * @overload\n * @param {S} stores - input stores\n * @param {(values: import('./private.js').StoresValues<S>, set: (value: T) => void, update: (fn: import('./public.js').Updater<T>) => void) => import('./public.js').Unsubscriber | void} fn - function callback that aggregates the values\n * @param {T} [initial_value] - initial value\n * @returns {import('./public.js').Readable<T>}\n */\n\n/**\n * Derived value store by synchronizing one or more readable stores and\n * applying an aggregation function over its input values.\n *\n * https://svelte.dev/docs/svelte-store#derived\n * @template {import('./private.js').Stores} S\n * @template T\n * @overload\n * @param {S} stores - input stores\n * @param {(values: import('./private.js').StoresValues<S>) => T} fn - function callback that aggregates the values\n * @param {T} [initial_value] - initial value\n * @returns {import('./public.js').Readable<T>}\n */\n\n/**\n * @template {import('./private.js').Stores} S\n * @template T\n * @param {S} stores\n * @param {Function} fn\n * @param {T} [initial_value]\n * @returns {import('./public.js').Readable<T>}\n */\nexport function derived(stores, fn, initial_value) {\n\tconst single = !Array.isArray(stores);\n\t/** @type {Array<import('./public.js').Readable<any>>} */\n\tconst stores_array = single ? [stores] : stores;\n\tif (!stores_array.every(Boolean)) {\n\t\tthrow new Error('derived() expects stores as input, got a falsy value');\n\t}\n\tconst auto = fn.length < 2;\n\treturn readable(initial_value, (set, update) => {\n\t\tlet started = false;\n\t\tconst values = [];\n\t\tlet pending = 0;\n\t\tlet cleanup = noop;\n\t\tconst sync = () => {\n\t\t\tif (pending) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcleanup();\n\t\t\tconst result = fn(single ? values[0] : values, set, update);\n\t\t\tif (auto) {\n\t\t\t\tset(result);\n\t\t\t} else {\n\t\t\t\tcleanup = is_function(result) ? result : noop;\n\t\t\t}\n\t\t};\n\t\tconst unsubscribers = stores_array.map((store, i) =>\n\t\t\tsubscribe(\n\t\t\t\tstore,\n\t\t\t\t(value) => {\n\t\t\t\t\tvalues[i] = value;\n\t\t\t\t\tpending &= ~(1 << i);\n\t\t\t\t\tif (started) {\n\t\t\t\t\t\tsync();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\tpending |= 1 << i;\n\t\t\t\t}\n\t\t\t)\n\t\t);\n\t\tstarted = true;\n\t\tsync();\n\t\treturn function stop() {\n\t\t\trun_all(unsubscribers);\n\t\t\tcleanup();\n\t\t\t// We need to set this to false because callbacks can still happen despite having unsubscribed:\n\t\t\t// Callbacks might already be placed in the queue which doesn't know it should no longer\n\t\t\t// invoke this derived store.\n\t\t\tstarted = false;\n\t\t};\n\t});\n}\n\n/**\n * Takes a store and returns a new one derived from the old one that is readable.\n *\n * https://svelte.dev/docs/svelte-store#readonly\n * @template T\n * @param {import('./public.js').Readable<T>} store  - store to make readonly\n * @returns {import('./public.js').Readable<T>}\n */\nexport function readonly(store) {\n\treturn {\n\t\tsubscribe: store.subscribe.bind(store)\n\t};\n}\n\nexport { get_store_value as get };\n","<script>\n    /** @type {'primary'|'secondary'|'standalone'|'primary-standalone'} */\n    export let kind = 'primary';\n    /** @type {string} */\n    export let href = '#';\n    /** @type {string} */\n    export let rel = '';\n    /** @type {string} */\n    export let iconClass = '';\n    /** @type {'start'|'end'} */\n    export let iconPlacement = 'start';\n    /** @type {string} */\n    export let target = '_self';\n    /** @type {boolean} */\n    export let large = false;\n    /** @type {string} */\n    export let label = null;\n    /** @type {string} */\n    export let text = undefined;\n    /** @type {string} */\n    export let ping = undefined;\n    /** @type {boolean} */\n    export let standalone = false;\n    /** @type {boolean} */\n    export let downloadable = false;\n    /** @type {string} */\n    export let fileName = null;\n\n    $: download = downloadable ? fileName || '' : null;\n\n    $: icon =\n        kind === 'standalone' && iconClass\n            ? 'prom-link--icon ' + iconPlacementClass + iconClass\n            : '';\n\n    $: iconPlacementClass =\n        iconPlacement === 'start'\n            ? 'prom-link--icon-start '\n            : 'prom-link--icon-end ';\n\n    if (standalone) {\n        kind = 'standalone';\n    }\n\n    $: {\n        if (iconClass && kind !== 'standalone') {\n            console.warn(\n                \"Icons can only be added to links in 'standalone' mode.\"\n            );\n        }\n\n        if (iconClass && !text && !label) {\n            console.warn(\n                \"Links must have discernible text. If it is an icon-only link, use 'label' to add hidden text.\"\n            );\n        }\n    }\n</script>\n\n<a\n    class=\"prom-link prom-link--{kind} {icon}\"\n    class:prom-link--large={large}\n    {href}\n    {rel}\n    {target}\n    {ping}\n    {download}\n    aria-label={label}\n    on:click\n>\n    <slot />\n    {#if text}{text}{/if}\n</a>\n","<script>\n    import Link from '../../../Navigation/Link/v1/Link.svelte';\n    import Button from '../../../inputs/Button/v1/Button.svelte';\n\n    /** @type {string} */\n    export let description = '';\n    /** @type {string} */\n    export let title = '';\n    /** @type {'h2'|'h3'|'h4'}*/\n    export let headingLevel = 'h2';\n    /** @type {string} **/\n    export let iconName = 'default';\n    /** @type {'vertical'|'horizontal'} */\n    export let orientation = 'vertical';\n    /**  @type {'center'|'left'} */\n    export let alignment = 'center';\n    /** @type {boolean} */\n    export let showButton = false;\n    /** @type {string} */\n    export let buttonText = undefined;\n    /** @type {'submit'|'button'|'reset'} */\n    export let buttonHtmlType = 'submit';\n    /** @type {boolean} */\n    export let showLink = false;\n    /** @type {'standalone'|'primary-standalone'} */\n    export let linkType = 'standalone';\n    /** @type {string} */\n    export let linkText = undefined;\n    /** @type {boolean} */\n    export let showLoadingIndicator = false;\n    /** @type {string} */\n    export let href = '';\n    /** @type {string} */\n    export let target = '_self';\n\n    let iconCssClass = '';\n    let cssClass = '';\n\n    $: {\n        switch (iconName) {\n            case '360reports':\n            case 'behaviour-overview':\n            case 'courses':\n            case 'default':\n            case 'empty-folder':\n            case 'events':\n            case 'files':\n            case 'follow-up-task':\n            case 'learning-objective':\n            case 'messages':\n            case 'news':\n            case 'notifications':\n            case 'plan-topics':\n            case 'plans':\n            case 'portfolio':\n            case 'project':\n            case 'question-category':\n            case 'search-no-result':\n            case 'test-questions':\n            case 'test-results':\n            case 'trash':\n            case 'user-groups':\n            case 'user':\n                iconCssClass = `prom-empty-state__icon--${iconName}`;\n                break;\n            default:\n                console.warn('Please provide proper icon iconName');\n                iconCssClass = `prom-empty-state__icon--default`;\n        }\n    }\n\n    $: if (!['h2', 'h3', 'h4'].some((l) => l === headingLevel)) {\n        console.warn('Valid heading levels are h2, h3 and h4');\n    }\n\n    $: if (showButton && !buttonText) {\n        console.warn('Please provide button text');\n    }\n\n    $: if (showLink && !href) {\n        console.warn('Please provide a valid url for the href attribute');\n    }\n\n    $: if (showLink && !linkText) {\n        console.warn('Please provide a link text');\n    }\n\n    $: {\n        if (orientation !== 'horizontal' && orientation !== 'vertical') {\n            console.warn('Please provide a proper orientation');\n        }\n\n        if (orientation !== 'vertical' && alignment !== 'center') {\n            console.warn(\n                'Empty state does not support alignment for non-vertical state'\n            );\n        }\n\n        if (orientation === 'vertical' && alignment === 'left') {\n            cssClass = 'prom-empty-state--aligned-left';\n        } else {\n            cssClass =\n                orientation === 'horizontal'\n                    ? `prom-empty-state--${orientation}`\n                    : '';\n        }\n    }\n</script>\n\n<section class=\"prom-empty-state {cssClass}\">\n    {#if showLoadingIndicator}\n        <span class=\"prom-empty-state__icon prom-loading-spinner__spinner\"></span>\n    {:else}\n        <span class=\"prom-empty-state__icon {iconCssClass}\"></span>\n    {/if}\n    <div class=\"prom-empty-state__content-container\">\n        <svelte:element this=\"{headingLevel}\" class=\"prom-empty-state__title\">\n            {title}\n        </svelte:element>\n        <p class=\"prom-empty-state__description\">{description}</p>\n        {#if showButton}\n            <Button\n                text={buttonText}\n                type=\"primary\"\n                htmlType={buttonHtmlType}\n                on:click\n            />\n        {:else if showLink}\n            <Link\n                {href}\n                kind={linkType}\n                text={linkText}\n                {target}\n                on:click\n            />\n        {/if}\n    </div>\n</section>\n","<script>\n    import { Keys } from '@itslearning/atlas/keyboard/keys';\n    import { normalizeKey } from '@itslearning/atlas/keyboard/normalize';\n    import { onMount, createEventDispatcher } from 'svelte';\n\n    /** @type {Array} */\n    export let tabs = [];\n\n    /** @type {number} */\n    export let selectedIndex = 0;\n\n    /** @type {object} */\n    export let skipLink = undefined;\n\n    let container;\n\n    let previousSelectedIndex;\n\n    const dispatch = createEventDispatcher();\n\n    const preloadedTabs = [];\n\n    onMount(() => {\n        const panels = container.getElementsByClassName('prom-tabs__content');\n\n        for (let i = 0; i < panels.length; i++) {\n            panels[i].hidden = i !== selectedIndex;\n        }\n    });\n\n    $: if (previousSelectedIndex !== selectedIndex) {\n        if (previousSelectedIndex !== undefined) {\n            const links = container.getElementsByClassName('prom-tabs__link');\n            const panels = container.getElementsByClassName('prom-tabs__content');\n\n            if (links.length) {\n                links[selectedIndex].focus();\n            }\n\n            if (panels.length) {\n                panels[previousSelectedIndex].hidden = true;\n                panels[selectedIndex].hidden = false;\n            }\n        }\n\n        if (tabs && tabs.length > 0) {\n            dispatch('tabChanged', {\n                selectedTabIndex: selectedIndex,\n                selectedTabId: tabs[selectedIndex].id,\n            });\n        }\n\n        previousSelectedIndex = selectedIndex;\n    }\n\n    function keyHandler(event) {\n        const { key } = event;\n\n        switch (normalizeKey(key)) {\n            case Keys.LEFT: {\n                event.preventDefault();\n                changeSelectedTab(-1);\n                break;\n            }\n            case Keys.RIGHT: {\n                event.preventDefault();\n                changeSelectedTab(+1);\n                break;\n            }\n            case Keys.DOWN: {\n                event.preventDefault();\n                const panels =\n                    container.getElementsByClassName('prom-tabs__content');\n\n                panels[selectedIndex].focus();\n                break;\n            }\n        }\n    }\n\n    function clickHandler(event) {\n        const links = container.querySelectorAll('[aria-selected]');\n        const index = Array.prototype.indexOf.call(links, event.currentTarget);\n\n        event.preventDefault();\n\n        if (index !== -1 && index !== selectedIndex) {\n            changeSelectedTab(index - selectedIndex);\n        }\n    }\n\n    function preloadHandler(tab) {\n        if (!preloadedTabs.includes(tab)) {\n            preloadedTabs.push(tab);\n            dispatch('preload', {\n                tab\n            });\n        }\n    }\n\n    function changeSelectedTab(offset) {\n        const nextIndex = selectedIndex + offset;\n\n        if (nextIndex >= 0 && nextIndex < tabs.length) {\n            selectedIndex = nextIndex;\n            preloadHandler(tabs[nextIndex]);\n        }\n    }\n</script>\n\n<div bind:this={container}>\n    {#if skipLink}\n        <a\n            class=\"prom-tabs__skip-link | screen-reader screen-reader-focusable\"\n            href={skipLink.href}>{skipLink.text}</a>\n    {/if}\n    <ul role=\"tablist\" on:keydown={keyHandler} class=\"prom-tabs__tablist\">\n        {#each tabs as tab}\n            <li role=\"presentation\">\n                <a\n                    id={tab.id}\n                    role=\"tab\"\n                    href={tab.target}\n                    class=\"prom-tabs__link\"\n                    on:click={clickHandler}\n                    on:click={() => preloadHandler(tab)}\n                    on:mouseenter={() => preloadHandler(tab)}\n                    aria-selected={tabs[selectedIndex].id === tab.id}\n                    tabindex={tabs[selectedIndex].id !== tab.id ? '-1' : undefined}\n                    >{tab.title}</a>\n            </li>\n        {/each}\n    </ul>\n    <slot />\n</div>\n","// @ts-check\r\n\r\n/**\r\n * @module strings/format\r\n */\r\n\r\n/**\r\n * Replaces placeholders within a template string with corresponding values.\r\n *\r\n * @param {string} template - Template string.\r\n * @param {RegExp} regex - Regular expression to detect placeholders within template.\r\n * @param {string[]} values - Template replacement values.\r\n *\r\n * Template string placeholder format is specified by the `regex` parameter.\r\n */\r\nexport function formatString(template, regex, ...values) {\r\n    if (!template) {\r\n        throw TypeError('Template not specified');\r\n    }\r\n\r\n    if (typeof template !== 'string') {\r\n        throw TypeError('Template is not a string');\r\n    }\r\n\r\n    return template.replace(\r\n        regex,\r\n        (match, number) => number in values ? values[number] : match\r\n    );\r\n}\r\n\r\n/**\r\n * Replaces placeholders within a template string with corresponding values.\r\n *\r\n * @param {string} template - Template string.\r\n * @param {string[]} values - Template replacement values.\r\n *\r\n * Template string placeholder format: {n}, where n >= 0 and n < values.length\r\n */\r\nexport function formatLanguageString(template, ...values) {\r\n    const regex = /\\{(\\d+)\\}/g;\r\n\r\n    return formatString(template, regex, ...values);\r\n}\r\n","<script>\n    import { createEventDispatcher } from 'svelte';\n    import { guidV4 } from '@itslearning/atlas/generate/guid';\n\n    const dispatch = createEventDispatcher();\n\n    /** @type {boolean} */\n    export let checked = false;\n    /** @type {boolean} */\n    export let disabled = false;\n    /** @type {string} */\n    export let label = undefined;\n    /** @type {string} */\n    export let id = undefined;\n    /** @type {string} */\n    export let name = undefined;\n    /** @type {boolean} */\n    export let labelHidden = false;\n    /** @type {boolean} */\n    export let small = false;\n    /** @type {boolean} */\n    export let required = false;\n    /** @type {string} */\n    export let description = undefined;\n    /** @type {string} */\n    export let describedBy = undefined;\n    /** @type {string} */\n    export let elementLegacyColor = '';\n    /** @type {string} */\n    export let courseColor = '';\n    /** @type {string} */\n    export let value = '';\n\n    let checkbox;\n\n    $: disabledClass = disabled ? 'disabled' : '';\n\n    $: smallClass = small ? 'prom-checkbox--small' : '';\n\n    let labelText;\n\n    $: customColor = courseColor ? courseColor : elementLegacyColor;\n\n    $: {\n        if (!label || typeof label !== 'string') {\n            throw new TypeError('Label must be supplied');\n        }\n\n        labelText = label;\n    }\n\n    $: labelHiddenClass = labelHidden ? 'screen-reader' : '';\n\n    if (description && !describedBy) {\n        describedBy = 'prom-checkbox__information_id-' + guidV4();\n    }\n\n    /** @private */\n    function handleChanged() {\n        dispatch('change', { checked });\n    }\n</script>\n\n<label class=\"prom-checkbox {disabledClass} {smallClass}\">\n    <input\n        bind:this={checkbox}\n        class=\"prom-checkbox__input\"\n        type=\"checkbox\"\n        bind:checked\n        {disabled}\n        {name}\n        {value}\n        {id}\n        {required}\n        on:change={handleChanged}\n        aria-describedby={description ? describedBy : undefined} />\n\n    <span class=\"prom-checkbox__custom-check {customColor}\"></span>\n\n    <span class=\"prom-checkbox__label-text {labelHiddenClass}\">\n        {labelText}\n        {#if required}\n            <span aria-hidden=\"true\" class=\"prom-input__required-star\">*</span>\n        {/if}\n    </span>\n</label>\n\n{#if description}\n    <span id={describedBy} class=\"prom-checkbox__description\">\n\t\t{description}\n\t</span>\n{/if}\n","<svelte:window on:keyup={onWindowKeyUp} />\n\n<div\n    bind:this={tooltip}\n    id=\"{id}-{role}\"\n    class=\"prom-tooltip prom-tooltip-{id} prom-tooltip--{placement} {displayClass}\"\n    role=\"{role}\"\n    on:mouseenter={hoverTooltip}\n    on:mouseleave={unhoverTooltip}\n>\n    <div bind:this={arrow} id=\"tooltip-arrow\" class=\"prom-tooltip__arrow\"></div>\n    <div bind:this={tooltipContent} id=\"tooltip-content\" class=\"prom-tooltip__content\">\n        {#if text}\n            {text}\n        {:else}\n            <slot></slot>\n        {/if}\n    </div>\n</div>\n\n<script>\n    import { Keys } from '@itslearning/atlas/keyboard/keys';\n    import { normalizeKey } from '@itslearning/atlas/keyboard/normalize';\n    import { onDestroy, onMount } from 'svelte';\n\n    /** @type {Element} */\n    export let element = null;\n    /** @type {string} */\n    export let id = 'mytooltip';\n    /** @type {'top'|'left'|'right'|'bottom'} */\n    export let placement = 'top';\n    /** @type {string} */\n    export let role = 'tooltip';\n    /** @type {boolean} */\n    export let show = false;\n    /** @type {string} */\n    export let text = '';\n    export let hover = false;\n\n    let tooltip;\n    let arrow;\n    let tooltipContent;\n\n    $: displayClass = show ? '' : 'prom-tooltip__hidden';\n\n    $: if (show) {\n        updateTooltip(show);\n    }\n\n    onMount(() => {\n        setElementAttribute(show);\n    });\n\n    onDestroy(() => {\n        setElementAttribute(false);\n    });\n\n    function onWindowKeyUp(event) {\n        const key = normalizeKey(event.key);\n\n        if (key === Keys.ESCAPE) {\n            show = false;\n        }\n    }\n\n    function hoverTooltip() {\n        hover = true;\n        show = true;\n    }\n\n    function unhoverTooltip() {\n        hover = false;\n        show = false;\n    }\n\n    function updateTooltip(show) {\n        setElementAttribute(show);\n\n        if (show) {\n            setTimeout(setPosition, 0);\n        }\n    }\n\n    function setElementAttribute(isTooltipShown) {\n        if (isTooltipShown) {\n            if (element && role === 'tooltip') {\n                const describedBy = id + '-' + role;\n\n                element.setAttribute('aria-describedby', describedBy);\n            }\n        } else {\n            if (element && element.hasAttribute('aria-describedby')) {\n                element.removeAttribute('aria-describedby');\n            }\n        }\n    }\n\n    function setPosition() {\n\n        if (!element) {\n            return;\n        }\n\n        const rect = element.getBoundingClientRect();\n        const tooltipHeight = tooltip.offsetHeight;\n        const tooltipWidth = tooltip.offsetWidth;\n        const horizontalPlacementOffset = 15;\n        const verticalPlacementOffset = 15;\n\n        let left, top;\n\n        switch (placement) {\n            case 'top':\n                left = rect.left - tooltipWidth / 2 + rect.width / 2;\n                top = rect.top - tooltipHeight - horizontalPlacementOffset + window.pageYOffset;\n                break;\n            case 'bottom':\n                left = rect.left - tooltipWidth / 2 + rect.width / 2;\n                top = rect.bottom + horizontalPlacementOffset + window.pageYOffset;\n                break;\n            case 'left':\n                left = rect.left - tooltipWidth - verticalPlacementOffset;\n                top = rect.top + (rect.height - tooltipHeight) / 2 + window.pageYOffset;\n                break;\n            case 'right':\n                left = rect.right + verticalPlacementOffset;\n                top = rect.top + (rect.height - tooltipHeight) / 2 + window.pageYOffset;\n                break;\n            default:\n                break;\n        }\n\n        tooltip.style.left = left + 'px';\n        tooltip.style.top = top + 'px';\n    }\n</script>\n","<div class=\"its-plans__element-progress\" class:complete>\r\n    <span class=\"screen-reader\">{complete ? i18n.completed : i18n.notCompleted}</span>\r\n</div>\r\n\r\n<script>\r\n    export let complete;\r\n    export let i18n;\r\n</script>\r\n","<div class={\"itsl-plan-completed\"}>\r\n    <ElementProgress {i18n} complete={true} />\r\n    <span aria-hidden=\"true\">{labelText}</span>\r\n</div>\r\n\r\n<script>\r\n    import ElementProgress from \"@its-ui/planner-common/components/ElementProgress/ElementProgress.svelte\";\r\n    import i18n from \"../../i18n\";\r\n\r\n    export let labelText = i18n.completed;\r\n</script>\r\n","import { backLinkDestinations } from \"../constants\";\r\nimport config from \"../config\";\r\n\r\nexport function addBackDestinationParam(destinationUrl, extraParams) {\r\n    const url = new URL(location.origin + destinationUrl);\r\n    const plansRegex = /plans\\/(?:courses|public)\\/\\w+\\/(current|past|withoutdate|all)\\//i;\r\n    const tableViewRegex = /plans\\/courses\\/(\\d+)\\/tableView/;\r\n    const tableViewRegexMatch = location.pathname.match(tableViewRegex);\r\n    const plansRegexMatch = location.pathname.match(plansRegex);\r\n    const topicRegex = /\\/plans\\/(?:courses|public)\\/\\w+\\/topics\\/(\\d+)/i;\r\n    const topicRegexMatch = location.href.match(topicRegex);\r\n    const topicsRegex = /\\/plans\\/(?:courses|public)\\/\\w+\\/topics(?:[/]|[?]).*$/i;\r\n    const topicsRegexMatch = location.href.match(topicsRegex);\r\n    const parentDashboardRegex = /.+LocationId=(\\d+).+&SummaryDashboardType=Parent/i;\r\n    const dashboardUrl = \"/Dashboard/Dashboard.aspx\";\r\n\r\n    if (plansRegexMatch) {\r\n        switch (plansRegexMatch[1]) {\r\n            case \"current\":\r\n                url.searchParams.append(\"BackDestination\", backLinkDestinations.current);\r\n                break;\r\n            case \"past\":\r\n                url.searchParams.append(\"BackDestination\", backLinkDestinations.past);\r\n                break;\r\n            case \"withoutdate\":\r\n                url.searchParams.append(\"BackDestination\", backLinkDestinations.withoutDate);\r\n                break;\r\n            case \"all\":\r\n                url.searchParams.append(\"BackDestination\", backLinkDestinations.all);\r\n                break;\r\n            default:\r\n                url.searchParams.append(\"BackDestination\", backLinkDestinations.current);\r\n                break;\r\n        }\r\n    } else if (topicRegexMatch) {\r\n        url.searchParams.append(\"BackDestination\", backLinkDestinations.topic);\r\n\r\n        if (!url.searchParams.get(\"TopicId\")) {\r\n            url.searchParams.append(\"TopicId\", topicRegexMatch[1]);\r\n        }\r\n    } else if (topicsRegexMatch) {\r\n        url.searchParams.append(\"BackDestination\", backLinkDestinations.topics);\r\n    } else if (tableViewRegexMatch) {\r\n        url.searchParams.append(\"BackDestination\", backLinkDestinations.tableView);\r\n\r\n        if (extraParams) {\r\n            url.searchParams.append(\"BackData\", JSON.stringify(extraParams));\r\n        }\r\n    } else if (location.pathname.includes(\"Course/course.aspx\")) {\r\n        url.searchParams.append(\"BackDestination\", backLinkDestinations.overview);\r\n    } else if (location.pathname.includes(config.calendarUrl)) {\r\n        url.searchParams.append(\"BackDestination\", backLinkDestinations.calendar);\r\n        url.searchParams.append(\"BackData\", JSON.stringify(extraParams));\r\n    } else if (\r\n        location.pathname.includes(config.dashboardUrl ? config.dashboardUrl : dashboardUrl)\r\n    ) {\r\n        const parentDashboardRegexMatch = location.href.match(parentDashboardRegex);\r\n\r\n        if (parentDashboardRegexMatch) {\r\n            url.searchParams.append(\"BackDestination\", backLinkDestinations.parentDashboard);\r\n            url.searchParams.append(\r\n                \"BackData\",\r\n                JSON.stringify({ HierarchyId: parentDashboardRegexMatch[1] })\r\n            );\r\n            const queryString = window.location.search;\r\n            const urlParams = new URLSearchParams(queryString);\r\n            const childIdFromQueryParameter = urlParams.get(\"ChildId\");\r\n\r\n            if (childIdFromQueryParameter && childIdFromQueryParameter > 0) {\r\n                url.searchParams.append(\"ChildId\", childIdFromQueryParameter);\r\n            }\r\n        } else {\r\n            url.searchParams.append(\"BackDestination\", backLinkDestinations.myPage);\r\n        }\r\n    } else if (location.pathname.includes(\"tableView\")) {\r\n        url.searchParams.append(\"BackDestination\", backLinkDestinations.tableView);\r\n    } else {\r\n        url.searchParams.set(\"BackDestination\", backLinkDestinations.current);\r\n\r\n        if (extraParams) {\r\n            url.searchParams.append(\"BackData\", JSON.stringify(extraParams));\r\n        }\r\n    }\r\n\r\n    if (!url.searchParams.get(\"ChildId\") && config.childId > 0) {\r\n        url.searchParams.append(\"ChildId\", config.childId);\r\n    }\r\n\r\n    return url.href;\r\n}\r\n\r\nexport const getAllQueryStringParametersFromCurrentUrl = () => {\r\n    const urlSearchParams = new URLSearchParams(window.location.search);\r\n\r\n    if (urlSearchParams.size > 0) {\r\n        const queryStringParameters = {};\r\n\r\n        for (const [parameterKey, parameterValue] of urlSearchParams) {\r\n            queryStringParameters[parameterKey] = parameterValue;\r\n        }\r\n\r\n        return queryStringParameters;\r\n    }\r\n\r\n    return null;\r\n};\r\n\r\nexport const getDestinationUrlWithExtraParametersFromCurrentUrl = (\r\n    destinationUrl,\r\n    queryStringParameters = null\r\n) => {\r\n    if (!destinationUrl) {\r\n        return;\r\n    }\r\n\r\n    const urlSearchParams = new URLSearchParams(window.location.search);\r\n\r\n    const url = new URL(location.origin + destinationUrl);\r\n\r\n    const addQueryStringParameters = queryStringParameters => {\r\n        if (!queryStringParameters) {\r\n            return;\r\n        }\r\n\r\n        for (const [parameterKey, parameterValue] of Object.entries(queryStringParameters)) {\r\n            url.searchParams.set(parameterKey, parameterValue);\r\n        }\r\n    };\r\n\r\n    const backdataQueryStringParameter = urlSearchParams.get(\"BackData\");\r\n\r\n    if (backdataQueryStringParameter) {\r\n        addQueryStringParameters(JSON.parse(backdataQueryStringParameter));\r\n    }\r\n\r\n    addQueryStringParameters(queryStringParameters);\r\n\r\n    return url.href;\r\n};\r\n\r\nexport const hasParam = (destinationUrl, param) => {\r\n    const urlSegments = destinationUrl.split('?');\r\n    const urlSearchParams = new URLSearchParams(urlSegments[1]);\r\n\r\n    return urlSearchParams.has(param);\r\n};\r\n\r\nexport const removeParam = (destinationUrl, param) => {\r\n    const urlSegments = destinationUrl.split('?');\r\n    const urlSearchParams = new URLSearchParams(urlSegments[1]);\r\n\r\n    urlSearchParams.delete(param);\r\n\r\n    return urlSegments[0]+'?'+decodeURIComponent(urlSearchParams.toString());\r\n};\r\n\r\nexport const setParam = (destinationUrl, param, value) => {\r\n    const urlSegments = destinationUrl.split('?');\r\n    const urlSearchParams = new URLSearchParams(urlSegments[1]);\r\n\r\n    urlSearchParams.set(param, value);\r\n\r\n    return urlSegments[0]+'?'+decodeURIComponent(urlSearchParams.toString());\r\n};\r\n","// @ts-check\r\n\r\n/**\r\n * @module network/kpi\r\n */\r\n\r\nimport { post } from './fetch';\r\n\r\n/**\r\n * Fires a POST to register a kpi\r\n * @param {object} options\r\n * @param {string} options.url - the url of the kpi service\r\n * @param {string} options.section - the kpi section\r\n * @param {string} options.measurement - the kpi measurement\r\n * @param {string} options.context - the kpi context\r\n */\r\nexport function postKpi({\r\n    url = '/restapi/common/kpi/v1',\r\n    section,\r\n    measurement,\r\n    context = null,\r\n}) {\r\n    return post(url, {\r\n        measureSection: section,\r\n        measurement: measurement,\r\n        measureContext: context\r\n    });\r\n}\r\n","import config from \"../config\";\r\nimport { postKpi } from \"@itslearning/atlas/network/kpi\";\r\n\r\nexport const postNewPlannerKpi = async measurementId => {\r\n    // Failed attempt to post KPI should not intyerrupt interaction with planner.\r\n    try {\r\n        await postKpi({\r\n            url: config.kpi.kpiUrl,\r\n            context: config.kpi.kpiContext,\r\n            section: config.kpi.kpiSectionNewPlanner,\r\n            measurement: measurementId\r\n        });\r\n    } catch (error) {\r\n        // So just log error into browser console.\r\n        console.log(error);\r\n    }\r\n};\r\n","{#if showLink}\n    <div class={`itsl-progess-plan-link ${containerClass} ${secondaryStandaloneClass}`}>\n        <Link\n            href={linkUrl}\n            {iconClass}\n            iconPlacement=\"end\"\n            {kind}\n            on:click={handleLinkClick}\n        >\n            <span class=\"screen-reader\">\n                {linkScreenReaderText}\n            </span>\n            <span aria-hidden=\"true\">\n                {linkText}\n            </span>\n        </Link>\n    </div>\n{/if}\n\n<script>\n    import { onMount } from \"svelte\";\n    import Link from \"@itslearning/prometheus/assets/Navigation/Link/v1/Link.svelte\";\n    import { completePlan, uncompletePlan } from \"@its-ui/planner-common/api\";\n    import config from \"../../config\";\n    import {\n        columnTypes,\n        columnVisibility,\n        onePlanAtATimePlanStatus,\n        planType,\n    } from \"../../constants\";\n    import { addBackDestinationParam } from \"../../helpers/backLinkHelper\";\n    import { postNewPlannerKpi } from \"../../helpers/kpiHelper\";\n    import i18n from \"../../i18n\";\n\n    export let backExtraParams = {};\n    export let columnVisibilities = undefined;\n    export let containerClass = \"\";\n    export let courseId = undefined;\n    export let iconClass = \"\";\n    export let isPlanCard = false;\n    export let kind = \"primary-standalone\";\n    export let kpiContinue = config.kpi.kpiMeasurementContinuePlanCard;\n    export let kpiStart = config.kpi.kpiMeasurementStartPlanCard;\n    export let plan = undefined;\n    export let startAtPlanPage = false;\n    export let useGenericResourceColumn = false;\n    export let useNextPlanFeature = true;\n\n    let isContinue = false;\n    let isNextPlan = false;\n    let isStart = true;\n    let linkText = i18n.start;\n    let linkUrl = \"\";\n    let linkScreenReaderText = i18n.startPlan;\n    let showLink = false;\n\n    const isComplete = plan.planStatus === onePlanAtATimePlanStatus.completed;\n    const isLast = config.nextAvailablePlanId == null;\n    const isReopened = plan.planStatus === onePlanAtATimePlanStatus.reopened;\n    const secondaryStandaloneClass = \"\";\n    const useBetterProgressionBetweenPlansWithoutDate = plan.useBetterProgressionBetweenPlansWithoutDate;\n\n    let resourcesVisibility = config.columnVisibilities\n        ? config.columnVisibilities[columnTypes.Resources]\n        : undefined;\n    let activitiesVisibility = config.columnVisibilities\n        ? config.columnVisibilities[columnTypes.Activities]\n        : undefined;\n    let elementsVisibility = config.columnVisibilities\n        ? config.columnVisibilities[columnTypes.Elements]\n        : undefined;\n\n    const hasElements = plan.elements.filter(e => !e.isFolder).length > 0;\n    const allActivities = hasElements ? plan.elements.filter(e => !e.isResource && !e.isFolder) : [];\n    const allResources = hasElements ? plan.elements.filter(e => e.isResource && !e.isFolder) : [];\n    const isAllActivitiesCompleted = allActivities.every(e => e.isCompleted);\n    const isAllResourcesCompleted = allResources.every(e => e.isCompleted);\n    const isAllElementsCompleted = plan.elements.every(e => e.isCompleted || e.isFolder);\n    const isNoResourcesCompleted = allResources.every(e => !e.isCompleted);\n    const isNoActivitiesCompleted = allActivities.every(e => !e.isCompleted);\n\n    let handleLinkClick = () => {};\n\n    onMount(async () => {\n        if((hasElements && isAllActivitiesCompleted) // Plan completed\n        || (!hasElements && !isPlanCard && (config.planType == planType.deadLineDriven || config.planType == planType.allPlansAtOnce)) // Plans view, no elements, deadline-driven or all plans at once\n        || (!hasElements && !isPlanCard && isLast)) { // Plans view, no elements, last plan\n            handleCompletePlan();\n        }\n\n        isReopened && handleUncompletePlan();\n    });\n\n    $: canPlanBeSetAsCompleted =\n        config.planType === planType.onePlanAtATime &&\n        (plan.elements.length === 0 || plan.elements.every(e => e.isCompleted)) &&\n        !isComplete;\n\n    $: {\n        if (resourcesVisibility === undefined && columnVisibilities) {\n            resourcesVisibility = columnVisibilities[columnTypes.Resources];\n            activitiesVisibility = columnVisibilities[columnTypes.Activities];\n            elementsVisibility = columnVisibilities[columnTypes.Elements];\n        }\n    }\n\n    $: areResourcesVisible = resourcesVisibility === columnVisibility.All;\n    $: areActivitiesVisible = activitiesVisibility === columnVisibility.All;\n    $: areElementsVisible = elementsVisibility === columnVisibility.All;\n\n    $: {\n        // Set link text\n        let isLinkTextStart = false;\n        let isLinkTextContinue = false;\n        let isLinkTextNext = false;\n\n        if (useGenericResourceColumn) {\n            if (areElementsVisible) {\n                isLinkTextContinue = plan.elements.some(e => e.isCompleted && !e.isFolder);\n                isLinkTextNext = isAllElementsCompleted;\n            } else {\n                isLinkTextNext = true;\n            }\n        } else {\n            isLinkTextContinue =\n                (areResourcesVisible && !isAllResourcesCompleted) ||\n                (areActivitiesVisible && !isAllActivitiesCompleted);\n            isLinkTextNext =\n                (!areResourcesVisible && !areActivitiesVisible) ||\n                (areResourcesVisible && !areActivitiesVisible && isAllResourcesCompleted) ||\n                (!areResourcesVisible && areActivitiesVisible && isAllActivitiesCompleted) ||\n                (areResourcesVisible &&\n                    isAllResourcesCompleted &&\n                    areActivitiesVisible &&\n                    isAllActivitiesCompleted);\n            isLinkTextStart = areResourcesVisible && isNoResourcesCompleted && areActivitiesVisible && isNoActivitiesCompleted;\n        }\n\n        isLinkTextStart ? setLinkStart() :\n            isLinkTextNext && useNextPlanFeature\n                ? setLinkNextPlan()\n                : isLinkTextContinue\n                ? setLinkContinue()\n                : setLinkStart();\n    }\n\n    $: {\n        let url = \"\";\n\n        if (startAtPlanPage && isStart) {\n            url = addBackDestinationParam(plan.url, backExtraParams);\n        } else if (isNextPlan) {\n            url = addBackDestinationParam(config.nextAvailablePlanUrl, backExtraParams);\n        } else {\n            let nextResource = undefined;\n\n            if (useGenericResourceColumn && areElementsVisible) {\n                nextResource = plan.elements.find(e => !e.isCompleted);\n            } else {\n                nextResource = areResourcesVisible && !isAllResourcesCompleted\n                    ? allResources.find(e => !e.isCompleted)\n                    : areActivitiesVisible && !isAllActivitiesCompleted\n                      ? allActivities.find(e => !e.isCompleted)\n                      : undefined;\n            }\n\n            if (nextResource) {\n                url = addBackDestinationParam(\n                    `${plan.url}/element/${nextResource.id}`,\n                    backExtraParams,\n                );\n            } else if (canPlanBeSetAsCompleted && plan.elements.length > 0) {\n                url = addBackDestinationParam(\n                    `${plan.url}/element/${plan.elements[plan.elements.length - 1].id}`,\n                    backExtraParams,\n                );\n            }\n        }\n\n        linkUrl = url;\n    }\n\n    $: {\n        showLink =\n        // Plan is completed or link is next plan and plan type deadline-driven\n        ((isComplete || (hasElements && isAllElementsCompleted)) && !useNextPlanFeature)\n        || (isNextPlan && config.planType == planType.deadLineDriven)\n            ? false\n            : isStart || isContinue || (isNextPlan && config.nextAvailablePlanId);\n\n        // Hide start/continue link for plans without resources when \"Better Progression Between Plans Without Date\" is off\n        if (!hasElements && !useBetterProgressionBetweenPlansWithoutDate) {\n            showLink = false;\n        }\n    }\n\n    const setLinkStart = () => {\n        linkText = i18n.start;\n        linkScreenReaderText = i18n.startPlan;\n        isStart = true;\n        isContinue = isNextPlan = false;\n        handleLinkClick = redirect(handleCourseStartOrContinue);\n    };\n\n    const setLinkContinue = () => {\n        linkText = i18n.continue;\n        linkScreenReaderText = i18n.continuePlan;\n        isContinue = true;\n        isStart = isNextPlan = false;\n        handleLinkClick = redirect(handleCourseStartOrContinue);\n    };\n\n    const setLinkNextPlan = () => {\n        linkText = i18n.nextPlan;\n        linkScreenReaderText = i18n.nextPlan;\n        isNextPlan = true;\n        isStart = isContinue = false;\n        handleLinkClick = redirect(handleCompletePlan);\n    };\n\n    const handleCourseStartOrContinue = async () => {\n        await postNewPlannerKpi(isContinue ? kpiContinue : kpiStart);\n    };\n\n    const handleCompletePlan = async () => {\n        if (!isComplete) await completePlan(courseId, plan.id);\n    };\n\n    const handleUncompletePlan = async () => {\n        if (isReopened) await uncompletePlan(courseId, plan.id);\n    };\n\n    const redirect = func => async (e) => {\n        e.preventDefault();\n        await func();\n        window.location.href = linkUrl;\n    };\n</script>\n","<div {id} class=\"itsl-progress-bar {cssClass}\">\r\n    <label for=\"{id}-progress\">\r\n        <span aria-hidden={validAccessibleTextString}>{value}/{max}</span>\r\n        <span class=\"screen-reader\">{accessibleTextString}</span>\r\n    </label>\r\n\r\n    <progress\r\n        id=\"{id}-progress\"\r\n        {max}\r\n        {value}\r\n        aria-label={accessibleTextString}\r\n        aria-valuenow={value}\r\n        class=\"itsl-progress-bar__progress {progressCssClass}\"\r\n        class:itsl-progress-bar__progress--full={value >= max}\r\n    />\r\n</div>\r\n\r\n<script>\r\n    import { formatLanguageString } from \"@itslearning/atlas/strings/format\";\r\n\r\n    export let id = Math.random().toString(36).substring(2, 15);\r\n    export let value = 0;\r\n    export let max;\r\n    export let cssClass = \"\";\r\n    export let progressCssClass = \"\";\r\n    export let accessibleText;\r\n\r\n    $: accessibleTextString = accessibleText && formatLanguageString(accessibleText, value, max);\r\n    $: validAccessibleTextString = accessibleTextString ? true : false;\r\n</script>\r\n","const NO_TOPIC = Symbol(\"NoTopicImages\");\r\n\r\nexport function createPlaceholderImagesProvider(topicColours, defaultPlanImages) {\r\n    if (!defaultPlanImages) {\r\n        new Error(\"Default plan images are required.\");\r\n    }\r\n\r\n    const topicPlaceholderLookup = new Map([\r\n        ...defaultPlanImages.topicColourImages.map(tc => [\r\n            tc.colorSchemaName,\r\n            {\r\n                imageIndex: getRandomImageIndex(tc.imageUrls.length),\r\n                imageUrls: tc.imageUrls\r\n            }\r\n        ]),\r\n        [\r\n            NO_TOPIC,\r\n            {\r\n                imageIndex: getRandomImageIndex(defaultPlanImages.noTopicImages.length),\r\n                imageUrls: defaultPlanImages.noTopicImages\r\n            }\r\n        ]\r\n    ]);\r\n\r\n    return {\r\n        getImageForTopic: topic => {\r\n            if (topic && !topic.color) {\r\n                return null;\r\n            }\r\n\r\n            let topicColor = NO_TOPIC;\r\n\r\n            if (topic) {\r\n                const matchingColor = topicColours.find(c => c.hexCode === topic.color);\r\n\r\n                if (matchingColor) {\r\n                    topicColor = matchingColor.className;\r\n                }\r\n            }\r\n\r\n            const defaultImages = topicPlaceholderLookup.get(topicColor);\r\n\r\n            if (!defaultImages) {\r\n                return null;\r\n            }\r\n\r\n            const currentImageIndex = defaultImages.imageIndex;\r\n\r\n            topicPlaceholderLookup.set(topicColor, {\r\n                ...defaultImages,\r\n                imageIndex:\r\n                    currentImageIndex + 1 >= defaultImages.imageUrls.length\r\n                        ? 0\r\n                        : currentImageIndex + 1\r\n            });\r\n\r\n            return defaultImages.imageUrls[currentImageIndex];\r\n        }\r\n    };\r\n}\r\n\r\nconst getRandomImageIndex = maxAllowedIndex => Math.floor(Math.random() * maxAllowedIndex);\r\n","import { get } from \"svelte/store\";\r\nimport {\r\n    getPlan,\r\n    getPlanPublic,\r\n    getPlansInTopic,\r\n    getPlansInTopicPublic,\r\n    getTopicCurrentPlans,\r\n    getTopicPastPlans,\r\n    getTopicWithoutDatePlans,\r\n    getTopicAllPlans\r\n} from \"../api\";\r\nimport config from \"../config\";\r\nimport { createPlaceholderImagesProvider } from \"./planImageHelper\";\r\n\r\nexport const loadPlansForTableView = async ({ store, apiMethod } = {}) =>\r\n    loadTableViewModePlans(store, apiMethod);\r\n\r\nexport const loadPlansForPrintTbl = async (store, apiMethod, ids) => {\r\n    startLoading(store);\r\n\r\n    store.update(data => {\r\n        data.plans = [];\r\n        data.placeholderImagesProvider = createPlaceholderImagesProvider(\r\n            config.topicColours,\r\n            config.defaultPlanImages\r\n        );\r\n\r\n        return data;\r\n    });\r\n\r\n    try {\r\n        const result = await apiMethod(ids);\r\n\r\n        applyResult(store, result);\r\n    } catch (error) {\r\n        handleError(store, error);\r\n    }\r\n};\r\n\r\nexport async function loadPlanCounts(store, apiMethod) {\r\n    startLoading(store);\r\n\r\n    store.update(data => {\r\n        data.planCounts = {};\r\n\r\n        return data;\r\n    });\r\n\r\n    const result = await apiMethod();\r\n\r\n    applyResultPlanCounts(store, result);\r\n\r\n    return result;\r\n}\r\n\r\nexport async function loadPlans(store, apiMethod, append) {\r\n    startLoading(store);\r\n\r\n    let index = 0;\r\n\r\n    if (append) {\r\n        const { currentPageIndex } = get(store);\r\n\r\n        index = currentPageIndex + 1;\r\n    } else {\r\n        store.update(data => {\r\n            data.plans = [];\r\n            data.placeholderImagesProvider = createPlaceholderImagesProvider(\r\n                config.topicColours,\r\n                config.defaultPlanImages\r\n            );\r\n\r\n            return data;\r\n        });\r\n    }\r\n\r\n    try {\r\n        const result = await apiMethod(index);\r\n\r\n        applyResult(store, result, append);\r\n    } catch (error) {\r\n        handleError(store, error);\r\n    }\r\n}\r\n\r\nexport async function loadTableViewModePlans(store, apiMethod) {\r\n    startLoading(store);\r\n\r\n    const { currentPageIndex, pageSize } = get(store);\r\n\r\n    store.update(data => {\r\n        data.plans = [];\r\n        data.placeholderImagesProvider = createPlaceholderImagesProvider(\r\n            config.topicColours,\r\n            config.defaultPlanImages\r\n        );\r\n\r\n        return data;\r\n    });\r\n\r\n    try {\r\n        const result = await apiMethod(currentPageIndex, pageSize);\r\n\r\n        applyResult(store, result);\r\n    } catch (error) {\r\n        handleError(store, error);\r\n    }\r\n}\r\n\r\nexport async function loadPlansForTopic(store, publicAccessKey, topicId, append, planOrder) {\r\n    startLoading(store);\r\n\r\n    let index = 0;\r\n\r\n    if (append) {\r\n        const { currentPageIndex } = get(store);\r\n\r\n        index = currentPageIndex + 1;\r\n    } else {\r\n        store.update(data => {\r\n            data.plans = [];\r\n            data.placeholderImagesProvider = createPlaceholderImagesProvider(\r\n                config.topicColours,\r\n                config.defaultPlanImages\r\n            );\r\n\r\n            return data;\r\n        });\r\n    }\r\n\r\n    const apiMethod = publicAccessKey ? getPlansInTopicPublic : getPlansInTopic;\r\n\r\n    try {\r\n        const result = await apiMethod(topicId, index, planOrder);\r\n\r\n        applyResult(store, result, append, planOrder);\r\n    } catch (error) {\r\n        handleError(store, error);\r\n    }\r\n}\r\n\r\nexport async function loadPlan(store, publicAccessKey, planId) {\r\n    startLoading(store);\r\n\r\n    const apiMethod = publicAccessKey ? getPlanPublic : getPlan;\r\n\r\n    try {\r\n        const result = await apiMethod(planId);\r\n\r\n        store.update(data => {\r\n            if (result.start) {\r\n                result.start = adjustToTimezone(result.start);\r\n            }\r\n\r\n            if (result.stop) {\r\n                result.stop = adjustToTimezone(result.stop);\r\n            }\r\n\r\n            if (result.activeFromDT) {\r\n                result.activeFromDT = adjustToTimezone(result.activeFromDT);\r\n            }\r\n\r\n            data.plan = result;\r\n            data.loading = false;\r\n\r\n            return data;\r\n        });\r\n    } catch (error) {\r\n        handleError(store, error);\r\n    }\r\n}\r\n\r\nexport async function loadTopicCurrentPlans(store, topicId) {\r\n    startLoading(store);\r\n\r\n    store.update(data => {\r\n        data.plans = [];\r\n        data.placeholderImagesProvider = createPlaceholderImagesProvider(\r\n            config.topicColours,\r\n            config.defaultPlanImages\r\n        );\r\n\r\n        return data;\r\n    });\r\n\r\n    const apiMethod = getTopicCurrentPlans;\r\n\r\n    try {\r\n        const result = await apiMethod(topicId ? topicId : 0);\r\n\r\n        applyResult(store, result, false);\r\n    } catch (error) {\r\n        handleError(store, error);\r\n    }\r\n}\r\n\r\nexport async function loadTopicWithoutDatePlans(store, topicId) {\r\n    startLoading(store);\r\n\r\n    store.update(data => {\r\n        data.plans = [];\r\n        data.placeholderImagesProvider = createPlaceholderImagesProvider(\r\n            config.topicColours,\r\n            config.defaultPlanImages\r\n        );\r\n\r\n        return data;\r\n    });\r\n\r\n    const apiMethod = getTopicWithoutDatePlans;\r\n\r\n    try {\r\n        const result = await apiMethod(topicId ? topicId : 0);\r\n\r\n        applyResult(store, result, false);\r\n    } catch (error) {\r\n        handleError(store, error);\r\n    }\r\n}\r\n\r\nexport async function loadTopicPastPlans(store, topicId) {\r\n    startLoading(store);\r\n\r\n    store.update(data => {\r\n        data.plans = [];\r\n        data.placeholderImagesProvider = createPlaceholderImagesProvider(\r\n            config.topicColours,\r\n            config.defaultPlanImages\r\n        );\r\n\r\n        return data;\r\n    });\r\n\r\n    const apiMethod = getTopicPastPlans;\r\n\r\n    try {\r\n        const result = await apiMethod(topicId ? topicId : 0);\r\n\r\n        applyResult(store, result, false);\r\n    } catch (error) {\r\n        handleError(store, error);\r\n    }\r\n}\r\n\r\nexport async function loadTopicAllPlans(store, topicId) {\r\n    startLoading(store);\r\n\r\n    store.update(data => {\r\n        data.plans = [];\r\n        data.placeholderImagesProvider = createPlaceholderImagesProvider(\r\n            config.topicColours,\r\n            config.defaultPlanImages\r\n        );\r\n\r\n        return data;\r\n    });\r\n\r\n    const apiMethod = getTopicAllPlans;\r\n\r\n    try {\r\n        const result = await apiMethod(topicId ? topicId : 0);\r\n\r\n        applyResult(store, result);\r\n    } catch (error) {\r\n        handleError(store, error);\r\n    }\r\n}\r\n\r\nfunction startLoading(store) {\r\n    store.update(data => {\r\n        data.loading = true;\r\n        data.error = undefined;\r\n\r\n        return data;\r\n    });\r\n}\r\n\r\nfunction applyResult(store, result, append = false) {\r\n    store.update(data => {\r\n        const plans = buildUpPlans(result, data.placeholderImagesProvider);\r\n\r\n        result.plans = append ? [...data.plans, ...plans] : plans;\r\n        result.placeholderImagesProvider = data.placeholderImagesProvider;\r\n        data = result;\r\n        data.loading = false;\r\n\r\n        return data;\r\n    });\r\n}\r\n\r\nfunction applyResultPlanCounts(store, result) {\r\n    store.update(data => {\r\n        data = result;\r\n\r\n        return data;\r\n    });\r\n}\r\n\r\nfunction handleError(store, error) {\r\n    store.update(data => {\r\n        data.loading = false;\r\n        data.error = error;\r\n\r\n        return data;\r\n    });\r\n\r\n    return { error };\r\n}\r\n\r\nexport function buildUpPlans(plans, placeholderImagesProvider) {\r\n    return plans.entityArray.map(plan => {\r\n        if (plan.start) {\r\n            plan.start = adjustToTimezone(plan.start);\r\n        }\r\n\r\n        if (plan.stop) {\r\n            plan.stop = adjustToTimezone(plan.stop);\r\n        }\r\n\r\n        if (plan.activeFromDT) {\r\n            plan.activeFromDT = adjustToTimezone(plan.activeFromDT);\r\n        }\r\n\r\n        setPlaceholderImageUrl(plan, placeholderImagesProvider);\r\n\r\n        return plan;\r\n    });\r\n}\r\n\r\n/**\r\n * Set time according to configured timezone (and not current browser location)\r\n * @param {Date} date\r\n * @returns {Date}\r\n */\r\nexport function adjustToTimezone(date) {\r\n    const newDate = new Date(date);\r\n    const userTimezoneOffset = newDate.getTimezoneOffset() * 60000;\r\n    const adjustedDate = new Date(newDate.getTime() + userTimezoneOffset);\r\n\r\n    return adjustedDate;\r\n}\r\n\r\nfunction setPlaceholderImageUrl(plan, placeholderImagesProvider) {\r\n    if (!plan || !placeholderImagesProvider) {\r\n        return;\r\n    }\r\n\r\n    plan.placeholderImageUrl = plan.imageUrl\r\n        ? null\r\n        : placeholderImagesProvider.getImageForTopic(plan.topic);\r\n}\r\n","import config from \"../config\";\r\nimport { adjustToTimezone } from \"./loadPlansHelper\";\r\nimport {\r\n    dateTimePickerModalFromSection,\r\n    dateTimePickerModalToSection,\r\n    datePickerButton,\r\n    fromDatePickerInputField,\r\n    toDatePickerInputField\r\n} from \"../constants\";\r\n\r\n/**\r\n * Gets a date range string for displaying two dates as a range\r\n * @param {Date} from\r\n * @param {Date} to\r\n * @param {string} locale\r\n * @param {bool} singlePlan\r\n * @returns {string}\r\n */\r\nexport function getDateRangeString(from, to, locale, singlePlan = false) {\r\n    let fromString;\r\n    let toString;\r\n\r\n    if (typeof from !== \"object\") {\r\n        from = adjustToTimezone(new Date(from));\r\n    }\r\n\r\n    if (typeof to !== \"object\") {\r\n        to = adjustToTimezone(new Date(to));\r\n    }\r\n\r\n    // Not all browsers support the locale and options parameters for\r\n    // toLocaleDateString so catch exceptions and use the default\r\n    try {\r\n        const isSameYear = from.getFullYear() === to.getFullYear();\r\n        const isToCurrentYear = new Date().getFullYear() === to.getFullYear();\r\n\r\n        const yearOption = isSameYear && isToCurrentYear ? undefined : \"numeric\";\r\n        const options = { day: \"numeric\", month: \"short\", year: yearOption };\r\n\r\n        fromString = from.toLocaleDateString(locale, options);\r\n        toString = to.toLocaleDateString(locale, options);\r\n    } catch {\r\n        fromString = from.toLocaleDateString();\r\n        toString = to.toLocaleDateString();\r\n    }\r\n\r\n    if (isDateOnlyMode(from.getUTCMinutes(), to.getUTCMinutes())) {\r\n        const dayInMilliseconds = 1000 * 60 * 60 * 24;\r\n\r\n        if (to.getTime() - from.getTime() < dayInMilliseconds) {\r\n            return fromString;\r\n        }\r\n    }\r\n\r\n    let startTime;\r\n    let endTime;\r\n\r\n    try {\r\n        const timeStringOptions = {\r\n            minute: \"numeric\",\r\n            hour: \"numeric\",\r\n            hour12: config.useTwelveHourFormat\r\n        };\r\n\r\n        startTime = from.toLocaleTimeString(locale, timeStringOptions);\r\n        endTime = to.toLocaleTimeString(locale, timeStringOptions);\r\n    } catch {\r\n        startTime = from.toLocaleTimeString();\r\n        endTime = to.toLocaleTimeString();\r\n    }\r\n\r\n    if (fromString === toString) {\r\n        return `${fromString} ${startTime}–${endTime}`;\r\n    } else {\r\n        if (singlePlan) {\r\n            if (isDateOnlyMode(from.getUTCMinutes(), to.getUTCMinutes())) {\r\n                return `${fromString}–${toString}`;\r\n            } else {\r\n                return `${fromString} ${startTime}–${toString} ${endTime}`;\r\n            }\r\n        } else {\r\n            return `${fromString}-${toString}`;\r\n        }\r\n    }\r\n}\r\n\r\n/**\r\n * Gets a date range string for events\r\n * @param {Date} from\r\n * @param {Date} to\r\n * @param {string} locale\r\n\r\n * @returns {string}\r\n */\r\nexport function getEventsDateRangeString(from, to, locale, multipleDayPlan) {\r\n    let fromString;\r\n    let toString;\r\n\r\n    // Not all browsers support the locale and options parameters for\r\n    // toLocaleDateString so catch exceptions and use the default\r\n    try {\r\n        const yearOption = from.getFullYear() === to.getFullYear() ? undefined : \"numeric\";\r\n        const options = { day: \"numeric\", month: \"short\", year: yearOption };\r\n\r\n        fromString = from.toLocaleDateString(locale, options);\r\n        toString = to.toLocaleDateString(locale, options);\r\n    } catch {\r\n        fromString = from.toLocaleDateString();\r\n        toString = to.toLocaleDateString();\r\n    }\r\n\r\n    let startTime;\r\n    let endTime;\r\n\r\n    try {\r\n        const timeStringOptions = {\r\n            minute: \"numeric\",\r\n            hour: \"numeric\",\r\n            hour12: config.useTwelveHourFormat\r\n        };\r\n\r\n        startTime = from.toLocaleTimeString(locale, timeStringOptions);\r\n        endTime = to.toLocaleTimeString(locale, timeStringOptions);\r\n    } catch {\r\n        startTime = from.toLocaleTimeString();\r\n        endTime = to.toLocaleTimeString();\r\n    }\r\n\r\n    // Only return time if plan is within one day, otherwise include date\r\n    if (!multipleDayPlan) {\r\n        return `${startTime}–${endTime}`;\r\n    } else {\r\n        if (fromString === toString) {\r\n            return `${fromString} ${startTime}-${endTime}`;\r\n        } else {\r\n            return `${fromString} ${startTime}–${toString} ${endTime}`;\r\n        }\r\n    }\r\n}\r\n\r\n/**\r\n * Gets a date range string for displaying the start date of an upcoming plan (visibility section)\r\n * @param {Date} from\r\n * @param {Date} to\r\n * @param {string} locale\r\n * @returns {string}\r\n */\r\nexport function getDateStartString(from, to, locale) {\r\n    let fromString;\r\n\r\n    // Not all browsers support the locale and options parameters for\r\n    // toLocaleDateString so catch exceptions and use the default\r\n    try {\r\n        const yearOption = from.getFullYear() === to.getFullYear() ? undefined : \"numeric\";\r\n        const options = { day: \"numeric\", month: \"short\", year: yearOption };\r\n\r\n        fromString = from.toLocaleDateString(locale, options);\r\n    } catch {\r\n        fromString = from.toLocaleDateString();\r\n    }\r\n\r\n    return fromString;\r\n}\r\n\r\n/**\r\n * Format date in YYYY-MM-DD HH:MM:SS\r\n * @param {Date} date\r\n * @returns {string}\r\n */\r\nexport function formatDateForApi(date) {\r\n    const month = addLeadingZero(date.getMonth() + 1);\r\n    const day = addLeadingZero(date.getDate());\r\n    const year = date.getFullYear();\r\n    const hours = addLeadingZero(date.getHours());\r\n    const minutes = addLeadingZero(date.getMinutes());\r\n    const seconds = \"00\";\r\n\r\n    const dateString = [year, month, day].join(\"-\") + \" \" + [hours, minutes, seconds].join(\":\");\r\n\r\n    return dateString;\r\n}\r\n\r\n/**\r\n * Format date in YYYY-MM-DD\r\n * @param {Date} date\r\n * @returns {string}\r\n */\r\nexport function formatDateOnlyForApi(date) {\r\n    const month = addLeadingZero(date.getMonth() + 1);\r\n    const day = addLeadingZero(date.getDate());\r\n    const year = date.getFullYear();\r\n\r\n    const dateString = [year, month, day].join(\"-\");\r\n\r\n    return dateString;\r\n}\r\n\r\n/**\r\n * Add leading zero to time (e.g hours or minutes)\r\n * @param {Date} number\r\n * @returns {string}\r\n */\r\nexport function addLeadingZero(number) {\r\n    const zero = 2 - number.toString().length + 1;\r\n\r\n    return Array(+(zero > 0 && zero)).join(\"0\") + number;\r\n}\r\n\r\n/**\r\n * Return true if the day period is PM\r\n * @param {Date} time\r\n * @returns {bool}\r\n */\r\nexport function isPM(time) {\r\n    const hour = time.getHours();\r\n\r\n    if (hour > 11) {\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\n/**\r\n * Get the hours\r\n * @param {Date} time\r\n * @param {bool} twelveHourFormat\r\n * @returns {string}\r\n */\r\nexport function getCurrentHours(time, twelveHourFormat) {\r\n    let hour = time.getHours();\r\n\r\n    if (twelveHourFormat) {\r\n        if (hour === 0) {\r\n            hour = 12;\r\n        } else if (hour > 11) {\r\n            hour = hour - 12;\r\n        }\r\n    }\r\n\r\n    return addLeadingZero(hour);\r\n}\r\n\r\n/**\r\n * Get the minutes\r\n * @param {Date} time\r\n * @returns {string}\r\n */\r\nexport function getCurrentMinutes(time) {\r\n    const minute = time.getMinutes();\r\n\r\n    return addLeadingZero(minute);\r\n}\r\n\r\n/**\r\n * Return true if date only mode.\r\n * Date mode sets minutes to :01 and :59 to indicate the time is not relevant\r\n * @param {Date} fromMinutes\r\n * @param {Date} toMinutes\r\n * @returns {bool}\r\n */\r\nexport function isDateOnlyMode(fromMinutes, toMinutes) {\r\n    return fromMinutes === 1 || toMinutes === 59;\r\n}\r\n\r\n/**\r\n * Return true if proper date syntax (or empty date).\r\n * @param {Date} dateValue\r\n * @param {string} dateFormat\r\n * @returns {bool}\r\n */\r\nexport function validateDateFormat(dateValue, dateFormat) {\r\n    if (dateValue === \"\") {\r\n        return true;\r\n    } else {\r\n        let findSeparator = \"\";\r\n\r\n        for (let i = 0; i < dateFormat.length; i++) {\r\n            if (dateFormat.substring(i, i + 1) !== dateFormat.substring(0, 1)) {\r\n                findSeparator = dateFormat.substring(i, i + 1);\r\n                break;\r\n            }\r\n        }\r\n\r\n        const separator = findSeparator;\r\n\r\n        const dateArray = dateValue.split(separator);\r\n        const formatArray = dateFormat.split(separator);\r\n\r\n        let day = \"\";\r\n        let month = \"\";\r\n        let year = \"\";\r\n\r\n        if (dateArray.length !== formatArray.length) {\r\n            return false;\r\n        }\r\n\r\n        for (let i = 0; i < formatArray.length; i++) {\r\n            if (formatArray[i] && formatArray[i].toUpperCase().includes(\"D\")) {\r\n                day = dateArray[i].length === 1 ? addLeadingZero(dateArray[i]) : dateArray[i];\r\n            } else if (formatArray[i] && formatArray[i].toUpperCase().includes(\"M\")) {\r\n                month = dateArray[i].length === 1 ? addLeadingZero(dateArray[i]) : dateArray[i];\r\n            } else if (formatArray[i] && formatArray[i].toUpperCase().includes(\"Y\")) {\r\n                if (formatArray[i].length === dateArray[i].length) {\r\n                    year = dateArray[i];\r\n                }\r\n            }\r\n        }\r\n\r\n        const date = new Date(year + \"-\" + month + \"-\" + day);\r\n        const missingDateValue = !day || !month || !year;\r\n\r\n        return !isNaN(date) && !missingDateValue;\r\n    }\r\n}\r\n\r\nfunction checkAutoSuggestFromDate(dateValueTo, dateValueFrom, dateValueFromInitially) {\r\n    if (dateValueTo && !dateValueFromInitially) {\r\n        dateValueFrom = dateValueTo;\r\n    }\r\n\r\n    dateValueFromInitially = dateValueFrom;\r\n}\r\n\r\nfunction checkAutoSuggestToDate(dateValueFrom, dateValueTo, dateValueToInitially) {\r\n    if (dateValueFrom && !dateValueToInitially) {\r\n        dateValueTo = dateValueFrom;\r\n    }\r\n\r\n    dateValueToInitially = dateValueTo;\r\n}\r\n\r\n/**\r\n * Init auto suggest from-date.\r\n * @param {Date} dateValueFrom\r\n * @param {Date} dateValueTo\r\n * @param {Date} dateValueFromInitially\r\n */\r\nexport function initAutoSuggestFromDate(dateValueFrom, dateValueTo, dateValueFromInitially) {\r\n    document.querySelector(\r\n        `div[class^=${dateTimePickerModalFromSection}] button[class^=${datePickerButton}]`\r\n    ).onmousedown = checkAutoSuggestFromDate(dateValueTo, dateValueFrom, dateValueFromInitially);\r\n    document.querySelector(\r\n        `div[class^=${dateTimePickerModalFromSection}] button[class^=${datePickerButton}]`\r\n    ).onkeydown = checkAutoSuggestFromDate(dateValueTo, dateValueFrom, dateValueFromInitially);\r\n    document.querySelector(\r\n        `div[class^=${dateTimePickerModalFromSection}] input[id^=${fromDatePickerInputField}]`\r\n    ).onmousedown = checkAutoSuggestFromDate(dateValueTo, dateValueFrom, dateValueFromInitially);\r\n}\r\n\r\n/**\r\n * Init auto suggest to-date.\r\n * @param {Date} dateValueFrom\r\n * @param {Date} dateValueTo\r\n * @param {Date} dateValueToInitially\r\n */\r\nexport function initAutoSuggestToDate(dateValueFrom, dateValueTo, dateValueToInitially) {\r\n    document.querySelector(\r\n        `div[class^=${dateTimePickerModalToSection}] button[class^=${datePickerButton}]`\r\n    ).onmousedown = checkAutoSuggestToDate(dateValueFrom, dateValueTo, dateValueToInitially);\r\n    document.querySelector(\r\n        `div[class^=${dateTimePickerModalToSection}] button[class^=${datePickerButton}]`\r\n    ).onkeydown = checkAutoSuggestToDate(dateValueFrom, dateValueTo, dateValueToInitially);\r\n    document.querySelector(\r\n        `div[class^=${dateTimePickerModalToSection}] input[id^=${toDatePickerInputField}]`\r\n    ).onmousedown = checkAutoSuggestToDate(dateValueFrom, dateValueTo, dateValueToInitially);\r\n}\r\n","import { onePlanAtATimePlanStatus } from \"../constants\";\r\n\r\nexport const isPlanCompletedHelper = (plan) => {\r\n    let isPlanCompleted = plan.planStatus === onePlanAtATimePlanStatus.completed;\r\n\r\n    if(!isPlanCompleted && plan.elements?.some(e => !e.isFolder)) {\r\n        isPlanCompleted = plan.elements.every(e => e.isFolder || e.isCompleted);\r\n    }\r\n\r\n    return isPlanCompleted;\r\n};\r\n","import config from \"../config\";\r\nimport { columnTypes, columnVisibility } from \"../constants\";\r\n\r\nexport function isDateVisible(columnVisibilities = undefined, canEdit = undefined) {\r\n    return isPlanColumnVisible(columnTypes.Date, true, columnVisibilities, canEdit);\r\n}\r\n\r\nexport function isClassHoursVisible(classHours) {\r\n    const isValueViewableForAll = classHours != 0;\r\n\r\n    return isPlanColumnVisible(columnTypes.ClassHours, isValueViewableForAll, undefined, undefined);\r\n}\r\n\r\nexport function getInvalidClassHoursMessageVisibility(classHours) {\r\n    return classHours < 0 || classHours > 100 || !/^[0-9]+$/.test(classHours);\r\n}\r\n\r\nfunction isPlanColumnVisible(\r\n    columnType,\r\n    isValueViewableForAll,\r\n    columnVisibilities = undefined,\r\n    canEdit = undefined\r\n) {\r\n    let planColumnVisibility = config.columnVisibilities\r\n        ? config.columnVisibilities[columnType]\r\n        : undefined;\r\n\r\n    if (\r\n        !config.columnVisibilities ||\r\n        planColumnVisibility === undefined ||\r\n        config.canEdit === undefined\r\n    ) {\r\n        // Check if calendar\r\n        if (columnVisibilities) {\r\n            planColumnVisibility = columnVisibilities[columnType];\r\n\r\n            // Check if teacher\r\n            return canEdit\r\n                ? planColumnVisibility !== columnVisibility.Nobody\r\n                : planColumnVisibility === columnVisibility.All && isValueViewableForAll;\r\n        } else {\r\n            return true;\r\n        }\r\n    }\r\n\r\n    // Check if teacher\r\n    return config.canEdit\r\n        ? planColumnVisibility !== columnVisibility.Nobody\r\n        : planColumnVisibility === columnVisibility.All && isValueViewableForAll;\r\n}\r\n","<li\n    bind:this={cardElement}\n    id=\"itsl-plan-card-{plan.id}\"\n    class=\"itsl-plan-card {hiddenClass} {hoverSupportClass}\"\n    role={keyboardReorder ? \"option\" : undefined}\n    class:itsl-plan-card--shadow={dragAndDropSelected}\n    class:itsl-plan-card--drag={keyboardReorderSelected}\n    aria-selected={keyboardReorder ? keyboardReorderSelected : undefined}\n    on:click={measurePlanOpensFromCalendar}\n>\n    {#if isPlanClickable}\n        <a\n            tabindex={disabled ? -1 : 0}\n            href={destinationUrl}\n            class=\"itsl-plan-card__link\"\n            aria-labelledby=\"{id}--title\"\n            {target}\n            rel=\"noopener\"\n            on:click\n        >\n            <span class=\"screen-reader\">{titleText}</span>\n        </a>\n    {/if}\n    {#if showSelect || showDrag}\n        <div class=\"itsl-plan-card__controls\">\n            {#if showSelect}\n                <Checkbox\n                    bind:checked\n                    label=\"{i18n.select} {titleText}\"\n                    labelHidden\n                    small\n                    describedBy={null}\n                    on:change={updateCheckedStatus(plan.id, checked)}\n                />\n            {/if}\n            {#if showDrag}\n                <button\n                    bind:this={dragButton}\n                    id=\"{id}--drag\"\n                    class=\"itsl-plan-card__drag\"\n                    on:mousedown={mouseDownDragButton}\n                    on:touchstart={mouseDownDragButton}\n                    on:click={clickDragButton}\n                    on:keyup={keyUpDragButton}\n                    on:blur={blurDragButton}\n                    aria-labelledby=\"{id}--title\"\n                    aria-pressed={keyboardReorderSelected}\n                ></button>\n                <div\n                    class=\"itsl-plan-card__tooltip-container\"\n                    aria-live=\"polite\"\n                    class:itsl-plan-card__tooltip-container--visible={tooltipVisible}\n                >\n                    {#if tooltipVisible}\n                        <Tooltip\n                            element={dragButton}\n                            id=\"{id}-drag-tip\"\n                            placement=\"bottom\"\n                            role=\"tooltip\"\n                            show={tooltipVisible}\n                            text={i18n.elementDragHandleTooltip}\n                        />\n                    {/if}\n                </div>\n            {/if}\n        </div>\n    {/if}\n\n    <div class=\"itsl-plan-card__image\" style=\"{topicColorStyle} {imageStyle}\" role=\"img\" aria-label={plan.imageDescription}>\n        {#if !canEdit && userCanStartPlan && isLearner}\n            <ProgressPlanLink\n                {backExtraParams}\n                {columnVisibilities}\n                containerClass=\"itsl-plan-card__image-button\"\n                courseId={config.courseId}\n                iconClass=\"itsl-plan-card__image-button-icon\"\n                isPlanCard={true}\n                kind=\"standalone\"\n                {plan}\n                startAtPlanPage={true}\n                useNextPlanFeature={false}\n                useGenericResourceColumn={config.useGenericResourceColumn ||\n                    useGenericResourceColumn}\n            />\n        {/if}\n\n        {#if !plan.imageUrl && !plan.placeholderImageUrl}\n            <div class=\"itsl-plan-card__image-icon\"></div>\n        {/if}\n    </div>\n\n    <div class=\"itsl-plan-card__info\">\n        <div class=\"itsl-plan-card__header\">\n            <div class=\"itsl-plan-card__title\" id=\"{id}--title\">\n                <h3>\n                    {titleText}\n                </h3>\n                <div class=\"itsl-plan-card__hidden-indicator\">\n                    <span class=\"screen-reader\">{i18n ? i18n.hidden : undefined}</span>\n                </div>\n            </div>\n            {#if plan.topic}\n                {#if hasAccessToPlan && showTopicAsLink}\n                    <a\n                        tabindex={disabled ? -1 : 0}\n                        href={plan.topic.url}\n                        style={topicColorStyle}\n                        class=\"itsl-plan-card__topic\"\n                        {target}\n                        rel=\"noopener\"\n                    >\n                        <span>{plan.topic.name}</span>\n                        <span class=\"screen-reader\">: {topicName}</span>\n                    </a>\n                {:else}\n                    <span style={topicColorStyle} class=\"itsl-plan-card__topic\">\n                        <span>{plan.topic.name}</span>\n                        <span class=\"screen-reader\">: {topicName}</span>\n                    </span>\n                {/if}\n            {/if}\n            {#if isCourseOverviewPage && !isSelfPacedCourseOnePlanAtATime && plan.pinned}\n                <div class=\"pinned-mark\">{i18n.pinned}</div>\n            {/if}\n        </div>\n\n        <p class=\"itsl-plan-card__body\">\n            {#if plan.description}\n                {#if plan.isDescriptionPlainText}\n                    {plan.description}\n                {:else}\n                    {getShortDescription()}\n                {/if}\n            {/if}\n        </p>\n\n        <footer class=\"itsl-plan-card__footer\">\n            {#if plan.start && plan.stop && isDateVisible(columnVisibilities, canEdit)}\n                <div class=\"itsl-plan-card__footer-item itsl-plan-card__footer-item--calendar\">\n                    <div>{dateText}</div>\n                </div>\n            {/if}\n            {#if events}\n                <div class=\"itsl-plan-card__footer-item itsl-plan-card__footer-item--event\">\n                    <div>{events}</div>\n                </div>\n            {/if}\n            {#if linkedCourses}\n                <div class=\"itsl-plan-card__footer-item itsl-plan-card__footer-item--link\">\n                    <div>{linkedCourses}</div>\n                </div>\n            {/if}\n            {#if canCurrentUserCompleteElements}\n                {#if isPlanLocked}\n                    <div\n                        class=\"itsl-plan-card__footer-item itsl-plan-card__footer-item--locked-status\"\n                    >\n                        <div class=\"itsl-plan-card__status\">{i18n.locked}</div>\n                    </div>\n                {:else if isPlanCompleted}\n                    <PlanCompleted />\n                {/if}\n            {/if}\n            {#if showResources() && !isPlanCompleted}\n                {#if userCanStartPlan && canCurrentUserCompleteElements && resourcesCompleted !== undefined}\n                    <div class=\"itsl-plan-card__footer-item\">\n                        <ProgressBar\n                            value={resourcesActivitiesCompleted()}\n                            max={countMaxProgressBar()}\n                            accessibleText={i18n.xOfYCompleted}\n                        />\n                    </div>\n                {:else}\n                    <div class=\"itsl-plan-card__footer-item itsl-plan-card__footer-item--file\">\n                        <div>{resources}</div>\n                    </div>\n                {/if}\n            {/if}\n        </footer>\n    </div>\n\n    <div class=\"itsl-plan-card__spread\"></div>\n</li>\n\n<script>\n    import { onMount, createEventDispatcher } from \"svelte\";\n    import { get } from \"svelte/store\";\n    import { isMobile, isIpad } from \"@itslearning/atlas/detectors/UserAgentHelper\";\n    import { Keys } from \"@itslearning/atlas/keyboard/keys\";\n    import { normalizeKey } from \"@itslearning/atlas/keyboard/normalize\";\n    import { formatLanguageString } from \"@itslearning/atlas/strings/format.js\";\n    import Checkbox from \"@itslearning/prometheus/assets/inputs/Checkbox/v1/Checkbox.svelte\";\n    import Tooltip from \"@itslearning/prometheus/assets/modals/Tooltip/v1/Tooltip.svelte\";\n    import PlanCompleted from \"@its-ui/planner-common/components/PlanCompleted/PlanCompleted.svelte\";\n    import ProgressPlanLink from \"@its-ui/planner-common/components/ProgressPlanLink/ProgressPlanLink.svelte\";\n    import ProgressBar from \"../ProgressBar/ProgressBar.svelte\";\n    import { addBackDestinationParam } from \"../../helpers/backLinkHelper\";\n    import { getDateRangeString } from \"../../helpers/dateHelper\";\n    import { isPlanCompletedHelper } from \"../../helpers/isPlanCompletedHelper\";\n    import { postNewPlannerKpi } from \"../../helpers/kpiHelper\";\n    import { isDateVisible } from \"../../helpers/visibilityHelper\";\n    import config from \"../../config\";\n    import {\n        columnTypes,\n        columnVisibility,\n        resourceTypeToShow,\n        planType,\n        onePlanAtATimePlanStatus,\n    } from \"../../constants\";\n    import i18n from \"../../i18n\";\n\n    const getPlanBackgroundImageStyle = backgroundImageUrl =>\n        `background-image: url('${backgroundImageUrl}'); background-color: transparent;`;\n\n    export let plan = undefined;\n    export let id = Math.random().toString(36).substr(2, 9);\n    export let checked = false;\n    export let eventsCount = 0;\n    export let linkedCoursesCount = 0;\n    export let showSelect = false;\n    export let showDrag = false;\n    export let locale = undefined;\n    export let disabled = false;\n    export let hasAccessToPlan = true;\n    export let canEdit = false;\n    export let isLearner = false;\n    export let topicName = \"\";\n    export let showTopicAsLink = true;\n    export let target = \"_self\";\n    export let backExtraParams = {};\n    export let keyboardReorderSelected;\n    export let dragAndDropSelected;\n    export let keyboardReorder;\n    export let columnVisibilities;\n    export let useGenericResourceColumn;\n    export let selectedPlanIds = {\n        set: () => {},\n    };\n    export let isCourseOverviewPage = false;\n\n    const resourceCount = plan.elements.filter(\n        planElement => planElement.isResource && !planElement.isFolder\n    ).length;\n    const activityCount = plan.elements.filter(planElement => !planElement.isResource).length;\n    const resourcesCompleted = plan.elements.filter(\n        planElement => planElement.isResource && !planElement.isFolder && planElement.isCompleted\n    ).length;\n    const activitiesCompleted = plan.elements.filter(\n        planElement => !planElement.isResource && planElement.isCompleted\n    ).length;\n\n    const isPlanLocked =\n        config.planType === planType.onePlanAtATime &&\n        plan.planStatus === onePlanAtATimePlanStatus.locked;\n\n    let cardElement;\n    let dragButton;\n    let isPlanCompleted = false;\n    let tooltipVisible = false;\n    let isSelfPacedCourseOnePlanAtATime = config.isNewPlannerBetterProgressionBetweenPlansEnabled && config.planType === planType.onePlanAtATime;\n\n    onMount(async () => {\n        if (window.loadIframelyEmbedJs) {\n            window.loadIframelyEmbedJs();\n        }\n\n        isPlanCompleted = isPlanCompletedHelper(plan);\n    });\n\n    const dispatch = createEventDispatcher();\n\n    $: dateText =\n        plan.start && plan.stop ? getDateRangeString(plan.start, plan.stop, locale) : i18n.noDate;\n    $: destinationUrl = addBackDestinationParam(plan.url, backExtraParams);\n    $: imageStyle = plan.imageUrl\n        ? getPlanBackgroundImageStyle(plan.imageUrl)\n        : plan.placeholderImageUrl\n          ? getPlanBackgroundImageStyle(plan.placeholderImageUrl)\n          : \"\";\n    $: hiddenClass = plan.isActive ? \"\" : \"itsl-plan-card--hidden\";\n    $: hoverSupportClass =\n        isMobile() || isIpad() || !userCanStartPlan ? \"\" : \"itsl-plan-card--hover-support\";\n    $: titleText = plan.title || (i18n ? i18n.noTitle : \"\");\n    $: topicColorStyle = plan.topic ? `background-color: ${plan.topic.color};` : \"\";\n\n    let events;\n\n    $: {\n        if (eventsCount === 1) {\n            events = i18n ? i18n.oneEvent : undefined;\n        } else if (eventsCount > 1 && i18n && i18n.multipleEvents) {\n            events = i18n.multipleEvents.replace(\"{0}\", eventsCount);\n        } else {\n            events = undefined;\n        }\n    }\n\n    /**\n     * Return an int that will describe what type of resource has to be shown;\n     * @returns {int} 0 it shows resources and activities, 1 just resources, 2 just activities\n     */\n    let resources;\n    let areResourcesAndActivitiesCombined;\n\n    $: areResourcesAndActivitiesCombined =\n        config.useGenericResourceColumn === true || useGenericResourceColumn === true;\n\n    $: {\n        const typeToShow = isResourceOrActivities();\n\n        if (areResourcesAndActivitiesCombined) {\n            if (resourceCount + activityCount > 1) {\n                resources = formatLanguageString(\n                    i18n.multipleResources,\n                    resourceCount + activityCount,\n                );\n            } else if (resourceCount + activityCount === 1) {\n                resources = i18n ? i18n.oneResource : undefined;\n            } else {\n                resources = undefined;\n            }\n        } else {\n            if (\n                (resourceCount + activityCount === 1 &&\n                    typeToShow === resourceTypeToShow.everything) ||\n                (resourceCount === 1 && typeToShow === resourceTypeToShow.resources) ||\n                (activityCount === 1 && typeToShow === resourceTypeToShow.activities)\n            ) {\n                resources = i18n ? i18n.oneResource : undefined;\n            } else if (resourceCount + activityCount > 1 && i18n && i18n.multipleResources) {\n                if (typeToShow === resourceTypeToShow.everything) {\n                    resources = formatLanguageString(\n                        i18n.multipleResources,\n                        resourceCount + activityCount,\n                    );\n                } else if (typeToShow === resourceTypeToShow.resources) {\n                    if (resourceCount > 1) {\n                        resources = formatLanguageString(i18n.multipleResources, resourceCount);\n                    } else {\n                        resources = undefined;\n                    }\n                } else if (typeToShow === resourceTypeToShow.activities) {\n                    if (activityCount > 1) {\n                        resources = formatLanguageString(i18n.multipleResources, activityCount);\n                    } else {\n                        resources = undefined;\n                    }\n                }\n            } else {\n                resources = undefined;\n            }\n        }\n    }\n\n    let linkedCourses;\n\n    $: {\n        if (linkedCoursesCount === 1) {\n            linkedCourses = i18n ? i18n.oneLinkedCourse : undefined;\n        } else if (linkedCoursesCount > 1 && i18n && i18n.multipleLinkedCourses) {\n            linkedCourses = i18n.multipleLinkedCourses.replace(\"{0}\", linkedCoursesCount);\n        } else {\n            linkedCourses = undefined;\n        }\n    }\n\n    $: canCurrentUserCompleteElements = !canEdit && isLearner;\n\n    $: userCanStartPlan = !canCurrentUserCompleteElements || !isPlanLocked;\n\n    $: isPlanClickable = hasAccessToPlan && userCanStartPlan;\n\n    function updateCheckedStatus(id, checked) {\n        const selectedPlans = get(selectedPlanIds);\n\n        if (!checked) {\n            selectedPlans.delete(id);\n        } else {\n            selectedPlans.add(id);\n        }\n\n        selectedPlanIds.set(selectedPlans);\n    }\n\n    function mouseDownDragButton(e) {\n        dispatch(\"dragStart\", e);\n    }\n\n    function clickDragButton(e) {\n        dispatch(\"keyboardDragStart\", e);\n    }\n\n    function keyUpDragButton(e) {\n        if (normalizeKey(e.key) === Keys.TAB) {\n            tooltipVisible = true;\n        }\n    }\n\n    function blurDragButton() {\n        tooltipVisible = false;\n    }\n\n    /**\n     * Return a boolean that tells if 'resources' section has to be shown;\n     * @returns {boolean} `true` it shows 'resources' section, `false` it does not show.\n     */\n    function isResourceVisible() {\n        let resourcesVisibility = config.columnVisibilities\n            ? config.columnVisibilities[columnTypes.Resources]\n            : undefined;\n        let activitiesVisibility = config.columnVisibilities\n            ? config.columnVisibilities[columnTypes.Activities]\n            : undefined;\n\n        if (\n            !config.columnVisibilities ||\n            resourcesVisibility === undefined ||\n            config.canEdit === undefined\n        ) {\n            // Check if calendar\n            if (columnVisibilities) {\n                resourcesVisibility = columnVisibilities[columnTypes.Resources];\n                activitiesVisibility = columnVisibilities[columnTypes.Activities];\n\n                // Check if teacher logged in\n                if (!isLearner) {\n                    return !(\n                        resourcesVisibility === columnVisibility.Nobody &&\n                        activitiesVisibility === columnVisibility.Nobody\n                    );\n                } else if (isLearner) {\n                    // If student\n                    return (\n                        resourcesVisibility === columnVisibility.All ||\n                        activitiesVisibility === columnVisibility.All\n                    );\n                }\n            } else {\n                return true;\n            }\n        }\n\n        // Check if teacher logged in\n        if (config.canEdit) {\n            return !(\n                resourcesVisibility === columnVisibility.Nobody &&\n                activitiesVisibility === columnVisibility.Nobody\n            );\n        } else if (config.canEdit === false) {\n            // If student\n            return (\n                resourcesVisibility === columnVisibility.All ||\n                activitiesVisibility === columnVisibility.All\n            );\n        }\n    }\n\n    /**\n     * When to show when there is one field for resources and activities.\n     * @returns {boolean} `true` it shows resources and activities, `false` does not show.\n     */\n    function isResourceActivitiesVisible() {\n        let resourcesVisibility = config.columnVisibilities\n            ? config.columnVisibilities[columnTypes.Elements]\n            : undefined;\n\n        if (\n            !config.columnVisibilities ||\n            resourcesVisibility === undefined ||\n            config.canEdit === undefined\n        ) {\n            // Check if calendar\n            if (columnVisibilities) {\n                resourcesVisibility = columnVisibilities[columnTypes.Elements];\n\n                // Check if teacher logged in\n                if (!isLearner) {\n                    return !(resourcesVisibility === columnVisibility.Nobody);\n                } else if (isLearner) {\n                    // If student\n                    return resourcesVisibility === columnVisibility.All;\n                }\n            } else {\n                return true;\n            }\n        }\n\n        // Check if teacher logged in\n        if (config.canEdit) {\n            return !(resourcesVisibility === columnVisibility.Nobody);\n        } else if (config.canEdit === false) {\n            // If student\n            return resourcesVisibility === columnVisibility.All;\n        }\n    }\n\n    /**\n     * Return an int that will describe what type of resource has to be shown;\n     * @returns {int} 0 it shows resources and activities, 1 just resources, 2 just activities\n     */\n    function isResourceOrActivities() {\n        let resourcesVisibility = config.columnVisibilities\n            ? config.columnVisibilities[columnTypes.Resources]\n            : undefined;\n        let activitiesVisibility = config.columnVisibilities\n            ? config.columnVisibilities[columnTypes.Activities]\n            : undefined;\n\n        if (!config.columnVisibilities || resourcesVisibility === undefined) {\n            // Check if calendar\n            if (columnVisibilities) {\n                resourcesVisibility = columnVisibilities[columnTypes.Resources];\n                activitiesVisibility = columnVisibilities[columnTypes.Activities];\n\n                if (!isLearner) {\n                    if (\n                        (resourcesVisibility === columnVisibility.Teacher ||\n                            resourcesVisibility === columnVisibility.All) &&\n                        activitiesVisibility === columnVisibility.Nobody\n                    ) {\n                        return resourceTypeToShow.resources;\n                    }\n\n                    if (\n                        (activitiesVisibility === columnVisibility.Teacher ||\n                            activitiesVisibility === columnVisibility.All) &&\n                        resourcesVisibility === columnVisibility.Nobody\n                    ) {\n                        return resourceTypeToShow.activities;\n                    }\n                } else if (isLearner) {\n                    // If student\n                    if (\n                        (activitiesVisibility === columnVisibility.Teacher ||\n                            activitiesVisibility === columnVisibility.Nobody) &&\n                        resourcesVisibility === columnVisibility.All\n                    ) {\n                        return resourceTypeToShow.resources;\n                    } else if (\n                        (resourcesVisibility === columnVisibility.Nobody ||\n                            resourcesVisibility === columnVisibility.Teacher) &&\n                        activitiesVisibility === columnVisibility.All\n                    ) {\n                        return resourceTypeToShow.activities;\n                    }\n                }\n\n                return resourceTypeToShow.everything;\n            } else {\n                return resourceTypeToShow.everything;\n            }\n        }\n\n        // Check if Teacher logged in\n        if (config.canEdit) {\n            if (\n                (resourcesVisibility === columnVisibility.Teacher ||\n                    resourcesVisibility === columnVisibility.All) &&\n                activitiesVisibility === columnVisibility.Nobody\n            ) {\n                return resourceTypeToShow.resources;\n            }\n\n            if (\n                (activitiesVisibility === columnVisibility.Teacher ||\n                    activitiesVisibility === columnVisibility.All) &&\n                resourcesVisibility === columnVisibility.Nobody\n            ) {\n                return resourceTypeToShow.activities;\n            }\n        }\n        // If student\n        else if (!config.canEdit) {\n            if (\n                (activitiesVisibility === columnVisibility.Teacher ||\n                    activitiesVisibility === columnVisibility.Nobody) &&\n                resourcesVisibility === columnVisibility.All\n            ) {\n                return resourceTypeToShow.resources;\n            } else if (\n                (resourcesVisibility === columnVisibility.Nobody ||\n                    resourcesVisibility === columnVisibility.Teacher) &&\n                activitiesVisibility === columnVisibility.All\n            ) {\n                return resourceTypeToShow.activities;\n            }\n        }\n\n        return resourceTypeToShow.everything;\n    }\n\n    function countMaxProgressBar() {\n        const typeToShow = isResourceOrActivities();\n\n        if (areResourcesAndActivitiesCombined) {\n            return resourceCount + activityCount;\n        } else if (typeToShow === resourceTypeToShow.everything) {\n            return resourceCount + activityCount;\n        } else if (typeToShow === resourceTypeToShow.resources) {\n            return resourceCount;\n        } else if (typeToShow === resourceTypeToShow.activities) {\n            return activityCount;\n        }\n    }\n\n    function resourcesActivitiesCompleted() {\n        const typeToShow = isResourceOrActivities();\n\n        if (areResourcesAndActivitiesCombined) {\n            return resourcesCompleted + activitiesCompleted;\n        } else if (typeToShow === resourceTypeToShow.everything) {\n            return resourcesCompleted + activitiesCompleted;\n        } else if (typeToShow === resourceTypeToShow.resources) {\n            return resourcesCompleted;\n        } else if (typeToShow === resourceTypeToShow.activities) {\n            return activitiesCompleted;\n        }\n    }\n\n    function showResources() {\n        return (\n            (isResourceVisible() &&\n                resources &&\n                (config.useGenericResourceColumn === false ||\n                    useGenericResourceColumn === false)) ||\n            (isResourceActivitiesVisible() && resources && areResourcesAndActivitiesCombined)\n        );\n    }\n\n    const getShortDescription = () => {\n        if (plan.description === null || plan.description === undefined) {\n            return \"\";\n        }\n\n        const temporaryElement = document.createElement(\"div\");\n\n        temporaryElement.innerHTML = plan.description;\n\n        return temporaryElement.textContent.trim();\n    };\n\n    function measurePlanOpensFromCalendar(event) {\n        if (!isPlanClickable) {\n            event.stopPropagation();\n            event.preventDefault();\n\n            return;\n        }\n\n        if (config.redirectFromCalendar) {\n            postNewPlannerKpi(config.kpi.kpiMeasurementOpenPlanFromCalendar);\n        }\n    }\n</script>\n","<label {id} class=\"prom-switch {cssClass}\">\n    <input\n        type=\"checkbox\"\n        class=\"prom-switch__input | screen-reader\"\n        {disabled}\n        name=\"{nameText}\"\n        value=\"{value}\"\n        bind:checked\n        on:click={handleClick}\n    />\n    <span class=\"prom-switch__custom-button\">\n        <span class=\"prom-switch__custom-button-inner\"></span>\n    </span>\n    <span class=\"prom-switch__label-text\">\n        {labelText}\n    </span>\n</label>\n\n<script>\n    import { createEventDispatcher } from 'svelte';\n\n    const dispatch = createEventDispatcher();\n\n    /** @type {boolean} */\n    export let checked = false;\n\n    /** @type {boolean} */\n    export let disabled = false;\n\n    /** @type {string} */\n    export let id = '';\n\n    /** @type {string} */\n    export let label = undefined;\n\n    /** @type {string} */\n    export let name = undefined;\n\n    /** @type {string} */\n    export let value = undefined;\n\n    let cssClass\n\n    $ : {\n        cssClass = disabled ? 'disabled' : '';\n    }\n\n    let labelText;\n\n    $: {\n        if (!label || typeof label !== 'string') {\n            throw new TypeError('Label must be supplied');\n        }\n\n        labelText = label;\n    }\n\n    let nameText;\n\n    $: {\n        if (!name || typeof name !== 'string') {\n            throw new TypeError('Name must be supplied');\n        }\n\n        nameText = name;\n    }\n\n    function handleClick() {\n        dispatch('click', { checked });\n    }\n</script>\n","import { get } from \"svelte/store\";\r\nimport {\r\n    getPlansInTopic,\r\n    getPlansInTopicPublic,\r\n    getTopic,\r\n    getTopicPublic,\r\n    getTopics,\r\n    getTopicsPublic\r\n} from \"../api\";\r\nimport config from \"../config\";\r\nimport { createPlaceholderImagesProvider } from \"./planImageHelper\";\r\n\r\nexport function loadTopics(store, publicAccessKey) {\r\n    store.update(data => {\r\n        data.loading = true;\r\n        data.error = undefined;\r\n\r\n        return data;\r\n    });\r\n\r\n    store.update(data => {\r\n        data.topics = [];\r\n\r\n        return data;\r\n    });\r\n\r\n    const getPlansApiMethod = publicAccessKey ? getPlansInTopicPublic : getPlansInTopic;\r\n\r\n    getPlansApiMethod(0)\r\n        .then(result => {\r\n            store.update(data => {\r\n                data.plansWithoutTopicCount = result.total;\r\n\r\n                return data;\r\n            });\r\n        })\r\n        .catch(error => {\r\n            store.update(data => {\r\n                data.error = error;\r\n\r\n                return data;\r\n            });\r\n        });\r\n\r\n    const getTopicsApiMethod = publicAccessKey ? getTopicsPublic : getTopics;\r\n\r\n    getTopicsApiMethod()\r\n        .then(result => {\r\n            store.update(data => {\r\n                result = result.map(p => {\r\n                    if (p.start) {\r\n                        p.start = new Date(p.start);\r\n                        p.stop = new Date(p.stop);\r\n                    }\r\n\r\n                    return p;\r\n                });\r\n\r\n                data.topics = result;\r\n                data.loading = false;\r\n\r\n                return data;\r\n            });\r\n        })\r\n        .catch(error => {\r\n            store.update(data => {\r\n                data.loading = false;\r\n                data.error = error;\r\n\r\n                return data;\r\n            });\r\n        });\r\n}\r\n\r\nexport function loadTopic(store, publicAccessKey, id) {\r\n    store.update(data => {\r\n        data.loading = true;\r\n        data.error = undefined;\r\n        data.topic = undefined;\r\n\r\n        return data;\r\n    });\r\n\r\n    const apiMethod = publicAccessKey ? getTopicPublic : getTopic;\r\n\r\n    return apiMethod(id)\r\n        .then(result => {\r\n            store.update(data => {\r\n                if (result.start) {\r\n                    result.start = new Date(result.start);\r\n                    result.stop = new Date(result.stop);\r\n                }\r\n\r\n                data.topic = result;\r\n                data.loading = false;\r\n\r\n                return data;\r\n            });\r\n        })\r\n        .catch(error => {\r\n            store.update(data => {\r\n                data.loading = false;\r\n                data.error = error;\r\n\r\n                return data;\r\n            });\r\n        });\r\n}\r\n\r\nexport const loadTopicsForTableView = async ({ store, apiMethod } = {}) =>\r\n    await loadTableViewModeTopics(store, apiMethod);\r\n\r\nexport async function loadPagedTopics(store, apiMethod, append) {\r\n    startLoading(store);\r\n    let index = 0;\r\n\r\n    if (append) {\r\n        const { currentPageIndex } = get(store);\r\n\r\n        index = currentPageIndex + 1;\r\n    } else {\r\n        store.update(data => {\r\n            data.topics = [];\r\n            data.placeholderImagesProvider = createPlaceholderImagesProvider(\r\n                config.topicColours,\r\n                config.defaultPlanImages\r\n            );\r\n\r\n            return data;\r\n        });\r\n    }\r\n\r\n    try {\r\n        const result = await apiMethod(index);\r\n\r\n        applyResult(store, result, append);\r\n    } catch (error) {\r\n        handleError(store, error);\r\n    }\r\n}\r\n\r\nexport async function loadTableViewModeTopics(store, apiMethod) {\r\n    startLoading(store);\r\n\r\n    const { currentPageIndex, pageSize } = get(store);\r\n\r\n    store.update(data => {\r\n        data.topics = [];\r\n        data.placeholderImagesProvider = createPlaceholderImagesProvider(\r\n            config.topicColours,\r\n            config.defaultPlanImages\r\n        );\r\n\r\n        return data;\r\n    });\r\n\r\n    try {\r\n        const result = await apiMethod(currentPageIndex, pageSize);\r\n\r\n        applyResult(store, result);\r\n    } catch (error) {\r\n        handleError(store, error);\r\n    }\r\n}\r\n\r\nfunction startLoading(store) {\r\n    store.update(data => {\r\n        data.loading = true;\r\n        data.error = undefined;\r\n\r\n        return data;\r\n    });\r\n}\r\n\r\nfunction applyResult(store, result, append = false) {\r\n    store.update(data => {\r\n        const topics = buildUpTopics(result, data.placeholderImagesProvider);\r\n\r\n        result.topics = append ? [...data.topics, ...topics] : topics;\r\n        data = result;\r\n        data.loading = false;\r\n\r\n        return data;\r\n    });\r\n}\r\n\r\nfunction buildUpTopics(topics, placeholderImagesProvider) {\r\n    return topics.entityArray.map(topic => {\r\n        setPlaceholderImageUrl(topic, placeholderImagesProvider);\r\n\r\n        return topic;\r\n    });\r\n}\r\n\r\nfunction setPlaceholderImageUrl(topic, placeholderImagesProvider) {\r\n    if (!topic || !placeholderImagesProvider) {\r\n        return;\r\n    }\r\n\r\n    topic.placeholderImageUrl = topic.imageUrl\r\n        ? null\r\n        : placeholderImagesProvider.getImageForTopic(topic);\r\n}\r\n\r\nfunction handleError(store, error) {\r\n    console.error(error);\r\n\r\n    store.update(data => {\r\n        data.loading = false;\r\n        data.error = error;\r\n\r\n        return data;\r\n    });\r\n\r\n    return { error };\r\n}\r\n","import { writable } from \"svelte/store\";\r\n\r\nconst defaultPlanCounts = {\r\n    planCounts: {\r\n        currentPlansCount: 0,\r\n        pastPlansCount: 0,\r\n        withoutDatePlansCount: 0,\r\n        topicsCount: 0,\r\n        allPlansCount: 0\r\n    },\r\n    loading: true\r\n};\r\n\r\nconst defaultPlansData = {\r\n    plans: [],\r\n    total: 0,\r\n    currentPageIndex: 0,\r\n    loading: true\r\n};\r\n\r\nconst defaultTopicsData = {\r\n    topics: [],\r\n    loading: true\r\n};\r\n\r\nexport const currentPlansData = writable(defaultPlansData);\r\n\r\nexport const withoutDatePlansData = writable(defaultPlansData);\r\n\r\nexport const pastPlansData = writable(defaultPlansData);\r\n\r\nexport const topicsData = writable(defaultTopicsData);\r\n\r\nexport const selectedPlanIds = writable(new Set([]));\r\n\r\nexport const selectedTopicIds = writable(new Set([]));\r\n\r\nexport const allPlanCountsData = writable(defaultPlanCounts);\r\n\r\nexport const allPlansData = writable(defaultPlansData);\r\n","import {\r\n    getCurrentPlans,\r\n    getCurrentPlansPublic,\r\n    getWithoutDatePlans,\r\n    getWithoutDatePlansPublic,\r\n    getPastPlans,\r\n    getPastPlansPublic,\r\n    getAllPlanCounts,\r\n    getAllPlanCountsPublic,\r\n    getAllPlans,\r\n    getAllPlansPublic\r\n} from \"../../api\";\r\nimport { loadPlans, loadPlanCounts } from \"../../helpers/loadPlansHelper\";\r\nimport { loadTopics as loadTopicsHelper } from \"../../helpers/loadTopicsHelper\";\r\nimport {\r\n    currentPlansData,\r\n    withoutDatePlansData,\r\n    pastPlansData,\r\n    topicsData,\r\n    allPlansData,\r\n    allPlanCountsData\r\n} from \"./stores\";\r\n\r\nexport const loadCurrentPlans = (publicAccessKey = \"\", append = false) =>\r\n    loadPlans(currentPlansData, publicAccessKey ? getCurrentPlansPublic : getCurrentPlans, append);\r\n\r\nexport const loadWithoutDatePlans = (publicAccessKey = \"\", append = false) =>\r\n    loadPlans(\r\n        withoutDatePlansData,\r\n        publicAccessKey ? getWithoutDatePlansPublic : getWithoutDatePlans,\r\n        append\r\n    );\r\n\r\nexport const loadPastPlans = (publicAccessKey = \"\", append = false) =>\r\n    loadPlans(pastPlansData, publicAccessKey ? getPastPlansPublic : getPastPlans, append);\r\n\r\nexport const loadTopics = (publicAccessKey = \"\") => loadTopicsHelper(topicsData, publicAccessKey);\r\n\r\nexport const loadAllPlanCounts = (publicAccessKey = \"\") =>\r\n    loadPlanCounts(allPlanCountsData, publicAccessKey ? getAllPlanCountsPublic : getAllPlanCounts);\r\n\r\nexport const loadAllPlans = (publicAccessKey = \"\", append = false) =>\r\n    loadPlans(allPlansData, publicAccessKey ? getAllPlansPublic : getAllPlans, append);\r\n","// @ts-check\n\n/**\n * @module dom/Ratecontrol\n */\n\n/**\n *  Delay the execution of the function\n *\n * @export\n * @param {function} callback - Callback function\n * @param {number} wait - Time to wait (in miliseconds) before function is called\n * @param {*} immediate - Call function immediately\n * @returns {function}\n */\nexport function debounce(callback, wait, immediate) {\n    let timeout;\n\n    return function (...args) {\n        const callNow = immediate && !timeout;\n\n        window.clearTimeout(timeout);\n\n        timeout = window.setTimeout(() => {\n            timeout = null;\n\n            if (!immediate) {\n                callback.apply(this, args);\n            }\n        }, wait);\n\n        if (callNow) {\n            callback.apply(this, args);\n        }\n    };\n}\n\n/**\n * Limit the rate at which a function can fire.\n *\n * @export\n * @param {function} callback - Callback function\n * @param {number} thold - Time to wait (in miliseconds)\n * @param {*} scope\n * @returns  {function}\n */\nexport function throttle(callback, thold, scope) {\n    let last;\n    let deferTimer;\n\n    const threshold = thold || 250;\n\n    return function (...args) {\n        const context = scope || this;\n        const now = Number(new Date());\n\n        if (last && now < last + threshold) {\n            // Hold on to it\n            window.clearTimeout(deferTimer);\n\n            deferTimer = window.setTimeout(() => {\n                last = now;\n                callback.apply(context, args);\n            }, threshold);\n        } else {\n            last = now;\n            callback.apply(context, args);\n        }\n    };\n}\n","import { writable } from \"svelte/store\";\r\n\r\nexport const plansData = writable({});\r\n\r\nexport const topicData = writable({});\r\n\r\nexport const selectedPlanIds = writable(new Set([]));\r\n","<svelte:window\r\n    on:scroll={onScroll}\r\n    on:mousemove={pointerMove}\r\n    on:mouseup={dragEnd}\r\n    on:touchend={dragEnd}\r\n    on:touchmove={pointerMove}\r\n/>\r\n\r\n{#if data.plans.length < data.total}\r\n    <Switch\r\n        id=\"its-plans__autoloading-id\"\r\n        name=\"its-plans__autoloading-toggle\"\r\n        label={i18n.toggleAutoloadingOfPlans}\r\n        bind:checked={isAutoloadingOn}\r\n        on:click={toggleAutoloading}\r\n    />\r\n{/if}\r\n\r\n<Modal\r\n    id=\"show-replace-sorting-confirm-modal-id\"\r\n    bind:enabled={showReplaceSortingConfirmModal}\r\n    titleText={i18n.replaceSortingDialog_Heading}\r\n    bodyHtml={i18n.replaceSortingDialog_Text}\r\n    confirmText={i18n.replace}\r\n    cancelText={i18n.cancel}\r\n    confirmButtonType=\"destructive\"\r\n    on:close={replaceSortingModalClicked}\r\n/>\r\n\r\n<section class=\"its-plans__list-section\" bind:this={listSection}>\r\n    <ul\r\n        class=\"its-plans__list\"\r\n        tabindex=\"-1\"\r\n        aria-labelledby=\"plans\"\r\n        bind:this={listElement}\r\n        role={keyboardReorder ? \"listbox\" : undefined}\r\n        aria-activedescendant={keyboardReorderActiveId\r\n            ? `itsl-plan-card-${keyboardReorderActiveId}`\r\n            : undefined}\r\n        on:keydown={listKeyDown}\r\n        on:blur={listBlur}\r\n    >\r\n        {#each mainPlans as plan (plan.id)}\r\n            <PlanCard\r\n                {plan}\r\n                showSelect={config.canEdit}\r\n                locale={config.locale}\r\n                showDrag={config.canEdit &&\r\n                    !isMobile() &&\r\n                    (isDraggable ||\r\n                        (config.enableTopicPlansOwnSortingFixedOption && plan.topic === null)) &&\r\n                    data.plans.length > 1}\r\n                on:dragStart={e => dragStart(e.detail, plan)}\r\n                on:keyboardDragStart={() => keyboardDragStart(plan)}\r\n                keyboardReorderSelected={keyboardReorder && keyboardReorderActiveId === plan.id}\r\n                keyboardReorderActive={keyboardReorder}\r\n                dragAndDropSelected={dragSelectedPlan && plan.id === dragSelectedPlan.id}\r\n                canEdit={config.canEdit}\r\n                topicName={config.topicName}\r\n                isLearner={config.isLearner}\r\n                {selectedPlanIds}\r\n                {columnVisibilities}\r\n                {useGenericResourceColumn}\r\n            ></PlanCard>\r\n        {/each}\r\n    </ul>\r\n    {#if dragSelectedPlan}\r\n        <div class=\"its-plans__plan-dragging\" style={draggedElementStyle}>\r\n            <PlanCard\r\n                plan={dragSelectedPlan}\r\n                color={dragSelectedPlan.borderColor}\r\n                showSelect={true}\r\n                locale={config.locale}\r\n                showDrag={true}\r\n                canEdit={config.canEdit}\r\n                topicName={config.topicName}\r\n                isLearner={config.isLearner}\r\n                {selectedPlanIds}\r\n                {columnVisibilities}\r\n                {useGenericResourceColumn}\r\n            />\r\n        </div>\r\n    {/if}\r\n</section>\r\n\r\n{#if upcomingPlans.length}\r\n    <div class=\"its-plans__upcoming-plans-divider\">\r\n        <h3>{i18n.upcomingPlans}</h3>\r\n    </div>\r\n\r\n    <ul class=\"its-plans__list\">\r\n        {#each upcomingPlans as plan (plan.id)}\r\n            <li>\r\n                <PlanCard\r\n                    {plan}\r\n                    {i18n}\r\n                    showSelect={config.canEdit}\r\n                    locale={config.locale}\r\n                    showDrag={config.canEdit && isDraggable}\r\n                    canEdit={config.canEdit}\r\n                    topicName={config.topicName}\r\n                    isLearner={config.isLearner}\r\n                    {selectedPlanIds}\r\n                    {columnVisibilities}\r\n                    {useGenericResourceColumn}\r\n                ></PlanCard>\r\n            </li>\r\n        {/each}\r\n    </ul>\r\n{/if}\r\n\r\n<div aria-live=\"polite\" aria-atomic=\"true\">\r\n    {#if showLoading}\r\n        <div class=\"its-plans__loading\" aria-busy={data.loading}>\r\n            <span class=\"screen-reader\">{i18n.loading}</span>\r\n        </div>\r\n    {/if}\r\n</div>\r\n\r\n{#if (!data.loading || !isAutoloadingOn) && data.plans.length < data.total}\r\n    <div class=\"its-plans__show-more\">\r\n        {#if loadingError}\r\n            <span class=\"its-plans__show-more-error\">{i18n.friendlyUnknownError}</span>\r\n        {/if}\r\n        <Button type=\"plain\" htmlType=\"button\" text={i18n.showMore} on:click={showMore} />\r\n    </div>\r\n{/if}\r\n\r\n<script>\r\n    import PlanCard from \"../PlanCard/PlanCard.svelte\";\r\n    import i18n from \"../../i18n\";\r\n    import config from \"../../config\";\r\n    import Button from \"@itslearning/prometheus/assets/inputs/Button/v1/Button.svelte\";\r\n    import Switch from \"@itslearning/prometheus/assets/inputs/Switch/v1/Switch.svelte\";\r\n    import Modal from \"@itslearning/prometheus/assets/modals/Modal/v2/Modal.svelte\";\r\n    import {\r\n        dragAndDropPlanInLesson,\r\n        setPlanOrderInTopic,\r\n        getPlanOrderInTopic,\r\n        dragAndDropPlanInTopic\r\n    } from \"../../api\";\r\n    import { loadAllPlans, loadWithoutDatePlans } from \"../../logic/plans/loadDataController\";\r\n    import { normalizeKey } from \"@itslearning/atlas/keyboard/normalize\";\r\n    import { Keys } from \"@itslearning/atlas/keyboard/keys\";\r\n    import { debounce } from \"@itslearning/atlas/dom/Ratecontrol\";\r\n    import { onMount, createEventDispatcher } from \"svelte\";\r\n    import { isMobile } from \"@itslearning/atlas/detectors/UserAgentHelper\";\r\n    import { loadPlansForTopic } from \"../../helpers/loadPlansHelper\";\r\n    import { plansData } from \"../../logic/topicPage/stores\";\r\n    import { planSorting } from \"../../constants\";\r\n\r\n    export let selectedPlanIds = {\r\n        set: () => {}\r\n    };\r\n\r\n    const upcomingSplitTime = new Date(config.endOfCurrentDay).getTime();\r\n    const dispatch = createEventDispatcher();\r\n\r\n    export let columnVisibilities;\r\n    export let data;\r\n    export let drag;\r\n    export let loadMethod;\r\n    export let separateUpcomingPlans = false;\r\n    export let useGenericResourceColumn;\r\n\r\n    let showLoading;\r\n    let scrollBottom;\r\n    let loadingError;\r\n    let orderDirty = false;\r\n    let keyboardReorder = false;\r\n    let keyboardReorderActiveId;\r\n    let reorderDragHandleId;\r\n    let draggedElementTop;\r\n    let dragSelectedPlan = undefined;\r\n    let sourceSelectedPlan = undefined;\r\n    let targetSelectedPlan = undefined;\r\n    let targetSelectedPlanAfter = false;\r\n    let debounceSavePlanOrder;\r\n    let listSection;\r\n    let listElement;\r\n    let dragScrolling = false;\r\n    let newPlanUpdatePerformed = false;\r\n    let isAutoloadingOn = true;\r\n\r\n    const isDraggable = loadMethod === loadWithoutDatePlans || loadMethod === loadAllPlans || drag;\r\n\r\n    let showReplaceSortingConfirmModal = false;\r\n    let dragConfirmed = false;\r\n    let currentPlanOrder = planSorting.NotSetValue;\r\n    let dragIconElements = null;\r\n\r\n    $: mainPlans = separateUpcomingPlans\r\n        ? data.plans.filter(p => p.start && p.start.getTime() <= upcomingSplitTime)\r\n        : data.plans;\r\n    $: upcomingPlans = separateUpcomingPlans\r\n        ? data.plans.filter(p => p.start && p.start.getTime() > upcomingSplitTime)\r\n        : [];\r\n\r\n    $: if (data.loading) {\r\n        setTimeout(() => {\r\n            showLoading = data.loading;\r\n        }, 100);\r\n    } else {\r\n        if (!newPlanUpdatePerformed) {\r\n            newPlanUpdatePerformed = true;\r\n            const queryString = window.location.search;\r\n            const urlParams = new URLSearchParams(queryString);\r\n            const planIdParam = urlParams.get(\"createdPlanId\");\r\n\r\n            if (planIdParam) {\r\n                urlParams.delete(\"createdPlanId\");\r\n            }\r\n        }\r\n\r\n        showLoading = false;\r\n    }\r\n\r\n    $: if (orderDirty) {\r\n        dragIconElements = document.getElementsByClassName(\"itsl-plan-card__drag\");\r\n\r\n        if (dragIconElements) {\r\n            for (let i = 0; i < dragIconElements.length; i++) {\r\n                dragIconElements[i].setAttribute(\"disabled\", true);\r\n                dragIconElements[i].classList.add(\"itsl-plan-card__drag--dirtystate\");\r\n            }\r\n        }\r\n    } else {\r\n        dragIconElements = document.getElementsByClassName(\"itsl-plan-card__drag\");\r\n\r\n        if (dragIconElements) {\r\n            for (let i = 0; i < dragIconElements.length; i++) {\r\n                dragIconElements[i].removeAttribute(\"disabled\");\r\n                dragIconElements[i].classList.remove(\"itsl-plan-card__drag--dirtystate\");\r\n            }\r\n        }\r\n    }\r\n\r\n    $: draggedElementStyle = dragSelectedPlan ? `top: ${draggedElementTop}px;` : \"\";\r\n\r\n    onMount(() => {\r\n        // Debounce saves to the plan order to limit requests and to avoid race conditions\r\n        // when two changes are made in quick succession.\r\n        const runDebounceSavePlansOrder = debounce(savePlanOrder, 1000);\r\n\r\n        debounceSavePlanOrder = () => {\r\n            orderDirty = true;\r\n\r\n            runDebounceSavePlansOrder();\r\n        };\r\n    });\r\n\r\n    async function showMore() {\r\n        loadingError = null;\r\n        const index = data.plans.length;\r\n\r\n        const result = await loadMethod(config.publicAccessKey, true);\r\n\r\n        if (result && result.error) {\r\n            loadingError = result.error;\r\n        }\r\n\r\n        if (data.plans.length >= index && !isAutoloadingOn) {\r\n            changeFocus(index);\r\n        }\r\n    }\r\n\r\n    function changeFocus(index) {\r\n        const planId = data.plans[index].id;\r\n        const elementId = `#itsl-plan-card-${planId} > a`;\r\n\r\n        if (document.querySelector(elementId) !== null) {\r\n            document.querySelector(elementId).focus();\r\n        }\r\n    }\r\n\r\n    function moveDown(element, index) {\r\n        if (index >= data.plans.length - 1) {\r\n            return;\r\n        }\r\n\r\n        const target = data.plans[index + 1];\r\n\r\n        movePlan(element, target, false);\r\n\r\n        debounceSavePlanOrder();\r\n    }\r\n\r\n    function moveUp(element, index) {\r\n        if (index <= 0) {\r\n            return;\r\n        }\r\n\r\n        const target = data.plans[index - 1];\r\n\r\n        movePlan(element, target, true);\r\n\r\n        debounceSavePlanOrder();\r\n    }\r\n\r\n    // Moves one plan to a target plan's position in the list, inserting\r\n    // it either immediately before or after depending on insertBefore\r\n    function movePlan(plan, target, insertBefore) {\r\n        const newElements = [...data.plans];\r\n        const fromIndex = newElements.findIndex(e => e.id === plan.id);\r\n\r\n        newElements.splice(fromIndex, 1);\r\n\r\n        const toIndex = newElements.findIndex(e => e.id === target.id) + (insertBefore ? 0 : 1);\r\n\r\n        newElements.splice(toIndex, 0, plan);\r\n\r\n        data.plans = newElements;\r\n    }\r\n\r\n    function keyboardDragStart(plan) {\r\n        reorderDragHandleId = document.activeElement.id;\r\n\r\n        keyboardReorder = true;\r\n        keyboardReorderActiveId = plan.id;\r\n\r\n        setTimeout(() => listElement.focus(), 0);\r\n    }\r\n\r\n    function listKeyDown(event) {\r\n        if (!keyboardReorder) {\r\n            return;\r\n        }\r\n\r\n        const index = data.plans.findIndex(e => e.id === keyboardReorderActiveId);\r\n        const activePlan = data.plans[index];\r\n\r\n        let targetPlanIndex;\r\n\r\n        switch (normalizeKey(event.key)) {\r\n            case Keys.UP:\r\n                moveUp(activePlan, index);\r\n                event.preventDefault();\r\n                scrollPlanToView(activePlan.id);\r\n                break;\r\n            case Keys.DOWN:\r\n                moveDown(activePlan, index);\r\n                event.preventDefault();\r\n                scrollPlanToView(activePlan.id);\r\n                break;\r\n            case Keys.ESCAPE:\r\n            case Keys.SPACE:\r\n            case Keys.TAB:\r\n                event.stopPropagation();\r\n                event.preventDefault();\r\n\r\n                keyboardReorder = false;\r\n                keyboardReorderActiveId = undefined;\r\n\r\n                sourceSelectedPlan = data.plans.filter(e => e.id === activePlan.id);\r\n                targetPlanIndex = data.plans.findIndex(e => e.id === activePlan.id) + 1;\r\n\r\n                // Check if plan card will be placed last\r\n                if (targetPlanIndex === data.plans.length) {\r\n                    targetPlanIndex = data.plans.findIndex(e => e.id === activePlan.id) - 1;\r\n                    targetSelectedPlanAfter = true;\r\n                } else {\r\n                    targetSelectedPlanAfter = false;\r\n                }\r\n\r\n                targetSelectedPlan = data.plans.filter(\r\n                    e => e.id === data.plans[targetPlanIndex].id\r\n                );\r\n                debounceSavePlanOrder();\r\n\r\n                if (reorderDragHandleId) {\r\n                    setTimeout(() => document.getElementById(reorderDragHandleId).focus(), 0);\r\n                }\r\n\r\n                break;\r\n        }\r\n    }\r\n\r\n    function scrollPlanToView(planId) {\r\n        setTimeout(() => {\r\n            document\r\n                .getElementById(`itsl-plan-card-${planId}`)\r\n                .scrollIntoView({ behavior: \"smooth\", block: \"center\" });\r\n        }, 0);\r\n    }\r\n\r\n    function listBlur() {\r\n        keyboardReorder = false;\r\n        keyboardReorderActiveId = undefined;\r\n    }\r\n\r\n    // Start dragging by setting the dragSelectedplan and call pointerMove to position it correctly\r\n    function dragStart(event, plan) {\r\n        dragSelectedPlan = plan;\r\n\r\n        pointerMove(event);\r\n    }\r\n\r\n    // While dragging an plan set its y position to the cursor's y pos and check for\r\n    // other plans under the pointer to re-order the list\r\n    function pointerMove(event) {\r\n        if (dragSelectedPlan) {\r\n            event.preventDefault();\r\n            event.stopPropagation();\r\n\r\n            const cursorPosY = event.touches ? event.touches[0].pageY : event.pageY;\r\n            const scrollTop = document.body.parentElement.scrollTop;\r\n            const offsetTop = scrollTop + listSection.getBoundingClientRect().y;\r\n\r\n            draggedElementTop = cursorPosY - offsetTop;\r\n\r\n            let elementRect;\r\n            let elementTop;\r\n            let dragOverElement;\r\n\r\n            // Iterate over <li>s in the list and check if the pointer is within any of them\r\n            for (let i = 0; i < listElement.children.length; i++) {\r\n                elementRect = listElement.children[i].getBoundingClientRect();\r\n                elementTop = elementRect.y + scrollTop;\r\n\r\n                if (cursorPosY > elementTop && cursorPosY < elementTop + elementRect.height) {\r\n                    dragOverElement = data.plans[i];\r\n\r\n                    break;\r\n                }\r\n            }\r\n\r\n            // If a plan (other than the dragged one) is hovered re-order the list to place the\r\n            // dragged plan above or below the dragOverElement depending on pointer position.\r\n            if (dragOverElement && dragOverElement.id !== dragSelectedPlan.id) {\r\n                const insertBefore = cursorPosY - elementTop < elementRect.height / 2;\r\n\r\n                movePlan(dragSelectedPlan, dragOverElement, insertBefore);\r\n            }\r\n\r\n            // If dragged element is at the bottom or top of the page start the scroll function\r\n            if (cursorPosY - scrollTop > window.innerHeight - elementRect.height) {\r\n                if (!dragScrolling) {\r\n                    dragScrolling = true;\r\n                    scrollWithDrag(true, cursorPosY);\r\n                }\r\n            } else if (cursorPosY - scrollTop < elementRect.height) {\r\n                if (!dragScrolling) {\r\n                    dragScrolling = true;\r\n                    scrollWithDrag(false, cursorPosY);\r\n                }\r\n            } else {\r\n                // Stop the scroll function when the cursor is out of the scroll area\r\n                dragScrolling = false;\r\n            }\r\n        }\r\n    }\r\n\r\n    function scrollWithDrag(down) {\r\n        // When scrolling down, if the bottom of the list is 25px above the bottom of the page\r\n        if (down && listSection.getBoundingClientRect().bottom + 25 <= window.innerHeight) {\r\n            dragScrolling = false;\r\n        }\r\n\r\n        // When scrolling up, if the page is already at the top, stop scrolling\r\n        if (!down && document.body.parentElement.scrollTop <= 0) {\r\n            dragScrolling = false;\r\n        }\r\n\r\n        if (!dragScrolling) {\r\n            return;\r\n        }\r\n\r\n        const scrollAmount = down ? 3 : -3;\r\n\r\n        document.body.parentElement.scrollTop += scrollAmount;\r\n\r\n        // Move the dragged element to keep up with the moving page\r\n        draggedElementTop += scrollAmount;\r\n\r\n        // This function keeps calling itself until the max scroll is reached or dragScrolling is\r\n        // false. This keeps the scroll smooth instead of jumping only when the pointer moves.\r\n        setTimeout(() => {\r\n            scrollWithDrag(down);\r\n        }, 5);\r\n    }\r\n\r\n    // The list is reordered while dragging so once it is released trigger a save and stop\r\n    // dragging the element\r\n    function dragEnd() {\r\n        if (dragSelectedPlan) {\r\n            debounceSavePlanOrder();\r\n\r\n            sourceSelectedPlan = data.plans.filter(e => e.id === dragSelectedPlan.id);\r\n            let targetPlanIndex = data.plans.findIndex(e => e.id === dragSelectedPlan.id) + 1;\r\n\r\n            // Check if plan card will be placed last\r\n            if (targetPlanIndex === data.plans.length) {\r\n                targetPlanIndex = data.plans.findIndex(e => e.id === dragSelectedPlan.id) - 1;\r\n                targetSelectedPlanAfter = true;\r\n            } else {\r\n                targetSelectedPlanAfter = false;\r\n            }\r\n\r\n            targetSelectedPlan = data.plans.filter(e => e.id === data.plans[targetPlanIndex].id);\r\n\r\n            dragSelectedPlan = null;\r\n            dragScrolling = false;\r\n        }\r\n    }\r\n\r\n    // Show \"Own sorting\" confirm modal if needed after drag & drop (for plans within single topic only)\r\n    async function savePlanOrder() {\r\n        if (isPlansInTopicView()) {\r\n            const planOrder = await getPlanOrderInTopic(config.topicId);\r\n\r\n            currentPlanOrder = planOrder;\r\n\r\n            if (\r\n                planOrder !== planSorting.YourOwnSortingValue &&\r\n                !config.enableTopicPlansOwnSortingFixedOption\r\n            ) {\r\n                showReplaceSortingConfirmModal = true;\r\n            } else {\r\n                dragConfirmed = true;\r\n                await savePlanOrderAfterConfirmation();\r\n            }\r\n        } else {\r\n            dragConfirmed = true;\r\n            await savePlanOrderAfterConfirmation();\r\n        }\r\n    }\r\n\r\n    // Posts the new plan order to the API\r\n    async function savePlanOrderAfterConfirmation() {\r\n        orderDirty = true;\r\n\r\n        if (isPlansInTopicView()) {\r\n            if (!dragConfirmed) {\r\n                await loadPlansForTopic(plansData, config.publicAccessKey, config.topicId);\r\n\r\n                return;\r\n            } else if (sourceSelectedPlan && targetSelectedPlan) {\r\n                await dragAndDropPlanInTopic(\r\n                    sourceSelectedPlan[0].id,\r\n                    targetSelectedPlan[0].id,\r\n                    sourceSelectedPlan[0].topic ? sourceSelectedPlan[0].topic.id : null,\r\n                    targetSelectedPlanAfter,\r\n                    currentPlanOrder\r\n                );\r\n\r\n                await setPlanOrderInTopic(\r\n                    sourceSelectedPlan[0].topic.id,\r\n                    planSorting.YourOwnSortingValue\r\n                );\r\n                dispatch(\"plansForTopicHasBeenReordered\");\r\n            }\r\n        } else if (sourceSelectedPlan && targetSelectedPlan) {\r\n            await dragAndDropPlanInLesson(\r\n                sourceSelectedPlan[0].id,\r\n                targetSelectedPlan[0].id,\r\n                sourceSelectedPlan[0].topic ? sourceSelectedPlan[0].topic.id : null,\r\n                targetSelectedPlanAfter\r\n            );\r\n        }\r\n\r\n        sourceSelectedPlan = undefined;\r\n        targetSelectedPlan = undefined;\r\n        targetSelectedPlanAfter = false;\r\n\r\n        orderDirty = false;\r\n    }\r\n\r\n    function isPlansInTopicView() {\r\n        return (\r\n            !(loadMethod === loadWithoutDatePlans || loadMethod === loadAllPlans) &&\r\n            config.topicId &&\r\n            config.topicId > 0\r\n        );\r\n    }\r\n\r\n    // On scroll check how far the scroll is from the bottom, when it enters the bottom\r\n    // 100 px of the scrollable area, load more plans if there are more to load.\r\n    async function onScroll() {\r\n        const maxScroll = document.body.scrollHeight - window.innerHeight;\r\n\r\n        if (document.documentElement.scrollTop > maxScroll - 100) {\r\n            if (!scrollBottom) {\r\n                scrollBottom = true;\r\n\r\n                if (!data.loading && data.plans.length < data.total && isAutoloadingOn) {\r\n                    await showMore();\r\n                }\r\n            }\r\n        } else {\r\n            scrollBottom = false;\r\n        }\r\n    }\r\n\r\n    function toggleAutoloading() {\r\n        isAutoloadingOn = !isAutoloadingOn;\r\n    }\r\n\r\n    async function replaceSortingModalClicked(event) {\r\n        dragConfirmed = event.detail.confirmed;\r\n        showReplaceSortingConfirmModal = false;\r\n        await savePlanOrderAfterConfirmation();\r\n    }\r\n</script>\r\n","{#if (config.canEdit || showTableViewLinkForReadOnlyMode)}\r\n    {#if !isDataLoading}\r\n        <div class=\"its-plans__switch\">\r\n            <Link\r\n                kind=\"standalone\"\r\n                href={destinationUrl}\r\n                rel=\"noopener\"\r\n                iconClass=\"its-plans__switch-table-iconLink\"\r\n                iconPlacement=\"start\"\r\n                target=\"_self\"\r\n                text={i18n.tableView}\r\n                on:click\r\n            />\r\n        </div>\r\n    {/if}\r\n{/if}\r\n\r\n<script>\r\n    import Link from \"@itslearning/prometheus/assets/Navigation/Link/v1/Link.svelte\";\r\n    import { addBackDestinationParam } from \"../../helpers/backLinkHelper\";\r\n    import { planType } from \"../../constants\";\r\n\r\n    export let config;\r\n    export let i18n;\r\n    export let isDataLoading;\r\n    export let backExtraParams;\r\n\r\n    const showTableViewLinkForReadOnlyMode = config.showReadOnlyTableView && config.planType !== planType.onePlanAtATime && !config.publicAccessKey;\r\n\r\n    $: destinationUrl = addBackDestinationParam(\r\n        `/plans/courses/${config.courseId}/tableView`,\r\n        backExtraParams\r\n    );\r\n</script>\r\n","/**\n * @param {Date} date\n */\nexport function idForDay(date) {\n    return `${date.getFullYear()}-${date.getMonth()}-${date.getDate()}`;\n}\n\n/**\n * @param {Date} a\n * @param {Date} b\n */\nexport function isSameDate(a, b) {\n    if (!a || !b) {\n        return !!a === !!b;\n    }\n\n    return a.getFullYear() === b.getFullYear() &&\n       a.getMonth() === b.getMonth() &&\n       a.getDate() === b.getDate();\n}\n\n/**\n * @param {Date} date\n * @param {string} format\n */\nexport function dateToString(date, format) {\n    if (!date) {\n        return '';\n    }\n\n    const year = date.getFullYear().toString();\n    const month = (date.getMonth() + 1).toString();\n    const day = date.getDate().toString();\n\n    return format\n        .replace('YYYY', year)\n        .replace('YYY', year.slice(1, 3))\n        .replace('YY', year.slice(2, 3))\n        .replace('MM', (month.length === 1 ? `0${month}` : month))\n        .replace('M', month)\n        .replace('DD', (day.length === 1 ? `0${day}` : day))\n        .replace('D', day);\n}\n\n/**\n * @param {string} dateString\n * @param {string} format\n */\nexport function dateFromString(dateString, format) {\n    const indexes = [\n        { id: 'day', index: format.indexOf('D') },\n        { id: 'month', index: format.indexOf('M') },\n        { id: 'year', index: format.indexOf('Y') },\n    ].sort((a, b) => a.index - b.index);\n\n    const date = {};\n\n    try {\n        indexes.forEach(element => {\n            dateString = dateString.replace(/(?:^|\\D+)(\\d+)(?:\\D+|$)/, (_match, p1) => {\n                date[element.id] = parseInt(p1);\n\n                return '-';\n            });\n        });\n    } catch (_e) {\n        return null;\n    }\n\n    if (date.year !== undefined && date.month !== undefined && date.day !== undefined) {\n        return new Date(date.year, date.month - 1, date.day);\n    } else {\n        return null;\n    }\n}\n","<script>\n    export let value;\n    export let type;\n    export let classText;\n    export let disabled;\n    export let describedby;\n    export let placeholder;\n    export let required;\n    export let hasError = false;\n    export let autocomplete;\n    export let id;\n    export let step;\n    export let min;\n    export let max;\n    export let minlength = 0;\n    export let maxlength = 99;\n    export let spellcheck;\n    export let cols = 20;\n    export let rows = 2;\n\n    let conditionalAttributes;\n\n    $: {\n        const attributes = {};\n\n        if (spellcheck !== null && spellcheck !== undefined) {\n            attributes.spellcheck = spellcheck;\n        }\n\n        conditionalAttributes = attributes;\n    }\n</script>\n\n{#if type === 'text'}\n    <input\n        id=\"{id}\"\n        class=\"{classText}\"\n        disabled=\"{disabled}\"\n        placeholder=\"{placeholder}\"\n        required=\"{required}\"\n        class:prom-input-field__input--has-error={hasError}\n        type=\"text\"\n        autocomplete=\"{autocomplete}\"\n        aria-describedby=\"{describedby}\"\n        minlength=\"{minlength}\"\n        maxlength=\"{maxlength}\"\n        bind:value\n        on:focus\n        on:blur\n        on:click\n        on:keyup\n        on:input\n        on:paste\n        {...conditionalAttributes} />\n{:else if type === 'email'}\n    <input\n        id=\"{id}\"\n        class=\"{classText}\"\n        disabled=\"{disabled}\"\n        placeholder=\"{placeholder}\"\n        required=\"{required}\"\n        class:prom-input-field__input--has-error={hasError}\n        type=\"email\"\n        autocomplete=\"{autocomplete}\"\n        aria-describedby=\"{describedby}\"\n        minlength=\"{minlength}\"\n        maxlength=\"{maxlength}\"\n        bind:value\n        on:focus\n        on:blur\n        on:click\n        on:keyup\n        on:input\n        on:paste\n        {...conditionalAttributes} />\n{:else if type === 'password'}\n    <input\n        id=\"{id}\"\n        class=\"{classText}\"\n        disabled=\"{disabled}\"\n        placeholder=\"{placeholder}\"\n        required=\"{required}\"\n        class:prom-input-field__input--has-error={hasError}\n        type=\"password\"\n        autocomplete=\"{autocomplete}\"\n        aria-describedby=\"{describedby}\"\n        minlength=\"{minlength}\"\n        maxlength=\"{maxlength}\"\n        bind:value\n        on:focus\n        on:blur\n        on:click\n        on:keyup\n        on:input\n        on:paste\n        {...conditionalAttributes} />\n{:else if type === 'url'}\n    <input\n        id=\"{id}\"\n        class=\"{classText}\"\n        disabled=\"{disabled}\"\n        placeholder=\"{placeholder}\"\n        required=\"{required}\"\n        class:prom-input-field__input--has-error={hasError}\n        type=\"url\"\n        autocomplete=\"{autocomplete}\"\n        aria-describedby=\"{describedby}\"\n        minlength=\"{minlength}\"\n        maxlength=\"{maxlength}\"\n        bind:value\n        on:focus\n        on:blur\n        on:click\n        on:keyup\n        on:input\n        on:paste\n        {...conditionalAttributes} />\n{:else if type === 'tel'}\n    <input\n        id=\"{id}\"\n        class=\"{classText}\"\n        disabled=\"{disabled}\"\n        placeholder=\"{placeholder}\"\n        required=\"{required}\"\n        class:prom-input-field__input--has-error={hasError}\n        type=\"tel\"\n        autocomplete=\"{autocomplete}\"\n        aria-describedby=\"{describedby}\"\n        minlength=\"{minlength}\"\n        maxlength=\"{maxlength}\"\n        bind:value\n        on:focus\n        on:blur\n        on:click\n        on:keyup\n        on:input\n        on:paste\n        {...conditionalAttributes} />\n{:else if type === 'number'}\n    <input\n        id=\"{id}\"\n        class=\"{classText}\"\n        disabled=\"{disabled}\"\n        placeholder=\"{placeholder}\"\n        required=\"{required}\"\n        class:prom-input-field__input--has-error={hasError}\n        type=\"number\"\n        autocomplete=\"{autocomplete}\"\n        aria-describedby=\"{describedby}\"\n        step=\"{step}\"\n        min=\"{min}\"\n        max=\"{max}\"\n        minlength=\"{minlength}\"\n        maxlength=\"{maxlength}\"\n        bind:value\n        on:focus\n        on:blur\n        on:click\n        on:keyup\n        on:input\n        on:paste\n        {...conditionalAttributes} />\n{:else if type === 'area'}\n    <textarea\n        id=\"{id}\"\n        class=\"{classText}\"\n        disabled=\"{disabled}\"\n        placeholder=\"{placeholder}\"\n        required=\"{required}\"\n        class:prom-input-field__input--has-error={hasError}\n        autocomplete=\"{autocomplete}\"\n        aria-describedby=\"{describedby}\"\n        minlength=\"{minlength}\"\n        maxlength=\"{maxlength}\"\n        cols=\"{cols}\"\n        rows=\"{rows}\"\n        bind:value\n        on:focus\n        on:blur\n        on:click\n        on:keyup\n        on:input\n        on:paste\n        {...conditionalAttributes}></textarea>\n{/if}\n","<script>\n    import TextInput from './TextInput.svelte';\n\n    /** @type {string} */\n    export let id = 'rnd' + Math.random().toString(36).substring(7);\n\n    /** @type {string} */\n    export let label;\n\n    /** @type {'text'|'email'|'password'|'url'|'tel'|'area'|'number'} */\n    export let type = 'text';\n\n    /** @type {boolean} */\n    export let required = false;\n\n    /** @type {string} */\n    export let placeholder;\n\n    /** @type {boolean} */\n    export let disabled = false;\n\n    /** @type {string} */\n    export let value = null;\n\n    /** @type {string} */\n    export let hint = null;\n\n    /** @type {boolean} */\n    export let hasError = false;\n\n    /** @type {string} */\n    export let errorMessage = undefined;\n\n    /** @type {undefined|'small'|'medium'|'large'} */\n    export let height = null;\n\n    /** @type {string} */\n    export let step = 'any';\n\n    /** @type {number} */\n    export let min = undefined;\n\n    /** @type {number} */\n    export let max = undefined;\n\n    /** @type {number} */\n    export let minlength = 1;\n\n    /** @type {number} */\n    export let maxlength = 99;\n\n    /** @type {boolean} */\n    export let labelHidden = false;\n\n    /** @type {string} */\n    export let autocomplete = 'off';\n\n    /** @type {boolean|undefined} */\n    export let spellcheck = undefined;\n\n    /** @type {number} */\n    export let cols = 20;\n\n    /** @type {number} */\n    export let rows = 2;\n\n    /** @type {'left' | 'top'} */\n    export let labelPosition = 'top';\n\n    /** @type {undefined | 'off' | 'polite' | 'assertive'} */\n    export let ariaLiveUpdateType = null;\n\n    $: areaSizeClass =\n        type === 'area' && height\n            ? 'prom-input-field--' + height + '-area'\n            : '';\n\n    $: hasErrorClass = hasError ? 'prom-input-field--has-error' : '';\n\n    $: labelText =\n        !label || typeof label !== 'string'\n            ? console.warn('Label must be supplied')\n            : label;\n\n    $: errorMessageId = id + '__error-message';\n\n    $: labelHiddenClass = labelHidden ? 'screen-reader' : '';\n</script>\n\n<div id=\"{id}\" class=\"prom-input-field {hasErrorClass}\">\n    <!-- Ignore this a11y warning because it is incorrect, the label contains the control -->\n    <!-- svelte-ignore a11y-label-has-associated-control -->\n    <label class:prom-input-field--label-left={labelPosition === 'left'}>\n        <span class=\"prom-input-field__label {labelHiddenClass}\">\n            {labelText}\n            {#if required}\n                <span aria-hidden=\"true\" class=\"prom-input__required-star\"\n                    >*</span>\n            {/if}\n            {#if hint}<span class=\"prom-input-field__hint\">{hint}</span>{/if}\n        </span>\n\n        <TextInput\n            type=\"{type}\"\n            id=\"prom-input-{id}\"\n            classText=\"prom-input-field__input {areaSizeClass}\"\n            disabled=\"{disabled}\"\n            placeholder=\"{placeholder}\"\n            required=\"{required}\"\n            {hasError}\n            spellcheck=\"{spellcheck}\"\n            autocomplete=\"{autocomplete}\"\n            describedby=\"{errorMessageId}\"\n            cols=\"{cols}\"\n            rows=\"{rows}\"\n            step=\"{step}\"\n            min=\"{min}\"\n            max=\"{max}\"\n            minlength=\"{minlength}\"\n            maxlength=\"{maxlength}\"\n            bind:value\n            on:focus\n            on:blur\n            on:click\n            on:keyup\n            on:input\n            on:paste />\n    </label>\n\n    <div\n        aria-live={ariaLiveUpdateType}\n        class=\"prom-error-message\"\n        class:prom-error-message--shown={hasError && errorMessage}\n        id=\"{errorMessageId}\">\n        {#if hasError && errorMessage}\n            {errorMessage}\n        {/if}\n    </div>\n</div>\n","<div\n    class=\"prom-date-picker\"\n    role=\"dialog\"\n    aria-modal=\"true\"\n    aria-label={i18n.datepickerTitle}\n    on:keydown={onKeyPress}\n>\n    <div class=\"prom-date-picker__header\">\n        <button type=\"button\" class=\"prom-date-picker__previous-month prom-date-picker__icon\" on:click={(e) => changePage(-1, e)}>\n            <span class=\"screen-reader\">{i18n.previousMonth}</span>\n        </button>\n        <span>\n            {i18n['month' + selectorStartDate.getMonth()]}\n            {selectorStartDate.getFullYear()}\n        </span>\n        <button type=\"button\" class=\"prom-date-picker__next-month prom-date-picker__icon\" on:click={(e) => changePage(1, e)}>\n            <span class=\"screen-reader\">{i18n.nextMonth}</span>\n        </button>\n    </div>\n    <table bind:this={calendarElement} class=\"prom-date-picker__calendar\">\n        <thead class=\"prom-date-picker__calendar-row\">\n            <th class=\"prom-date-picker__calendar-header\" >{i18n.week}</th>\n            {#each daysOfWeek as day}\n                <th class=\"prom-date-picker__calendar-header\" >{i18n['day' + day]}</th>\n            {/each}\n        </thead>\n        {#each weeksToShow as week (week[0].id)}\n            <tr class=\"prom-date-picker__calendar-row\">\n                <td class=\"prom-date-picker__calendar-cell-week\">\n                    <span class=\"screen-reader\">\n                        {i18n.week}\n                    </span>\n                    <span class=\"prom-date-picker__week\">\n                        {week[0].weekNumber}\n                    </span>\n                </td>\n                {#each week as day (day.id)}\n                    <td class=\"prom-date-picker__calendar-cell\">\n                        <button\n                            type=\"button\"\n                            class=\"prom-date-picker__day prom-date-picker__{day.id}\"\n                            class:prom-date-picker__day--today={day.isToday}\n                            class:prom-date-picker__day--selected-month={day.isThisMonth}\n                            class:prom-date-picker__day--selected={isSameDate(day.date, value)}\n                            class:prom-date-picker__day--highlighted={day.highlighted}\n                            tabindex={isSameDate(day.date, value) ? 0 : -1}\n                            aria-label={day.dateString}\n                            aria-describedby=\"day-{day.id}-description\"\n                            on:click={(e) => setValue(day.date, e)}\n                        >\n                            {day.date.getDate()}\n\n                            <span id=\"day-{day.id}-description\" class=\"screen-reader\">\n                                {#if day.highlighted}\n                                    {i18n.highlightedDateDescription}\n                                {/if}\n                            </span>\n                        </button>\n                    </td>\n                {/each}\n            </tr>\n        {/each}\n    </table>\n    <div class=\"prom-date-picker__footer\">\n        <button class=\"prom-date-picker__today\" type=\"button\" on:click={setValueToday}>\n            {i18n.today}\n        </button>\n        {#if highlightedDates && highlightedDates.length}\n            <div class=\"prom-date-picker__highlight-legend\">\n                <span>{i18n.highlightedDatesLabel}</span>\n            </div>\n        {/if}\n    </div>\n</div>\n\n<script>\n    import { normalizeKey } from '@itslearning/atlas/keyboard/normalize';\n    import { Keys } from '@itslearning/atlas/keyboard/keys';\n    import { idForDay, isSameDate } from './dateHelpers';\n    import { createEventDispatcher } from 'svelte';\n\n    const dispatch = createEventDispatcher();\n\n    export let value = null;\n    export let firstDayOfWeek = 1;\n    export let selectorStartDate = new Date();\n    export let locale = 'en-US';\n    export let i18n = {};\n    export let highlightedDates = [];\n\n    /**\n     * @description Gets week number from a given input date\n     * @param {Date} inputDate - The date to get the week number from.\n     */\n    function getWeek(inputDate) {\n            const date = new Date(Date.UTC(inputDate.getFullYear(), inputDate.getMonth(), inputDate.getDate()));\n            const dayNumber = date.getUTCDay() || 7;\n            date.setUTCDate(date.getUTCDate() + 4 - dayNumber);\n            const firstDayOfYear = new Date(Date.UTC(date.getUTCFullYear(), 0, 1));\n            return Math.ceil((((+date - +firstDayOfYear) / 86400000) + 1) / 7)\n    }\n\n    let calendarElement;\n\n    $: if (value) {\n        selectorStartDate = new Date(value.getFullYear(), value.getMonth(), 1);\n    }\n\n    let weeksToShow;\n\n    $: {\n        const firstDateOfMonth = new Date(selectorStartDate.getFullYear(), selectorStartDate.getMonth(), 1);\n\n        let diff = firstDayOfWeek - firstDateOfMonth.getDay();\n\n        if (diff > 0) {\n            diff -= 7;\n        }\n\n        const firstDateToDisplay = new Date(firstDateOfMonth);\n\n        firstDateToDisplay.setDate(firstDateOfMonth.getDate() + diff);\n\n        const day = new Date(firstDateToDisplay);\n        const weeks = [];\n        const today = new Date();\n\n        for (let i = 0; i < 6; i++) {\n            const week = [];\n\n            for (let i = 0; i < 7; i++) {\n                const date = new Date(day);\n                week.push({\n                    id: idForDay(date),\n                    date,\n                    isToday: isSameDate(date, today),\n                    isThisMonth: date.getMonth() === firstDateOfMonth.getMonth(),\n                    dateString: date.toLocaleDateString(locale, { dateStyle: 'full' }),\n                    weekNumber: getWeek(date),\n                    weekString: i18n.week + getWeek(date),\n                    highlighted: highlightedDates.some(i => isSameDate(i, date)),\n                });\n\n                day.setDate(day.getDate() + 1);\n            }\n\n            if (week.some(day => day.isThisMonth)) {\n                weeks.push(week);\n            }\n        }\n\n        weeksToShow = weeks;\n    }\n\n    const days = [0, 1, 2, 3, 4, 5, 6];\n\n    $: daysOfWeek = firstDayOfWeek === 0 ? days : [...days.slice(firstDayOfWeek), ...days.slice(0, firstDayOfWeek)];\n\n    function changePage(months, event) {\n        const newSelectorStartDate = new Date(selectorStartDate);\n\n        newSelectorStartDate.setDate(1);\n        newSelectorStartDate.setMonth(selectorStartDate.getMonth() + months);\n\n        selectorStartDate = newSelectorStartDate;\n\n        // If keyboard click\n        if (event.screenX === 0 && event.screenY === 0) {\n            setValue(selectorStartDate, event);\n        }\n    }\n\n    function setValue(date, event) {\n        value = date;\n\n        const selector = `.prom-date-picker__${idForDay(date)}`;\n\n        setTimeout(() => {\n            calendarElement.querySelector(selector).focus();\n            dispatch('select', event);\n        }, 0);\n    }\n\n    function setValueToday(event) {\n        setValue(new Date(), event);\n    }\n\n    function onKeyPress(event) {\n        const { key } = event;\n\n        const newValue = value ? new Date(value) : new Date();\n\n        switch (normalizeKey(key)) {\n            case Keys.DOWN:\n                newValue.setDate(newValue.getDate() + 7);\n                break;\n            case Keys.UP:\n                newValue.setDate(newValue.getDate() - 7);\n                break;\n            case Keys.RIGHT:\n                newValue.setDate(newValue.getDate() + 1);\n                break;\n            case Keys.LEFT:\n                newValue.setDate(newValue.getDate() - 1);\n                break;\n            case Keys.PAGEUP:\n                newValue.setDate(1);\n                newValue.setMonth(newValue.getMonth() - 1);\n                break;\n            case Keys.PAGEDOWN:\n                newValue.setDate(1);\n                newValue.setMonth(newValue.getMonth() + 1);\n                break;\n            case Keys.ESCAPE:\n                break;\n            case Keys.SPACE:\n            case Keys.ENTER:\n                if (!calendarElement.contains(event.target)) {\n                    return;\n                }\n\n                break;\n            default:\n                return;\n        }\n\n        event.preventDefault();\n        setValue(newValue, event);\n    }\n</script>\n","<script>\n    import { normalizeKey } from '@itslearning/atlas/keyboard/normalize';\n    import { Keys } from '@itslearning/atlas/keyboard/keys';\n    import TabTrapHelper from '../../../../lib/helpers/TabTrapHelper';\n    import {\n        idForDay,\n        isSameDate,\n        dateFromString,\n        dateToString,\n    } from '../../DatePicker/v1/dateHelpers';\n    import TextField from '../../TextField/v1/TextField.svelte';\n    import DatePicker from '../../DatePicker/v1/DatePicker.svelte';\n    import { createEventDispatcher, onMount } from 'svelte';\n\n    export let autocomplete = 'off';\n    export let closeOnSelect = true;\n    export let disabled = false;\n    export let expanded = false;\n    export let firstDayOfWeek = 1;\n    export let format = 'MM.DD.YYYY';\n    export let highlightedDates = [];\n    export let i18n = {};\n    export let id = 'date-picker';\n    export let inputValue = '';\n    export let label = undefined;\n    export let labelHidden = false;\n    /** @type {'left' | 'top'} */\n    export let labelPosition = 'top';\n    export let locale = 'en-US';\n    export let placeholder = '';\n    export let hasError = false;\n    export let errorMessage = undefined;\n    export let value = null;\n\n    let position = { x: 0, y: 0 };\n    let wrapperElement;\n    let inputElement;\n    let tabTrapElement;\n    let selectorStartDate;\n    let tabTrapper;\n\n    const dispatch = createEventDispatcher();\n\n    onMount(() => {\n        tabTrapper = new TabTrapHelper(tabTrapElement);\n    });\n\n    $: valueChanged(value);\n\n    function valueChanged(value) {\n        const newInputValue = dateToString(value, format);\n\n        if (inputValue !== newInputValue) {\n            inputValue = newInputValue;\n        }\n    }\n\n    $: inputValueChanged(inputValue);\n\n    function inputValueChanged(inputValue) {\n        const newValue = dateFromString(inputValue, format);\n\n        if (newValue !== null) {\n            if (!isSameDate(value, newValue)) {\n                selectorStartDate = newValue;\n            }\n        } else {\n            selectorStartDate = new Date();\n        }\n\n        if (value !== newValue) {\n            value = newValue;\n        }\n    }\n\n    $: if (expanded) {\n        setTimeout(() => {\n            tabTrapper.init();\n        }, 0);\n    }\n\n    $: style = `left: ${position.x}px; top: ${position.y}px;`;\n\n    function focusValue() {\n        if (!value) {\n            value = new Date();\n        }\n\n        const selector = `.prom-date-picker__${idForDay(value)}`;\n\n        setTimeout(() => {\n            if (expanded) {\n                tabTrapElement.querySelector(selector).focus();\n            }\n        }, 0);\n    }\n\n    function onInputBlurred() {\n        if (value !== null) {\n            const dateString = dateToString(value, format);\n\n            if (dateString !== inputValue) {\n                inputValue = dateString;\n            }\n        }\n    }\n\n    function dateSelected({ detail: event }) {\n        if (event.type === 'click' && closeOnSelect) {\n            // If this is a mouse click screen X and Y will be set, if not do not close\n            if (event.screenX !== 0 && event.screenY !== 0) {\n                setExpanded(false);\n            }\n        } else if (event.type === 'keydown') {\n            const key = normalizeKey(event.key);\n\n            if (\n                key === Keys.SPACE ||\n                key === Keys.ENTER ||\n                key === Keys.ESCAPE\n            ) {\n                setExpanded(false);\n            }\n        }\n\n        dispatch('select', event);\n    }\n\n    function setExpanded(newExpanded) {\n        if (newExpanded && disabled) {\n            return;\n        }\n\n        const inputElementInner = inputElement.querySelector(`input`);\n\n        if (newExpanded === expanded) {\n            return;\n        }\n\n        if (newExpanded) {\n            const wrapperRect = wrapperElement.getBoundingClientRect();\n            const inputRect = inputElementInner.getBoundingClientRect();\n\n            position = {\n                x: inputRect.left - wrapperRect.left,\n                y: inputRect.top + inputRect.height - wrapperRect.top,\n            };\n\n            focusValue();\n            expanded = newExpanded;\n        } else {\n            setTimeout(() => {\n                inputElementInner.focus();\n                expanded = newExpanded;\n            }, 0);\n        }\n    }\n\n    function onInputKeyPress(event) {\n        const { key } = event;\n\n        switch (normalizeKey(key)) {\n            case Keys.ENTER:\n                dispatch('select', event);\n\n                break;\n        }\n    }\n</script>\n\n{#if expanded}\n    <div\n        class=\"prom-date-picker__overlay\"\n        on:click={() => setExpanded(false)}>\n    </div>\n{/if}\n\n<div bind:this={wrapperElement} class=\"prom-date-picker__wrapper\">\n    <div bind:this={inputElement} class=\"prom-date-picker__input\">\n        <TextField\n            id=\"{id}-input\"\n            type=\"text\"\n            hint={null}\n            {label}\n            {autocomplete}\n            {disabled}\n            {labelHidden}\n            {labelPosition}\n            {placeholder}\n            {hasError}\n            {errorMessage}\n            bind:value={inputValue}\n            on:keyup={onInputKeyPress}\n            on:blur={onInputBlurred} \n            on:blur\n        />\n        <button\n            {disabled}\n            type=\"button\"\n            class=\"prom-date-picker__picker-button\"\n            class:prom-date-picker__picker-button--top={labelPosition ===\n                'top'}\n            on:click={() => setExpanded(true)}>\n            <span class=\"screen-reader\"\n                >{i18n.openDatePicker}</span>\n        </button>\n    </div>\n\n    <div\n        class=\"prom-date-picker__popup\"\n        {style}\n        bind:this={tabTrapElement}>\n        {#if expanded}\n            <div\n                role=\"dialog\"\n                aria-label={i18n.datePickerTitle}\n                aria-modal=\"true\">\n                <DatePicker\n                    bind:value\n                    {firstDayOfWeek}\n                    {locale}\n                    {i18n}\n                    on:select={dateSelected}\n                    {selectorStartDate}\n                    {highlightedDates} \n                />\n            </div>\n        {/if}\n    </div>\n</div>\n","<div\r\n    class=\"datetime-picker-modal__error\"\r\n    class:datetime-picker-modal__error--hidden={!setValidDatesErrorMessage}\r\n    aria-live=\"assertive\"\r\n    role=\"alert\"\r\n>\r\n    {i18n.youMustSetValidDates}\r\n</div>\r\n<div\r\n    class=\"datetime-picker-modal__error\"\r\n    class:datetime-picker-modal__error--hidden={!(\r\n        showStartStopErrorMessage ||\r\n        showStartInvalidMessage ||\r\n        showStopInvalidMessage\r\n    )}\r\n    aria-live=\"assertive\"\r\n    role=\"alert\"\r\n>\r\n    {showStartStopErrorMessage\r\n        ? i18n.errorStopDateLessThanStartDate\r\n        : showStartInvalidMessage\r\n          ? i18n.calendar_Recurring_invalid_from_date\r\n          : i18n.calendar_Recurring_invalid_to_date}\r\n</div>\r\n\r\n<script>\r\n    export let showStartStopErrorMessage;\r\n    export let setValidDatesErrorMessage;\r\n    export let showStartInvalidMessage;\r\n    export let showStopInvalidMessage;\r\n    export let i18n;\r\n</script>\r\n","<script>\n    import { createEventDispatcher } from 'svelte';\n    import { guidV4 } from '@itslearning/atlas/generate/guid';\n\n    const dispatch = createEventDispatcher();\n    /** @type {string} */\n    export let label;\n    /** @type {string} */\n    export let id = 'rnd' + Math.random().toString(36);\n    /** @type {string} */\n    export let value = undefined;\n    /** @type {string} */\n    export let name = undefined;\n    /** @type {boolean} */\n    export let hasError = false;\n    /** @type {string} */\n    export let errorMessage = undefined;\n    /** @type {boolean} */\n    export let required = false;\n    /** @type {boolean} */\n    export let disabled = false;\n    /** @type {string} */\n    export let description = undefined;\n    /** @type {string} */\n    export let describedBy = undefined;\n    /** @type {'left' | 'top'} */\n    export let labelPosition = 'top';\n    /** @type {boolean} */\n    export let labelHidden = false;\n\n    describedBy =\n        description && !describedBy\n            ? 'prom-checkbox__information_id-' + guidV4()\n            : describedBy;\n\n    $: labelText = label || console.warn('Select label text was not supplied!');\n    $: hasErrorClass = hasError ? 'prom-select--has-error' : '';\n</script>\n\n<div class=\"prom-select\">\n    <div class=\"prom-select__wrapper {hasErrorClass}\" class:prom-select__wrapper--label-left={labelPosition === 'left'}>\n        <label for=\"{id}\" class:screen-reader={labelHidden} class=\"prom-select__label-text\">\n            {labelText}\n\n            {#if required}\n                <span aria-hidden=\"true\" class=\"prom-select__required-star\">*</span>\n            {/if}\n        </label>\n        <div class=\"prom-select__select-container\">\n            <select\n                id=\"{id}\"\n                bind:value=\"{value}\"\n                name=\"{name}\"\n                required=\"{required}\"\n                disabled=\"{disabled}\"\n                class=\"prom-select__select\"\n                on:change=\"{() => dispatch('change', value)}\"\n                aria-describedby=\"{describedBy}\">\n                <slot />\n            </select>\n            <div class=\"prom-select__focus-wrapper\"></div>\n        </div>\n    </div>\n\n    {#if hasError && errorMessage}\n        <div id=\"{describedBy}\" class=\"prom-error-message\">{errorMessage}</div>\n    {:else if description}\n        <div id=\"{describedBy}\" class=\"prom-select__description\"\n            >{description}</div>\n    {/if}\n</div>\n","{#if hasGroupData}\r\n    <Select\r\n        label={i18n.participants}\r\n        labelPosition=\"left\"\r\n        id=\"ParticipantsConnectToCalendarId\"\r\n        bind:value={participants}\r\n        on:change={changeValue}\r\n    >\r\n        {#if hasAllParticipantsData}\r\n            <option value=\"0\">\r\n                {i18n.allParticipants}\r\n            </option>\r\n        {/if}\r\n\r\n        {#if hasGroupData}\r\n            {#each [...courseGroups] as [key, value]}\r\n                <option value={key}>\r\n                    {value.groupName}\r\n                </option>\r\n            {/each}\r\n        {/if}\r\n    </Select>\r\n{/if}\r\n\r\n<script>\r\n    import Select from \"@itslearning/prometheus/assets/inputs/Select/v1/Select.svelte\";\r\n    import { createEventDispatcher } from \"svelte\";\r\n\r\n    export let i18n;\r\n    export let participants;\r\n    export let availableEvents;\r\n\r\n    let courseGroups = new Map();\r\n    let numberOfCourseGroups = 0;\r\n    let numberOfAllParticipantsEvents = 0;\r\n\r\n    const dispatch = createEventDispatcher();\r\n\r\n    $: if (availableEvents) {\r\n        const updatedCourseGroups = new Map();\r\n\r\n        let firstAllParticpantsEventId = 0;\r\n        let firstGroupEventId = 0;\r\n\r\n        numberOfCourseGroups = 0;\r\n        numberOfAllParticipantsEvents = 0;\r\n\r\n        availableEvents.forEach(event => {\r\n            if (!event.eventOccupied) {\r\n                if (event.groupId > 0) {\r\n                    if (!updatedCourseGroups.get(event.groupId)) {\r\n                        updatedCourseGroups.set(event.groupId, {\r\n                            eventId: event.eventId,\r\n                            groupName: event.participants\r\n                        });\r\n\r\n                        numberOfCourseGroups = numberOfCourseGroups + 1;\r\n\r\n                        if (firstGroupEventId === 0) {\r\n                            firstGroupEventId = event.eventId;\r\n                        }\r\n                    }\r\n                } else {\r\n                    numberOfAllParticipantsEvents = numberOfAllParticipantsEvents + 1;\r\n\r\n                    if (firstAllParticpantsEventId === 0) {\r\n                        firstAllParticpantsEventId = event.eventId;\r\n                    }\r\n                }\r\n            }\r\n        });\r\n        courseGroups = updatedCourseGroups;\r\n\r\n        // Default setting after events reload\r\n        if (firstAllParticpantsEventId !== 0) {\r\n            dispatch(\"firstEventIdBySelection\", {\r\n                firstEventId: firstAllParticpantsEventId\r\n            });\r\n        } else if (firstGroupEventId !== 0) {\r\n            dispatch(\"firstEventIdBySelection\", {\r\n                firstEventId: firstGroupEventId\r\n            });\r\n        } else {\r\n            dispatch(\"firstEventIdBySelection\", {\r\n                firstEventId: null\r\n            });\r\n        }\r\n    }\r\n\r\n    $: hasGroupData = numberOfCourseGroups > 0;\r\n\r\n    $: hasAllParticipantsData = numberOfAllParticipantsEvents > 0;\r\n\r\n    const changeValue = async event => {\r\n        const groupId = event.detail;\r\n\r\n        if (groupId) {\r\n            const groupObject = courseGroups.get(groupId);\r\n\r\n            if (groupObject.eventId) {\r\n                dispatch(\"firstEventIdBySelection\", {\r\n                    firstEventId: groupObject.eventId\r\n                });\r\n            }\r\n        }\r\n    };\r\n</script>\r\n","<div class=\"connect-to-calendar-modal\" {planIds}>\r\n    <Modal\r\n        id=\"connect-to-calendar-modal-id\"\r\n        bind:enabled={showConnectToCalendarModal}\r\n        titleText={i18n.connectToCalendar}\r\n        confirmText={i18n.connect}\r\n        cancelText={i18n.cancel}\r\n        on:close={connectToCalendarModalClicked}\r\n    >\r\n        <div slot=\"body\">\r\n            <Banner\r\n                visible={bannerVisible}\r\n                type=\"warning\"\r\n                closable={false}\r\n                text={i18n.connectToCalendarBannerWarningText}\r\n            />\r\n            <div class=\"connect-calendar-modal-section__description\">\r\n                {i18n.connectToCalendar_Description}\r\n            </div>\r\n            <div class={dateTimePickerModalFromSection}>\r\n                <DatePickerField\r\n                    bind:value={dateValueFrom}\r\n                    bind:expanded={datePickerFromExpanded}\r\n                    bind:highlightedDates\r\n                    firstDayOfWeek={config.firstDayOfWeek}\r\n                    locale={config.locale}\r\n                    id=\"date-picker-from\"\r\n                    label={i18n.calendarFrom}\r\n                    labelPosition=\"left\"\r\n                    placeholder={i18n.datePickerPlaceholder}\r\n                    format={dateFormat}\r\n                    closeOnSelect={true}\r\n                    {i18n}\r\n                />\r\n            </div>\r\n            <div class={dateTimePickerModalToSection}>\r\n                <DatePickerField\r\n                    bind:value={dateValueTo}\r\n                    bind:expanded={datePickerToExpanded}\r\n                    bind:highlightedDates\r\n                    firstDayOfWeek={config.firstDayOfWeek}\r\n                    locale={config.locale}\r\n                    id=\"date-picker-to\"\r\n                    label={i18n.calendarTo}\r\n                    labelPosition=\"left\"\r\n                    placeholder={i18n.datePickerPlaceholder}\r\n                    format={dateFormat}\r\n                    closeOnSelect={true}\r\n                    {i18n}\r\n                />\r\n            </div>\r\n            <ConnectToCalendarModalError\r\n                {showStartStopErrorMessage}\r\n                {setValidDatesErrorMessage}\r\n                {showStartInvalidMessage}\r\n                {showStopInvalidMessage}\r\n                {i18n}\r\n            />\r\n            <ConnectToCalendarSelector\r\n                bind:availableEvents\r\n                {i18n}\r\n                on:firstEventIdBySelection={changeFirstEventId}\r\n            />\r\n            {#if showEmptyState}\r\n                <EmptyState\r\n                    iconName=\"events\"\r\n                    title={i18n.connectToCalendarEmptyStateHeading}\r\n                    description={i18n.connectToCalendarEmptyStateDescription}\r\n                    showLink={true}\r\n                    linkText={i18n.connectToCalendarEmptyStateLinkText}\r\n                    href={config.calendarUrl}\r\n                />\r\n            {/if}\r\n        </div>\r\n    </Modal>\r\n</div>\r\n\r\n<script>\r\n    import DatePickerField from \"@itslearning/prometheus/assets/inputs/DatePickerField/v1/DatePickerField.svelte\";\r\n    import Modal from \"@itslearning/prometheus/assets/modals/Modal/v2/Modal.svelte\";\r\n    import Banner from \"@itslearning/prometheus/assets/feedback/Banner/v1/Banner.svelte\";\r\n    import EmptyState from \"@itslearning/prometheus/assets/nodes/EmptyState/v1/EmptyState.svelte\";\r\n    import ConnectToCalendarModalError from \"./ConnectToCalendarModalError.svelte\";\r\n    import ConnectToCalendarSelector from \"./ConnectToCalendarSelector.svelte\";\r\n    import config from \"../../config\";\r\n    import { dateTimePickerModalFromSection, dateTimePickerModalToSection } from \"../../constants\";\r\n    import {\r\n        formatDateOnlyForApi,\r\n        getEventsDateRangeString,\r\n        validateDateFormat\r\n    } from \"../../helpers/dateHelper\";\r\n    import { createEventDispatcher, onMount } from \"svelte\";\r\n    import { getCalendarAvailableDates } from \"../../api\";\r\n\r\n    export let showConnectToCalendarModal;\r\n    export let i18n;\r\n    export let planIds;\r\n\r\n    let dateValueFrom;\r\n    let dateValueFromInitially;\r\n    let datePickerFromExpanded = false;\r\n    let dateValueTo;\r\n    let dateValueToInitially;\r\n    let datePickerToExpanded = false;\r\n\r\n    let mountComplete = false;\r\n    let showStartStopErrorMessage = false;\r\n    let setValidDatesErrorMessage = false;\r\n    let showStartInvalidMessage = false;\r\n    let showStopInvalidMessage = false;\r\n    let showEmptyState = false;\r\n\r\n    let allEvents = [];\r\n    let availableEvents = [];\r\n    let highlightedDates = [];\r\n\r\n    let firstEventId = undefined;\r\n    let bannerVisible = false;\r\n\r\n    const dateFormat = config.currentDateFormat;\r\n\r\n    const dispatch = createEventDispatcher();\r\n\r\n    $: showEmptyState =\r\n        !firstEventId &&\r\n        dateValueFrom &&\r\n        dateValueTo &&\r\n        !showStartStopErrorMessage &&\r\n        !showStartInvalidMessage &&\r\n        !showStopInvalidMessage &&\r\n        !setValidDatesErrorMessage;\r\n\r\n    $: {\r\n        const datePickerFrom = dateValueFrom ? new Date(dateValueFrom) : undefined;\r\n        const datePickerTo = dateValueTo ? new Date(dateValueTo) : undefined;\r\n\r\n        if (!datePickerFrom || !datePickerTo) {\r\n            showStartStopErrorMessage = false;\r\n            showStartInvalidMessage = false;\r\n            showStopInvalidMessage = false;\r\n        } else {\r\n            // Use epoch time to compare time (ms since 1970)\r\n            const epochStart = datePickerFrom.valueOf();\r\n            const epochStop = datePickerTo.valueOf();\r\n\r\n            setValidDatesErrorMessage = false;\r\n            showStartInvalidMessage = false;\r\n            showStopInvalidMessage = false;\r\n            showStartStopErrorMessage = epochStart > epochStop;\r\n        }\r\n    }\r\n\r\n    $: if (\r\n        mountComplete &&\r\n        dateValueFrom &&\r\n        dateValueFromInitially !== dateValueFrom &&\r\n        !datePickerFromExpanded\r\n    ) {\r\n        getCourseEventsInCurrentTimespan(false);\r\n    }\r\n\r\n    $: if (\r\n        mountComplete &&\r\n        dateValueTo &&\r\n        dateValueToInitially !== dateValueTo &&\r\n        !datePickerToExpanded\r\n    ) {\r\n        getCourseEventsInCurrentTimespan(false);\r\n    }\r\n\r\n    onMount(async () => {\r\n        dateValueFrom = new Date(Date.now());\r\n\r\n        await getAllCourseEvents();\r\n\r\n        mountComplete = true;\r\n    });\r\n\r\n    function connectToCalendarModalClicked(event) {\r\n        if (event.detail.confirmed === true) {\r\n            if (!dateValueFrom || !dateValueTo) {\r\n                setValidDatesErrorMessage = true;\r\n                showConnectToCalendarModal = true;\r\n            } else {\r\n                setValidDatesErrorMessage = false;\r\n\r\n                const datePickerFrom = new Date(dateValueFrom);\r\n                const datePickerTo = new Date(dateValueTo);\r\n\r\n                const fromDatePickerInputField = \"prom-input-date-picker-from-input\";\r\n                const toDatePickerInputField = \"prom-input-date-picker-to-input\";\r\n\r\n                const dateFrom = document.getElementById(fromDatePickerInputField).value;\r\n                const dateTo = document.getElementById(toDatePickerInputField).value;\r\n\r\n                const validateDateToFormat = validateDateFormat(dateTo, dateFormat);\r\n                const validateDateFromFormat = validateDateFormat(dateFrom, dateFormat);\r\n\r\n                if (!validateDateFromFormat) {\r\n                    showStartInvalidMessage = true;\r\n                    showStopInvalidMessage = false;\r\n                    showConnectToCalendarModal = true;\r\n\r\n                    return;\r\n                }\r\n\r\n                if (!validateDateToFormat) {\r\n                    showStopInvalidMessage = true;\r\n                    showStartInvalidMessage = false;\r\n                    showConnectToCalendarModal = true;\r\n\r\n                    return;\r\n                }\r\n\r\n                if (!firstEventId) {\r\n                    bannerVisible = true;\r\n                    showConnectToCalendarModal = true;\r\n\r\n                    return;\r\n                }\r\n\r\n                // Only whole days\r\n                datePickerFrom.setHours(0, 1);\r\n                datePickerTo.setHours(23, 59);\r\n\r\n                // Use epoch time to compare time (ms since 1970)\r\n                const epochStart = datePickerFrom.valueOf();\r\n                const epochStop = datePickerTo.valueOf();\r\n\r\n                // We need to check that the selected time is valid as well\r\n                showStartStopErrorMessage = epochStart > epochStop ? true : false;\r\n\r\n                if (showStartStopErrorMessage) {\r\n                    showConnectToCalendarModal = true;\r\n                }\r\n\r\n                if (firstEventId > 0) {\r\n                    // Only possible to have one item in new planner (despite use of array)\r\n                    const activityArray = [];\r\n\r\n                    activityArray.push(firstEventId.toString());\r\n\r\n                    dispatch(\"connectToCalendar\", {\r\n                        activityIds: activityArray\r\n                    });\r\n                }\r\n            }\r\n        } else {\r\n            dispatch(\"close\");\r\n        }\r\n    }\r\n\r\n    // Function to get course events in the currently selected timespan\r\n    // As long as selected start or stop time is within event range it should also appear\r\n    function getCourseEventsInCurrentTimespan(setConnectingEvents) {\r\n        const datePickerFrom = dateValueFrom ? new Date(dateValueFrom) : undefined;\r\n        const datePickerTo = dateValueTo ? new Date(dateValueTo) : undefined;\r\n\r\n        if (!datePickerFrom || !datePickerTo) {\r\n            return;\r\n        }\r\n\r\n        // Only whole days\r\n        datePickerFrom.setHours(0, 1);\r\n        datePickerTo.setHours(23, 59);\r\n\r\n        const updatedAvailableEvents = [];\r\n\r\n        allEvents.forEach(function (event) {\r\n            if (\r\n                (datePickerFrom >= event.eventFrom && datePickerFrom <= event.eventTo) ||\r\n                (datePickerTo >= event.eventFrom && datePickerTo <= event.eventTo) ||\r\n                (event.eventFrom >= datePickerFrom && event.eventTo <= datePickerTo)\r\n            ) {\r\n                updatedAvailableEvents.push({\r\n                    eventId: event.eventId,\r\n                    eventOccupied: event.eventOccupied,\r\n                    eventConnected: setConnectingEvents ? event.eventConnected : false,\r\n                    eventDate: event.eventDate,\r\n                    eventTitle: event.eventTitle,\r\n                    groupId: event.groupId,\r\n                    participants: event.participants,\r\n                    eventFrom: event.eventFrom,\r\n                    eventTo: event.eventTo\r\n                });\r\n            }\r\n        });\r\n        availableEvents = updatedAvailableEvents;\r\n    }\r\n\r\n    // Function to get all available course events\r\n    async function getAllCourseEvents() {\r\n        if (!config.hasFunctionalityCalendar) {\r\n            return;\r\n        }\r\n\r\n        const datePickerMin = new Date(1999, 1, 1);\r\n        const datePickerMax = new Date(2999, 12, 31);\r\n\r\n        formatDateOnlyForApi(datePickerMin, datePickerMax);\r\n\r\n        const events = await getCalendarAvailableDates(datePickerMin, datePickerMax);\r\n\r\n        const pickerHighlightedDates = [];\r\n        const allCourseEvents = [];\r\n\r\n        let multipleDaysPlan = false;\r\n        let firstEventStartDate = null;\r\n        let firstEventStopDate = null;\r\n\r\n        if (events.length > 0) {\r\n            firstEventStartDate = new Date(events[0].Start);\r\n            firstEventStopDate = new Date(events[0].Stop);\r\n\r\n            if (firstEventStartDate != firstEventStopDate) {\r\n                multipleDaysPlan = true;\r\n            }\r\n        }\r\n\r\n        // Check if any of the dates differs so we need to include date (in addition to time)\r\n        if (firstEventStartDate && !multipleDaysPlan) {\r\n            let curentEventStartDate = null;\r\n            let currentEventStopDate = null;\r\n\r\n            events.forEach(function (event) {\r\n                curentEventStartDate = new Date(event.Start);\r\n                currentEventStopDate = new Date(event.Stop);\r\n\r\n                if (\r\n                    curentEventStartDate !== firstEventStartDate ||\r\n                    currentEventStopDate !== firstEventStartDate\r\n                ) {\r\n                    multipleDaysPlan = true;\r\n                }\r\n            });\r\n        }\r\n\r\n        events.forEach(function (event) {\r\n            const eventFrom = event.Start ? new Date(event.Start) : undefined;\r\n            const eventTo = event.Stop ? new Date(event.Stop) : undefined;\r\n\r\n            if (eventFrom && eventTo) {\r\n                const formattedDate = getEventsDateRangeString(\r\n                    eventFrom,\r\n                    eventTo,\r\n                    config.locale,\r\n                    multipleDaysPlan\r\n                );\r\n\r\n                let isOccupied = false;\r\n                let isConnected = false;\r\n\r\n                if (event.PlanId === config.planId) {\r\n                    isConnected = true;\r\n                } else {\r\n                    if (event.PlanId && event.PlanId !== 0 && !event.PlanDeleted) {\r\n                        isOccupied = true;\r\n                    }\r\n                }\r\n\r\n                allCourseEvents.push({\r\n                    eventId: event.EventId,\r\n                    eventOccupied: isOccupied,\r\n                    eventConnected: isConnected,\r\n                    eventDate: formattedDate,\r\n                    eventTitle: event.EventTitle,\r\n                    groupId: event.GroupId,\r\n                    participants: event.GroupTitle,\r\n                    eventFrom: eventFrom,\r\n                    eventTo: eventTo\r\n                });\r\n\r\n                if (\r\n                    event &&\r\n                    (event.PlanId === 0 || event.PlanId === config.planId || event.PlanDeleted)\r\n                ) {\r\n                    const epochStart = eventFrom.valueOf();\r\n                    const epochStop = eventTo.valueOf();\r\n\r\n                    const dayCounter = Math.floor((epochStop - epochStart) / (1000 * 60 * 60 * 24));\r\n\r\n                    if (dayCounter > 0) {\r\n                        for (let i = 0; i <= dayCounter; i++) {\r\n                            const currentDatePointer = new Date();\r\n\r\n                            currentDatePointer.setTime(epochStart + i * (1000 * 60 * 60 * 24));\r\n                            pickerHighlightedDates.push(currentDatePointer);\r\n                        }\r\n                    } else {\r\n                        pickerHighlightedDates.push(eventFrom);\r\n                    }\r\n                }\r\n            }\r\n        });\r\n        highlightedDates = pickerHighlightedDates;\r\n        allEvents = allCourseEvents;\r\n        getCourseEventsInCurrentTimespan(true);\r\n    }\r\n\r\n    function changeFirstEventId(event) {\r\n        firstEventId = event.detail.firstEventId;\r\n        bannerVisible = false;\r\n    }\r\n</script>\r\n","<Modal\r\n    id=\"show-copy-plans-confirm-modal-id\"\r\n    bind:enabled={showCopyConfirmModal}\r\n    titleText={i18n.copy}\r\n    confirmText={i18n.close}\r\n    showCancel={false}\r\n    on:close={close}\r\n>\r\n    <div slot=\"body\">\r\n        <!-- eslint-disable-next-line svelte/no-at-html-tags -->\r\n        <div class=\"copy-plans-confirm-modal__body\">{@html confirmModalBody}</div>\r\n        <Banner visible={bannerVisible} type=\"warning\" closable={false} html={bannerText} />\r\n    </div>\r\n</Modal>\r\n\r\n<script>\r\n    import Modal from \"@itslearning/prometheus/assets/modals/Modal/v2/Modal.svelte\";\r\n    import Banner from \"@itslearning/prometheus/assets/feedback/Banner/v1/Banner.svelte\";\r\n    import { createEventDispatcher } from \"svelte\";\r\n\r\n    export let showCopyConfirmModal;\r\n    export let confirmModalBody;\r\n    export let i18n;\r\n    export let bannerVisible;\r\n    export let bannerText;\r\n\r\n    const dispatch = createEventDispatcher();\r\n\r\n    function close() {\r\n        dispatch(\"close\");\r\n    }\r\n</script>\r\n","<span {hourId} {hourLabel} {minuteId} {isDisabled} class=\"time-select-section\">\r\n    {#if config.useTwelveHourFormat}\r\n        <span>\r\n            <Select label={hourLabel} bind:value={hours} disabled={isDisabled}>\r\n                {#each twelvehoursArray as hour}\r\n                    <option value={hour}>\r\n                        {hour}\r\n                    </option>\r\n                {/each}\r\n            </Select>\r\n        </span>\r\n    {:else}\r\n        <span>\r\n            <Select label={hourLabel} id={hourId} bind:value={hours} disabled={isDisabled}>\r\n                {#each hoursArray as hour}\r\n                    <option value={hour}>\r\n                        {hour}\r\n                    </option>\r\n                {/each}\r\n            </Select>\r\n        </span>\r\n    {/if}\r\n    <span>\r\n        <Select label={minuteLabel} id={minuteId} bind:value={minutes} disabled={isDisabled}>\r\n            {#each minutesArray as minute}\r\n                <option value={minute}>\r\n                    {minute}\r\n                </option>\r\n            {/each}\r\n        </Select>\r\n    </span>\r\n    {#if config.useTwelveHourFormat}\r\n        <span class=\"time-select-section__period\">\r\n            <Select label={periodLabel} id={periodId} bind:value={isPMstr} disabled={isDisabled}>\r\n                <option value=\"false\"> AM </option>\r\n                <option value=\"true\"> PM </option>\r\n            </Select>\r\n        </span>\r\n    {/if}\r\n</span>\r\n\r\n<script>\r\n    import Select from \"@itslearning/prometheus/assets/inputs/Select/v1/Select.svelte\";\r\n\r\n    const hoursArray = [\r\n        \"00\",\r\n        \"01\",\r\n        \"02\",\r\n        \"03\",\r\n        \"04\",\r\n        \"05\",\r\n        \"06\",\r\n        \"07\",\r\n        \"08\",\r\n        \"09\",\r\n        \"10\",\r\n        \"11\",\r\n        \"12\",\r\n        \"13\",\r\n        \"14\",\r\n        \"15\",\r\n        \"16\",\r\n        \"17\",\r\n        \"18\",\r\n        \"19\",\r\n        \"20\",\r\n        \"21\",\r\n        \"22\",\r\n        \"23\"\r\n    ];\r\n    const twelvehoursArray = [\r\n        \"12\",\r\n        \"01\",\r\n        \"02\",\r\n        \"03\",\r\n        \"04\",\r\n        \"05\",\r\n        \"06\",\r\n        \"07\",\r\n        \"08\",\r\n        \"09\",\r\n        \"10\",\r\n        \"11\"\r\n    ];\r\n    const minutesArray = [\"00\", \"05\", \"10\", \"15\", \"20\", \"25\", \"30\", \"35\", \"40\", \"45\", \"50\", \"55\"];\r\n\r\n    export let hourId;\r\n    export let hourLabel;\r\n    export let minuteId;\r\n    export let minuteLabel;\r\n    export let periodId;\r\n    export let periodLabel;\r\n    export let hours;\r\n    export let minutes;\r\n    export let isPM;\r\n    export let isDisabled;\r\n    export let config;\r\n\r\n    let isPMstr = isPM ? \"true\" : \"false\"; // For the first load, the boolean received is converted to string.\r\n\r\n    $: {\r\n        // This is needed as the value in the Select component cannot accept booleans (see prometheus rep.).\r\n        if (isPMstr === \"true\") {\r\n            isPM = true;\r\n        } else {\r\n            isPM = false;\r\n        }\r\n    }\r\n</script>\r\n","<div\r\n    class=\"datetime-picker-modal__error\"\r\n    aria-live=\"assertive\"\r\n    role=\"alert\"\r\n    hidden={setValidDatesErrorMessage ? \"\" : \"hidden\"}\r\n>\r\n    {i18n.youMustSetValidDates}\r\n</div>\r\n<div\r\n    class=\"datetime-picker-modal__error\"\r\n    aria-live=\"assertive\"\r\n    role=\"alert\"\r\n    hidden={showStartStopErrorMessage || showStartInvalidMessage || showStopInvalidMessage\r\n        ? \"\"\r\n        : \"hidden\"}\r\n>\r\n    {showStartStopErrorMessage\r\n        ? i18n.errorStopDateLessThanStartDate\r\n        : showStartInvalidMessage\r\n          ? i18n.calendar_Recurring_invalid_from_date\r\n          : i18n.calendar_Recurring_invalid_to_date}\r\n</div>\r\n<div\r\n    class=\"datetime-picker-modal__error\"\r\n    aria-live=\"assertive\"\r\n    role=\"alert\"\r\n    hidden={showRecurrenceErrorMessage ? \"\" : \"hidden\"}\r\n>\r\n    {i18n.recurrence_TimeIntervalIsTooBig}\r\n</div>\r\n\r\n<script>\r\n    export let showStartStopErrorMessage;\r\n    export let setValidDatesErrorMessage;\r\n    export let showStartInvalidMessage;\r\n    export let showStopInvalidMessage;\r\n    export let showRecurrenceErrorMessage;\r\n    export let i18n;\r\n</script>\r\n","<div class=\"set-dates-modal\">\r\n    <Modal\r\n        id=\"set-dates-modal-id\"\r\n        bind:enabled={showSetDatesModal}\r\n        titleText={i18n.setDate}\r\n        confirmText={i18n.save}\r\n        cancelText={i18n.cancel}\r\n        on:close={setDatesModalClicked}\r\n    >\r\n        <div slot=\"body\">\r\n            <h2 class=\"set-dates-modal-section__heading\">{i18n.dateOfFirstPlan}</h2>\r\n            <div class={dateTimePickerModalFromSection}>\r\n                <DatePickerField\r\n                    bind:value={dateValueFrom}\r\n                    bind:expanded={datePickerFromExpanded}\r\n                    firstDayOfWeek={config.firstDayOfWeek}\r\n                    locale={config.locale}\r\n                    id=\"date-picker-from\"\r\n                    label={i18n.datePickerLabelStart}\r\n                    labelPosition=\"left\"\r\n                    placeholder={i18n.datePickerPlaceholder}\r\n                    format={dateFormat}\r\n                    closeOnSelect={true}\r\n                    {i18n}\r\n                    on:select={dataSelected}\r\n                />\r\n                {#if dateTimeSet && showTimeSelector}\r\n                    <TimeSelector\r\n                        hourLabel={i18n.hour}\r\n                        minuteLabel={i18n.minute}\r\n                        periodLabel=\" \"\r\n                        {config}\r\n                        bind:hours={hoursFrom}\r\n                        bind:minutes={minutesFrom}\r\n                        bind:isPM={isPMFrom}\r\n                        bind:dateTimeSet\r\n                        bind:isDisabled={isTimeSpanDisabled}\r\n                    />\r\n                {:else}\r\n                    <Button\r\n                        type=\"plain\"\r\n                        htmlType=\"button\"\r\n                        text={i18n.setTime}\r\n                        on:click={toggleTimeSpanSetting}\r\n                    />\r\n                {/if}\r\n            </div>\r\n            <div class={dateTimePickerModalToSection}>\r\n                <DatePickerField\r\n                    bind:value={dateValueTo}\r\n                    bind:expanded={datePickerToExpanded}\r\n                    firstDayOfWeek={config.firstDayOfWeek}\r\n                    locale={config.locale}\r\n                    id=\"date-picker-to\"\r\n                    label={i18n.datePickerLabelStop}\r\n                    labelPosition=\"left\"\r\n                    placeholder={i18n.datePickerPlaceholder}\r\n                    format={dateFormat}\r\n                    closeOnSelect={true}\r\n                    {i18n}\r\n                    on:select={dataSelected}\r\n                />\r\n                {#if dateTimeSet && showTimeSelector}\r\n                    <TimeSelector\r\n                        hourLabel={i18n.hour}\r\n                        minuteLabel={i18n.minute}\r\n                        periodLabel=\" \"\r\n                        {config}\r\n                        bind:hours={hoursTo}\r\n                        bind:minutes={minutesTo}\r\n                        bind:isPM={isPMTo}\r\n                        bind:dateTimeSet\r\n                        bind:isDisabled={isTimeSpanDisabled}\r\n                    />\r\n                {:else}\r\n                    <Button\r\n                        type=\"plain\"\r\n                        htmlType=\"button\"\r\n                        text={i18n.setTime}\r\n                        on:click={toggleTimeSpanSetting}\r\n                    />\r\n                {/if}\r\n\r\n                <SetDatesModalError\r\n                    {showStartStopErrorMessage}\r\n                    {setValidDatesErrorMessage}\r\n                    {showStartInvalidMessage}\r\n                    {showStopInvalidMessage}\r\n                    {showRecurrenceErrorMessage}\r\n                    {i18n}\r\n                />\r\n            </div>\r\n\r\n            <h2 class=\"set-dates-modal-section__heading\">{i18n.recurrence}</h2>\r\n            {#if isRecurrenceSectionVisible}\r\n                <div class=\"set-dates-modal-section__options\">\r\n                    <Select label={i18n.every} bind:value={weeksDropDownValue}>\r\n                        {#each recurrenceArray.slice(weekCount) as recurrence}\r\n                            <!-- The content of the dropdown changes according to the selected interval of dates -->\r\n                            <option value={recurrence}>\r\n                                {recurrence}\r\n                            </option>\r\n                        {/each}\r\n                    </Select>\r\n                    <span>{i18n.on}</span>\r\n                </div>\r\n                <div class=\"set-dates-modal-section__checkbox-group\">\r\n                    <!-- All checkboxes are disabled if the selected interval is more than a day. Otherwise only the checkbox for that weekday is disabled.-->\r\n                    {#each daysArray as day}\r\n                        {#if !day.disabled}\r\n                            <!--Not disabled-->\r\n                            <Checkbox\r\n                                label={day.text}\r\n                                bind:checked={day.checked}\r\n                                disabled={day.disabled}\r\n                                small\r\n                            />\r\n                        {:else}\r\n                            <Checkbox\r\n                                label={day.text}\r\n                                checked={day.checked}\r\n                                disabled={true}\r\n                                small\r\n                            />\r\n                        {/if}\r\n                    {/each}\r\n                </div>\r\n                {#if currentDayDiff > 0}\r\n                    <div class=\"set-dates-modal-section__info\">\r\n                        {i18n.recurrence_BothDatesSelectedInfoMessage}\r\n                    </div>\r\n                {/if}\r\n            {:else}\r\n                <div class=\"set-dates-modal-section__info\">\r\n                    {i18n.recurrence_PlanDateNotSetWarning}\r\n                </div>\r\n            {/if}\r\n        </div>\r\n    </Modal>\r\n</div>\r\n\r\n<script>\r\n    import Button from \"@itslearning/prometheus/assets/inputs/Button/v1/Button.svelte\";\r\n    import Checkbox from \"@itslearning/prometheus/assets/inputs/Checkbox/v1/Checkbox.svelte\";\r\n    import DatePickerField from \"@itslearning/prometheus/assets/inputs/DatePickerField/v1/DatePickerField.svelte\";\r\n    import Modal from \"@itslearning/prometheus/assets/modals/Modal/v2/Modal.svelte\";\r\n    import Select from \"@itslearning/prometheus/assets/inputs/Select/v1/Select.svelte\";\r\n    import TimeSelector from \"../DateTimePicker/TimeSelector.svelte\";\r\n    import SetDatesModalError from \"./SetDatesModalError.svelte\";\r\n    import config from \"../../config\";\r\n    import {\r\n        isDateOnlyMode,\r\n        validateDateFormat,\r\n        initAutoSuggestFromDate,\r\n        initAutoSuggestToDate\r\n    } from \"../../helpers/dateHelper\";\r\n    import {\r\n        defaultFromHour,\r\n        defaultToHour,\r\n        weekDays,\r\n        dateTimePickerModalFromSection,\r\n        dateTimePickerModalToSection,\r\n        fromDatePickerInputField,\r\n        toDatePickerInputField\r\n    } from \"../../constants\";\r\n    import { createEventDispatcher, onMount } from \"svelte\";\r\n\r\n    export let showSetDatesModal;\r\n    export let i18n;\r\n\r\n    let dateValueFrom;\r\n    let dateValueFromInitially;\r\n    let datePickerFromExpanded = false;\r\n    let dateValueTo;\r\n    let dateValueToInitially;\r\n    let datePickerToExpanded = false;\r\n\r\n    // Default time selection will be 08-16 or 08 AM-04 PM if using 12h format\r\n    let hoursFrom = defaultFromHour;\r\n    let minutesFrom = \"00\";\r\n    let isPMFrom = false;\r\n    let hoursTo = defaultToHour;\r\n    let minutesTo = \"00\";\r\n    let isPMTo = false;\r\n\r\n    let mountComplete = false;\r\n    let showStartStopErrorMessage = false;\r\n    let setValidDatesErrorMessage = false;\r\n    let showStartInvalidMessage = false;\r\n    let showStopInvalidMessage = false;\r\n    let showTimeSelector = false;\r\n    let dateTimeSet = false;\r\n    let isTimeSpanDisabled = true;\r\n\r\n    let weeksDropDownValue;\r\n    let daysArray = [\r\n        { const: weekDays.Sunday, text: i18n.sunday, checked: false, disabled: false },\r\n        { const: weekDays.Monday, text: i18n.monday, checked: false, disabled: false },\r\n        { const: weekDays.Tuesday, text: i18n.tuesday, checked: false, disabled: false },\r\n        { const: weekDays.Wednesday, text: i18n.wednesday, checked: false, disabled: false },\r\n        { const: weekDays.Thursday, text: i18n.thursday, checked: false, disabled: false },\r\n        { const: weekDays.Friday, text: i18n.friday, checked: false, disabled: false },\r\n        { const: weekDays.Saturday, text: i18n.saturday, checked: false, disabled: false }\r\n    ];\r\n\r\n    const recurrenceArray = [\r\n        i18n.week,\r\n        i18n.week2,\r\n        i18n.week3,\r\n        i18n.week4,\r\n        i18n.week5,\r\n        i18n.week6,\r\n        i18n.week7,\r\n        i18n.week8,\r\n        i18n.week9,\r\n        i18n.week10\r\n    ];\r\n\r\n    const dateFormat = config.currentDateFormat;\r\n\r\n    const dispatch = createEventDispatcher();\r\n\r\n    $: isTimeSpanDisabled = !showTimeSelector;\r\n\r\n    $: isRecurrenceSectionVisible =\r\n        dateValueFrom &&\r\n        dateValueTo &&\r\n        !showStartStopErrorMessage &&\r\n        !showStartInvalidMessage &&\r\n        !showStopInvalidMessage &&\r\n        !showRecurrenceErrorMessage;\r\n\r\n    $: currentDayDiff =\r\n        dateValueFrom && dateValueTo\r\n            ? Math.floor((dateValueTo - dateValueFrom) / (1000 * 60 * 60 * 24))\r\n            : -1;\r\n\r\n    $: weekCount = currentDayDiff !== -1 ? Math.floor(currentDayDiff / daysArray.length) : 0;\r\n\r\n    $: showRecurrenceErrorMessage = currentDayDiff > 0 && weekCount >= 10 ? true : false; // Recurrence can be set only when the date interval is less than 10 weeks\r\n\r\n    $: {\r\n        const datePickerFrom = dateValueFrom ? new Date(dateValueFrom) : undefined;\r\n        const datePickerTo = dateValueTo ? new Date(dateValueTo) : undefined;\r\n\r\n        if (!datePickerFrom || !datePickerTo) {\r\n            showStartStopErrorMessage = false;\r\n        } else {\r\n            insertHoursAndMinutes(datePickerFrom, datePickerTo);\r\n\r\n            // Use epoch time to compare time (ms since 1970)\r\n            const epochStart = datePickerFrom.valueOf();\r\n            const epochStop = datePickerTo.valueOf();\r\n\r\n            setValidDatesErrorMessage = false;\r\n            showStartStopErrorMessage = epochStart > epochStop ? true : false;\r\n        }\r\n    }\r\n\r\n    $: if (\r\n        mountComplete &&\r\n        dateValueFrom &&\r\n        dateValueFromInitially !== dateValueFrom &&\r\n        !datePickerFromExpanded\r\n    ) {\r\n        checkAutoSuggestToDate();\r\n    }\r\n\r\n    $: if (\r\n        mountComplete &&\r\n        dateValueTo &&\r\n        dateValueToInitially !== dateValueTo &&\r\n        !datePickerToExpanded\r\n    ) {\r\n        checkAutoSuggestFromDate();\r\n    }\r\n\r\n    onMount(() => {\r\n        if (dateTimeSet === true && !isDateOnlyMode(parseInt(minutesFrom), parseInt(minutesTo))) {\r\n            showTimeSelector = true;\r\n            isTimeSpanDisabled = false;\r\n        } else {\r\n            showTimeSelector = false;\r\n            isTimeSpanDisabled = true;\r\n        }\r\n\r\n        dateValueFromInitially = dateValueFrom;\r\n        initAutoSuggestFromDate(dateValueFrom, dateValueTo, dateValueFromInitially);\r\n\r\n        dateValueToInitially = dateValueTo;\r\n        initAutoSuggestToDate(dateValueFrom, dateValueTo, dateValueToInitially);\r\n\r\n        // Decide daysarray order according to config.firstDayOfWeek\r\n        daysArray = rotateArray(daysArray, config.firstDayOfWeek);\r\n\r\n        mountComplete = true;\r\n    });\r\n\r\n    function checkAutoSuggestFromDate() {\r\n        if (dateValueTo && !dateValueFromInitially) {\r\n            dateValueFrom = dateValueTo;\r\n            updateDaysArray(dateValueFrom);\r\n        }\r\n\r\n        dateValueFromInitially = dateValueFrom;\r\n    }\r\n\r\n    function checkAutoSuggestToDate() {\r\n        const dateFrom = document.getElementById(fromDatePickerInputField).value;\r\n\r\n        if (!validateDateFormat(dateFrom, config.currentDateFormat)) {\r\n            return;\r\n        }\r\n\r\n        if (dateValueFrom && (!dateValueToInitially || dateValueFrom > dateValueTo)) {\r\n            dateValueTo = dateValueFrom;\r\n            updateDaysArray(dateValueTo);\r\n        }\r\n\r\n        dateValueToInitially = dateValueTo;\r\n    }\r\n\r\n    function rotateArray(array, position) {\r\n        for (let i = 0; i < position; i++) {\r\n            array.push(array.shift());\r\n        }\r\n\r\n        return array;\r\n    }\r\n\r\n    // Case 1: when clicking outside the DatePicker, the autosuggest picks the same date for both fields.\r\n    // Case 2: first modal load, one date is selected, the other date is still undefined.\r\n    // Action: we consider this case as if the same day is selected and update daysArray.\r\n    function updateDaysArray(dateValue) {\r\n        const datePicker = dateValue ? new Date(dateValue) : undefined;\r\n\r\n        if (datePicker) {\r\n            const checkedDay =\r\n                (datePicker.getDay() - config.firstDayOfWeek + daysArray.length) % daysArray.length;\r\n\r\n            if (checkedDay >= 0) {\r\n                daysArray[checkedDay].checked = true;\r\n                daysArray[checkedDay].disabled = true;\r\n            }\r\n        }\r\n\r\n        daysArray = daysArray; // Needed to trigger the update in the checkboxes\r\n        updateweeksDropDownValue();\r\n    }\r\n\r\n    // When the weeks dropdown updates without the user selecting an option, \"weeksDropDownValue\" needs to be updated too, otherwise it will always be \"Week\".\r\n    function updateweeksDropDownValue() {\r\n        if (currentDayDiff > 0) {\r\n            // More than one day interval\r\n            weeksDropDownValue = recurrenceArray.slice(weekCount)[0];\r\n        }\r\n    }\r\n\r\n    function toggleTimeSpanSetting() {\r\n        if (showTimeSelector === true) {\r\n            showTimeSelector = false;\r\n        } else {\r\n            if (isDateOnlyMode(parseInt(minutesFrom), parseInt(minutesTo))) {\r\n                hoursFrom = defaultFromHour;\r\n                minutesFrom = \"00\";\r\n                hoursTo = defaultToHour;\r\n                minutesTo = \"00\";\r\n            }\r\n\r\n            showTimeSelector = true;\r\n        }\r\n\r\n        dateTimeSet = showTimeSelector;\r\n    }\r\n\r\n    function dataSelected() {\r\n        // Filtering the week days included in the selected interval. These days will be checked and disabled.\r\n        const datePickerFrom = dateValueFrom ? new Date(dateValueFrom) : undefined;\r\n        const datePickerTo = dateValueTo ? new Date(dateValueTo) : undefined;\r\n\r\n        // Reset\r\n        daysArray.map(d => (d.checked = false));\r\n        daysArray.map(d => (d.disabled = false));\r\n\r\n        if (!datePickerFrom || !datePickerTo) {\r\n            // First modal load, one date is selected, the other date is still undefined, so we consider this case as if the same day is selected.\r\n            if (datePickerFrom) updateDaysArray(datePickerFrom);\r\n            if (datePickerTo) updateDaysArray(datePickerTo);\r\n        }\r\n\r\n        if (datePickerFrom && datePickerTo) {\r\n            // Same logic as old planner\r\n            const startDay =\r\n                (datePickerFrom.getDay() - config.firstDayOfWeek + daysArray.length) %\r\n                daysArray.length;\r\n            const stopDay =\r\n                (datePickerTo.getDay() - config.firstDayOfWeek + daysArray.length) %\r\n                daysArray.length;\r\n\r\n            if (isTheSameDay(datePickerFrom, datePickerTo)) {\r\n                daysArray[startDay].checked = true;\r\n                daysArray[startDay].disabled = true;\r\n            } else {\r\n                if (\r\n                    currentDayDiff >= daysArray.length ||\r\n                    (currentDayDiff === daysArray.length - 1 && startDay === stopDay)\r\n                ) {\r\n                    daysArray.map(d => (d.checked = true));\r\n                } else {\r\n                    if (startDay < stopDay) {\r\n                        for (let i = startDay; i <= stopDay; i++) {\r\n                            daysArray[i].checked = true;\r\n                        }\r\n                    }\r\n\r\n                    if (startDay > stopDay) {\r\n                        for (let i = 0; i <= stopDay; i++) {\r\n                            daysArray[i].checked = true;\r\n                        }\r\n\r\n                        for (let i = startDay; i < daysArray.length; i++) {\r\n                            daysArray[i].checked = true;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                daysArray.map(d => (d.disabled = true));\r\n            }\r\n        }\r\n\r\n        daysArray = daysArray; // Needed to trigger the update in the checkboxes\r\n        updateweeksDropDownValue();\r\n    }\r\n\r\n    function isTheSameDay(start, stop) {\r\n        return (\r\n            start &&\r\n            stop &&\r\n            start.getFullYear() === stop.getFullYear() &&\r\n            start.getMonth() === stop.getMonth() &&\r\n            start.getDate() === stop.getDate()\r\n        );\r\n    }\r\n\r\n    function insertHoursAndMinutes(datePickerFrom, datePickerTo) {\r\n        if (showTimeSelector) {\r\n            let hoursFromVal = parseInt(hoursFrom);\r\n\r\n            if (config.useTwelveHourFormat) {\r\n                if (hoursFromVal === 12) {\r\n                    hoursFromVal = 0;\r\n                }\r\n\r\n                if (isPMFrom) {\r\n                    hoursFromVal = hoursFromVal + 12;\r\n                }\r\n            }\r\n\r\n            datePickerFrom.setHours(hoursFromVal, parseInt(minutesFrom));\r\n\r\n            let hoursToVal = parseInt(hoursTo);\r\n\r\n            if (config.useTwelveHourFormat) {\r\n                if (hoursToVal === 12) {\r\n                    hoursToVal = 0;\r\n                }\r\n\r\n                if (isPMTo) {\r\n                    hoursToVal = hoursToVal + 12;\r\n                }\r\n            }\r\n\r\n            datePickerTo.setHours(hoursToVal, parseInt(minutesTo));\r\n        } else {\r\n            datePickerFrom.setHours(0, 1);\r\n            datePickerTo.setHours(23, 59);\r\n        }\r\n    }\r\n\r\n    function setDatesModalClicked(event) {\r\n        if (event.detail.confirmed === true) {\r\n            if (!dateValueFrom || !dateValueTo) {\r\n                setValidDatesErrorMessage = true;\r\n                showSetDatesModal = true;\r\n            } else {\r\n                setValidDatesErrorMessage = false;\r\n\r\n                const datePickerFrom = new Date(dateValueFrom);\r\n                const datePickerTo = new Date(dateValueTo);\r\n\r\n                const dateFrom = document.getElementById(fromDatePickerInputField).value;\r\n                const dateTo = document.getElementById(toDatePickerInputField).value;\r\n\r\n                const validateDateToFormat = validateDateFormat(dateTo, dateFormat);\r\n                const validateDateFromFormat = validateDateFormat(dateFrom, dateFormat);\r\n\r\n                if (!validateDateFromFormat) {\r\n                    showStartInvalidMessage = true;\r\n                    showStopInvalidMessage = false;\r\n\r\n                    return;\r\n                }\r\n\r\n                if (!validateDateToFormat) {\r\n                    showStopInvalidMessage = true;\r\n                    showStartInvalidMessage = false;\r\n\r\n                    return;\r\n                }\r\n\r\n                insertHoursAndMinutes(datePickerFrom, datePickerTo);\r\n\r\n                // Use epoch time to compare time (ms since 1970)\r\n                const epochStart = datePickerFrom.valueOf();\r\n                const epochStop = datePickerTo.valueOf();\r\n\r\n                showStartStopErrorMessage = epochStart > epochStop ? true : false; // We need to check that the selected time is valid as well\r\n\r\n                if (showStartStopErrorMessage || showRecurrenceErrorMessage) {\r\n                    showSetDatesModal = true;\r\n                }\r\n\r\n                if (!showStartStopErrorMessage && !showRecurrenceErrorMessage) {\r\n                    const checkedDays = daysArray.filter(d => d.checked);\r\n\r\n                    dispatch(\"setDates\", {\r\n                        start: datePickerFrom,\r\n                        stop: datePickerTo,\r\n                        weekDaysAPI: checkedDays.map(d => d.const),\r\n                        weekNumber: recurrenceArray.indexOf(weeksDropDownValue) + 1 // The existing endpoint requires numbers to start from 1\r\n                    });\r\n                }\r\n            }\r\n        } else {\r\n            dispatch(\"close\");\r\n        }\r\n    }\r\n</script>\r\n","import { writable } from \"svelte/store\";\r\n\r\n/** @type {import(\"svelte/store\").Writable<any>} */\r\nexport const planData = writable({});\r\n\r\nexport const backLink = writable({ url: \"\", label: \"\" });\r\n\r\nconst defaultPlansData = {\r\n    plans: [],\r\n    total: 0,\r\n    currentPageIndex: 0,\r\n    loading: true\r\n};\r\n\r\nconst createPlanFilesStatusStore = () => {\r\n    const { subscribe, update } = writable(new Map());\r\n\r\n    const updateFileStatus = (file, planId, columnId) =>\r\n        update(files => {\r\n            files.set(file.name, { ...file, planId, columnId });\r\n\r\n            return files;\r\n        });\r\n\r\n    const dismissError = fileName =>\r\n        update(files => {\r\n            files.delete(fileName);\r\n\r\n            return files;\r\n        });\r\n\r\n    return {\r\n        subscribe,\r\n        updateFileStatus,\r\n        dismissError\r\n    };\r\n};\r\n\r\nconst createPlansStore = () => {\r\n    const plansStore = writable(defaultPlansData);\r\n\r\n    return {\r\n        ...plansStore,\r\n        reset: () => plansStore.set(defaultPlansData)\r\n    };\r\n};\r\n\r\nexport const planFilesStatus = createPlanFilesStatusStore();\r\n\r\nexport const topicCurrentPlansData = createPlansStore();\r\n\r\nexport const topicWithoutDatePlansData = createPlansStore();\r\n\r\nexport const topicPastPlansData = createPlansStore();\r\n\r\nexport const topicAllPlansData = createPlansStore();\r\n","import {\r\n    setPlanDescription,\r\n    setPlanTimeSpan,\r\n    setPlanWeekAndDay,\r\n    updatePlanEvents,\r\n    setPlanTitle,\r\n    setPlanClassHours,\r\n    createPlan,\r\n    togglePlansStatus,\r\n    createTopic,\r\n    connectToTopic,\r\n    connectToTopicV2,\r\n    moveElementsInTopicFolderForPlan,\r\n    getTopic,\r\n    removeTopic,\r\n    deletePlanElement,\r\n    setPlanImage,\r\n    removePlanImage,\r\n    removePlan,\r\n    removePlans,\r\n    copyPlans,\r\n    setCustomFieldText,\r\n    activatePlanElement,\r\n    getCourses,\r\n    deletePlanElementFromCourse,\r\n    setPlansTimeSpan,\r\n    setPlansWeekAndDay,\r\n    setPlansTimeSpanEvents,\r\n    uploadPlanImage,\r\n    createPlanV2\r\n} from \"../api\";\r\n\r\nimport { formatDateForApi, formatDateOnlyForApi, isDateOnlyMode } from \"../helpers/dateHelper\";\r\nimport config from \"../config\";\r\nimport { postNewPlannerKpi } from \"../helpers/kpiHelper\";\r\nimport { planData } from \"../logic/planPage/stores\";\r\nimport { getCoursesForCopyPageSize as pageSize } from \"../constants\";\r\n\r\nexport function updatePlanTitle(planId, title) {\r\n    return setPlanTitle(planId, title);\r\n}\r\n\r\nexport function updatePlanClassHours(planId, classHours) {\r\n    return setPlanClassHours(planId, classHours);\r\n}\r\n\r\nexport async function updatePlanDescription(planId, description) {\r\n    const result = await setPlanDescription(planId, description);\r\n\r\n    // Use the resulting safeHtml to set the display description\r\n    planData.update(data => {\r\n        data.plan.displayDescription = result.SafeHtml;\r\n        data.plan.isDescriptionPlainText = result.CustomData.isPlainText;\r\n\r\n        window.loadIframelyEmbedJs && setTimeout(() => window.loadIframelyEmbedJs(), 100);\r\n\r\n        return data;\r\n    });\r\n\r\n    return result;\r\n}\r\n\r\nfunction getDatesForApi(start, stop) {\r\n    let dateOnlyMode;\r\n\r\n    if (start && stop) {\r\n        if (isDateOnlyMode(start.getUTCMinutes(), stop.getUTCMinutes())) {\r\n            start = formatDateOnlyForApi(start);\r\n            stop = formatDateOnlyForApi(stop);\r\n            dateOnlyMode = true;\r\n        } else {\r\n            start = formatDateForApi(start);\r\n            stop = formatDateForApi(stop);\r\n            dateOnlyMode = false;\r\n        }\r\n    } else {\r\n        const emptyDateStr = \"0000-00-00 00:00:00\";\r\n\r\n        start = emptyDateStr;\r\n        stop = emptyDateStr;\r\n    }\r\n\r\n    return { start, stop, dateOnlyMode };\r\n}\r\n\r\nexport async function updatePlanDates(planId, start, stop, connectedToEvent, activityIds) {\r\n    if (connectedToEvent) {\r\n        await updatePlanEvents(planId, activityIds);\r\n    } else {\r\n        const datesForApi = getDatesForApi(start, stop);\r\n\r\n        // clear all connected events\r\n        const activityIdArray = [];\r\n\r\n        await updatePlanEvents(planId, activityIdArray);\r\n\r\n        if (datesForApi.dateOnlyMode) {\r\n            await setPlanWeekAndDay(planId, datesForApi.start, datesForApi.stop);\r\n        } else {\r\n            await setPlanTimeSpan(planId, datesForApi.start, datesForApi.stop);\r\n        }\r\n    }\r\n}\r\n\r\nexport function createNewPlan(plan) {\r\n    const datesForApi = getDatesForApi(plan.start, plan.stop);\r\n\r\n    return createPlan({\r\n        ...plan,\r\n        start: datesForApi.start,\r\n        stop: datesForApi.stop\r\n    });\r\n}\r\n\r\nexport function setPlanActive(planId, active, toggleElementsActivation) {\r\n    return togglePlansStatus([planId], active, toggleElementsActivation, false);\r\n}\r\n\r\nexport const setPlansActive = (\r\n    planIds,\r\n    active,\r\n    toggleElementsActivation,\r\n    isBulkAction = true,\r\n    executeForAllPlans = false,\r\n    topicIds = []\r\n) =>\r\n    togglePlansStatus(\r\n        planIds,\r\n        active,\r\n        toggleElementsActivation,\r\n        isBulkAction,\r\n        executeForAllPlans,\r\n        topicIds\r\n    );\r\n\r\nexport async function setImage(planId, file) {\r\n    await postNewPlannerKpi(config.kpi.kpiMeasurementAddPlanImage);\r\n\r\n    return await setPlanImage(planId, file);\r\n}\r\n\r\nexport async function setPlanImageUpload(planId, uploadImageFileRepoId, uploadImageSignedFileRepoId, uploadImageDescriptionText, uploadImageChanged) {\r\n    await postNewPlannerKpi(config.kpi.kpiMeasurementAddPlanImage);\r\n\r\n    return await uploadPlanImage(planId, uploadImageFileRepoId, uploadImageSignedFileRepoId, uploadImageDescriptionText, uploadImageChanged);\r\n}\r\n\r\nexport function deleteImage(planId) {\r\n    return removePlanImage(planId);\r\n}\r\n\r\nexport function createNewTopic(title, colour) {\r\n    return createTopic(title, colour);\r\n}\r\n\r\nexport function connectPlanToTopic(planId, topicId) {\r\n    return connectToTopic(planId, topicId);\r\n}\r\n\r\nexport function connectPlanToTopicV2(planId, sourceTopicId, destinationTopicId, moveResources) {\r\n    return connectToTopicV2(planId, sourceTopicId, destinationTopicId, moveResources);\r\n}\r\n\r\nexport function moveElementsInFolderForPlan(planId, sourceTopicId, destinationTopicId) {\r\n    return moveElementsInTopicFolderForPlan(planId, sourceTopicId, destinationTopicId);\r\n}\r\n\r\nexport function getTopicForPlan(topicId) {\r\n    return getTopic(topicId);\r\n}\r\n\r\nexport function removeTopicFromPlan(planId) {\r\n    return removeTopic(planId);\r\n}\r\n\r\nexport function deleteResourceFromPlan(planId, elementId) {\r\n    return deletePlanElement(planId, elementId);\r\n}\r\n\r\nexport function deleteResourceFromCourse(planId, elementId) {\r\n    return deletePlanElementFromCourse(planId, elementId);\r\n}\r\n\r\nexport function removePlanFromCourse(planId) {\r\n    return removePlan([planId]);\r\n}\r\n\r\nexport function removePlansFromCourse(planIds, executeForAllPlans = false, topicIds = []) {\r\n    return removePlans(planIds, executeForAllPlans, topicIds);\r\n}\r\n\r\nexport async function getCoursesForCopy() {\r\n    let pageIndex = 0;\r\n    let result = await getCourses(pageIndex);\r\n    let allCourses = result;\r\n\r\n    while (result.length === pageSize) {\r\n        pageIndex++;\r\n        result = await getCourses(pageIndex);\r\n        allCourses = [...allCourses, ...result];\r\n    }\r\n\r\n    return allCourses;\r\n}\r\n\r\nexport async function copyPlansFromCourse(\r\n    targetCourseId,\r\n    targetTopicId,\r\n    copyDates,\r\n    copyResourcesAndActivities,\r\n    overwriteAssessmentCriteria,\r\n    plansIds,\r\n    copyWithoutTopic,\r\n    executeForAllPlans = false,\r\n    topicIds = []\r\n) {\r\n    const result = await copyPlans(\r\n        targetCourseId,\r\n        targetTopicId,\r\n        copyDates,\r\n        copyResourcesAndActivities,\r\n        overwriteAssessmentCriteria,\r\n        plansIds,\r\n        copyWithoutTopic,\r\n        executeForAllPlans,\r\n        topicIds\r\n    );\r\n\r\n    return result;\r\n}\r\n\r\nexport async function updateCustomPlanField(planId, columnId, text) {\r\n    const result = await setCustomFieldText(planId, columnId, text);\r\n\r\n    // Use the resulting safeHtml to set the field's text for display\r\n    planData.update(data => {\r\n        const fieldIndex = data.plan.fields.findIndex(f => f.columnId === columnId);\r\n\r\n        if (fieldIndex !== -1) {\r\n            data.plan.fields[fieldIndex].displayText = result.SafeHtml;\r\n            data.plan.fields[fieldIndex].isPlainText = result.CustomData.isPlainText;\r\n        }\r\n\r\n        return data;\r\n    });\r\n\r\n    return result;\r\n}\r\n\r\nexport function activateResourceFromPlan(\r\n    elementId,\r\n    activate,\r\n    isFolder,\r\n    changeActivationForFolderContent\r\n) {\r\n    return activatePlanElement(elementId, activate, isFolder, changeActivationForFolderContent);\r\n}\r\n\r\nexport async function updatePlansDates(\r\n    planIds,\r\n    start,\r\n    stop,\r\n    weekNumber,\r\n    weekDays,\r\n    order,\r\n    executeForAllPlans,\r\n    topicIds\r\n) {\r\n    const { start: startDate, stop: stopDate, dateOnlyMode } = getDatesForApi(start, stop);\r\n\r\n    return await (dateOnlyMode\r\n        ? setPlansWeekAndDay(\r\n              planIds,\r\n              startDate,\r\n              stopDate,\r\n              weekNumber,\r\n              weekDays,\r\n              order,\r\n              executeForAllPlans,\r\n              topicIds\r\n          )\r\n        : setPlansTimeSpan(\r\n              planIds,\r\n              startDate,\r\n              stopDate,\r\n              weekNumber,\r\n              weekDays,\r\n              order,\r\n              executeForAllPlans,\r\n              topicIds\r\n          ));\r\n}\r\n\r\nexport const updatePlansDatesEvents = (\r\n    planIds,\r\n    firstPlanEventIds,\r\n    executeForAllPlans = false,\r\n    topicIds = []\r\n) => setPlansTimeSpanEvents(planIds, firstPlanEventIds, executeForAllPlans, topicIds);\r\n\r\nexport function createNewPlanV2(plan) {\r\n    const datesForApi = getDatesForApi(plan.start, plan.stop);\r\n\r\n    return createPlanV2({\r\n        ...plan,\r\n        start: datesForApi.start,\r\n        stop: datesForApi.stop\r\n    });\r\n}\r\n","import { plannerViews, plansOrder } from \"../constants\";\r\n\r\n/**\r\n * Gets planner view by selected tab index\r\n * @param {number} tabIndex\r\n */\r\nexport function getPlannerView(tabIndex) {\r\n    switch (tabIndex) {\r\n        case 0:\r\n            return plannerViews.current;\r\n        case 1:\r\n            return plannerViews.past;\r\n        case 2:\r\n            return plannerViews.withoutDate;\r\n        default:\r\n            return plannerViews.notDefined;\r\n    }\r\n}\r\n\r\nexport function getPlansOrderFromPlansView(plansView) {\r\n    switch (plansView) {\r\n        case plannerViews.topic: {\r\n            return plansOrder.topic;\r\n        }\r\n\r\n        case plannerViews.tableView: {\r\n            return plansOrder.tableView;\r\n        }\r\n\r\n        default: {\r\n            return plansOrder.default;\r\n        }\r\n    }\r\n}\r\n","export const makeCourseForDropdown = (course, actionSource, archivedText) => {\r\n    const courseTitle = !course.Status\r\n        ? course.CourseTitle\r\n        : course.CourseTitle + \" (\" + archivedText + \")\";\r\n\r\n    return {\r\n        icon: \"\",\r\n        label: courseTitle,\r\n        link: false,\r\n        target: \"_self\",\r\n        value: {\r\n            source: actionSource,\r\n            title: courseTitle,\r\n            id: course.CourseId,\r\n            hasUseTopics: course.HasCourseSettingUseTopics\r\n        }\r\n    };\r\n};\r\n","<div class=\"its-plans-action__options\">\r\n    {#if config.canEdit}\r\n        <div class=\"copy-plans-modal\">\r\n            <Modal\r\n                id=\"show-copy-plans-modal-id\"\r\n                bind:enabled={showCopyPlansModal}\r\n                titleText={i18n.copy}\r\n                {body}\r\n                confirmText={i18n.copy}\r\n                cancelText={i18n.cancel}\r\n                on:close={copyPlansModalClicked}\r\n            >\r\n                <div slot=\"body\">\r\n                    <h2 class=\"copy-plans-modal__section-title\">{i18n.copyTheSelectedPlansTo}</h2>\r\n                    <ButtonDropdown\r\n                        arrow={false}\r\n                        disabled={dropDownCoursesLoading}\r\n                        iconClass={dropDownCoursesLoading ? 'prom-button--loading' : 'prom-button-dropdown-icon'}\r\n                        iconPlacement=\"end\"\r\n                        id=\"copy-plans-modal__courses-dropdown\"\r\n                        textOnly={false}\r\n                        text={coursesDropdownText}\r\n                        responsive={false}\r\n                        items={coursesItems}\r\n                        type=\"secondary\"\r\n                        on:beforeToggle={loadCourses}\r\n                        on:beforeToggle={addScrollCourseDropdown}\r\n                        on:selectedOption={selectCourse}\r\n                    />\r\n                    <div\r\n                        class=\"copy-plans-modal__error\"\r\n                        hidden={errorNoCourseSelected ? \"\" : \"hidden\"}\r\n                    >\r\n                        {i18n.selectACourse}\r\n                    </div>\r\n                    {#if courseIsSelected}\r\n                        {#if courseHasUseTopics}\r\n                            <h2 class=\"copy-plans-modal__section-title\">{i18n.selectATopic}</h2>\r\n                            <Checkbox\r\n                                checked={checkedKeepExistingTopic}\r\n                                label={i18n.keepExisting}\r\n                                small\r\n                                on:change={updateSelectATopicSection}\r\n                            />\r\n                            <ButtonDropdown\r\n                                arrow={false}\r\n                                disabled={checkedKeepExistingTopic}\r\n                                iconPlacement=\"end\"\r\n                                id=\"copy-plans-modal__topics-dropdown\"\r\n                                textOnly={false}\r\n                                text={topicsDropdownText}\r\n                                responsive={false}\r\n                                items={topicsItems}\r\n                                type=\"secondary\"\r\n                                on:beforeToggle={addScrollTopicDropdown}\r\n                                on:selectedOption={selectTopic}\r\n                            />\r\n                            <div\r\n                                class=\"copy-plans-modal__error\"\r\n                                hidden={errorNoTopicSelected ? \"\" : \"hidden\"}\r\n                            >\r\n                                {i18n.warning_SelectTopic}\r\n                            </div>\r\n                        {/if}\r\n                        <h2 class=\"copy-plans-modal__section-title\">{i18n.options}</h2>\r\n                        {#if isDateVisible()}\r\n                            <div class=\"copy-plans-modal__options-checkbox\">\r\n                                <Checkbox\r\n                                    checked={checkedCopyDates}\r\n                                    label={i18n.copyDatesForNewPlans}\r\n                                    small\r\n                                    on:change={updateCheckedStatusCopyDates}\r\n                                />\r\n                            </div>\r\n                        {/if}\r\n                        <div class=\"copy-plans-modal__options-checkbox\">\r\n                            <Checkbox\r\n                                checked={checkedConnectedResources}\r\n                                label={i18n.copyConnectedResources}\r\n                                small\r\n                                on:change={updateCheckedStatusConnectedResources}\r\n                            />\r\n                            <div class=\"copy-plans-modal__options-checkbox-info\">\r\n                                {i18n.copyConnectedResourcesInfoMessage}\r\n                            </div>\r\n                        </div>\r\n                        {#if showAssessmentCriteriaSection}\r\n                            <div class=\"copy-plans-modal__options-checkbox\">\r\n                                <Checkbox\r\n                                    checked={checkedAssessmentCriteria}\r\n                                    label={i18n.replaceExistingAssesmentCriteria}\r\n                                    small\r\n                                    on:change={updateCheckedStatusAssessmentCriteria}\r\n                                />\r\n                            </div>\r\n                        {/if}\r\n                    {/if}\r\n                </div>\r\n            </Modal>\r\n        </div>\r\n\r\n        <Modal\r\n            id=\"copy-in-progress-modal-id\"\r\n            bind:enabled={showCopyInProgress}\r\n            titleText={i18n.copy}\r\n            confirmText={i18n.close}\r\n            showCancel={false}\r\n        >\r\n            <div slot=\"body\">\r\n                <div class=\"copy-plans__copy-in-progress\">\r\n                    <span class=\"screen-reader\">{i18n.copyInProgress}</span>\r\n                </div>\r\n            </div>\r\n        </Modal>\r\n\r\n        {#if showSetDatesModal}\r\n            <SetDatesModal\r\n                {showSetDatesModal}\r\n                {i18n}\r\n                on:setDates={saveSetDatesModalClicked}\r\n                on:close={closeSetDatesModalClicked}\r\n            />\r\n        {/if}\r\n\r\n        {#if showConnectToCalendarModal}\r\n            <ConnectToCalendarModal\r\n                {showConnectToCalendarModal}\r\n                {i18n}\r\n                planIds={$selectedPlanIds}\r\n                on:connectToCalendar={saveConnectToCalendarModalClicked}\r\n                on:close={closeSetDatesModalClicked}\r\n            />\r\n        {/if}\r\n\r\n        <CopyConfirmAndErrorModal\r\n            {showCopyConfirmModal}\r\n            {i18n}\r\n            {confirmModalBody}\r\n            bannerVisible={confirmModalBannerVisibility}\r\n            bannerText={confirmModalBannerText}\r\n            on:close={closeCopyPlansConfirmModalClicked}\r\n        />\r\n\r\n        <Modal\r\n            id=\"show-delete-plans-confirm-modal-id\"\r\n            bind:enabled={showDeletePlansConfirmModal}\r\n            titleText={i18n.deletePlansConfirmDialog_Heading}\r\n            bodyHtml={i18n.deletePlansConfirmDialog_Text}\r\n            confirmText={i18n.confirm}\r\n            cancelText={i18n.cancel}\r\n            confirmButtonType=\"destructive\"\r\n            on:close={deletePlansModalClicked}\r\n        />\r\n\r\n        <Modal\r\n            id=\"show-deactivate-elements-modal-id\"\r\n            bind:enabled={showDisableElementsConfirmModal}\r\n            titleText={i18n.pleaseConfirm}\r\n            bodyText={i18n.plannerPlanDeactivatedWithElementsWarning}\r\n            confirmText={i18n.yes}\r\n            cancelText={i18n.no}\r\n            on:close={confirmModalClicked}\r\n        />\r\n\r\n        <Modal\r\n            id=\"no-plans-selected-modal-id\"\r\n            bind:enabled={showNoPlansSelectedModal}\r\n            showCancel={false}\r\n            confirmText={i18n.ok}\r\n            titleText={i18n.deletePlansNonSelectedDialog_Heading}\r\n            bodyText={i18n.deletePlansNonSelectedDialog_Text}\r\n            confirmButtonType=\"primary\"\r\n            on:close={noPlansModalClicked}\r\n        />\r\n\r\n        <ButtonDropdown\r\n            arrow={false}\r\n            iconPlacement=\"end\"\r\n            id=\"plans-actions-dropdown\"\r\n            items={getActions()}\r\n            large={true}\r\n            responsive={false}\r\n            textOnly={false}\r\n            text={i18n.actions}\r\n            type=\"secondary\"\r\n            on:selectedOption={selectedAction}\r\n        />\r\n    {/if}\r\n</div>\r\n\r\n<script>\r\n    import { createEventDispatcher, onMount, tick } from \"svelte\";\r\n    import { get } from \"svelte/store\";\r\n    import { isMobile } from \"@itslearning/atlas/detectors/UserAgentHelper\";\r\n    import ButtonDropdown from \"@itslearning/prometheus/assets/dropdowns/ButtonDropdown/v1/ButtonDropdown.svelte\";\r\n    import Checkbox from \"@itslearning/prometheus/assets/inputs/Checkbox/v1/Checkbox.svelte\";\r\n    import Modal from \"@itslearning/prometheus/assets/modals/Modal/v2/Modal.svelte\";\r\n    import ConnectToCalendarModal from \"../ConnectToCalendarModal/ConnectToCalendarModal.svelte\";\r\n    import CopyConfirmAndErrorModal from \"../CopyConfirmAndErrorModal/CopyConfirmAndErrorModal.svelte\";\r\n    import SetDatesModal from \"../SetDatesModal/SetDatesModal.svelte\";\r\n    import {\r\n        removePlansFromCourse,\r\n        copyPlansFromCourse,\r\n        getCoursesForCopy,\r\n        setPlanActive,\r\n        setPlansActive,\r\n        updatePlansDates,\r\n        updatePlansDatesEvents\r\n    } from \"../../controllers/updatePlanController\";\r\n    import { getTopicsForCopyPlans } from \"../../api\";\r\n    import config from \"../../config\";\r\n    import {\r\n        endpoints,\r\n        plansActionType,\r\n        plansCopyActionModal,\r\n        columnTypes,\r\n        columnVisibility,\r\n        plannerViews\r\n    } from \"../../constants\";\r\n    import { getPlansOrderFromPlansView } from \"../../helpers/converters.js\";\r\n    import { makeCourseForDropdown } from \"../../helpers/makeCourseForDropdownHelper\";\r\n    import { isDateVisible } from \"../../helpers/visibilityHelper\";\r\n    import i18n from \"../../i18n.js\";\r\n\r\n    const dispatch = createEventDispatcher();\r\n\r\n    export let printAsTopic = false;\r\n    export let selectedView = 0;\r\n    export let data;\r\n    export let areAllPlansSelected = false;\r\n    export let topicFilterIds = [];\r\n    export let selectedPlanIds = {\r\n        set: () => {}\r\n    };\r\n\r\n    let showCopyPlansModal = false;\r\n    let showCopyConfirmModal = false;\r\n    let showDeletePlansConfirmModal = false;\r\n    let showNoPlansSelectedModal = false;\r\n    let showSetDatesModal = false;\r\n    let showConnectToCalendarModal = false;\r\n\r\n    let body;\r\n    let errorNoCourseSelected = false;\r\n    let errorNoTopicSelected = false;\r\n    let dropDownCourses = [];\r\n    let dropDownCoursesLoading = true;\r\n    let coursesItems;\r\n    let courseIsSelected = false;\r\n    let selectedCourseTitle = \"\";\r\n    let selectedCourseId;\r\n    let topicsItems;\r\n    let courseHasUseTopics = false;\r\n    let checkedKeepExistingTopic = false;\r\n    let topicIsSelected = false;\r\n    let selectedTopic = \"\";\r\n    let selectedTopicId = 0; // IMPORTANT, if no topic is selected, then no topic is copied\r\n    let copyWithoutTopic = false; // IMPORTANT, if the option \"Without topic\" is selected, then the plans will be copied without topic\r\n    let checkedCopyDates = false;\r\n    let checkedConnectedResources = true; // IMPORTANT, checked by default\r\n    let checkedAssessmentCriteria = false;\r\n    let showCopyInProgress = false;\r\n    let confirmModalBody;\r\n    let confirmModalBannerVisibility = false;\r\n    let confirmModalBannerText;\r\n    let showDisableElementsConfirmModal = false;\r\n    let selectedPlanIdsToMakeNotVisible;\r\n\r\n    onMount(() => {\r\n        getCoursesForCopy()\r\n            .then(data => dropDownCourses = data)\r\n            .finally(() => dropDownCoursesLoading = false);\r\n    });\r\n\r\n    const isSelfPaceCourse =\r\n        config.columnVisibilities[columnTypes.Date] === columnVisibility.Nobody;\r\n    const canConnectToCalendar = config.hasFunctionalityCalendar;\r\n\r\n    $: coursesDropdownText = !courseIsSelected ? i18n.selectACourse : selectedCourseTitle;\r\n\r\n    $: topicsDropdownText = !topicIsSelected ? i18n.selectATopic : selectedTopic;\r\n\r\n    $: showAssessmentCriteriaSection =\r\n        config.showAssessmentCriteriaSection &&\r\n        selectedCourseId !== null &&\r\n        selectedCourseId !== config.courseId;\r\n\r\n    async function selectedAction(event) {\r\n        const planIds = get(selectedPlanIds);\r\n        const actionData = event.detail.data;\r\n\r\n        switch (actionData.source) {\r\n            case plansActionType.SetDate:\r\n                if (!areAllPlansSelected && planIds && planIds.size === 0) {\r\n                    showNoPlansSelectedModal = true;\r\n                } else {\r\n                    showSetDatesModal = true;\r\n                }\r\n\r\n                break;\r\n            case plansActionType.ConnectToCalendar:\r\n                if (planIds && planIds.size === 0) {\r\n                    showNoPlansSelectedModal = true;\r\n                } else {\r\n                    showConnectToCalendarModal = true;\r\n                }\r\n\r\n                break;\r\n            case plansActionType.Copy:\r\n                if (!areAllPlansSelected && planIds && planIds.size === 0) {\r\n                    showNoPlansSelectedModal = true;\r\n                } else {\r\n                    showCopyPlansModal = true;\r\n                    setTimeout(() => openModalInMobile(), 100);\r\n                }\r\n\r\n                break;\r\n            case plansActionType.Delete:\r\n                if (!areAllPlansSelected && planIds && planIds.size === 0) {\r\n                    showNoPlansSelectedModal = true;\r\n                } else {\r\n                    showDeletePlansConfirmModal = true;\r\n                }\r\n\r\n                break;\r\n            case plansActionType.MakeVisible:\r\n                if (!areAllPlansSelected && planIds && planIds.size === 0) {\r\n                    showNoPlansSelectedModal = true;\r\n                } else {\r\n                    makeVisible();\r\n                }\r\n\r\n                break;\r\n            case plansActionType.MakeNotVisible:\r\n                if (!areAllPlansSelected && planIds && planIds.size === 0) {\r\n                    showNoPlansSelectedModal = true;\r\n                } else {\r\n                    makeNotVisible();\r\n                }\r\n\r\n                break;\r\n            case plansActionType.Print:\r\n                if ((!areAllPlansSelected && !planIds) || planIds.size === 0) {\r\n                    showNoPlansSelectedModal = true;\r\n                } else {\r\n                    window.open(\r\n                        selectedView === plannerViews.tableView\r\n                            ? areAllPlansSelected\r\n                                ? endpoints.printAllPlansTbl(\r\n                                      config.courseId,\r\n                                      topicFilterIds,\r\n                                      selectedView\r\n                                  )\r\n                                : endpoints.printPlansTbl(\r\n                                      config.courseId,\r\n                                      [...planIds],\r\n                                      selectedView\r\n                                  )\r\n                            : printAsTopic\r\n                              ? endpoints.printTopics(\r\n                                    config.courseId,\r\n                                    [config.topicId],\r\n                                    [...planIds]\r\n                                )\r\n                              : endpoints.printPlans(config.courseId, [...planIds], selectedView)\r\n                    );\r\n                }\r\n\r\n                break;\r\n        }\r\n    }\r\n\r\n    /** Plan action options  **/\r\n    function getActions() {\r\n        const options = [\r\n            {\r\n                icon: \"\",\r\n                label: i18n.makeVisible,\r\n                link: false,\r\n                target: \"_self\",\r\n                value: { source: plansActionType.MakeVisible }\r\n            },\r\n            {\r\n                icon: \"\",\r\n                label: i18n.makeNotVisible,\r\n                link: false,\r\n                target: \"_self\",\r\n                value: { source: plansActionType.MakeNotVisible }\r\n            },\r\n            ...(!isSelfPaceCourse\r\n                ? [\r\n                      {\r\n                          icon: \"\",\r\n                          label: i18n.setDate,\r\n                          link: false,\r\n                          target: \"_self\",\r\n                          value: { source: plansActionType.SetDate }\r\n                      }\r\n                  ]\r\n                : []),\r\n            ...(canConnectToCalendar && !isSelfPaceCourse\r\n                ? [\r\n                      {\r\n                          icon: \"\",\r\n                          label: i18n.connectToCalendar,\r\n                          link: false,\r\n                          target: \"_self\",\r\n                          value: { source: plansActionType.ConnectToCalendar }\r\n                      }\r\n                  ]\r\n                : []),\r\n            {\r\n                icon: \"\",\r\n                label: i18n.copy,\r\n                link: false,\r\n                target: \"_self\",\r\n                value: { source: plansActionType.Copy }\r\n            },\r\n            {\r\n                icon: \"\",\r\n                label: i18n.print,\r\n                link: false,\r\n                target: \"_self\",\r\n                value: { source: plansActionType.Print }\r\n            },\r\n            {\r\n                icon: \"\",\r\n                label: i18n.delete,\r\n                link: false,\r\n                target: \"_self\",\r\n                value: { source: plansActionType.Delete }\r\n            }\r\n        ];\r\n\r\n        return [{ options: options }];\r\n    }\r\n\r\n    function loadCourses() {\r\n        const starredCoursesList = [];\r\n        const otherCoursesList = [];\r\n\r\n        // Selects the arrays for starred and other courses, indicates which courses are archived\r\n        dropDownCourses.forEach(course => {\r\n            if (course.HasCourseSettingPlanner) {\r\n                const courseForDropdown =\r\n                    makeCourseForDropdown(course, plansCopyActionModal.SelectCourse, i18n.archived);\r\n\r\n                course.IsFavourite\r\n                    ? starredCoursesList.push(courseForDropdown)\r\n                    : otherCoursesList.push(courseForDropdown);\r\n            }\r\n        });\r\n\r\n        /** Courses dropdown options  **/\r\n        coursesItems = [\r\n            {\r\n                label: i18n.starred,\r\n                options: starredCoursesList\r\n            },\r\n            {\r\n                label: i18n.otherCourses,\r\n                options: otherCoursesList\r\n            }\r\n        ];\r\n    }\r\n\r\n    function selectCourse(event) {\r\n        const actionData = event.detail.data;\r\n\r\n        if (actionData.source === plansCopyActionModal.SelectCourse) {\r\n            errorNoCourseSelected = false;\r\n            errorNoTopicSelected = false;\r\n            courseIsSelected = true;\r\n            selectedCourseTitle = actionData.title;\r\n            selectedCourseId = actionData.id;\r\n            courseHasUseTopics = false;\r\n            topicIsSelected = false;\r\n            selectedTopicId = 0; // Without topic\r\n\r\n            loadTopics(actionData.id, actionData.hasUseTopics);\r\n        }\r\n    }\r\n\r\n    async function loadTopics(courseId, hasUseTopics) {\r\n        const topicsList = [];\r\n        const topics = await getTopicsForCopyPlans(courseId);\r\n\r\n        if (hasUseTopics) courseHasUseTopics = true;\r\n\r\n        topics.forEach(topic => {\r\n            topicsList.push({\r\n                icon: \"\",\r\n                label: topic.Name,\r\n                link: false,\r\n                target: \"_self\",\r\n                value: {\r\n                    source: plansCopyActionModal.SelectTopic,\r\n                    name: topic.Name,\r\n                    id: topic.TopicId\r\n                }\r\n            });\r\n        });\r\n\r\n        topicsList.push({\r\n            // Option to choose to copy the plan without topic\r\n            icon: \"\",\r\n            label: config.withoutTopic,\r\n            link: false,\r\n            target: \"_self\",\r\n            value: {\r\n                source: plansCopyActionModal.SelectWithoutTopic,\r\n                name: config.withoutTopic,\r\n                id: 0\r\n            }\r\n        });\r\n\r\n        /** Topics dropdown options  **/\r\n        topicsItems = [\r\n            {\r\n                options: topicsList\r\n            }\r\n        ];\r\n    }\r\n\r\n    function selectTopic(event) {\r\n        const actionData = event.detail.data;\r\n\r\n        switch (actionData.source) {\r\n            case plansCopyActionModal.SelectTopic:\r\n                errorNoTopicSelected = false;\r\n                topicIsSelected = true;\r\n                selectedTopic = actionData.name;\r\n                selectedTopicId = actionData.id;\r\n                copyWithoutTopic = false;\r\n                break;\r\n            case plansCopyActionModal.SelectWithoutTopic:\r\n                errorNoTopicSelected = false;\r\n                topicIsSelected = true;\r\n                selectedTopic = actionData.name;\r\n                selectedTopicId = actionData.id;\r\n                copyWithoutTopic = true;\r\n                break;\r\n            default:\r\n                break;\r\n        }\r\n    }\r\n\r\n    function updateSelectATopicSection() {\r\n        // If \"Keep existing\" is checked/unchecked, then we reset the entire dropdown\r\n        topicIsSelected = false;\r\n        selectedTopic = \"\";\r\n        selectedTopicId = 0;\r\n        copyWithoutTopic = false;\r\n\r\n        if (checkedKeepExistingTopic) {\r\n            checkedKeepExistingTopic = false;\r\n        } else {\r\n            checkedKeepExistingTopic = true;\r\n            errorNoTopicSelected = false;\r\n        }\r\n    }\r\n\r\n    function updateCheckedStatusCopyDates() {\r\n        if (checkedCopyDates) {\r\n            checkedCopyDates = false;\r\n        } else {\r\n            checkedCopyDates = true;\r\n        }\r\n    }\r\n\r\n    function updateCheckedStatusConnectedResources() {\r\n        if (checkedConnectedResources) {\r\n            checkedConnectedResources = false;\r\n        } else {\r\n            checkedConnectedResources = true;\r\n        }\r\n    }\r\n\r\n    function updateCheckedStatusAssessmentCriteria() {\r\n        if (checkedAssessmentCriteria) {\r\n            checkedAssessmentCriteria = false;\r\n        } else {\r\n            checkedAssessmentCriteria = true;\r\n        }\r\n    }\r\n\r\n    async function copyPlansModalClicked(event) {\r\n        if (event.detail.confirmed === true) {\r\n            if (!courseIsSelected) {\r\n                // If Copy is pressed, but no course is selected\r\n                showCopyPlansModal = true;\r\n                errorNoCourseSelected = true;\r\n            } else if (courseHasUseTopics && !checkedKeepExistingTopic && !topicIsSelected) {\r\n                // If Copy is pressed, but \"Keep existing is not checked\" and no topic is selected\r\n                showCopyPlansModal = true;\r\n                errorNoTopicSelected = true;\r\n            } else {\r\n                showCopyInProgress = true;\r\n\r\n                const planIds = get(selectedPlanIds);\r\n\r\n                if (planIds && planIds.size > 0) {\r\n                    const copyPlansData = await copyPlansFromCourse(\r\n                        selectedCourseId,\r\n                        selectedTopicId,\r\n                        checkedCopyDates,\r\n                        checkedConnectedResources,\r\n                        checkedAssessmentCriteria,\r\n                        [...planIds],\r\n                        copyWithoutTopic,\r\n                        areAllPlansSelected,\r\n                        topicFilterIds\r\n                    );\r\n\r\n                    confirmModalBody = copyPlansData.ResultMessage;\r\n\r\n                    if (copyPlansData.ResultWarningNotes) {\r\n                        // If there is a warning note, then it is displayed in the banner\r\n                        confirmModalBannerVisibility = true;\r\n                        confirmModalBannerText = copyPlansData.ResultWarningNotes;\r\n                    }\r\n                }\r\n\r\n                showCopyInProgress = false;\r\n                showCopyConfirmModal = true;\r\n            }\r\n        } else {\r\n            // On Cancel, the Plans page gets reloaded, to reset all parameters\r\n            completePlanAction();\r\n        }\r\n    }\r\n\r\n    function closeCopyPlansConfirmModalClicked() {\r\n        showCopyConfirmModal = false;\r\n        completePlanAction();\r\n    }\r\n\r\n    async function deletePlansModalClicked({ detail: { confirmed: isPlansDeleteConfirmed } }) {\r\n        if (isPlansDeleteConfirmed) {\r\n            if (areAllPlansSelected) {\r\n                await removePlansFromCourse([], true, topicFilterIds);\r\n            } else {\r\n                const planIds = get(selectedPlanIds);\r\n\r\n                if (planIds.size > 0) {\r\n                    await removePlansFromCourse([...planIds]);\r\n                }\r\n            }\r\n\r\n            completePlanAction();\r\n        }\r\n\r\n        showDeletePlansConfirmModal = false;\r\n    }\r\n\r\n    async function saveSetDatesModalClicked({ detail }) {\r\n        const planIds = get(selectedPlanIds);\r\n\r\n        if (areAllPlansSelected || planIds.size > 0) {\r\n            await updatePlansDates(\r\n                [...planIds],\r\n                detail.start,\r\n                detail.stop,\r\n                detail.weekNumber,\r\n                detail.weekDaysAPI,\r\n                getPlansOrderFromPlansView(selectedView),\r\n                areAllPlansSelected,\r\n                topicFilterIds\r\n            );\r\n            completePlanAction();\r\n        }\r\n    }\r\n\r\n    async function saveConnectToCalendarModalClicked({ detail: { activityIds } }) {\r\n        if (activityIds.length > 0) {\r\n            if (areAllPlansSelected) {\r\n                await updatePlansDatesEvents([], activityIds, true, topicFilterIds);\r\n            } else {\r\n                const planIds = get(selectedPlanIds);\r\n\r\n                if (planIds.size > 0) {\r\n                    await updatePlansDatesEvents([...planIds], activityIds);\r\n                }\r\n            }\r\n\r\n            completePlanAction();\r\n        }\r\n    }\r\n\r\n    // On Cancel, the Plans page gets reloaded, to reset all parameters\r\n    function closeSetDatesModalClicked() {\r\n        completePlanAction();\r\n    }\r\n\r\n    function noPlansModalClicked() {\r\n        showNoPlansSelectedModal = false;\r\n    }\r\n\r\n    // Make visible only the selected plans that are not visible, ignore the rest.\r\n    async function makeVisible() {\r\n        if (areAllPlansSelected) {\r\n            await setPlansActive(\r\n                [],\r\n                true,\r\n                config.activateElementsByPlan,\r\n                true,\r\n                areAllPlansSelected,\r\n                topicFilterIds\r\n            );\r\n            await tick();\r\n            completePlanAction();\r\n        } else {\r\n            const planIds = get(selectedPlanIds);\r\n\r\n            // From the list of plans we extract the selected ones which are NOT visible\r\n            const plansNotVisible_Selected = data.plans\r\n                ? data.plans.filter(p => !p.isActive && planIds.has(p.id))\r\n                : [];\r\n\r\n            if (plansNotVisible_Selected.length !== 0) {\r\n                if (plansNotVisible_Selected.length === 1) {\r\n                    await setPlanActive(\r\n                        plansNotVisible_Selected[0].id,\r\n                        true,\r\n                        config.activateElementsByPlan\r\n                    );\r\n                } else if (plansNotVisible_Selected.length > 1) {\r\n                    const planIds = [];\r\n\r\n                    plansNotVisible_Selected.forEach(plan => {\r\n                        planIds.push(plan.id);\r\n                    });\r\n                    await setPlansActive(planIds, true, config.activateElementsByPlan);\r\n                }\r\n\r\n                await tick();\r\n            }\r\n\r\n            completePlanAction();\r\n        }\r\n    }\r\n\r\n    // Make not visible only the selected plans that are visible, ignore the rest.\r\n    async function makeNotVisible() {\r\n        if (areAllPlansSelected) {\r\n            // If the planner setting 'Activate connected elements when the plan is activated' is enabled and the selected plans have connected elements, a confim dialog will appear\r\n            if (config.activateElementsByPlan) {\r\n                showDisableElementsConfirmModal = true;\r\n            } else {\r\n                await setPlansActive(\r\n                    [],\r\n                    false,\r\n                    config.activateElementsByPlan,\r\n                    true,\r\n                    areAllPlansSelected,\r\n                    topicFilterIds\r\n                );\r\n                await tick();\r\n                completePlanAction();\r\n            }\r\n        } else {\r\n            const planIds = get(selectedPlanIds);\r\n\r\n            // From the list of plans we extract the selected ones which are visible\r\n            const plansVisible_Selected = data.plans\r\n                ? data.plans.filter(p => p.isActive && planIds.has(p.id))\r\n                : [];\r\n            const plansVisible_Selected_WithElements = plansVisible_Selected.filter(\r\n                p => p.elements.length >= 1\r\n            );\r\n\r\n            if (plansVisible_Selected.length !== 0) {\r\n                // If the planner setting 'Activate connected elements when the plan is activated' is enabled and the selected plans have connected elements, a confim dialog will appear\r\n                if (\r\n                    config.activateElementsByPlan &&\r\n                    plansVisible_Selected_WithElements.length !== 0\r\n                ) {\r\n                    selectedPlanIdsToMakeNotVisible = plansVisible_Selected;\r\n                    showDisableElementsConfirmModal = true;\r\n                } else {\r\n                    if (plansVisible_Selected.length === 1) {\r\n                        await setPlanActive(\r\n                            plansVisible_Selected[0].id,\r\n                            false,\r\n                            config.activateElementsByPlan\r\n                        );\r\n                    } else if (plansVisible_Selected.length > 1) {\r\n                        const planIds = [];\r\n\r\n                        plansVisible_Selected.forEach(plan => {\r\n                            planIds.push(plan.id);\r\n                        });\r\n                        await setPlansActive(planIds, false, config.activateElementsByPlan);\r\n                    }\r\n\r\n                    await tick();\r\n                    completePlanAction();\r\n                }\r\n            } else {\r\n                completePlanAction();\r\n            }\r\n        }\r\n    }\r\n\r\n    // A confirmation modal appears when plans are deactivated\r\n    // \"Do you want to deactivate all elements connected to this plan?\"\r\n    async function confirmModalClicked(event) {\r\n        const toggleElementsActivation = event.detail.confirmed;\r\n\r\n        if (areAllPlansSelected) {\r\n            await setPlansActive(\r\n                [],\r\n                false,\r\n                toggleElementsActivation,\r\n                true,\r\n                areAllPlansSelected,\r\n                topicFilterIds\r\n            );\r\n        } else if (selectedPlanIdsToMakeNotVisible.length === 1) {\r\n            await setPlanActive(\r\n                selectedPlanIdsToMakeNotVisible[0].id,\r\n                false,\r\n                toggleElementsActivation\r\n            );\r\n        } else if (selectedPlanIdsToMakeNotVisible.length > 1) {\r\n            const planIds = [];\r\n\r\n            selectedPlanIdsToMakeNotVisible.forEach(plan => {\r\n                planIds.push(plan.id);\r\n            });\r\n            await setPlansActive(planIds, false, toggleElementsActivation);\r\n        }\r\n\r\n        showDisableElementsConfirmModal = false;\r\n        completePlanAction();\r\n    }\r\n\r\n    const modalId = \"#show-copy-plans-modal-id\";\r\n\r\n    function openModalInMobile() {\r\n        if (isMobile()) {\r\n            if (document.querySelector(modalId) !== null) {\r\n                document.querySelector(modalId).style.minHeight = \"100%\";\r\n            }\r\n        }\r\n    }\r\n\r\n    window.addEventListener(\"orientationchange\", function () {\r\n        if (document.querySelector(modalId) !== null) {\r\n            setTimeout(() => openModalInMobile(), 300);\r\n        }\r\n    });\r\n\r\n    const dropdownCopyPlanSection =\r\n        \"#copy-plans-modal__courses-dropdown > section > section.prom-dropdown__body\";\r\n    const dropdownCopyTopicSection =\r\n        \"#copy-plans-modal__topics-dropdown > section > section.prom-dropdown__body\";\r\n    const dropdownHeight = \"150px\";\r\n\r\n    // Add a scroll bar to the courses dropdown in copy plan modal\r\n    function addScrollCourseDropdown() {\r\n        if (document.querySelector(dropdownCopyPlanSection).style.height === \"\") {\r\n            document.querySelector(dropdownCopyPlanSection).style.height = dropdownHeight;\r\n        }\r\n    }\r\n\r\n    // Add a scroll bar to the topics dropdown in copy plan modal\r\n    function addScrollTopicDropdown() {\r\n        if (document.querySelector(dropdownCopyTopicSection).style.height === \"\") {\r\n            document.querySelector(dropdownCopyTopicSection).style.height = dropdownHeight;\r\n        }\r\n    }\r\n\r\n    const completePlanAction = () => {\r\n        selectedPlanIds.set(new Set([]));\r\n        dispatch(\"endOfActionOnSelectedPlans\");\r\n    };\r\n</script>\r\n","<div class=\"use-ready-made-content {emptyState ? 'use-ready-made-content-emptystate' : ''}\">\r\n    <a class=\"use-ready-made-content-link\" {href} aria-label={linktext}>\r\n        <span class=\"use-ready-made-content-link--icon\" />\r\n        <span class=\"use-ready-made-content-link--text\">{linktext}</span>\r\n    </a>\r\n</div>\r\n\r\n<script>\r\n    export let href;\r\n    export let linktext;\r\n    export let emptyState;\r\n</script>\r\n","<div class=\"its-plans__toolbar\">\r\n    {#if config.canEdit && !data.loading}\r\n        <div class=\"its-plans__toolbar_items\">\r\n            <Link kind=\"primary-standalone\" href={createNewPlanUrl} on:click={createNew}>\r\n                {i18n.addPlan}\r\n            </Link>\r\n            <PlanActions\r\n                {selectedView}\r\n                {data}\r\n                {hideFeaturesForTableView}\r\n                {areAllPlansSelected}\r\n                {topicFilterIds}\r\n                {selectedPlanIds}\r\n                on:endOfActionOnSelectedPlans\r\n            />\r\n            {#if !hideFeaturesForTableView && config.canEdit && config.isImportEnabled}\r\n                <UseReadyMadeContentLink\r\n                    href={`/Courses/${\r\n                        config.courseId\r\n                    }/ImportContent?importTopic=false&returnUrl=${encodeURI(window.location.origin + window.location.pathname)}`}\r\n                    linktext={i18n.useReadyMadeContent}\r\n                    emptyState={false}\r\n                />\r\n            {/if}\r\n        </div>\r\n    {/if}\r\n</div>\r\n\r\n<script>\r\n    import Link from \"@itslearning/prometheus/assets/Navigation/Link/v1/Link.svelte\";\r\n    import PlanActions from \"../../components/PlanActions/PlanActions.svelte\";\r\n    import UseReadyMadeContentLink from \"../../components/UseReadyMadeContentLink/UseReadyMadeContentLink.svelte\";\r\n\r\n    import i18n from \"../../i18n\";\r\n    import config from \"../../config\";\r\n    import { createPlan, createPlanV2 } from \"../../api\";\r\n    import { addBackDestinationParam } from \"../../helpers/backLinkHelper\";\r\n    import { TOPIC_ID_DESTINATION_QUERY_STRING_PARAMETER } from \"../../constants\";\r\n\r\n    export let data;\r\n    export let selectedView;\r\n    // Added by ITS-86131 and should be removed later.\r\n    export let hideFeaturesForTableView = false;\r\n    export let backExtraParams = null;\r\n    export let areAllPlansSelected = false;\r\n    export let topicFilterIds = [];\r\n    export let selectedPlanIds = {\r\n        set: () => {}\r\n    };\r\n\r\n    let createNewPlanUrl = \"#\";\r\n\r\n    const createNew = async event => {\r\n        event.preventDefault();\r\n\r\n        const topicId = config.assignToEnabled ? config.topicId : null;\r\n\r\n        const planParams = {\r\n            topic: {\r\n                id: topicId\r\n            },\r\n            start: \"0000-00-00 00:00:00\",\r\n            stop: \"0000-00-00 00:00:00\"\r\n        };\r\n\r\n        const newPlan = config.assignToEnabled ? await createPlanV2(planParams) : await createPlan(planParams);\r\n\r\n        if (backExtraParams && backExtraParams[TOPIC_ID_DESTINATION_QUERY_STRING_PARAMETER]) {\r\n            Reflect.deleteProperty(backExtraParams, TOPIC_ID_DESTINATION_QUERY_STRING_PARAMETER);\r\n        }\r\n\r\n        createNewPlanUrl = addBackDestinationParam(\r\n            `${config.newPlanUrl}/${newPlan.planId}?pendingPlanId=${newPlan.planId}`,\r\n            backExtraParams\r\n        );\r\n\r\n        window.location.href = createNewPlanUrl;\r\n\r\n        return false;\r\n    };\r\n</script>\r\n","export default {\n    CLOSED: 'modalClosed',\n    CONFIRMED: 'modalConfirmed',\n    CANCELLED: 'modalCancelled'\n};\n","<svelte:window on:keyup={onWindowKeyUp} on:resize={onWindowResize} />\n\n<section\n    bind:this={rootElement}\n    class=\"prom-modal\"\n    on:click={closeHandler}\n    role={rootElementRole}\n    aria-labelledby={hideHeader ? null : headerClientId}\n    aria-describedby={bodyClientId}\n>\n    <div\n        class=\"prom-modal__dialog {scrollModiferClass}\"\n        role=\"document\"\n    >\n        {#if !hideHeader}\n            <header class=\"prom-modal__header\">\n                <h1 id=\"{headerClientId}\" class=\"prom-modal__heading\">{heading}</h1>\n                {#if showCloseButton}\n                <button\n                    bind:this={closeElement}\n                    class=\"prom-modal__close\"\n                    type=\"button\"\n                    on:click={closeHandler}\n                >\n                    <span class=\"screen-reader\">{translations.CLOSE}</span>\n                </button>\n                {/if}\n            </header>\n        {/if}\n\n        <div\n            bind:this={bodyElement}\n            id={bodyClientId}\n            class=\"prom-modal__body\"\n        >\n            <div class=\"prom-modal__body__content\">\n                {#if body}\n                {@html body}\n                {/if}\n\n                <slot name=\"body\"></slot>\n            </div>\n        </div>\n\n        <footer class=\"prom-modal__footer\">\n            <slot name=\"footer\"></slot>\n        </footer>\n    </div>\n\n</section>\n\n<script>\n    import ModalEvent from './ModalEvents';\n\n    import TabTrapHelper from '../../../../lib/helpers/TabTrapHelper';\n    import { isIE, isEdge } from '../../../../lib/helpers/UAHelper';\n    import { Keys } from '@itslearning/atlas/keyboard/keys';\n    import { normalizeKey } from '@itslearning/atlas/keyboard/normalize';\n    import { debounce } from '@itslearning/atlas/dom/Ratecontrol';\n\n    import { onMount, onDestroy, afterUpdate, createEventDispatcher } from 'svelte';\n\n    const dispatch = createEventDispatcher();\n\n    const defaultI18n = {\n        CLOSE: 'Close'\n    };\n\n    /** @type {string} Used for header ({id}__label) and body ({id}__body) Optional, default value is 'prom-modal'. */\n    export let id = 'prom-modal';\n    /** @type {Object} */\n    export let i18n = {};\n    /** @type {string} The accessibility role attribute for the modal. */\n    export let role = '';\n    /** @type {string} The title of the modal, displayed as a heading tag.*/\n    export let heading = '';\n    /** @type {string} The content of the modal, i.e. message. You can also use the slots. Optional, better to use slot=\"body\" */\n    export let body = '';\n    /** @type {boolean} Flag, which indicates that this modal dialog can be closable by a user. */\n    export let closeable = true;\n    /** @type {boolean} Flag, which indicates that this modal dialog has a close button. */\n    export let showCloseButton = false;\n    /** @type {boolean} Hide the dialog header. */\n    export let hideHeader = false;\n\n    let tabTrapper;\n    let rootElement;\n    let closeElement;\n    let bodyElement;\n    let scrollModiferClass;\n\n    onMount(() => {\n        tabTrapper = new TabTrapHelper(rootElement);\n    });\n\n    onDestroy(() => {\n        tabTrapper.teardown();\n    });\n\n    afterUpdate(() => {\n        setTimeout(() => {\n            setScroll();\n            tabTrapper.init();\n        }, 0);\n    })\n\n    $: headerClientId = `${id}__label`;\n\n    $: {\n        if (!hideHeader && (!heading || typeof heading !== 'string')) {\n            console.warn('`heading` must be supplied or `hideHeader` must be true');\n        }\n    }\n\n    let rootElementRole;\n\n    $: {\n        const defaultRole = 'dialog';\n        const roles = [defaultRole, 'alertdialog'];\n\n        if (roles.indexOf(role) >= 0) {\n            rootElementRole = role;\n        } else {\n            rootElementRole = defaultRole;\n        }\n    }\n\n    $: translations = { ...defaultI18n, ...i18n };\n\n    $: headerClientId = `${id}__label`;\n\n    $: bodyClientId = `${id}__body`;\n\n    /**\n     * This function should only run for browsers that have buggy implementations of flex.\n     * So, IE11 and Edge at this time. It should be called when `maybeStyleForScroll`\n     * has finished running.\n     */\n    function maybeSetBodyHeight() {\n        if (!isIE() && !isEdge()) {\n            return;\n        }\n\n        // Due to the 'async' nature of this code, it is possible for any\n        // synchronous code to have altered the DOM.\n        if (!bodyElement) {\n            return;\n        }\n\n        // This is a little bit of layout thrashing,\n        // but it is debounced. In most use cases this is\n        // easily good enough.\n        bodyElement.style.height = 'auto';\n\n        // The act of \"getting\" the client height is all that\n        // seems to be required here. We don't need to use it.\n        bodyElement.clientHeight; //eslint-disable-line\n\n        bodyElement.style.height = '100%';\n    }\n\n    function maybeStyleForScroll() {\n        // Due to the 'async' nature of this code, it is possible for any\n        // synchronous code to have altered the DOM.\n        if (!bodyElement) {\n            return;\n        }\n\n        // +1 due to IE and Edge zoom rounding error.\n        const hasScroll = bodyElement.scrollHeight > bodyElement.clientHeight + 1;\n        scrollModiferClass = hasScroll ? 'prom-modal__dialog--has-scroll' : '';\n    }\n\n    function setScroll() {\n        debounce(function () {\n            maybeSetBodyHeight();\n            maybeStyleForScroll();\n        }, 100);\n    }\n\n\n    /**\n     * @param {MouseEvent} event\n     */\n    function closeHandler(event) {\n        const validCloseElements = [closeElement, rootElement];\n        const shouldIgnore = validCloseElements.indexOf(event.target) < 0;\n\n        if (shouldIgnore) {\n            return;\n        }\n\n        if (event.target === closeElement) {\n            event.stopPropagation();\n        }\n\n        close(event);\n    }\n\n    /**\n     * @param {KeyboardEvent | MouseEvent} event\n     */\n    function close(event) {\n        if (closeable) {\n            dispatch(ModalEvent.CLOSED, { event });\n        }\n    }\n\n    /**\n     * @param {KeyboardEvent} event\n     */\n    function onWindowKeyUp(event) {\n        const key = normalizeKey(event.key);\n\n        if (key === Keys.ESCAPE) {\n            dispatch(ModalEvent.CLOSED, { event });\n        }\n    }\n\n    function onWindowResize() {\n        setScroll();\n    }\n</script>\n","<fieldset class=\"prom-colorpicker\">\n    <legend class=\"prom-colorpicker__legend\">\n        <span class=\"prom-colorpicker__title\">{label}</span>\n        {#if description}\n            <span class=\"prom-colorpicker__description\">{description}</span>\n        {/if}\n    </legend>\n    <div class=\"prom-colorpicker__wrapper\">\n        {#each colours as colour}\n        <label class=\"prom-colorpicker__option\">\n            <input\n                checked={selected === colour.className}\n                class=\"prom-colorpicker__input | screen-reader\"\n                disabled={disabled}\n                name=\"colorpicker_{name}\"\n                type=\"radio\"\n                value={colour.className}\n                on:change = {select}>\n            <span class=\"prom-colorpicker__labelwrapper\">\n                <span class=\"prom-colorpicker__label {colour.className}\">{colour.className} ({colour.hexCode})</span>\n            </span>\n        </label>\n        {/each}\n    </div>\n</fieldset>\n\n<script>\n    import { createEventDispatcher } from 'svelte';\n\n    const dispatch = createEventDispatcher();\n\n    export let colours = [];\n    export let description = '';\n    export let disabled = false;\n    export let label = '';\n    export let name = '';\n    export let selected = '';\n\n    function select(event) {\n        selected = event.currentTarget.defaultValue;\n        dispatch('change', event);\n    }\n</script>\n","<div class=\"create-topic-modal\">\r\n    <Modal\r\n        id=\"create-topic-modal-id\"\r\n        {i18n}\r\n        {body}\r\n        heading={config.createTopicText}\r\n        showCloseButton={false}\r\n        on:modalClosed={cancel}\r\n        closeable={false}\r\n    >\r\n        <div slot=\"body\" class=\"topic-modal__container\">\r\n            <div class=\"topic-modal__info\">{i18n.topicInformation}</div>\r\n            <TextField\r\n                id={topicModalInputId}\r\n                label={i18n.titleHeader}\r\n                labelHidden={false}\r\n                bind:value={topicTitle}\r\n                type=\"text\"\r\n                placeholder={i18n.createTopicTitlePlaceholder}\r\n                required={true}\r\n                minlength={minTitleLength}\r\n                maxlength={maxTitleLength}\r\n                height=\"medium\"\r\n                on:keyup={checkIfEmptyTitle}\r\n            />\r\n            <ColorPicker\r\n                colours={config.topicColours}\r\n                {disabled}\r\n                label={i18n.topicColourText}\r\n                {name}\r\n                bind:selected={selectedColour}\r\n            />\r\n        </div>\r\n\r\n        <div slot=\"footer\">\r\n            <Button\r\n                type=\"primary\"\r\n                large={true}\r\n                text={i18n.create}\r\n                disabled={disableCreateButton}\r\n                on:click={create}\r\n            />\r\n            <Button type=\"secondary\" large={true} text={i18n.cancel} on:click={cancel} />\r\n        </div>\r\n    </Modal>\r\n</div>\r\n\r\n<script>\r\n    import Button from \"@itslearning/prometheus/assets/inputs/Button/v1/Button.svelte\";\r\n    import Modal from \"@itslearning/prometheus/assets/modals/Modal/v1/Modal.svelte\";\r\n    import ColorPicker from \"@itslearning/prometheus/assets/inputs/ColorPicker/v1/ColorPicker.svelte\";\r\n    import TextField from \"@itslearning/prometheus/assets/inputs/TextField/v1/TextField.svelte\";\r\n    import { createEventDispatcher, onMount } from \"svelte\";\r\n    import i18n from \"../../i18n.js\";\r\n    import config from \"../../config\";\r\n    import { getTopicRandomColour } from \"../../api\";\r\n    import { minTitleLength, maxTitleLength } from \"../../constants\";\r\n\r\n    export let topicTitle;\r\n    export let body;\r\n\r\n    export let disabled = false;\r\n    export let name = \"topic-color-picker\";\r\n    export let selectedColour = undefined;\r\n    export let autoSelectedColourId;\r\n\r\n    let disableCreateButton = true;\r\n\r\n    const topicModalInputId = \"topic-modal-input-id\";\r\n\r\n    onMount(() => {\r\n        getTopicRandomColour().then(data => {\r\n            autoSelectedColourId = data.topicColorSchema;\r\n            config.topicColours.forEach(function (colour) {\r\n                if (colour.id === autoSelectedColourId) {\r\n                    selectedColour = colour.className;\r\n                }\r\n            });\r\n\r\n            if (selectedColour === undefined) {\r\n                selectedColour = \"smog-1\";\r\n            }\r\n        });\r\n\r\n        const focusElement = \"#prom-input-\" + topicModalInputId;\r\n\r\n        if (document.querySelector(focusElement)) {\r\n            document.querySelector(focusElement).focus();\r\n        }\r\n    });\r\n\r\n    const dispatch = createEventDispatcher();\r\n\r\n    function create() {\r\n        disableCreateButton = true;\r\n        let selectedColourId = 1;\r\n\r\n        config.topicColours.forEach(function (colour) {\r\n            if (colour.className === selectedColour) {\r\n                selectedColourId = colour.id;\r\n            }\r\n        });\r\n        dispatch(\"createTopic\", {\r\n            title: topicTitle,\r\n            colour: selectedColourId\r\n        });\r\n    }\r\n\r\n    function cancel() {\r\n        dispatch(\"cancel\");\r\n    }\r\n\r\n    function checkIfEmptyTitle() {\r\n        if (topicTitle && topicTitle.length > 0) {\r\n            disableCreateButton = false;\r\n        } else {\r\n            disableCreateButton = true;\r\n        }\r\n    }\r\n</script>\r\n","<div class=\"its-topics-action__options\">\r\n    {#if config.canEdit}\r\n        <div class=\"copy-topics-modal\">\r\n            <Modal\r\n                id=\"show-copy-topics-modal-id\"\r\n                bind:enabled={showCopyTopicsModal}\r\n                titleText={i18n.copy}\r\n                {body}\r\n                confirmText={i18n.copy}\r\n                cancelText={i18n.cancel}\r\n                on:close={copyTopicsModalClicked}\r\n            >\r\n                <div slot=\"body\">\r\n                    <form>\r\n                        <fieldset>\r\n                            <legend>{i18n.copyTheSelectedTopicsTo}</legend>\r\n\r\n                            <ButtonDropdown\r\n                                arrow={false}\r\n                                disabled={dropDownCoursesLoading}\r\n                                iconClass={dropDownCoursesLoading ? 'prom-button--loading' : 'prom-button-dropdown-icon'}\r\n                                iconPlacement=\"end\"\r\n                                id=\"copy-topics-modal__courses-dropdown\"\r\n                                textOnly={false}\r\n                                text={coursesDropdownText}\r\n                                responsive={false}\r\n                                items={coursesItems}\r\n                                type=\"secondary\"\r\n                                on:beforeToggle={loadCourses}\r\n                                on:beforeToggle={addScrollCourseDropdownTopics}\r\n                                on:selectedOption={selectCourse}\r\n                            />\r\n                            <div\r\n                                class=\"copy-topics-modal__error\"\r\n                                hidden={errorNoCourseSelected ? \"\" : \"hidden\"}\r\n                            >\r\n                                {i18n.selectACourse}\r\n                            </div>\r\n                        </fieldset>\r\n                        {#if courseIsSelected}\r\n                            <fieldset>\r\n                                <legend>{i18n.options}</legend>\r\n\r\n                                {#if isDateVisible()}\r\n                                    <div class=\"copy-topics-modal__options-checkbox\">\r\n                                        <Checkbox\r\n                                            checked={checkedCopyDates}\r\n                                            label={i18n.copyDatesForNewPlans}\r\n                                            small\r\n                                            on:change={updateCheckedStatusCopyDates}\r\n                                        />\r\n                                    </div>\r\n                                {/if}\r\n                                <div class=\"copy-topics-modal__options-checkbox\">\r\n                                    <Checkbox\r\n                                        checked={checkedConnectedResources}\r\n                                        label={i18n.copyConnectedResources}\r\n                                        small\r\n                                        on:change={updateCheckedStatusConnectedResources}\r\n                                    />\r\n                                    <div class=\"copy-topics-modal__options-checkbox-info\">\r\n                                        {i18n.copyConnectedResourcesInfoMessage}\r\n                                    </div>\r\n                                </div>\r\n                                {#if showAssessmentCriteriaSection}\r\n                                    <div class=\"copy-topics-modal__options-checkbox\">\r\n                                        <Checkbox\r\n                                            checked={checkedAssessmentCriteria}\r\n                                            label={i18n.replaceExistingAssesmentCriteria}\r\n                                            small\r\n                                            on:change={updateCheckedStatusAssessmentCriteria}\r\n                                        />\r\n                                    </div>\r\n                                {/if}\r\n                            </fieldset>\r\n                        {/if}\r\n                    </form>\r\n                </div>\r\n            </Modal>\r\n        </div>\r\n\r\n        <Modal\r\n            id=\"copy-in-progress-modal-id\"\r\n            bind:enabled={showCopyInProgress}\r\n            titleText={i18n.copy}\r\n            confirmText={i18n.close}\r\n            showCancel={false}\r\n        >\r\n            <div slot=\"body\">\r\n                <div class=\"copy-topics__copy-in-progress\">\r\n                    <span class=\"screen-reader\">{i18n.copyInProgress}</span>\r\n                </div>\r\n            </div>\r\n        </Modal>\r\n\r\n        <CopyConfirmAndErrorModal\r\n            {showCopyConfirmModal}\r\n            {i18n}\r\n            {confirmModalBody}\r\n            bannerVisible={confirmModalBannerVisibility}\r\n            bannerText={confirmModalBannerText}\r\n            on:close={closeCopyTopicsConfirmModalClicked}\r\n        />\r\n\r\n        <Modal\r\n            id=\"show-delete-topics-confirm-modal-id\"\r\n            bind:enabled={showDeleteTopicsConfirmModal}\r\n            titleText={config.deleteTopicHeading}\r\n            bodyHtml={i18n.deleteTopicConfirmDialogPart1_Text +\r\n                \"<br>\" +\r\n                i18n.deleteTopicConfirmDialogPart2_Text}\r\n            confirmText={i18n.confirm}\r\n            cancelText={i18n.cancel}\r\n            confirmButtonType=\"destructive\"\r\n            on:close={deleteTopicsModalClicked}\r\n        />\r\n\r\n        <Modal\r\n            id=\"no-topics-selected-modal-id\"\r\n            bind:enabled={showNoTopicsSelectedModal}\r\n            showCancel={false}\r\n            confirmText={i18n.ok}\r\n            titleText={i18n.deleteTopicsNonSelectedDialog_Heading}\r\n            bodyText={i18n.deleteTopicsNonSelectedDialog_Text}\r\n            confirmButtonType=\"primary\"\r\n            on:close={noTopicsModalClicked}\r\n        />\r\n\r\n        <ButtonDropdown\r\n            arrow={false}\r\n            iconPlacement=\"end\"\r\n            id=\"topics-actions-dropdown\"\r\n            items={getActions()}\r\n            large={true}\r\n            responsive={false}\r\n            textOnly={false}\r\n            text={i18n.actions}\r\n            type=\"secondary\"\r\n            on:selectedOption={selectedAction}\r\n        />\r\n    {/if}\r\n</div>\r\n\r\n<script>\r\n    import { createEventDispatcher, onMount } from \"svelte\";\r\n    import { get } from \"svelte/store\";\r\n    import { isMobile } from \"@itslearning/atlas/detectors/UserAgentHelper\";\r\n    import ButtonDropdown from \"@itslearning/prometheus/assets/dropdowns/ButtonDropdown/v1/ButtonDropdown.svelte\";\r\n    import Checkbox from \"@itslearning/prometheus/assets/inputs/Checkbox/v1/Checkbox.svelte\";\r\n    import Modal from \"@itslearning/prometheus/assets/modals/Modal/v2/Modal.svelte\";\r\n    import CopyConfirmAndErrorModal from \"../CopyConfirmAndErrorModal/CopyConfirmAndErrorModal.svelte\";\r\n    import { copyTopics, deleteTopics } from \"../../api.js\";\r\n    import config from \"../../config\";\r\n    import { endpoints, topicsActionType } from \"../../constants\";\r\n    import { getCoursesForCopy } from \"../../controllers/updatePlanController\";\r\n    import { makeCourseForDropdown } from \"../../helpers/makeCourseForDropdownHelper\";\r\n    import { isDateVisible } from \"../../helpers/visibilityHelper\";\r\n    import i18n from \"../../i18n.js\";\r\n    import { selectedTopicIds } from \"../../logic/plans/stores\";\r\n\r\n    const dispatch = createEventDispatcher();\r\n\r\n    export let showPrintAction = true;\r\n\r\n    let showCopyTopicsModal = false;\r\n    let showCopyConfirmModal = false;\r\n    let showDeleteTopicsConfirmModal = false;\r\n    let showNoTopicsSelectedModal = false;\r\n\r\n    let body;\r\n    let errorNoCourseSelected = false;\r\n    let dropDownCourses = [];\r\n    let dropDownCoursesLoading = true;\r\n    let coursesItems;\r\n    let courseIsSelected = false;\r\n    let selectedCourseTitle = \"\";\r\n    let selectedCourseId;\r\n    let checkedCopyDates = false;\r\n    let checkedConnectedResources = true; // IMPORTANT, checked by default\r\n    let checkedAssessmentCriteria = false;\r\n    let showCopyInProgress = false;\r\n    let confirmModalBody;\r\n    let confirmModalBannerVisibility = false;\r\n    let confirmModalBannerText;\r\n\r\n    $: coursesDropdownText = !courseIsSelected ? i18n.selectACourse : selectedCourseTitle;\r\n\r\n    $: showAssessmentCriteriaSection =\r\n        config.showAssessmentCriteriaSection &&\r\n        selectedCourseId !== null &&\r\n        selectedCourseId !== config.courseId;\r\n    \r\n    onMount(() => {\r\n        getCoursesForCopy()\r\n            .then(data => dropDownCourses = data)\r\n            .finally(() => dropDownCoursesLoading = false);\r\n    });\r\n\r\n\r\n    async function selectedAction(event) {\r\n        const topicIds = get(selectedTopicIds);\r\n\r\n        const data = event.detail.data;\r\n\r\n        switch (data.source) {\r\n            case topicsActionType.Copy:\r\n                if (topicIds && topicIds.size === 0) {\r\n                    showNoTopicsSelectedModal = true;\r\n                } else {\r\n                    showCopyTopicsModal = true;\r\n                    setTimeout(() => openModalInMobile(), 100);\r\n                }\r\n\r\n                break;\r\n            case topicsActionType.Delete:\r\n                if (topicIds && topicIds.size === 0) {\r\n                    showNoTopicsSelectedModal = true;\r\n                } else {\r\n                    showDeleteTopicsConfirmModal = true;\r\n                }\r\n\r\n                break;\r\n            case topicsActionType.Print:\r\n                if (!topicIds || topicIds.size === 0) {\r\n                    showNoTopicsSelectedModal = true;\r\n                } else {\r\n                    window.open(endpoints.printTopics(config.courseId, [...topicIds]));\r\n                }\r\n\r\n                break;\r\n        }\r\n    }\r\n\r\n    /** Topic action options  **/\r\n    function getActions() {\r\n        const options = [];\r\n\r\n        options.push({\r\n            icon: \"\",\r\n            label: i18n.copy,\r\n            link: false,\r\n            target: \"_self\",\r\n            value: { source: topicsActionType.Copy }\r\n        });\r\n\r\n        if (showPrintAction) {\r\n            options.push({\r\n                icon: \"\",\r\n                label: i18n.print,\r\n                link: false,\r\n                target: \"_self\",\r\n                value: { source: topicsActionType.Print }\r\n            });\r\n        }\r\n\r\n        options.push({\r\n            icon: \"\",\r\n            label: i18n.delete,\r\n            link: false,\r\n            target: \"_self\",\r\n            value: { source: topicsActionType.Delete }\r\n        });\r\n\r\n        return [{ options }];\r\n    }\r\n\r\n    function loadCourses() {\r\n        const starredCoursesList = [];\r\n        const otherCoursesList = [];\r\n\r\n        // Selects the arrays for starred and other courses, indicates which courses are archived\r\n        dropDownCourses.forEach(course => {\r\n            if (course.HasCourseSettingPlanner) {\r\n                const courseForDropdown = makeCourseForDropdown(course, topicsActionType.Copy, i18n.archived);\r\n\r\n                course.IsFavourite\r\n                    ? starredCoursesList.push(courseForDropdown)\r\n                    : otherCoursesList.push(courseForDropdown);\r\n            }\r\n        });\r\n\r\n        /** Courses dropdown options  **/\r\n        coursesItems = [\r\n            {\r\n                label: i18n.starred,\r\n                options: starredCoursesList\r\n            },\r\n            {\r\n                label: i18n.otherCourses,\r\n                options: otherCoursesList\r\n            }\r\n        ];\r\n    }\r\n\r\n    function selectCourse(event) {\r\n        const data = event.detail.data;\r\n\r\n        if (data.source === topicsActionType.Copy) {\r\n            errorNoCourseSelected = false;\r\n            courseIsSelected = true;\r\n            selectedCourseTitle = data.title;\r\n            selectedCourseId = data.id;\r\n        }\r\n    }\r\n\r\n    function updateCheckedStatusCopyDates() {\r\n        if (checkedCopyDates) {\r\n            checkedCopyDates = false;\r\n        } else {\r\n            checkedCopyDates = true;\r\n        }\r\n    }\r\n\r\n    function updateCheckedStatusConnectedResources() {\r\n        if (checkedConnectedResources) {\r\n            checkedConnectedResources = false;\r\n        } else {\r\n            checkedConnectedResources = true;\r\n        }\r\n    }\r\n\r\n    function updateCheckedStatusAssessmentCriteria() {\r\n        if (checkedAssessmentCriteria) {\r\n            checkedAssessmentCriteria = false;\r\n        } else {\r\n            checkedAssessmentCriteria = true;\r\n        }\r\n    }\r\n\r\n    async function copyTopicsModalClicked(event) {\r\n        if (event.detail.confirmed === true) {\r\n            if (!courseIsSelected) {\r\n                // If Copy is pressed, but no course is selected\r\n                showCopyTopicsModal = true;\r\n                errorNoCourseSelected = true;\r\n            } else {\r\n                showCopyInProgress = true;\r\n\r\n                const topicIds = get(selectedTopicIds);\r\n\r\n                if (topicIds && topicIds.size > 0) {\r\n                    const copyTopicsData = await copyTopics(\r\n                        selectedCourseId,\r\n                        checkedCopyDates,\r\n                        checkedConnectedResources,\r\n                        checkedAssessmentCriteria,\r\n                        [...topicIds]\r\n                    );\r\n\r\n                    confirmModalBody = copyTopicsData.ResultMessage;\r\n\r\n                    if (copyTopicsData.ResultWarningNotes) {\r\n                        // If there is a warning note, then it is displayed in the banner\r\n                        confirmModalBannerVisibility = true;\r\n                        confirmModalBannerText = copyTopicsData.ResultWarningNotes;\r\n                    }\r\n                }\r\n\r\n                showCopyInProgress = false;\r\n                showCopyConfirmModal = true;\r\n            }\r\n        } else {\r\n            // On Cancel, the Topic page gets reloaded, to reset all parameters\r\n            selectedTopicIds.set(new Set([]));\r\n            dispatch(\"endOfActionOnSelectedTopics\", { shouldUpdate: false });\r\n        }\r\n    }\r\n\r\n    function closeCopyTopicsConfirmModalClicked() {\r\n        showCopyConfirmModal = false;\r\n        selectedTopicIds.set(new Set([]));\r\n        dispatch(\"endOfActionOnSelectedTopics\", { shouldUpdate: false });\r\n    }\r\n\r\n    async function deleteTopicsModalClicked(event) {\r\n        if (event.detail.confirmed === true) {\r\n            const topicIds = get(selectedTopicIds);\r\n\r\n            if (topicIds && topicIds.size > 0) {\r\n                await deleteTopics([...topicIds]);\r\n                selectedTopicIds.set(new Set([]));\r\n                dispatch(\"endOfActionOnSelectedTopics\", { shouldUpdate: true });\r\n            }\r\n        }\r\n\r\n        showDeleteTopicsConfirmModal = false;\r\n    }\r\n\r\n    function noTopicsModalClicked() {\r\n        showNoTopicsSelectedModal = false;\r\n    }\r\n\r\n    const modalId = \"#show-copy-topics-modal-id\";\r\n\r\n    function openModalInMobile() {\r\n        if (isMobile()) {\r\n            if (document.querySelector(modalId) !== null) {\r\n                document.querySelector(modalId).style.minHeight = \"100%\";\r\n            }\r\n        }\r\n    }\r\n\r\n    window.addEventListener(\"orientationchange\", function () {\r\n        if (document.querySelector(modalId) !== null) {\r\n            setTimeout(() => openModalInMobile(), 300);\r\n        }\r\n    });\r\n\r\n    // Add a scroll bar to the courses dropdown in copy topic modal\r\n    function addScrollCourseDropdownTopics() {\r\n        const dropdownSection =\r\n            \"#copy-topics-modal__courses-dropdown > section > section.prom-dropdown__body\";\r\n\r\n        if (document.querySelector(dropdownSection).style.height === \"\") {\r\n            document.querySelector(dropdownSection).style.height = \"150px\";\r\n        }\r\n    }\r\n</script>\r\n","<li\r\n    {id}\r\n    bind:this={cardElement}\r\n    class=\"topic-card {hiddenClass} {hoverSupportClass}\"\r\n    role={keyboardReorder ? \"option\" : undefined}\r\n    class:topic-card--shadow={dragAndDropSelected}\r\n    class:topic-card--drag={keyboardReorderSelected}\r\n    aria-selected={keyboardReorder ? keyboardReorderSelected : undefined}\r\n    aria-labelledby=\"{id}--title\"\r\n>\r\n    <a {href} class=\"topic-card__link\" aria-labelledby=\"{id}--title\">\r\n        <span class=\"screen-reader\">{name}</span>\r\n    </a>\r\n\r\n    <div class=\"topic-card__header\">\r\n        {#if showSelect || showDrag}\r\n            <div class=\"topic-card__controls\">\r\n                {#if showSelect}\r\n                    <Checkbox\r\n                        bind:checked\r\n                        label=\"{i18n.select} {name}\"\r\n                        labelHidden\r\n                        small\r\n                        on:change={updateCheckedStatus(topicId, checked)}\r\n                    />\r\n                {/if}\r\n                {#if showDrag}\r\n                    <button\r\n                        bind:this={dragButton}\r\n                        id=\"{id}--drag\"\r\n                        class=\"topic-card__drag\"\r\n                        on:mousedown={mouseDownDragButton}\r\n                        on:touchstart={mouseDownDragButton}\r\n                        on:click={clickDragButton}\r\n                        on:keyup={keyUpDragButton}\r\n                        on:blur={blurDragButton}\r\n                        aria-labelledby=\"{id}--title\"\r\n                        aria-pressed={keyboardReorderSelected}\r\n                    ></button>\r\n                    <div\r\n                        class=\"topic-card__tooltip-container\"\r\n                        aria-live=\"polite\"\r\n                        class:topic-card__tooltip-container--visible={tooltipVisible}\r\n                    >\r\n                        {#if tooltipVisible}\r\n                            <Tooltip\r\n                                element={dragButton}\r\n                                id=\"{id}-drag-tip\"\r\n                                placement=\"bottom\"\r\n                                role=\"tooltip\"\r\n                                show={tooltipVisible}\r\n                                text={i18n.elementDragHandleTooltip}\r\n                            />\r\n                        {/if}\r\n                    </div>\r\n                {/if}\r\n            </div>\r\n        {/if}\r\n\r\n        {#if !uncategorized}\r\n            <div class=\"topic-card__image\" style={colorStyle}></div>\r\n        {/if}\r\n\r\n        <div class=\"topic-card__info\">\r\n            <div class=\"topic-card__title\" id=\"{id}--title\">\r\n                <span>{name}</span>\r\n                <div class=\"topic-card__hidden-indicator\">\r\n                    <span class=\"screen-reader\">{i18n.hidden}</span>\r\n                </div>\r\n            </div>\r\n\r\n            <div class=\"topic-card__details\">{infoText}</div>\r\n        </div>\r\n    </div>\r\n</li>\r\n\r\n<script>\r\n    import { createEventDispatcher } from \"svelte\";\r\n    import { get } from \"svelte/store\";\r\n\r\n    import Checkbox from \"@itslearning/prometheus/assets/inputs/Checkbox/v1/Checkbox.svelte\";\r\n    import Tooltip from \"@itslearning/prometheus/assets/modals/Tooltip/v1/Tooltip.svelte\";\r\n\r\n    import { formatLanguageString } from \"@itslearning/atlas/strings/format.js\";\r\n    import { isMobile, isIpad } from \"@itslearning/atlas/detectors/UserAgentHelper\";\r\n    import { Keys } from \"@itslearning/atlas/keyboard/keys\";\r\n    import { normalizeKey } from \"@itslearning/atlas/keyboard/normalize\";\r\n\r\n    import { getDateRangeString } from \"@its-ui/planner-common/helpers/dateHelper\";\r\n    import { adjustToTimezone } from \"@its-ui/planner-common/helpers/loadPlansHelper\";\r\n    import i18n from \"@its-ui/planner-common/i18n\";\r\n    import config from \"@its-ui/planner-common/config\";\r\n    import { selectedTopicIds } from \"@its-ui/planner-common/logic/plans/stores\";\r\n    import { columnTypes, columnVisibility } from \"@its-ui/planner-common/constants\";\r\n\r\n\r\n    export let id = Math.random().toString(36).substr(2, 9);\r\n    export let checked = false;\r\n    export let name;\r\n    export let href;\r\n    export let color;\r\n    export let uncategorized = false;\r\n    export let startDate;\r\n    export let endDate;\r\n    export let showSelect = false;\r\n    export let showDrag = false;\r\n    export let visible = true;\r\n    export let planCount = 0;\r\n    export let keyboardReorderSelected;\r\n    export let dragAndDropSelected;\r\n    export let keyboardReorder;\r\n    export let topicId;\r\n\r\n    let tooltipVisible = false;\r\n    let cardElement;\r\n    let dragButton;\r\n\r\n    const dispatch = createEventDispatcher();\r\n\r\n    $: colorStyle = color ? `background-color: ${color};` : \"\";\r\n\r\n    let infoText = \"\";\r\n\r\n    $: {\r\n        if (planCount === 0) {\r\n            infoText = i18n.noPlans;\r\n        } else if (\r\n            startDate &&\r\n            config.canEdit &&\r\n            config.columnVisibilities[columnTypes.Date] !== columnVisibility.Nobody\r\n        ) {\r\n            infoText =\r\n                planCount === 1\r\n                    ? i18n.onePlanWithDate\r\n                    : formatLanguageString(i18n.xPlansWithDate, planCount);\r\n\r\n            const dateString = getDateRangeString(\r\n                adjustToTimezone(startDate),\r\n                adjustToTimezone(endDate),\r\n                config.locale\r\n            );\r\n\r\n            infoText = infoText.replace(/{\\d}/, dateString);\r\n        } else if (\r\n            startDate &&\r\n            !config.canEdit &&\r\n            config.columnVisibilities[columnTypes.Date] === columnVisibility.All\r\n        ) {\r\n            infoText =\r\n                planCount === 1\r\n                    ? i18n.onePlanWithDate\r\n                    : formatLanguageString(i18n.xPlansWithDate, planCount);\r\n\r\n            const dateString = getDateRangeString(\r\n                adjustToTimezone(startDate),\r\n                adjustToTimezone(endDate),\r\n                config.locale\r\n            );\r\n\r\n            infoText = infoText.replace(/{\\d}/, dateString);\r\n        } else {\r\n            infoText =\r\n                planCount === 1 ? i18n.onePlan : formatLanguageString(i18n.xPlans, planCount);\r\n        }\r\n    }\r\n\r\n    $: hiddenClass = visible ? \"\" : \"topic-card--hidden\";\r\n    $: hoverSupportClass = isMobile() || isIpad() ? \"\" : \"itsl-topic-card--hover-support\";\r\n\r\n    function mouseDownDragButton(e) {\r\n        dispatch(\"dragStart\", e);\r\n    }\r\n\r\n    function clickDragButton(e) {\r\n        dispatch(\"keyboardDragStart\", e);\r\n    }\r\n\r\n    function keyUpDragButton(e) {\r\n        if (normalizeKey(e.key) === Keys.TAB) {\r\n            tooltipVisible = true;\r\n        }\r\n    }\r\n\r\n    function blurDragButton() {\r\n        tooltipVisible = false;\r\n    }\r\n\r\n    function updateCheckedStatus(id, checked) {\r\n        const selectedTopics = get(selectedTopicIds);\r\n\r\n        if (!checked) {\r\n            selectedTopics.delete(id);\r\n        } else {\r\n            selectedTopics.add(id);\r\n        }\r\n\r\n        selectedTopicIds.set(selectedTopics);\r\n    }\r\n</script>\r\n","<svelte:window\r\n    on:mousemove={pointerMove}\r\n    on:mouseup={dragEnd}\r\n    on:touchend={dragEnd}\r\n    on:touchmove={pointerMove}\r\n/>\r\n\r\n{#if showCreateTopicModal}\r\n    <CreateTopicModal {createTopicModal} on:createTopic={createNewTopic} on:cancel={cancelTopic} />\r\n{/if}\r\n\r\n<div\r\n    class={`its-plans-view-switch ${\r\n        showEmptyState\r\n            ? \"its-plans-view-switch-position-empty\"\r\n            : \"its-plans-view-switch-position-list\"\r\n    }`}\r\n>\r\n    {#if config.canEdit && $topicsData.topics.length !== 0}\r\n        <div class=\"its-plans__toolbar its-plans__toolbar-topic-offset\">\r\n            <div class=\"its-plans__toolbar_items\">\r\n                <Button\r\n                    type=\"primary\"\r\n                    text={config.addTopicText}\r\n                    large\r\n                    on:click={openCreateTopicModal}\r\n                />\r\n                <TopicActions on:endOfActionOnSelectedTopics={endOfActionOnSelectedTopics} />\r\n            </div>\r\n            {#if config.isImportEnabled}\r\n                <UseReadyMadeContentLink\r\n                    href={`/Courses/${\r\n                        config.courseId\r\n                    }/ImportContent?importTopic=true&returnUrl=${encodeURI(window.location.href)}`}\r\n                    linktext={i18n.useReadyMadeContent}\r\n                    emptyState={false}\r\n                ></UseReadyMadeContentLink>\r\n            {/if}\r\n        </div>\r\n    {/if}\r\n\r\n    <TableViewLink\r\n        {config}\r\n        {i18n}\r\n        isDataLoading={$topicsData.loading}\r\n        backExtraParams={{\r\n            selectedTab\r\n        }}\r\n    />\r\n</div>\r\n\r\n{#if $topicsData.loading}\r\n    <div class=\"its-plans__loading\">\r\n        <span class=\"screen-reader\">{i18n.loading}</span>\r\n    </div>\r\n{/if}\r\n\r\n{#if showEmptyState}\r\n    <EmptyState\r\n        iconName=\"plan-topics\"\r\n        title={titleEmptyTopics}\r\n        description={descriptionEmptyTopics}\r\n        {showButton}\r\n        {buttonText}\r\n        on:click={openCreateTopicModal}\r\n    />\r\n    {#if config.canEdit && config.isImportEnabled}\r\n        <UseReadyMadeContentLink\r\n            href={`/Courses/${config.courseId}/ImportContent?importTopic=true&returnUrl=${encodeURI(\r\n                window.location.href\r\n            )}`}\r\n            linktext={i18n.useReadyMadeContent}\r\n            emptyState={true}\r\n        ></UseReadyMadeContentLink>\r\n    {/if}\r\n{/if}\r\n\r\n<section class=\"its-topics__list-section\" bind:this={listSection}>\r\n    <ul\r\n        class=\"its-topics__list\"\r\n        tabindex=\"-1\"\r\n        aria-labelledby=\"tab-topics\"\r\n        bind:this={listElement}\r\n        role={keyboardReorder ? \"listbox\" : undefined}\r\n        aria-activedescendant={keyboardReorderActiveId\r\n            ? `topic-card-${keyboardReorderActiveId}`\r\n            : undefined}\r\n        on:keydown={listKeyDown}\r\n        on:blur={listBlur}\r\n    >\r\n        {#if !showEmptyState}\r\n            {#each $topicsData.topics as topic (topic.id)}\r\n                <TopicCard\r\n                    topicId={topic.id}\r\n                    id=\"topic-card-{topic.id}\"\r\n                    name={topic.name}\r\n                    href=\"{topic.url}?ChildId={config.childId}\"\r\n                    color={topic.borderColor}\r\n                    showSelect={config.canEdit}\r\n                    showDrag={config.canEdit}\r\n                    planCount={topic.planCount}\r\n                    startDate={topic.start}\r\n                    endDate={topic.stop}\r\n                    on:dragStart={e => dragStart(e.detail, topic)}\r\n                    on:keyboardDragStart={() => keyboardDragStart(topic)}\r\n                    keyboardReorderSelected={keyboardReorder &&\r\n                        keyboardReorderActiveId === topic.id}\r\n                    keyboardReorderActive={keyboardReorder}\r\n                    dragAndDropSelected={dragSelectedTopic && topic.id === dragSelectedTopic.id}\r\n                />\r\n            {/each}\r\n        {/if}\r\n\r\n        {#if $topicsData.plansWithoutTopicCount}\r\n            <TopicCard\r\n                name={config.withoutTopic}\r\n                href={topicCardHref}\r\n                showSelect={false}\r\n                planCount={$topicsData.plansWithoutTopicCount}\r\n                startDate={null}\r\n                endDate={null}\r\n                uncategorized\r\n            />\r\n        {/if}\r\n    </ul>\r\n\r\n    {#if dragSelectedTopic}\r\n        <div class=\"its-topics__topic-dragging\" style={draggedElementStyle}>\r\n            <TopicCard\r\n                name={dragSelectedTopic.name}\r\n                href=\"./\"\r\n                color={dragSelectedTopic.borderColor}\r\n                showSelect={true}\r\n                showDrag={true}\r\n                planCount={dragSelectedTopic.planCount}\r\n                startDate={dragSelectedTopic.start}\r\n                endDate={dragSelectedTopic.stop}\r\n            />\r\n        </div>\r\n    {/if}\r\n</section>\r\n\r\n<script>\r\n    import Button from \"@itslearning/prometheus/assets/inputs/Button/v1/Button.svelte\";\r\n    import EmptyState from \"@itslearning/prometheus/assets/nodes/EmptyState/v1/EmptyState.svelte\";\r\n\r\n    import i18n from \"@its-ui/planner-common/i18n\";\r\n    import config from \"@its-ui/planner-common/config\";\r\n    import { createTopic, setTopicOrder } from \"@its-ui/planner-common/api\";\r\n    import { postNewPlannerKpi } from \"@its-ui/planner-common/helpers/kpiHelper\";\r\n\r\n    import CreateTopicModal from \"@its-ui/planner-common/components/CreateTopicModal/CreateTopicModal.svelte\";\r\n    import TopicActions from \"@its-ui/planner-common/components/TopicActions/TopicActions.svelte\";\r\n    import UseReadyMadeContentLink from \"@its-ui/planner-common/components/UseReadyMadeContentLink/UseReadyMadeContentLink.svelte\";\r\n    import TableViewLink from \"@its-ui/planner-common/components/TableViewLink/TableViewLink.svelte\";\r\n\r\n    import TopicCard from \"../TopicCard/TopicCard.svelte\";\r\n\r\n    import { topicsData } from \"@its-ui/planner-common/logic/plans/stores\";\r\n    import { normalizeKey } from \"@itslearning/atlas/keyboard/normalize\";\r\n    import { Keys } from \"@itslearning/atlas/keyboard/keys\";\r\n    import { debounce } from \"@itslearning/atlas/dom/Ratecontrol\";\r\n    import { onMount, createEventDispatcher } from \"svelte\";\r\n\r\n    let keyboardReorder = false;\r\n    let keyboardReorderActiveId;\r\n    let reorderDragHandleId;\r\n    let draggedElementTop;\r\n    let dragSelectedTopic = undefined;\r\n    let debounceSaveTopicOrder;\r\n    let listSection;\r\n    let listElement;\r\n    let dragScrolling = false;\r\n\r\n    const descriptionEmptyTopics = config.canEdit\r\n        ? config.emptyStateTopicsTabDescriptionTeacher\r\n        : config.emptyStateTopicsTabDescriptionStudent;\r\n    const titleEmptyTopics = config.canEdit\r\n        ? config.emptyStateTopicsTabTitleTeacher\r\n        : config.emptyStateTopicsTabTitleStudent;\r\n    const showButton = config.canEdit;\r\n    const buttonText = config.addTopicText;\r\n\r\n    let showCreateTopicModal = false;\r\n\r\n    export let selectedTab;\r\n    const createTopicModal = \"create-topic-modal\";\r\n    const dispatch = createEventDispatcher();\r\n\r\n    $: showEmptyState = $topicsData.topics.length === 0 && !$topicsData.loading;\r\n\r\n    $: draggedElementStyle = dragSelectedTopic ? `top: ${draggedElementTop}px;` : \"\";\r\n\r\n    $: topicCardHref = config.publicAccessKey\r\n        ? `/plans/public/${config.publicAccessKey}/topics/0`\r\n        : `/plans/courses/${config.courseId}/topics/0?ChildId=${config.childId}`;\r\n\r\n    onMount(() => {\r\n        // Debounce saves to the topic order to limit requests and to avoid race conditions\r\n        // when two changes are made in quick succession.\r\n        const runDebounceSaveTopicOrder = debounce(saveTopicOrder, 1000);\r\n\r\n        debounceSaveTopicOrder = () => {\r\n            runDebounceSaveTopicOrder();\r\n        };\r\n    });\r\n\r\n    // Show the create topic modal\r\n    function openCreateTopicModal() {\r\n        showCreateTopicModal = true;\r\n    }\r\n\r\n    async function createNewTopic({ detail }) {\r\n        await createTopic(detail.title, detail.colour);\r\n\r\n        showCreateTopicModal = false;\r\n        await postNewPlannerKpi(config.kpi.kpiMeasurementCreateNewTopic);\r\n        dispatch(\"createTopic\");\r\n    }\r\n\r\n    function cancelTopic() {\r\n        showCreateTopicModal = false;\r\n    }\r\n\r\n    function endOfActionOnSelectedTopics() {\r\n        dispatch(\"endOfActionOnSelectedTopics\");\r\n    }\r\n\r\n    function moveDown(element, index) {\r\n        if (index >= $topicsData.topics.length - 1) {\r\n            return;\r\n        }\r\n\r\n        const target = $topicsData.topics[index + 1];\r\n\r\n        moveTopic(element, target, false);\r\n\r\n        debounceSaveTopicOrder();\r\n    }\r\n\r\n    function moveUp(element, index) {\r\n        if (index <= 0) {\r\n            return;\r\n        }\r\n\r\n        const target = $topicsData.topics[index - 1];\r\n\r\n        moveTopic(element, target, true);\r\n\r\n        debounceSaveTopicOrder();\r\n    }\r\n\r\n    // Moves one topic to a target topic's position in the list, inserting\r\n    // it either immediately before or after depending on insertBefore\r\n    function moveTopic(topic, target, insertBefore) {\r\n        const newElements = [...$topicsData.topics];\r\n        const fromIndex = newElements.findIndex(e => e.id === topic.id);\r\n\r\n        newElements.splice(fromIndex, 1);\r\n\r\n        const toIndex = newElements.findIndex(e => e.id === target.id) + (insertBefore ? 0 : 1);\r\n\r\n        newElements.splice(toIndex, 0, topic);\r\n\r\n        $topicsData.topics = newElements;\r\n    }\r\n\r\n    function keyboardDragStart(topic) {\r\n        reorderDragHandleId = document.activeElement.id;\r\n\r\n        keyboardReorder = true;\r\n        keyboardReorderActiveId = topic.id;\r\n\r\n        setTimeout(() => listElement.focus(), 0);\r\n    }\r\n\r\n    function listKeyDown(event) {\r\n        if (!keyboardReorder) {\r\n            return;\r\n        }\r\n\r\n        const index = $topicsData.topics.findIndex(e => e.id === keyboardReorderActiveId);\r\n        const activeTopic = $topicsData.topics[index];\r\n\r\n        switch (normalizeKey(event.key)) {\r\n            case Keys.UP:\r\n                moveUp(activeTopic, index);\r\n                event.preventDefault();\r\n                scrollTopicToView(activeTopic.id);\r\n                break;\r\n            case Keys.DOWN:\r\n                moveDown(activeTopic, index);\r\n                event.preventDefault();\r\n                scrollTopicToView(activeTopic.id);\r\n                break;\r\n            case Keys.ESCAPE:\r\n            case Keys.SPACE:\r\n            case Keys.TAB:\r\n                event.stopPropagation();\r\n                event.preventDefault();\r\n\r\n                keyboardReorder = false;\r\n                keyboardReorderActiveId = undefined;\r\n\r\n                if (reorderDragHandleId) {\r\n                    setTimeout(() => document.getElementById(reorderDragHandleId).focus(), 0);\r\n                }\r\n\r\n                break;\r\n        }\r\n    }\r\n\r\n    function scrollTopicToView(topicId) {\r\n        setTimeout(() => {\r\n            document\r\n                .getElementById(`topic-card-${topicId}`)\r\n                .scrollIntoView({ behavior: \"smooth\", block: \"center\" });\r\n        }, 0);\r\n    }\r\n\r\n    function listBlur() {\r\n        keyboardReorder = false;\r\n        keyboardReorderActiveId = undefined;\r\n    }\r\n\r\n    // Start dragging by setting the dragSelectedTopic and call pointerMove to position it correctly\r\n    function dragStart(event, topic) {\r\n        dragSelectedTopic = topic;\r\n\r\n        pointerMove(event);\r\n    }\r\n\r\n    // While dragging an topic set its y position to the cursor's y pos and check for\r\n    // other topics under the pointer to re-order the list\r\n    function pointerMove(event) {\r\n        if (dragSelectedTopic) {\r\n            event.preventDefault();\r\n            event.stopPropagation();\r\n\r\n            const cursorPosY = event.touches ? event.touches[0].pageY : event.pageY;\r\n            const scrollTop = document.body.parentElement.scrollTop;\r\n            const offsetTop = scrollTop + listSection.getBoundingClientRect().y;\r\n\r\n            draggedElementTop = cursorPosY - offsetTop;\r\n\r\n            let elementRect;\r\n            let elementTop;\r\n            let dragOverElement;\r\n\r\n            // Iterate over <li>s in the list and check if the pointer is within any of them\r\n            for (let i = 0; i < listElement.children.length; i++) {\r\n                elementRect = listElement.children[i].getBoundingClientRect();\r\n                elementTop = elementRect.y + scrollTop;\r\n\r\n                if (cursorPosY > elementTop && cursorPosY < elementTop + elementRect.height) {\r\n                    dragOverElement = $topicsData.topics[i];\r\n\r\n                    break;\r\n                }\r\n            }\r\n\r\n            // If a topic (other than the dragged one) is hovered re-order the list to place the\r\n            // dragged topic above or below the dragOverElement depending on pointer position.\r\n            if (dragOverElement && dragOverElement.id !== dragSelectedTopic.id) {\r\n                const insertBefore = cursorPosY - elementTop < elementRect.height / 2;\r\n\r\n                moveTopic(dragSelectedTopic, dragOverElement, insertBefore);\r\n            }\r\n\r\n            // If dragged element is at the bottom or top of the page start the scroll function\r\n            if (cursorPosY - scrollTop > window.innerHeight - elementRect.height) {\r\n                if (!dragScrolling) {\r\n                    dragScrolling = true;\r\n                    scrollWithDrag(true, cursorPosY);\r\n                }\r\n            } else if (cursorPosY - scrollTop < elementRect.height) {\r\n                if (!dragScrolling) {\r\n                    dragScrolling = true;\r\n                    scrollWithDrag(false, cursorPosY);\r\n                }\r\n            } else {\r\n                // Stop the scroll function when the cursor is out of the scroll area\r\n                dragScrolling = false;\r\n            }\r\n        }\r\n    }\r\n\r\n    function scrollWithDrag(down) {\r\n        // When scrolling down, if the bottom of the list is 25px above the bottom of the page\r\n        if (down && listSection.getBoundingClientRect().bottom + 25 <= window.innerHeight) {\r\n            dragScrolling = false;\r\n        }\r\n\r\n        // When scrolling up, if the page is already at the top, stop scrolling\r\n        if (!down && document.body.parentElement.scrollTop <= 0) {\r\n            dragScrolling = false;\r\n        }\r\n\r\n        if (!dragScrolling) {\r\n            return;\r\n        }\r\n\r\n        const scrollAmount = down ? 3 : -3;\r\n\r\n        document.body.parentElement.scrollTop += scrollAmount;\r\n\r\n        // Move the dragged element to keep up with the moving page\r\n        draggedElementTop += scrollAmount;\r\n\r\n        // This function keeps calling itself until the max scroll is reached or dragScrolling is\r\n        // false. This keeps the scroll smooth instead of jumping only when the pointer moves.\r\n        setTimeout(() => {\r\n            scrollWithDrag(down);\r\n        }, 5);\r\n    }\r\n\r\n    // The list is reordered while dragging so once it is released trigger a save and stop\r\n    // dragging the element\r\n    function dragEnd() {\r\n        if (dragSelectedTopic) {\r\n            debounceSaveTopicOrder();\r\n\r\n            dragSelectedTopic = null;\r\n            dragScrolling = false;\r\n        }\r\n    }\r\n\r\n    // Posts the new topic order to the API\r\n    async function saveTopicOrder() {\r\n        await setTopicOrder($topicsData.topics.map(e => e.id));\r\n    }\r\n</script>\r\n","<svelte:window on:popstate={popState} />\r\n\r\n<Tabs {tabs} bind:selectedIndex={selectedTab}>\r\n    <h2 class=\"screen-reader\">{tabs[selectedTab].title}</h2>\r\n    {#if selectedTab !== plannerTabIds.topics}\r\n        <div\r\n            class={`its-plans-view-switch ${\r\n                showEmptyState\r\n                    ? \"its-plans-view-switch-position-empty\"\r\n                    : \"its-plans-view-switch-position-list\"\r\n            }`}\r\n        >\r\n            {#if !showEmptyState}\r\n                <PlansToolbar\r\n                    data={tabData}\r\n                    selectedView={getPlannerView(selectedTab)}\r\n                    {selectedPlanIds}\r\n                    on:endOfActionOnSelectedPlans={afterAction}\r\n                />\r\n            {/if}\r\n            <TableViewLink\r\n                {config}\r\n                {i18n}\r\n                isDataLoading={tabData.loading}\r\n                backExtraParams={{\r\n                    selectedTab\r\n                }}\r\n            />\r\n        </div>\r\n    {/if}\r\n\r\n    <!-- svelte-ignore a11y-no-noninteractive-element-to-interactive-role -->\r\n    <section\r\n        id=\"panel-0\"\r\n        aria-labelledby=\"tab-current\"\r\n        role=\"tabpanel\"\r\n        class=\"{contentClass} its-plans__current\"\r\n        tabindex=\"-1\"\r\n    >\r\n        {#if showEmptyState}\r\n            <EmptyState\r\n                {iconName}\r\n                title={titleEmptyTab}\r\n                description={i18n.emptyState_CurrentTab_Description}\r\n                showLink={config.canEdit}\r\n                linkText={i18n.addPlan}\r\n                href={createNewPlanUrl}\r\n                on:click={createNewPlan}\r\n            />\r\n            {#if config.canEdit && config.isImportEnabled}\r\n                <UseReadyMadeContentLink\r\n                    href={`/Courses/${\r\n                        config.courseId\r\n                    }/ImportContent?importTopic=false&returnUrl=${encodeURI(window.location.origin + window.location.pathname)}`}\r\n                    linktext={i18n.useReadyMadeContent}\r\n                    emptyState={true}\r\n                ></UseReadyMadeContentLink>\r\n            {/if}\r\n        {:else}\r\n            <PlansView\r\n                separateUpcomingPlans\r\n                data={$currentPlansData}\r\n                loadMethod={loadCurrentPlans}\r\n                {selectedPlanIds}\r\n                {columnVisibilities}\r\n                {useGenericResourceColumn}\r\n                on:endOfActionOnSelectedPlans={afterAction}\r\n            />\r\n        {/if}\r\n    </section>\r\n    <!-- svelte-ignore a11y-no-noninteractive-element-to-interactive-role -->\r\n    <section\r\n        id=\"panel-1\"\r\n        aria-labelledby=\"tab-past\"\r\n        role=\"tabpanel\"\r\n        class={contentClass}\r\n        tabindex=\"-1\"\r\n    >\r\n        {#if showEmptyState}\r\n            <EmptyState\r\n                {iconName}\r\n                title={titleEmptyTab}\r\n                description={i18n.emptyState_PastTab_Description}\r\n                showLink={config.canEdit}\r\n                linkText={i18n.addPlan}\r\n                href={createNewPlanUrl}\r\n                on:click={createNewPlan}\r\n            />\r\n            {#if config.canEdit && config.isImportEnabled}\r\n                <UseReadyMadeContentLink\r\n                    href={`/Courses/${\r\n                        config.courseId\r\n                    }/ImportContent?importTopic=false&returnUrl=${encodeURI(window.location.origin + window.location.pathname)}`}\r\n                    linktext={i18n.useReadyMadeContent}\r\n                    emptyState={true}\r\n                ></UseReadyMadeContentLink>\r\n            {/if}\r\n        {:else}\r\n            <PlansView\r\n                data={$pastPlansData}\r\n                loadMethod={loadPastPlans}\r\n                {selectedPlanIds}\r\n                {columnVisibilities}\r\n                {useGenericResourceColumn}\r\n                on:endOfActionOnSelectedPlans={afterAction}\r\n            />\r\n        {/if}\r\n    </section>\r\n    <!-- svelte-ignore a11y-no-noninteractive-element-to-interactive-role -->\r\n    <section\r\n        id=\"panel-2\"\r\n        aria-labelledby=\"tab-withoutdate\"\r\n        role=\"tabpanel\"\r\n        class={contentClass}\r\n        tabindex=\"-1\"\r\n    >\r\n        {#if showEmptyState}\r\n            <EmptyState\r\n                {iconName}\r\n                title={titleEmptyTab}\r\n                description={i18n.emptyState_WithoutDateTab_Description}\r\n                showLink={config.canEdit}\r\n                linkText={i18n.addPlan}\r\n                href={createNewPlanUrl}\r\n                on:click={createNewPlan}\r\n            />\r\n            {#if config.canEdit && config.isImportEnabled}\r\n                <UseReadyMadeContentLink\r\n                    href={`/Courses/${\r\n                        config.courseId\r\n                    }/ImportContent?importTopic=false&returnUrl=${encodeURI(window.location.origin + window.location.pathname)}`}\r\n                    linktext={i18n.useReadyMadeContent}\r\n                    emptyState={true}\r\n                ></UseReadyMadeContentLink>\r\n            {/if}\r\n        {:else}\r\n            <PlansView\r\n                data={$withoutDatePlansData}\r\n                loadMethod={loadWithoutDatePlans}\r\n                {selectedPlanIds}\r\n                {columnVisibilities}\r\n                {useGenericResourceColumn}\r\n                on:endOfActionOnSelectedPlans={afterAction}\r\n            />\r\n        {/if}\r\n    </section>\r\n    <!-- svelte-ignore a11y-no-noninteractive-element-to-interactive-role -->\r\n    <section\r\n        id=\"panel-3\"\r\n        aria-labelledby=\"tab-topics\"\r\n        role=\"tabpanel\"\r\n        class={contentClass}\r\n        tabindex=\"-1\"\r\n    >\r\n        <Topics\r\n            data={$topicsData}\r\n            {selectedTab}\r\n            on:endOfActionOnSelectedTopics={afterAction}\r\n            on:createTopic={afterAction}\r\n        />\r\n    </section>\r\n</Tabs>\r\n\r\n<script>\r\n    import { onMount } from \"svelte\";\r\n    import { get } from \"svelte/store\";\r\n\r\n    import EmptyState from \"@itslearning/prometheus/assets/nodes/EmptyState/v1/EmptyState.svelte\";\r\n    import Tabs from \"@itslearning/prometheus/assets/Navigation/Tabs/v1/Tabs.svelte\";\r\n\r\n    import PlansView from \"@its-ui/planner-common/components/PlansView/PlansView.svelte\";\r\n    import TableViewLink from \"@its-ui/planner-common/components/TableViewLink/TableViewLink.svelte\";\r\n    import PlansToolbar from \"@its-ui/planner-common/components/PlansToolbar/PlansToolbar.svelte\";\r\n    import UseReadyMadeContentLink from \"@its-ui/planner-common/components/UseReadyMadeContentLink/UseReadyMadeContentLink.svelte\";\r\n\r\n    import { addBackDestinationParam } from \"@its-ui/planner-common/helpers/backLinkHelper\";\r\n\r\n    import Topics from \"../Topics/Topics.svelte\";\r\n\r\n    import config from \"@its-ui/planner-common/config\";\r\n    import i18n from \"@its-ui/planner-common/i18n\";\r\n    import { createPlan, createPlanV2 } from \"@its-ui/planner-common/api\";\r\n    import { plannerTabIds } from \"@its-ui/planner-common/constants\";\r\n\r\n    import {\r\n        currentPlansData,\r\n        pastPlansData,\r\n        withoutDatePlansData,\r\n        topicsData,\r\n        selectedPlanIds,\r\n        allPlanCountsData,\r\n        selectedTopicIds\r\n    } from \"@its-ui/planner-common/logic/plans/stores\";\r\n    import {\r\n        loadCurrentPlans,\r\n        loadPastPlans,\r\n        loadWithoutDatePlans,\r\n        loadTopics,\r\n        loadAllPlanCounts\r\n    } from \"@its-ui/planner-common/logic/plans/loadDataController\";\r\n    import { getPlannerView } from \"@its-ui/planner-common/helpers/converters\";\r\n\r\n    onMount(() => {\r\n        loadAllPlanCounts(config.publicAccessKey);\r\n    });\r\n\r\n    /** Empty state variables **/\r\n    const iconName = \"plans\";\r\n    const titleEmptyTab = config.canEdit\r\n        ? i18n.emptyState_Tab_Title_Teacher\r\n        : i18n.emptyState_Title_Student;\r\n\r\n    let showEmptyState = false;\r\n    let tabData = {};\r\n    let hasCurrentPlansLoaded = false;\r\n    let hasPastPlansLoaded = false;\r\n    let hasWithoutDatePlansLoaded = false;\r\n    let hasTopicsLoaded = false;\r\n\r\n    const columnVisibilities = config.columnVisibilities;\r\n    const useGenericResourceColumn = config.useGenericResourceColumn;\r\n    const selectedTabFromHref = getSelectedTabFromHref();\r\n\r\n    export let selectedTab = selectedTabFromHref ? selectedTabFromHref : plannerTabIds.current;\r\n    export let allCounts;\r\n    let lastSelectedTab = selectedTab;\r\n    let createNewPlanUrl = \"#\";\r\n\r\n    const contentClass = \"prom-tabs__content\";\r\n    const maxCountTreshold = 100;\r\n    const maxCountDisplayText = \" (99+)\";\r\n    const tabs = [\r\n        {\r\n            id: \"tab-current\",\r\n            route: \"current\",\r\n            target: \"#panel-0\",\r\n            title: i18n.currentTab,\r\n            loadMethod: loadCurrentPlans\r\n        },\r\n        {\r\n            id: \"tab-past\",\r\n            route: \"past\",\r\n            target: \"#panel-1\",\r\n            title: i18n.previousTab,\r\n            loadMethod: loadPastPlans\r\n        },\r\n        {\r\n            id: \"tab-withoutdate\",\r\n            route: \"withoutdate\",\r\n            target: \"#panel-2\",\r\n            title: i18n.withoutDateTab,\r\n            loadMethod: loadWithoutDatePlans\r\n        },\r\n        {\r\n            id: \"tab-topics\",\r\n            route: \"topics\",\r\n            target: \"#panel-3\",\r\n            title: config.topicName,\r\n            loadMethod: loadTopics\r\n        }\r\n    ];\r\n\r\n    $: {\r\n        allCounts = $allPlanCountsData;\r\n\r\n        if (!allCounts.loading) {\r\n            addCountsToTabTitles();\r\n        }\r\n    }\r\n\r\n    $: {\r\n        switch (selectedTab) {\r\n            case plannerTabIds.current:\r\n                showEmptyState = !$currentPlansData.loading && $currentPlansData.plans.length === 0;\r\n                tabData = $currentPlansData;\r\n                break;\r\n            case plannerTabIds.past:\r\n                showEmptyState = !$pastPlansData.loading && $pastPlansData.plans.length === 0;\r\n                tabData = $pastPlansData;\r\n                break;\r\n            case plannerTabIds.withoutDate:\r\n                showEmptyState =\r\n                    !$withoutDatePlansData.loading && $withoutDatePlansData.plans.length === 0;\r\n                tabData = $withoutDatePlansData;\r\n                break;\r\n            default:\r\n                break;\r\n        }\r\n    }\r\n\r\n    $: {\r\n        switch (selectedTab) {\r\n            case plannerTabIds.current:\r\n                if (!hasCurrentPlansLoaded && tabs[selectedTab].loadMethod) {\r\n                    tabs[selectedTab].loadMethod(config.publicAccessKey);\r\n                    hasCurrentPlansLoaded = true;\r\n                }\r\n\r\n                break;\r\n            case plannerTabIds.past:\r\n                if (!hasPastPlansLoaded && tabs[selectedTab].loadMethod) {\r\n                    tabs[selectedTab].loadMethod(config.publicAccessKey);\r\n                    hasPastPlansLoaded = true;\r\n                }\r\n\r\n                break;\r\n            case plannerTabIds.withoutDate:\r\n                if (!hasWithoutDatePlansLoaded && tabs[selectedTab].loadMethod) {\r\n                    tabs[selectedTab].loadMethod(config.publicAccessKey);\r\n                    hasWithoutDatePlansLoaded = true;\r\n                }\r\n\r\n                break;\r\n            case plannerTabIds.topics:\r\n                if (!hasTopicsLoaded && tabs[selectedTab].loadMethod) {\r\n                    tabs[selectedTab].loadMethod(config.publicAccessKey);\r\n                    hasTopicsLoaded = true;\r\n                }\r\n\r\n                break;\r\n        }\r\n    }\r\n\r\n    $: if (selectedTab !== lastSelectedTab) {\r\n        const selectedPlans = get(selectedPlanIds);\r\n        const selectedTopics = get(selectedTopicIds);\r\n\r\n        if (\r\n            (selectedPlans && selectedPlans.size > 0) ||\r\n            (selectedTopics && selectedTopics.size > 0)\r\n        ) {\r\n            resetLoadStatusOfSelectedTab();\r\n        }\r\n\r\n        lastSelectedTab = selectedTab;\r\n        history.pushState(\r\n            { tab: selectedTab },\r\n            \"\",\r\n            config.publicAccessKey\r\n                ? `/plans/public/${config.publicAccessKey}/${tabs[selectedTab].route}/`\r\n                : `/plans/courses/${config.courseId}/${tabs[selectedTab].route}/`\r\n        );\r\n\r\n        /** Clear plan cards and topic cards that are checked in other tabs **/\r\n        selectedTopicIds.set(new Set([]));\r\n        selectedPlanIds.set(new Set([]));\r\n    }\r\n\r\n    function addCountsToTabTitles() {\r\n        tabs[0].title =\r\n            allCounts.currentPlansCount >= maxCountTreshold\r\n                ? `${i18n.currentTab} ${maxCountDisplayText}`\r\n                : `${i18n.currentTab} (${allCounts.currentPlansCount})`;\r\n        tabs[1].title =\r\n            allCounts.pastPlansCount >= maxCountTreshold\r\n                ? `${i18n.previousTab} ${maxCountDisplayText}`\r\n                : `${i18n.previousTab} (${allCounts.pastPlansCount})`;\r\n        tabs[2].title =\r\n            allCounts.withoutDatePlansCount >= maxCountTreshold\r\n                ? `${i18n.withoutDateTab} ${maxCountDisplayText}`\r\n                : `${i18n.withoutDateTab} (${allCounts.withoutDatePlansCount})`;\r\n        tabs[3].title =\r\n            allCounts.topicsCount >= maxCountTreshold\r\n                ? `${config.topicName} ${maxCountDisplayText}`\r\n                : `${config.topicName} (${allCounts.topicsCount})`;\r\n    }\r\n\r\n    async function createNewPlan(event) {\r\n        event.preventDefault();\r\n\r\n        const planParams = {\r\n            topic: null,\r\n            start: \"0000-00-00 00:00:00\",\r\n            stop: \"0000-00-00 00:00:00\"\r\n        };\r\n\r\n        const newPlan = config.assignToEnabled ? await createPlanV2(planParams) : await createPlan(planParams);\r\n\r\n        createNewPlanUrl = addBackDestinationParam(\r\n            `${config.newPlanUrl}/${newPlan.planId}?pendingPlanId=${newPlan.planId}`\r\n        );\r\n\r\n        window.location.href = createNewPlanUrl;\r\n\r\n        return false;\r\n    }\r\n\r\n    async function afterAction() {\r\n        resetLoadStatus();\r\n        await loadAllPlanCounts();\r\n\r\n        switch (selectedTab) {\r\n            case plannerTabIds.current:\r\n                await loadCurrentPlans(config.publicAccessKey);\r\n                break;\r\n            case plannerTabIds.past:\r\n                await loadPastPlans(config.publicAccessKey);\r\n                break;\r\n            case plannerTabIds.withoutDate:\r\n                await loadWithoutDatePlans(config.publicAccessKey);\r\n                break;\r\n            case plannerTabIds.topics:\r\n                loadTopics(config.publicAccessKey);\r\n                break;\r\n            default:\r\n                break;\r\n        }\r\n    }\r\n\r\n    function popState({ state }) {\r\n        if (state && state.tab !== undefined) {\r\n            selectedTab = state.tab;\r\n            lastSelectedTab = state.tab;\r\n        }\r\n    }\r\n\r\n    function resetLoadStatus() {\r\n        hasCurrentPlansLoaded = false;\r\n        hasPastPlansLoaded = false;\r\n        hasWithoutDatePlansLoaded = false;\r\n        hasTopicsLoaded = false;\r\n    }\r\n\r\n    function resetLoadStatusOfSelectedTab() {\r\n        switch (lastSelectedTab) {\r\n            case plannerTabIds.current:\r\n                hasCurrentPlansLoaded = false;\r\n                break;\r\n            case plannerTabIds.past:\r\n                hasPastPlansLoaded = false;\r\n                break;\r\n            case plannerTabIds.withoutDate:\r\n                hasWithoutDatePlansLoaded = false;\r\n                break;\r\n            case plannerTabIds.topics:\r\n                hasTopicsLoaded = false;\r\n                break;\r\n            default:\r\n                break;\r\n        }\r\n    }\r\n\r\n    function getSelectedTabFromHref() {\r\n        if (window.location.href.indexOf(\"past\") !== -1) {\r\n            return plannerTabIds.past;\r\n        } else if (window.location.href.indexOf(\"withoutdate\") !== -1) {\r\n            return plannerTabIds.withoutDate;\r\n        } else if (window.location.href.indexOf(\"topics\") !== -1) {\r\n            return plannerTabIds.topics;\r\n        }\r\n    }\r\n</script>\r\n","<svelte:window on:popstate={popState} />\r\n\r\n{#if !$topicsData.loading}\r\n    <Tabs tabs={selfPacedTabs} bind:selectedIndex={selectedTab}>\r\n        {#if selectedTab === plannerSelfPacedTabIds.all || plannerTabIds.all}\r\n            <h2 class=\"screen-reader\">{selfPacedTabs[1].title}</h2>\r\n        {:else if selectedTab === plannerSelfPacedTabIds.topics || plannerTabIds.topics}\r\n            <h2 class=\"screen-reader\">{selfPacedTabs[0].title}</h2>\r\n        {/if}\r\n        <!-- svelte-ignore a11y-no-noninteractive-element-to-interactive-role -->\r\n        <section\r\n            id=\"panel-0\"\r\n            aria-labelledby=\"tab-topics\"\r\n            role=\"tabpanel\"\r\n            class={contentClass}\r\n            tabindex=\"-1\"\r\n        >\r\n            <Topics\r\n                data={$topicsData}\r\n                {selectedTab}\r\n                on:endOfActionOnSelectedTopics={afterActionSelfPaced}\r\n                on:createTopic={afterActionSelfPaced}\r\n            />\r\n        </section>\r\n\r\n        {#if selectedTab !== plannerSelfPacedTabIds.topics && selectedTab !== plannerTabIds.topics}\r\n            <div\r\n                class={`its-plans-view-switch ${\r\n                    showEmptyState\r\n                        ? \"its-plans-view-switch-position-empty\"\r\n                        : \"its-plans-view-switch-position-list\"\r\n                }`}\r\n            >\r\n                {#if !showEmptyState}\r\n                    <PlansToolbar\r\n                        data={tabData}\r\n                        selectedView={getPlannerView(selectedTab)}\r\n                        {selectedPlanIds}\r\n                        on:endOfActionOnSelectedPlans={afterActionSelfPaced}\r\n                    />\r\n                {/if}\r\n                <TableViewLink\r\n                    {config}\r\n                    {i18n}\r\n                    isDataLoading={tabData.loading}\r\n                    backExtraParams={{\r\n                        selectedTab\r\n                    }}\r\n                />\r\n            </div>\r\n        {/if}\r\n        <!-- svelte-ignore a11y-no-noninteractive-element-to-interactive-role -->\r\n        <section\r\n            id=\"panel-1\"\r\n            aria-labelledby=\"tab-all\"\r\n            role=\"tabpanel\"\r\n            class={contentClass}\r\n            tabindex=\"-1\"\r\n        >\r\n            {#if showEmptyState}\r\n                <EmptyState\r\n                    {iconName}\r\n                    title={titleEmptyTab}\r\n                    description={i18n.emptyState_WithoutDateTab_Description}\r\n                    showLink={config.canEdit}\r\n                    linkText={i18n.addPlan}\r\n                    href={createNewPlanUrl}\r\n                    on:click={createNewPlan}\r\n                />\r\n                {#if config.canEdit && config.isImportEnabled}\r\n                    <UseReadyMadeContentLink\r\n                        href={`/Courses/${\r\n                            config.courseId\r\n                        }/ImportContent?importTopic=false&returnUrl=${encodeURI(\r\n                            window.location.href\r\n                        )}`}\r\n                        linktext={i18n.useReadyMadeContent}\r\n                        emptyState={true}\r\n                    ></UseReadyMadeContentLink>\r\n                {/if}\r\n            {:else}\r\n                <PlansView\r\n                    data={$allPlansData}\r\n                    {selectedTab}\r\n                    loadMethod={loadAllPlans}\r\n                    {selectedPlanIds}\r\n                    {columnVisibilities}\r\n                    {useGenericResourceColumn}\r\n                    on:endOfActionOnSelectedPlans={afterActionSelfPaced}\r\n                />\r\n            {/if}\r\n        </section>\r\n    </Tabs>\r\n{/if}\r\n\r\n<script>\r\n    import { onMount } from \"svelte\";\r\n\r\n    import EmptyState from \"@itslearning/prometheus/assets/nodes/EmptyState/v1/EmptyState.svelte\";\r\n    import Tabs from \"@itslearning/prometheus/assets/Navigation/Tabs/v1/Tabs.svelte\";\r\n\r\n    import PlansView from \"@its-ui/planner-common/components/PlansView/PlansView.svelte\";\r\n    import Topics from \"../Topics/Topics.svelte\";\r\n    import PlansToolbar from \"@its-ui/planner-common/components/PlansToolbar/PlansToolbar.svelte\";\r\n    import { addBackDestinationParam } from \"@its-ui/planner-common/helpers/backLinkHelper\";\r\n    import config from \"@its-ui/planner-common/config\";\r\n    import i18n from \"@its-ui/planner-common/i18n\";\r\n    import { createPlan, createPlanV2 } from \"@its-ui/planner-common/api\";\r\n    import {\r\n        topicsData,\r\n        allPlansData,\r\n        selectedPlanIds,\r\n        allPlanCountsData,\r\n        selectedTopicIds\r\n    } from \"@its-ui/planner-common/logic/plans/stores\";\r\n    import {\r\n        loadTopics,\r\n        loadAllPlans,\r\n        loadAllPlanCounts\r\n    } from \"@its-ui/planner-common/logic/plans/loadDataController\";\r\n    import { getPlannerView } from \"@its-ui/planner-common/helpers/converters\";\r\n    import { plannerTabIds, plannerSelfPacedTabIds } from \"@its-ui/planner-common/constants\";\r\n    import { get } from \"svelte/store\";\r\n    import TableViewLink from \"@its-ui/planner-common/components/TableViewLink/TableViewLink.svelte\";\r\n    import UseReadyMadeContentLink from \"@its-ui/planner-common/components/UseReadyMadeContentLink/UseReadyMadeContentLink.svelte\";\r\n\r\n    onMount(() => {\r\n        loadAllPlanCounts(config.publicAccessKey);\r\n        loadTopics(config.publicAccessKey);\r\n    });\r\n\r\n    export let allCounts;\r\n    export let selectedTab;\r\n\r\n    /** Empty state variables **/\r\n    const iconName = \"plans\";\r\n    const titleEmptyTab = config.canEdit\r\n        ? i18n.emptyState_Tab_Title_Teacher\r\n        : i18n.emptyState_Title_Student;\r\n\r\n    let showEmptyState = false;\r\n\r\n    let tabData = {};\r\n    let hasSelfPacedPlansLoaded = false;\r\n    let newPlanUpdatePerformed = false;\r\n    let lastSelectedSelfPacedTab = selectedTab;\r\n    let createNewPlanUrl = \"#\";\r\n\r\n    const contentClass = \"prom-tabs__content\";\r\n    const columnVisibilities = config.columnVisibilities;\r\n    const maxCountTreshold = 100;\r\n    const maxCountDisplayText = \" (99+)\";\r\n    const selfPacedTabs = [\r\n        {\r\n            id: \"tab-topics\",\r\n            route: \"topics\",\r\n            target: \"#panel-0\",\r\n            title: config.topicName,\r\n            loadMethod: loadTopics\r\n        },\r\n        {\r\n            id: \"tab-all\",\r\n            route: \"all\",\r\n            target: \"#panel-1\",\r\n            title: i18n.allPlans,\r\n            loadMethod: loadAllPlans\r\n        }\r\n    ];\r\n    const useGenericResourceColumn = config.useGenericResourceColumn;\r\n\r\n    $: if (!$topicsData.loading) {\r\n        if (lastSelectedSelfPacedTab === undefined) {\r\n            const currentUrl = window.location.href.toLowerCase();\r\n            const indexOfAllPlansTab = currentUrl.indexOf(\"all\");\r\n            const indexOfTopicsTab = currentUrl.indexOf(\"topics\");\r\n            const indexOfCurrent = currentUrl.indexOf(\"current\");\r\n            const indexOfChildId = currentUrl.indexOf(\"childid\");\r\n\r\n            if (config.publicAccessKey) {\r\n                if (indexOfTopicsTab !== -1 && indexOfChildId === -1) {\r\n                    // Navigate back to \"Topics\" tab\r\n                    selectedTab = plannerSelfPacedTabIds.topics;\r\n                } else if (\r\n                    (indexOfCurrent !== -1 || indexOfAllPlansTab !== -1) &&\r\n                    indexOfChildId === -1\r\n                ) {\r\n                    // Navigate back to \"All plans\" tab\r\n                    selectedTab = plannerSelfPacedTabIds.all;\r\n                } else {\r\n                    if (indexOfTopicsTab !== -1) {\r\n                        // Navigate back to \"Topics\" tab if there are topics\r\n                        if($topicsData.topics.length !== 0) {\r\n                            selectedTab = plannerSelfPacedTabIds.topics;\r\n                        }\r\n                        else {\r\n                            selectedTab = plannerSelfPacedTabIds.all;\r\n                        }\r\n                    } else if (\r\n                        $allPlanCountsData.topicsCount === \"0\" &&\r\n                        $allPlanCountsData.allPlansCount !== \"0\"\r\n                    ) {\r\n                        selectedTab = plannerSelfPacedTabIds.all;\r\n                    } else {\r\n                        selectedTab = plannerSelfPacedTabIds.topics;\r\n                    }\r\n                }\r\n            } else {\r\n                if ($topicsData.topics.length === 0 && indexOfAllPlansTab === indexOfTopicsTab) {\r\n                    selectedTab = plannerSelfPacedTabIds.all;\r\n                } else {\r\n                    selectedTab =\r\n                        indexOfAllPlansTab !== -1\r\n                            ? plannerSelfPacedTabIds.all\r\n                            : plannerSelfPacedTabIds.topics;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    if (lastSelectedSelfPacedTab === plannerTabIds.topics) {\r\n        lastSelectedSelfPacedTab = plannerSelfPacedTabIds.topics;\r\n    }\r\n\r\n    if (lastSelectedSelfPacedTab === plannerTabIds.all) {\r\n        lastSelectedSelfPacedTab = plannerSelfPacedTabIds.all;\r\n    }\r\n\r\n    $: {\r\n        allCounts = $allPlanCountsData;\r\n\r\n        if (!allCounts.loading) {\r\n            addCountsToTabTitles();\r\n        }\r\n    }\r\n\r\n    $: {\r\n        switch (selectedTab) {\r\n            case plannerSelfPacedTabIds.topics:\r\n                showEmptyState = !$topicsData.loading && $topicsData.topics.length === 0;\r\n                tabData = $topicsData;\r\n                break;\r\n            case plannerSelfPacedTabIds.all:\r\n                showEmptyState = !$allPlansData.loading && $allPlansData.plans.length === 0;\r\n                tabData = $allPlansData;\r\n                break;\r\n\r\n            default:\r\n                break;\r\n        }\r\n    }\r\n\r\n    $: {\r\n        if (selectedTab === plannerSelfPacedTabIds.all || selectedTab === plannerTabIds.all) {\r\n            if (selfPacedTabs[1].loadMethod && !hasSelfPacedPlansLoaded) {\r\n                selfPacedTabs[1].loadMethod(config.publicAccessKey);\r\n                hasSelfPacedPlansLoaded = true;\r\n            }\r\n        }\r\n    }\r\n\r\n    $: {\r\n        const selectedPlans = get(selectedPlanIds);\r\n        const selectedTopics = get(selectedTopicIds);\r\n\r\n        if (\r\n            (selectedPlans && selectedPlans.size > 0) ||\r\n            (selectedTopics && selectedTopics.size > 0)\r\n        ) {\r\n            resetLoadStatusOfSelectedTab();\r\n        }\r\n\r\n        lastSelectedSelfPacedTab = selectedTab;\r\n\r\n        let createdPlanIdParamString = \"\";\r\n\r\n        if (!newPlanUpdatePerformed) {\r\n            newPlanUpdatePerformed = true;\r\n            const queryString = window.location.search;\r\n            const urlParams = new URLSearchParams(queryString);\r\n            const planIdParam = urlParams.get(\"createdPlanId\");\r\n\r\n            createdPlanIdParamString = planIdParam ? `?createdPlanId=${planIdParam}` : \"\";\r\n        }\r\n\r\n        if (selectedTab === plannerSelfPacedTabIds.all || selectedTab === plannerTabIds.all) {\r\n            selectedTab = plannerSelfPacedTabIds.all;\r\n            history.pushState(\r\n                { tab: selectedTab },\r\n                \"\",\r\n                config.publicAccessKey\r\n                    ? `/plans/public/${config.publicAccessKey}/${selfPacedTabs[1].route}/`\r\n                    : `/plans/courses/${config.courseId}/${selfPacedTabs[1].route}/${createdPlanIdParamString}`\r\n            );\r\n        } else if (\r\n            selectedTab === plannerSelfPacedTabIds.topics ||\r\n            selectedTab === plannerTabIds.topics\r\n        ) {\r\n            selectedTab = plannerSelfPacedTabIds.topics;\r\n            history.pushState(\r\n                { tab: selectedTab },\r\n                \"\",\r\n                config.publicAccessKey\r\n                    ? `/plans/public/${config.publicAccessKey}/${selfPacedTabs[0].route}/`\r\n                    : `/plans/courses/${config.courseId}/${selfPacedTabs[0].route}/${createdPlanIdParamString}`\r\n            );\r\n        }\r\n\r\n        /** Clear plan cards and topic cards that are checked in other tabs **/\r\n        selectedPlanIds.set(new Set([]));\r\n        selectedTopicIds.set(new Set([]));\r\n    }\r\n\r\n    function addCountsToTabTitles() {\r\n        selfPacedTabs[0].title =\r\n            allCounts.topicsCount >= maxCountTreshold\r\n                ? `${config.topicName} ${maxCountDisplayText}`\r\n                : `${config.topicName} (${allCounts.topicsCount})`;\r\n        selfPacedTabs[1].title =\r\n            allCounts.allPlansCount >= maxCountTreshold\r\n                ? `${i18n.allPlans} ${maxCountDisplayText}`\r\n                : `${i18n.allPlans} (${allCounts.allPlansCount})`;\r\n    }\r\n\r\n    async function createNewPlan(event) {\r\n        event.preventDefault();\r\n\r\n        const planParams = {\r\n            topic: null,\r\n            start: \"0000-00-00 00:00:00\",\r\n            stop: \"0000-00-00 00:00:00\"\r\n        };\r\n\r\n        const newPlan = config.assignToEnabled ? await createPlanV2(planParams) : await createPlan(planParams);\r\n\r\n        createNewPlanUrl = addBackDestinationParam(\r\n            `${config.newPlanUrl}/${newPlan.planId}?pendingPlanId=${newPlan.planId}`\r\n        );\r\n\r\n        window.location.href = createNewPlanUrl;\r\n\r\n        return false;\r\n    }\r\n\r\n    async function afterActionSelfPaced() {\r\n        resetLoadStatus();\r\n        loadAllPlanCounts();\r\n\r\n        switch (selectedTab) {\r\n            case plannerSelfPacedTabIds.all:\r\n            case plannerTabIds.all:\r\n                await loadAllPlans(config.publicAccessKey);\r\n                break;\r\n            case plannerSelfPacedTabIds.topics:\r\n            case plannerTabIds.topics:\r\n                loadTopics(config.publicAccessKey);\r\n                break;\r\n            default:\r\n                break;\r\n        }\r\n    }\r\n\r\n    function popState({ state }) {\r\n        if (state && state.tab !== undefined) {\r\n            selectedTab = state.tab;\r\n            lastSelectedSelfPacedTab = state.tab;\r\n        }\r\n    }\r\n\r\n    function resetLoadStatus() {\r\n        hasSelfPacedPlansLoaded = false;\r\n    }\r\n\r\n    function resetLoadStatusOfSelectedTab() {\r\n        if (\r\n            lastSelectedSelfPacedTab === plannerSelfPacedTabIds.all ||\r\n            lastSelectedSelfPacedTab === plannerTabIds.all\r\n        ) {\r\n            hasSelfPacedPlansLoaded = false;\r\n        }\r\n    }\r\n</script>\r\n","<Banner close={i18n.close} text={config.bannerText} type=\"{bannerType}\" bind:visible={showBanner} />\r\n\r\n<section class=\"its-plans__headingrow\">\r\n    <h1 class=\"heading-text\">{i18n.plansHeader}</h1>\r\n    <Modal\r\n        id=\"stop-sharing-planner-id\"\r\n        bind:enabled={showStopSharingPlannerConfirmModal}\r\n        titleText={i18n.pleaseConfirm}\r\n        bodyText={i18n.stopSiteSharing_ConfirmModalText}\r\n        confirmText={i18n.yes}\r\n        cancelText={i18n.no}\r\n        confirmButtonType=\"primary\"\r\n        on:close={stopSharingModalClicked}\r\n    />\r\n    <div class=\"its-plans__options\">\r\n        {#if config.canEdit}\r\n            <ButtonDropdown\r\n                arrow={false}\r\n                expanded={false}\r\n                iconClass={optionsSettingButton.iconClass}\r\n                iconOnly={optionsSettingButton.iconOnly}\r\n                id={optionsSettingButton.id}\r\n                text={optionsSettingButton.text}\r\n                responsive={false}\r\n                items={optionItems}\r\n                type={optionsSettingButton.type}\r\n                textOnly={optionsSettingButton.textOnly}\r\n                on:selectedOption={selectedAction}\r\n            />\r\n        {/if}\r\n    </div>\r\n</section>\r\n\r\n{#if !isSelfPacedCourse}\r\n    <PlanTabs />\r\n{:else}\r\n    <SelfPacedPlanTabs />\r\n{/if}\r\n\r\n<script>\r\n    import ButtonDropdown from \"@itslearning/prometheus/assets/dropdowns/ButtonDropdown/v1/ButtonDropdown.svelte\";\r\n    import Modal from \"@itslearning/prometheus/assets/modals/Modal/v2/Modal.svelte\";\r\n    import Banner from '@itslearning/prometheus/assets/feedback/Banner/v1/Banner.svelte';\r\n\r\n    import config from \"@its-ui/planner-common/config\";\r\n    import i18n from \"@its-ui/planner-common/i18n\";\r\n    import { stopSharingPlanner } from \"@its-ui/planner-common/api\";\r\n    import { columnTypes, columnVisibility, readyMadeContentImportStatus } from \"@its-ui/planner-common/constants\";\r\n\r\n    import PlanTabs from \"../PlanTabs/PlanTabs.svelte\";\r\n    import SelfPacedPlanTabs from \"../SelfPacedPlanTabs/SelfPacedPlanTabs.svelte\";\r\n\r\n    const isSelfPacedCourse =\r\n        config.columnVisibilities[columnTypes.Date] === columnVisibility.Nobody;\r\n    const canStopSharingPlanner = config.canSharePlanner && config.canUpdateSharingPlanner;\r\n    const stopSiteSharingSelectValue = 1;\r\n\r\n    let showStopSharingPlannerConfirmModal = false;\r\n    let stopSharingPerformed = false;\r\n\r\n    const optionsSettingButton = {\r\n        iconClass: \"options-icon\",\r\n        iconOnly: true,\r\n        id: \"optionsdropdown\",\r\n        text: i18n.planSettings,\r\n        textOnly: false,\r\n        type: \"plain\"\r\n    };\r\n\r\n    $: showBanner = config.bannerText !== \"\";\r\n    $: bannerType = config.readyMadeContentImportStatus === readyMadeContentImportStatus.fullyImported ? \"info\" : \"warning\";\r\n\r\n    $: optionItems = getActions();\r\n\r\n    $: if (stopSharingPerformed) {\r\n        optionItems = getActions();\r\n        stopSharingPerformed = false;\r\n    }\r\n\r\n    function selectedAction(event) {\r\n        switch (event.detail.data) {\r\n            case stopSiteSharingSelectValue:\r\n                showStopSharingPlannerConfirmModal = true;\r\n                break;\r\n        }\r\n    }\r\n\r\n    function getActions() {\r\n        const options = [];\r\n\r\n        options.push({\r\n            icon: \"\",\r\n            label: i18n.planSettings,\r\n            link: true,\r\n            url: config.settingPageUrl,\r\n            target: \"_self\"\r\n        });\r\n\r\n        if (canStopSharingPlanner && !stopSharingPerformed) {\r\n            options.push({\r\n                icon: \"\",\r\n                label: i18n.stopSiteSharing,\r\n                link: false,\r\n                target: \"_self\",\r\n                value: stopSiteSharingSelectValue\r\n            });\r\n        }\r\n\r\n        if (config.canSharePlanner) {\r\n            options.push({\r\n                icon: \"\",\r\n                label:\r\n                    config.canUpdateSharingPlanner && !stopSharingPerformed\r\n                        ? i18n.updateSiteSharing\r\n                        : i18n.shareWithSites,\r\n                link: true,\r\n                url: config.shareToLibraryPageUrl,\r\n                target: \"_self\"\r\n            });\r\n        }\r\n\r\n        options.push({\r\n            icon: \"\",\r\n            label: i18n.importExport,\r\n            link: true,\r\n            url: config.importExportPageUrl,\r\n            target: \"_self\",\r\n        });\r\n\r\n        return [{ options: options }];\r\n    }\r\n\r\n    function stopSharingModalClicked(event) {\r\n        if (event.detail.confirmed === true) {\r\n            stopSharingPlanner(config.plannerShareableObjectId).then(() => {\r\n                stopSharingPerformed = true;\r\n            });\r\n        }\r\n\r\n        showStopSharingPlannerConfirmModal = false;\r\n    }\r\n</script>\r\n","import 'prometheus.aaa.scss';\r\nimport 'prometheus.modern.scss';\r\n\r\nimport './theme.aaa.scss';\r\nimport './theme.modern.scss';\r\n\r\nimport { registerDocumentClickBubblingOnTop } from \"@itslearning/atlas/frames/IframeClickEventHelper\";\r\nimport { postMessage } from \"@itslearning/atlas/network/postMessage\";\r\n\r\nimport App from './lib/App/App.svelte';\r\n\r\nimport i18n from \"@its-ui/planner-common/i18n.js\";\r\nimport config from \"@its-ui/planner-common/config.js\";\r\n\r\n// Ensure the top frame is informed of clicks, this is important to for instance close dropdowns.\r\nregisterDocumentClickBubblingOnTop();\r\n\r\n// @ts-ignore\r\nconst topPage = window.itslTop || window.top;\r\n\r\n// If plans is opened in an itslearning iFrame set the selected menu item and collapse the tree menu\r\nif (topPage) {\r\n    if (typeof topPage.hideContentAreaTreeMenu === \"function\") {\r\n        topPage.hideContentAreaTreeMenu();\r\n    }\r\n\r\n    if (typeof topPage.SelectCurrentNavigationItem === \"function\") {\r\n        topPage.SelectCurrentNavigationItem(\"planner\");\r\n    }\r\n}\r\n\r\npostMessage({\r\n    messageName: \"askIfCustomTreeLinkNavigationRequired\"\r\n});\r\n\r\npostMessage({\r\n    messageName: \"setIFrameTitleMessage\",\r\n    iFrameTitle: i18n.title\r\n});\r\n\r\nconst app = new App({\r\n    target: document.getElementById(\"plans\"),\r\n    // @ts-ignore\r\n    props: { selectedTab: config.tab }\r\n});\r\n\r\nexport default app;\r\n"],"names":["postMessage","message","parentFrame","postMessageToTopmostFrame","registerDocumentClickBubblingOnTop","agentId","iframeClickBubbleMessage","iframeTouchstartBubbleMessage","noop","assign","tar","src","k","run","fn","blank_object","run_all","fns","is_function","thing","safe_not_equal","a","b","src_url_equal_anchor","src_url_equal","element_src","url","is_empty","obj","subscribe","store","callbacks","callback","unsub","get_store_value","value","_","component_subscribe","component","create_slot","definition","ctx","$$scope","slot_ctx","get_slot_context","get_slot_changes","dirty","lets","merged","len","i","update_slot_base","slot","slot_definition","slot_changes","get_slot_context_fn","slot_context","get_all_dirty_from_scope","length","compute_slots","slots","result","key","set_store_value","ret","globals","append","target","node","insert","anchor","detach","destroy_each","iterations","detaching","element","name","svg_element","text","data","space","empty","listen","event","handler","options","attr","attribute","always_set_through_set_attribute","set_attributes","attributes","descriptors","set_custom_element_data_map","data_map","set_custom_element_data","prop","lower","set_dynamic_element_data","tag","to_number","children","set_data","set_input_value","input","select_option","select","mounting","option","select_value","selected_option","toggle_class","toggle","custom_event","type","detail","bubbles","cancelable","HtmlTag","is_svg","__publicField","html","current_component","set_current_component","get_current_component","onMount","afterUpdate","onDestroy","createEventDispatcher","bubble","dirty_components","binding_callbacks","render_callbacks","flush_callbacks","resolved_promise","update_scheduled","schedule_update","flush","tick","add_render_callback","add_flush_callback","seen_callbacks","flushidx","saved_component","update","$$","flush_render_callbacks","filtered","targets","c","outroing","outros","group_outros","check_outros","transition_in","block","local","transition_out","ensure_array_like","array_like_or_iterator","destroy_block","lookup","outro_and_destroy_block","update_keyed_each","old_blocks","get_key","dynamic","list","destroy","create_each_block","next","get_context","o","n","old_indexes","new_blocks","new_lookup","deltas","updates","child_ctx","will_move","did_move","new_block","old_block","new_key","old_key","get_spread_update","levels","to_null_out","accounted_for","bind","index","create_component","mount_component","fragment","after_update","new_on_destroy","destroy_component","make_dirty","init","instance","create_fragment","not_equal","props","append_styles","parent_component","ready","rest","nodes","SvelteComponent","PUBLIC_VERSION","button","button_class_value","span1","span0","$$props","iconOnly","id","cssClass","large","disabled","loading","htmlType","haspopup","expanded","ariaLabel","describedby","labelledby","visuallyHidden","isLarge","isLoading","$$invalidate","isActive","ariaLabelText","button_changes","iconClass","iconPlacement","textOnly","iconOnlyClass","textOnlyClass","iconPlacementClass","Keys","normalizeKey","nonTabbables","selector","tabbables","TabTrapper","elements","visibleTabbables","removeInvisibles","selectedElement","isInSameRadioGroup","innerDocBody","element1","element2","focusFirstItemIn","dropdown","focusLastItemIn","returnFocusToParentDropdown","removeFocusFromParentDropdown","hide","submenu","hidden","hideOpenSubmenus","submenus","menuButtons","show","openerRect","dropdownBody","getClosestParentByClass","matchClass","openSubmenus","open","isMenuItem","span","span_class_value","img","img_src_value","img_height_value","img_width_value","t1_value","create_if_block_1","create_if_block_2","if_block1","create_if_block","a_href_value","a_ping_value","a_id_value","a_target_value","t1","dispatch","onClick","button_id_value","hasPopup","ua","isIpad","isMobile","getLists","currentItem","lists","child","goToNextList","nextSibling","goToPreviousList","previousSibling","focusPreviousListItem","previousItem","focusNextListItem","nextItem","each_value","section1","section0","each_blocks","li","isSubmenu","clickHandler","toggleMenu","mouseenterHandler","item","openMenu","mouseleaveHandler","closeMenu","moveToNextItem","moveToPreviousItem","keyHandlerDown","keyHandlerUp","isHover","guidV4","bytes","t_value","h2","t","if_block","ul","ul_aria_labelledby_value","current","keyup_handler","section3","header","section2","footer","root","tabTrapper","arrow","arrowPosition","items","responsive","globalKeyHandler","keyHandler","selectOption","TabTrapHelper","$$value","arrowClass","notResponsiveClass","section","position","closeHandler","buttonElement","returnFocus","submenuHandler","keyDownHandler","keyUpHandler","setFocus","overlayClass","create_if_block_6","create_if_block_5","div6","div0","h1","div5","div1","div3","div2","div4","div","create_if_block_4","create_if_block_3","enabled","wide","titleOnly","confirmText","cancelText","titleText","bodyText","bodyHtml","showCancel","scrollBody","describedBy","confirmButtonType","cancelButtonType","clickOutsideCloses","hasScroll","contentScrollRemaining","scrollContainer","promptResolve","modalStyle","focusedBeforeModal","dialogElement","contentElement","gradientStyle","previouslyEnabled","onOpen","windowResize","buttons","reinitTabTrapper","onClose","cancel","verticalGap","maxHeight","confirm","prompt","properties","resolve","contentScroll","scrollHeight","clientHeight","scrollTop","click_handler","height","describedById","visible","close","closable","closeButtonType","infoText","warningText","loadingText","successText","showMessage","ariaLive","role","roleText","config","i18n","NetworkError","response","ResponseStatuses","post","reject","fetchOptions","tryParseResponse","put","del","get","method","body","backLinkDestinations","plannerViews","plannerTabIds","readyMadeContentImportStatus","plannerSelfPacedTabIds","endpoints","planId","courseId","planIds","selectedView","topicIds","topicId","paging","templateCourseId","getCoursesForCopyPageSize","defaultPageSize","columnTypes","columnVisibility","plannerFieldType","resourceTypeToShow","reverseObject","newObj","defaultFromHour","defaultToHour","minTitleLength","maxTitleLength","topicsActionType","plansActionType","plansCopyActionModal","weekDays","planSorting","plansOrder","dateTimePickerModalFromSection","dateTimePickerModalToSection","datePickerButton","fromDatePickerInputField","toDatePickerInputField","TOPIC_ID_DESTINATION_QUERY_STRING_PARAMETER","planType","onePlanAtATimePlanStatus","headers","pageSize","getQueryStringPaging","pageIndex","childId","getAllPlanCounts","getAllPlanCountsPublic","getAllPlans","getAllPlansPublic","getCurrentPlans","getCurrentPlansPublic","getWithoutDatePlans","getWithoutDatePlansPublic","getPastPlans","getPastPlansPublic","getTopics","getTopicsPublic","getTopicRandomColour","createTopic","title","colour","getPlansInTopic","planOrder","getPlansInTopicPublic","createPlan","planParams","completePlan","uncompletePlan","togglePlansStatus","activate","toggleElementsActivation","isBulkAction","executeForAllPlans","requestModel","removePlans","setTopicOrder","getCourses","copyPlans","targetCourseId","targetTopicId","copyDates","copyResourcesAndActivities","overwriteAssessmentCriteria","plansIds","copyWithoutTopic","getTopicsForCopyPlans","originalTopicId","getCalendarAvailableDates","start","end","deleteTopics","copyTopics","dragAndDropPlanInLesson","sourceId","targetId","after","dragAndDropPlanInTopic","order","setPlansTimeSpan","startDate","stopDate","weekNumber","getSetDateRequestModel","setPlansWeekAndDay","setPlansTimeSpanEvents","firstPlanEventIds","getPlanOrderInTopic","setPlanOrderInTopic","stopSharingPlanner","plannerShareableObjectId","createPlanV2","subscriber_queue","writable","stop","subscribers","set","new_value","run_queue","subscriber","invalidate","a_class_value","kind","href","rel","label","ping","standalone","downloadable","fileName","download","icon","svelte_element","create_dynamic_element","p","description","headingLevel","iconName","orientation","alignment","showButton","buttonText","buttonHtmlType","showLink","linkType","linkText","showLoadingIndicator","iconCssClass","l","t0_value","a_aria_selected_value","a_tabindex_value","t0","tabs","selectedIndex","skipLink","container","previousSelectedIndex","preloadedTabs","panels","changeSelectedTab","links","preloadHandler","tab","offset","nextIndex","mouseenter_handler","formatString","template","regex","values","match","number","formatLanguageString","label_1","label_1_class_value","checked","labelHidden","small","required","elementLegacyColor","courseColor","checkbox","labelText","handleChanged","disabledClass","smallClass","customColor","labelHiddenClass","div2_id_value","placement","hover","tooltip","tooltipContent","setElementAttribute","onWindowKeyUp","hoverTooltip","unhoverTooltip","updateTooltip","setPosition","isTooltipShown","rect","tooltipHeight","tooltipWidth","horizontalPlacementOffset","verticalPlacementOffset","left","top","displayClass","complete","addBackDestinationParam","destinationUrl","extraParams","plansRegex","tableViewRegex","tableViewRegexMatch","plansRegexMatch","topicRegex","topicRegexMatch","topicsRegex","topicsRegexMatch","parentDashboardRegex","dashboardUrl","parentDashboardRegexMatch","queryString","childIdFromQueryParameter","postKpi","measurement","context","postNewPlannerKpi","measurementId","error","div_class_value","secondaryStandaloneClass","backExtraParams","columnVisibilities","containerClass","isPlanCard","kpiContinue","kpiStart","plan","startAtPlanPage","useGenericResourceColumn","useNextPlanFeature","isContinue","isNextPlan","isStart","linkUrl","linkScreenReaderText","isComplete","isLast","isReopened","useBetterProgressionBetweenPlansWithoutDate","resourcesVisibility","activitiesVisibility","elementsVisibility","hasElements","e","allActivities","allResources","isAllActivitiesCompleted","isAllResourcesCompleted","isAllElementsCompleted","isNoResourcesCompleted","isNoActivitiesCompleted","handleLinkClick","handleCompletePlan","handleUncompletePlan","setLinkStart","redirect","handleCourseStartOrContinue","setLinkContinue","setLinkNextPlan","func","canPlanBeSetAsCompleted","areResourcesVisible","areActivitiesVisible","areElementsVisible","isLinkTextStart","isLinkTextContinue","isLinkTextNext","nextResource","progress","max","progressCssClass","accessibleText","accessibleTextString","validAccessibleTextString","NO_TOPIC","createPlaceholderImagesProvider","topicColours","defaultPlanImages","topicPlaceholderLookup","tc","getRandomImageIndex","topic","topicColor","matchingColor","defaultImages","currentImageIndex","maxAllowedIndex","loadPlanCounts","apiMethod","startLoading","applyResultPlanCounts","loadPlans","currentPageIndex","applyResult","handleError","loadPlansForTopic","publicAccessKey","plans","buildUpPlans","placeholderImagesProvider","adjustToTimezone","setPlaceholderImageUrl","date","newDate","userTimezoneOffset","getDateRangeString","from","to","locale","singlePlan","fromString","toString","isSameYear","isToCurrentYear","isDateOnlyMode","startTime","endTime","timeStringOptions","getEventsDateRangeString","multipleDayPlan","formatDateForApi","month","addLeadingZero","day","year","hours","minutes","seconds","formatDateOnlyForApi","zero","fromMinutes","toMinutes","validateDateFormat","dateValue","dateFormat","findSeparator","separator","dateArray","formatArray","missingDateValue","initAutoSuggestFromDate","dateValueFrom","dateValueTo","dateValueFromInitially","initAutoSuggestToDate","dateValueToInitially","isPlanCompletedHelper","isPlanCompleted","_a","isDateVisible","canEdit","isPlanColumnVisible","columnType","isValueViewableForAll","planColumnVisibility","create_if_block_18","create_if_block_16","create_if_block_17","create_if_block_12","span2","create_if_block_9","show_if","create_if_block_19","create_if_block_15","create_if_block_14","if_block3","create_if_block_13","if_block4","create_if_block_11","if_block5","create_if_block_10","if_block6","create_if_block_8","div0_style_value","div0_aria_label_value","li_id_value","li_class_value","h3","getPlanBackgroundImageStyle","backgroundImageUrl","eventsCount","linkedCoursesCount","showSelect","showDrag","hasAccessToPlan","isLearner","topicName","showTopicAsLink","keyboardReorderSelected","dragAndDropSelected","keyboardReorder","selectedPlanIds","isCourseOverviewPage","resourceCount","planElement","activityCount","resourcesCompleted","activitiesCompleted","isPlanLocked","cardElement","dragButton","tooltipVisible","isSelfPacedCourseOnePlanAtATime","events","resources","areResourcesAndActivitiesCombined","linkedCourses","updateCheckedStatus","selectedPlans","mouseDownDragButton","clickDragButton","keyUpDragButton","blurDragButton","isResourceVisible","isResourceActivitiesVisible","isResourceOrActivities","countMaxProgressBar","typeToShow","resourcesActivitiesCompleted","showResources","getShortDescription","temporaryElement","measurePlanOpensFromCalendar","isPlanClickable","dateText","imageStyle","hiddenClass","canCurrentUserCompleteElements","userCanStartPlan","hoverSupportClass","topicColorStyle","nameText","handleClick","loadTopics","defaultPlanCounts","defaultPlansData","defaultTopicsData","currentPlansData","withoutDatePlansData","pastPlansData","topicsData","selectedTopicIds","allPlanCountsData","allPlansData","loadCurrentPlans","loadWithoutDatePlans","loadPastPlans","loadTopicsHelper","loadAllPlanCounts","loadAllPlans","debounce","wait","immediate","timeout","args","callNow","plansData","plancard_changes","div_aria_busy_value","if_block0","if_block2","scrollPlanToView","upcomingSplitTime","drag","loadMethod","separateUpcomingPlans","showLoading","scrollBottom","loadingError","orderDirty","keyboardReorderActiveId","reorderDragHandleId","draggedElementTop","dragSelectedPlan","sourceSelectedPlan","targetSelectedPlan","targetSelectedPlanAfter","debounceSavePlanOrder","listSection","listElement","dragScrolling","newPlanUpdatePerformed","isAutoloadingOn","isDraggable","showReplaceSortingConfirmModal","dragConfirmed","currentPlanOrder","dragIconElements","runDebounceSavePlansOrder","savePlanOrder","showMore","changeFocus","elementId","moveDown","movePlan","moveUp","insertBefore","newElements","fromIndex","toIndex","keyboardDragStart","listKeyDown","activePlan","targetPlanIndex","listBlur","dragStart","pointerMove","cursorPosY","offsetTop","elementRect","elementTop","dragOverElement","scrollWithDrag","down","scrollAmount","dragEnd","isPlansInTopicView","savePlanOrderAfterConfirmation","onScroll","maxScroll","toggleAutoloading","replaceSortingModalClicked","dragStart_handler","keyboardDragStart_handler","mainPlans","upcomingPlans","urlParams","draggedElementStyle","link_changes","isDataLoading","showTableViewLinkForReadOnlyMode","idForDay","isSameDate","dateToString","format","dateFromString","dateString","indexes","_match","p1","textarea","classText","placeholder","hasError","autocomplete","step","min","minlength","maxlength","spellcheck","cols","rows","conditionalAttributes","hint","errorMessage","labelPosition","ariaLiveUpdateType","areaSizeClass","hasErrorClass","errorMessageId","th","span_id_value","button_tabindex_value","button_aria_label_value","button_aria_describedby_value","td","tr","t2","t2_value","t4_value","t6_value","t8_value","t12_value","div2_aria_label_value","button0","button1","table","thead","button2","t4","t6","t8","t12","getWeek","inputDate","dayNumber","firstDayOfYear","firstDayOfWeek","selectorStartDate","highlightedDates","calendarElement","weeksToShow","days","changePage","months","newSelectorStartDate","setValue","setValueToday","onKeyPress","newValue","click_handler_1","click_handler_2","firstDateOfMonth","diff","firstDateToDisplay","weeks","today","week","daysOfWeek","div_aria_label_value","closeOnSelect","inputValue","wrapperElement","inputElement","tabTrapElement","valueChanged","newInputValue","inputValueChanged","focusValue","onInputBlurred","dateSelected","setExpanded","newExpanded","inputElementInner","wrapperRect","inputRect","onInputKeyPress","style","showStartStopErrorMessage","setValidDatesErrorMessage","showStartInvalidMessage","showStopInvalidMessage","select_changes","participants","availableEvents","courseGroups","numberOfCourseGroups","numberOfAllParticipantsEvents","changeValue","groupId","groupObject","updatedCourseGroups","firstAllParticpantsEventId","firstGroupEventId","hasGroupData","hasAllParticipantsData","emptystate_changes","banner_changes","datepickerfield0_changes","datepickerfield1_changes","modal_changes","showConnectToCalendarModal","datePickerFromExpanded","datePickerToExpanded","mountComplete","showEmptyState","allEvents","firstEventId","bannerVisible","getAllCourseEvents","connectToCalendarModalClicked","datePickerFrom","datePickerTo","dateFrom","dateTo","validateDateToFormat","epochStart","epochStop","activityArray","getCourseEventsInCurrentTimespan","setConnectingEvents","updatedAvailableEvents","datePickerMin","datePickerMax","pickerHighlightedDates","allCourseEvents","multipleDaysPlan","firstEventStartDate","firstEventStopDate","curentEventStartDate","currentEventStopDate","eventFrom","eventTo","formattedDate","isOccupied","isConnected","dayCounter","currentDatePointer","changeFirstEventId","showCopyConfirmModal","confirmModalBody","bannerText","option0","option1","hoursArray","twelvehoursArray","minutesArray","hourId","hourLabel","minuteId","minuteLabel","periodId","periodLabel","isPM","isDisabled","isPMstr","showRecurrenceErrorMessage","timeselector_changes","checkbox_changes","checkbox_props","t7_value","h20","h21","t7","rotateArray","array","isTheSameDay","showSetDatesModal","hoursFrom","minutesFrom","isPMFrom","hoursTo","minutesTo","isPMTo","showTimeSelector","dateTimeSet","isTimeSpanDisabled","weeksDropDownValue","daysArray","recurrenceArray","checkAutoSuggestFromDate","updateDaysArray","checkAutoSuggestToDate","datePicker","checkedDay","updateweeksDropDownValue","currentDayDiff","weekCount","toggleTimeSpanSetting","dataSelected","d","startDay","stopDay","insertHoursAndMinutes","hoursFromVal","hoursToVal","setDatesModalClicked","checkedDays","$$self","isRecurrenceSectionVisible","createPlansStore","plansStore","getDatesForApi","dateOnlyMode","emptyDateStr","setPlanActive","active","setPlansActive","removePlansFromCourse","getCoursesForCopy","allCourses","copyPlansFromCourse","updatePlansDates","updatePlansDatesEvents","getPlannerView","tabIndex","getPlansOrderFromPlansView","plansView","makeCourseForDropdown","course","actionSource","archivedText","courseTitle","addScrollTopicDropdown","t3_value","addScrollCourseDropdown","modalId","dropdownCopyPlanSection","dropdownCopyTopicSection","dropdownHeight","printAsTopic","areAllPlansSelected","topicFilterIds","showCopyPlansModal","showDeletePlansConfirmModal","showNoPlansSelectedModal","errorNoCourseSelected","errorNoTopicSelected","dropDownCourses","dropDownCoursesLoading","coursesItems","courseIsSelected","selectedCourseTitle","selectedCourseId","topicsItems","courseHasUseTopics","checkedKeepExistingTopic","topicIsSelected","selectedTopic","selectedTopicId","checkedCopyDates","checkedConnectedResources","checkedAssessmentCriteria","showCopyInProgress","confirmModalBannerVisibility","confirmModalBannerText","showDisableElementsConfirmModal","selectedPlanIdsToMakeNotVisible","isSelfPaceCourse","canConnectToCalendar","selectedAction","openModalInMobile","makeVisible","makeNotVisible","getActions","loadCourses","starredCoursesList","otherCoursesList","courseForDropdown","selectCourse","actionData","hasUseTopics","topicsList","topics","selectTopic","updateSelectATopicSection","updateCheckedStatusCopyDates","updateCheckedStatusConnectedResources","updateCheckedStatusAssessmentCriteria","copyPlansModalClicked","copyPlansData","completePlanAction","closeCopyPlansConfirmModalClicked","deletePlansModalClicked","isPlansDeleteConfirmed","saveSetDatesModalClicked","saveConnectToCalendarModalClicked","activityIds","closeSetDatesModalClicked","noPlansModalClicked","plansNotVisible_Selected","plansVisible_Selected","plansVisible_Selected_WithElements","confirmModalClicked","coursesDropdownText","topicsDropdownText","showAssessmentCriteriaSection","linktext","emptyState","hideFeaturesForTableView","createNewPlanUrl","createNew","newPlan","ModalEvent","defaultI18n","heading","closeable","showCloseButton","hideHeader","rootElement","closeElement","bodyElement","scrollModiferClass","rootElementRole","onWindowResize","headerClientId","defaultRole","translations","bodyClientId","input_value_value","span0_class_value","t3","fieldset","legend","colours","selected","topicModalInputId","topicTitle","selectedColour","autoSelectedColourId","disableCreateButton","focusElement","create","selectedColourId","checkIfEmptyTitle","addScrollCourseDropdownTopics","form","dropdownSection","showPrintAction","showCopyTopicsModal","showDeleteTopicsConfirmModal","showNoTopicsSelectedModal","copyTopicsModalClicked","copyTopicsData","closeCopyTopicsConfirmModalClicked","deleteTopicsModalClicked","noTopicsModalClicked","color","uncategorized","endDate","planCount","selectedTopics","colorStyle","create_if_block_7","topiccard_changes","tableviewlink_changes","createTopicModal","scrollTopicToView","dragSelectedTopic","debounceSaveTopicOrder","descriptionEmptyTopics","titleEmptyTopics","showCreateTopicModal","selectedTab","runDebounceSaveTopicOrder","saveTopicOrder","openCreateTopicModal","createNewTopic","cancelTopic","endOfActionOnSelectedTopics","$topicsData","moveTopic","activeTopic","topicCardHref","planstoolbar_changes","contentClass","maxCountTreshold","maxCountDisplayText","titleEmptyTab","tabData","hasCurrentPlansLoaded","hasPastPlansLoaded","hasWithoutDatePlansLoaded","hasTopicsLoaded","selectedTabFromHref","getSelectedTabFromHref","allCounts","lastSelectedTab","addCountsToTabTitles","createNewPlan","afterAction","resetLoadStatus","popState","state","resetLoadStatusOfSelectedTab","$allPlanCountsData","$currentPlansData","$pastPlansData","$withoutDatePlansData","hasSelfPacedPlansLoaded","lastSelectedSelfPacedTab","selfPacedTabs","afterActionSelfPaced","createdPlanIdParamString","planIdParam","currentUrl","indexOfAllPlansTab","indexOfTopicsTab","indexOfCurrent","indexOfChildId","$allPlansData","stopSiteSharingSelectValue","isSelfPacedCourse","canStopSharingPlanner","showStopSharingPlannerConfirmModal","stopSharingPerformed","optionsSettingButton","stopSharingModalClicked","showBanner","optionItems","bannerType","topPage","App"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,32,33,34,37,38,39,40,41,42,43,47,57,61,65,66,67,68,69,71,85,86,87]}