{"version":3,"file":"app-055e39ea.f584a1446b2fc034d810.bundle.js","mappings":"AAGA","sources":["webpack://lernplattform-admin-frontend/./src/resources/elements/api-select-filter-input/api-select-filter-input.html","webpack://lernplattform-admin-frontend/./src/resources/elements/api-text-filter-input/api-text-filter-input.html","webpack://lernplattform-admin-frontend/./src/resources/elements/assessment-code-print-handout/assessment-code-print-handout.html","webpack://lernplattform-admin-frontend/./src/resources/elements/assessment-code-print-list/assessment-code-print-list.html","webpack://lernplattform-admin-frontend/./src/resources/elements/assessment-print-footer/assessment-print-footer.html","webpack://lernplattform-admin-frontend/./src/resources/elements/assessment-print-header/assessment-print-header.html","webpack://lernplattform-admin-frontend/./src/resources/elements/assessment-print-info/assessment-print-info.html","webpack://lernplattform-admin-frontend/./src/resources/elements/assessment-print-sidebar/assessment-print-sidebar.html","webpack://lernplattform-admin-frontend/./src/resources/elements/assessment-print-template/assessment-print-template.html","webpack://lernplattform-admin-frontend/./src/resources/elements/assign-courses-form/assign-courses-form.html","webpack://lernplattform-admin-frontend/./src/resources/elements/assign-learning-journeys-form/assign-learning-journeys-form.html","webpack://lernplattform-admin-frontend/./src/resources/elements/assign-learning-journeys-to-students-form/assign-learning-journeys-to-students-form.html","webpack://lernplattform-admin-frontend/./src/resources/elements/assign-skills-form/assign-skills-form.html","webpack://lernplattform-admin-frontend/./src/resources/elements/assign-students-form/assign-students-form.html","webpack://lernplattform-admin-frontend/./src/resources/elements/assign-tenants-form/assign-tenants-form.html","webpack://lernplattform-admin-frontend/./src/resources/elements/audio-select-form/audio-select-form.html","webpack://lernplattform-admin-frontend/./src/resources/elements/avatar-component-set-editor/avatar-component-set-editor.html","webpack://lernplattform-admin-frontend/./src/resources/elements/button-standard/button-standard.html","webpack://lernplattform-admin-frontend/./src/resources/elements/api-select-filter-input/api-select-filter-input.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/api-select-filter-input/index.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/api-text-filter-input/api-text-filter-input.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/api-text-filter-input/index.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/assessment-code-print-handout/assessment-code-print-handout.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/assessment-code-print-list/assessment-code-print-list.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/assessment-print-footer/assessment-print-footer.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/assessment-print-header/assessment-print-header.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/assessment-print-info/assessment-print-info.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/assessment-print-sidebar/assessment-print-sidebar.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/assessment-print-template/assessment-print-template.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/assign-courses-form/assign-courses-form.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/assign-learning-journeys-form/assign-learning-journeys-form.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/assign-learning-journeys-to-students-form/assign-learning-journeys-to-students-form.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/assign-skills-form/assign-skills-form.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/assign-students-form/assign-students-form.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/assign-tenants-form/assign-tenants-form.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/audio-select-form/audio-select-form.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/avatar-component-set-editor/avatar-component-set-editor.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/button-standard/button-standard.ts"],"sourcesContent":["// Module\nvar code = \"<template class=\\\"api-select-filter-input api-select-filter-input--theme-${theme}\\\"> <div class=\\\"form-group\\\"> <label if.to-view=\\\"showLabel\\\" class=\\\"form-label\\\" t.to-view=\\\"labelTk\\\"></label> <select class=\\\"custom-select\\\" disabled.to-view=\\\"readonly\\\" change.delegate=\\\"handleChanged($event)\\\" value.to-view=\\\"value\\\" t=\\\"[aria-label]globals.filterBy\\\" t-params.to-view=\\\"{ key: labelTk }\\\"> <option t.to-view=\\\"placeholderTk\\\" class=\\\"api-select-filter-input__placeholder\\\" value=\\\"\\\"></option> <option repeat.for=\\\"option of options\\\" selected.to-view=\\\"option.value === value\\\" value.to-view=\\\"option.value\\\" t.to-view=\\\"option.key || option.keyTk\\\" t-params.to-view=\\\"option.tkParams\\\"></option> </select> </div> </template>\";\n// Exports\nexport default code;","// Module\nvar code = \"<template class=\\\"api-text-filter-input api-text-filter-input--theme-${theme}\\\"> <div class=\\\"form-group\\\"> <label if.to-view=\\\"showLabel\\\" class=\\\"form-label\\\" t.to-view=\\\"labelTk\\\"></label> <div class=\\\"input-group flex-nowrap\\\"> <input ref=\\\"input\\\" t.to-view=\\\"'[placeholder]' + placeholderTk + ';[aria-label]globals.filterBy'\\\" class=\\\"form-control\\\" t-params.to-view=\\\"{ key: labelTk }\\\" readonly.to-view=\\\"readonly\\\" change.delegate=\\\"handleChanged()\\\" blur.trigger=\\\"handleChanged()\\\" input.delegate=\\\"handleInput()\\\" type.to-view=\\\"type\\\" value.two-way=\\\"value\\\"> <span if.to-view=\\\"value\\\" class=\\\"input-group-append\\\"> <button class=\\\"btn btn-secondary m-0 p-0\\\" readonly.to-view=\\\"readonly\\\" click.delegate=\\\"clear()\\\" type=\\\"button\\\"> <safe-icon class=\\\"api-text-filter-input__clear\\\" icon-name=\\\"System/Close\\\"></safe-icon> </button> </span> </div> </div> </template>\";\n// Exports\nexport default code;","// Module\nvar code = \"<template class=\\\"assessment-code-print-handout\\\"> <assessment-print-template multiline-footer.to-view=\\\"true\\\"> <assessment-print-header slot=\\\"header\\\"></assessment-print-header> <main class=\\\"assessment-code-print-handout__content\\\" slot=\\\"body\\\"> <div class=\\\"assessment-code-print-handout__body\\\"> <h2 class=\\\"assessment-code-print-handout__content-title\\\" t=\\\"elements.assessmentCodePrintHandout.title\\\"></h2> <p class=\\\"assessment-code-print-handout__content-text\\\" t=\\\"elements.assessmentCodePrintHandout.description\\\"></p> <div class=\\\"assessment-code-print-handout__code-area\\\"> <p class=\\\"assessment-code-print-handout__code-area-text\\\" t=\\\"elements.assessmentCodePrintHandout.codeText\\\"></p> <p class=\\\"assessment-code-print-handout__code-area-code\\\">${code}</p> </div> <ol class=\\\"assessment-code-print-handout__content-list mt-5\\\"> <li class=\\\"assessment-code-print-handout__content-text mb-3\\\" t=\\\"elements.assessmentCodePrintHandout.instructions1\\\"></li> <a class=\\\"assessment-code-print-handout__content-link mb-4 d-flex\\\" href.to-view=\\\"ufeAssessmentLink\\\">${ufeAssessmentLink}</a> <li class=\\\"assessment-code-print-handout__content-text mb-4\\\" t=\\\"elements.assessmentCodePrintHandout.instructions2\\\"></li> <li class=\\\"assessment-code-print-handout__content-text mb-4\\\" t=\\\"elements.assessmentCodePrintHandout.instructions3\\\"></li> </ol> </div> <assessment-print-sidebar></assessment-print-sidebar> </main> <assessment-print-footer slot=\\\"footer\\\" text-left.to-view=\\\"footerTextLeft\\\" text-right.to-view=\\\"footerTextRight\\\"></assessment-print-footer> </assessment-print-template> </template>\";\n// Exports\nexport default code;","// Module\nvar code = \"<template class=\\\"assessment-code-print-list\\\"> <assessment-print-template multiline-footer.to-view=\\\"true\\\"> <header class=\\\"class=assessment-code-print-list__header\\\" slot=\\\"header\\\"> <div class=\\\"assessment-code-print-list__header-title-group\\\"> <h1 class=\\\"assessment-code-print-list__header-title-group-text\\\" t=\\\"elements.assessmentCodePrintList.assessmentCodesForAssessmentDate\\\" t-params.to-view=\\\"{ date: plannedDate }\\\"></h1> <p class=\\\"assessment-code-print-list__header-title-group-text\\\" t=\\\"elements.assessmentCodePrintList.school\\\"></p> <div class=\\\"assessment-code-print-list__header-title-group-school-line\\\"></div> </div> <div class=\\\"assessment-code-print-list__header-content\\\"> <img class=\\\"assessment-code-print-list__header-logo\\\" src.to-view=\\\"logo\\\"> <div class=\\\"assessment-code-print-list__header-qr-group\\\"> <p class=\\\"assessment-code-print-list__header-qr-group-title\\\" t=\\\"elements.assessmentCodePrintList.qrTitle\\\"></p> <img class=\\\"assessment-code-print-list__header-qr-group-qr\\\" src.to-view=\\\"qrCodeDataUrl\\\"> <a class=\\\"assessment-code-print-list__header-qr-group-link\\\" href.to-view=\\\"loginUrl\\\">${formatUrl(loginUrl)}</a> </div> </div> </header> <table class=\\\"assessment-code-print-list__table\\\" slot=\\\"body\\\"> <thead> <tr> <th class=\\\"assessment-code-print-list__table-head\\\" t=\\\"elements.assessmentCodePrintList.assessmentCodes\\\"></th> <th class=\\\"assessment-code-print-list__table-head\\\" t=\\\"elements.assessmentCodePrintList.name\\\"></th> <th class=\\\"assessment-code-print-list__table-head\\\" t=\\\"elements.assessmentCodePrintList.notes\\\"></th> </tr> </thead> <tbody> <tr repeat.for=\\\"code of codes\\\" class=\\\"assessment-code-print-list__table-row\\\"> <td class=\\\"assessment-code-print-list__table-data\\\">${code}</td> <td></td> <td></td> </tr> </tbody> </table> <assessment-print-footer slot=\\\"footer\\\" text-left.to-view=\\\"footerTextLeft\\\" text-right.to-view=\\\"footerTextRight\\\"></assessment-print-footer> </assessment-print-template> </template>\";\n// Exports\nexport default code;","// Module\nvar code = \"<template> <footer class=\\\"assessment-print-footer\\\"> <section if.to-view=\\\"textRight && textLeft\\\" class=\\\"assessment-print-footer__info\\\"> <div class=\\\"assessment-print-footer__info-group\\\"> <h2 class=\\\"assessment-print-footer__info-title\\\" t.to-view=\\\"textLeft.titleTk\\\"></h2> <h3 class=\\\"assessment-print-footer__info-sub-title\\\" t.to-view=\\\"textLeft.subtitleTitleTk\\\"></h3> <p class=\\\"assessment-print-footer__info-text\\\" t.to-view=\\\"textLeft.descriptionTk\\\"></p> </div> <div class=\\\"assessment-print-footer__info-group\\\"> <h2 class=\\\"assessment-print-footer__info-title\\\" t.to-view=\\\"textRight.titleTk\\\"></h2> <h3 class=\\\"assessment-print-footer__info-sub-title\\\" t.to-view=\\\"textRight.subtitleTitleTk\\\"></h3> <p class=\\\"assessment-print-footer__info-text\\\" t.to-view=\\\"textRight.descriptionTk\\\"></p> </div> </section> <section class=\\\"assessment-print-footer__logos\\\"> <img class=\\\"assessment-print-footer__logos-image\\\" src.to-view=\\\"logoOJRK\\\"> <img repeat.for=\\\"logo of partnerLogos\\\" class=\\\"assessment-print-footer__logos-image assessment-print-footer__logos-image--partner\\\" src.to-view=\\\"logo\\\"> </section> </footer> </template>\";\n// Exports\nexport default code;","// Module\nvar code = \"<template class=\\\"assessment-print-header\\\"> <header class=\\\"assessment-print-header__content\\\" slot=\\\"header\\\"> <div class=\\\"assessment-print-header__title-group\\\"> <img class=\\\"assessment-print-header__logo\\\" src.to-view=\\\"logo\\\"> <h1 t=\\\"globals.assessment\\\" class=\\\"assessment-print-header__title\\\"></h1> </div> <img class=\\\"assessment-print-header__image\\\" src.to-view=\\\"image\\\"> </header> </template>\";\n// Exports\nexport default code;","// Module\nvar code = \"<template class=\\\"assessment-print-info\\\"> <assessment-print-template> <assessment-print-header slot=\\\"header\\\"></assessment-print-header> <main class=\\\"assessment-print-info__content\\\" slot=\\\"body\\\"> <div class=\\\"assessment-print-info__body\\\"> <h2 t=\\\"elements.assessmentPrintInfo.title\\\" class=\\\"assessment-print-info__content-title\\\"></h2> <p class=\\\"assessment-print-info__content-text mb-3\\\" t=\\\"elements.assessmentPrintInfo.appDescription1\\\"></p> <p class=\\\"assessment-print-info__content-text\\\" t=\\\"elements.assessmentPrintInfo.appDescription2\\\"></p> <h2 class=\\\"assessment-print-info__info-title mt-6\\\" t=\\\"elements.assessmentPrintInfo.dataProtectionTitle\\\"></h2> <h3 class=\\\"assessment-print-info__info-sub-title\\\" t=\\\"elements.assessmentPrintInfo.dataProtectionSubTitle\\\"></h3> <p class=\\\"assessment-print-info__info-text\\\" t=\\\"elements.assessmentPrintInfo.dataProtectionDescription\\\"></p> <h2 class=\\\"assessment-print-info__info-title mt-6\\\" t=\\\"elements.assessmentPrintInfo.accessTitle\\\"></h2> <h3 class=\\\"assessment-print-info__info-sub-title\\\" t=\\\"elements.assessmentPrintInfo.accessSubTitle\\\"></h3> <p class=\\\"assessment-print-info__info-text\\\" t=\\\"elements.assessmentPrintInfo.accessDescription\\\"></p> </div> <assessment-print-sidebar show-login-link.to-view=\\\"true\\\"></assessment-print-sidebar> </main> <assessment-print-footer slot=\\\"footer\\\"></assessment-print-footer> </assessment-print-template> </template>\";\n// Exports\nexport default code;","// Module\nvar code = \"<template class=\\\"assessment-print-sidebar\\\"> <aside class=\\\"assessment-print-sidebar__content\\\"> <h3 class=\\\"assessment-print-sidebar__title mb-7\\\" t=\\\"elements.assessmentPrintSidebar.sideBarTitle\\\"></h3> <template if.to-view=\\\"showLoginLink\\\"> <p class=\\\"assessment-print-sidebar__sub-title mb-2\\\" t=\\\"elements.assessmentPrintSidebar.loginQrTitle\\\"></p> <img class=\\\"mb-2\\\" src.to-view=\\\"ufeLoginQrCode\\\"> <a href.to-view=\\\"ufeLoginLink\\\" class=\\\"assessment-print-sidebar__content-link mb-7 d-flex\\\">${formatUrl(ufeLoginLink)}</a> </template> <p class=\\\"assessment-print-sidebar__sub-title mb-2\\\" t=\\\"elements.assessmentPrintSidebar.assessmentQrTitle\\\"></p> <img class=\\\"mb-2\\\" src.to-view=\\\"ufeAssessmentQrCode\\\"> <a href.to-view=\\\"ufeAssessmentLink\\\" class=\\\"assessment-print-sidebar__content-link d-flex\\\">${formatUrl(ufeAssessmentLink)}</a> <p class=\\\"assessment-print-sidebar__sub-title mb-1 mt-7\\\" t=\\\"elements.assessmentPrintSidebar.appTitle\\\"></p> <h3 t=\\\"elements.assessmentPrintSidebar.appSubTitle\\\" class=\\\"assessment-print-sidebar__title mb-2\\\"></h3> <p class=\\\"assessment-print-sidebar__content-text mb-3\\\" t=\\\"elements.assessmentPrintSidebar.appDescription\\\"></p> <div class=\\\"assessment-print-sidebar__badges\\\"> <a href.to-view=\\\"appStoreLink\\\" class=\\\"assessment-print-sidebar__badge\\\"> <img src.to-view=\\\"appStoreBadge\\\"> </a> <a href.to-view=\\\"googlePlayLink\\\" class=\\\"assessment-print-sidebar__badge\\\"> <img src.to-view=\\\"googlePlayBadge\\\"> </a> </div> </aside> </template>\";\n// Exports\nexport default code;","// Module\nvar code = \"<template class=\\\"assessment-print-template ${ multilineFooter ? 'assessment-print-template--multiline-footer' : '' }\\\"> <table class=\\\"assessment-print-template__table\\\"> <thead> <tr> <td> <div class=\\\"assessment-print-template__header-placeholder\\\">&nbsp;</div> </td> </tr> </thead> <tbody class=\\\"assessment-print-template__table-body\\\"> <tr> <td> <slot name=\\\"body\\\"></slot> </td> </tr> </tbody> <tfoot> <tr> <td> <div class=\\\"assessment-print-template__footer-placeholder\\\">&nbsp;</div> </td> </tr> </tfoot> </table> <div class=\\\"assessment-print-template__header\\\"> <slot name=\\\"header\\\"></slot> </div> <div class=\\\"assessment-print-template__footer\\\"> <slot name=\\\"footer\\\"></slot> </div> </template>\";\n// Exports\nexport default code;","// Module\nvar code = \"<template> <form submit.trigger=\\\"saveCourses()\\\" class=\\\"card assign-courses-form\\\"> <div class=\\\"card-header\\\"> <h2 class=\\\"card-title\\\" t=\\\"elements.assignCoursesForm.title\\\"></h2> </div> <div class=\\\"card-body assign-courses-form__columns ${ canSelectExamDate ? 'assign-courses-form__columns--extra-space' : '' }\\\"> <div class=\\\"form-group\\\"> <label class=\\\"form-label\\\" t=\\\"elements.assignCoursesForm.selectCourses\\\"></label> <text-tags-widget table-columns.to-view=\\\"courseTableColumns\\\" fixed-height.to-view=\\\"true\\\" table-data.to-view=\\\"foundCourses\\\" tags.to-view=\\\"selectedCoursesTags\\\" is-selected-callback.call=\\\"isCourseSelected($event)\\\" tags-edited.trigger=\\\"handleCourseEntryRemoved($event)\\\" entry-selected.trigger=\\\"handleCourseEntrySelected($event)\\\" search-string-changed.trigger=\\\"handleCourseSearchStringChanged($event)\\\" should-list-stay-open.to-view=\\\"true\\\" mark-selected.to-view=\\\"true\\\"></text-tags-widget> </div> <div class=\\\"form-group assign-courses-form__column\\\"> <div class=\\\"assign-courses-form__list-header\\\"> <label class=\\\"form-label\\\" t=\\\"elements.assignCoursesForm.selectedCourses\\\"></label> <label if.to-view=\\\"canSelectRequired\\\" class=\\\"form-label\\\" t=\\\"globals.assignAs\\\"></label> <label if.to-view=\\\"canSelectAvailability\\\" class=\\\"form-label\\\" t=\\\"globals.visibility\\\"></label> <label if.to-view=\\\"canSelectExamDate\\\" class=\\\"form-label\\\" t=\\\"globals.examdate\\\"></label> </div> <ul if.to-view=\\\"selectedCourses.length\\\" class=\\\"assign-courses-form__list\\\"> <li repeat.for=\\\"course of selectedCourses\\\" class=\\\"assign-courses-form__list-item\\\"> <div class=\\\"assign-courses-form__list-item-content\\\"> <div class=\\\"assign-courses-form__list-title\\\">${course.title}</div> <div if.to-view=\\\"canSelectRequired\\\" class=\\\"assign-courses-form__list-radio-group\\\"> <div class=\\\"custom-control custom-radio\\\"> <input class=\\\"custom-control-input\\\" type=\\\"radio\\\" id=\\\"learningJourneyCourseDialogRadio-${$index}-1\\\" name=\\\"learningJourneyCourseDialogRadio-${$index}\\\" model.bind=\\\"true\\\" checked.two-way=\\\"course.required\\\"> <label class=\\\"custom-control-label\\\" for=\\\"learningJourneyCourseDialogRadio-${$index}-1\\\" t=\\\"globals.required\\\"></label> </div> <div class=\\\"custom-control custom-radio\\\"> <input class=\\\"custom-control-input\\\" type=\\\"radio\\\" id=\\\"learningJourneyCourseDialogRadio-${$index}-2\\\" name=\\\"learningJourneyCourseDialogRadio-${$index}\\\" model.bind=\\\"false\\\" checked.two-way=\\\"course.required\\\"> <label class=\\\"custom-control-label\\\" for=\\\"learningJourneyCourseDialogRadio-${$index}-2\\\" t=\\\"globals.optional\\\"></label> </div> </div> <template if.to-view=\\\"canSelectPriceAndAvailability\\\"> <div class=\\\"form-group assign-courses-form__list-input\\\"> <select class=\\\"custom-select\\\" value.two-way=\\\"course.availabilityType\\\"> <option repeat.for=\\\"availabilityType of availabilityTypes\\\" model.to-view=\\\"availabilityType\\\" t=\\\"globals.availabilityType.${availabilityType}\\\"></option> </select> </div> </template> <div if.to-view=\\\"canSelectExamDate\\\" class=\\\"form-group assign-courses-form__list-input\\\"> <date-input mode=\\\"date\\\" positioning-strategy=\\\"fixed\\\" value.two-way=\\\"course.examDate\\\" can-clear.to-view=\\\"true\\\" is-invalid.to-view=\\\"!!getExamDateErrorOrNull(course.courseId, course.examDate)\\\"></date-input> <div if.to-view=\\\"getExamDateErrorOrNull(course.courseId, course.examDate)\\\" class=\\\"invalid-feedback d-block\\\" t=\\\"${getExamDateErrorOrNull(course.courseId, course.examDate)}\\\"></div> <small class=\\\"form-text text-muted\\\">${getExamDateInfoText(course)}</small> </div> </div> <button-standard click.delegate=\\\"handleRemoveCourseClick(course)\\\" class=\\\"form-group assign-courses-form__list-btn\\\" btn-type=\\\"outline\\\" icon-name=\\\"System/Tabler/Trash\\\" btn-color=\\\"danger\\\"></button-standard> </li> </ul> <p else class=\\\"text-center text-muted assign-courses-form__list-empty\\\" t=\\\"elements.assignCoursesForm.noSelectedCourses\\\"></p> </div> </div> <div class=\\\"card-footer text-right\\\"> <button class=\\\"btn btn-primary\\\" type=\\\"submit\\\" disabled.to-view=\\\"!selectedCourses.length\\\" t=\\\"globals.save\\\"></button> <button class=\\\"btn btn-secondary\\\" click.delegate=\\\"cancel()\\\" t=\\\"globals.cancel\\\"></button> </div> </form> </template>\";\n// Exports\nexport default code;","// Module\nvar code = \"<template> <form submit.trigger=\\\"saveLearningJourneys()\\\" class=\\\"card assign-learning-journeys-form\\\"> <div class=\\\"card-header\\\"> <h2 class=\\\"card-title\\\" t=\\\"elements.assignLearningJourneysForm.title\\\"></h2> </div> <div class=\\\"card-body assign-learning-journeys-form__columns\\\"> <div class=\\\"form-group\\\"> <label class=\\\"form-label\\\" t=\\\"elements.assignLearningJourneysForm.selectLearningJourney\\\"></label> <search-and-select if.to-view=\\\"searchSelectLearningJourneys\\\" data.to-view=\\\"searchSelectLearningJourneys\\\" class=\\\"w-100\\\" max-items.to-view=\\\"20\\\" sas-item-changed.trigger=\\\"onLearningJourneySelected($event)\\\" t=\\\"[label]globals.searchSelect\\\"></search-and-select> </div> <div class=\\\"form-group assign-learning-journeys-form__column\\\"> <div class=\\\"assign-learning-journeys-form__list-header\\\"> <label class=\\\"form-label\\\" t=\\\"elements.assignLearningJourneysForm.selectedLearningJourneys\\\"></label> <label if.to-view=\\\"showRadios\\\" class=\\\"form-label\\\" t=\\\"globals.assignAs\\\"></label> </div> <ul if.to-view=\\\"selectedLearningJourneys.length\\\" class=\\\"assign-learning-journeys-form__list\\\"> <li repeat.for=\\\"learningJourney of selectedLearningJourneys\\\" class=\\\"assign-learning-journeys-form__list-item\\\"> <div class=\\\"assign-learning-journeys-form__list-item-content\\\"> <a class=\\\"assign-learning-journeys-form__list-title\\\" href=\\\"javascript:void(0);\\\" click.delegate=\\\"navigateToLearningJourney(learningJourney)\\\">${learningJourney.learningJourneyTitle}</a> <div if.to-view=\\\"showRadios\\\" class=\\\"assign-learning-journeys-form__list-radio-group\\\"> <div class=\\\"custom-control custom-radio\\\"> <input class=\\\"custom-control-input\\\" type=\\\"radio\\\" id=\\\"assignLearningJourneyRadio-${$index}-1\\\" name=\\\"assignLearningJourneyRadio-${$index}\\\" model.bind=\\\"true\\\" change.trigger=\\\"radioOptionChanged = true\\\" checked.two-way=\\\"learningJourney.coursesRequired\\\"> <label class=\\\"custom-control-label\\\" for=\\\"assignLearningJourneyRadio-${$index}-1\\\" t=\\\"globals.required\\\"></label> </div> <div class=\\\"custom-control custom-radio\\\"> <input class=\\\"custom-control-input\\\" type=\\\"radio\\\" id=\\\"assignLearningJourneyRadio-${$index}-2\\\" name=\\\"assignLearningJourneyRadio-${$index}\\\" model.bind=\\\"false\\\" change.trigger=\\\"radioOptionChanged = true\\\" checked.two-way=\\\"learningJourney.coursesRequired\\\"> <label class=\\\"custom-control-label\\\" for=\\\"assignLearningJourneyRadio-${$index}-2\\\" t=\\\"globals.optional\\\"></label> </div> </div> </div> <button-standard click.delegate=\\\"handleRemoveLearningJourneyClick(learningJourney)\\\" btn-type=\\\"outline\\\" icon-name=\\\"System/Tabler/Trash\\\" btn-color=\\\"danger\\\"></button-standard> </li> </ul> <p else class=\\\"text-center text-muted assign-learning-journeys-form__list-empty\\\" t=\\\"elements.assignLearningJourneysForm.noSelectedLearningJourneys\\\"></p> </div> </div> <div class=\\\"card-footer text-right\\\"> <button class=\\\"btn btn-primary\\\" type=\\\"submit\\\" disabled.to-view=\\\"!isDirty\\\" t=\\\"globals.save\\\"></button> <button if.to-view=\\\"canCancel\\\" class=\\\"btn btn-secondary\\\" click.delegate=\\\"cancel()\\\" t=\\\"globals.cancel\\\"></button> </div> </form> </template>\";\n// Exports\nexport default code;","// Module\nvar code = \"<template> <assign-learning-journeys-form learning-journeys.to-view=\\\"studentsLearningJourneys\\\" can-cancel.to-view=\\\"canCancel\\\" cancel-clicked.trigger=\\\"cancel()\\\" save-clicked.trigger=\\\"saveLearningJourneys($event)\\\"></assign-learning-journeys-form> </template>\";\n// Exports\nexport default code;","// Module\nvar code = \"<template> <form submit.trigger=\\\"saveSkills()\\\" class=\\\"card assign-skills-form\\\"> <div class=\\\"card-header\\\"> <h2 class=\\\"card-title\\\" t=\\\"elements.assignSkillsForm.title\\\"></h2> </div> <div class=\\\"card-body assign-skills-form__columns\\\"> <div class=\\\"form-group\\\"> <label class=\\\"form-label\\\" t=\\\"elements.assignSkillsForm.selectSkill\\\"></label> <search-and-select if.to-view=\\\"searchSelectSkills\\\" data.to-view=\\\"searchSelectSkills\\\" class=\\\"w-100\\\" max-items.to-view=\\\"20\\\" sas-item-changed.trigger=\\\"onSkillSelected($event)\\\" t=\\\"[label]globals.searchSelect\\\"></search-and-select> </div> <div class=\\\"form-group assign-skills-form__column\\\"> <label class=\\\"form-label\\\" t=\\\"elements.assignSkillsForm.selectedSkills\\\"></label> <ul if.to-view=\\\"selectedSkills.length\\\" class=\\\"assign-skills-form__list\\\"> <li repeat.for=\\\"skill of selectedSkills\\\" class=\\\"assign-skills-form__list-item\\\"> <div class=\\\"assign-skills-form__list-item-content\\\"> <skill-icon class=\\\"assign-skills-form__list-icon\\\" icon-key.to-view=\\\"skill.iconKey\\\"></skill-icon> <a class=\\\"assign-skills-form__list-title\\\" href=\\\"javascript:void(0);\\\" click.delegate=\\\"navigateToSkill(skill)\\\">${skill.title}</a> </div> <button-standard click.delegate=\\\"handleRemoveSkillClick(skill)\\\" btn-type=\\\"outline\\\" icon-name=\\\"System/Tabler/Trash\\\" btn-color=\\\"danger\\\"></button-standard> </li> </ul> <p else class=\\\"text-center text-muted assign-skills-form__list-empty\\\" t=\\\"elements.assignSkillsForm.noSelectedSkills\\\"></p> </div> </div> <div class=\\\"card-footer text-right\\\"> <button class=\\\"btn btn-primary\\\" type=\\\"submit\\\" disabled.to-view=\\\"!isDirty\\\" t=\\\"globals.save\\\"></button> <button if.to-view=\\\"canCancel\\\" class=\\\"btn btn-secondary\\\" click.delegate=\\\"cancel()\\\" t=\\\"globals.cancel\\\"></button> </div> </form> </template>\";\n// Exports\nexport default code;","// Module\nvar code = \"<template> <form submit.trigger=\\\"saveStudents()\\\" class=\\\"card assign-students-form\\\"> <div class=\\\"card-header\\\"> <h1 class=\\\"card-title\\\" t=\\\"globals.assignStudents\\\"></h1> </div> <div class=\\\"card-body assign-students-form__columns\\\"> <user-select users.two-way=\\\"selectedStudents\\\"></user-select> <div class=\\\"form-group assign-students-form__column\\\"> <div class=\\\"assign-students-form__list-header\\\"> <label class=\\\"form-label\\\" t=\\\"dialogs.assignStudentsToTenants.selectedUsers\\\"></label> <label if.to-view=\\\"showRadios\\\" class=\\\"form-label\\\" t=\\\"globals.assignAs\\\"></label> </div> <ul if.to-view=\\\"selectedStudents.length\\\" class=\\\"assign-students-form__list\\\"> <li repeat.for=\\\"student of selectedStudents\\\" class=\\\"assign-students-form__list-item\\\"> <div class=\\\"assign-students-form__list-item-content\\\"> <div class=\\\"assign-students-form__list-title\\\">${getFullName(student)}</div> </div> <button-standard click.delegate=\\\"handleRemoveStudentClick(student)\\\" class=\\\"form-group assign-students-form__list-btn\\\" btn-type=\\\"outline\\\" icon-name=\\\"System/Tabler/Trash\\\" btn-color=\\\"danger\\\"></button-standard> </li> </ul> <p else class=\\\"text-center text-muted assign-students-form__list-empty\\\" t=\\\"dialogs.assignStudentsToTenants.noSelectedUsers\\\"></p> </div> </div> <div class=\\\"card-footer text-right\\\"> <button class=\\\"btn btn-primary\\\" type=\\\"submit\\\" disabled.to-view=\\\"!selectedStudents.length\\\" t=\\\"globals.save\\\"></button> <button class=\\\"btn btn-secondary\\\" click.delegate=\\\"cancel()\\\" t=\\\"globals.cancel\\\"></button> </div> </form> </template>\";\n// Exports\nexport default code;","// Module\nvar code = \"<template> <form submit.trigger=\\\"saveTenants()\\\" class=\\\"card assign-tenants-form\\\"> <div class=\\\"card-header\\\"> <h1 class=\\\"card-title\\\" t=\\\"elements.assignTenantsForm.title\\\"></h1> </div> <div class=\\\"card-body assign-tenants-form__columns ${ canSelectAvailability ? 'assign-tenants-form__columns--vertical' : '' }\\\"> <div class=\\\"form-group\\\"> <label class=\\\"form-label\\\" t=\\\"elements.assignTenantsForm.selectTenant\\\"></label> <search-and-select if.to-view=\\\"searchSelectTenants\\\" data.to-view=\\\"searchSelectTenants\\\" class=\\\"w-100\\\" max-items.to-view=\\\"20\\\" sas-item-changed.trigger=\\\"onTenantSelected($event)\\\" t=\\\"[label]globals.searchSelect\\\"></search-and-select> </div> <div class=\\\"form-group assign-tenants-form__column\\\"> <div class=\\\"assign-tenants-form__list-header\\\"> <label class=\\\"form-label\\\" t=\\\"elements.assignTenantsForm.selectedTenants\\\"></label> <label if.to-view=\\\"canSelectAvailability\\\" class=\\\"form-label\\\" t=\\\"globals.visibility\\\"></label> </div> <ul if.to-view=\\\"selectedTenants.length\\\" class=\\\"assign-tenants-form__list\\\"> <li repeat.for=\\\"tenant of selectedTenants\\\" class=\\\"assign-tenants-form__list-item\\\"> <div class=\\\"assign-tenants-form__list-item-content\\\"> <div class=\\\"assign-tenants-form__list-title\\\">${tenant.name}</div> <template if.to-view=\\\"canSelectAvailability\\\"> <div class=\\\"form-group assign-tenants-form__list-input\\\"> <select class=\\\"custom-select\\\" change.trigger=\\\"anyInputChanged = true\\\" value.two-way=\\\"tenant.availabilityType\\\"> <option repeat.for=\\\"availabilityType of availabilityTypes\\\" model.to-view=\\\"availabilityType\\\" t=\\\"globals.availabilityType.${availabilityType}\\\"></option> </select> </div> </template> </div> <button-standard click.delegate=\\\"handleRemoveTenantClick(tenant)\\\" class=\\\"form-group assign-tenants-form__list-btn\\\" btn-type=\\\"outline\\\" icon-name=\\\"System/Tabler/Trash\\\" btn-color=\\\"danger\\\"></button-standard> </li> </ul> <p else class=\\\"text-center text-muted assign-tenants-form__list-empty\\\" t=\\\"elements.assignTenantsForm.noSelectedTenants\\\"></p> </div> </div> <div class=\\\"card-footer text-right\\\"> <button class=\\\"btn btn-primary\\\" type=\\\"submit\\\" disabled.to-view=\\\"!isDirty\\\" t=\\\"globals.save\\\"></button> <button class=\\\"btn btn-secondary\\\" click.delegate=\\\"cancel()\\\" t=\\\"globals.cancel\\\"></button> </div> </form> </template>\";\n// Exports\nexport default code;","// Module\nvar code = \"<template class=\\\"row\\\"> <div class=\\\"col-12\\\"> <label class=\\\"form-label\\\">${title}</label> </div> <div class=\\\"col-8\\\"> <div class=\\\"form-group\\\"> <div if.to-view=\\\"audioUrl\\\" class=\\\"d-flex align-items-center mb-2\\\"> <audio-service-button class=\\\"mr-2\\\" btn-type.to-view=\\\"`inverted`\\\" btn-state.to-view=\\\"`highlighted`\\\" src.to-view=\\\"audioUrl\\\"></audio-service-button> <div class=\\\"d-flex flex-column\\\"> <p if.to-view=\\\"showTitle\\\" class=\\\"mb-0 text-muted\\\" t=\\\"elements.audioSelectForm.fileTitle\\\" t-params.to-view=\\\"{ fileTitle: fileTitle }\\\"></p> <p class=\\\"mb-0 text-muted\\\" t=\\\"elements.audioSelectForm.fileName\\\" t-params.to-view=\\\"{ fileName: fileName }\\\"></p> </div> </div> <x-icon if.to-view=\\\"!audioUrl\\\" class=\\\"audio-select-form__icon mb-2\\\" size=\\\"unspecified\\\" icon-type=\\\"custom\\\" icon-name=\\\"System/Controls/VoiceOver\\\"> </x-icon> </div> </div> <div class=\\\"col-4\\\"> <div class=\\\"form-group\\\"> <button class=\\\"btn btn-secondary btn-sm w-100 mb-2\\\" click.delegate=\\\"handleSelectAudio()\\\" t=\\\"elements.audioSelectForm.${audioUrl ? `editAudio` : `selectAudio`}\\\"></button> <button if.to-view=\\\"audioUrl\\\" class=\\\"btn btn-danger btn-sm w-100\\\" click.delegate=\\\"handleDeleteAudio()\\\" t=\\\"globals.delete\\\"></button> </div> </div> </template>\";\n// Exports\nexport default code;","// Module\nvar code = \"<template> <div class=\\\"avatar-component-set-editor\\\"> <div if.to-view=\\\"editExisting\\\" class=\\\"avatar-component-set-editor__header\\\"> <div class=\\\"avatar-component-set-editor__header-title-bar\\\"> <div class=\\\"avatar-component-set-editor__header-title\\\"> ${storedSet.name} </div> <div class=\\\"avatar-component-set-editor__header-buttons-wrapper\\\"> <button-standard class=\\\"avatar-component-set-editor__header-button\\\" btn-type=\\\"outline\\\" disabled.to-view=\\\"buttonsDisabled\\\" click.delegate=\\\"deleteSet()\\\" t=\\\"[btnText]elements.avatar-component-set-editor.delete\\\" icon-name=\\\"System/Trash\\\" btn-color=\\\"danger\\\"></button-standard> </div> </div> </div> <div class=\\\"avatar-component-set-editor__content-wrapper\\\"> <div if.to-view=\\\"editExisting\\\" class=\\\"avatar-component-set-editor__content-header\\\"> <div class=\\\"avatar-component-set-editor__content-header-title\\\" t=\\\"globals.avatarComponentSet\\\"></div> <div class=\\\"avatar-component-set-editor__content-header-sub-title\\\" t=\\\"elements.avatar-component-set-editor.id\\\" t-params.to-view=\\\"{importId: storedSet.importId}\\\"></div> </div> <div if.to-view=\\\"!editExisting\\\" class=\\\"avatar-component-set-editor__content-header avatar-component-set-editor__content-header--no-subtitle-mode avatar-component-set-editor__content-header-title avatar-component-set-editor__content-header-title--no-subtitle-mode\\\" t=\\\"elements.avatar-component-set-editor.newSet\\\"> </div> <div class=\\\"avatar-component-set-editor__content-body ${ editExisting ? '' : 'avatar-component-set-editor__content-body--vertical-mode' }\\\"> <div class=\\\"avatar-component-set-editor__content-body-left ${ editExisting ? '' : 'avatar-component-set-editor__content-body-left--vertical-mode' }\\\"> <label class=\\\"form-group\\\"> <div class=\\\"form-label\\\" t=\\\"globals.id\\\"></div> <input type=\\\"text\\\" class=\\\"form-control ${errorTks.importId ? 'is-invalid' : ''}\\\" t=\\\"[placeholder]globals.id\\\" input.trigger=\\\"errorTks.importId = null\\\" value.two-way=\\\"setImportId\\\"> <div if.to-view=\\\"errorTks.importId != null\\\" class=\\\"invalid-feedback d-flex\\\" t=\\\"${errorTks.importId.errorTk}\\\" t-params.to-view=\\\"errorTks.importId.errorTkParams\\\"></div> </label> <label class=\\\"form-group\\\"> <div class=\\\"form-label\\\" t=\\\"globals.name\\\"></div> <input type=\\\"text\\\" class=\\\"form-control ${errorTks.name ? 'is-invalid' : ''}\\\" t=\\\"[placeholder]globals.name\\\" input.trigger=\\\"errorTks.name = null\\\" value.two-way=\\\"setName\\\"> <div if.to-view=\\\"errorTks.name != null\\\" class=\\\"invalid-feedback d-flex\\\" t=\\\"${errorTks.name.errorTk}\\\" t-params.to-view=\\\"errorTks.name.errorTkParams\\\"></div> </label> <course-filter course-ids.two-way=\\\"editableCourses\\\"></course-filter> </div> <div class=\\\"avatar-component-set-editor__content-body-right ${ editExisting ? '' : 'avatar-component-set-editor__content-body-right--vertical-mode' }\\\"> <div class=\\\"form-group\\\"> <label class=\\\"form-label\\\" t=\\\"elements.avatar-component-set-editor.import\\\"></label> <label class=\\\"avatar-component-set-editor__import-field-wrapper ${ errorTks.uploadFile != null ? 'avatar-component-set-editor__import-field-wrapper--error' : '' }\\\"> <div class=\\\"avatar-component-set-editor__import-field-text ${ errorTks.uploadFile != null ? 'avatar-component-set-editor__import-field-text--error' : '' }\\\" t=\\\"${selectedImportFileName === '' ? 'elements.avatar-component-set-editor.importPlaceholder' : selectedImportFileName}\\\"> </div> <div> <input type=\\\"file\\\" accept=\\\".zip\\\" style=\\\"display:none\\\" files.two-way=\\\"selectedImportFile\\\" change.delegate=\\\"importFileChanged()\\\"> <div class=\\\"btn btn-primary col-12 avatar-component-set-editor__import-field-btn\\\"> <safe-icon icon-name=\\\"System/Tabler/Upload\\\" class=\\\"avatar-component-set-editor__icon\\\"></safe-icon> </div> </div> </label> </div> <div if.to-view=\\\"errorTks.uploadFile != null\\\" class=\\\"text-danger\\\" t=\\\"${errorTks.uploadFile.errorTk}\\\"> </div> <div if.to-view=\\\"importError\\\" class=\\\"avatar-component-set-editor__import-status ${ importOperationStatus === OperationStatus.Error ? 'text-danger' : '' }\\\"> <span t=\\\"globals.status\\\"></span> <span>: ${importError}</span> </div> <div class=\\\"${ editExisting && previewAvailable ? '' : 'avatar-component-set-editor__preview-hidden' }\\\"> <label class=\\\"form-label mt-4\\\" t=\\\"globals.preview\\\"></label> <x-img class=\\\"avatar-component-set-editor__preview-image\\\" style.to-view=\\\"{ 'backgroundImage': storedSet.previewImagePath }\\\" src.to-view=\\\"storedSet.previewImagePath\\\"/> </div> </div> </div> <div class=\\\"avatar-component-set-editor__content-footer\\\"> <button-standard btn-type=\\\"outline\\\" disabled.to-view=\\\"buttonsDisabled\\\" click.delegate=\\\"save()\\\" t=\\\"[btnText]globals.save\\\" btn-color=\\\"primary\\\"></button-standard> <button-standard class=\\\"edit-announcement-dialog__editor-footer-btn\\\" btn-type=\\\"outline\\\" disabled.to-view=\\\"buttonsDisabled\\\" click.delegate=\\\"resetViewData()\\\" t=\\\"[btnText]globals.cancel\\\" btn-color=\\\"secondary\\\"></button-standard> </div> </div> </div> </template>\";\n// Exports\nexport default code;","// Module\nvar code = \"<template class=\\\"button-standard button-standard--color-${btnColor} button-standard--size-${btnSize} button-standard--type-${btnType} button-standard--shape-${btnShape} button-standard--fill-mode-${btnFillMode} ${active ? 'button-standard--active' : ''} ${ignored ? 'button-standard--ignored' : ''} ${!btnText && dropdownOpen === null ? 'button-standard--icon-only' : ''} ${dropdownOpen !== null ? 'button-standard--as-dropdown' : ''} ${disabled ? 'button-standard--disabled' : ''}\\\"> <button class=\\\"button-standard__button btn ${btnSize} ${buttonClass}\\\" type.to-view=\\\"submit ? 'submit' : 'button'\\\" disabled.to-view=\\\"disabled\\\" ref=\\\"buttonElement\\\"> <safe-icon if.to-view=\\\"iconName\\\" class=\\\"button-standard__icon button-standard__icon--${iconColor} ${iconColor} ${iconName && btnText ? 'button-standard__icon--with-text' : ''}\\\" icon-name.to-view=\\\"iconName\\\"></safe-icon> <span if.to-view=\\\"btnText\\\">${btnText}</span> <x-icon if.to-view=\\\"dropdownOpen !== null\\\" class=\\\"button-standard__dropdown-icon\\\" icon-type=\\\"custom\\\" size=\\\"unspecified\\\" icon-name=\\\"${ dropdownOpen ? 'Uce/CaretUp' :'Uce/CaretDown' }\\\"> </x-icon> </button> <x-tooltip if.to-view=\\\"tooltipTk\\\" for-element.to-view=\\\"buttonElement\\\">${tooltipTk | t}</x-tooltip> </template>\";\n// Exports\nexport default code;","import { autoinject, bindable, computedFrom, observable } from 'aurelia-framework';\nimport { FilterChangedEvent, FilterInputTheme, FilterOptions } from 'common/dto/filter/filter.interface';\nimport { DomUtils } from 'common/utils/DomUtils';\n\n/**\n * @event {FilterChangedEvent} filter-changed\n */\n@autoinject()\nexport class ApiSelectFilterInput {\n  @bindable() public options: FilterOptions = [];\n  @bindable() public labelTk: string | null = null;\n  @bindable() public placeholderTk: string | null = null;\n  @bindable() public initialValue: string | null = null;\n  @bindable() public setValue: string | null = null;\n  @bindable() public theme: FilterInputTheme = FilterInputTheme.Default;\n  @bindable() public readonly: boolean = false;\n\n  @observable() private value = '';\n  private lastEmittedValue = this.value;\n\n  constructor(\n    private element: Element,\n  ) { }\n\n  protected attached(): void {\n    this.value = this.setValue ?? this.initialValue ?? '';\n    this.fireChangedEvent();\n  }\n\n  @computedFrom('theme')\n  private get showLabel(): boolean {\n    return this.theme === FilterInputTheme.Default;\n  }\n\n  private setValueChanged(): void {\n    this.value = this.setValue ?? '';\n    this.fireChangedEvent();\n  }\n\n  private handleChanged(event: Event): void {\n    const target = event.target as HTMLSelectElement;\n    this.value = target.value;\n\n    this.fireChangedEvent();\n  }\n\n  private fireChangedEvent(): void {\n    if(this.lastEmittedValue === this.value) return;\n\n    DomUtils.fireEvent<FilterChangedEvent['detail']>(this.element, {\n      name: 'filter-changed',\n      detail: {\n        filter: this.value\n      }\n    });\n    this.lastEmittedValue = this.value;\n  }\n}\n","import { FrameworkConfiguration, PLATFORM } from 'aurelia-framework';\n\nexport function configure(config: FrameworkConfiguration): void {\n  config.globalResources(PLATFORM.moduleName('resources/elements/api-select-filter-input/api-select-filter-input'));\n}","import { autoinject, bindable, computedFrom } from 'aurelia-framework';\nimport { FilterChangedEvent, FilterInputTheme } from 'common/dto/filter/filter.interface';\nimport { DomUtils } from 'common/utils/DomUtils';\n\nexport type TInputType = 'text' | 'number';\n\n/**\n * @event {FilterChangedEvent} filter-changed\n */\n@autoinject()\nexport class ApiTextFilterInput {\n  @bindable() public labelTk: string | null = null;\n  @bindable() public placeholderTk: string | null = null;\n  @bindable() public initialValue: string | null = null;\n  @bindable() public setValue: string | null = null;\n  @bindable() public theme: FilterInputTheme = FilterInputTheme.Default;\n  @bindable() public type: TInputType = 'text';\n  @bindable() public readonly: boolean = false;\n\n  private input: HTMLInputElement | null = null;\n\n  private value = '';\n  private lastEmittedValue = this.value;\n\n  constructor(\n    private element: Element,\n  ) { }\n\n  protected attached(): void {\n    this.setValueChanged();\n  }\n\n  @computedFrom('theme')\n  private get showLabel(): boolean {\n    return this.theme === FilterInputTheme.Default;\n  }\n\n  private setValueChanged(): void {\n    if(this.input === document.activeElement) return;\n\n    this.value = this.setValue ?? this.initialValue ?? '';\n    this.handleChanged();\n  }\n\n  private handleChanged(): void {\n    if(this.lastEmittedValue === this.value) return;\n\n    this.fireChangedEvent();\n    this.lastEmittedValue = this.value;\n  }\n\n  private handleInput(): void {\n    if(this.lastEmittedValue === this.value) return;\n\n    if(this.value.length > 2 || this.value === '') {\n      this.fireChangedEvent();\n      this.lastEmittedValue = this.value;\n    }\n  }\n\n  private clear(): void {\n    this.value = '';\n    this.handleChanged();\n  }\n\n  private fireChangedEvent(): void {\n    DomUtils.fireEvent<FilterChangedEvent['detail']>(this.element, {\n      name: 'filter-changed',\n      detail: {\n        filter: this.value\n      }\n    });\n  }\n}\n","import { FrameworkConfiguration, PLATFORM } from 'aurelia-framework';\n\nexport function configure(config: FrameworkConfiguration): void {\n  config.globalResources(PLATFORM.moduleName('resources/elements/api-text-filter-input/api-text-filter-input'));\n}","import { autoinject, bindable } from 'aurelia-framework';\nimport { IAssessmentPrintFooterText } from '../assessment-print-footer/assessment-print-footer';\n\n@autoinject()\nexport class AssessmentCodePrintHandout {\n  @bindable() public code: string = '';\n\n  private footerTextLeft: IAssessmentPrintFooterText = {\n    titleTk: 'elements.assessmentCodePrintHandout.hint',\n    subtitleTitleTk: 'globals.assessmentCode',\n    descriptionTk: 'elements.assessmentCodePrintHandout.assessmentCodeHint',\n  };\n  private footerTextRight: IAssessmentPrintFooterText = {\n    titleTk: 'elements.assessmentCodePrintHandout.hint',\n    subtitleTitleTk: 'elements.assessmentCodePrintHandout.assessmentProcess',\n    descriptionTk: 'elements.assessmentCodePrintHandout.assessmentProcessHint',\n  };\n}","import { autoinject, bindable } from 'aurelia-framework';\nimport { Config } from 'common/fe-config/config';\nimport { toDataURL } from 'qrcode';\nimport { AppUtils } from '../../../utils/AppUtils';\nimport { IAssessmentPrintFooterText } from '../assessment-print-footer/assessment-print-footer';\n\n@autoinject()\nexport class AssessmentCodePrintList {\n  @bindable() public codes: string[] = [];\n  @bindable() public plannedDate: string = '';\n  private loginUrl: string = `${Config().ufe.baseUrl}`;\n  private qrCodeDataUrl: string | null = null;\n  private logo: string = AppUtils.getLogo();\n\n  private footerTextLeft: IAssessmentPrintFooterText = {\n    titleTk: 'elements.assessmentCodePrintList.dataProtectionTitle',\n    subtitleTitleTk: 'elements.assessmentCodePrintList.dataProtectionSubTitle',\n    descriptionTk: 'elements.assessmentCodePrintList.dataProtectionText',\n  };\n  private footerTextRight: IAssessmentPrintFooterText = {\n    titleTk: 'elements.assessmentCodePrintList.informationTitle',\n    subtitleTitleTk: 'elements.assessmentCodePrintList.informationSubTitle',\n    descriptionTk: 'elements.assessmentCodePrintList.informationText',\n  };\n\n  protected attached(): void {\n    this.updateQrCode();\n  }\n\n  private async updateQrCode(): Promise<void> {\n    // TODO KL-7200 (patrick) get the URL and verify if its even supposed to be here\n    this.qrCodeDataUrl = await toDataURL(this.loginUrl, {\n      width: 84,\n      margin: 0,\n      // hack: an invalid hex for a background free qr-code\n      color: { light: '#invalid', dark: '#000000ff' }\n    });\n  }\n\n  private formatUrl(url: string): string {\n    return url.replace(/^https?:\\/\\//, '');\n  }\n}\n","import { autoinject, bindable } from 'aurelia-framework';\nimport { imageNameToString } from '../../images';\n\nexport interface IAssessmentPrintFooterText {\n  titleTk: string;\n  subtitleTitleTk: string;\n  descriptionTk: string;\n}\n\n@autoinject()\nexport class AssessmentPrintFooter {\n  @bindable() public textLeft: IAssessmentPrintFooterText | null = null;\n  @bindable() public textRight: IAssessmentPrintFooterText | null = null;\n\n  private logoOJRK: string = imageNameToString.LogoOJRK;\n  private partnerLogos: string[] = [\n    imageNameToString.LogoAUVA,\n    imageNameToString.LogoOAMTC,\n    imageNameToString.LogoPolice,\n    imageNameToString.LogoMinistry,\n    imageNameToString.LogoKFV\n  ];\n}","import { autoinject } from 'aurelia-framework';\nimport { AppUtils } from '../../../utils/AppUtils';\nimport { imageNameToString } from '../../images';\n\n@autoinject()\nexport class AssessmentPrintHeader {\n  private logo: string = AppUtils.getLogo();\n  private image: string = imageNameToString.PeopleFrp;\n}","import { autoinject } from 'aurelia-framework';\nimport { AppUtils } from '../../../utils/AppUtils';\nimport { imageNameToString } from '../../images';\n\n@autoinject()\nexport class AssessmentPrintInfo {\n  private logo: string = AppUtils.getLogo();\n  private image: string = imageNameToString.PeopleFrp;\n}","import { autoinject, bindable } from 'aurelia-framework';\nimport { toDataURL } from 'qrcode';\nimport { AppUtils, Platform } from 'common/utils/AppUtils';\nimport { Config } from 'common/fe-config/config';\nimport { imageNameToString } from '../../images';\n\n@autoinject()\nexport class AssessmentPrintSidebar {\n  @bindable() public showLoginLink: boolean = false;\n\n  private ufeLoginQrCode: string | null = null;\n  private ufeAssessmentQrCode: string | null = null;\n  private appStoreBadge: string = imageNameToString.AppStoreBadge;\n  private googlePlayBadge: string = imageNameToString.GooglePlayBadge;\n  private ufeLoginLink: string = Config().ufe.baseUrl;\n  private ufeAssessmentLink: string = `${Config().ufe.baseUrl}/#/pruefung`;\n  // TODO KL-7227 get the real app IDs\n  private appStoreLink: string = AppUtils.getAppStoreUrl(Platform.IosApp, Config().ufe) || '';\n  private googlePlayLink: string = AppUtils.getAppStoreUrl(Platform.AndroidApp, Config().ufe) || '';\n\n  protected attached(): void {\n    this.updateQrCodes();\n  }\n\n  private async updateQrCodes(): Promise<void> {\n    this.ufeAssessmentQrCode = await this.getQrCode(this.ufeAssessmentLink);\n    if(!this.showLoginLink) return;\n    this.ufeLoginQrCode = await this.getQrCode(this.ufeLoginLink);\n  }\n\n  private async getQrCode(link: string): Promise<string> {\n    return toDataURL(link, {\n      width: 84,\n      margin: 0,\n      // hack: an invalid hex for a background free qr-code\n      color: { light: '#invalid', dark: '#000000ff' }\n    });\n  }\n\n  private formatUrl(url: string): string {\n    return url.replace(/^https?:\\/\\//, '');\n  }\n}","import { bindable } from 'aurelia-framework';\n\nexport class AssessmentPrintTemplate {\n  @bindable() public multilineFooter: boolean = false;\n}\n","import { autoinject, bindable, computedFrom } from 'aurelia-framework';\nimport { I18N } from 'aurelia-i18n';\nimport { StoreService } from 'common/aurelia-services/StoreService';\nimport { DEFAULT_MIN_DAYS_TO_EXAM } from 'common/constants/course.constants';\nimport { ITenantCourseDto } from 'common/dto/course/access/course.access.interface';\nimport { ICourseEditResponseDto } from 'common/dto/course/management/course.management.interface';\nimport { RoleName } from 'common/enum/role.enums';\nimport { ECourseAvailability } from 'common/enum/tenant.enum';\nimport { ArrayUtils } from 'common/utils/ArrayUtils';\nimport { DomUtils } from 'common/utils/DomUtils';\nimport { LearnGoalUtils } from 'common/utils/LearnGoalUtils';\nimport { IAssignableCourse } from '../../../interfaces/assign.interface';\nimport { CourseManagementApiService } from '../../../services/api/CourseManagementApiService';\nimport { TenantApiService } from '../../../services/api/TenantApiService';\nimport { IState } from '../../../store/state';\nimport { ValidationUtils } from '../../../utils/ValidationUtils';\nimport { EntrySelectedEvent, ITextTagsWidgetTableColumn, SearchStringChangedEvent, TagsEditedEvent } from '../text-tags-widget/text-tags-widget';\n\n/**\n * @event { AssignCoursesFormSaveClickedEvent } save-clicked\n * @event { AssignCoursesFormCancelClickedEvent } cancel-clicked\n */\n@autoinject()\nexport class AssignCoursesForm {\n  @bindable() public canSelectRequired: boolean = false;\n  @bindable() public canSelectExamDate: boolean = false;\n  @bindable() public canSelectAvailability: boolean = false;\n  private selectedCourses: IAssignableCourse<string>[] = [];\n  private availableCourses: ICourseEditResponseDto[] = [];\n  private foundCourses: ICourseEditResponseDto[] = [];\n  private courseTableColumns: ITextTagsWidgetTableColumn<ITenantCourseDto>[] = [\n    {\n      transformer: e => e.title\n    },\n  ];\n\n  private availabilityTypes: ECourseAvailability[] = Object.values(ECourseAvailability);\n  private isProvider: boolean = false;\n  private domElement: HTMLElement;\n\n  constructor(\n    private courseManagementApiService: CourseManagementApiService,\n    private tenantApiService: TenantApiService,\n    private storeService: StoreService<IState>,\n    private i18n: I18N,\n    element: Element\n  ) {\n    this.domElement = element as HTMLElement;\n  }\n\n  protected attached(): void {\n    this.storeService.subscribeToDetailedChanges(this, [\n      state => state.currentRole?.role === RoleName.Provider,\n    ], (_, isProvider) => {\n      this.isProvider = isProvider;\n      this.updateAvailableCourses();\n    });\n  }\n\n  protected detached(): void {\n    this.storeService.disposeAllSubscriptions(this);\n  }\n\n  private async updateAvailableCourses(): Promise<void> {\n    const result = this.isProvider\n      ? await this.courseManagementApiService.getAvailableRegularCourses()\n      : await this.tenantApiService.getAvailableRegularCourses();\n    this.availableCourses = ArrayUtils.immutableSort(result, (a, b) => a.title.localeCompare(b.title));\n    this.updateCourseData();\n  }\n\n  private updateCourseData(searchString?: string): void {\n    this.foundCourses = this.availableCourses.filter(\n      course => searchString == null || searchString.length === 0\n        || course.title.toLocaleLowerCase().includes(searchString.toLocaleLowerCase())\n    );\n  }\n\n  private handleCourseSearchStringChanged(event: SearchStringChangedEvent): void {\n    this.updateCourseData(event.detail.searchString.trim());\n  }\n\n  private handleCourseEntrySelected(event: EntrySelectedEvent<ICourseEditResponseDto>): void {\n    const selected = event.detail.entry;\n    const course = {\n      examDate: null,\n      courseId: selected.id,\n      required: false,\n      title: selected.title,\n      availabilityType: ECourseAvailability.ASSIGNMENT_ONLY,\n    };\n    if(!this.isCourseSelected(selected)) {\n      this.selectedCourses = [...this.selectedCourses, course];\n      this.updateCourseData();\n    }\n  }\n\n  private isCourseSelected(selected: ICourseEditResponseDto): boolean {\n    return !!this.selectedCourses.find(course => course.courseId === selected.id);\n  }\n\n  private handleCourseEntryRemoved(event: TagsEditedEvent): void {\n    this.selectedCourses = this.selectedCourses.filter(course => event.detail.tags.includes(course.title));\n    this.updateCourseData();\n  }\n\n  private handleRemoveCourseClick(courseToRemove: IAssignableCourse<string>): void {\n    this.selectedCourses = this.selectedCourses.filter(course => course.courseId !== courseToRemove.courseId);\n    this.updateCourseData();\n  }\n\n  private getExamDateInfoText(selected: IAssignableCourse<string>): string {\n    const course = this.availableCourses.find(c => c.id === selected.courseId);\n    if(course == null) return '';\n    const maxDaysToExam = LearnGoalUtils.getDaysToExamMaximumFromExpirationInMonths(course?.accessCodeExpirationInMonths);\n    return this.i18n.tr('globals.learnGoalInfoText', { minDaysToExam: course.minDaysToExam, defaultDaysToExam: course.defaultDaysToExam, maxDaysToExam });\n  }\n\n  private getExamDateErrorOrNull(courseId: number, examDate?: string | null): string | null {\n    const course = this.availableCourses.find(c => c.id === courseId);\n    if(course == null) return null;\n    const maxDaysToExam = LearnGoalUtils.getDaysToExamMaximumFromExpirationInMonths(course?.accessCodeExpirationInMonths);\n    const examDateError = ValidationUtils.isExamDateValid(examDate, course?.minDaysToExam ?? DEFAULT_MIN_DAYS_TO_EXAM, maxDaysToExam);\n    return examDateError;\n  }\n\n  @computedFrom('selectedCourses.length')\n  private get selectedCoursesTags(): string[] {\n    return this.selectedCourses.map(course => course.title);\n  }\n\n  private saveCourses(): void {\n    if(this.canSelectExamDate && this.selectedCourses.some(c => this.getExamDateErrorOrNull(c.courseId, c.examDate))) return;\n\n    DomUtils.fireEvent<AssignCoursesFormSaveClickedEvent['detail']>(this.domElement, {\n      detail: {\n        courses: this.selectedCourses,\n      },\n      name: 'save-clicked',\n    });\n  }\n\n  private cancel(): void {\n    DomUtils.fireEvent(this.domElement, {\n      name: 'cancel-clicked',\n    });\n  }\n}\n\nexport type AssignCoursesFormSaveClickedEvent = CustomEvent<{ courses: IAssignableCourse<string>[] }>;\nexport type AssignCoursesFormCancelClickedEvent = CustomEvent<never>;\n","import { autoinject, bindable, computedFrom } from 'aurelia-framework';\nimport { Router } from 'aurelia-router';\nimport { ILearningJourneyDto } from 'common/dto/learning-journey/management/learning-journey.management.interface';\nimport { ArrayUtils } from 'common/utils/ArrayUtils';\nimport { DomUtils } from 'common/utils/DomUtils';\nimport { assertNotNullOrUndefined } from 'common/utils/assert';\nimport { IAssignableLearningJourneyDto } from '../../../interfaces/assign.interface';\nimport { LearningJourneyManagementApiService } from '../../../services/api/LearningJourneyManagementApiService';\nimport { ENavigationTab } from '../../pages/learning-journey-edit-page/learning-journey-edit-page';\nimport { ISearchSelectData, SasSelectedItemChangedEvent, SearchSelectGroupDisplayMode } from '../search-and-select/search-and-select';\n\n/**\n * @event {AssignLearningJourneysFormSaveClickedEvent} save-clicked\n * @event {AssignLearningJourneysFormCancelClickedEvent} cancel-clicked\n */\n@autoinject()\nexport class AssignLearningJourneysForm {\n  @bindable() public learningJourneys: IAssignableLearningJourneyDto[] = [];\n  @bindable() public showRadios: boolean = false;\n  @bindable() public canCancel: boolean = false;\n  private selectedLearningJourneys: IAssignableLearningJourneyDto[] = [];\n  private searchSelectLearningJourneys: ISearchSelectData | null = null;\n  private availableLearningJourneys: ILearningJourneyDto[] = [];\n  private radioOptionChanged: boolean = false;\n  private domElement: HTMLElement;\n\n  constructor(\n    private learningJourneyManagementApiService: LearningJourneyManagementApiService,\n    private router: Router,\n    element: Element\n  ) {\n    this.domElement = element as HTMLElement;\n  }\n\n  protected async attached(): Promise<void> {\n    this.selectedLearningJourneys = [...this.learningJourneys];\n    await this.updateAvailableLearningJourneys();\n    this.updateSearchSelectLearningJourneys();\n  }\n\n  private async updateAvailableLearningJourneys(): Promise<void> {\n    const result = await this.learningJourneyManagementApiService.getLearningJourneys({});\n    this.availableLearningJourneys = result.rows;\n    this.updateSearchSelectLearningJourneys();\n  }\n\n  private updateSearchSelectLearningJourneys(): void {\n    const selectedLearningJourneyIds = this.selectedLearningJourneys.map(learningJourney => learningJourney.learningJourneyId);\n    const searchSelectLearningJourneys = this.availableLearningJourneys\n      .filter(learningJourney => !selectedLearningJourneyIds.includes(learningJourney.id))\n      .sort((a, b) => a.title.localeCompare(b.title))\n      .map(learningJourney => ({\n        text: learningJourney.title,\n        id: learningJourney.id,\n      }));\n\n    this.searchSelectLearningJourneys = {\n      searchIndex: [\n        {\n          displaySettings: {\n            displayMode: SearchSelectGroupDisplayMode.None,\n          },\n          items: searchSelectLearningJourneys\n        },\n      ],\n      noResultsTextTk: 'globals.noResults',\n    };\n  }\n\n  private learningJourneysChanged(): void {\n    this.selectedLearningJourneys = [...this.learningJourneys];\n    this.radioOptionChanged = false;\n    this.updateSearchSelectLearningJourneys();\n  }\n\n  private onLearningJourneySelected(event: SasSelectedItemChangedEvent<number>): void {\n    const lJId = event.detail.id;\n    const learningJourney = this.availableLearningJourneys.find(lJ => lJ.id === lJId);\n    assertNotNullOrUndefined(learningJourney, 'learningJourney cannot be null or undefined');\n    this.selectedLearningJourneys = [...this.selectedLearningJourneys, {\n      learningJourneyId: learningJourney.id,\n      learningJourneyTitle: learningJourney.title,\n      coursesRequired: false\n    }];\n    this.updateSearchSelectLearningJourneys();\n  }\n\n  private handleRemoveLearningJourneyClick(learningJourneyToRemove: IAssignableLearningJourneyDto): void {\n    this.selectedLearningJourneys = this.selectedLearningJourneys.filter(lJ => lJ.learningJourneyId !== learningJourneyToRemove.learningJourneyId);\n    this.updateSearchSelectLearningJourneys();\n  }\n\n  @computedFrom('learningJourneys', 'selectedLearningJourneys', 'radioOptionChanged')\n  private get isDirty(): boolean {\n    return this.radioOptionChanged || !ArrayUtils.areKeysIdentical(this.learningJourneys, this.selectedLearningJourneys, lJ => lJ.learningJourneyId);\n  }\n\n  private saveLearningJourneys(): void {\n    DomUtils.fireEvent<AssignLearningJourneysFormSaveClickedEvent['detail']>(this.domElement, {\n      detail: {\n        selectedLearningJourneys: this.selectedLearningJourneys,\n      },\n      name: 'save-clicked',\n    });\n  }\n\n  private cancel(): void {\n    DomUtils.fireEvent(this.domElement, {\n      name: 'cancel-clicked',\n    });\n  }\n\n  private navigateToLearningJourney(learningJourney: IAssignableLearningJourneyDto): void {\n    this.cancel();\n    this.router.navigateToRoute('learning-journey/id/tab', { learningJourneyId: learningJourney.learningJourneyId, tab: ENavigationTab.DETAILS });\n  }\n}\n\nexport type AssignLearningJourneysFormSaveClickedEvent = CustomEvent<{ selectedLearningJourneys: IAssignableLearningJourneyDto[] }>;\nexport type AssignLearningJourneysFormCancelClickedEvent = CustomEvent<never>;\n","import { autoinject, bindable } from 'aurelia-framework';\nimport { FilterOperationType } from 'common/dto/filter/filter.enum';\nimport { IFilterDto } from 'common/dto/filter/filter.interface';\nimport { ILearningJourneyDto } from 'common/dto/learning-journey/management/learning-journey.management.interface';\nimport { DomUtils } from 'common/utils/DomUtils';\nimport { IAssignableLearningJourneyDto } from '../../../interfaces/assign.interface';\nimport { LearningJourneyManagementApiService } from '../../../services/api/LearningJourneyManagementApiService';\nimport { ToastService } from '../../../services/ToastService';\nimport { AssignLearningJourneysFormSaveClickedEvent } from '../assign-learning-journeys-form/assign-learning-journeys-form';\nimport { VirtualFilterField } from '../custom-table/custom-table-helpers';\n\n/**\n * @event {AssignLearningJourneysToStudentsFormSaveClickedEvent} save-clicked\n * @event {AssignLearningJourneysToStudentsFormCancelClickedEvent} cancel-clicked\n */\n@autoinject()\nexport class AssignLearningJourneysToStudentsForm {\n  @bindable() public studentIds: number[] = [];\n  @bindable() public canCancel: boolean = false;\n\n  private studentsLearningJourneys: IAssignableLearningJourneyDto[] = [];\n  private domElement: HTMLElement;\n\n  constructor(\n    private learningJourneyManagementApiService: LearningJourneyManagementApiService,\n    private toastService: ToastService,\n    element: Element\n  ) {\n    this.domElement = element as HTMLElement;\n  }\n\n  private get isSingleUser(): boolean {\n    return this.studentIds.length === 1;\n  }\n\n  private async updateStudentsLearningJourneys(): Promise<void> {\n    if(!this.isSingleUser) return;\n\n    const filter: IFilterDto<ILearningJourneyDto> = {\n      filter: [{\n        field: 'users' as VirtualFilterField,\n        type: FilterOperationType.In,\n        value: this.studentIds,\n      }]\n    };\n    const result = await this.learningJourneyManagementApiService.getLearningJourneys(filter);\n    this.studentsLearningJourneys = result.rows.map(lJ => ({\n      learningJourneyId: lJ.id,\n      learningJourneyTitle: lJ.title,\n      coursesRequired: false\n    }));\n  }\n\n  private async saveLearningJourneys(event: AssignLearningJourneysFormSaveClickedEvent): Promise<void> {\n    const selectedLearningJourneyIds = event.detail.selectedLearningJourneys.map(lJ => lJ.learningJourneyId);\n\n    if(this.isSingleUser) {\n      await this.learningJourneyManagementApiService.setUserLearningJourneys(this.studentIds[0], {\n        learningJourneyIds: selectedLearningJourneyIds,\n      });\n    } else {\n      await this.learningJourneyManagementApiService.bulkAssignUsersToLearningJourney({\n        learningJourneyIds: selectedLearningJourneyIds,\n        userIds: this.studentIds\n      });\n    }\n    this.updateStudentsLearningJourneys();\n    this.toastService.success('globals.editSuccess');\n    DomUtils.fireEvent(this.domElement, {\n      name: 'save-clicked',\n    });\n  }\n\n  private cancel(): void {\n    DomUtils.fireEvent(this.domElement, {\n      name: 'cancel-clicked',\n    });\n  }\n\n  private studentIdsChanged(): void {\n    this.updateStudentsLearningJourneys();\n  }\n}\n\nexport type AssignLearningJourneysToStudentsFormSaveClickedEvent = CustomEvent<never>;\nexport type AssignLearningJourneysToStudentsFormCancelClickedEvent = CustomEvent<never>;\n","import { autoinject, bindable, computedFrom } from 'aurelia-framework';\nimport { Router } from 'aurelia-router';\nimport { ISkillDto } from 'common/dto/skill/management/skill.management.interface';\nimport { ArrayUtils } from 'common/utils/ArrayUtils';\nimport { DomUtils } from 'common/utils/DomUtils';\nimport { assertNotNullOrUndefined } from 'common/utils/assert';\nimport { SkillManagementApiService } from '../../../services/api/SkillManagementApiService';\nimport { ISearchSelectData, SasSelectedItemChangedEvent, SearchSelectGroupDisplayMode } from '../search-and-select/search-and-select';\n\n/**\n * @event { AssignSkillsFormSaveClickedEvent } save-clicked\n * @event { AssignSkillsFormCancelClickedEvent } cancel-clicked\n */\n@autoinject()\nexport class AssignSkillsForm {\n  @bindable() public skills?: ISkillDto[] = [];\n  @bindable() public canCancel: boolean = false;\n  private searchSelectSkills: ISearchSelectData | null = null;\n  private availableSkills: ISkillDto[] = [];\n  private selectedSkills: ISkillDto[] = [];\n  private domElement: HTMLElement;\n\n  constructor(\n    private skillManagementApiService: SkillManagementApiService,\n    private router: Router,\n    element: Element\n  ) {\n    this.domElement = element as HTMLElement;\n  }\n\n  protected async attached(): Promise<void> {\n    this.selectedSkills = [...this.skills ?? []];\n    await this.updateAvailableSkills();\n    this.updateSearchSelectSkills();\n  }\n\n  private async updateAvailableSkills(): Promise<void> {\n    const result = await this.skillManagementApiService.getSkills({});\n    this.availableSkills = result.rows;\n    this.updateSearchSelectSkills();\n  }\n\n  private updateSearchSelectSkills(): void {\n    const selectedSkillIds = this.selectedSkills.map(skill => skill.id);\n    const searchSelectSkills = this.availableSkills\n      .filter(skill => !selectedSkillIds.includes(skill.id))\n      .sort((a, b) => a.title.localeCompare(b.title))\n      .map(skill => ({\n        text: skill.title,\n        id: skill.id,\n        iconName: `Twemoji/${skill.iconKey}`\n      }));\n\n    this.searchSelectSkills = {\n      searchIndex: [\n        {\n          displaySettings: {\n            displayMode: SearchSelectGroupDisplayMode.None,\n          },\n          items: searchSelectSkills\n        },\n      ],\n      noResultsTextTk: 'globals.noResults',\n    };\n  }\n\n  private skillsChanged(): void {\n    this.selectedSkills = [...this.skills ?? []];\n    this.updateSearchSelectSkills();\n  }\n\n  private onSkillSelected(event: SasSelectedItemChangedEvent<number>): void {\n    const skillId = event.detail.id;\n    const skill = this.availableSkills.find(availableSkill => availableSkill.id === skillId);\n    assertNotNullOrUndefined(skill, 'skill cannot be null or undefined');\n    this.selectedSkills = [...this.selectedSkills, skill].sort((a, b) => a.title.localeCompare(b.title));\n    this.updateSearchSelectSkills();\n  }\n\n  private handleRemoveSkillClick(skillToRemove: ISkillDto): void {\n    this.selectedSkills = this.selectedSkills.filter(skill => skill.id !== skillToRemove.id);\n    this.updateSearchSelectSkills();\n  }\n\n  @computedFrom('skills', 'selectedSkills')\n  private get isDirty(): boolean {\n    return !ArrayUtils.areKeysIdentical(this.skills ?? [], this.selectedSkills, skill => skill.id);\n  }\n\n  private saveSkills(): void {\n    DomUtils.fireEvent<AssignSkillsFormSaveClickedEvent['detail']>(this.domElement, {\n      detail: {\n        selectedSkillIds: this.selectedSkills.map(skill => skill.id)\n      },\n      name: 'save-clicked',\n    });\n  }\n\n  private cancel(): void {\n    DomUtils.fireEvent(this.domElement, {\n      name: 'cancel-clicked',\n    });\n  }\n\n  private navigateToSkill(skill: ISkillDto): void {\n    this.cancel();\n    this.router.navigateToRoute('skills-edit/id', { skillId: skill.id });\n  }\n}\n\nexport type AssignSkillsFormSaveClickedEvent = CustomEvent<{ selectedSkillIds: number[] }>;\nexport type AssignSkillsFormCancelClickedEvent = CustomEvent<never>;\n","import { autoinject } from 'aurelia-framework';\nimport { DomUtils } from 'common/utils/DomUtils';\nimport { NicknameUtils } from 'common/utils/NicknameUtils';\nimport { IAssignableStudent } from '../../../interfaces/assign.interface';\n/**\n * @event { AssignStudentsFormSaveClickedEvent } save-clicked\n * @event { AssignStudentsFormCancelClickedEvent } cancel-clicked\n */\n@autoinject()\nexport class AssignStudentsForm {\n  private selectedStudents: IAssignableStudent<string>[] = [];\n  private domElement: HTMLElement;\n\n  constructor(\n    element: Element\n  ) {\n    this.domElement = element as HTMLElement;\n  }\n\n  private handleRemoveStudentClick(studentToRemove: IAssignableStudent<string>): void {\n    this.selectedStudents = this.selectedStudents.filter(student => student.id !== studentToRemove.id);\n  }\n\n  private getFullName(student: IAssignableStudent<string>): string {\n    return NicknameUtils.getFullName(student);\n  }\n\n  private saveStudents(): void {\n    DomUtils.fireEvent<AssignStudentsFormSaveClickedEvent['detail']>(this.domElement, {\n      detail: {\n        selectedStudents: this.selectedStudents\n      },\n      name: 'save-clicked',\n    });\n  }\n\n  private cancel(): void {\n    DomUtils.fireEvent(this.domElement, {\n      name: 'cancel-clicked',\n    });\n  }\n}\n\nexport type AssignStudentsFormSaveClickedEvent = CustomEvent<{ selectedStudents: IAssignableStudent<string>[] }>;\nexport type AssignStudentsFormCancelClickedEvent = CustomEvent<never>;\n","import { autoinject, bindable, computedFrom } from 'aurelia-framework';\nimport { ITenantInfoDto } from 'common/dto/tenant/management/tenant.management.interface';\nimport { ECourseAvailability } from 'common/enum/tenant.enum';\nimport { ArrayUtils } from 'common/utils/ArrayUtils';\nimport { assertNotNullOrUndefined } from 'common/utils/assert';\nimport { DomUtils } from 'common/utils/DomUtils';\nimport { IAssignableTenant } from '../../../interfaces/assign.interface';\nimport { TenantApiService } from '../../../services/api/TenantApiService';\nimport { ISearchSelectData, SasSelectedItemChangedEvent, SearchSelectGroupDisplayMode } from '../search-and-select/search-and-select';\n\n/**\n * @event { AssignTenantsFormSaveClickedEvent } save-clicked\n * @event { AssignTenantsFormCancelClickedEvent } cancel-clicked\n */\n@autoinject()\nexport class AssignTenantsForm {\n  @bindable() public tenants: IAssignableTenant[] = [];\n  @bindable() public canSelectAvailability: boolean = false;\n  private searchSelectTenants: ISearchSelectData | null = null;\n  private selectedTenants: IAssignableTenant[] = [];\n  private availableTenants: ITenantInfoDto[] = [];\n  private anyInputChanged: boolean = false;\n\n  private availabilityTypes: ECourseAvailability[] = Object.values(ECourseAvailability);\n  private domElement: HTMLElement;\n\n  constructor(\n    private tenantApiService: TenantApiService,\n    element: Element\n  ) {\n    this.domElement = element as HTMLElement;\n  }\n\n  protected async attached(): Promise<void> {\n    this.selectedTenants = [...this.tenants.map(t => ({\n      tenantId: t.tenantId,\n      name: t.name,\n      availabilityType: t.availabilityType ?? ECourseAvailability.ASSIGNMENT_ONLY,\n    }))];\n    await this.updateAvailableTenants();\n    this.updateSearchSelectTenants();\n  }\n\n  private tenantsChanged(): void {\n    this.selectedTenants = [...this.tenants.map(t => ({\n      tenantId: t.tenantId,\n      name: t.name,\n      availabilityType: t.availabilityType ?? ECourseAvailability.ASSIGNMENT_ONLY,\n    }))];\n    this.anyInputChanged = false;\n    this.updateSearchSelectTenants();\n  }\n\n  private async updateAvailableTenants(): Promise<void> {\n    const result = await this.tenantApiService.getTenants({ limit: 500 });\n    this.availableTenants = result.rows;\n    this.updateSearchSelectTenants();\n  }\n\n  private updateSearchSelectTenants(): void {\n    const selectedTenantIds = this.selectedTenants.map(tenant => tenant.tenantId);\n    const searchSelectTenants = this.availableTenants\n      .filter(tenant => !selectedTenantIds.includes(tenant.id))\n      .sort((a, b) => a.name.localeCompare(b.name))\n      .map(tenant => ({\n        text: tenant.name,\n        id: tenant.id,\n      }));\n\n    this.searchSelectTenants = {\n      searchIndex: [\n        {\n          displaySettings: {\n            displayMode: SearchSelectGroupDisplayMode.None,\n          },\n          items: searchSelectTenants\n        },\n      ],\n      noResultsTextTk: 'globals.noResults',\n    };\n  }\n\n  private onTenantSelected(event: SasSelectedItemChangedEvent<number>): void {\n    const tId = event.detail.id;\n    const tenant = this.availableTenants.find(t => t.id === tId);\n    assertNotNullOrUndefined(tenant, 'tenant cannot be null or undefined');\n    const assignableTenant: IAssignableTenant = {\n      availabilityType: ECourseAvailability.ASSIGNMENT_ONLY,\n      tenantId: tenant.id,\n      name: tenant.name\n    };\n    this.selectedTenants = [...this.selectedTenants, assignableTenant];\n    this.updateSearchSelectTenants();\n  }\n\n  private handleRemoveTenantClick(tenantToRemove: ITenantInfoDto): void {\n    this.selectedTenants = this.selectedTenants.filter(tenant => tenant.tenantId !== tenantToRemove.id);\n  }\n\n  @computedFrom('tenants', 'selectedTenants', 'anyInputChanged')\n  private get isDirty(): boolean {\n    return this.anyInputChanged || !ArrayUtils.areKeysIdentical(this.tenants.map(t => t.tenantId), this.selectedTenants.map(t => t.tenantId), tID => tID);\n  }\n\n  private saveTenants(): void {\n    DomUtils.fireEvent<AssignTenantsFormSaveClickedEvent['detail']>(this.domElement, {\n      detail: {\n        tenants: this.selectedTenants,\n      },\n      name: 'save-clicked',\n    });\n  }\n\n  private cancel(): void {\n    DomUtils.fireEvent(this.domElement, {\n      name: 'cancel-clicked',\n    });\n  }\n}\n\nexport type AssignTenantsFormSaveClickedEvent = CustomEvent<{ tenants: IAssignableTenant[] }>;\nexport type AssignTenantsFormCancelClickedEvent = CustomEvent<never>;\n","import { bindable, autoinject, computedFrom } from 'aurelia-framework';\nimport { FILE_NAME_SEPARATOR } from 'common/constants/course.constants';\nimport { GalleryMediaType } from 'common/enum/gallery.enum';\nimport { CustomDialogService } from '../../../services/CustomDialogService';\n\n@autoinject\nexport class AudioSelectForm {\n  @bindable public courseId: number | null = null;\n  @bindable public title: string | null = null;\n  @bindable public audioUrl: string | null = null;\n  @bindable public audioId: number | null = null;\n  @bindable public audioFileName: string | null = null;\n  @bindable public audioFileTitle: string | null = null;\n  @bindable public showTitle: boolean = true;\n\n  constructor(private dialogService: CustomDialogService) { }\n\n  @computedFrom('audioFileName')\n  private get fileName(): string {\n    if(!this.audioFileName) return '-';\n    // newly selected files return their filenames as needed, existing files return the filename as a full path, separated by _\n    return this.audioFileName.includes(FILE_NAME_SEPARATOR) ? this.audioFileName.split(FILE_NAME_SEPARATOR)[1] : this.audioFileName;\n  }\n\n  @computedFrom('audioFileTitle')\n  private get fileTitle(): string {\n    return this.audioFileTitle ? this.audioFileTitle : '-';\n  }\n\n  private handleDeleteAudio(): void {\n    this.audioId = null;\n    this.audioUrl = null;\n  }\n\n  private async handleSelectAudio(): Promise<void> {\n    const result = await this.dialogService.showMediaSelect({\n      selectedMediaType: GalleryMediaType.Audio\n    });\n    if(result?.type === GalleryMediaType.Audio) {\n      this.audioFileName = result.value.filename;\n      this.audioFileTitle = result.value.title;\n      this.audioId = result.value.id;\n      this.audioUrl = result.value.url;\n    }\n  }\n}\n","import {\n  IAvatarComponentSetCreateDto,\n  IAvatarComponentSetResponseDto,\n  IAvatarComponentSetUpdateDto,\n} from 'common/dto/avatar/avatar.interface';\nimport { autoinject, bindable, computedFrom, observable } from 'aurelia-framework';\nimport { Router } from 'aurelia-router';\nimport { CustomDialogService } from 'services/CustomDialogService';\nimport { AvatarComponentSetManagementApiService } from 'services/api/AvatarComponentSetManagementApiService';\nimport { IErrorTk, ValidationUtils } from 'utils/ValidationUtils';\nimport { ToastService } from '../../../services/ToastService';\nimport _ from 'lodash';\nimport { LogUtils } from 'common/utils/LogUtils';\nimport { OperationStatus } from 'common/dto/other/operation.response';\nimport { SubscriptionManager, SubscriptionManagerService } from 'common/aurelia-services/SubscriptionManagerService';\nimport { DomUtils } from 'common/utils/DomUtils';\n\nconst MAX_ACS_IMPORT_ID_LENGTH = 255;\nconst MAX_ACS_NAME_LENGTH = 255;\n\ntype AcsDataState = {\n  saveActive: boolean;\n  deleteActive: boolean;\n  attributesUpdated: boolean;\n  importArchiveAvailable: boolean;\n};\n\n@autoinject()\nexport class AvatarComponentSetEditor {\n  @bindable() protected setIdFromPage: number | null = null;\n  @observable() private editableCourses: Array<number> = [];\n  @observable() private setName = '';\n  @observable() private setImportId = '';\n  @observable() private dataState: AcsDataState = {\n    saveActive: false,\n    deleteActive: false,\n    attributesUpdated: false,\n    importArchiveAvailable: false,\n  };\n\n  private setId: number | null = null;\n  private editExisting = false;\n  private previewAvailable = false;\n  private storedSet: IAvatarComponentSetResponseDto | null = null;\n  private errorTks: IAvatarComponentSetErrorTk = { importId: null, name: null, uploadFile: null };\n  private element: HTMLElement;\n  private validationDataNames: Array<string> = [];\n  private validationDataImportIds: Array<string> = [];\n\n  private subscriptionManager: SubscriptionManager;\n  private OperationStatus = OperationStatus;\n  private selectedImportFile: FileList | null = null;\n  private selectedImportFileName = '';\n  private selectedImportFileValid: boolean | null = null;\n  private importOperationStatus: OperationStatus | null = null;\n  private importOperationId: number | null = null;\n  private importError: string = '';\n\n  constructor(\n    element: Element,\n    private customDialogService: CustomDialogService,\n    private toastService: ToastService,\n    subscriptionManagerService: SubscriptionManagerService,\n    private avatarComponentSetManagementApiService: AvatarComponentSetManagementApiService,\n    private router: Router,\n  ) {\n    this.element = element as HTMLElement;\n    this.subscriptionManager = subscriptionManagerService.createSubscriptionManager();\n  }\n\n  protected async attached(): Promise<void> {\n    this.setId = this.setIdFromPage;\n    this.editExisting = this.setId != null;\n    await this.fetchData();\n\n    if(this.element.isConnected) {\n      this.subscriptionManager.subscribeToInterval(this.refreshImportStatus.bind(this), 2000);\n    }\n  }\n\n  protected detached(): void {\n    this.subscriptionManager.disposeSubscriptions();\n  }\n\n  private async fetchData(): Promise<void> {\n    const validationData = await this.avatarComponentSetManagementApiService.getSetsValidationData(this.setId ?? -1);\n    this.validationDataNames = validationData.map(data => data.name.toLocaleLowerCase());\n    this.validationDataImportIds = validationData.map(data => data.importId.toLocaleLowerCase());\n    if(this.setId != null) {\n      this.storedSet = await this.avatarComponentSetManagementApiService.getSet(this.setId);\n      this.previewAvailable = this.storedSet.previewImagePath.length > 0;\n      this.resetViewData();\n    }\n  }\n\n  @computedFrom('dataState.saveActive', 'dataState.deleteActive')\n  private get buttonsDisabled(): boolean {\n    return this.dataState.saveActive || this.dataState.deleteActive;\n  }\n\n  private setNameChanged(): void {\n    if(this.setName && this.setName.length > 0) this.validateSetName(true);\n  }\n\n  private setImportIdChanged(): void {\n    if(this.setImportId && this.setImportId.length > 0) this.validateSetImportId(true);\n  }\n\n  private async importFileChanged(): Promise<void> {\n    this.importError = '';\n    this.errorTks.uploadFile = null;\n    if(this.selectedImportFile == null || this.selectedImportFile.length === 0) {\n      this.selectedImportFileName = '';\n      return;\n    }\n    this.selectedImportFileName = this.selectedImportFile[0].name;\n  }\n\n  /**\n   * deleteSet() is only called for existing sets, meaning the behavior\n   * below is specific to editor-in-page (not in dialog) view-mode.\n   */\n  private async deleteSet(): Promise<void> {\n    if(this.setId == null) return;\n    this.dataState.deleteActive = true;\n    const confirmation = await this.customDialogService.confirmDeletion();\n    if(!confirmation) {\n      this.dataState.deleteActive = false;\n      return;\n    }\n    await this.avatarComponentSetManagementApiService.deleteSet(this.setId);\n    this.dataState.deleteActive = false;\n    this.router.navigateToRoute('avatar-component-sets');\n  }\n\n  private async save(): Promise<void> {\n    if(this.dataState.saveActive) return;\n    this.dataState.saveActive = true;\n    this.dataState.attributesUpdated = false;\n    this.dataState.importArchiveAvailable = this.selectedImportFile != null && this.selectedImportFile.length > 0;\n\n    // wait for return on !validationSuccess until import file has been checked aswell\n    const validationSuccess = this.validateAttributes();\n    // create new requires import archive\n    if(!this.editExisting && !this.dataState.importArchiveAvailable) {\n      this.errorTks.uploadFile = {\n        errorTk: 'utils.validation.missingImportFileError',\n      };\n      this.dataState.saveActive = false;\n      return;\n    }\n    if(!validationSuccess) {\n      this.dataState.saveActive = false;\n      return;\n    }\n\n    if(this.editExisting) {\n      await this.updateAvatarComponentSet();\n    } else {\n      await this.createAvatarComponentSet();\n    }\n    // API error could have occurred in update/create methods,\n    if(!this.dataState.saveActive) return;\n\n    // create or (optional) update of AvatarComponentSet occurred, now start import\n    if(this.dataState.importArchiveAvailable) {\n      await this.startImport();\n    } else {\n      // finished without import:\n      this.dataState.saveActive = false;\n      this.toastService.genericUpdateSuccess('globals.avatarComponentSet');\n      this.fetchData();\n    }\n  }\n\n  private async createAvatarComponentSet(): Promise<void> {\n    // create basic ACS (without previewImage and other import file content);\n    const createSet: IAvatarComponentSetCreateDto = {\n      importId: this.setImportId.trim(),\n      name: this.setName.trim(),\n      courses: this.editableCourses ?? [],\n    };\n\n    try {\n      const createdSet = await this.avatarComponentSetManagementApiService.createSet(createSet);\n      this.setId = createdSet.id;\n      this.dataState.attributesUpdated = true;\n    } catch(e) {\n      this.dataState.saveActive = false;\n      this.toastService.genericCreateError('globals.avatarComponentSet');\n      LogUtils.exception(e);\n      throw e;\n    }\n  }\n\n  private async updateAvatarComponentSet(): Promise<void> {\n    if(this.storedSet == null) {\n      this.dataState.saveActive = false;\n      return;\n    }\n    if(this.setName === this.storedSet.name\n      && this.setImportId === this.storedSet?.importId\n      && _.isEqual(this.storedSet.courses.map(c => c.id).sort(), this.editableCourses.sort())) {\n      // update not required, but save-activity may continue, no resetting of saveActive here\n      return;\n    }\n\n    const updateSet: IAvatarComponentSetUpdateDto = {\n      id: this.storedSet.id,\n      importId: this.setImportId.trim(),\n      name: this.setName.trim(),\n      courses: this.editableCourses,\n    };\n\n    try {\n      await this.avatarComponentSetManagementApiService.updateSet(updateSet);\n      this.dataState.attributesUpdated = true;\n    } catch(e) {\n      this.dataState.saveActive = false;\n      LogUtils.exception(e);\n      this.toastService.genericUpdateError('globals.avatarComponentSet');\n      throw e;\n    }\n  }\n\n  private async revertCreateAvatarComponentSet(): Promise<void> {\n    if(this.setId == null) {\n      return;\n    }\n    try {\n      await this.avatarComponentSetManagementApiService.deleteSet(this.setId);\n    } catch(e) {\n      this.dataState.saveActive = false;\n      LogUtils.exception(e);\n      this.toastService.genericUpdateError('globals.avatarComponentSet');\n      throw e;\n    }\n  }\n\n  private async revertUpdateAvatarComponentSet(): Promise<void> {\n    if(this.storedSet == null) return; // should not be possilbe anyway\n    const updateSet: IAvatarComponentSetUpdateDto = {\n      id: this.storedSet.id,\n      importId: this.storedSet.importId,\n      name: this.storedSet.name,\n      courses: this.storedSet.courses.map(c => c.id),\n    };\n\n    try {\n      await this.avatarComponentSetManagementApiService.updateSet(updateSet);\n    } catch(e) {\n      this.dataState.saveActive = false;\n      LogUtils.exception(e);\n      this.toastService.genericUpdateError('globals.avatarComponentSet');\n      throw e;\n    }\n  }\n\n  private validateAttributes(): boolean {\n    this.validateSetName(false);\n    this.validateSetImportId(false);\n\n    return Object.values(this.errorTks).every(e => e == null);\n  }\n\n  private validateSetName(allowEmpty: boolean): void {\n    this.errorTks.name = ValidationUtils.checkForDuplicatesAndLength(\n      'Name',\n      this.setName.trim().toLocaleLowerCase(),\n      this.validationDataNames,\n      allowEmpty,\n      MAX_ACS_NAME_LENGTH,\n    );\n  }\n\n  private validateSetImportId(allowEmpty: boolean): void {\n    this.errorTks.importId = ValidationUtils.checkForDuplicatesAndLength(\n      'Id',\n      this.setImportId.trim().toLocaleLowerCase(),\n      this.validationDataImportIds,\n      allowEmpty,\n      MAX_ACS_IMPORT_ID_LENGTH,\n    );\n  }\n\n  private resetViewData(): void {\n    if(!this.editExisting) this.closeDialog(true);\n    if(this.storedSet == null) return;\n    this.setImportId = this.storedSet.importId;\n    this.setName = this.storedSet.name;\n    this.editableCourses = this.storedSet.courses.map(course => course.id);\n    this.selectedImportFileName = '';\n    this.selectedImportFile = null;\n  }\n\n  private async startImport(): Promise<void> {\n    if(this.selectedImportFile == null || this.setId == null) {\n      this.dataState.saveActive = false;\n      return;\n    }\n    // avoid delay before this message appears 2 seconds later naturally from BE\n    this.importError = 'Status : Starting new worker';\n    this.selectedImportFileName = this.selectedImportFile[0].name;\n    this.importOperationId = await this.avatarComponentSetManagementApiService.importSet(this.setId, this.selectedImportFile[0]);\n    this.importOperationStatus = OperationStatus.Running;\n  }\n\n  private async refreshImportStatus(): Promise<void> {\n    if(this.importOperationStatus === OperationStatus.Running && this.importOperationId != null) {\n      const response = await this.avatarComponentSetManagementApiService.getImportStatus(this.importOperationId);\n      this.importOperationStatus = response.status;\n      if(response.status === OperationStatus.Running && response.message != null) {\n        this.importError = response.message;\n      }\n      if(response.status === OperationStatus.Error) {\n        this.importError = response.message ?? '';\n        this.toastService.error('globals.importError');\n        if(!this.editExisting) {\n          await this.revertCreateAvatarComponentSet();\n          this.toastService.genericCreateError('globals.avatarComponentSet');\n        } else if(this.dataState.attributesUpdated) {\n          await this.revertUpdateAvatarComponentSet();\n          this.toastService.genericUpdateError('globals.avatarComponentSet');\n        }\n        this.dataState.saveActive = false;\n      }\n      if(response.status === OperationStatus.Success) {\n        // last step: award new AvatarComponents with price = 0 to Users:\n        try {\n          if(this.setId != null)\n            await this.avatarComponentSetManagementApiService.connectSetToUsers(this.setId);\n        } catch(e) {\n          this.dataState.saveActive = false;\n          LogUtils.exception(e);\n          this.toastService.genericUpdateError('globals.avatarComponentSet');\n          throw e;\n        }\n        this.importError = 'Import finished.';\n        this.dataState.saveActive = false;\n        this.toastService.genericUpdateSuccess('globals.avatarComponentSet');\n\n        if(this.editExisting) {\n          this.fetchData();\n        } else {\n          this.closeDialog(false);\n        }\n      }\n    }\n  }\n\n  private closeDialog(cancel: boolean): void {\n    DomUtils.fireEvent(this.element, {\n      name: 'close-dialog',\n      detail: {\n        setId: cancel ? null : this.setId,\n      },\n      bubbles: false,\n    });\n  }\n}\n\ninterface IAvatarComponentSetErrorTk {\n  importId: IErrorTk | null;\n  name: IErrorTk | null;\n  uploadFile: IErrorTk | null;\n}\n","import { bindable, computedFrom } from 'aurelia-framework';\nimport { IconType } from 'common/aurelia-components/x-icon/x-icon';\n\nexport enum ButtonColor {\n  Primary = 'primary',\n  Secondary = 'secondary',\n  Danger = 'danger',\n  None = 'none',\n  Selected = 'selected'\n}\n\nexport enum IconColor {\n  Secondary = 'text-secondary',\n  Red = 'red',\n  Blue = 'blue',\n  White = 'white',\n}\n\nexport enum ButtonType {\n  Contained = 'contained', // UFE button-style\n  Outlined = 'outlined', // UFE button-style\n  Text = 'text', // UFE button-style\n  TransparentOutline = 'transparent-outlined', // UFE button-style\n  EditorFlat = 'editor-flat',\n  Outline = 'outline',\n  Uce = 'uce',\n  UceLight = 'uce-light',\n}\n\nexport enum ButtonShape {\n  Default = 'default', // UFE button-style\n  Condensed = 'condensed', // UFE button-style\n}\n\nexport enum ButtonSize {\n  Icon = 'icon',\n  Tiny = 'tiny',\n  Small = 'btn-sm',\n  Regular = 'regular',\n}\n\nexport enum IconSize {\n  Tiny = 'tiny',\n  Regular = 'regular',\n}\n\nexport enum ButtonFillMode {\n  Default = 'default',\n  FillWidth = 'fill-width',\n  FillWidthAlignLeft = 'fill-width-align-left',\n}\n\nexport class ButtonStandard {\n  @bindable() public btnText: string | null = null;\n  @bindable() public iconType: IconType | null = null;\n  @bindable() public iconColor: IconColor | null = null;\n  @bindable() public iconName: string | null = null;\n  @bindable() public disabled = false;\n  @bindable() public active = false;\n  @bindable() public ignored = false;\n  @bindable() public btnColor: ButtonColor = ButtonColor.Primary;\n  @bindable() public btnSize: ButtonSize = ButtonSize.Regular;\n  @bindable() public btnFillMode: ButtonFillMode = ButtonFillMode.Default;\n  @bindable() public btnType: ButtonType | null = null;\n  @bindable() public btnShape: ButtonShape = ButtonShape.Default;\n  @bindable() public dropdownOpen: boolean | null = null;\n  @bindable() public tooltipTk: string | null = null;\n  @bindable() public submit = false;\n\n  @computedFrom('btnType', 'btnColor')\n  private get buttonClass(): string {\n    return this.btnType\n      ? `btn-${this.btnType}-${this.btnColor}`\n      : `btn-${this.btnColor}`;\n  }\n}\n"],"names":[],"sourceRoot":""}