Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 0 additions & 24 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
name: Server Tests
on:
push:
branches:
- main
- develop
- main-hotfix
pull_request: {}

permissions:
Expand Down Expand Up @@ -97,22 +92,3 @@ jobs:
uses: actions/upload-artifact@v4
with:
path: /home/runner/frappe-bench/sites/coverage.xml

coverage:
name: Coverage Wrap Up
needs: tests
runs-on: ubuntu-latest
steps:
- name: Clone
uses: actions/checkout@v5

- name: Download artifacts
uses: actions/download-artifact@v4

- name: Upload coverage data
uses: codecov/codecov-action@v5
with:
name: Server
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: true
verbose: true
40 changes: 0 additions & 40 deletions .github/workflows/generate-pot-file.yml

This file was deleted.

6 changes: 1 addition & 5 deletions .github/workflows/linters.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,14 @@ name: Linters

on:
pull_request:
workflow_dispatch:
push:
branches: [ main ]

permissions:
contents: read

jobs:
linters:
name: Semgrep Rules
name: Pre-commit and Semgrep
runs-on: ubuntu-latest
if: github.event_name == 'pull_request'

steps:
- uses: actions/checkout@v5
Expand Down
30 changes: 0 additions & 30 deletions .github/workflows/make_release_pr.yml

This file was deleted.

38 changes: 0 additions & 38 deletions .github/workflows/on_release.yml

This file was deleted.

22 changes: 0 additions & 22 deletions .github/workflows/semantic.yml

This file was deleted.

6 changes: 0 additions & 6 deletions .github/workflows/ui-tests.yml
Original file line number Diff line number Diff line change
@@ -1,13 +1,7 @@
name: UI Tests

on:
pull_request:
workflow_dispatch:
push:
branches:
- main
- develop
- main-hotfix

