From efe2151dcebea4fdf416f23315218dc6b5654d81 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?=
Date: Tue, 26 Sep 2023 12:17:34 +0200
Subject: [PATCH 1/5] MOBILE-4348 style: Change css radius names
---
.../components/blogtags/blogtags.scss | 2 +-
.../block/tags/components/tags/tags.scss | 2 +-
src/addons/notifications/notifications.scss | 4 ++--
.../components/error-info/error-info.scss | 2 +-
src/core/components/message/message.scss | 2 +-
.../send-message-form/send-message-form.scss | 2 +-
.../components/sheet-modal/sheet-modal.scss | 2 +-
src/core/components/timer/timer.scss | 2 +-
.../module-info/course-module-info.scss | 2 +-
.../course/components/module/module.scss | 2 +-
.../pages/course-summary/course-summary.scss | 6 +++---
.../pages/module-preview/module-preview.scss | 2 +-
.../rich-text-editor/rich-text-editor.scss | 2 +-
src/theme/components/collapsible-item.scss | 2 +-
src/theme/components/format-text.scss | 4 ++--
src/theme/theme.base.scss | 15 ++++++++-------
src/theme/theme.design-system.scss | 19 +++++++++++++++----
src/theme/theme.light.scss | 10 +++++-----
18 files changed, 47 insertions(+), 35 deletions(-)
diff --git a/src/addons/block/blogtags/components/blogtags/blogtags.scss b/src/addons/block/blogtags/components/blogtags/blogtags.scss
index 9554c90a9..85844a8fd 100644
--- a/src/addons/block/blogtags/components/blogtags/blogtags.scss
+++ b/src/addons/block/blogtags/components/blogtags/blogtags.scss
@@ -22,7 +22,7 @@
contain: content;
vertical-align: baseline;
text-decoration: none;
- border-radius: var(--small-radius);
+ border-radius: var(--radius-xs);
}
.s20 {
font-size: 1.5em;
diff --git a/src/addons/block/tags/components/tags/tags.scss b/src/addons/block/tags/components/tags/tags.scss
index e6141bf4e..5580a6bdd 100644
--- a/src/addons/block/tags/components/tags/tags.scss
+++ b/src/addons/block/tags/components/tags/tags.scss
@@ -24,7 +24,7 @@
contain: content;
vertical-align: baseline;
text-decoration: none;
- border-radius: var(--small-radius);
+ border-radius: var(--radius-xs);
}
.s20 {
font-size: 2.7em;
diff --git a/src/addons/notifications/notifications.scss b/src/addons/notifications/notifications.scss
index 2f144dd2a..fa061dafe 100644
--- a/src/addons/notifications/notifications.scss
+++ b/src/addons/notifications/notifications.scss
@@ -16,7 +16,7 @@
.core-avatar-extra-img {
background: var(--background-color);
- border-radius: var(--medium-radius);
+ border-radius: var(--radius-sm);
img {
max-width: var(--extra-icon-size);
max-height: var(--extra-icon-size);
@@ -39,7 +39,7 @@
}
padding: 0.7rem;
background: var(--background-color);
- border-radius: var(--small-radius);
+ border-radius: var(--radius-xs);
}
.core-notification-icon {
diff --git a/src/core/components/error-info/error-info.scss b/src/core/components/error-info/error-info.scss
index 97922518f..05c0a69dc 100644
--- a/src/core/components/error-info/error-info.scss
+++ b/src/core/components/error-info/error-info.scss
@@ -1,6 +1,6 @@
.core-error-info {
background: var(--gray-200);
- border-radius: var(--small-radius);
+ border-radius: var(--radius-xs);
font-size: var(--font-size-sm);
color: var(--gray-900);
diff --git a/src/core/components/message/message.scss b/src/core/components/message/message.scss
index 70e80d774..3ece454ac 100644
--- a/src/core/components/message/message.scss
+++ b/src/core/components/message/message.scss
@@ -18,7 +18,7 @@
position: relative;
border: 0;
- border-radius: var(--medium-radius);
+ border-radius: var(--radius-sm);
margin: 8px;
width: 90%;
max-width: var(--list-item-max-width);
diff --git a/src/core/components/send-message-form/send-message-form.scss b/src/core/components/send-message-form/send-message-form.scss
index 1607e186e..89f1fac85 100644
--- a/src/core/components/send-message-form/send-message-form.scss
+++ b/src/core/components/send-message-form/send-message-form.scss
@@ -3,7 +3,7 @@
--textarea-color: var(--core-input-text);
--textarea-border-width: var(--core-input-border-width);
--textarea-border-color: var(--core-input-stroke);
- --textarea-radius: var(--huge-radius);
+ --textarea-radius: var(--radius-xl);
form {
position: relative;
diff --git a/src/core/components/sheet-modal/sheet-modal.scss b/src/core/components/sheet-modal/sheet-modal.scss
index d80185bab..a03fd57e8 100644
--- a/src/core/components/sheet-modal/sheet-modal.scss
+++ b/src/core/components/sheet-modal/sheet-modal.scss
@@ -17,7 +17,7 @@
}
.sheet-modal--wrapper {
- border-radius: var(--big-radius) var(--big-radius) 0 0;
+ border-radius: var(--radius-lg) var(--radius-lg) 0 0;
@include padding(24px, 16px, 24px, 16px);
background-color: var(--ion-overlay-background-color, var(--ion-background-color, #fff));
diff --git a/src/core/components/timer/timer.scss b/src/core/components/timer/timer.scss
index aa91db278..0a7bf56da 100644
--- a/src/core/components/timer/timer.scss
+++ b/src/core/components/timer/timer.scss
@@ -20,7 +20,7 @@
div.core-timer {
background: var(--timer-background);
color: var(--timer-text-color, var(--text-color));
- border-radius: var(--big-radius);
+ border-radius: var(--radius-lg);
}
button {
diff --git a/src/core/features/course/components/module-info/course-module-info.scss b/src/core/features/course/components/module-info/course-module-info.scss
index dc84dd852..e9030e723 100644
--- a/src/core/features/course/components/module-info/course-module-info.scss
+++ b/src/core/features/course/components/module-info/course-module-info.scss
@@ -21,7 +21,7 @@
.core-module-info-box {
background: var(--light);
- border-radius: var(--small-radius);
+ border-radius: var(--radius-xs);
margin: 8px;
padding: 8px;
diff --git a/src/core/features/course/components/module/module.scss b/src/core/features/course/components/module/module.scss
index 84b5db76c..26a9d0770 100644
--- a/src/core/features/course/components/module/module.scss
+++ b/src/core/features/course/components/module/module.scss
@@ -55,7 +55,7 @@
.core-course-module-info {
.core-module-dates-availabilityinfo {
background: var(--light);
- border-radius: var(--small-radius);
+ border-radius: var(--radius-xs);
padding: 8px;
}
diff --git a/src/core/features/course/pages/course-summary/course-summary.scss b/src/core/features/course/pages/course-summary/course-summary.scss
index f0b9ff3c2..03c882ad9 100644
--- a/src/core/features/course/pages/course-summary/course-summary.scss
+++ b/src/core/features/course/pages/course-summary/course-summary.scss
@@ -43,8 +43,8 @@
.course-container {
position: relative;
- top: calc(var(--thumb-height) - var(--big-radius));
- border-radius: var(--big-radius) var(--big-radius) 0 0;
+ top: calc(var(--thumb-height) - var(--radius-lg));
+ border-radius: var(--radius-lg) var(--radius-lg) 0 0;
background-color: var(--ion-background-color);
box-shadow: var(--drop-shadow-top);
clip-path: inset(-5px 0px 0px 0px);
@@ -68,7 +68,7 @@
.core-course-dates {
background: var(--light);
- border-radius: var(--small-radius);
+ border-radius: var(--radius-xs);
padding: 8px;
width: 100%;
diff --git a/src/core/features/course/pages/module-preview/module-preview.scss b/src/core/features/course/pages/module-preview/module-preview.scss
index 21bd09377..1481b21b3 100644
--- a/src/core/features/course/pages/module-preview/module-preview.scss
+++ b/src/core/features/course/pages/module-preview/module-preview.scss
@@ -2,7 +2,7 @@
.core-module-availabilityinfo {
background: var(--light);
- border-radius: var(--small-radius);
+ border-radius: var(--radius-xs);
padding: 8px;
font-size: 90%;
::ng-deep ul {
diff --git a/src/core/features/editor/components/rich-text-editor/rich-text-editor.scss b/src/core/features/editor/components/rich-text-editor/rich-text-editor.scss
index a335fddcb..b009050e0 100644
--- a/src/core/features/editor/components/rich-text-editor/rich-text-editor.scss
+++ b/src/core/features/editor/components/rich-text-editor/rich-text-editor.scss
@@ -125,7 +125,7 @@
margin: 0 auto;
font-size: 18px;
background-color: var(--toobar-background);
- border-radius: var(--small-radius);
+ border-radius: var(--radius-xs);
@include core-transition(background-color, 200ms);
color: var(--button-color);
cursor: pointer;
diff --git a/src/theme/components/collapsible-item.scss b/src/theme/components/collapsible-item.scss
index 616bcb02e..679cb75c6 100644
--- a/src/theme/components/collapsible-item.scss
+++ b/src/theme/components/collapsible-item.scss
@@ -38,7 +38,7 @@
min-width: var(--toggle-size);
height: var(--toggle-size);
width: var(--toggle-size);
- --border-radius: var(--huge-radius);
+ --border-radius: var(--radius-xl);
border-radius: var(--border-radius);
--padding-start: 0px;
--padding-end: 0px;
diff --git a/src/theme/components/format-text.scss b/src/theme/components/format-text.scss
index 13ba068ae..55296f0ff 100644
--- a/src/theme/components/format-text.scss
+++ b/src/theme/components/format-text.scss
@@ -74,7 +74,7 @@ core-format-text {
position: absolute;
@include position(null, 10px, 10px, null);
color: var(--ion-text-color);
- border-radius: var(--huge-radius);
+ border-radius: var(--radius-xl);
background-color: var(--core-format-text-viewer-icon-background);
display: flex;
@@ -284,7 +284,7 @@ core-rich-text-editor .core-rte-editor {
border: 1px solid var(--gray-500);
background: var(--contrast-background);
padding: 6px 8px;
- border-radius: var(--small-radius);
+ border-radius: var(--radius-xs);
margin-left: 2px;
margin-right: 2px;
margin-bottom: 10px;
diff --git a/src/theme/theme.base.scss b/src/theme/theme.base.scss
index 5ebfcbfd0..8d55ea74f 100644
--- a/src/theme/theme.base.scss
+++ b/src/theme/theme.base.scss
@@ -166,7 +166,7 @@ ion-header {
--color: var(--core-header-buttons-color);
--background: var(--core-header-buttons-background);
--ion-toolbar-color: var(--core-header-buttons-color);
- --border-radius: var(--huge-radius);
+ --border-radius: var(--radius-xl);
--primary: var(--core-header-buttons-color);
}
ion-back-button::part(text) {
@@ -376,7 +376,7 @@ ion-button:not(.button-has-icon-only):not(.button-small) > ion-icon {
}
ion-button.button.button-clear.button-has-icon-only {
- --border-radius: var(--huge-radius);
+ --border-radius: var(--radius-xl);
}
ion-button.button.button-clear {
@@ -498,7 +498,7 @@ ion-alert .alert-button.timed-button{
}
ion-alert {
- --border-radius: var(--huge-radius);
+ --border-radius: var(--radius-xl);
&.md, &.ios {
--max-width: 80%;
@@ -531,7 +531,7 @@ ion-alert {
}
ion-loading {
- --border-radius: var(--huge-radius);
+ --border-radius: var(--radius-xl);
.loading-wrapper {
border-radius: var(--border-radius) !important;
@@ -741,7 +741,7 @@ body.core-iframe-fullscreen ion-router-outlet {
}
.core-password-modal {
- --border-radius: var(--medium-radius);
+ --border-radius: var(--radius-sm);
--min-width: auto;
--min-height: 300px;
--width: 384px;
@@ -837,6 +837,7 @@ body.core-iframe-fullscreen ion-router-outlet {
--border-width: 0;
--border-color: var(--color-tint);
+ --border-radius: var(--radius-sm);
--background: var(--color-tint);
--color: var(--color-shade);
@@ -978,7 +979,7 @@ ion-action-sheet.md {
}
.action-sheet-group:first-child {
- border-radius: var(--big-radius) var(--big-radius) 0 0;
+ border-radius: var(--radius-lg) var(--radius-lg) 0 0;
}
.action-sheet-group-cancel {
@@ -1125,7 +1126,7 @@ ion-select-popover {
ion-badge {
line-height: 1.1;
padding: 2px 8px;
- border-radius: var(--big-radius);
+ border-radius: var(--radius-lg);
}
ion-chip,
diff --git a/src/theme/theme.design-system.scss b/src/theme/theme.design-system.scss
index 7cdb11dd7..21bf109e1 100644
--- a/src/theme/theme.design-system.scss
+++ b/src/theme/theme.design-system.scss
@@ -10,10 +10,21 @@ html {
--font-size-normal: 14px;
// Radiuses
- --small-radius: 4px;
- --medium-radius: 8px;
- --big-radius: 16px;
- --huge-radius: 24px;
+ --radius-none: 0px;
+ --radius-xs: 4px;
+ --radius-sm: 8px;
+ --radius-md: 12px;
+ --radius-lg: 16px;
+ --radius-xl: 24px;
+ --radius-round: 50%;
+
+ /** @deprecated since 4.3 **/
+ --small-radius: var(--radius-xs);
+ --medium-radius: var(--radius-sm);
+ --big-radius: var(--radius-lg);
+ --huge-radius: var(--radius-xl);
+
+
// A11y
--a11y-min-target-size: 44px;
diff --git a/src/theme/theme.light.scss b/src/theme/theme.light.scss
index f2d892099..3994ff948 100644
--- a/src/theme/theme.light.scss
+++ b/src/theme/theme.light.scss
@@ -67,11 +67,11 @@ html {
--core-input-stroke: var(--gray-500);
--core-input-text: var(--dark);
--core-input-background: var(--ion-background-color);
- --core-input-radius: var(--small-radius);
+ --core-input-radius: var(--radius-xs);
--core-input-border-width: 1px;
--module-icon-size: 24px;
- --module-icon-radius: var(--medium-radius);
+ --module-icon-radius: var(--sm-radius);
--list-item-max-width: 768px;
@@ -82,7 +82,7 @@ html {
--loader-background-color: rgba(0, 0, 0, .1);
--loader-shine: 251, 251, 251;
- --loader-radius: var(--small-radius);
+ --loader-radius: var(--radius-xs);
--loader-display: block;
--drop-shadow-color: 0, 0, 0, 0.5;
@@ -96,7 +96,7 @@ html {
--ion-card-color: var(--text-color);
--ion-card-vertical-margin: 10px;
--ion-card-horizontal-margin: 10px;
- --ion-card-radius: var(--medium-radius);
+ --ion-card-radius: var(--radius-sm);
--ion-card-border-width: 1px;
--ion-card-border-color: var(--stroke);
ion-card {
@@ -333,7 +333,7 @@ html {
--core-avatar-radius: 50%;
--core-courseimage-on-course-size: 72px;
- --core-courseimage-radius: var(--medium-radius);
+ --core-courseimage-radius: var(--radius-sm);
--core-navigation-background: var(--contrast-background);
From d790e2a7525161a5f4148da56614a6d73adca351 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?=
Date: Wed, 13 Sep 2023 14:00:29 +0200
Subject: [PATCH 2/5] MOBILE-4348 mod-icon: Sort Mod icon css variables
---
src/addons/block/timeline/components/events/events.scss | 2 +-
src/addons/notifications/notifications.scss | 2 +-
src/addons/notifications/pages/list/list.scss | 2 +-
.../pages/course-storage/course-storage.scss | 2 +-
src/core/components/mod-icon/mod-icon.scss | 8 ++++----
.../course/components/module-info/course-module-info.scss | 1 +
.../course/components/module-summary/module-summary.scss | 2 +-
src/core/features/grades/pages/course/course.scss | 2 +-
.../global-search-result/global-search-result.scss | 2 +-
src/theme/theme.light.scss | 3 ---
10 files changed, 12 insertions(+), 14 deletions(-)
diff --git a/src/addons/block/timeline/components/events/events.scss b/src/addons/block/timeline/components/events/events.scss
index f55d845f1..07634e1d5 100644
--- a/src/addons/block/timeline/components/events/events.scss
+++ b/src/addons/block/timeline/components/events/events.scss
@@ -23,7 +23,7 @@ h4.core-bold {
}
core-mod-icon {
- padding: 8px;
+ --padding: 8px;
--margin-end: 0.5rem;
--margin-vertical: 0;
}
diff --git a/src/addons/notifications/notifications.scss b/src/addons/notifications/notifications.scss
index fa061dafe..60caa6312 100644
--- a/src/addons/notifications/notifications.scss
+++ b/src/addons/notifications/notifications.scss
@@ -11,7 +11,7 @@
position: absolute;
right: -4px;
bottom: -4px;
- padding: 0.2rem;
+ --padding: 0.2rem;
}
.core-avatar-extra-img {
diff --git a/src/addons/notifications/pages/list/list.scss b/src/addons/notifications/pages/list/list.scss
index 28bc96fc3..cc83595d1 100644
--- a/src/addons/notifications/pages/list/list.scss
+++ b/src/addons/notifications/pages/list/list.scss
@@ -39,7 +39,7 @@ ion-item {
div.core-notification-icon,
core-mod-icon.core-notification-icon {
- padding: 8px;
+ --padding: 8px;
max-width: var(--core-avatar-size);
max-height: var(--core-avatar-size);
}
diff --git a/src/addons/storagemanager/pages/course-storage/course-storage.scss b/src/addons/storagemanager/pages/course-storage/course-storage.scss
index cf6193060..becd7cebb 100644
--- a/src/addons/storagemanager/pages/course-storage/course-storage.scss
+++ b/src/addons/storagemanager/pages/course-storage/course-storage.scss
@@ -51,7 +51,7 @@ ion-badge {
ion-item core-mod-icon {
--size: 18px;
- padding: 9px;
+ --padding: 9px;
--margin-vertical: 8px;
--margin-end: 8px;
}
diff --git a/src/core/components/mod-icon/mod-icon.scss b/src/core/components/mod-icon/mod-icon.scss
index 5ab0db1f0..8a6085ae4 100644
--- a/src/core/components/mod-icon/mod-icon.scss
+++ b/src/core/components/mod-icon/mod-icon.scss
@@ -2,10 +2,11 @@
:host {
display: inline-block;
- --size: var(--module-icon-size);
+ --size: var(--module-icon-size, 24px);
+ --padding: var(--module-icon-padding, 8px);
+ --icon-radius: var(--module-icon-radius, var(--radius-xs));
--margin-end: 0px;
--margin-vertical: 0px;
- --icon-radius: var(--small-radius);
--filter: brightness(0) invert(1);
margin-top: var(--margin-vertical);
@@ -13,7 +14,7 @@
@include margin-horizontal(null, var(--margin-end));
border-radius: var(--icon-radius);
- padding: 0.7rem;
+ padding: var(--padding);
background-color: $gray-100;
line-height: var(--size);
@@ -57,5 +58,4 @@ img {
:host-context(ion-card ion-item) {
--margin-vertical: 12px;
--margin-end: 12px;
- --icon-radius: var(--module-icon-radius);
}
diff --git a/src/core/features/course/components/module-info/course-module-info.scss b/src/core/features/course/components/module-info/course-module-info.scss
index e9030e723..e9f9146ff 100644
--- a/src/core/features/course/components/module-info/course-module-info.scss
+++ b/src/core/features/course/components/module-info/course-module-info.scss
@@ -10,6 +10,7 @@
core-mod-icon {
align-self: flex-start;
+ --padding: 12px;
}
h1 ion-icon {
diff --git a/src/core/features/course/components/module-summary/module-summary.scss b/src/core/features/course/components/module-summary/module-summary.scss
index a4bb647d2..e524c4757 100644
--- a/src/core/features/course/components/module-summary/module-summary.scss
+++ b/src/core/features/course/components/module-summary/module-summary.scss
@@ -11,7 +11,7 @@ h1 {
.core-modulename {
text-transform: uppercase;
core-mod-icon {
- padding: 3px;
+ --padding: 3px;
--size: 10px;
margin: 0;
}
diff --git a/src/core/features/grades/pages/course/course.scss b/src/core/features/grades/pages/course/course.scss
index 870b68b36..60ff2ab0a 100644
--- a/src/core/features/grades/pages/course/course.scss
+++ b/src/core/features/grades/pages/course/course.scss
@@ -86,7 +86,7 @@
}
core-mod-icon {
- padding: 0px;
+ --padding: 0px;
--size: 16px;
background: transparent;
--filter: var(--mod-icon-filter);
diff --git a/src/core/features/search/components/global-search-result/global-search-result.scss b/src/core/features/search/components/global-search-result/global-search-result.scss
index 7be59d0c0..566a5a56d 100644
--- a/src/core/features/search/components/global-search-result/global-search-result.scss
+++ b/src/core/features/search/components/global-search-result/global-search-result.scss
@@ -19,7 +19,7 @@
margin-inline-end: var(--spacing-2);
margin-top: 0px;
margin-bottom: 0px;
- padding: 0px;
+ --padding: 0px;
background: transparent;
}
diff --git a/src/theme/theme.light.scss b/src/theme/theme.light.scss
index 3994ff948..067c14541 100644
--- a/src/theme/theme.light.scss
+++ b/src/theme/theme.light.scss
@@ -70,9 +70,6 @@ html {
--core-input-radius: var(--radius-xs);
--core-input-border-width: 1px;
- --module-icon-size: 24px;
- --module-icon-radius: var(--sm-radius);
-
--list-item-max-width: 768px;
--modal-lateral-max-width: 320px;
From 05786e94d3da95884598ae59760fdd32d0ccb8bd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?=
Date: Wed, 27 Sep 2023 12:20:12 +0200
Subject: [PATCH 3/5] MOBILE-4348 module: Renew completion
---
scripts/langindex.json | 7 +-
.../mod/resource/services/handlers/module.ts | 9 ++
src/core/components/combobox/combobox.scss | 21 ---
.../course/components/components.module.ts | 3 +
.../module-completion-details.html | 44 ++++++
.../module-completion-details.scss | 22 +++
.../module-completion-details.ts | 91 ++++++++++++
.../module-completion-legacy.scss | 13 +-
.../module-completion-legacy.ts | 5 +-
.../core-course-module-completion.html | 103 +++++---------
.../module-completion/module-completion.scss | 17 +++
.../module-completion/module-completion.ts | 133 ++++++++++++++----
.../module-info/course-module-info.scss | 26 +---
.../core-course-module-manual-completion.html | 6 +-
.../module-manual-completion.ts | 6 +-
.../components/module/core-course-module.html | 15 +-
.../course/components/module/module.ts | 21 ++-
src/core/features/course/lang.json | 3 +
.../features/course/services/course-helper.ts | 5 -
src/core/features/course/services/course.ts | 3 +
src/theme/theme.base.scss | 69 +++++++--
src/theme/theme.light.scss | 1 +
22 files changed, 431 insertions(+), 192 deletions(-)
create mode 100644 src/core/features/course/components/module-completion-details/module-completion-details.html
create mode 100644 src/core/features/course/components/module-completion-details/module-completion-details.scss
create mode 100644 src/core/features/course/components/module-completion-details/module-completion-details.ts
create mode 100644 src/core/features/course/components/module-completion/module-completion.scss
diff --git a/scripts/langindex.json b/scripts/langindex.json
index 7dbfa28cf..2ad44374b 100644
--- a/scripts/langindex.json
+++ b/scripts/langindex.json
@@ -1582,6 +1582,7 @@
"core.course.completion_setby:auto:todo": "course",
"core.course.completion_setby:manual:done": "course",
"core.course.completion_setby:manual:markdone": "course",
+ "core.course.completionmenuitem": "completion",
"core.course.completionrequirements": "course",
"core.course.confirmdownload": "local_moodlemobileapp",
"core.course.confirmdownloadunknownsize": "local_moodlemobileapp",
@@ -1620,6 +1621,7 @@
"core.course.relativedatessubmissionduedatebefore": "course",
"core.course.section": "moodle",
"core.course.startdate": "moodle",
+ "core.course.studentsmust": "completion",
"core.course.thisweek": "format_weeks/currentsection",
"core.course.todo": "completion",
"core.course.tour_navigation_course_index_student_content": "tool_usertours",
@@ -1628,6 +1630,7 @@
"core.course.viewcourse": "block_timeline",
"core.course.warningmanualcompletionmodified": "local_moodlemobileapp",
"core.course.warningofflinemanualcompletiondeleted": "local_moodlemobileapp",
+ "core.course.youmust": "completion",
"core.coursedetails": "moodle",
"core.coursenogroups": "local_moodlemobileapp",
"core.courses.addtofavourites": "block_myoverview",
@@ -2313,8 +2316,9 @@
"core.scanqr": "local_moodlemobileapp",
"core.scrollbackward": "local_moodlemobileapp",
"core.scrollforward": "local_moodlemobileapp",
- "core.search.allcourses": "search",
+ "core.search": "moodle",
"core.search.allcategories": "local_moodlemobileapp",
+ "core.search.allcourses": "search",
"core.search.empty": "local_moodlemobileapp",
"core.search.filtercategories": "local_moodlemobileapp",
"core.search.filtercourses": "local_moodlemobileapp",
@@ -2323,7 +2327,6 @@
"core.search.noresults": "local_moodlemobileapp",
"core.search.noresultshelp": "local_moodlemobileapp",
"core.search.resultby": "local_moodlemobileapp",
- "core.search": "moodle",
"core.searching": "local_moodlemobileapp",
"core.searchresults": "moodle",
"core.sec": "moodle",
diff --git a/src/addons/mod/resource/services/handlers/module.ts b/src/addons/mod/resource/services/handlers/module.ts
index 8d112fb72..2e2bfbeb0 100644
--- a/src/addons/mod/resource/services/handlers/module.ts
+++ b/src/addons/mod/resource/services/handlers/module.ts
@@ -220,6 +220,15 @@ export class AddonModResourceModuleHandlerService extends CoreModuleHandlerBase
return extra.join(' ');
}
+ /**
+ * @inheritdoc
+ */
+ async manualCompletionAlwaysShown(module: CoreCourseModuleData): Promise {
+ const hideButton = await this.hideOpenButton(module);
+
+ return !hideButton;
+ }
+
/**
* @inheritdoc
*/
diff --git a/src/core/components/combobox/combobox.scss b/src/core/components/combobox/combobox.scss
index e270c8528..bb19aa559 100644
--- a/src/core/components/combobox/combobox.scss
+++ b/src/core/components/combobox/combobox.scss
@@ -131,25 +131,4 @@ ion-button {
ion-icon {
margin: var(--icon-margin);
}
-
- .select-icon {
- margin: var(--icon-margin);
- width: 19px;
- height: 19px;
- position: relative;
-
- .select-icon-inner {
- left: 5px;
- top: 50%;
- margin-top: -2px;
- position: absolute;
- width: 0px;
- height: 0px;
- color: currentcolor;
- pointer-events: none;
- border-top: 5px solid;
- border-right: 5px solid transparent;
- border-left: 5px solid transparent;
- }
- }
}
diff --git a/src/core/features/course/components/components.module.ts b/src/core/features/course/components/components.module.ts
index f663770b5..598626b03 100644
--- a/src/core/features/course/components/components.module.ts
+++ b/src/core/features/course/components/components.module.ts
@@ -30,6 +30,7 @@ import { CoreCourseModuleNavigationComponent } from './module-navigation/module-
import { CoreCourseModuleSummaryComponent } from './module-summary/module-summary';
import { CoreCourseCourseIndexTourComponent } from './course-index-tour/course-index-tour';
import { CoreRemindersComponentsModule } from '@features/reminders/components/components.module';
+import { CoreCourseModuleCompletionDetailsComponent } from './module-completion-details/module-completion-details';
@NgModule({
declarations: [
@@ -46,6 +47,7 @@ import { CoreRemindersComponentsModule } from '@features/reminders/components/co
CoreCourseUnsupportedModuleComponent,
CoreCourseModuleNavigationComponent,
CoreCourseModuleSummaryComponent,
+ CoreCourseModuleCompletionDetailsComponent,
],
imports: [
CoreBlockComponentsModule,
@@ -66,6 +68,7 @@ import { CoreRemindersComponentsModule } from '@features/reminders/components/co
CoreCourseUnsupportedModuleComponent,
CoreCourseModuleNavigationComponent,
CoreCourseModuleSummaryComponent,
+ CoreCourseModuleCompletionDetailsComponent,
],
})
export class CoreCourseComponentsModule {}
diff --git a/src/core/features/course/components/module-completion-details/module-completion-details.html b/src/core/features/course/components/module-completion-details/module-completion-details.html
new file mode 100644
index 000000000..6ef5932eb
--- /dev/null
+++ b/src/core/features/course/components/module-completion-details/module-completion-details.html
@@ -0,0 +1,44 @@
+
+
+
+
{{ 'core.course.youmust' | translate }}
+
{{ 'core.course.studentsmust' | translate }}
+
+
+
+
+
+
+
+
+ {{ 'core.course.completion_automatic:done' | translate }}
+ {{ rule.rulevalue.description }}
+
+
+
+
+ {{ 'core.course.completion_automatic:failed' | translate }}
+ {{ rule.rulevalue.description }}
+
+
+
+
+ {{ 'core.course.completion_automatic:todo' | translate }}
+ {{ rule.rulevalue.description }}
+
+
+
+
+
+
+ {{ rule.rulevalue.description }}
+
+
+
+
+
+
+ {{ 'core.course.completion_manual:markdone' | translate }}
+
+
+
diff --git a/src/core/features/course/components/module-completion-details/module-completion-details.scss b/src/core/features/course/components/module-completion-details/module-completion-details.scss
new file mode 100644
index 000000000..bbd4a147a
--- /dev/null
+++ b/src/core/features/course/components/module-completion-details/module-completion-details.scss
@@ -0,0 +1,22 @@
+:host {
+ h2, div {
+ font-size: 16px;
+ }
+ h2 {
+ margin-top: 0px;
+ margin-bottom: 8px;
+ line-height: 27px;
+ }
+ ion-list {
+ line-height: 32px;
+ }
+
+ ion-icon {
+ width: 24px;
+ vertical-align: middle;
+ }
+
+ ion-icon.completion_dot {
+ font-size: 4px;
+ }
+}
diff --git a/src/core/features/course/components/module-completion-details/module-completion-details.ts b/src/core/features/course/components/module-completion-details/module-completion-details.ts
new file mode 100644
index 000000000..c7d6ffc83
--- /dev/null
+++ b/src/core/features/course/components/module-completion-details/module-completion-details.ts
@@ -0,0 +1,91 @@
+// (C) Copyright 2015 Moodle Pty Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import { Component, Input, OnInit } from '@angular/core';
+
+import {
+ CoreCourseModuleCompletionStatus,
+ CoreCourseModuleWSRuleDetails,
+} from '@features/course/services/course';
+import { CoreCourseModuleCompletionData } from '@features/course/services/course-helper';
+import { CoreUser } from '@features/user/services/user';
+import { Translate } from '@singletons';
+
+/**
+ * Component to show automatic completion details dialog.
+ */
+@Component({
+ selector: 'core-course-module-completion-details',
+ templateUrl: 'module-completion-details.html',
+ styleUrls: ['module-completion-details.scss'],
+})
+export class CoreCourseModuleCompletionDetailsComponent implements OnInit {
+
+ @Input() completion?: CoreCourseModuleCompletionData; // The completion status.
+
+ isTrackedUser = false;
+ isManual = false;
+ completionDetails: CompletionRule[] = [];
+
+ /**
+ * @inheritdoc
+ */
+ async ngOnInit(): Promise {
+ if (!this.completion) {
+ return;
+ }
+
+ this.isManual = !this.completion.isautomatic;
+ this.isTrackedUser = !!this.completion.istrackeduser;
+
+ if (!this.completion?.details) {
+ return;
+ }
+
+ const details = this.completion.details;
+
+ // Format rules.
+ this.completionDetails = await Promise.all(details.map(async (rule: CompletionRule) => {
+ rule.statusComplete = rule.rulevalue.status === CoreCourseModuleCompletionStatus.COMPLETION_COMPLETE ||
+ rule.rulevalue.status === CoreCourseModuleCompletionStatus.COMPLETION_COMPLETE_PASS;
+ rule.statusCompleteFail = rule.rulevalue.status === CoreCourseModuleCompletionStatus.COMPLETION_COMPLETE_FAIL;
+ rule.statusIncomplete = rule.rulevalue.status === CoreCourseModuleCompletionStatus.COMPLETION_INCOMPLETE;
+ rule.accessibleDescription = null;
+
+ if (this.completion?.overrideby) {
+ const fullName = await CoreUser.getUserFullNameWithDefault(this.completion.overrideby, this.completion.courseId);
+
+ const setByData = {
+ $a: {
+ condition: rule.rulevalue.description,
+ setby: fullName,
+ },
+ };
+ const overrideStatus = rule.statusComplete ? 'done' : 'todo';
+
+ rule.accessibleDescription = Translate.instant('core.course.completion_setby:auto:' + overrideStatus, setByData);
+ }
+
+ return rule;
+ }));
+ }
+
+}
+
+type CompletionRule = CoreCourseModuleWSRuleDetails & {
+ statusComplete?: boolean;
+ statusCompleteFail?: boolean;
+ statusIncomplete?: boolean;
+ accessibleDescription?: string | null;
+};
diff --git a/src/core/features/course/components/module-completion-legacy/module-completion-legacy.scss b/src/core/features/course/components/module-completion-legacy/module-completion-legacy.scss
index 0eedd0acf..08d29868d 100644
--- a/src/core/features/course/components/module-completion-legacy/module-completion-legacy.scss
+++ b/src/core/features/course/components/module-completion-legacy/module-completion-legacy.scss
@@ -1,14 +1,13 @@
:host {
- min-width: var(--a11y-min-target-size);
- min-height: var(--a11y-min-target-size);
+ display: contents;
--size: 30px;
img {
- padding: 5px;
+ padding: 2px;
width: var(--size);
vertical-align: middle;
max-width: none;
- margin: 7px;
+ margin: 4px;
}
ion-button {
@@ -16,5 +15,11 @@
--padding-start: 0px;
--padding-end: 0px;
--padding-bottom: 0px;
+ margin: 0;
+ --a11y-target-min-size: 32px;
+ width: var(--a11y-target-min-size);
+ height: var(--a11y-target-min-size);
+ min-width: var(--a11y-target-min-size);
+ min-height: var(--a11y-target-min-size);;
}
}
diff --git a/src/core/features/course/components/module-completion-legacy/module-completion-legacy.ts b/src/core/features/course/components/module-completion-legacy/module-completion-legacy.ts
index 5ba425701..aa2c210da 100644
--- a/src/core/features/course/components/module-completion-legacy/module-completion-legacy.ts
+++ b/src/core/features/course/components/module-completion-legacy/module-completion-legacy.ts
@@ -147,7 +147,10 @@ export class CoreCourseModuleCompletionLegacyComponent extends CoreCourseModuleC
return;
}
- await CoreCourseHelper.changeManualCompletion(this.completion, event);
+ event.stopPropagation();
+ event.preventDefault();
+
+ await CoreCourseHelper.changeManualCompletion(this.completion);
CoreEvents.trigger(CoreEvents.MANUAL_COMPLETION_CHANGED, { completion: this.completion });
}
diff --git a/src/core/features/course/components/module-completion/core-course-module-completion.html b/src/core/features/course/components/module-completion/core-course-module-completion.html
index dbc62caca..e6487d401 100644
--- a/src/core/features/course/components/module-completion/core-course-module-completion.html
+++ b/src/core/features/course/components/module-completion/core-course-module-completion.html
@@ -1,70 +1,45 @@
-
-
-
+
+
+
+
+ {{ 'core.course.todo' | translate }}
+
+
-
-
-
-
-
- {{ 'core.course.completion_automatic:done' | translate }}
- {{ rule.rulevalue.description }}
-
-
+
+
+ {{'core.course.done' | translate }}
+
+
+
-
-
-
- {{ 'core.course.completion_automatic:failed' | translate }}
- {{ rule.rulevalue.description }}
-
-
-
-
-
-
- {{ 'core.course.completion_automatic:todo' | translate }}
- {{ rule.rulevalue.description }}
-
-
-
-
-
-
-
-
-
- {{ 'core.course.completion_automatic:todo' | translate }}
- {{ rule.rulevalue.description }}
-
-
-
-
-
-
-
-
-
- {{ 'core.course.todo' | translate }}
-
-
-
-
- {{'core.course.done' | translate }}
-
-
-
- {{'core.course.failed' | translate }}
-
+
+
+
+ {{ 'core.course.completion_manual:done' | translate }}
+
+
+
+ {{ 'core.course.completion_manual:markdone' | translate }}
+
+
-
-
-
+
+ {{ 'core.course.completionmenuitem' | translate }}
+
+
diff --git a/src/core/features/course/components/module-completion/module-completion.scss b/src/core/features/course/components/module-completion/module-completion.scss
new file mode 100644
index 000000000..27c7e8302
--- /dev/null
+++ b/src/core/features/course/components/module-completion/module-completion.scss
@@ -0,0 +1,17 @@
+:host {
+ display: block;
+ margin: var(--margin, 4px);
+
+ ion-button {
+ margin: 0px;
+ }
+
+ ion-button.button-solid.ion-color-success::part(native){
+ background: var(--ion-color-tint);
+ color: var(--ion-color-shade);
+ }
+
+ ion-button.button-outline::part(native){
+ border-color: var(--gray-400);
+ }
+}
diff --git a/src/core/features/course/components/module-completion/module-completion.ts b/src/core/features/course/components/module-completion/module-completion.ts
index 5a6d5b986..c0c3d3dcb 100644
--- a/src/core/features/course/components/module-completion/module-completion.ts
+++ b/src/core/features/course/components/module-completion/module-completion.ts
@@ -12,17 +12,19 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-import { Component, Input } from '@angular/core';
+import { Component, Input, OnChanges, OnDestroy, OnInit, SimpleChange } from '@angular/core';
import { CoreCourseModuleCompletionBaseComponent } from '@features/course/classes/module-completion';
import {
- CoreCourseCompletionMode,
CoreCourseModuleCompletionStatus,
CoreCourseModuleCompletionTracking,
- CoreCourseModuleWSRuleDetails,
} from '@features/course/services/course';
+import { CoreDomUtils } from '@services/utils/dom';
+import { CoreCourseModuleCompletionDetailsComponent } from '../module-completion-details/module-completion-details';
+import { CoreCourseHelper } from '@features/course/services/course-helper';
import { CoreUser } from '@features/user/services/user';
import { Translate } from '@singletons';
+import { CoreEventObserver, CoreEvents } from '@singletons/events';
/**
* Component to handle activity completion. It shows a checkbox with the current status, and allows manually changing
@@ -36,61 +38,132 @@ import { Translate } from '@singletons';
@Component({
selector: 'core-course-module-completion',
templateUrl: 'core-course-module-completion.html',
+ styleUrls: ['module-completion.scss'],
})
-export class CoreCourseModuleCompletionComponent extends CoreCourseModuleCompletionBaseComponent {
+export class CoreCourseModuleCompletionComponent
+ extends CoreCourseModuleCompletionBaseComponent
+ implements OnInit, OnChanges, OnDestroy {
@Input() showCompletionConditions = false; // Whether to show activity completion conditions.
@Input() showManualCompletion = false; // Whether to show manual completion.
- @Input() mode: CoreCourseCompletionMode = CoreCourseCompletionMode.FULL; // Show full completion status or a basic mode.
- details?: CompletionRule[];
+ completed = false;
accessibleDescription: string | null = null;
- completionStatus?: CoreCourseModuleCompletionStatus;
+ showCompletionInfo = false;
+ protected completionObserver?: CoreEventObserver;
+
+ /**
+ * @inheritdoc
+ */
+ ngOnInit(): void {
+ if (!this.completion) {
+ return;
+ }
+
+ const hasConditions = !this.completion.isautomatic || (this.completion.details?.length || 0) > 0;
+ this.showCompletionInfo = hasConditions && (this.showCompletionConditions || this.showManualCompletion);
+ if (!this.showCompletionInfo) {
+ return;
+ }
+
+ if (!this.completion.isautomatic && this.completion.istrackeduser) {
+ this.completionObserver = CoreEvents.on(CoreEvents.MANUAL_COMPLETION_CHANGED, (data) => {
+ if (!this.completion || this.completion.cmid != data.completion.cmid) {
+ return;
+ }
+
+ this.completion = data.completion;
+ this.calculateData();
+ this.completionChanged.emit(this.completion);
+ });
+ }
+ }
/**
* @inheritdoc
*/
protected async calculateData(): Promise {
- if (!this.completion?.details) {
+ if (!this.completion || !this.completion.istrackeduser) {
return;
}
- this.completionStatus = !this.completion?.istrackeduser ||
- this.completion.tracking == CoreCourseModuleCompletionTracking.COMPLETION_TRACKING_NONE
+ const completionStatus = this.completion.tracking == CoreCourseModuleCompletionTracking.COMPLETION_TRACKING_NONE
? undefined
: this.completion.state;
- // Format rules.
- this.details = await Promise.all(this.completion.details.map(async (rule: CompletionRule) => {
- rule.statuscomplete = rule.rulevalue.status == CoreCourseModuleCompletionStatus.COMPLETION_COMPLETE ||
- rule.rulevalue.status == CoreCourseModuleCompletionStatus.COMPLETION_COMPLETE_PASS;
- rule.statuscompletefail = rule.rulevalue.status == CoreCourseModuleCompletionStatus.COMPLETION_COMPLETE_FAIL;
- rule.statusincomplete = rule.rulevalue.status == CoreCourseModuleCompletionStatus.COMPLETION_INCOMPLETE;
- rule.accessibleDescription = null;
+ this.completed = completionStatus !== CoreCourseModuleCompletionStatus.COMPLETION_INCOMPLETE &&
+ completionStatus !== CoreCourseModuleCompletionStatus.COMPLETION_COMPLETE_FAIL;
- if (this.completion?.overrideby) {
+ if (!this.completion.isautomatic) {
+ // Set an accessible description for manual completions with overridden completion state.
+ if (this.completion.overrideby) {
const fullName = await CoreUser.getUserFullNameWithDefault(this.completion.overrideby, this.completion.courseId);
const setByData = {
$a: {
- condition: rule.rulevalue.description,
+ activityname: this.moduleName,
setby: fullName,
},
};
- const overrideStatus = rule.statuscomplete ? 'done' : 'todo';
+ const setByLangKey = this.completion.state ? 'completion_setby:manual:done' : 'completion_setby:manual:markdone';
+ this.accessibleDescription = Translate.instant('core.course.' + setByLangKey, setByData);
+ } else {
+ const langKey = this.completion.state ? 'completion_manual:aria:done' : 'completion_manual:aria:markdone';
+ this.accessibleDescription = Translate.instant('core.course.' + langKey, { $a: this.moduleName });
+ }
+ }
+ }
- rule.accessibleDescription = Translate.instant('core.course.completion_setby:auto:' + overrideStatus, setByData);
+ /**
+ * Completion clicked.
+ *
+ * @param event The click event.
+ */
+ async completionClicked(event: Event): Promise {
+ if (!this.completion || !this.showCompletionInfo) {
+ return;
+ }
+
+ event.stopPropagation();
+ event.preventDefault();
+
+ if (this.completion.isautomatic || !this.completion.istrackeduser) {
+ // Fake clicked element to correct position of the popover.
+ let target: HTMLElement | null = event.target as HTMLElement;
+ if (target && target.tagName !== 'ION-BUTTON') {
+ target = target.parentElement;
}
- return rule;
- }));
+ CoreDomUtils.openPopover({
+ component: CoreCourseModuleCompletionDetailsComponent,
+ componentProps: {
+ completion: this.completion,
+ },
+ showBackdrop: true,
+ event: { target } as Event,
+ });
+ } else {
+ await CoreCourseHelper.changeManualCompletion(this.completion);
+
+ CoreEvents.trigger(CoreEvents.MANUAL_COMPLETION_CHANGED, { completion: this.completion });
+
+ }
+ }
+
+ /**
+ * @inheritdoc
+ */
+ ngOnChanges(changes: { [name: string]: SimpleChange }): void {
+ if (changes.completion && this.completion && this.completion.istrackeduser) {
+ this.calculateData();
+ }
+ }
+
+ /**
+ * @inheritdoc
+ */
+ ngOnDestroy(): void {
+ this.completionObserver?.off();
}
}
-
-type CompletionRule = CoreCourseModuleWSRuleDetails & {
- statuscomplete?: boolean;
- statuscompletefail?: boolean;
- statusincomplete?: boolean;
- accessibleDescription?: string | null;
-};
diff --git a/src/core/features/course/components/module-info/course-module-info.scss b/src/core/features/course/components/module-info/course-module-info.scss
index e9f9146ff..a95a6898e 100644
--- a/src/core/features/course/components/module-info/course-module-info.scss
+++ b/src/core/features/course/components/module-info/course-module-info.scss
@@ -60,30 +60,8 @@
}
}
- core-course-module-completion ::ng-deep ion-button {
- min-height: 28px;
- margin: 0;
- font-size: 12px;
- text-transform: none;
- font-weight: normal;
-
- ion-icon {
- font-size: 16px;
- min-width: 16px;
- @include margin(0, 8px, 0, 0);
-
- &[slot=start] {
- @include margin(null, 8px, null, 0);
- }
-
- &[slot=end] {
- @include margin(null, 0, null, 8px);
- }
- }
-
- ion-label {
- white-space: normal !important;
- }
+ core-course-module-completion {
+ --margin: 0px;
}
}
diff --git a/src/core/features/course/components/module-manual-completion/core-course-module-manual-completion.html b/src/core/features/course/components/module-manual-completion/core-course-module-manual-completion.html
index abe56f66d..837781567 100644
--- a/src/core/features/course/components/module-manual-completion/core-course-module-manual-completion.html
+++ b/src/core/features/course/components/module-manual-completion/core-course-module-manual-completion.html
@@ -1,14 +1,14 @@
+ class="ion-text-wrap chip">
{{ 'core.course.completion_manual:done' | translate }}
+ class="ion-text-wrap chip">
{{ 'core.course.completion_manual:markdone' | translate }}
@@ -16,7 +16,7 @@
-
+
{{ 'core.course.completion_manual:markdone' | translate }}
diff --git a/src/core/features/course/components/module-manual-completion/module-manual-completion.ts b/src/core/features/course/components/module-manual-completion/module-manual-completion.ts
index 5d3c51f4f..c59624f9a 100644
--- a/src/core/features/course/components/module-manual-completion/module-manual-completion.ts
+++ b/src/core/features/course/components/module-manual-completion/module-manual-completion.ts
@@ -13,7 +13,6 @@
// limitations under the License.
import { Component, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChange } from '@angular/core';
-import { CoreCourseCompletionMode } from '@features/course/services/course';
import { CoreCourseHelper, CoreCourseModuleCompletionData } from '@features/course/services/course-helper';
import { CoreUser } from '@features/user/services/user';
import { Translate } from '@singletons';
@@ -21,6 +20,8 @@ import { CoreEventObserver, CoreEvents } from '@singletons/events';
/**
* Component to display a button for manual completion.
+ *
+ * @deprecated since 4.3. Not used anymore.
*/
@Component({
selector: 'core-course-module-manual-completion',
@@ -30,7 +31,6 @@ export class CoreCourseModuleManualCompletionComponent implements OnInit, OnChan
@Input() completion?: CoreCourseModuleCompletionData; // The completion status.
@Input() moduleName?: string; // The name of the module this completion affects.
- @Input() mode: CoreCourseCompletionMode = CoreCourseCompletionMode.FULL; // Show full completion status or a basic mode.
@Output() completionChanged = new EventEmitter(); // Notify when completion changes.
accessibleDescription: string | null = null;
@@ -100,7 +100,7 @@ export class CoreCourseModuleManualCompletionComponent implements OnInit, OnChan
event.stopPropagation();
event.preventDefault();
- await CoreCourseHelper.changeManualCompletion(this.completion, event);
+ await CoreCourseHelper.changeManualCompletion(this.completion);
CoreEvents.trigger(CoreEvents.MANUAL_COMPLETION_CHANGED, { completion: this.completion });
}
diff --git a/src/core/features/course/components/module/core-course-module.html b/src/core/features/course/components/module/core-course-module.html
index e76e3df4a..0f4185250 100644
--- a/src/core/features/course/components/module/core-course-module.html
+++ b/src/core/features/course/components/module/core-course-module.html
@@ -23,13 +23,6 @@
-
-
-
-
@@ -72,10 +65,10 @@
contextLevel="module" [contextInstanceId]="module.id" [courseId]="module.course">
-
-
+
+