From 2e7e719184bbd1a7ab3aee3e982bc2ac3674813a Mon Sep 17 00:00:00 2001 From: Elmar Ludwig <elmar.ludwig@uni-osnabrueck.de> Date: Wed, 23 Oct 2024 16:05:26 +0200 Subject: [PATCH] Revert "don't html escape title attributes in vue, fixes #3050" This reverts commit 1b7a7b044b1af0d175ace51d1e196264e3f1086a. --- resources/vue/components/ActiveFilter.vue | 2 +- resources/vue/components/AdminCourses.vue | 2 +- resources/vue/components/ContentModulesControl.vue | 2 +- resources/vue/components/ContentModulesEditTiles.vue | 9 +++------ resources/vue/components/ContentmodulesEditTable.vue | 8 +++----- resources/vue/components/EditableList.vue | 2 +- resources/vue/components/FilesTable.vue | 12 ++++++------ .../courseware/CoursewareContentPermissions.vue | 6 +++--- .../tasks/CoursewareTasksDialogDistribute.vue | 4 ++-- .../courseware/tasks/TaskGroupsAddSolversDialog.vue | 4 ++-- .../courseware/unit/CoursewareUnitItem.vue | 2 +- .../courseware/unit/CoursewareUnitProgress.vue | 2 +- .../form_inputs/CalendarPermissionsTable.vue | 6 ++---- .../form_inputs/MyCoursesColouredTable.vue | 2 +- .../vue/components/questionnaires/InputArray.vue | 6 +++--- resources/vue/components/tree/StudipTreeList.vue | 11 ++++------- resources/vue/components/tree/StudipTreeTable.vue | 11 ++++------- resources/vue/components/tree/TreeBreadcrumb.vue | 2 +- resources/vue/components/tree/TreeCourseDetails.vue | 2 +- resources/vue/components/tree/TreeNodeTile.vue | 2 +- resources/vue/components/tree/TreeSearchResult.vue | 2 +- 21 files changed, 43 insertions(+), 56 deletions(-) diff --git a/resources/vue/components/ActiveFilter.vue b/resources/vue/components/ActiveFilter.vue index 5394bce50a0..d4654faa9f4 100644 --- a/resources/vue/components/ActiveFilter.vue +++ b/resources/vue/components/ActiveFilter.vue @@ -4,7 +4,7 @@ <button @click="onRemoveActiveFilter" type="button" - :title="$gettextInterpolate($gettext('Filter \'%{name}\' entfernen'), { name }, true)" + :title="$gettextInterpolate($gettext('Filter \'%{name}\' entfernen'), { name })" > <StudipIcon class="text-bottom" shape="decline" role="presentation" alt="" /> </button> diff --git a/resources/vue/components/AdminCourses.vue b/resources/vue/components/AdminCourses.vue index ac4d3179239..4d7229c3949 100644 --- a/resources/vue/components/AdminCourses.vue +++ b/resources/vue/components/AdminCourses.vue @@ -31,7 +31,7 @@ <th v-for="activeField in sortedActivatedFields" :key="`field-${activeField}`" :class="sort.by === activeField ? 'sort' + sort.direction.toLowerCase() : ''"> <a href="#" @click.prevent="changeSort(activeField)" - :title="sort.by === activeField && sort.direction === 'ASC' ? $gettextInterpolate('Sortiert aufsteigend nach %{field}', {field: fields[activeField]}, true) : (sort.by === activeField && sort.direction === 'DESC' ? $gettextInterpolate('Sortiert absteigend nach %{ field } ', { field: fields[activeField]}, true) : $gettextInterpolate('Sortieren nach %{ field }', { field: fields[activeField]}, true))" + :title="sort.by === activeField && sort.direction === 'ASC' ? $gettextInterpolate('Sortiert aufsteigend nach %{field}', {field: fields[activeField]}) : (sort.by === activeField && sort.direction === 'DESC' ? $gettextInterpolate('Sortiert absteigend nach %{ field } ', { field: fields[activeField]}) : $gettextInterpolate('Sortieren nach %{ field }', { field: fields[activeField]}))" v-if="!unsortableFields.includes(activeField)" > {{ fields[activeField] }} diff --git a/resources/vue/components/ContentModulesControl.vue b/resources/vue/components/ContentModulesControl.vue index 34f4125624c..f403bddb8c1 100644 --- a/resources/vue/components/ContentModulesControl.vue +++ b/resources/vue/components/ContentModulesControl.vue @@ -15,7 +15,7 @@ @click.prevent="toggleModuleVisibility(module)"> <studip-icon :shape="module.visibility !== 'tutor' ? 'visibility-visible' : 'visibility-invisible'" class="text-bottom" - :title="$gettextInterpolate($gettext('Inhaltsmodul %{ name } für Teilnehmende unsichtbar bzw. sichtbar schalten'), { name: module.displayname}, true)"></studip-icon> + :title="$gettextInterpolate($gettext('Inhaltsmodul %{ name } für Teilnehmende unsichtbar bzw. sichtbar schalten'), { name: module.displayname})"></studip-icon> </a> </div> </div> diff --git a/resources/vue/components/ContentModulesEditTiles.vue b/resources/vue/components/ContentModulesEditTiles.vue index ae9324c4e7a..07bfa58f42e 100644 --- a/resources/vue/components/ContentModulesEditTiles.vue +++ b/resources/vue/components/ContentModulesEditTiles.vue @@ -35,8 +35,7 @@ $gettext( 'Sortierelement für Werkzeug %{module}. Drücken Sie die Tasten Pfeil-nach-oben oder Pfeil-nach-unten, um dieses Element in der Liste zu verschieben.' ), - { module: module.displayname }, - true + { module: module.displayname } ) " @keydown="keyboardHandler($event, module)" @@ -77,8 +76,7 @@ $gettext( 'Inhaltsmodul %{ name } für Teilnehmende unsichtbar bzw. sichtbar schalten' ), - { name: module.displayname }, - true + { name: module.displayname } ) " ></studip-icon> @@ -92,8 +90,7 @@ $gettext( 'Umbenennen des Inhaltsmoduls %{ name }' ), - { name: module.displayname }, - true + { name: module.displayname } ) " ></studip-icon> diff --git a/resources/vue/components/ContentmodulesEditTable.vue b/resources/vue/components/ContentmodulesEditTable.vue index 39835a7007e..0af3152ab41 100644 --- a/resources/vue/components/ContentmodulesEditTable.vue +++ b/resources/vue/components/ContentmodulesEditTable.vue @@ -25,8 +25,7 @@ $gettext( 'Sortierelement für Module %{module}. Drücken Sie die Tasten Pfeil-nach-oben oder Pfeil-nach-unten, um dieses Element in der Liste zu verschieben.' ), - { module: module.displayname }, - true + { module: module.displayname } ) " @keydown="keyboardHandler($event, module)" @@ -72,8 +71,7 @@ $gettext( 'Inhaltsmodul %{ name } für Teilnehmende unsichtbar bzw. sichtbar schalten' ), - { name: module.displayname }, - true + { name: module.displayname } ) " ></studip-icon> @@ -85,7 +83,7 @@ :title=" $gettextInterpolate($gettext('Umbenennen des Inhaltsmoduls %{ name }'), { name: module.displayname, - }, true) + }) " ></studip-icon> </a> diff --git a/resources/vue/components/EditableList.vue b/resources/vue/components/EditableList.vue index 39c32ace231..cf1716b6357 100644 --- a/resources/vue/components/EditableList.vue +++ b/resources/vue/components/EditableList.vue @@ -12,7 +12,7 @@ <studip-icon v-if="item.icon" :shape="item.icon" role="info" :size="20" class="text-bottom" alt=""></studip-icon> <input v-if="name" type="hidden" :name="name + '[]'" :value="item.value"> <span>{{item.name}}</span> - <button v-if="item.deletable" @click.prevent="deleteItem(item)" :title="$gettextInterpolate($gettext('%{ name } löschen'), {name: item.name}, true)" class="undecorated"> + <button v-if="item.deletable" @click.prevent="deleteItem(item)" :title="$gettextInterpolate($gettext('%{ name } löschen'), {name: item.name})" class="undecorated"> <studip-icon shape="trash" role="clickable" :size="20" class="text-bottom"></studip-icon> </button> </li> diff --git a/resources/vue/components/FilesTable.vue b/resources/vue/components/FilesTable.vue index 4ddd8d6d5ed..dbb305def82 100644 --- a/resources/vue/components/FilesTable.vue +++ b/resources/vue/components/FilesTable.vue @@ -138,7 +138,7 @@ > <a href="#" @click.prevent - :title="$gettextInterpolate($gettext('Nach %{ colName } sortieren'), {colName: name}, true)"> + :title="$gettextInterpolate($gettext('Nach %{ colName } sortieren'), {colName: name})"> {{name}} </a> </th> @@ -176,14 +176,14 @@ <a :href="folder.url" :id="`folder-${folder.id}`" :title="$gettextInterpolate($gettext('Ordner %{foldername} öffnen'), - { foldername: folder.name}, true)"> + { foldername: folder.name})"> <studip-icon :shape="folder.icon" :size="26" class="text-bottom" alt=""></studip-icon> </a> </td> <td :class="{'filter-match': valueMatchesFilter(folder.name)}"> <a :href="folder.url" :title="$gettextInterpolate($gettext('Ordner %{foldername} öffnen'), - { foldername: folder.name}, true)"> + { foldername: folder.name})"> <span v-html="highlightString(folder.name)"></span> </a> </td> @@ -234,7 +234,7 @@ :href="file.download_url" target="_blank" rel="noopener noreferrer" :title="$gettextInterpolate($gettext('Datei %{filename} herunterladen'), - { filename: file.name }, true)"> + { filename: file.name })"> <studip-icon :shape="file.icon" role="clickable" size="24" class="text-bottom"></studip-icon> </a> <studip-icon v-else :shape="file.icon" role="clickable" size="24"></studip-icon> @@ -243,14 +243,14 @@ class="lightbox-image" data-lightbox="gallery" :title="$gettextInterpolate($gettext('Datei %{filename} anzeigen'), - { filename: file.name }, true)"></a> + { filename: file.name })"></a> </td> <td :class="{'filter-match': valueMatchesFilter(file.name)}"> <a :href="file.details_url" data-dialog :id="`file-${file.id}`" :title="$gettextInterpolate($gettext('Details zur Datei %{filename} anzeigen'), - { filename: file.name }, true)"> + { filename: file.name })"> <span v-html="highlightString(file.name)"></span> <studip-icon v-if="file.isAccessible" shape="accessibility" diff --git a/resources/vue/components/courseware/CoursewareContentPermissions.vue b/resources/vue/components/courseware/CoursewareContentPermissions.vue index 60f09644471..d2412ef26c4 100644 --- a/resources/vue/components/courseware/CoursewareContentPermissions.vue +++ b/resources/vue/components/courseware/CoursewareContentPermissions.vue @@ -42,7 +42,7 @@ <td class="perm"> <input class="right" - :title="$gettextInterpolate($gettext('Leserechte für %{ userName }'), { userName: user_perm.username }, true)" + :title="$gettextInterpolate($gettext('Leserechte für %{ userName }'), { userName: user_perm.username })" type="radio" :name="`${user_perm.id}_right`" value="read" @@ -53,7 +53,7 @@ <td class="perm"> <input class="right" - :title="$gettextInterpolate($gettext('Lese- und Schreibrechte für %{ userName }'), { userName: user_perm.username }, true)" + :title="$gettextInterpolate($gettext('Lese- und Schreibrechte für %{ userName }'), { userName: user_perm.username })" type="radio" :name="`${user_perm.id}_right`" value="write" @@ -75,7 +75,7 @@ <td class="actions"> <button class="cw-permission-delete" - :title="$gettextInterpolate($gettext('Entfernen der Rechte von %{ userName }'), { userName: user_perm.username }, true)" + :title="$gettextInterpolate($gettext('Entfernen der Rechte von %{ userName }'), { userName: user_perm.username })" @click.prevent="confirmDeleteUserPerm(index)" > </button> diff --git a/resources/vue/components/courseware/tasks/CoursewareTasksDialogDistribute.vue b/resources/vue/components/courseware/tasks/CoursewareTasksDialogDistribute.vue index 7680167cd2e..1e076c752fa 100644 --- a/resources/vue/components/courseware/tasks/CoursewareTasksDialogDistribute.vue +++ b/resources/vue/components/courseware/tasks/CoursewareTasksDialogDistribute.vue @@ -179,7 +179,7 @@ :aria-label=" $gettextInterpolate($gettext('%{userName} auswählen'), { userName: user.formattedname, - }, true) + }) " /> </td> @@ -217,7 +217,7 @@ :aria-label=" $gettextInterpolate($gettext('%{groupName} auswählen'), { groupName: group.name, - }, true) + }) " /> </td> diff --git a/resources/vue/components/courseware/tasks/TaskGroupsAddSolversDialog.vue b/resources/vue/components/courseware/tasks/TaskGroupsAddSolversDialog.vue index d7db6e19963..a84334169a2 100644 --- a/resources/vue/components/courseware/tasks/TaskGroupsAddSolversDialog.vue +++ b/resources/vue/components/courseware/tasks/TaskGroupsAddSolversDialog.vue @@ -44,7 +44,7 @@ :aria-label=" $gettextInterpolate($gettext('%{userName} auswählen'), { userName: user.formattedname, - }, true) + }) " /> </td> @@ -77,7 +77,7 @@ :aria-label=" $gettextInterpolate($gettext('%{groupName} auswählen'), { groupName: group.name, - }, true) + }) " /> </td> diff --git a/resources/vue/components/courseware/unit/CoursewareUnitItem.vue b/resources/vue/components/courseware/unit/CoursewareUnitItem.vue index dc68225f873..f09601e94d7 100644 --- a/resources/vue/components/courseware/unit/CoursewareUnitItem.vue +++ b/resources/vue/components/courseware/unit/CoursewareUnitItem.vue @@ -63,7 +63,7 @@ :question=" $gettextInterpolate($gettext('Möchten Sie das Lernmaterial %{ unitTitle } wirklich löschen?'), { unitTitle: title, - }, true) + }) " height="200" @confirm="executeDelete" diff --git a/resources/vue/components/courseware/unit/CoursewareUnitProgress.vue b/resources/vue/components/courseware/unit/CoursewareUnitProgress.vue index 31c6c01d3a7..7c9de011ea1 100644 --- a/resources/vue/components/courseware/unit/CoursewareUnitProgress.vue +++ b/resources/vue/components/courseware/unit/CoursewareUnitProgress.vue @@ -17,7 +17,7 @@ <h1> <a :href="chapterUrl" - :title="$gettextInterpolate('%{ pageTitle } öffnen', { pageTitle: selected.name }, true)" + :title="$gettextInterpolate('%{ pageTitle } öffnen', { pageTitle: selected.name })" > {{ selected.name }} </a> diff --git a/resources/vue/components/form_inputs/CalendarPermissionsTable.vue b/resources/vue/components/form_inputs/CalendarPermissionsTable.vue index e507adce1e3..a0a76a2897a 100644 --- a/resources/vue/components/form_inputs/CalendarPermissionsTable.vue +++ b/resources/vue/components/form_inputs/CalendarPermissionsTable.vue @@ -30,16 +30,14 @@ v-model="user.write_permissions" :aria-label="$gettextInterpolate( $gettext('Schreibzugriff für %{name}'), - {name: user.name}, - true + {name: user.name} )"> </td> <td class="actions"> <studip-icon shape="trash" aria-role="button" @click="removeContact(user.id)" :title="$gettextInterpolate( $gettext('Kalender nicht mehr mit %{name} teilen'), - {name: user.name}, - true + {name: user.name} )"></studip-icon> </td> </tr> diff --git a/resources/vue/components/form_inputs/MyCoursesColouredTable.vue b/resources/vue/components/form_inputs/MyCoursesColouredTable.vue index fe67db55661..d2cc2f1aa3f 100644 --- a/resources/vue/components/form_inputs/MyCoursesColouredTable.vue +++ b/resources/vue/components/form_inputs/MyCoursesColouredTable.vue @@ -42,7 +42,7 @@ <input type="hidden" :name="`${name}_course_ids[${course.id}]`" value="0"> <input type="checkbox" :name="`${name}_course_ids[${course.id}]`" value="1" :checked="selected_course_id_list.includes(course.id)" - :title="$gettextInterpolate($gettext('%{course} auswählen'), {course: course.name}, true)"> + :title="$gettextInterpolate($gettext('%{course} auswählen'), {course: course.name})"> </td> </tr> <tr v-if="loadedSemesters.includes(semester_id) && courses.length === 0"> diff --git a/resources/vue/components/questionnaires/InputArray.vue b/resources/vue/components/questionnaires/InputArray.vue index 896418f425d..f57ca58d33a 100644 --- a/resources/vue/components/questionnaires/InputArray.vue +++ b/resources/vue/components/questionnaires/InputArray.vue @@ -22,7 +22,7 @@ <td class="dragcolumn"> <a class="dragarea" tabindex="0" - :title="$gettextInterpolate($gettext(`Sortierelement für %{label} %{option}. Drücken Sie die Tasten Pfeil-nach-oben oder Pfeil-nach-unten, um dieses Element in der Liste zu verschieben.`), {option, label}, true)" + :title="$gettextInterpolate($gettext(`Sortierelement für %{label} %{option}. Drücken Sie die Tasten Pfeil-nach-oben oder Pfeil-nach-unten, um dieses Element in der Liste zu verschieben.`), {option, label})" @keydown="keyHandler($event, index)" ref="draghandle"> <span class="drag-handle"></span> @@ -41,7 +41,7 @@ shape="trash" :size="20" @click.prevent="deleteOption(index)" - :title="$gettextInterpolate($gettext('%{label} löschen'), {label}, true)" + :title="$gettextInterpolate($gettext('%{label} löschen'), {label})" /> </td> </tr> @@ -50,7 +50,7 @@ <tr> <td :colspan="3 + additionalColspan"> <button class="as-link" - :title="$gettextInterpolate($gettext('%{label} hinzufügen'), {label}, true)" + :title="$gettextInterpolate($gettext('%{label} hinzufügen'), {label})" @click.prevent="addOption()"> <StudipIcon shape="add" :size="20" alt="" /> </button> diff --git a/resources/vue/components/tree/StudipTreeList.vue b/resources/vue/components/tree/StudipTreeList.vue index 6214234c3e9..2ab489c62a4 100644 --- a/resources/vue/components/tree/StudipTreeList.vue +++ b/resources/vue/components/tree/StudipTreeList.vue @@ -15,7 +15,7 @@ <a v-if="editable && currentNode.attributes.id !== 'root'" :href="editUrl + '/' + currentNode.attributes.id" @click.prevent="editNode(editUrl, currentNode.id)" data-dialog="size=medium" - :title="$gettextInterpolate($gettext('%{name} bearbeiten'), {name: currentNode.attributes.name}, true)"> + :title="$gettextInterpolate($gettext('%{name} bearbeiten'), {name: currentNode.attributes.name})"> <studip-icon shape="edit" :size="20"></studip-icon> </a> @@ -36,7 +36,7 @@ <li v-for="(child, index) in children" :key="index" class="studip-tree-child"> <a v-if="editable && children.length > 1" class="drag-link" tabindex="0" - :title="$gettextInterpolate($gettext('Sortierelement für Element %{node}. Drücken Sie die Tasten Pfeil-nach-oben oder Pfeil-nach-unten, um dieses Element in der Liste zu verschieben.'), {node: child.attributes.name}, true)" + :title="$gettextInterpolate($gettext('Sortierelement für Element %{node}. Drücken Sie die Tasten Pfeil-nach-oben oder Pfeil-nach-unten, um dieses Element in der Liste zu verschieben.'), {node: child.attributes.name})" @keydown="keyHandler($event, index)" :ref="'draghandle-' + index"> <span class="drag-handle"></span> @@ -92,11 +92,8 @@ <tr v-for="(course) in courses" :key="course.id" class="studip-tree-child studip-tree-course"> <td> <a :href="courseUrl(course.id)" tabindex="0" - :title="$gettextInterpolate( - $gettext('Zur Veranstaltung %{ title }'), - { title: course.attributes.title }, - true - )"> + :title="$gettextInterpolate($gettext('Zur Veranstaltung %{ title }'), + { title: course.attributes.title })"> <studip-icon shape="seminar" :size="26"></studip-icon> <template v-if="course.attributes['course-number']"> {{ course.attributes['course-number'] }} diff --git a/resources/vue/components/tree/StudipTreeTable.vue b/resources/vue/components/tree/StudipTreeTable.vue index 093dd9c7a4c..4cfa7d59fd8 100644 --- a/resources/vue/components/tree/StudipTreeTable.vue +++ b/resources/vue/components/tree/StudipTreeTable.vue @@ -79,7 +79,7 @@ <td> <a v-if="editable && children.length > 1" class="drag-link" role="option" tabindex="0" - :title="$gettextInterpolate($gettext('Sortierelement für Element %{node}. Drücken Sie die Tasten Pfeil-nach-oben oder Pfeil-nach-unten, um dieses Element in der Liste zu verschieben.'), {node: child.attributes.name}, true)" + :title="$gettextInterpolate($gettext('Sortierelement für Element %{node}. Drücken Sie die Tasten Pfeil-nach-oben oder Pfeil-nach-unten, um dieses Element in der Liste zu verschieben.'), {node: child.attributes.name})" @keydown="keyHandler($event, index)" :ref="'draghandle-' + index"> <span class="drag-handle"></span> @@ -93,7 +93,7 @@ <a :href="nodeUrl(child.id, semester !== 'all' ? semester : null)" tabindex="0" @click.prevent="openNode(child)" :title="$gettextInterpolate($gettext('Unterebene %{ node } öffnen'), - { node: node.attributes.name }, true)"> + { node: node.attributes.name })"> {{ child.attributes.name }} </a> </td> @@ -112,11 +112,8 @@ </td> <td> <a :href="courseUrl(course.id)" tabindex="0" - :title="$gettextInterpolate( - $gettext('Zur Veranstaltung %{ title }'), - { title: course.attributes.title }, - true - )"> + :title="$gettextInterpolate($gettext('Zur Veranstaltung %{ title }'), + { title: course.attributes.title })"> <template v-if="course.attributes['course-number']"> {{ course.attributes['course-number'] }} </template> diff --git a/resources/vue/components/tree/TreeBreadcrumb.vue b/resources/vue/components/tree/TreeBreadcrumb.vue index a8c3dd5e36a..33b04b3c0a2 100644 --- a/resources/vue/components/tree/TreeBreadcrumb.vue +++ b/resources/vue/components/tree/TreeBreadcrumb.vue @@ -10,7 +10,7 @@ <a :href="nodeUrl(ancestor.classname + '_' + ancestor.id)" :ref="ancestor.id" @click.prevent="openNode(ancestor.id, ancestor.classname)" tabindex="0" :id="'tree-breadcrumb-' + ancestor.id" - :title="$gettextInterpolate($gettext('%{ node } öffnen'), { node: ancestor.name}, true)"> + :title="$gettextInterpolate($gettext('%{ node } öffnen'), { node: ancestor.name})"> {{ ancestor.name }} </a> <template v-if="index !== node.attributes.ancestors.length - 1"> diff --git a/resources/vue/components/tree/TreeCourseDetails.vue b/resources/vue/components/tree/TreeCourseDetails.vue index 020cc330c0d..6f3e056cdb1 100644 --- a/resources/vue/components/tree/TreeCourseDetails.vue +++ b/resources/vue/components/tree/TreeCourseDetails.vue @@ -12,7 +12,7 @@ <span v-for="(lecturer, index) in details.lecturers" :key="index"> <a :href="profileUrl(lecturer.username)" :title="$gettextInterpolate($gettext('Zum Profil von %{ user }'), - { user: lecturer.name }, true)" + { user: lecturer.name })" tabindex="0"> {{ lecturer.name }} </a><template v-if="details.lecturers.length > 1 && index < details.lecturers.length - 1">, </template> diff --git a/resources/vue/components/tree/TreeNodeTile.vue b/resources/vue/components/tree/TreeNodeTile.vue index 698cc25c024..dab2bdf9ff6 100644 --- a/resources/vue/components/tree/TreeNodeTile.vue +++ b/resources/vue/components/tree/TreeNodeTile.vue @@ -1,6 +1,6 @@ <template> <a :href="url" @click.prevent="openNode" :title="$gettextInterpolate($gettext('Unterebene %{ node } öffnen'), - { node: node.attributes.name }, true)"> + { node: node.attributes.name })"> <p class="studip-tree-child-title"> {{ node.attributes.name }} </p> diff --git a/resources/vue/components/tree/TreeSearchResult.vue b/resources/vue/components/tree/TreeSearchResult.vue index 9799dae1f4c..1943dd355fe 100644 --- a/resources/vue/components/tree/TreeSearchResult.vue +++ b/resources/vue/components/tree/TreeSearchResult.vue @@ -31,7 +31,7 @@ </td> <td> <a :href="courseUrl(course.id)" - :title="$gettextInterpolate($gettext('Zur Veranstaltung %{title}'), {title: course.attributes.title}, true)" + :title="$gettextInterpolate($gettext('Zur Veranstaltung %{title}'), {title: course.attributes.title})" tabindex="0"> <template v-if="course.attributes['course-number']"> {{ course.attributes['course-number'] }} -- GitLab