diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 254ef1e7..45f69ea9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,9 +34,9 @@ jobs: with: python-version: '3.10' - name: setup node - uses: actions/setup-node@v2 + uses: actions/setup-node@v4 with: - node-version: '18' + node-version: '20' check-latest: true - name: setup cache for bench uses: actions/cache@v4 diff --git a/.github/workflows/ui-tests.yml b/.github/workflows/ui-tests.yml index 6ff03b93..84651bf1 100644 --- a/.github/workflows/ui-tests.yml +++ b/.github/workflows/ui-tests.yml @@ -48,9 +48,9 @@ jobs: exit 1 fi - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 check-latest: true - name: Add to Hosts diff --git a/cypress/e2e/batch_creation.cy.js b/cypress/e2e/batch_creation.cy.js index c93bed2b..4f48bf70 100644 --- a/cypress/e2e/batch_creation.cy.js +++ b/cypress/e2e/batch_creation.cy.js @@ -52,6 +52,7 @@ describe("Batch Creation", () => { // Create a batch cy.get("button").contains("Create").click(); + cy.get("span").contains("New Batch").click(); cy.wait(500); cy.url().should("include", "/batches/new/edit"); cy.get("label").contains("Title").type("Test Batch"); diff --git a/cypress/e2e/course_creation.cy.js b/cypress/e2e/course_creation.cy.js index a0d14591..6d9fadb1 100644 --- a/cypress/e2e/course_creation.cy.js +++ b/cypress/e2e/course_creation.cy.js @@ -9,6 +9,7 @@ describe("Course Creation", () => { // Create a course cy.get("button").contains("Create").click(); + cy.get("span").contains("New Course").click(); cy.wait(500); cy.url().should("include", "/courses/new/edit"); @@ -55,6 +56,7 @@ describe("Course Creation", () => { .parent() .within(() => { cy.get("input").click().type("frappe"); + cy.wait(500); cy.get("input") .invoke("attr", "aria-controls") .as("instructor_list_id"); diff --git a/frappe-ui b/frappe-ui index 204333c9..78025c67 160000 --- a/frappe-ui +++ b/frappe-ui @@ -1 +1 @@ -Subproject commit 204333c9256f21fca5f5c50acd66cee11aeca4f3 +Subproject commit 78025c679490705b8df9fc0162985f5f3c808568 diff --git a/frontend/components.d.ts b/frontend/components.d.ts index b52f8116..f7cc0a5d 100644 --- a/frontend/components.d.ts +++ b/frontend/components.d.ts @@ -11,8 +11,8 @@ declare module 'vue' { AdminBatchDashboard: typeof import('./src/components/AdminBatchDashboard.vue')['default'] Annoucements: typeof import('./src/components/Annoucements.vue')['default'] AnnouncementModal: typeof import('./src/components/Modals/AnnouncementModal.vue')['default'] - Apps: typeof import('./src/components/Apps.vue')['default'] - AppSidebar: typeof import('./src/components/AppSidebar.vue')['default'] + Apps: typeof import('./src/components/Sidebar/Apps.vue')['default'] + AppSidebar: typeof import('./src/components/Sidebar/AppSidebar.vue')['default'] AssessmentModal: typeof import('./src/components/Modals/AssessmentModal.vue')['default'] AssessmentPlugin: typeof import('./src/components/AssessmentPlugin.vue')['default'] Assessments: typeof import('./src/components/Assessments.vue')['default'] @@ -44,6 +44,7 @@ declare module 'vue' { ColorSwatches: typeof import('./src/components/Controls/ColorSwatches.vue')['default'] CommandPalette: typeof import('./src/components/CommandPalette/CommandPalette.vue')['default'] CommandPaletteGroup: typeof import('./src/components/CommandPalette/CommandPaletteGroup.vue')['default'] + Configuration: typeof import('./src/components/Sidebar/Configuration.vue')['default'] ContactUsEmail: typeof import('./src/components/ContactUsEmail.vue')['default'] CouponDetails: typeof import('./src/components/Settings/Coupons/CouponDetails.vue')['default'] CouponItems: typeof import('./src/components/Settings/Coupons/CouponItems.vue')['default'] @@ -113,7 +114,7 @@ declare module 'vue' { SettingDetails: typeof import('./src/components/Settings/SettingDetails.vue')['default'] SettingFields: typeof import('./src/components/Settings/SettingFields.vue')['default'] Settings: typeof import('./src/components/Settings/Settings.vue')['default'] - SidebarLink: typeof import('./src/components/SidebarLink.vue')['default'] + SidebarLink: typeof import('./src/components/Sidebar/SidebarLink.vue')['default'] StudentHeatmap: typeof import('./src/components/StudentHeatmap.vue')['default'] StudentModal: typeof import('./src/components/Modals/StudentModal.vue')['default'] Tags: typeof import('./src/components/Tags.vue')['default'] @@ -125,7 +126,7 @@ declare module 'vue' { Uploader: typeof import('./src/components/Controls/Uploader.vue')['default'] UploadPlugin: typeof import('./src/components/UploadPlugin.vue')['default'] UserAvatar: typeof import('./src/components/UserAvatar.vue')['default'] - UserDropdown: typeof import('./src/components/UserDropdown.vue')['default'] + UserDropdown: typeof import('./src/components/Sidebar/UserDropdown.vue')['default'] VideoBlock: typeof import('./src/components/VideoBlock.vue')['default'] VideoStatistics: typeof import('./src/components/Modals/VideoStatistics.vue')['default'] ZoomAccountModal: typeof import('./src/components/Modals/ZoomAccountModal.vue')['default'] diff --git a/frontend/package.json b/frontend/package.json index 1ad76a18..4a7937b0 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -6,56 +6,60 @@ "scripts": { "dev": "vite", "serve": "vite preview", - "build": "vite build --base=/assets/lms/frontend/ && yarn copy-html-entry", - "copy-html-entry": "cp ../lms/public/frontend/index.html ../lms/www/lms.html" + "build": "vite build --base=/assets/lms/frontend/ && yarn copy-html-entry && yarn copy-colors-json", + "copy-html-entry": "cp ../lms/public/frontend/index.html ../lms/www/lms.html", + "copy-colors-json": "cp node_modules/frappe-ui/src/tailwind/colors.json src/utils/frappe-ui-colors.json" }, "dependencies": { - "@codemirror/lang-html": "^6.4.9", - "@codemirror/lang-javascript": "^6.2.4", - "@codemirror/lang-json": "^6.0.1", - "@codemirror/lang-python": "^6.2.1", - "@editorjs/checklist": "^1.6.0", - "@editorjs/code": "^2.9.0", - "@editorjs/editorjs": "^2.29.0", - "@editorjs/embed": "^2.7.0", - "@editorjs/header": "^2.8.1", - "@editorjs/inline-code": "^1.5.0", - "@editorjs/nested-list": "^1.4.2", - "@editorjs/paragraph": "^2.11.3", - "@editorjs/simple-image": "^1.6.0", - "@editorjs/table": "^2.4.2", - "@vueuse/core": "^10.4.1", - "@vueuse/router": "^12.7.0", - "ace-builds": "^1.36.2", - "apexcharts": "^4.3.0", - "chart.js": "^4.4.1", - "codemirror": "^6.0.1", - "dayjs": "^1.11.6", - "dompurify": "^3.2.6", - "feather-icons": "^4.28.0", - "frappe-ui": "^0.1.214", - "highlight.js": "^11.11.1", - "lucide-vue-next": "^0.383.0", - "markdown-it": "^14.0.0", - "pinia": "^2.0.33", - "plyr": "^3.7.8", - "socket.io-client": "^4.7.2", - "tailwindcss": "3.4.15", - "thememirror": "^2.0.1", - "typescript": "^5.7.2", - "vue": "^3.4.23", - "vue-chartjs": "^5.3.0", - "vue-codemirror": "^6.1.1", - "vue-draggable-next": "^2.2.1", - "vue-router": "^4.0.12", - "vue3-apexcharts": "^1.8.0", + "@codemirror/lang-html": "6.4.9", + "@codemirror/lang-javascript": "6.2.4", + "@codemirror/lang-json": "6.0.1", + "@codemirror/lang-python": "6.2.1", + "@editorjs/checklist": "1.6.0", + "@editorjs/code": "2.9.0", + "@editorjs/editorjs": "2.29.0", + "@editorjs/embed": "2.7.0", + "@editorjs/header": "2.8.1", + "@editorjs/inline-code": "1.5.0", + "@editorjs/nested-list": "1.4.2", + "@editorjs/paragraph": "2.11.3", + "@editorjs/simple-image": "1.6.0", + "@editorjs/table": "2.4.2", + "@vueuse/core": "10.4.1", + "@vueuse/router": "12.7.0", + "ace-builds": "1.36.2", + "apexcharts": "4.3.0", + "chart.js": "4.4.1", + "codemirror": "6.0.1", + "dayjs": "1.11.10", + "dompurify": "3.2.6", + "feather-icons": "4.28.0", + "frappe-ui": "0.1.227", + "highlight.js": "11.11.1", + "lucide-vue-next": "0.383.0", + "markdown-it": "14.0.0", + "pinia": "2.0.33", + "plyr": "3.7.8", + "socket.io-client": "4.7.2", + "thememirror": "2.0.1", + "typescript": "5.7.2", + "vue": "^3.5.0", + "vue-chartjs": "5.3.0", + "vue-codemirror": "6.1.1", + "vue-draggable-next": "2.2.1", + "vue-router": "4.2.2", + "vue3-apexcharts": "1.8.0", "vuedraggable": "4.1.0" }, "devDependencies": { - "@vitejs/plugin-vue": "^5.0.3", - "autoprefixer": "^10.4.2", - "postcss": "^8.4.5", - "vite": "^5.0.11", - "vite-plugin-pwa": "^1.0.2" + "@vitejs/plugin-vue": "5.0.3", + "autoprefixer": "10.4.2", + "postcss": "8.4.5", + "vite": "5.0.11", + "tailwindcss": "^3.4.15", + "vite-plugin-pwa": "0.15.0" + }, + "resolutions": { + "@iconify/utils": "2.1.7" } } diff --git a/frontend/src/components/Assignment.vue b/frontend/src/components/Assignment.vue index 6c97c8d8..c8ad35f6 100644 --- a/frontend/src/components/Assignment.vue +++ b/frontend/src/components/Assignment.vue @@ -179,6 +179,9 @@ " :editable="true" :fixedMenu="true" + :uploadArgs="{ + private: true, + }" editorClass="prose-sm max-w-none border-b border-x bg-surface-gray-2 rounded-b-md py-1 px-2 min-h-[7rem]" /> diff --git a/frontend/src/components/BatchOverlay.vue b/frontend/src/components/BatchOverlay.vue index cc846d37..82a4bcb3 100644 --- a/frontend/src/components/BatchOverlay.vue +++ b/frontend/src/components/BatchOverlay.vue @@ -113,7 +113,7 @@ {{ __('Enroll Now') }} - + {{ selectedIcon }} diff --git a/frontend/src/components/Controls/MultiSelect.vue b/frontend/src/components/Controls/MultiSelect.vue index 7f8994f3..7c9c2bd6 100644 --- a/frontend/src/components/Controls/MultiSelect.vue +++ b/frontend/src/components/Controls/MultiSelect.vue @@ -28,10 +28,12 @@ class="mt-1 rounded-lg bg-surface-white py-1 text-base border-2" > -
+
+ {{ __('No results found') }} +
{ + let theme = + localStorage.getItem('theme') == 'light' ? 'lightMode' : 'darkMode' let color = props.course.card_gradient?.toLowerCase() || 'blue' - let colorMap = theme.backgroundColor[color] + let colorMap = colors[theme][color] return `linear-gradient(to top right, black, ${colorMap[400]})` /* return `bg-gradient-to-br from-${color}-100 via-${color}-200 to-${color}-400` */ /* return `linear-gradient(to bottom right, ${colorMap[100]}, ${colorMap[400]})` */ diff --git a/frontend/src/components/DesktopLayout.vue b/frontend/src/components/DesktopLayout.vue index 00c33eb0..caef6920 100644 --- a/frontend/src/components/DesktopLayout.vue +++ b/frontend/src/components/DesktopLayout.vue @@ -9,5 +9,5 @@
diff --git a/frontend/src/components/Modals/CourseProgressSummary.vue b/frontend/src/components/Modals/CourseProgressSummary.vue index b98b58e4..fbc9b692 100644 --- a/frontend/src/components/Modals/CourseProgressSummary.vue +++ b/frontend/src/components/Modals/CourseProgressSummary.vue @@ -114,11 +114,11 @@ categoryColumn: 'category', valueColumn: 'count', colors: [ - theme.colors.red['400'], - theme.colors.amber['400'], - theme.colors.pink['400'], - theme.colors.blue['400'], - theme.colors.green['400'], + getColor('red', 400), + getColor('amber', 400), + getColor('pink', 400), + getColor('blue', 400), + getColor('green', 400), ], }" /> @@ -146,7 +146,7 @@ import { NumberChart, } from 'frappe-ui' import { computed, ref, watch } from 'vue' -import { theme } from '@/utils/theme' +import { getColor } from '@/utils' const show = defineModel({ default: false }) const searchFilter = ref(null) diff --git a/frontend/src/components/Modals/EditProfile.vue b/frontend/src/components/Modals/EditProfile.vue index f6564d49..ca89d289 100644 --- a/frontend/src/components/Modals/EditProfile.vue +++ b/frontend/src/components/Modals/EditProfile.vue @@ -222,8 +222,8 @@ watch( watch( () => profile.language, - (newVal, oldVal) => { - if (newVal !== oldVal) { + () => { + if (profile.language !== props.profile.data.language) { hasLanguageChanged.value = true } } diff --git a/frontend/src/components/Modals/EvaluationModal.vue b/frontend/src/components/Modals/EvaluationModal.vue index 2b44b640..02a34fc3 100644 --- a/frontend/src/components/Modals/EvaluationModal.vue +++ b/frontend/src/components/Modals/EvaluationModal.vue @@ -66,12 +66,18 @@ diff --git a/frontend/src/components/SidebarLink.vue b/frontend/src/components/Sidebar/SidebarLink.vue similarity index 100% rename from frontend/src/components/SidebarLink.vue rename to frontend/src/components/Sidebar/SidebarLink.vue diff --git a/frontend/src/components/UserDropdown.vue b/frontend/src/components/Sidebar/UserDropdown.vue similarity index 93% rename from frontend/src/components/UserDropdown.vue rename to frontend/src/components/Sidebar/UserDropdown.vue index 838123e5..99d037be 100644 --- a/frontend/src/components/UserDropdown.vue +++ b/frontend/src/components/Sidebar/UserDropdown.vue @@ -1,7 +1,7 @@