{"version":3,"file":"app-071f3147.f584a1446b2fc034d810.bundle.js","mappings":"AAGA","sources":["webpack://lernplattform-admin-frontend/./src/resources/dialogs/add-blocklisted-nickname-dialog/add-blocklisted-nickname-dialog.html","webpack://lernplattform-admin-frontend/./src/resources/dialogs/add-invitation-to-course-group-dialog/add-invitation-to-course-group-dialog.html","webpack://lernplattform-admin-frontend/./src/resources/dialogs/add-invitations-to-course-group-dialog/add-invitations-to-course-group-dialog.html","webpack://lernplattform-admin-frontend/./src/resources/dialogs/add-page-dialog/add-page-dialog.html","webpack://lernplattform-admin-frontend/./src/resources/dialogs/add-presentation-dialog/add-presentation-dialog.html","webpack://lernplattform-admin-frontend/./src/resources/dialogs/add-question-dialog/add-question-dialog.html","webpack://lernplattform-admin-frontend/./src/resources/attributes/attach-to-fullscreen.ts","webpack://lernplattform-admin-frontend/./src/resources/attributes/index.ts","webpack://lernplattform-admin-frontend/./src/resources/attributes/set-false-on-outside-click.ts","webpack://lernplattform-admin-frontend/./src/resources/classes/csv-export.ts","webpack://lernplattform-admin-frontend/./src/resources/converters/date.ts","webpack://lernplattform-admin-frontend/./src/resources/converters/datetime.ts","webpack://lernplattform-admin-frontend/./src/resources/converters/index.ts","webpack://lernplattform-admin-frontend/./src/resources/converters/number.ts","webpack://lernplattform-admin-frontend/./src/resources/converters/seconds-to-hours.ts","webpack://lernplattform-admin-frontend/./src/resources/converters/tenant-user-name.ts","webpack://lernplattform-admin-frontend/./src/resources/dialogs/add-blocklisted-nickname-dialog/add-blocklisted-nickname-dialog.ts","webpack://lernplattform-admin-frontend/./src/resources/dialogs/add-invitation-to-course-group-dialog/add-invitation-to-course-group-dialog.ts","webpack://lernplattform-admin-frontend/./src/resources/dialogs/add-invitations-to-course-group-dialog/add-invitations-to-course-group-dialog.ts","webpack://lernplattform-admin-frontend/./src/resources/dialogs/add-page-dialog/add-page-dialog.ts","webpack://lernplattform-admin-frontend/./src/resources/dialogs/add-presentation-dialog/add-presentation-dialog.ts","webpack://lernplattform-admin-frontend/./src/resources/dialogs/add-question-dialog/add-question-dialog.ts"],"sourcesContent":["// Module\nvar code = \"<template> <div class=\\\"d-flex flex-row justify-content-around\\\"> <div class=\\\"card\\\"> <div class=\\\"card-header\\\"> <h3 class=\\\"card-title\\\" t=\\\"dialogs.addBlocklistedNickname.addNickName\\\"></h3> </div> <div class=\\\"card-body\\\"> <div class=\\\"form-group\\\"> <input class=\\\"form-control\\\" attach-focus t=\\\"[placeholder]dialogs.addBlocklistedNickname.placeholder\\\" value.two-way=\\\"value.nickname\\\" maxlength.to-view=\\\"MAX_NICKNAME_LENGTH\\\" keypress.trigger=\\\"checkKeyPress($event)\\\" type=\\\"text\\\"> </div> <div class=\\\"form-group\\\"> <div class=\\\"custom-control custom-radio\\\"> <input class=\\\"custom-control-input\\\" type=\\\"radio\\\" id=\\\"addBlocklistedNicknameDialogRadio1\\\" name=\\\"matchOptions\\\" model.bind=\\\"false\\\" checked.two-way=\\\"value.partialMatch\\\"> <label class=\\\"custom-control-label\\\" for=\\\"addBlocklistedNicknameDialogRadio1\\\" t=\\\"dialogs.addBlocklistedNickname.fullMatch\\\"></label> </div> <div class=\\\"custom-control custom-radio\\\"> <input class=\\\"custom-control-input\\\" type=\\\"radio\\\" id=\\\"addBlocklistedNicknameDialogRadio2\\\" name=\\\"matchOptions\\\" model.bind=\\\"true\\\" checked.two-way=\\\"value.partialMatch\\\"> <label class=\\\"custom-control-label\\\" for=\\\"addBlocklistedNicknameDialogRadio2\\\" t=\\\"dialogs.addBlocklistedNickname.partialMatch\\\"></label> </div> </div> </div> <div class=\\\"card-footer text-right\\\"> <button class=\\\"btn btn-primary\\\" disabled.bind=\\\"requestPending\\\" click.delegate=\\\"addBlocklistedNickname()\\\" t=\\\"globals.save\\\"></button> <button class=\\\"btn btn-secondary\\\" click.trigger=\\\"cancel()\\\" t=\\\"globals.cancel\\\"></button> </div> </div> </div> </template>\";\n// Exports\nexport default code;","// Module\nvar code = \"<template> <div class=\\\"card add-invitation-to-course-group-dialog__card\\\"> <div class=\\\"card-header\\\"> <h3 class=\\\"card-title\\\" t=\\\"dialogs.addInvitationToCourseGroup.selectInvitation\\\"></h3> </div> <div class=\\\"card-body add-invitation-to-course-group-dialog__body\\\"> <div class=\\\"row row-cards row-deck\\\"> <div class=\\\"col-12\\\"> <custom-table columns.to-view=\\\"tableColumns\\\" table-id=\\\"add-invitation-to-course-group-dialog\\\" selectable.to-view=\\\"true\\\" selected.two-way=\\\"value\\\" get-shown-entries-data.call=\\\"fetchTableData(limit, offset)\\\"></custom-table> </div> </div> </div> <div class=\\\"card-footer text-right\\\"> <button type=\\\"submit\\\" class=\\\"btn btn-primary\\\" click.delegate=\\\"ok()\\\" t=\\\"globals.save\\\"></button> <button class=\\\"btn btn-secondary\\\" click.delegate=\\\"cancel()\\\" t=\\\"globals.cancel\\\"></button> </div> </div> </template>\";\n// Exports\nexport default code;","// Module\nvar code = \"<template> <form> <div class=\\\"card\\\"> <div class=\\\"card-body\\\"> <div class=\\\"form-group\\\"> <label class=\\\"form-label\\\" t=\\\"dialogs.addInvitationsToCourseGroup.selectCourseGroup\\\"></label> <select class=\\\"custom-select\\\" value.bind=\\\"value.courseGroup\\\" attach-focus> <option repeat.for=\\\"option of model.options\\\" model.bind=\\\"option\\\"> ${option.name} </option> </select> </div> </div> <div class=\\\"card-footer text-right\\\"> <button type=\\\"submit\\\" class=\\\"btn btn-primary\\\" disabled.to-view=\\\"model.selectedCourseGroupId === value.courseGroup.id\\\" click.delegate=\\\"ok()\\\" t=\\\"globals.save\\\"></button> <button class=\\\"btn btn-secondary\\\" click.delegate=\\\"cancel()\\\" t=\\\"globals.cancel\\\"></button> </div> </div> </form> </template>\";\n// Exports\nexport default code;","// Module\nvar code = \"<template> <div class=\\\"card\\\"> <div class=\\\"card-header\\\"> <h1 class=\\\"card-title\\\" t=\\\"dialogs.addPageDialog.title\\\"></h1> </div> <div class=\\\"card-body\\\"> <div class=\\\"row\\\"> <div class=\\\"form-group col-12\\\"> <div class=\\\"form-group\\\"> <label class=\\\"form-label\\\" t=\\\"globals.title\\\"></label> <input type=\\\"text\\\" attach-focus class=\\\"form-control\\\" value.two-way=\\\"value.title\\\"> </div> </div> </div> <div class=\\\"row\\\"> <div class=\\\"form-group col-6\\\"> <div class=\\\"form-label\\\" t=\\\"globals.type\\\"></div> <div class=\\\"custom-control custom-radio\\\"> <input class=\\\"custom-control-input\\\" type=\\\"radio\\\" id=\\\"addPageDialogRadio1\\\" name=\\\"matchOptions\\\" model.bind=\\\"PageType.Page\\\" checked.two-way=\\\"value.type\\\"> <label class=\\\"custom-control-label\\\" for=\\\"addPageDialogRadio1\\\" t=\\\"dialogs.addPageDialog.page\\\"></label> </div> <div class=\\\"custom-control custom-radio\\\"> <input class=\\\"custom-control-input\\\" type=\\\"radio\\\" id=\\\"addPageDialogRadio2\\\" name=\\\"matchOptions\\\" model.bind=\\\"PageType.Chapter\\\" checked.two-way=\\\"value.type\\\"> <label class=\\\"custom-control-label\\\" for=\\\"addPageDialogRadio2\\\" t=\\\"dialogs.addPageDialog.chapter\\\"></label> </div> <label class=\\\"custom-control custom-checkbox custom-control-inline form-check\\\"> <input class=\\\"custom-control-input form-check-input\\\" disabled.to-view=\\\"value.parentId\\\" type=\\\"checkbox\\\" checked.two-way=\\\"value.isIntro\\\"> <span class=\\\"custom-control-label\\\" t=\\\"dialogs.addPageDialog.isIntro\\\"></span> </label> <label class=\\\"custom-control custom-checkbox custom-control-inline form-check\\\"> <input class=\\\"custom-control-input form-check-input\\\" disabled.to-view=\\\"value.parentId\\\" type=\\\"checkbox\\\" checked.two-way=\\\"value.isTrainingOnly\\\"> <span class=\\\"custom-control-label\\\" t=\\\"dialogs.addPageDialog.isTrainingOnly\\\"></span> </label> </div> <div class=\\\"form-group col-6\\\"> <div class=\\\"form-group\\\"> <label class=\\\"form-label\\\" t=\\\"dialogs.addPageDialog.importId\\\"></label> <input type=\\\"text\\\" class=\\\"form-control\\\" value.two-way=\\\"importId\\\"> </div> </div> </div> <div class=\\\"row\\\"> <div class=\\\"form-group col-12\\\"> <label class=\\\"form-label\\\" t=\\\"dialogs.addPageDialog.summary\\\"></label> <textarea type=\\\"text\\\" value.two-way=\\\"summary\\\" class=\\\"form-control\\\"></textarea> </div> </div> </div> <div class=\\\"card-footer text-right\\\"> <button class=\\\"btn btn-primary\\\" click.delegate=\\\"ok()\\\" t=\\\"globals.select\\\"></button> <button class=\\\"btn btn-secondary\\\" click.delegate=\\\"cancel()\\\" t=\\\"globals.cancel\\\"></button> </div> </div> </template>\";\n// Exports\nexport default code;","// Module\nvar code = \"<template> <form> <div class=\\\"card\\\"> <div class=\\\"card-header\\\"> <h3 class=\\\"card-title\\\" t=\\\"dialogs.addPresentation.title\\\"></h3> </div> <div class=\\\"card-body\\\"> <div class=\\\"form-group\\\"> <label class=\\\"form-label\\\" t=\\\"dialogs.addPresentation.presentationTitle\\\"></label> <input type=\\\"text\\\" attach-focus input.trigger=\\\"titleErrorTk = null\\\" class=\\\"form-control ${titleErrorTk ? 'is-invalid' : ''}\\\" value.two-way=\\\"value.title\\\"> <div if.to-view=\\\"titleErrorTk\\\" class=\\\"invalid-feedback\\\" t=\\\"${titleErrorTk}\\\"></div> </div> </div> <div class=\\\"card-footer text-right\\\"> <button type=\\\"submit\\\" class=\\\"btn btn-primary\\\" disabled.to-view=\\\"!!indicatorService.waitingClients\\\" click.delegate=\\\"createPresentation()\\\" t=\\\"dialogs.addPresentation.create\\\"></button> <button class=\\\"btn btn-secondary\\\" click.delegate=\\\"cancel()\\\" t=\\\"globals.cancel\\\"></button> </div> </div> </form> </template>\";\n// Exports\nexport default code;","// Module\nvar code = \"<template> <div class=\\\"card\\\"> <div class=\\\"card-header\\\"> <h3 class=\\\"card-title\\\" t=\\\"dialogs.addQuestionDialog.title\\\"></h3> <button-standard class=\\\"ml-auto\\\" click.trigger=\\\"controller.cancel()\\\" icon-name=\\\"System/Tabler/X\\\" btn-type=\\\"outline\\\" btn-color=\\\"danger\\\"></button-standard> </div> <div class=\\\"card-body\\\"> <question-list-widget selected-questions-ids.to-view=\\\"model.questionIds\\\" course-id.to-view=\\\"model.courseId\\\" show-edit.to-view=\\\"false\\\" exclude-assessment-only.to-view=\\\"true\\\" add-question.trigger=\\\"addQuestion($event)\\\"></question-list-widget> </div> </div> </template> \";\n// Exports\nexport default code;","import { autoinject } from 'aurelia-framework';\nimport { SubscriptionManager, SubscriptionManagerService } from 'common/aurelia-services/SubscriptionManagerService';\n\n@autoinject()\nexport class AttachToFullscreenCustomAttribute {\n  private subscriptionManager: SubscriptionManager;\n  private placeholder = document.createComment('anchor');\n\n  constructor(\n    private element: Element,\n    subscriptionManagerService: SubscriptionManagerService,\n  ) {\n    this.subscriptionManager = subscriptionManagerService.createSubscriptionManager();\n  }\n\n  protected attached(): void {\n    this.subscriptionManager.subscribeToFullscreenChange(this.attachToFullScreenOrOriginalPosition.bind(this));\n    this.attachToFullScreenOrOriginalPosition();\n  }\n\n  protected detached(): void {\n    this.subscriptionManager.disposeSubscriptions();\n  }\n\n  private attachToFullScreenOrOriginalPosition(): void {\n    if(document.fullscreenElement) {\n      this.element.replaceWith(this.placeholder);\n      document.fullscreenElement.append(this.element);\n    } else if(this.placeholder.isConnected) {\n      this.placeholder.replaceWith(this.element);\n    }\n  }\n}\n","import { PLATFORM } from 'aurelia-pal';\nimport { FrameworkConfiguration } from 'aurelia-framework';\n\nexport function configure(config: FrameworkConfiguration): void {\n  config.globalResources(PLATFORM.moduleName('resources/attributes/set-false-on-outside-click'));\n  config.globalResources(PLATFORM.moduleName('resources/attributes/attach-to-fullscreen'));\n}\n","import { autoinject, TaskQueue } from 'aurelia-framework';\nimport { SubscriptionManager, SubscriptionManagerService } from 'common/aurelia-services/SubscriptionManagerService';\n\n@autoinject()\nexport class SetFalseOnOutsideClickCustomAttribute {\n  protected value = false;\n\n  private element: HTMLElement;\n  private subscriptionManager: SubscriptionManager;\n\n  constructor(\n    element: Element,\n    subscriptionManagerService: SubscriptionManagerService,\n    private taskQueue: TaskQueue,\n  ) {\n    this.element = element as HTMLElement;\n    this.subscriptionManager = subscriptionManagerService.createSubscriptionManager();\n  }\n\n  protected attached(): void {\n    this.valueChanged();\n  }\n\n  protected detached(): void {\n    this.subscriptionManager.disposeSubscriptions();\n  }\n\n  protected valueChanged(): void {\n    this.subscriptionManager.disposeSubscriptions();\n    if(this.value) this.taskQueue.queueTask(() => {\n      if(this.element.isConnected) {\n        this.subscriptionManager.subscribeToClickOutside(this.element, () => {\n          this.value = false;\n        });\n      }\n    });\n  }\n}\n","import { CSVType } from 'common/enum/csv.type.enum';\n\ninterface ICsvTypes {\n  csvTypeTk: string;\n  csvType: CSVType;\n}\n\nexport class CsvExport {\n  public selectedYear: number;\n  public selectedQuarter: number;\n  public csvTypes: ICsvTypes[] = [\n    {\n      csvTypeTk: 'globals.csvTypeExcel',\n      csvType: CSVType.TSV_UTF16BOM,\n    },\n    {\n      csvTypeTk: 'globals.csvTypeCsv',\n      csvType: CSVType.CSV_UTF8,\n    }\n  ];\n  public selectedCsvType: CSVType = CSVType.CSV_UTF8;\n  public selectedFreeCodesIncluded: boolean = false;\n  public selectedTenantsWhichSoldNone: boolean = false;\n  public quarters = [1, 2, 3, 4];\n\n  constructor() {\n    this.selectedYear = new Date().getFullYear();\n    this.selectedQuarter = Math.ceil((new Date().getMonth() + 1) / 3);\n  }\n}","import { DateService } from 'services/DateService';\nimport { autoinject } from 'aurelia-framework';\n\n@autoinject\nexport class DateValueConverter {\n  constructor(private dateService: DateService) {\n  }\n\n  public toView(value: string | Date): string {\n    return this.dateService.formatDate(value);\n  }\n}\n","import { DateService } from 'services/DateService';\nimport { autoinject } from 'aurelia-framework';\n\n@autoinject\nexport class DateTimeValueConverter {\n  constructor(private dateService: DateService) {\n  }\n\n  public toView(value: string | Date): string {\n    return this.dateService.formatDateTime(value);\n  }\n}\n","import { PLATFORM } from 'aurelia-pal';\nimport { FrameworkConfiguration } from 'aurelia-framework';\n\nexport function configure(config: FrameworkConfiguration): void {\n  config.globalResources(PLATFORM.moduleName('resources/converters/seconds-to-hours'));\n  config.globalResources(PLATFORM.moduleName('resources/converters/tenant-user-name'));\n  config.globalResources(PLATFORM.moduleName('resources/converters/date'));\n  config.globalResources(PLATFORM.moduleName('resources/converters/datetime'));\n  config.globalResources(PLATFORM.moduleName('resources/converters/number'));\n}\n","import { autoinject } from 'aurelia-framework';\n\n@autoinject\nexport class NumberValueConverter {\n  public toView(value: number): string {\n    return `${value}`;\n  }\n\n  public fromView(value: string): number {\n    return parseFloat(value) || 0;\n  }\n}\n","export class SecondsToHoursValueConverter {\n  public toView(value: number): string {\n    return `${Math.round(value / 3600)}`;\n  }\n\n  public fromView(value: string): number {\n    const hours = parseFloat(value) || 0;\n    return Math.round(hours * 3600);\n  }\n}\n","import { ITenantUserInfoDto } from 'common/dto/tenant/other/tenant.user.info.interface';\n\nexport class TenantUserNameValueConverter {\n  public toView(user: ITenantUserInfoDto): string {\n    if(!user) return '';\n    return `${user.titlePrefix ?? ''} ${user.firstname ?? ''} ${user.lastname ?? ''}${user.titleSuffix ? `, ${user.titleSuffix}` : ''}`;\n  }\n}\n","import { DialogController } from 'aurelia-dialog';\nimport { autoinject } from 'aurelia-framework';\nimport { MAX_NICKNAME_LENGTH } from 'common/constants/nickname.constants';\nimport { IAddBlocklistedNicknameDto } from 'common/dto/user/management/user.management.interface';\nimport { LogUtils } from 'common/utils/LogUtils';\nimport { BlocklistApiService } from 'services/api/BlocklistApiService';\nimport { CustomDialog } from 'services/CustomDialog';\nimport { ToastService } from 'services/ToastService';\n\nenum Key {\n  Enter = 'Enter'\n}\n\n@autoinject\nexport class AddBlocklistedNicknameDialog extends CustomDialog {\n  public model!: IBlocklistedNicknameDialogModel;\n  public value!: IAddBlocklistedNicknameDto;\n  private requestPending = false;\n  private MAX_NICKNAME_LENGTH = MAX_NICKNAME_LENGTH;\n\n  constructor(\n    protected controller: DialogController,\n    private blockListApiService: BlocklistApiService,\n    private toastService: ToastService) {\n    super(controller);\n  }\n\n  private checkKeyPress(event: KeyboardEvent): boolean {\n    if(event.key === Key.Enter) {\n      this.addBlocklistedNickname();\n      return false;\n    }\n    return true;\n\n  }\n\n  public async addBlocklistedNickname(): Promise<void> {\n    this.requestPending = true;\n\n    try {\n      await this.blockListApiService.addBlocklistedNickname(this.value.nickname, this.value.partialMatch);\n      this.toastService.success('pages.blocklist.addNicknameSuccess');\n      this.value.nickname = '';\n      this.model.updateTableCallback();\n    } catch(e) {\n      LogUtils.exception(e);\n      this.toastService.error('pages.blocklist.addNicknameError');\n    }\n    this.requestPending = false;\n  }\n\n  public activate(model: IBlocklistedNicknameDialogModel): void {\n    super.activate(model);\n    this.value = {\n      nickname: '',\n      partialMatch: true\n    };\n  }\n}\n\nexport interface IBlocklistedNicknameDialogModel {\n  updateTableCallback: () => void;\n}\n","import { DialogController } from 'aurelia-dialog';\nimport { autoinject } from 'aurelia-framework';\nimport { I18N } from 'aurelia-i18n';\nimport { ICourseCodeResponseDto } from 'common/dto/course/code/course.code.interface';\nimport { ColumnSortDirection, FilterOperationType } from 'common/dto/filter/filter.enum';\nimport { InvitationApiService } from '../../../services/api/InvitationApiService';\nimport { CustomDialog } from '../../../services/CustomDialog';\nimport { LocalInvitation } from '../../../services/InvitationService';\nimport { CustomTableCell } from '../../elements/custom-table/custom-table-cell/custom-table-cell';\nimport { createPrepareServersideSortingFunction, deepPropertyString, IGroupableFilterDto, prepareServersideFiltering, VirtualFilterField } from '../../elements/custom-table/custom-table-helpers';\nimport { IColumnDefinition } from '../../elements/custom-table/custom-table-interfaces';\n\n@autoinject()\nexport class AddInvitationToCourseGroupDialog extends CustomDialog {\n  public model!: IAddInvitationToCourseGroupDialogModel;\n  public value: ICourseCodeResponseDto<string>[] = [];\n  private filter: IGroupableFilterDto<LocalInvitation> = {\n    offset: 0,\n    limit: 0,\n    order: [{\n      field: 'studentLastname' as VirtualFilterField,\n      dir: ColumnSortDirection.ASC,\n    }],\n    filter: []\n  };\n\n  constructor(\n    protected controller: DialogController,\n    private i18n: I18N,\n    private invitationApi: InvitationApiService,\n  ) {\n    super(controller);\n  }\n\n  public activate(model: IAddInvitationToCourseGroupDialogModel): void {\n    super.activate(model);\n    this.filter.filter = [\n      {\n        field: 'courseGroupId' as VirtualFilterField,\n        type: FilterOperationType.Ne,\n        value: model.courseGroupId,\n      },\n      {\n        field: 'courseId' as VirtualFilterField,\n        type: FilterOperationType.Eq,\n        value: model.courseId,\n      },\n    ];\n  }\n\n  private tableColumns: Array<IColumnDefinition<CustomTableCell<ICourseCodeResponseDto<string>>>> = [\n    {\n      id: 'firstname',\n      nameTk: 'globals.firstname',\n      cellViewModel: CustomTableCell,\n      cellOptions: {\n        transformer: e => e.metadata?.firstname ?? this.i18n.tr('globals.empty'),\n      },\n      prepareSorting: createPrepareServersideSortingFunction(() => this.filter, 'studentFirstname' as VirtualFilterField),\n      filter: {\n        placeholderTk: 'globals.filter',\n        prepare: i => prepareServersideFiltering(this.filter, 'studentFirstname' as VirtualFilterField, i),\n      },\n    },\n    {\n      id: 'lastname',\n      nameTk: 'globals.lastname',\n      cellViewModel: CustomTableCell,\n      cellOptions: {\n        transformer: e => e.metadata?.lastname ?? this.i18n.tr('globals.empty'),\n      },\n      prepareSorting: createPrepareServersideSortingFunction(() => this.filter, 'studentLastname' as VirtualFilterField),\n      filter: {\n        placeholderTk: 'globals.filter',\n        prepare: i => prepareServersideFiltering(this.filter, 'studentLastname' as VirtualFilterField, i),\n      },\n    },\n    {\n      id: 'nickname',\n      nameTk: 'globals.nickname',\n      cellViewModel: CustomTableCell,\n      cellOptions: {\n        transformer: i => i.student?.nickname ?? this.i18n.tr('globals.empty')\n      },\n      prepareSorting: createPrepareServersideSortingFunction(() => this.filter, 'studentNickname' as VirtualFilterField),\n      filter: {\n        placeholderTk: 'globals.filter',\n        prepare: i => prepareServersideFiltering(this.filter, 'studentNickname' as VirtualFilterField, i),\n      },\n    },\n    {\n      id: 'courseGroup',\n      nameTk: 'globals.courseGroup',\n      cellViewModel: CustomTableCell,\n      cellOptions: {\n        transformer: deepPropertyString('courseGroup.name'),\n      },\n      prepareSorting: createPrepareServersideSortingFunction(() => this.filter, 'groupName' as VirtualFilterField),\n      filter: {\n        placeholderTk: 'globals.filter',\n        prepare: i => prepareServersideFiltering(this.filter, 'groupName' as VirtualFilterField, i),\n      },\n    },\n  ];\n\n  private async fetchTableData(limit: number, offset: number): Promise<{ total: number; data: ICourseCodeResponseDto<string>[] }> {\n    this.filter.limit = limit;\n    this.filter.offset = offset;\n    const results = await this.invitationApi.getInvitations(this.filter);\n    return { data: results.rows as ICourseCodeResponseDto<string>[], total: results.count };\n  }\n}\n\nexport interface IAddInvitationToCourseGroupDialogModel {\n  courseId: number;\n  courseGroupId: number;\n}\n","import { autoinject } from 'aurelia-framework';\nimport { ICourseGroupResponseDto } from 'common/dto/course/course.group.interface';\nimport { CustomDialog } from '../../../services/CustomDialog';\n\n@autoinject\nexport class AddInvitationsToCourseGroupDialog extends CustomDialog {\n  public model!: IAddInvitationsToCourseGroupDialogModel;\n  public value!: IAddInvitationsToCourseGroupDialogValue;\n\n  public activate(model: IAddInvitationsToCourseGroupDialogModel): void {\n    super.activate(model);\n\n    this.value = {\n      courseGroup: model.options.find(o => o.id === model.selectedCourseGroupId) ?? null,\n    };\n  }\n}\n\nexport interface IAddInvitationsToCourseGroupDialogModel {\n  options: Array<ICourseGroupResponseDto<string>>;\n  selectedCourseGroupId: number | null;\n}\n\nexport interface IAddInvitationsToCourseGroupDialogValue {\n  courseGroup: ICourseGroupResponseDto<string> | null;\n}\n","import { autoinject } from 'aurelia-framework';\nimport { ICreatePageDto } from 'common/dto/course/management/course.management.interface';\nimport { PageType } from 'common/enum/course.enum';\nimport { CustomDialog } from '../../../services/CustomDialog';\n\n@autoinject()\nexport class AddPageDialog extends CustomDialog {\n  public model!: IAddPageDialogModel;\n  public value: ICreatePageDto | null = null;\n  private summary: string = '';\n  private importId: string = '';\n  private PageType = PageType;\n\n  public initValue(model: IAddPageDialogModel): void {\n    this.value = {\n      parentId: model.parentId,\n      title: '',\n      type: PageType.Page,\n      order: model.order,\n      importId: null,\n      summary: null,\n      isIntro: false,\n      isTrainingOnly: false,\n    };\n  }\n\n  protected ok(): void {\n    if(this.value) {\n      this.value.importId = this.importId.length ? this.importId : null;\n      this.value.summary = this.summary.length ? this.summary : null;\n    }\n    this.controller.ok(this.value);\n  }\n}\n\nexport interface IAddPageDialogModel {\n  parentId: number | null;\n  order: number;\n}\n","import { DialogController } from 'aurelia-dialog';\nimport { Router } from 'aurelia-router';\nimport { autoinject } from 'aurelia-framework';\nimport { ICreatePresentationDto } from 'common/dto/course/management/presentation.management.interface';\nimport { LogUtils } from 'common/utils/LogUtils';\nimport { PresentationManagementApiService } from '../../../services/api/PresentationManagementApiService';\nimport { PageLoadingIndicatorService } from '../../../services/PageLoadingIndicatorService';\nimport { ToastService } from '../../../services/ToastService';\nimport { CustomDialog } from '../../../services/CustomDialog';\nimport { ErrorType } from 'common/enum/errortype.enum';\nimport { Language } from 'common/dto/other/language.enum';\n\n@autoinject\nexport class AddPresentationDialog extends CustomDialog {\n  public value: ICreatePresentationDto = {\n    title: '',\n    language: Language.De\n  };\n  private titleErrorTk: string | null = null;\n\n  constructor(\n    protected controller: DialogController,\n    private api: PresentationManagementApiService,\n    private indicatorService: PageLoadingIndicatorService,\n    private toastService: ToastService,\n    private router: Router\n  ) {\n    super(controller);\n  }\n\n  private async createPresentation(): Promise<void> {\n    this.value.title = this.value.title.trim();\n    if(!this.value.title) {\n      this.titleErrorTk = 'utils.validation.noTitleError';\n      return;\n    }\n\n    this.indicatorService.start();\n\n    try {\n      const response = await this.api.createPresentation(this.value);\n      this.ok();\n      this.toastService.success('dialogs.addPresentation.createSuccess');\n      this.router.navigateToRoute('content-editor-presentation', { presentationId: response.id });\n    } catch(e) {\n      if(e.message === ErrorType.COURSE_TITLE_ALREADY_IN_USE) {\n        this.toastService.error('dialogs.addPresentation.titleExistsError');\n      } else {\n        LogUtils.exception(e);\n        this.toastService.error('dialogs.addPresentation.createError');\n      }\n    }\n    this.indicatorService.stop();\n  }\n}\n","import { DialogController } from 'aurelia-dialog';\nimport { autoinject } from 'aurelia-framework';\nimport { AddQuestionEvent } from '../../elements/question-list-widget/question-list-widget';\nimport { ToastService } from '../../../services/ToastService';\nimport { FocusTrapCustomDialog } from '../../../services/CustomDialog';\nimport { SubscriptionManagerService } from 'common/aurelia-services/SubscriptionManagerService';\n\n@autoinject()\nexport class AddQuestionDialog extends FocusTrapCustomDialog {\n  public model!: IAddQuestionDialogModel;\n  public value: number | null = null;\n\n  constructor(\n    protected controller: DialogController,\n    private toastService: ToastService,\n    element: Element,\n    subscriptionManagerService: SubscriptionManagerService\n  ) {\n    super(controller, element, subscriptionManagerService);\n  }\n\n  private async addQuestion(event: AddQuestionEvent): Promise<void> {\n    this.value = event.detail.questionId;\n\n    if(this.model.questionIds.includes(this.value)) {\n      this.toastService.success('dialogs.addQuestionDialog.questionAlreadyAdded');\n      return;\n    }\n    this.controller.ok(this.value);\n  }\n}\n\nexport interface IAddQuestionDialogModel {\n  courseId: number;\n  questionIds: number[];\n}\n"],"names":[],"sourceRoot":""}