diff --git a/frontend/package.json b/frontend/package.json
index 7a19d0137..d872c1645 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -18,6 +18,7 @@
"@editorjs/nested-list": "^1.4.2",
"@editorjs/paragraph": "^2.11.3",
"@editorjs/simple-image": "^1.6.0",
+ "@editorjs/table": "^2.4.2",
"ace-builds": "^1.36.2",
"chart.js": "^4.4.1",
"codemirror-editor-vue3": "^2.8.0",
diff --git a/frontend/src/components/AppSidebar.vue b/frontend/src/components/AppSidebar.vue
index 7dba321cb..dfc67968c 100644
--- a/frontend/src/components/AppSidebar.vue
+++ b/frontend/src/components/AppSidebar.vue
@@ -186,18 +186,27 @@ const addQuizzes = () => {
}
const addPrograms = () => {
- if (settingsStore.learningPaths.data) {
- let activeFor = ['Programs', 'ProgramForm']
- let index = 1
- if (!isInstructor.value && !isModerator.value) {
- sidebarLinks.value = sidebarLinks.value.filter(
- (link) => link.label !== 'Courses'
- )
- activeFor.push('CourseDetail')
- activeFor.push('Lesson')
- index = 0
- }
+ let activeFor = ['Programs', 'ProgramForm']
+ let index = 1
+ let canAddProgram = false
+
+ if (
+ !isInstructor.value &&
+ !isModerator.value &&
+ settingsStore.learningPaths.data
+ ) {
+ sidebarLinks.value = sidebarLinks.value.filter(
+ (link) => link.label !== 'Courses'
+ )
+ activeFor.push('CourseDetail')
+ activeFor.push('Lesson')
+ index = 0
+ canAddProgram = true
+ } else if (isInstructor.value || isModerator.value) {
+ canAddProgram = true
+ }
+ if (canAddProgram) {
sidebarLinks.value.splice(index, 0, {
label: 'Programs',
icon: 'Route',
diff --git a/frontend/src/components/DesktopLayout.vue b/frontend/src/components/DesktopLayout.vue
index 70818bbea..79a4a1dc9 100644
--- a/frontend/src/components/DesktopLayout.vue
+++ b/frontend/src/components/DesktopLayout.vue
@@ -8,7 +8,6 @@