{"version":3,"file":"app-778bb011.f584a1446b2fc034d810.bundle.js","mappings":"AAGA","sources":["webpack://lernplattform-admin-frontend/../common/aurelia-components/exam-result-legend/exam-result-legend.html","webpack://lernplattform-admin-frontend/../common/aurelia-components/external-login/external-login.html","webpack://lernplattform-admin-frontend/../common/aurelia-components/fill-in-the-blank-select/fill-in-the-blank-select.html","webpack://lernplattform-admin-frontend/../common/aurelia-components/fill-in-the-blank/fill-in-the-blank.html","webpack://lernplattform-admin-frontend/../common/aurelia-components/focus-reset/focus-reset.html","webpack://lernplattform-admin-frontend/../common/aurelia-components/exam-result-legend/exam-result-legend.ts","webpack://lernplattform-admin-frontend/../common/aurelia-components/exam-result-legend/index.ts","webpack://lernplattform-admin-frontend/../common/aurelia-components/external-login/external-login.ts","webpack://lernplattform-admin-frontend/../common/aurelia-components/external-login/index.ts","webpack://lernplattform-admin-frontend/../common/aurelia-components/fill-in-the-blank-select/fill-in-the-blank-select.ts","webpack://lernplattform-admin-frontend/../common/aurelia-components/fill-in-the-blank-select/index.ts","webpack://lernplattform-admin-frontend/../common/aurelia-components/fill-in-the-blank/fill-in-the-blank.ts","webpack://lernplattform-admin-frontend/../common/aurelia-components/fill-in-the-blank/index.ts","webpack://lernplattform-admin-frontend/../common/aurelia-components/focus-reset/focus-reset.ts","webpack://lernplattform-admin-frontend/../common/aurelia-components/focus-reset/index.ts"],"sourcesContent":["// Module\nvar code = \"<template class=\\\"exam-result-legend\\\"> <div class=\\\"exam-result-legend__header\\\" t=\\\"common.exam-result-legend.header\\\"></div> <div repeat.for=\\\"icon of icons\\\" class=\\\"exam-result-legend__item\\\"> <safe-icon class=\\\"exam-result-legend__icon\\\" icon-name.to-view=\\\"icon.iconName\\\"></safe-icon> <div class=\\\"exam-result-legend__text\\\" t.to-view=\\\"icon.descriptionTk\\\"></div> </div> </template>\";\n// Exports\nexport default code;","// Module\nvar code = \"<template class=\\\"external-login\\\" style.to-view=\\\"{ '--external-login-count': externalLoginConfig.length }\\\"> <div if.to-view=\\\"showTitle && externalLoginConfig.length\\\" class=\\\"external-login__alternate-login\\\"> <div class=\\\"external-login__alternate-login-bar\\\"></div> <h3 class=\\\"external-login__alternate-login-title\\\" t=\\\"common.external-login.alternativeLoginTitle\\\"></h3> </div> <div class=\\\"external-login__button-wrapper-container\\\"> <div class=\\\"external-login__button-wrapper\\\"> <button-round repeat.for=\\\"config of externalLoginConfig\\\" icon-name.to-view=\\\"getIconName(config)\\\" aria-label.to-view=\\\"config.provider\\\" t=\\\"[aria-label]common.external-login.external-login.loginWith\\\" tooltip-tk=\\\"common.external-login.loginWith\\\" tooltip-tk-params.to-view=\\\"{ loginProvider: getProviderDisplayName(config.provider) }\\\" t-params.to-view=\\\"{ loginProvider: config.provider }\\\" color.to-view=\\\"config.color\\\" click.delegate=\\\"config.callback(config)\\\"></button-round> </div> </div> </template>\";\n// Exports\nexport default code;","// Module\nvar code = \"<template> <div class=\\\"fill-in-the-blank-select\\\"> <audio-service-button if.bind=\\\"voiceOverEnabled && allAnswersHaveAudio\\\" class=\\\"question__voiceover-button question__voiceover-button--play fill-in-the-blank-select__voiceover-button\\\" src.to-view=\\\"voiceoverPlaylist\\\" data-test-selector=\\\"testexam-mc-question-voiceover-button\\\"></audio-service-button> <dropdown-select show.to-view=\\\"!reveal\\\" disabled.to-view=\\\"reveal\\\" class=\\\"fill-in-the-blank-select__dropdown ${voiceOverEnabled && allAnswersHaveAudio ? 'fill-in-the-blank-select__dropdown--with-voiceover' : ''}\\\" real-touch=\\\"on-touch-callback.call: openCustomSelectAnswerOverlay($event)\\\" fixed-menu.to-view=\\\"fixedDropdownMenu\\\" data-test-selector=\\\"testexam-fitb-dropdown-select\\\" selected-item-changed.trigger=\\\"handleSelectChange($event)\\\" value-property-name.to-view=\\\"`id`\\\" label-property-name.to-view=\\\"`text`\\\" select-style.to-view=\\\"`outlined`\\\" select-items.to-view=\\\"selectAnswers\\\" selected-item.to-view=\\\"selectedAnswer || selectAnswers[0]\\\"></dropdown-select> <div if.to-view=\\\"reveal\\\" class=\\\"fill-in-the-blank-select__reveal ${voiceOverEnabled && allAnswersHaveAudio ? 'fill-in-the-blank-select__reveal--with-voiceover' : ''}\\\" data-test-selector=\\\"testexam-fitb-dropdown-select-reveal\\\"> <template if.to-view=\\\"selectedAnswer.id === correct\\\"> <div class=\\\"fill-in-the-blank-select__reveal-text fill-in-the-blank-select__reveal-text--correct\\\">${selectedAnswer.text}</div> <x-icon class=\\\"fill-in-the-blank-select__reveal-icon fill-in-the-blank-select__reveal-icon--correct\\\" size.to-view=\\\"`unspecified`\\\" icon-type.to-view=\\\"`custom`\\\" icon-name.to-view=\\\"`Markers/Ok`\\\"></x-icon> </template> <template if.to-view=\\\"selectedAnswer.id !== correct\\\"> <div class=\\\"fill-in-the-blank-select__reveal-text fill-in-the-blank-select__reveal-text--wrong\\\">${selectedAnswer.text}</div> <x-icon class=\\\"fill-in-the-blank-select__reveal-icon fill-in-the-blank-select__reveal-icon--wrong\\\" size.to-view=\\\"`unspecified`\\\" icon-type.to-view=\\\"`custom`\\\" icon-name.to-view=\\\"`Markers/NotOk`\\\"></x-icon> </template> </div> <div if.to-view=\\\"reveal && selectedAnswer.id !== correct\\\" class=\\\"fill-in-the-blank-select__reveal-correction\\\">${selectAnswers[correct].text}</div> </div> <custom-select-answer-overlay answers.to-view=\\\"possibleAnswers\\\" id.to-view=\\\"selectedAnswer.id\\\" close-custom-select-answer-overlay.delegate=\\\"closeCustomSelectAnswerOverlay($event)\\\" if.bind=\\\"displaySelectAnswerOverlay\\\"></custom-select-answer-overlay> </template> \";\n// Exports\nexport default code;","// Module\nvar code = \"<template class=\\\"fill-in-the-blank fill-in-the-blank--theme-${theme}\\\"> <div repeat.for=\\\"question of questions\\\" class=\\\"fill-in-the-blank__container\\\"> <label if.to-view=\\\"question\\\" class=\\\"fill-in-the-blank__question\\\" data-test-selector=\\\"testexam-fitb-question-text-${$index+1}\\\" for=\\\"${`fitb`+($index+1)}\\\"> <safe-icon if.to-view=\\\"helpTextEnabled && helpTexts[$index]\\\" class=\\\"fill-in-the-blank__help-text-icon\\\" icon-name=\\\"System/LightBulb\\\" use-as-button t=\\\"[title]common.course-question.showHelp;[aria-label]common.course-question.showHelp\\\" click.trigger=\\\"handleHelpTextIconClicked($index)\\\"></safe-icon> <audio-service-button if.bind=\\\"voiceOverEnabled && currentQuestion[`audio${$index+1}Url`]\\\" class=\\\"fill-in-the-blank__audio-button\\\" src.to-view=\\\"currentQuestion[`audio${$index+1}Url`]\\\" data-test-selector=\\\"testexam-mc-question-voiceover-button\\\"></audio-service-button> ${question} </label> <fill-in-the-blank-select answers.to-view=\\\"answers\\\" index.to-view=\\\"$index\\\" id.to-view=\\\"`fitb`+($index+1)\\\" disabled.to-view=\\\"disabled\\\" voice-over-enabled.to-view=\\\"voiceOverEnabled\\\" reveal.to-view=\\\"revealAnswers\\\" correct.to-view=\\\"correctAnswers[$index]\\\" possible-answers.to-view=\\\"currentQuestion.answers[$index]\\\" fixed-dropdown-menu.to-view=\\\"fixedDropdownMenu\\\"></fill-in-the-blank-select> </div> </template>\";\n// Exports\nexport default code;","// Module\nvar code = \"<template class=\\\"focus-reset\\\" aria-hidden tabindex=\\\"-1\\\"></template>\";\n// Exports\nexport default code;","import { PLATFORM, autoinject, useView } from 'aurelia-framework';\n\n@autoinject()\n@useView(PLATFORM.moduleName('./exam-result-legend.html'))\nexport class ExamResultLegend {\n\n  private icons: IIconParams[] = [\n    {\n      descriptionTk: 'common.exam-result-legend.correct',\n      iconName: 'System/Answer Selects/Correct',\n    },\n    {\n      descriptionTk: 'common.exam-result-legend.correctSelected',\n      iconName: 'System/Answer Selects/Correct - Selected',\n    },\n    {\n      descriptionTk: 'common.exam-result-legend.wrong',\n      iconName: 'System/Checkbox/Unchecked',\n    },\n    {\n      descriptionTk: 'common.exam-result-legend.wrongSelected',\n      iconName: 'System/Answer Selects/Wrong - Selected',\n    },\n  ];\n}\n\ninterface IIconParams {\n  iconName: string;\n  descriptionTk: string;\n}\n","import { PLATFORM, FrameworkConfiguration } from 'aurelia-framework';\n\nexport function configure(config: FrameworkConfiguration): void {\n  config.globalResources(PLATFORM.moduleName('common/aurelia-components/exam-result-legend/exam-result-legend'));\n}\n","import { PLATFORM, useView } from 'aurelia-framework';\nimport { bindable } from 'aurelia-templating';\nimport { LoginProvider } from 'common/enum/auth.enum';\nimport { AppUtils } from 'common/utils/AppUtils';\n\n@useView(PLATFORM.moduleName('./external-login.html'))\nexport class ExternalLogin {\n  @bindable() public externalLoginConfig: IExternalLoginConfiguration[] | null = null;\n  @bindable() public showTitle: boolean = false;\n\n  private getIconName(config: IExternalLoginConfiguration): string {\n    switch(config.provider) {\n      case LoginProvider.Google:\n        return 'Login/Google';\n      case LoginProvider.AAD:\n        return 'Login/AAD';\n      case LoginProvider.SAML:\n        return 'Login/SAML';\n      case LoginProvider.Apple:\n        return 'Login/Apple';\n      case LoginProvider.Facebook:\n        return 'Login/Facebook';\n      default:\n        return 'System/Question';\n    }\n  }\n\n  private getProviderDisplayName(provider: LoginProvider): string {\n    return AppUtils.getProviderDisplayName(provider);\n  }\n}\n\nexport interface IExternalLoginConfiguration {\n  color: string;\n  provider: LoginProvider;\n  callback: (config: IExternalLoginConfiguration) => void;\n}\n","import { PLATFORM, FrameworkConfiguration } from 'aurelia-framework';\n\nexport function configure(config: FrameworkConfiguration): void {\n  config.globalResources(PLATFORM.moduleName('common/aurelia-components/external-login/external-login'));\n}\n","import { autoinject, bindable, computedFrom, Container, PLATFORM, useView } from 'aurelia-framework';\nimport { I18N } from 'aurelia-i18n';\nimport { CloseCustomSelectAnswerOverlayEvent } from 'common/aurelia-components/custom-select-answer-overlay/custom-select-answer-overlay';\nimport { SelectedItemChangedEvent } from 'common/aurelia-components/dropdown-select/dropdown-select';\nimport { IQuizAnswerDto } from 'common/dto/course/quiz/quiz.answer.interface';\nimport { DomUtils } from 'common/utils/DomUtils';\nimport { AbstractPluginComponent, AbstractPluginComponentPlugin } from '../AbstractPluginComponent';\n\ninterface ISelectAnswer {\n  id: number;\n  text: string;\n}\n\nexport abstract class BaseFillInTheBlankSelectPlugin extends AbstractPluginComponentPlugin {\n  /**\n   * possible translations\n   * tk: false\n   */\n  public abstract translate(translationKey: string, opts?: Parameters<I18N['tr']>[1]): string;\n}\n\n/**\n * @event {FitbAnswerChangedEvent} fitb-answer-changed\n */\n@autoinject()\n@useView(PLATFORM.moduleName('./fill-in-the-blank-select.html'))\nexport class FillInTheBlankSelect extends AbstractPluginComponent<BaseFillInTheBlankSelectPlugin>  {\n  @bindable() public answers: number[] | null = null;\n  @bindable() public id: string | null = null;\n  @bindable() public index: number | null = null;\n  @bindable() public possibleAnswers: IQuizAnswerDto | null = null;\n  @bindable() public voiceOverEnabled = false;\n  @bindable() public correct = 0;\n  @bindable() public reveal = false;\n  @bindable() public fixedDropdownMenu = false;\n  private selectAnswers: ISelectAnswer[] | null = null;\n  private selectedAnswer: ISelectAnswer | null = null;\n  private displaySelectAnswerOverlay = false;\n\n  private readonly element: HTMLElement;\n\n  @computedFrom('possibleAnswers')\n  private get voiceoverPlaylist(): [string, string, string, string] | null {\n    return this.possibleAnswers\n      && this.possibleAnswers.ttsAudioUrl1 && this.possibleAnswers.ttsAudioUrl2 && this.possibleAnswers.ttsAudioUrl3 && this.possibleAnswers.ttsAudioUrl4\n      ? [this.possibleAnswers.ttsAudioUrl1, this.possibleAnswers.ttsAudioUrl2, this.possibleAnswers.ttsAudioUrl3, this.possibleAnswers.ttsAudioUrl4]\n      : null;\n  }\n\n  @computedFrom('possibleAnswers')\n  private get allAnswersHaveAudio(): boolean {\n    return !!(this.possibleAnswers\n      && this.possibleAnswers.ttsAudioUrl1 && this.possibleAnswers.ttsAudioUrl2 && this.possibleAnswers.ttsAudioUrl3 && this.possibleAnswers.ttsAudioUrl4);\n  }\n\n  constructor(\n    element: Element,\n    private i18n: I18N,\n    container: Container,\n  ) {\n    super(container, [BaseFillInTheBlankSelectPlugin]);\n    this.element = element as HTMLElement;\n  }\n\n  private answersChanged(): void {    \n    if(this.selectAnswers && this.answers && this.index != null) {\n      const answer = this.answers[this.index];\n      this.selectedAnswer = this.selectAnswers.find(selectAnswer => selectAnswer.id === answer) || null;\n    }\n  }\n\n  private possibleAnswersChanged(): void {    \n    this.selectedAnswer = null;\n    this.selectAnswers = this.possibleAnswers ? [\n      { id: 0, text: this.getFromPlugin(p => p.translate('pleaseSelect')) },\n      { id: 1, text: this.possibleAnswers.text1 },\n      { id: 2, text: this.possibleAnswers.text2 },\n      { id: 3, text: this.possibleAnswers.text3 },\n      { id: 4, text: this.possibleAnswers.text4 },\n    ] : null;\n\n    // ensure initially provided selected answers are displayed correctly as selected\n    this.answersChanged();\n  }\n\n  private handleSelectChange(event: SelectedItemChangedEvent<number>): void {\n    if(this.selectAnswers) {\n      this.selectedAnswer = this.selectAnswers.find(selectAnswer => selectAnswer.id === event.detail.selectedItem) || null;\n      this.fireEvent(event.detail.selectedItem);\n    }\n  }\n\n  private openCustomSelectAnswerOverlay(event: TouchEvent): void {\n    event.preventDefault();\n    this.displaySelectAnswerOverlay = true;\n  }\n\n  private closeCustomSelectAnswerOverlay(event: CloseCustomSelectAnswerOverlayEvent): void {\n    if(this.selectAnswers && event.detail) {\n      this.selectedAnswer = this.selectAnswers.find(selectItem => event.detail && selectItem.id === event.detail.selectedItem) || null;\n      this.fireEvent(event.detail.selectedItem);\n    }\n    this.displaySelectAnswerOverlay = false;\n  }\n\n  private fireEvent(selectedItem: number): void {\n    DomUtils.fireEvent(this.element, {\n      bubbles: true,\n      detail: {\n        index: this.index,\n        value: selectedItem,\n      },\n      name: 'fitb-answer-changed',\n    });\n  }\n}\n\nexport type FitbAnswerChangedEvent = Event & { detail: IEventDetail };\n\ninterface IEventDetail {\n  index: number;\n  value: number;\n}\n","import { FrameworkConfiguration, PLATFORM } from 'aurelia-framework';\n\nexport function configure(config: FrameworkConfiguration): void {\n  config.globalResources(PLATFORM.moduleName('common/aurelia-components/fill-in-the-blank-select/fill-in-the-blank-select'));\n}\n","import { autoinject, bindable, PLATFORM, useView } from 'aurelia-framework';\nimport { IQuizQuestionDto } from 'common/dto/course/quiz/quiz.question.interface';\nimport { QuestionTheme } from 'common/enum/question-theme.enum';\nimport { DomUtils } from 'common/utils/DomUtils';\nimport { QuestionUtils } from 'common/utils/QuestionUtils';\n\n@autoinject()\n@useView(PLATFORM.moduleName('./fill-in-the-blank.html'))\nexport class FillInTheBlank {\n  @bindable() public answers: number[] | null = null;\n  @bindable() public currentQuestion: IQuizQuestionDto | null = null;\n  @bindable() public disabled = false;\n  @bindable() public voiceOverEnabled = false;\n  @bindable() public revealAnswers = false;\n  @bindable() public theme = QuestionTheme.Exam;\n  @bindable() public fixedDropdownMenu = false;\n  @bindable() public helpTextEnabled = false;\n\n  private questions: [string, string, string] = ['', '', ''];\n  private helpTexts: [string, string, string] = ['', '', ''];\n  private correctAnswers: number[] = [];\n  private element: HTMLElement;\n\n  constructor(element: Element) {\n    this.element = element as HTMLElement;\n  }\n\n  private currentQuestionChanged(): void {\n    if(!this.currentQuestion) return;\n\n    this.questions = QuestionUtils.parseFillInTheBlankQuestion(this.currentQuestion.text);\n    this.helpTexts = QuestionUtils.parseFillInTheBlankHelpText(this.currentQuestion.helpText ?? '');\n    this.correctAnswers = this.currentQuestion.answers.map(a => QuestionUtils.getCorrectAnswerIndexForFillInTheBlankQuestion(a));\n  }\n\n  private handleHelpTextIconClicked(index: number): void {\n    DomUtils.fireEvent<HelpTextIconClickedEvent['detail']>(this.element, {\n      bubbles: false,\n      name: 'help-text-icon-clicked',\n      detail: { index },\n    });\n  }\n}\n\nexport type HelpTextIconClickedEvent = CustomEvent<{ index: number }>;\n","import { PLATFORM, FrameworkConfiguration } from 'aurelia-framework';\n\nexport function configure(config: FrameworkConfiguration): void {\n  config.globalResources(PLATFORM.moduleName('common/aurelia-components/fill-in-the-blank/fill-in-the-blank'));\n}\n","import { PLATFORM, useView } from 'aurelia-framework';\n\n/**\n * sets focus back to the top\n * */\n@useView(PLATFORM.moduleName('./focus-reset.html'))\nexport class FocusReset {\n  private static instance: FocusReset | null = null;\n  private domElement: HTMLElement;\n\n  constructor(element: Element) {\n    this.domElement = element as HTMLElement;\n  }\n\n  public static reset(): void {\n    this.instance?.resetFocus();\n  }\n\n  protected attached(): void {\n    FocusReset.instance = this;\n  }\n\n  protected detached(): void {\n    FocusReset.instance = null;\n  }\n\n  private resetFocus(): void {\n    this.domElement.focus();\n  }\n}","import { FrameworkConfiguration, PLATFORM } from 'aurelia-framework';\n\nexport function configure(config: FrameworkConfiguration): void {\n  config.globalResources(PLATFORM.moduleName('common/aurelia-components/focus-reset/focus-reset'));\n}\n"],"names":[],"sourceRoot":""}