permissions:
contents: read
Expand Down
2 changes: 2 additions & 0 deletions frontend/components.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ declare module 'vue' {
Coupons: typeof import('./src/components/Settings/Coupons/Coupons.vue')['default']
CourseCard: typeof import('./src/components/CourseCard.vue')['default']
CourseCardOverlay: typeof import('./src/components/CourseCardOverlay.vue')['default']
CourseFinalExam: typeof import('./src/components/CourseFinalExam.vue')['default']
CourseInstructors: typeof import('./src/components/CourseInstructors.vue')['default']
CourseOutline: typeof import('./src/components/CourseOutline.vue')['default']
CourseReviews: typeof import('./src/components/CourseReviews.vue')['default']
Expand All @@ -60,6 +61,7 @@ declare module 'vue' {
EvaluationModal: typeof import('./src/components/Modals/EvaluationModal.vue')['default']
Evaluators: typeof import('./src/components/Settings/Evaluators.vue')['default']
Event: typeof import('./src/components/Modals/Event.vue')['default']
Exam: typeof import('./src/components/Exam.vue')['default']
ExplanationVideos: typeof import('./src/components/Modals/ExplanationVideos.vue')['default']
FeedbackModal: typeof import('./src/components/Modals/FeedbackModal.vue')['default']
FrappeCloudIcon: typeof import('./src/components/Icons/FrappeCloudIcon.vue')['default']
Expand Down
8 changes: 4 additions & 4 deletions frontend/src/components/AssessmentPlugin.vue
Original file line number Diff line number Diff line change
Expand Up @@ -123,10 +123,10 @@ const addAssessment = () => {
props.type == 'quiz'
? quiz.value
: props.type == 'dragDrop'
? dragDrop.value
: props.type == 'wordHunt'
? wordHunt.value
: assignment.value
? dragDrop.value
: props.type == 'wordHunt'
? wordHunt.value
: assignment.value
)
show.value = false
}
Expand Down
14 changes: 13 additions & 1 deletion frontend/src/components/CertificationLinks.vue
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@
certification.data &&
certification.data.membership &&
certification.data.paid_certificate &&
user.data?.is_student
user.data?.is_student &&
(!certification.data.final_exam || certification.data.final_exam.passed)
"
>
<router-link
Expand Down Expand Up @@ -51,6 +52,17 @@
</Button>
</router-link>
</div>
<div
v-else-if="
certification.data &&
certification.data.final_exam &&
!certification.data.final_exam.passed &&
user.data?.is_student
"
class="text-sm text-ink-orange-3"
>
{{ __('Pass the final exam to unlock certification.') }}
</div>
</template>
<script setup>
import { Button, createResource } from 'frappe-ui'
Expand Down
24 changes: 19 additions & 5 deletions frontend/src/components/CourseCardOverlay.vue
Original file line number Diff line number Diff line change
Expand Up @@ -94,11 +94,17 @@
class="space-y-3 rounded-xl border px-4 py-4"
:style="courseHighlightsStyle"
>
<div class="font-medium text-ink-gray-9" :style="courseHighlightsHeadingStyle">
<div
class="font-medium text-ink-gray-9"
:style="courseHighlightsHeadingStyle"
>
{{ __('This course has:') }}
</div>
<div class="flex items-center text-ink-gray-9">
<BookOpen class="h-4 w-4 stroke-1.5" :style="courseHighlightIconStyle" />
<BookOpen
class="h-4 w-4 stroke-1.5"
:style="courseHighlightIconStyle"
/>
<span class="ml-2">
{{ course.data.lessons }}
{{ course.data.lessons > 1 ? __('lessons') : __('lesson') }}
Expand Down Expand Up @@ -128,7 +134,10 @@
v-if="course.data.enable_certification"
class="flex items-center font-semibold text-ink-gray-9"
>
<GraduationCap class="h-4 w-4 stroke-2" :style="courseHighlightIconStyle" />
<GraduationCap
class="h-4 w-4 stroke-2"
:style="courseHighlightIconStyle"
/>
<span class="ml-2">
{{ __('Certificate of Completion') }}
</span>
Expand All @@ -137,7 +146,10 @@
v-if="course.data.paid_certificate"
class="flex items-center font-semibold text-ink-gray-9"
>
<GraduationCap class="h-4 w-4 stroke-2" :style="courseHighlightIconStyle" />
<GraduationCap
class="h-4 w-4 stroke-2"
:style="courseHighlightIconStyle"
/>
<span class="ml-2">
{{ __('Paid Certificate after Evaluation') }}
</span>
Expand Down Expand Up @@ -271,7 +283,9 @@ const is_instructor = () => {
const canGetCertificate = computed(() => {
if (
props.course.data?.enable_certification &&
props.course.data?.membership?.progress == 100
props.course.data?.membership?.progress == 100 &&
(!props.course.data?.final_exam_required ||
props.course.data?.final_exam_passed)
) {
return true
}
Expand Down
71 changes: 71 additions & 0 deletions frontend/src/components/CourseFinalExam.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
<template>
<div v-if="course?.data?.final_exam" class="mt-10">
<div class="text-lg font-semibold text-ink-gray-9 mb-4">
{{ __('Final Exam') }}
</div>
<div class="rounded-xl border border-outline-gray-2 bg-surface-white p-5">
<div class="flex items-start justify-between gap-4">
<div>
<div class="text-base font-semibold text-ink-gray-9">
{{ course.data.final_exam.title }}
</div>
<div class="mt-2 text-sm text-ink-gray-6">
{{ __('Course-level final assessment') }}
</div>
<div
v-if="course.data.final_exam.prerequisites?.length"
class="mt-4 space-y-2"
>
<div class="text-sm font-medium text-ink-gray-8">
{{ __('Prerequisites') }}
</div>
<div
v-for="item in course.data.final_exam.prerequisites"
:key="item.label"
class="flex items-center justify-between gap-4 rounded-lg bg-surface-gray-2 px-3 py-2 text-sm"
>
<span>{{ item.label }}</span>
<Badge
:theme="item.satisfied ? 'green' : 'orange'"
:label="item.satisfied ? __('Ready') : __('Pending')"
/>
</div>
</div>
<div
v-if="course.data.final_exam.locked_reason"
class="mt-4 rounded-lg bg-surface-orange-1 px-3 py-2 text-sm text-ink-orange-3"
>
{{ course.data.final_exam.locked_reason }}
</div>
</div>
<router-link
:to="{
name: 'ExamPage',
params: {
examID: course.data.final_exam.name,
},
}"
>
<Button variant="solid">
{{
course.data.final_exam.can_attempt
? __('Open Exam')
: __('View Exam')
}}
</Button>
</router-link>
</div>
</div>
</div>
</template>

<script setup>
import { Badge, Button } from 'frappe-ui'

defineProps({
course: {
type: Object,
required: true,
},
})
</script>
Loading
Loading