Compare commits

...

1310 Commits

Author SHA1 Message Date
Hussain Nagaria
d9bf4e2c58 fix: title and tab copy 2024-04-16 14:42:17 +05:30
Jannat Patel
78698cfcbe Merge pull request #773 from pateljannat/youtube-issues
fix: lesson youtube video issue
2024-04-15 13:33:03 +05:30
Jannat Patel
64c02f14a9 fix: removed quiz_id from the lesson content 2024-04-15 13:29:50 +05:30
Jannat Patel
2f68fc0d6e fix: quiz rerender issue 2024-04-15 13:27:38 +05:30
Jannat Patel
16570469e6 fix: lesson youtube video issue 2024-04-15 12:35:27 +05:30
Md Hussain Nagaria
a62b754d28 fix: empty the container before editorjs init (#771) 2024-04-12 13:52:43 +05:30
Jannat Patel
93859d6635 Merge pull request #769 from pateljannat/fixes-lesson
fix: check site conf before sending email
2024-04-10 21:23:15 +05:30
Jannat Patel
20fab8dbd3 fix: check site conf before sending email 2024-04-10 19:38:30 +05:30
Md Hussain Nagaria
13536aac51 fix: primary page title (#767) 2024-04-09 15:33:10 +05:30
Jannat Patel
ccb8721674 fix: evaluation modal 2024-04-06 11:19:49 +05:30
Jannat Patel
fbe1423edd fix: meta for batches 2024-04-06 11:17:25 +05:30
Jannat Patel
d2713d7824 Merge pull request #763 from pateljannat/slots-message
fix: no slots message
2024-04-06 11:03:26 +05:30
Jannat Patel
f24a15b4f8 fix: no slots message 2024-04-06 10:55:50 +05:30
Jannat Patel
bf74868bd4 Merge pull request #762 from pateljannat/assignments
feat: assignments in batches
2024-04-05 22:51:39 +05:30
Jannat Patel
6d75b8a3a2 feat: assignments in batches 2024-04-05 21:51:18 +05:30
Jannat Patel
055f917c61 Merge pull request #761 from pateljannat/rewrite-fixes
fix: mobile layout and certification link
2024-04-05 08:59:38 +05:30
Jannat Patel
d892a28069 fix: mobile layout and certification link 2024-04-05 08:56:18 +05:30
Jannat Patel
838bc1fac2 Merge pull request #760 from pateljannat/fix-templates
fix: web templates
2024-04-04 15:41:14 +05:30
Jannat Patel
a98d36513b fix: web templates 2024-04-04 15:01:22 +05:30
Jannat Patel
2cfa6771ac fix: lesson page issue 2024-04-04 11:24:44 +05:30
Jannat Patel
4960c47377 Merge pull request #758 from pateljannat/branding
fix: branding, course, lesson and certificate creation
2024-04-04 10:31:13 +05:30
Jannat Patel
a46306720b fix: branding, course, lesson and certificate creation 2024-04-03 22:42:59 +05:30
Jannat Patel
efcdba3a29 Merge pull request #713 from pateljannat/lms-frappe-ui
feat: LMS rewrite in Frappe UI
2024-04-03 12:22:03 +05:30
Jannat Patel
e7263d0566 style: removed print statement 2024-04-03 12:14:51 +05:30
Jannat Patel
5de7f5e283 fix: progress 2024-04-03 12:11:34 +05:30
Jannat Patel
c7bdf68bc6 bump: frappe-ui 2024-04-02 14:07:52 +05:30
Jannat Patel
998ff51c58 chore: removed print statements 2024-04-01 22:34:59 +05:30
Jannat Patel
4eb9d84d8b chore: fixed semgrep 2024-04-01 22:29:24 +05:30
Jannat Patel
5f000d8017 style: linters for vue files 2024-04-01 22:01:55 +05:30
Jannat Patel
0cf9ad5228 chore: resolved conflicts 2024-04-01 21:54:01 +05:30
Jannat Patel
71a526e7aa fix: dummy text to make content words greater than 250 2024-04-01 18:38:31 +05:30
Jannat Patel
c5d9adb7fd fix: added paragraph for description and a link for seo 2024-04-01 17:47:34 +05:30
Jannat Patel
05fdf163a9 fix: certificate website link 2024-04-01 17:27:12 +05:30
Jannat Patel
de0a983033 fix: replaced h2 with h1 for flash text 2024-03-29 22:44:17 +05:30
Jannat Patel
44ee9b644f fix: flash text for seo 2024-03-29 22:29:24 +05:30
Jannat Patel
bd116c3e7b feat: meta for batches 2024-03-29 14:48:46 +05:30
Jannat Patel
02e8a97f85 chore: post install scripts 2024-03-28 17:20:39 +05:30
Jannat Patel
3525e4c90b feat: meta tags 2024-03-28 16:20:53 +05:30
Jannat Patel
e6d3819092 feat: mobile responsive 2024-03-28 11:30:59 +05:30
Jannat Patel
f15862cef4 fix: router 2024-03-19 12:51:11 +05:30
Jannat Patel
86748b301d feat: page titles 2024-03-19 12:04:58 +05:30
Jannat Patel
cc07dd849c feat: job creation 2024-03-18 16:55:36 +05:30
Jannat Patel
63bcbb6506 feat: batch creation 2024-03-15 21:54:02 +05:30
Jannat Patel
83a1b03bb7 feat: quiz plugin in lesson 2024-03-11 09:38:27 +05:30
Jannat Patel
2905a6af1a Merge pull request #749 from pateljannat/batch-conditions
fix: batch registration button conditions
2024-03-07 10:33:39 +05:30
Jannat Patel
4cc27adb8b fix: batch registration button conditions 2024-03-07 10:21:18 +05:30
Jannat Patel
2126b4f657 fix: lesson editing 2024-03-07 10:06:32 +05:30
Jannat Patel
0ce7c74778 feat: lesson creation 2024-03-05 23:07:58 +05:30
Jannat Patel
b9f6a23412 chore: build files 2024-03-04 22:12:21 +05:30
Jannat Patel
9ae96bd1fa feat: chapter creation 2024-03-04 22:10:51 +05:30
Jannat Patel
e863abe37c fix: structure of ourline creation 2024-03-01 13:50:00 +05:30
Jannat Patel
80e9984db0 feat: course creation resources 2024-03-01 10:57:31 +05:30
Jannat Patel
8f504a8043 fix: course creation form validations 2024-02-28 23:42:17 +05:30
Jannat Patel
60a917e60c feat: course creation page structure 2024-02-27 20:41:02 +05:30
Jannat Patel
a5d000f702 fix: quix show correct answers 2024-02-21 17:02:18 +05:30
Jannat Patel
5317aa8fb5 feat: job application 2024-02-21 12:08:05 +05:30
Jannat Patel
39aa1d443d fix: removed unnecessary start learning buttons 2024-02-19 17:07:22 +05:30
Jannat Patel
36c4e2f4dc feat: job application modal 2024-02-19 16:54:07 +05:30
Jannat Patel
084eeba2ed Merge branch 'main' of https://github.com/frappe/lms into lms-frappe-ui 2024-02-07 12:25:37 +05:30
Jannat Patel
4b4086afb3 fix: active site capture 2024-02-07 11:14:12 +05:30
Jannat Patel
6401497422 feat: job details 2024-02-07 10:57:05 +05:30
Jannat Patel
684601f31b Merge branch 'main' of https://github.com/frappe/lms into lms-frappe-ui 2024-02-07 10:55:50 +05:30
Jannat Patel
d7d222842b feat: statistics graphs 2024-02-06 22:39:08 +05:30
Jannat Patel
b0bb7d32ca chore: capture active sites 2024-02-06 10:12:49 +05:30
Jannat Patel
ff1bd91223 feat: cohort description 2024-02-05 23:06:26 +05:30
Jannat Patel
f59f6c617a fix: cleanup ui 2024-02-05 17:36:55 +05:30
Jannat Patel
af48ccfb57 fix: cleanup ui 2024-02-05 17:35:46 +05:30
Jannat Patel
4b9d3bd996 fix: minor ui 2024-02-01 15:03:50 +05:30
Jannat Patel
3dad3580bb fix: batch self enrollment 2024-02-01 10:52:23 +05:30
Jannat Patel
53eb95612c fix: review button 2024-02-01 10:48:05 +05:30
Jannat Patel
8f687145be fix: pricing issue 2024-01-25 23:13:43 +05:30
Jannat Patel
9c405edd09 Merge branch 'main' of https://github.com/frappe/lms 2024-01-25 15:45:41 +05:30
Jannat Patel
fe791dc478 fix: batch self enrollment 2024-01-25 15:45:27 +05:30
Jannat Patel
8f317d2f44 fix: ui issues 2024-01-25 15:24:52 +05:30
Jannat Patel
f4e581f6cb fix: multicurrency on course cards 2024-01-23 17:03:15 +05:30
Jannat Patel
9671c4d63f feat: batch billing 2024-01-23 15:33:31 +05:30
Jannat Patel
42417621fa Merge pull request #712 from IslemMedjahdi/patch-1
Update docker-installation.md
2024-01-23 13:30:10 +05:30
Jannat Patel
d3b3d85c84 fix: redirect to login if guest before batch enrollment 2024-01-22 11:19:32 +05:30
Md Hussain Nagaria
b700013704 fix: only show start date for single day batches (#726) 2024-01-22 10:55:36 +05:30
Jannat Patel
bac229c731 Merge pull request #725 from pateljannat/students-in-batch
feat: self enrolment in batches
2024-01-22 10:54:20 +05:30
Jannat Patel
28043e634b fix: removed unnecessary roles 2024-01-22 10:43:02 +05:30
Md Hussain Nagaria
b672108155 fix: remove $ typos (#723) 2024-01-22 10:33:55 +05:30
Jannat Patel
5e569ab0e6 feat: self enrollment in batches 2024-01-19 23:56:48 +05:30
Jannat Patel
b07940951c feat: billing page 2024-01-19 22:48:38 +05:30
Jannat Patel
1f18ef4362 feat: discussions in batches 2024-01-19 17:44:47 +05:30
Jannat Patel
bf57a19e2c Merge branch 'main' of https://github.com/frappe/lms into lms-frappe-ui 2024-01-18 14:44:20 +05:30
Jannat Patel
43a07e53a6 Merge branch 'main' of https://github.com/frappe/lms 2024-01-18 11:32:12 +05:30
Jannat Patel
fbd83196fc fix: job page logos 2024-01-18 11:31:50 +05:30
Jannat Patel
465f4e1e96 docs: fixed readme logo dimensions 2024-01-17 14:48:48 +05:30
Jannat Patel
43d409ce64 Merge branch 'main' of https://github.com/frappe/lms 2024-01-17 14:47:11 +05:30
Jannat Patel
a5fc52ec29 fix: logo on readme 2024-01-17 14:46:48 +05:30
Jannat Patel
a9b06575d0 Merge pull request #718 from pateljannat/change-jobs-route
fix: changed jobs route to job-openings
2024-01-17 11:24:06 +05:30
Jannat Patel
3070cbed3c fix: changed jobs route to job-openings 2024-01-17 11:00:31 +05:30
Jannat Patel
0845a6e2a3 feat: statistics page numbers 2024-01-17 10:35:34 +05:30
Jannat Patel
041bae16e0 feat: discussions new topic 2024-01-16 20:49:07 +05:30
Jannat Patel
3313db844c feat: discussions edit and delete 2024-01-16 17:24:35 +05:30
Jannat Patel
3a5977a718 feat: discussions 2024-01-15 23:26:31 +05:30
Jannat Patel
bcee74ce77 feat: batch announcements 2024-01-12 21:48:42 +05:30
Jannat Patel
1a6a119f35 feat: students and assessment tab in dashboard 2024-01-10 21:36:02 +05:30
Jannat Patel
09ae61492f feat: upcoming evals 2024-01-08 16:17:50 +05:30
Jannat Patel
3a33f047f5 feat: batch details 2024-01-05 18:22:03 +05:30
Jannat Patel
10cdd712d2 feat: batch card price and seat count 2024-01-02 12:39:28 +05:30
Jannat Patel
21959eef7b feat: quiz submission history table 2024-01-02 11:00:12 +05:30
Jannat Patel
41c3522285 feat: quiz submission 2024-01-01 23:26:53 +05:30
Medjahdi Islem
d712881e16 Update docker-installation.md 2024-01-01 15:32:00 +01:00
Jannat Patel
991dc7f8c8 fix: batch card 2023-12-28 12:04:06 +05:30
Jannat Patel
7087fde686 feat: quiz base 2023-12-28 11:59:44 +05:30
Jannat Patel
6b6c8da785 Merge pull request #706 from pateljannat/evaluation-request-validations
fix: evaluation dates validation
2023-12-22 22:54:23 +05:30
Jannat Patel
e1d61c9eb9 feat: review submission 2023-12-21 17:25:08 +05:30
Jannat Patel
afcb15148f chore: merged conflicts 2023-12-21 14:59:30 +05:30
Jannat Patel
f40fbaed3e fix: check country from ip for multicurrency 2023-12-21 14:22:58 +05:30
Jannat Patel
5adb36deaf Merge branch 'main' of https://github.com/frappe/lms into lms-frappe-ui 2023-12-21 14:05:59 +05:30
Jannat Patel
4973386dd0 Merge pull request #710 from pateljannat/usd-pricing
feat: usd pricing
2023-12-21 12:58:06 +05:30
Jannat Patel
13536b8bad feat: usd pricing 2023-12-21 12:28:11 +05:30
Jannat Patel
caea7e334c Merge pull request #707 from pateljannat/batch-meta-image
fix: batch meta image saving
2023-12-21 09:56:50 +05:30
Jannat Patel
4065b1b8cc feat: review modal 2023-12-21 09:56:15 +05:30
Jannat Patel
b248774774 Merge pull request #708 from pateljannat/confirmation-email
fix: copy of enrolment email
2023-12-20 12:16:03 +05:30
Jannat Patel
7a9d6325d5 fix: copy of enrollment email 2023-12-20 11:49:32 +05:30
Jannat Patel
b0d0b41502 fix: batch meta image saving 2023-12-20 11:37:54 +05:30
Jannat Patel
30c89cb13c fix: evaluation dates validation 2023-12-20 11:00:09 +05:30
Jannat Patel
eb3afbbad1 feat: rating component 2023-12-20 10:35:12 +05:30
Jannat Patel
9175737b9c Merge pull request #705 from pateljannat/email-address-assignment-issue
fix: assignment issue
2023-12-19 11:49:53 +05:30
Jannat Patel
7ae772205a Merge pull request #704 from pateljannat/evaluation-fields
fix: evaluation fields
2023-12-19 11:15:32 +05:30
Jannat Patel
00b0a20c83 fix: translations 2023-12-19 10:54:56 +05:30
Jannat Patel
6604866342 fix: assignment issue 2023-12-19 10:51:36 +05:30
Jannat Patel
881c3d943a fix: evaluation fields 2023-12-18 20:06:43 +05:30
Jannat Patel
fbe219a888 feat: lesson pagination 2023-12-18 19:17:44 +05:30
Jannat Patel
5928b8e5f9 feat: lesson pagination 2023-12-18 19:17:17 +05:30
Jannat Patel
372425bed2 Merge branch 'main' of https://github.com/frappe/lms into lms-frappe-ui 2023-12-18 11:31:35 +05:30
Jannat Patel
d2922fd361 feat: lesson page 2023-12-15 23:39:15 +05:30
Jannat Patel
d5118cc91f fix: razorpay payment in other currency 2023-12-14 16:08:07 +05:30
Jannat Patel
ac74cbdf72 fix: razorpay payment in other currency 2023-12-14 15:53:07 +05:30
Jannat Patel
01f7fc3cff fix: razorpay payment in other currency 2023-12-14 15:12:23 +05:30
Jannat Patel
85c850e5bf fix: cohorts 2023-12-14 15:08:42 +05:30
Jannat Patel
e7b6001e5f fix: logout issue 2023-12-14 14:32:50 +05:30
Jannat Patel
4053984ca2 fix: courses cahce 2023-12-13 11:57:25 +05:30
Jannat Patel
a1e06bf316 fix: courses cahce 2023-12-13 11:57:18 +05:30
Jannat Patel
67dfffdd58 fix: calendar day view range 2023-12-13 10:41:15 +05:30
Jannat Patel
c50f2147fd feat: course details page design 2023-12-13 10:33:34 +05:30
Jannat Patel
d4671fb888 Merge branch 'main' of https://github.com/frappe/lms into lms-frappe-ui 2023-12-12 14:58:45 +05:30
Jannat Patel
ae4aadb8d3 Merge pull request #702 from pateljannat/timetable-mobile-view
feat: day view for timetable on mobile
2023-12-12 12:15:02 +05:30
Jannat Patel
e5dc2bad6a feat: day view for timetable on mobile 2023-12-12 12:00:24 +05:30
Jannat Patel
77cda10419 feat: course details page 2023-12-12 10:19:52 +05:30
Jannat Patel
6de879cd2a fix: translations 2023-12-08 19:12:59 +05:30
Jannat Patel
0e2fabf139 Merge pull request #700 from pateljannat/fix-milestones
fix: future date access on timetables for moderators
2023-12-08 16:06:38 +05:30
Jannat Patel
c45a372e83 fix: future date access on timetables for moderators 2023-12-08 15:27:33 +05:30
Jannat Patel
25f24b98c6 feat: fetch translations 2023-12-08 15:04:41 +05:30
Jannat Patel
98ecb4c27c Merge pull request #699 from pateljannat/all-day-events-style
fix: All day events style
2023-12-07 17:37:44 +05:30
Jannat Patel
9023094326 fix: timetable style 2023-12-07 16:00:11 +05:30
Jannat Patel
497de05db2 fix: all day events style 2023-12-07 15:53:10 +05:30
Jannat Patel
11079dae00 feat: translations 2023-12-07 11:38:12 +05:30
Jannat Patel
d00da31f84 feat: course list 2023-12-05 22:39:00 +05:30
Jannat Patel
644fb698d8 chore: fixed config 2023-11-30 16:03:06 +05:30
Jannat Patel
92edb3a1bf Merge branch 'main' of https://github.com/frappe/lms into lms-frappe-ui 2023-11-30 12:15:39 +05:30
Jannat Patel
cb3224664e Merge pull request #695 from pateljannat/all-day-events
feat: all day events
2023-11-30 12:12:09 +05:30
Jannat Patel
9b532a5470 fix: editing evaluation end date from lms portal 2023-11-30 12:02:43 +05:30
Jannat Patel
f1f9d9790b feat: all day events 2023-11-30 11:51:36 +05:30
Jannat Patel
96190910a7 Merge pull request #694 from pateljannat/evaluation-end-date
feat: evaluation end date
2023-11-29 22:58:53 +05:30
Jannat Patel
6484763d37 fix: removed additional roles 2023-11-29 22:32:52 +05:30
Jannat Patel
0e2feac81e fix: frappe-ui setup 2023-11-29 22:28:38 +05:30
Jannat Patel
6f1e7624ec feat:evaluation end date from lms portal 2023-11-29 18:01:44 +05:30
Jannat Patel
eef5bd6062 feat: evaluation end date 2023-11-29 17:36:34 +05:30
Jannat Patel
63bcf15900 feat: course cards 2023-11-29 12:05:40 +05:30
Jannat Patel
25bcd10e93 Merge branch 'main' of https://github.com/frappe/lms into lms-frappe-ui 2023-11-28 11:20:52 +05:30
Md Hussain Nagaria
de60fbb25a fix(LMS Batch): add portal web link to form view (#692) 2023-11-27 22:19:07 +05:30
Jannat Patel
fd9a638879 fix: quiz and timetable issues 2023-11-24 12:37:34 +05:30
Jannat Patel
ddcb718a3a fix: quiz submission questions 2023-11-23 11:50:22 +05:30
Jannat Patel
a17a7453e7 fix: ceil the percentage 2023-11-22 17:49:47 +05:30
Jannat Patel
479be0b8ee Merge pull request #681 from pateljannat/notify-mentions
feat: misc changes
2023-11-22 17:34:44 +05:30
Jannat Patel
6f40c357b3 fix: quiz submission page rendering 2023-11-22 17:27:42 +05:30
Jannat Patel
81db6c544d fix: mention email link 2023-11-22 13:04:04 +05:30
Jannat Patel
be4e3aa963 Merge pull request #682 from pateljannat/course-creation-error
fix: course creation issue
2023-11-21 14:38:27 +05:30
Jannat Patel
6da0c07a3d fix: course creation issue 2023-11-21 14:13:11 +05:30
Jannat Patel
b4ad10ca35 Merge pull request #680 from pateljannat/lesson-creation-issue
fix: encode chapter during lesson creation
2023-11-21 13:46:07 +05:30
Jannat Patel
2388b878dc fix: encode chapter during lesson creation 2023-11-21 13:35:47 +05:30
Jannat Patel
8cdaa7877a feat: discussions mention notifications 2023-11-21 13:32:12 +05:30
Jannat Patel
d314287883 Merge pull request #679 from pateljannat/upcoming-batch
fix: upcoming batches based on start time
2023-11-17 11:00:07 +05:30
Jannat Patel
b70dfc8e82 fix: upcoming batches based on start time 2023-11-17 10:45:29 +05:30
Jannat Patel
0a784766b4 Merge branch 'main' of https://github.com/frappe/lms into lms-frappe-ui 2023-11-09 16:16:08 +05:30
Jannat Patel
a5a7184f9a Merge pull request #676 from pateljannat/pyproject
build: added pyproject.toml
2023-11-09 15:54:12 +05:30
Jannat Patel
4e019d0a43 Merge pull request #677 from pateljannat/get-certificate-issue
fix: get certificate button visibility
2023-11-09 15:50:35 +05:30
Jannat Patel
8453b54360 fix: syntax of pyproject 2023-11-09 15:46:51 +05:30
Jannat Patel
9f9dfdb26d fix: get certificate button visibility 2023-11-09 15:27:46 +05:30
Jannat Patel
9fd4984247 fix: get certificate button visibility 2023-11-09 15:22:05 +05:30
Jannat Patel
9ebd64f47d build: added pyproject.toml 2023-11-09 15:18:06 +05:30
Jannat Patel
4316a37ed6 Merge pull request #675 from pateljannat/certificate-fix
fix: certificates in profile
2023-11-09 12:58:47 +05:30
Jannat Patel
2d745460e8 fix: certificates in profile 2023-11-09 12:29:23 +05:30
Jannat Patel
b5258b6d9f Merge pull request #674 from pateljannat/assignment-fix
fix: assignment submission email
2023-11-07 12:05:21 +05:30
Jannat Patel
41b076c0db fix: user type filter on assignment submission 2023-11-07 11:42:31 +05:30
Jannat Patel
9d65e5e398 Merge pull request #673 from rtdany10/total-mark-issue
fix: mandatory total marks issue
2023-11-07 11:41:34 +05:30
Jannat Patel
7250bf7d65 fix: changed recipient in assignment submission email 2023-11-07 11:32:26 +05:30
Jannat Patel
4d7b247378 fix: assignment submission email 2023-11-07 11:31:58 +05:30
Dany Robert
0aaa58cd54 fix: mandatory total marks issue 2023-11-07 04:48:32 +00:00
Jannat Patel
014b85f12c Merge pull request #672 from pateljannat/user-category-default
fix: default user category
2023-11-06 19:14:19 +05:30
Jannat Patel
929f97cb72 test: skip invite email if in test 2023-11-06 19:08:30 +05:30
Jannat Patel
de9cb935ee test: skip certificate email if in test 2023-11-06 18:58:12 +05:30
Jannat Patel
9aafc176e4 fix: default user category 2023-11-06 18:39:52 +05:30
Jannat Patel
0488ae8305 Merge pull request #670 from pateljannat/cert-fixes
fix: certificate border and email
2023-11-02 12:29:55 +05:30
Jannat Patel
60fd317d98 feat: certification email 2023-11-02 12:20:11 +05:30
Jannat Patel
e54435d85d fix: certificate border 2023-11-01 18:27:17 +05:30
Jannat Patel
3a23b91c90 Merge pull request #669 from pateljannat/batch-tabs-customisation
feat: batch tabs settings
2023-10-30 18:42:56 +05:30
Jannat Patel
69591577bf feat: batch tabs settings 2023-10-30 18:30:58 +05:30
Jannat Patel
e56afba6d3 Merge pull request #645 from tundebabzy/644
fix: 10th lesson access issue
2023-10-27 18:45:00 +05:30
Jannat Patel
98536ce4c7 Merge pull request #668 from frappe/pateljannat-security-md
chore: created security policy
2023-10-27 18:36:39 +05:30
Jannat Patel
05282178dd fix: removed functional programing code 2023-10-27 18:30:45 +05:30
Jannat Patel
1af547288c chore: fix linters 2023-10-27 17:53:35 +05:30
Jannat Patel
b4af82acbc chore: fix linters 2023-10-27 17:21:28 +05:30
Jannat Patel
50fbe00d23 Merge pull request #667 from pateljannat/batch-ic
fix: misc batch issues
2023-10-27 17:18:20 +05:30
Jannat Patel
b44428677e chore: created security policy 2023-10-27 17:17:10 +05:30
Tunde Akinyanmi
d67faa1610 forgot to remove the LessonBookmark class 2023-10-27 12:05:37 +01:00
Tunde Akinyanmi
7b3f4c29d8 remove LessonBookmark abstraction. 2023-10-27 12:00:44 +01:00
Jannat Patel
a49871c5b1 fix: misc batch issues 2023-10-27 16:04:03 +05:30
Jannat Patel
e4005792af Merge pull request #665 from saadchaudharry/main
Fix:timetable validation
2023-10-27 12:04:36 +05:30
saadindictrans
8c0c09a21b Fix:timetable validation 2023-10-27 11:33:18 +05:30
Jannat Patel
a9b05f4256 Merge pull request #662 from pateljannat/batch-source
feat: batch source
2023-10-26 20:35:57 +05:30
Jannat Patel
cb6013a7a6 fix: source doctype name during install 2023-10-26 18:09:05 +05:30
Jannat Patel
bb23b78a4f fix: made source mandatory in billing form 2023-10-26 18:00:11 +05:30
Jannat Patel
243277012f feat: batch source 2023-10-26 17:51:43 +05:30
Jannat Patel
c9ed8a4b03 Merge pull request #661 from pateljannat/fix-eval-slot
fix: evaluation slots
2023-10-26 15:25:55 +05:30
Jannat Patel
d413acaef3 fix: evaluation slots 2023-10-26 15:14:35 +05:30
Jannat Patel
d6aad6cd74 Merge branch 'main' into 644 2023-10-26 14:45:56 +05:30
Jannat Patel
ca45e43003 Merge pull request #658 from pateljannat/certification-fix
fix: certificate download template
2023-10-26 12:52:14 +05:30
Jannat Patel
ad39530705 fix: certificate download template 2023-10-26 11:30:26 +05:30
Jannat Patel
a6c2378b56 fix: certificate template pathc 2023-10-25 14:25:42 +05:30
Jannat Patel
c073d2201d Merge pull request #657 from pateljannat/course-certificates
feat: certificate template
2023-10-25 14:15:54 +05:30
Jannat Patel
6d70de2eb1 feat: certificate template 2023-10-25 13:08:56 +05:30
Jannat Patel
48982e8f4a Merge pull request #655 from pateljannat/append-student-email
fix: Append student email to batch
2023-10-25 11:47:54 +05:30
Jannat Patel
397128f980 chore: merged conflicts 2023-10-25 11:36:07 +05:30
Jannat Patel
1d77fd3f94 Merge pull request #654 from pateljannat/timetable-milestones
feat: timetable milestones
2023-10-25 11:28:56 +05:30
Jannat Patel
60e78e8e74 feat: emails tab 2023-10-23 20:12:48 +05:30
Jannat Patel
4a9ccc6fde fix: cc in student email 2023-10-23 19:14:59 +05:30
Jannat Patel
a707095fae fix: link student emails to batch 2023-10-23 19:11:36 +05:30
Jannat Patel
d4f662f65e feat: timetable milestones 2023-10-23 16:35:35 +05:30
Jannat Patel
509b1365d9 Merge pull request #646 from pateljannat/quiz-refactor
feat: Quiz Refactor
2023-10-20 11:31:31 +05:30
Jannat Patel
d0b236e381 fix: translations 2023-10-20 11:08:10 +05:30
Jannat Patel
fe98265636 test: fix quiz tests 2023-10-20 10:56:47 +05:30
Jannat Patel
3f7d1b1e83 feat: add questions from LMS Portal 2023-10-19 22:15:30 +05:30
Jannat Patel
52cde329c1 Merge branch 'quiz-refactor' of https://github.com/pateljannat/lms into quiz-refactor 2023-10-18 23:21:57 +05:30
Jannat Patel
68b2dd6147 feat: quiz question from UI 2023-10-18 23:21:49 +05:30
Jannat Patel
5fa0d022dc Merge branch 'main' into quiz-refactor 2023-10-18 15:47:58 +05:30
Jannat Patel
d996a5c53f Merge pull request #649 from NagariaHussain/feat-reply-to
feat: add reply_to in email students dialog
2023-10-18 12:35:46 +05:30
Jannat Patel
b6dfc6ed4d Merge pull request #650 from NagariaHussain/feat-payment-info
feat: store batch/course in LMS Payment
2023-10-18 12:35:33 +05:30
Jannat Patel
c7c2ba83f3 Merge branch 'main' into feat-payment-info 2023-10-18 12:12:19 +05:30
Hussain Nagaria
2bffabff05 style: fix linter 2023-10-18 12:11:23 +05:30
Hussain Nagaria
697e81df10 feat: add reply_to in email students 2023-10-18 12:11:23 +05:30
Jannat Patel
f1b791845b Merge pull request #651 from pateljannat/editorjs-para
chore: bumped down paragraph plugin of editor js
2023-10-18 11:58:26 +05:30
Jannat Patel
6310845cdd chore: bunped down paragraph plugin of editor js 2023-10-18 11:47:15 +05:30
Hussain Nagaria
230cca63f3 feat: store batch/course in LMS payment 2023-10-17 23:18:43 +05:30
Hussain Nagaria
af9f4d4b1e fix: remove unused import 2023-10-17 22:17:28 +05:30
Jannat Patel
0111ff9c99 feat: quiz marks and passing percentage 2023-10-17 20:06:04 +05:30
Jannat Patel
12bec14c92 feat: quiz validations and marks 2023-10-16 19:52:36 +05:30
Jannat Patel
174ea1ddd4 chore: resolved conflicts 2023-10-16 11:19:34 +05:30
Tunde Akinyanmi
038a7463e1 update get_neighbours to use LessonBookmark and
return the correct bookmark string
2023-10-13 18:39:11 +01:00
Tunde Akinyanmi
a702909216 add LessonBookmark which is a data structure that
represents a bookmark.

While the underlying data structure is a tuple, it makes it easy to
abstract most of the logic we need and therefore allow the code to be
more readable.
2023-10-13 18:32:15 +01:00
Tunde Akinyanmi
8effd5614f remove cast operation from str to float.
It cause loss of the bookmark data
2023-10-13 18:14:11 +01:00
Jannat Patel
a02365c223 Merge pull request #642 from pateljannat/course-permissions
fix: permissions
2023-10-13 19:43:50 +05:30
Jannat Patel
2d589aefa2 Merge pull request #643 from pateljannat/timetable-customisations
feat: timetable customisations
2023-10-13 19:39:15 +05:30
Jannat Patel
bc2dc679a8 fix: revert ci changes 2023-10-13 18:15:49 +05:30
Jannat Patel
f2432d78ee ci: added collation server for mariadb 2023-10-13 16:29:47 +05:30
Jannat Patel
f27eecce1f ci: added collation server for mariadb 2023-10-13 16:17:58 +05:30
Jannat Patel
caf967f2e2 ci: added collation server for mariadb 2023-10-13 16:13:45 +05:30
Jannat Patel
eecc9b53df ci: added collation server for mariadb 2023-10-13 16:07:01 +05:30
Jannat Patel
8e12cae91f ci: added collation server for mariadb 2023-10-13 15:58:07 +05:30
Jannat Patel
12c5ad54e7 ci: added collation server for mariadb 2023-10-13 15:24:12 +05:30
Jannat Patel
c20fa7e093 ci: added collation server for mariadb 2023-10-13 14:50:50 +05:30
Jannat Patel
4c83264c4a ci: added collation server for mariadb 2023-10-13 13:14:35 +05:30
Jannat Patel
f592cf08d8 ci: added collation server for mariadb 2023-10-13 12:47:36 +05:30
Jannat Patel
bf0cb25a88 ci: added collation server for mariadb 2023-10-13 12:33:16 +05:30
Jannat Patel
2ff3d83d8f ci: added collation server for mariadb 2023-10-13 11:52:38 +05:30
Jannat Patel
3f5c3e89c8 ci: added collation server for mariadb 2023-10-13 11:45:42 +05:30
Jannat Patel
a1bb7962bc ci: added collation server for mariadb 2023-10-13 11:40:17 +05:30
Jannat Patel
bf5cc5e1d1 ci: fixed mariadb options 2023-10-13 11:24:58 +05:30
Jannat Patel
d840d2fc18 ci: fixed step in server tests script 2023-10-13 11:19:27 +05:30
Jannat Patel
1e458921e8 ci: fix server tests script 2023-10-13 11:17:41 +05:30
Jannat Patel
55feb41998 feat: timetable customisations 2023-10-13 10:59:44 +05:30
Jannat Patel
a7dbdd844b feat: batch customisations 2023-10-12 21:20:36 +05:30
Jannat Patel
f3d6ad6c84 fix: course permissions 2023-10-11 13:40:07 +05:30
Jannat Patel
a0255e1743 feat: send email to batch students 2023-10-11 12:58:07 +05:30
Jannat Patel
1046d28092 feat: quiz refactor 2023-10-11 12:25:46 +05:30
Jannat Patel
affd2b47bd Merge pull request #640 from pateljannat/registration-email
feat: batch registration confirmation email
2023-10-10 10:16:12 +05:30
Jannat Patel
814870fd69 feat: batch regisration confirmation email 2023-10-09 18:53:50 +05:30
Jannat Patel
50c1a566a8 Merge pull request #639 from pateljannat/summary
feat: assignment as text
2023-10-07 11:08:10 +05:30
Jannat Patel
47783997c6 feat: assignment as text 2023-10-06 15:32:53 +05:30
Jannat Patel
70d8505596 Merge pull request #637 from pateljannat/batch-emails
feat: send email to batch students
2023-10-05 21:59:46 +05:30
Jannat Patel
6e8cf9ca25 fix: category on batch edit 2023-10-05 17:24:04 +05:30
Jannat Patel
c9cda6c6f5 fix: show email button only to moderators 2023-10-05 16:24:11 +05:30
Jannat Patel
6c4d3ea37e feat: send email to batch students 2023-10-05 16:12:02 +05:30
Jannat Patel
8ad0e99b3c Merge pull request #634 from pateljannat/template-days
feat: Days and Duration in timetable template
2023-10-04 13:06:36 +05:30
Jannat Patel
60277ed6e9 fix: onboarding style 2023-10-04 12:12:00 +05:30
Jannat Patel
7b570420ca fix: content collapse 2023-10-04 11:07:01 +05:30
Jannat Patel
9205b59e29 feat: days in timetable template 2023-10-04 10:44:16 +05:30
Jannat Patel
685c5babe5 Merge pull request #633 from pateljannat/pdf-upload-issue
fix: pdf rendering in lessons
2023-10-03 16:24:18 +05:30
Jannat Patel
681dc8fbc1 fix: pdf rendering in lessons 2023-10-03 16:09:11 +05:30
Jannat Patel
7c623b1a8d Merge pull request #632 from pateljannat/audio-in-lesson
feat: audio in lessons
2023-10-03 13:53:30 +05:30
Jannat Patel
277c089adc feat: audio in lessons 2023-10-03 13:33:59 +05:30
Jannat Patel
cfc3c231ff fix: permissions for lms enrollment 2023-10-02 12:55:35 +05:30
Jannat Patel
1000a22490 fix: permissions for lms enrollment 2023-10-02 12:52:36 +05:30
Jannat Patel
65c0ebac50 Merge pull request #629 from pateljannat/student-role
feat: LMS Student Role
2023-09-29 19:22:23 +05:30
Jannat Patel
80843ec44b feat: assign LMS Student role to all signups 2023-09-29 18:59:08 +05:30
Jannat Patel
be23220e01 feat: lms student role 2023-09-29 17:14:00 +05:30
Jannat Patel
c82c10d17e Merge pull request #628 from pateljannat/batch-customisations
feat: batch customisations
2023-09-29 10:59:41 +05:30
Jannat Patel
5918b8be60 feat: batch customisations 2023-09-28 19:11:46 +05:30
Jannat Patel
647a0a8ff1 Merge pull request #626 from pateljannat/ins-notes-changes
feat: editor js for instructor notes
2023-09-28 11:32:00 +05:30
Jannat Patel
bf3c6bc6be test: change lesson sequence 2023-09-28 10:39:30 +05:30
Jannat Patel
cc7832614b fix: hide course header for students if no courses in batch 2023-09-28 10:14:10 +05:30
Jannat Patel
d5387a0d1a test: fix course creation test 2023-09-27 19:57:37 +05:30
Jannat Patel
5d7ad973a2 Merge pull request #627 from pateljannat/batch-meta
feat: batch meta and raw details
2023-09-27 19:46:28 +05:30
Jannat Patel
0fcea692c7 feat: batch meta and raw details 2023-09-27 19:21:57 +05:30
Jannat Patel
db71f1271b feat: editor js for instructor notes 2023-09-27 17:59:36 +05:30
Jannat Patel
3fde923190 Merge pull request #624 from pateljannat/billing-flow-issues
fix: billing flow issues
2023-09-27 09:17:53 +05:30
Jannat Patel
4f97760e8a fix: billing flow issues 2023-09-26 22:40:00 +05:30
Jannat Patel
5614a6203f Merge pull request #622 from pateljannat/issues
fix: sanitized inputs for people and course creation page
2023-09-25 22:49:25 +05:30
Jannat Patel
5727b7cd73 fix: sanitized inputs for people and course creation page 2023-09-25 22:08:37 +05:30
Jannat Patel
1c0644aa7a Merge pull request #619 from pateljannat/state-validation
fix: billing flow
2023-09-25 17:57:50 +05:30
Jannat Patel
23e6ebe8ee fix: multicurrency on course pages 2023-09-25 17:50:36 +05:30
Jannat Patel
5602c0b6c3 Merge branch 'main' of https://github.com/frappe/lms into state-validation 2023-09-25 09:48:09 +05:30
Jannat Patel
8e59c10b90 Merge pull request #610 from pateljannat/ins-notes
fix: instructor notes
2023-09-25 09:39:45 +05:30
Jannat Patel
90587b0508 fix: price update on country 2023-09-22 21:46:08 +05:30
Jannat Patel
153a8428f7 fix: billing flow 2023-09-21 12:52:31 +05:30
Jannat Patel
3d00d96716 Merge pull request #614 from pateljannat/timetable
feat: Batch Timetable
2023-09-20 13:07:09 +05:30
Jannat Patel
fb9824301f fix: removed live class from template row 2023-09-20 13:00:51 +05:30
Jannat Patel
33f4e82399 fix: batch copy 2023-09-20 12:40:04 +05:30
Jannat Patel
0d99269109 feat: live class checkbox 2023-09-20 12:09:02 +05:30
Jannat Patel
8098532215 feat: timetable legends and template 2023-09-18 19:16:57 +05:30
Jannat Patel
24e9f46e2f feat: batch timetable 2023-09-15 21:55:06 +05:30
Jannat Patel
7c3b40f9d5 Merge pull request #613 from pateljannat/change-batch-course-naming
fix: batch course sequence id issue
2023-09-14 12:47:44 +05:30
Jannat Patel
29860583f4 fix: batch course sequence id issue 2023-09-14 12:34:34 +05:30
Jannat Patel
9c00a5561a Merge pull request #600 from pateljannat/paid-class
feat: Batches Revamp
2023-09-13 15:18:55 +05:30
Jannat Patel
82b8853f39 fix: patches 2023-09-13 15:10:52 +05:30
Jannat Patel
c4ab91a565 feat: certified participants page 2023-09-13 13:07:20 +05:30
Jannat Patel
87e5096f5d fix: course card edit and delete button position 2023-09-13 10:39:32 +05:30
Jannat Patel
1a07021bbf fix: quiz list in lesson page 2023-09-12 18:03:56 +05:30
Jannat Patel
6ab4f15d0c feat: publish batches 2023-09-12 15:09:13 +05:30
Jannat Patel
f137f8e048 feat: multicurrency 2023-09-12 12:13:41 +05:30
Jannat Patel
04501143ec feat: apply_gst in batches 2023-09-11 22:44:28 +05:30
Jannat Patel
07276f5c17 fix: renamed class to batch for live classes 2023-09-04 23:18:45 +05:30
Jannat Patel
a9bd01b34e fix: instructor notes 2023-09-01 23:14:58 +05:30
Jannat Patel
93db82305f Merge pull request #607 from pateljannat/lesson-embed
feat: embeds in lesson
2023-08-31 23:38:23 +05:30
Jannat Patel
ce09f27373 fix: assignment renderer 2023-08-31 23:32:46 +05:30
Jannat Patel
ffd9d56896 feat: embed pdf 2023-08-31 23:29:56 +05:30
Jannat Patel
833e714a1f feat: embeds in lesson 2023-08-31 21:33:09 +05:30
Jannat Patel
e402f322f6 Merge pull request #606 from pateljannat/instructor-notes
feat: instructor notes
2023-08-31 12:18:56 +05:30
Jannat Patel
2a0636b32b fix: field descriptions 2023-08-31 11:58:08 +05:30
Jannat Patel
677dc59399 feat: instructor notes 2023-08-31 11:49:51 +05:30
Jannat Patel
7678b89995 feat: setup frappe ui 2023-08-30 22:45:56 +05:30
Jannat Patel
db408b21d2 chore: resolve conflicts 2023-08-30 14:38:18 +05:30
Jannat Patel
fe08f4cf09 Merge pull request #605 from pateljannat/assignment-url
feat: Assignment as URL
2023-08-30 13:26:35 +05:30
Jannat Patel
ccb7c1485b fix: validation for URL 2023-08-30 13:10:22 +05:30
Jannat Patel
4a76f42e35 feat: assignment url 2023-08-30 13:01:45 +05:30
Jannat Patel
6f31d50a27 fix: payment fetch failure after payment completion 2023-08-30 11:50:12 +05:30
Jannat Patel
018c26b885 fix: course enrollment 2023-08-29 22:25:40 +05:30
Jannat Patel
f9f70f208f feat: certificate generation dialog 2023-08-29 16:50:14 +05:30
Jannat Patel
b940ddca25 fix: batch ui and ux 2023-08-29 09:55:40 +05:30
Jannat Patel
cd82527ef3 Merge branch 'main' of https://github.com/frappe/lms into paid-class 2023-08-28 11:15:27 +05:30
Jannat Patel
f600f016ae fix: permissions for lms course doctype 2023-08-28 11:14:08 +05:30
Jannat Patel
27101ffd31 fix: renamed class to batch 2023-08-28 10:59:52 +05:30
Jannat Patel
9376b0b010 chore: resolved conflicts 2023-08-26 16:00:44 +05:30
Jannat Patel
e2c1f6aa2d Merge pull request #602 from pateljannat/rename-batch-doctype
refactor: renamed batch and membership doctypes
2023-08-26 15:53:56 +05:30
Jannat Patel
e2287cc73c Merge pull request #586 from niraj2477/fix-quiz-submission
fix: Add question in quiz submission
2023-08-26 15:53:22 +05:30
Jannat Patel
c350ce1b60 fix: replaced batch references 2023-08-26 15:44:19 +05:30
Jannat Patel
09dbe0fed7 fix: replaced instances of batch to batch_old 2023-08-26 15:28:03 +05:30
Jannat Patel
12b3d16662 Merge branch 'main' of https://github.com/frappe/lms into rename-batch-doctype 2023-08-25 18:04:28 +05:30
Jannat Patel
1676329eb2 Merge pull request #572 from tahir-zaqout/fix-instructors
fix: course when instructor is not set
2023-08-25 18:02:59 +05:30
Jannat Patel
86434ea320 fix: removed fields array as there is pluck 2023-08-25 17:45:46 +05:30
Jannat Patel
de6b4f7fb2 test: fix batch fieldname 2023-08-25 17:05:55 +05:30
Jannat Patel
6e488cba3e test: fix enrollment tests 2023-08-25 16:44:04 +05:30
Jannat Patel
03a6cc85fe test: enrollment and exercise test fixed 2023-08-25 15:19:29 +05:30
Jannat Patel
b8b32681bf refactor: renamed batch and membership doctypes 2023-08-25 14:46:11 +05:30
Jannat Patel
7f67c6c6d9 Merge pull request #601 from pateljannat/link-class-to-eval-flow
feat: link class in evaluation flow
2023-08-25 10:08:38 +05:30
Jannat Patel
0487b2c987 chore: resolved conflicts 2023-08-24 22:17:45 +05:30
Jannat Patel
d5f10db250 feat: capture gst information 2023-08-24 22:15:55 +05:30
Jannat Patel
74df0f19cf fix: class filter on certification doctypes 2023-08-23 14:52:56 +05:30
Jannat Patel
47c19b4e3d feat: gst fields in class student 2023-08-23 13:00:54 +05:30
Jannat Patel
b197e36ba7 Merge pull request #599 from pateljannat/filter-mobile
fix: styling of course list menu
2023-08-23 10:43:37 +05:30
Jannat Patel
4b049dcf71 fix: styling of course list menu 2023-08-22 19:16:22 +05:30
Jannat Patel
04ed7f412f feat: class billing 2023-08-22 18:34:42 +05:30
Jannat Patel
ac64e59c43 chore: resolved conflicts 2023-08-19 12:26:21 +05:30
Jannat Patel
d5524a8d67 feat: registration information in class student 2023-08-19 12:24:13 +05:30
Jannat Patel
bc350a2661 Merge pull request #595 from pateljannat/revert-registration
revert: class registration
2023-08-18 19:09:19 +05:30
Jannat Patel
575fb623ba revert: class registration 2023-08-18 18:59:02 +05:30
Jannat Patel
b7783659c9 Merge branch 'main' of https://github.com/frappe/lms 2023-08-18 17:39:02 +05:30
Jannat Patel
bddd4743a7 fix: reload course doctype 2023-08-18 17:38:20 +05:30
Jannat Patel
ce8ac15faa Merge pull request #594 from pateljannat/user-validate-image
fix: dont validate user uploaded files
2023-08-18 15:19:57 +05:30
Jannat Patel
46e7c83fae fix: dont validate user uploaded files 2023-08-18 15:13:34 +05:30
Jannat Patel
3dcb55f603 Merge pull request #592 from pateljannat/course-filter
feat: course filters
2023-08-18 13:05:24 +05:30
Jannat Patel
fb3e0832d6 chore: removed unnecessary print statements 2023-08-18 12:49:43 +05:30
Jannat Patel
982d6c9045 fix: popularity filter for enrolled and authored courses 2023-08-18 12:39:19 +05:30
Jannat Patel
a061a89ee7 fix: paid course details on course card template 2023-08-17 22:06:25 +05:30
Jannat Patel
00bb71f714 chore: resolved conflicts 2023-08-17 21:25:52 +05:30
Jannat Patel
e23cfac5a7 Merge pull request #589 from pateljannat/paid-courses
feat: Paid courses
2023-08-17 14:44:29 +05:30
Jannat Patel
ed651959c1 fix: amount information in membership 2023-08-17 14:20:30 +05:30
Jannat Patel
01a1632a5a feat: course filters 2023-08-16 22:01:59 +05:30
Jannat Patel
c2a6697f72 fix: show price on all course cards 2023-08-16 11:51:05 +05:30
Jannat Patel
211775dba5 fix: formatting 2023-08-16 11:00:06 +05:30
Jannat Patel
2ba85ba6a7 feat: paid course from course creation form 2023-08-14 19:30:33 +05:30
Jannat Patel
3b3f1d692f Merge branch 'main' of https://github.com/frappe/lms into paid-courses 2023-08-14 09:59:46 +05:30
Ankush Menat
d90bb1e5ea fix: escape arguments 2023-08-13 23:37:16 +05:30
Jannat Patel
0c14a1ab4c feat: payment verification and membership 2023-08-11 19:45:12 +05:30
Jannat Patel
ea27acc683 Merge branch 'main' of https://github.com/frappe/lms into paid-courses 2023-08-10 13:33:44 +05:30
14987
b2122e7707 fix: add question in quiz submission 2023-08-10 13:19:33 +05:30
Jannat Patel
9cdc8a50f6 Merge pull request #580 from pateljannat/class-flow
feat: Class flow
2023-08-10 13:14:27 +05:30
Jannat Patel
03620be7bb fix: class schedule date and time validation 2023-08-10 13:00:26 +05:30
Jannat Patel
55296cd9cc fix: show progress on class schedule 2023-08-10 11:51:16 +05:30
Jannat Patel
5fefea1434 Merge branch 'main' of https://github.com/frappe/lms into class-flow 2023-08-09 17:22:44 +05:30
Jannat Patel
66dbe68a15 Merge pull request #583 from pateljannat/certificate-share
fix: Certificate share
2023-08-09 17:10:14 +05:30
Jannat Patel
066e2ddc69 fix: print format value 2023-08-09 17:03:10 +05:30
Jannat Patel
59f08ad4da fix: raise error if certificate is not found in any condition 2023-08-09 16:57:25 +05:30
Jannat Patel
551936e7c4 fix: show logo on certificate only if its present 2023-08-09 16:29:36 +05:30
Jannat Patel
4660240395 fix: certificate share 2023-08-09 14:29:51 +05:30
Jannat Patel
5d0a50242e fix: progress marking for normal content 2023-08-09 12:37:56 +05:30
Jannat Patel
141a778c9a chore: resolved conflicts 2023-08-09 11:49:00 +05:30
Jannat Patel
d83d6cf2d8 Merge pull request #559 from pateljannat/class-revamp
feat: discussions and class dashboard
2023-08-09 11:18:44 +05:30
Jannat Patel
71dc32098e fix: removed unnecessary code 2023-08-09 11:09:17 +05:30
Jannat Patel
6e47b4a941 test: fix discussions test 2023-08-09 10:53:52 +05:30
Jannat Patel
8479e90aeb fix: allow evaluators to access the discussions section 2023-08-09 10:16:48 +05:30
Jannat Patel
24276b779d fix: progress access by students 2023-08-09 10:13:02 +05:30
Jannat Patel
47e254ed9b fix: flow UI and quiz progress 2023-08-07 21:17:23 +05:30
Jannat Patel
9c021ef3b1 feat: razorpay order creation and checkout redirection 2023-08-04 19:37:08 +05:30
Jannat Patel
c284e95dc8 feat: validate razorpay data 2023-08-03 11:46:59 +05:30
Jannat Patel
39663a872c Merge branch 'main' of https://github.com/frappe/lms into paid-courses 2023-08-02 18:50:57 +05:30
Jannat Patel
14cefca735 Merge pull request #579 from pateljannat/fix-gha-dependencies
ci: remove mysql
2023-08-02 18:27:49 +05:30
Jannat Patel
55c56207c2 ci: remove mysql 2023-08-02 18:19:45 +05:30
Jannat Patel
79d9f31db7 feat: paid courses 2023-08-02 18:08:42 +05:30
Jannat Patel
845b906851 feat: redirection from class flow 2023-08-01 18:02:02 +05:30
Jannat Patel
5d2b19cc43 feat: learning flow in class 2023-08-01 10:10:06 +05:30
Jannat Patel
a5bc30f776 Merge pull request #576 from pateljannat/evaluation-duplication
fix: eval request duplicate conditions
2023-07-31 14:49:44 +05:30
Jannat Patel
cce77a475a chore: removed print statement 2023-07-31 14:42:35 +05:30
Jannat Patel
13a26321f5 fix: eval request duplicate conditions 2023-07-31 13:25:12 +05:30
Jannat Patel
e7a2eb7373 feat: student dashboard 2023-07-31 12:36:13 +05:30
tahirAnvil
1cc168404a fix: get_instructors function 2023-07-27 12:07:11 +03:00
Jannat Patel
cef3d21ab3 Merge branch 'main' of https://github.com/frappe/lms into class-revamp 2023-07-26 12:27:16 +05:30
Jannat Patel
d0ac0e4523 Merge pull request #571 from pateljannat/fix-escription
fix: course card descriptions
2023-07-26 12:24:34 +05:30
Jannat Patel
abaa7754a6 fix: adding dependency mariadb-client-core-10.6 for UI Test 2023-07-26 12:17:32 +05:30
Jannat Patel
02e875cbdc Merge branch 'main' of https://github.com/frappe/lms into fix-escription 2023-07-26 11:44:24 +05:30
Jannat Patel
a218257952 fix: course card descriptions 2023-07-26 11:09:35 +05:30
Jannat Patel
7dfcabde5e chore: resolved conflicts 2023-07-26 11:00:27 +05:30
Jannat Patel
6573602dfc Merge pull request #570 from pateljannat/remove-dependencies
chore: remove dev dependencies
2023-07-25 19:27:19 +05:30
Jannat Patel
3c374f48b3 ci: manually installing cypress 2023-07-25 19:20:55 +05:30
Jannat Patel
2412ef0260 fix: dependencies 2023-07-25 18:48:31 +05:30
Jannat Patel
d4dcfcdbc6 chore: remove dev dependencies 2023-07-25 18:06:25 +05:30
Jannat Patel
60aec7c801 Merge pull request #569 from pateljannat/fix-telemetry
fix: telemetry
2023-07-25 17:29:36 +05:30
Jannat Patel
1862d726ad fix: telemetry 2023-07-25 17:15:56 +05:30
Jannat Patel
3d27d5f755 fix: upcoming evals query 2023-07-25 10:50:56 +05:30
Jannat Patel
0b3f76590f Merge branch 'main' of https://github.com/frappe/lms into class-revamp 2023-07-24 18:25:58 +05:30
Jannat Patel
294832834c fix: ignore permissions while eval creations 2023-07-24 18:25:36 +05:30
Jannat Patel
e3338e0236 Merge pull request #562 from pateljannat/class-evaluator
Class evaluator
2023-07-24 18:23:19 +05:30
Jannat Patel
5c7ae55775 Merge branch 'main' of https://github.com/frappe/lms into class-evaluator 2023-07-24 17:14:46 +05:30
Jannat Patel
bc8827547e fix: scheduled the eval event creation 2023-07-24 17:10:03 +05:30
Jannat Patel
7990675c5c fix: evaluator in evals and link field descriptions 2023-07-21 12:46:33 +05:30
Jannat Patel
0182db8030 fix: show upcoming evals in progress page 2023-07-20 20:16:13 +05:30
Jannat Patel
295feccb49 fix: check booked slots against both day and time 2023-07-17 14:28:25 +05:30
Jannat Patel
b5005f41fe feat: schedule evaluations 2023-07-14 20:56:21 +05:30
Jannat Patel
37f06a8ba4 Merge branch 'main' of https://github.com/frappe/lms into class-evaluator 2023-07-14 10:34:22 +05:30
Jannat Patel
71d421898d Merge pull request #561 from pateljannat/fix-docker
fix: use node 18 for docker
2023-07-13 17:16:05 +05:30
Jannat Patel
bf5a69cee4 use node 18 for docker 2023-07-13 17:08:05 +05:30
Jannat Patel
11e6b8a372 feat: class evaluators 2023-07-13 15:10:53 +05:30
Jannat Patel
d763dba204 discussions in class 2023-07-11 19:29:30 +05:30
Jannat Patel
9e5cd84214 Merge pull request #558 from pateljannat/quiz-with-no-answer-check
feat: show and hide quiz answers
2023-07-10 15:03:56 +05:30
Jannat Patel
14cf0c9ae1 test: fix flaky course creation test 2023-07-10 14:56:36 +05:30
Jannat Patel
7d410e9ec8 fix: removed print statement 2023-07-10 14:30:05 +05:30
Jannat Patel
07c3d423aa Merge branch 'main' of https://github.com/frappe/lms into quiz-with-no-answer-check 2023-07-10 12:33:25 +05:30
Jannat Patel
5d8003549f Merge pull request #556 from pateljannat/minor-ux
fix: UX Improvements
2023-07-10 12:01:13 +05:30
Jannat Patel
b286daad16 feat: show and hide quiz answers 2023-07-04 19:42:12 +05:30
Jannat Patel
caa9144a12 fix: progress page width 2023-07-03 14:58:12 +05:30
Jannat Patel
3606902753 fix: ux improvements 2023-06-28 16:55:43 +05:30
Jannat Patel
1abb75a58e fix: certificate duplication validation 2023-06-27 14:37:53 +05:30
Jannat Patel
d35c15c384 Merge pull request #554 from pateljannat/class-ui
fix: class improvements
2023-06-27 14:35:56 +05:30
Jannat Patel
1888209027 test: upgrade node version 2023-06-27 12:51:31 +05:30
Jannat Patel
f3830bfdd5 fix: assessment validation 2023-06-27 12:17:00 +05:30
Jannat Patel
0e1b91f1ec fix: validate duplication 2023-06-26 21:16:27 +05:30
Jannat Patel
8353aa24f3 feat: description in class card 2023-06-26 13:00:45 +05:30
Jannat Patel
99f1a8dfc3 fix: class improvements 2023-06-23 20:16:48 +05:30
Jannat Patel
3d8237008f Merge pull request #551 from pateljannat/quiz-in-classes
feat: quiz in classes
2023-06-22 11:51:13 +05:30
Jannat Patel
22199da7d4 fix: linters 2023-06-22 11:25:32 +05:30
Jannat Patel
d8e11f69cc fix: quiz creation url 2023-06-22 11:14:15 +05:30
Jannat Patel
c9a5c0801e fix: redirect after quiz submission 2023-06-22 10:53:11 +05:30
Jannat Patel
bb0abe27cd fix: redirect after quiz submission 2023-06-22 10:52:57 +05:30
Jannat Patel
7d18e1d928 fix: quiz max attempts 2023-06-21 20:11:30 +05:30
Jannat Patel
da72513f6a feat: quiz in classes 2023-06-20 20:12:10 +05:30
Jannat Patel
6f8c161e03 Merge pull request #549 from pateljannat/profile-form
fix: profile web form
2023-06-19 11:25:36 +05:30
Jannat Patel
ac1f02971f fix: profile web form 2023-06-19 10:55:10 +05:30
Jannat Patel
d19538abd2 Merge pull request #545 from pateljannat/quiz-enhancements-2
fix: quiz list in dialog
2023-06-16 14:27:30 +05:30
Jannat Patel
b1ab7e7783 fix: removed unnecesary comments 2023-06-16 13:44:55 +05:30
Jannat Patel
35c080fcc2 fix: quiz dialog display 2023-06-16 13:08:49 +05:30
Jannat Patel
43e89d9dc2 Merge branch 'main' of https://github.com/frappe/lms into quiz-enhancements-2 2023-06-16 10:12:02 +05:30
Jannat Patel
547b69dd31 Merge pull request #544 from pateljannat/class-medium-and-category
feat: class medium and category
2023-06-15 17:28:24 +05:30
Jannat Patel
1ff8514b22 feat: class medium and category 2023-06-15 17:07:28 +05:30
Jannat Patel
5fffe51c4e fix: quiz in lessons 2023-06-15 11:18:17 +05:30
Jannat Patel
af9aa3e37b fix: verison and readme 2023-06-14 15:03:18 +05:30
Jannat Patel
d644ee7ccd Merge branch 'main' of https://github.com/frappe/lms 2023-06-14 14:39:49 +05:30
Jannat Patel
08e3278ca0 feat: track visit on lesson page 2023-06-14 14:39:14 +05:30
Jannat Patel
85feaa00fc Merge pull request #540 from pateljannat/quiz-modal
fix: quiz enhancements
2023-06-14 10:38:14 +05:30
Jannat Patel
76ba5c188e fix: arguements for set_single_value 2023-06-13 20:40:48 +05:30
Jannat Patel
9941e0e936 fix: linters and tests 2023-06-13 20:21:02 +05:30
Jannat Patel
89206f94f0 fix: show only first line in questions table 2023-06-13 19:39:00 +05:30
Jannat Patel
43128d7ea3 chore: resolved conflicts 2023-06-13 18:58:44 +05:30
Jannat Patel
6f1026434d fix: quiz enhancements 2023-06-13 18:44:37 +05:30
Jannat Patel
db35e3e425 Merge pull request #539 from pateljannat/quiz-enhancements
feat: quiz option as small text
2023-06-12 10:27:07 +05:30
Jannat Patel
1d8de792a5 feat: quiz option as small text 2023-06-09 18:09:54 +05:30
Jannat Patel
0db47dfee1 Merge pull request #537 from pateljannat/general
fix: misc issues
2023-06-08 11:19:58 +05:30
Jannat Patel
fc086fdbc3 fix: misc issues 2023-06-08 11:02:42 +05:30
Jannat Patel
8a86d19b79 Merge pull request #535 from pateljannat/course-publish-issue
fix: show course settings only to moderators
2023-06-07 16:56:47 +05:30
Jannat Patel
9198302f7e fix: show course settings only to moderators 2023-06-07 16:53:46 +05:30
Jannat Patel
d076451ea8 Merge pull request #534 from pateljannat/onboarding-redirects
fix: Onboarding redirects
2023-06-07 16:02:48 +05:30
Jannat Patel
c2e9ef59d6 fix: onboarding conditions 2023-06-07 15:43:44 +05:30
Jannat Patel
100f72de9d Merge branch 'main' of https://github.com/frappe/lms into onboarding-redirects 2023-06-07 15:06:14 +05:30
Jannat Patel
5a32109d5d docs: updated FC link in readme 2023-06-06 22:20:27 +05:30
Jannat Patel
f5e7934906 docs: fixed FC signup button 2023-06-06 22:09:41 +05:30
Jannat Patel
9800c24939 docs: FC signup button on readme 2023-06-06 22:08:24 +05:30
Jannat Patel
dcd81e0a3f fix: onboarding links 2023-06-06 22:06:01 +05:30
Jannat Patel
6574b55440 docs: fix logo in readme 2023-06-06 12:57:06 +05:30
Jannat Patel
8474d1c8c4 docs: PH embed on readme 2023-06-06 12:55:32 +05:30
Jannat Patel
38ae9ab9f5 Merge pull request #532 from pateljannat/video-with-spaces
fix: embed video with spaces in name
2023-06-06 09:59:03 +05:30
Jannat Patel
659b35f03e fix: embed video with spaces in name 2023-06-05 16:17:43 +05:30
Jannat Patel
414f126f1e Merge pull request #529 from pateljannat/lesson-assignment-fixes
fix: assignment submission in lesson
2023-06-05 10:59:07 +05:30
Jannat Patel
b336d769c8 fix: assignment submission in lesson 2023-06-05 10:15:40 +05:30
Jannat Patel
c173953c6a Merge pull request #520 from pateljannat/assignments-in-classes
feat: assignments in class
2023-06-02 15:56:49 +05:30
Jannat Patel
afac45e65f fix: assignment evaluator 2023-06-02 15:37:02 +05:30
Jannat Patel
f0aa5b8744 fix: new assessment doc creation 2023-06-02 14:33:55 +05:30
Jannat Patel
a101e7b089 fix: class pages 2023-06-02 13:53:09 +05:30
Jannat Patel
85903d5385 feat: my class tab 2023-06-01 22:44:32 +05:30
Jannat Patel
fe80ef9b85 fix: progress view 2023-06-01 14:29:15 +05:30
Jannat Patel
961f8c1627 Merge branch 'main' of https://github.com/frappe/lms into assignments-in-classes 2023-06-01 12:56:54 +05:30
Jannat Patel
6c7fc9b317 Merge pull request #522 from pateljannat/quiz-answer-fix
fix: possible answer check
2023-05-31 11:30:02 +05:30
Jannat Patel
2afa14d68e fix: possible answer check 2023-05-31 11:13:39 +05:30
Jannat Patel
f6cdac4826 feat: assessment in progress 2023-05-31 10:35:12 +05:30
Jannat Patel
bb39999b84 feat: assessment tab in class 2023-05-30 22:11:14 +05:30
Jannat Patel
70a036e5a7 fix: remove lesson assignment references 2023-05-26 17:20:53 +05:30
Jannat Patel
0432751050 feat: lesson assignment renamed to lms assignment submission 2023-05-25 22:44:56 +05:30
Jannat Patel
36b3b1d086 Update README.md 2023-05-24 22:46:21 +05:30
Jannat Patel
6a783e540b docs: updated readme logo 2023-05-24 22:39:56 +05:30
Jannat Patel
daeeb693d6 Merge pull request #519 from pateljannat/fix-username
fix: remove space from username
2023-05-22 17:54:53 +05:30
Jannat Patel
a0b06be422 test: fixed username length test 2023-05-19 18:03:36 +05:30
Jannat Patel
4b2ba96435 test: removed invalid tests 2023-05-19 17:46:55 +05:30
Jannat Patel
10510e204f fix: removed unused functions 2023-05-19 17:34:47 +05:30
Jannat Patel
032749dd01 fix: remove space from username 2023-05-19 16:38:47 +05:30
Jannat Patel
dc65bff772 Merge pull request #518 from pateljannat/telemetry-changes
fix: telemetry capture on client side
2023-05-18 14:52:35 +05:30
Jannat Patel
56266a3774 fix: load telemetry js irrespective of telemetry settings 2023-05-18 14:42:27 +05:30
Jannat Patel
93f0f8ab44 fix: telemetry capture on client side 2023-05-18 14:26:48 +05:30
Jannat Patel
611cc4d5a1 Merge pull request #515 from pateljannat/class-improvements
fix: Class improvements
2023-05-16 17:18:53 +05:30
Jannat Patel
552b0c9616 fix: sort classes by start date 2023-05-16 17:10:50 +05:30
Jannat Patel
1327b033e6 fix: removed student details doctype 2023-05-16 16:47:41 +05:30
Jannat Patel
ae42828771 fix: course and student interactions in class 2023-05-16 16:14:13 +05:30
Jannat Patel
1df6319164 chore: fixed conflicts 2023-05-15 19:44:50 +05:30
Jannat Patel
95012072fc Merge pull request #514 from pateljannat/social-links
fix: course details link preview
2023-05-15 14:11:52 +05:30
Jannat Patel
c01c248202 fix: course details link preview 2023-05-15 13:13:45 +05:30
Jannat Patel
0093025e5d Merge pull request #513 from pateljannat/style-issue
fix: change primary color back to frappe blue
2023-05-12 16:37:46 +05:30
Jannat Patel
20398cb934 fix: primary color 2023-05-12 16:29:39 +05:30
Jannat Patel
2792eb53b7 Merge pull request #511 from pateljannat/analytics
feat: analytics for course creation journey
2023-05-11 16:50:34 +05:30
Jannat Patel
b2f8f796b9 Merge pull request #512 from pateljannat/illegal-course
fix: course creation url in LMS
2023-05-11 16:38:23 +05:30
Jannat Patel
39bb3149c9 fix: course creation url in LMS 2023-05-11 16:26:09 +05:30
Jannat Patel
1e610f7fbb feat: analytics for course creation journey 2023-05-11 15:29:11 +05:30
Jannat Patel
c760fd5776 Merge pull request #510 from pateljannat/new-design-system
New design system
2023-05-11 12:53:45 +05:30
Jannat Patel
2162963926 fix: removed unnecessary lines of code 2023-05-11 12:40:43 +05:30
Jannat Patel
c3f3a110c0 fix: validations and UI 2023-05-11 12:01:32 +05:30
Jannat Patel
0e444ab7d3 test: fixed course creation test 2023-05-10 19:35:45 +05:30
Jannat Patel
752fe5b4ba feat: reorder chapters, lessons 2023-05-08 19:07:28 +05:30
Jannat Patel
dce369638a Merge pull request #509 from pateljannat/community-page-guest-access
fix: don't allow guest users to search the people page
2023-05-05 14:50:20 +05:30
Jannat Patel
911cfe9d2f Merge pull request #508 from pateljannat/share-certificate-on-creation
fix: share certificate with member on creation
2023-05-05 13:26:23 +05:30
Jannat Patel
f4e882ba3e fix: don't allow guest users to search the people page 2023-05-05 13:22:07 +05:30
Jannat Patel
211c69bb41 feat: Video and Header component for a lesson 2023-05-05 11:53:04 +05:30
Jannat Patel
b592172b82 Merge pull request #507 from pateljannat/class-seat-count
feat: Class seat count, start time and end time
2023-05-04 12:11:20 +05:30
Jannat Patel
40445cbb94 fix: share certificate with member on creation 2023-05-04 12:08:01 +05:30
Jannat Patel
20c93b3a6b fix: fetch start and end time in modal 2023-05-03 23:10:46 +05:30
Jannat Patel
e2bf324fb4 feat: start and end time in class 2023-05-03 23:08:02 +05:30
Jannat Patel
b47ff80e9d feat: seat count from class dialog 2023-05-03 22:47:39 +05:30
Jannat Patel
e10feb3c36 feat: seat count in class 2023-05-03 21:02:57 +05:30
Jannat Patel
b8471dd753 feat: paid classes and seat count 2023-05-03 20:55:49 +05:30
Jannat Patel
125c06952a Merge branch 'main' of https://github.com/frappe/lms into class-improvements 2023-05-03 17:41:44 +05:30
Jannat Patel
4336839932 feat: edit existing lesson 2023-05-03 17:41:18 +05:30
Jannat Patel
bbdfaa32e9 Merge branch 'main' of https://github.com/frappe/lms into new-design-system 2023-05-02 14:46:24 +05:30
Jannat Patel
4f52a73029 Merge pull request #506 from pateljannat/revert-text-editor
revert: text editor for lesson and course
2023-05-02 14:46:03 +05:30
Jannat Patel
1a2f693fea revert: text editor for lesson and course 2023-05-02 14:22:43 +05:30
Jannat Patel
ab8b76cada feat: lesson editor youtube and quiz components 2023-05-02 11:09:46 +05:30
Jannat Patel
b5240f0eec feat: class improvements 2023-04-27 22:29:45 +05:30
Jannat Patel
7777bd02e3 feat: lesson edit page 2023-04-27 10:20:50 +05:30
Jannat Patel
fcdd70dcc7 feat: course outline page 2023-04-26 11:46:08 +05:30
Jannat Patel
4eb5390ad8 feat: redesign lesson page 2023-04-25 20:54:57 +05:30
Jannat Patel
3b5c47222d feat: data in course fields 2023-04-21 18:17:37 +05:30
Jannat Patel
f97ae4e4e2 feat: adding editorjs 2023-04-21 09:58:59 +05:30
Jannat Patel
33db16a1a2 Merge branch 'new-editor' of https://github.com/pateljannat/lms into new-design-system 2023-04-20 17:55:36 +05:30
Jannat Patel
6232f8703e feat: new design system for exisitng course home 2023-04-20 17:55:03 +05:30
Jannat Patel
e6621ad866 Merge pull request #499 from pateljannat/certificate
feat: Certificate export as PDF
2023-04-18 18:45:34 +05:30
Jannat Patel
6a1533191a Merge branch 'main' into certificate 2023-04-18 18:14:41 +05:30
Jannat Patel
a0782c7bf7 feat: editor js import 2023-04-18 11:51:57 +05:30
Jannat Patel
2b6436915d feat: design for course list count 2023-04-18 09:14:59 +05:30
Jannat Patel
4c220a67f2 Merge pull request #498 from pateljannat/new-class-modal
feat: New Class Dialog
2023-04-17 21:52:43 +05:30
Jannat Patel
110aab00d6 fix: removed unnecessary code 2023-04-17 16:53:48 +05:30
Jannat Patel
8e8111d272 fix: certificate page UI 2023-04-17 15:00:18 +05:30
Jannat Patel
53d2e288d4 feat: certificate pdf and custom certificate 2023-04-14 17:38:24 +05:30
Jannat Patel
262c1ea371 feat: certificate download as pdf 2023-04-12 23:15:52 +05:30
Jannat Patel
7be9eb09e8 fix: exponse class info only to moderators 2023-04-11 17:09:38 +05:30
Jannat Patel
5fb7e88318 feat: edit class 2023-04-11 16:45:34 +05:30
Jannat Patel
d9c50714f4 fix: reload lesson assignment doctype in patch 2023-04-10 22:44:47 +05:30
Jannat Patel
0a91e5aa05 fix: reload question doctype in patch 2023-04-10 22:35:33 +05:30
Jannat Patel
9b70b4212f feat: class dialog 2023-04-10 22:34:24 +05:30
Jannat Patel
9f525d69b6 Merge pull request #497 from pateljannat/text-editor
feat: Text editor for course description and Lesson Content
2023-04-07 21:25:03 +05:30
Jannat Patel
b09c4753da fix: removed print statements 2023-04-07 21:06:16 +05:30
Jannat Patel
e4b4556210 feat: text editor for description 2023-04-06 18:01:12 +05:30
Jannat Patel
fafd132768 feat: text editor for lesson body 2023-04-05 14:13:18 +05:30
Jannat Patel
67dc6d1f29 Merge pull request #496 from pateljannat/cypress
test: Course Creation UI
2023-04-04 16:48:52 +05:30
Jannat Patel
969cb37cfe test: changed test user 2023-04-03 22:23:04 +05:30
Jannat Patel
94c2be9919 test: removed beforeEach 2023-04-03 22:13:26 +05:30
Jannat Patel
5089285913 test: mariadb password 2023-04-03 22:01:14 +05:30
Jannat Patel
e80920ad6c test: setup requirements 2023-04-03 21:46:25 +05:30
Jannat Patel
d6606ab898 test: site_config in helper 2023-04-03 21:41:30 +05:30
Jannat Patel
41599348c4 test: added install_dependencies and install script 2023-04-03 15:44:21 +05:30
Jannat Patel
92a8ce6ef4 test: course creation flow 2023-04-03 15:19:54 +05:30
Jannat Patel
690a86bb69 Merge branch 'main' of https://github.com/frappe/lms into cypress 2023-03-31 16:46:29 +05:30
Jannat Patel
cde4b61cea Merge pull request #494 from pateljannat/move-lessons
feat: move chapters and lessons
2023-03-31 16:45:26 +05:30
Jannat Patel
f361c42a30 feat: move chapters and lessons 2023-03-31 16:30:38 +05:30
Jannat Patel
065646ed5d test: cypress setup 2023-03-29 17:13:51 +05:30
Jannat Patel
de399166f1 fix: only allow class students to see progress 2023-03-28 16:30:14 +05:30
Jannat Patel
a3a4d7fbd0 Merge pull request #493 from pateljannat/notification-on-assignment-submission
feat: notification on assignment submission
2023-03-28 16:03:23 +05:30
Jannat Patel
a7c1595978 fix: spacing in email 2023-03-27 17:38:26 +05:30
Jannat Patel
1a8d113ad8 feat: notification on assignment submission 2023-03-27 17:32:43 +05:30
Jannat Patel
72cbbf147f Merge pull request #491 from pateljannat/quiz-input
feat: quiz with user input
2023-03-27 13:04:39 +05:30
Jannat Patel
a0e6462c13 fix: new question with possible answers 2023-03-27 12:53:14 +05:30
Jannat Patel
b37f259804 test: quiz with no possible answer 2023-03-27 08:47:07 +05:30
Jannat Patel
2fbe5dacb2 feat: user input quiz portal form 2023-03-24 18:06:42 +05:30
Jannat Patel
3150cf2510 feat: quiz with user input 2023-03-23 22:22:57 +05:30
Jannat Patel
3b1b375d5b Merge pull request #487 from pateljannat/live-class
feat: live class
2023-03-16 12:30:05 +05:30
Jannat Patel
3c0a29d4c7 fix: removed unnecessary changes 2023-03-16 12:24:12 +05:30
Jannat Patel
817bc4441f feat: ui for class cards 2023-03-16 11:23:24 +05:30
Jannat Patel
07e1aaaa66 fix: removed print statements 2023-03-15 12:15:44 +05:30
Jannat Patel
35b77a8908 feat: timezone and recording 2023-03-15 10:52:05 +05:30
Jannat Patel
d5b4af95ff Merge branch 'main' of https://github.com/frappe/lms into live-class 2023-03-14 14:36:22 +05:30
Jannat Patel
fc6a50b13f docs: docker instructions update in readme 2023-03-14 13:19:27 +05:30
Jannat Patel
8415abec6e Merge pull request #489 from pateljannat/delete-roles-after-uninstall
fix: delete roles after uninstall
2023-03-14 11:01:50 +05:30
Jannat Patel
ea9ca67d1e fix: delete using before_uninstall hook 2023-03-14 10:56:08 +05:30
Jannat Patel
8201506c5f fix: delete roles after uninstall 2023-03-14 10:32:31 +05:30
Jannat Patel
5fc879b0ef fix: formatting 2023-03-13 18:14:14 +05:30
Jannat Patel
bfde847045 Merge pull request #488 from pateljannat/session_redirection_issues
fix: redirection after completing setup wizard
2023-03-13 18:03:42 +05:30
Jannat Patel
d96e3f4f9f fix: don't show past classes 2023-03-13 18:03:03 +05:30
Jannat Patel
0593a9fb30 fix: add student section 2023-03-13 15:47:51 +05:30
Jannat Patel
c03cca21e8 fix: redirection after completing setup wizard 2023-03-10 23:08:00 +05:30
Jannat Patel
170b1b0dcc fix: live class card layout 2023-03-09 21:40:49 +05:30
Jannat Patel
cb9c7966d9 fix: uncomment live class event creation 2023-03-08 10:19:44 +05:30
Jannat Patel
b9c2222951 feat: create event for live class 2023-03-06 19:45:54 +05:30
Jannat Patel
dfef5ca26c Merge branch 'main' of https://github.com/frappe/lms into live-class 2023-03-03 18:45:39 +05:30
Jannat Patel
bce60a8657 Merge pull request #484 from pateljannat/mini-fix 2023-03-03 18:35:36 +05:30
Jannat Patel
2b244bb4f4 test: fix lms exercise doctype name 2023-03-03 18:23:49 +05:30
Jannat Patel
31b08eb545 test: fix lms exercise doctype name 2023-03-03 18:16:29 +05:30
Jannat Patel
9b7817a57f fix: exercise conflict and progress member 2023-03-03 18:03:35 +05:30
Jannat Patel
bb0f3d5962 feat: live class list display 2023-03-03 15:15:49 +05:30
Jannat Patel
23c78d5801 Merge branch 'main' of https://github.com/frappe/lms 2023-03-02 22:48:29 +05:30
Jannat Patel
cd3236976f fix: class list settings 2023-03-02 22:48:26 +05:30
Jannat Patel
e6096bf9ed feat: live class modal 2023-03-02 19:33:12 +05:30
Jannat Patel
a502603915 Merge pull request #483 from pateljannat/certificate-request 2023-03-01 17:49:37 +05:30
Jannat Patel
7566565f55 fix: certificate request notification 2023-02-28 19:55:21 +05:30
Faris Ansari
f56f0b5366 Update README.md 2023-02-28 13:21:47 +05:30
Jannat Patel
34870b4625 feat: live class 2023-02-28 09:19:37 +05:30
Jannat Patel
3ee592a989 Merge pull request #482 from pateljannat/misc-fix 2023-02-27 09:13:59 +05:30
Jannat Patel
d6d7e05b51 fix: quiz and assignment submission 2023-02-27 09:05:25 +05:30
Jannat Patel
07eaec2ded Merge pull request #480 from pateljannat/class-fixes 2023-02-23 14:12:44 +05:30
Jannat Patel
296a7e6023 fix: translation syntax 2023-02-23 13:04:47 +05:30
Jannat Patel
54827edd7e fix: modified timestamp 2023-02-23 13:01:45 +05:30
Jannat Patel
d87fb81cf3 fix: class issues 2023-02-23 12:40:07 +05:30
Jannat Patel
99a7c47798 Merge pull request #478 from pateljannat/preview-video 2023-02-21 10:31:33 +05:30
Jannat Patel
080a02589c fix: accept only embed id for preview video 2023-02-21 09:52:20 +05:30
Jannat Patel
d1e7549da9 Merge pull request #477 from pateljannat/evaluation-event 2023-02-17 11:01:54 +05:30
Jannat Patel
8e1ef1dc77 fix: layout of certification request 2023-02-17 10:52:50 +05:30
Jannat Patel
619a2f9d80 fix: only link calendars that are enabled 2023-02-16 20:20:16 +05:30
Jannat Patel
926444767b feat: event for evaluation 2023-02-16 20:11:03 +05:30
Jannat Patel
6bf4020ad1 Merge pull request #474 from fproldan/translations_es 2023-02-09 10:59:50 +05:30
Jannat Patel
cb63ad8ed2 Merge pull request #475 from pateljannat/default-view 2023-02-08 13:07:16 +05:30
Jannat Patel
458ed9ad95 feat: default home setting 2023-02-07 19:58:06 +05:30
fproldan
a11df1a237 feat: es translations 2023-02-01 12:48:11 -03:00
fproldan
352d4b9ab9 feat: es translations 2023-02-01 12:43:17 -03:00
Jannat Patel
275ded0658 fix: fullscreen for preview video 2023-01-18 15:07:04 +05:30
Jannat Patel
c8f3350761 fix: creator patch 2023-01-17 12:27:32 +05:30
Jannat Patel
e3112d8dcf fix: og tags 2023-01-16 17:53:54 +05:30
Jannat Patel
5009900c0e Merge pull request #469 from pateljannat/job-changes 2023-01-16 09:54:58 +05:30
Jannat Patel
0f60f1a58b fix: see on website link in job opportunity 2023-01-11 10:11:57 +05:30
Jannat Patel
8f88518187 Merge pull request #464 from pateljannat/people 2023-01-09 16:33:45 +05:30
Jannat Patel
05bcead7d1 fix: profile webform layout 2023-01-09 16:24:24 +05:30
Jannat Patel
6268989306 fix: user custom field positions 2023-01-09 12:51:33 +05:30
Jannat Patel
43ba835b52 fix: renamed community to people 2023-01-06 18:27:04 +05:30
Jannat Patel
9240bc9130 feat: card background 2023-01-05 13:25:59 +05:30
Jannat Patel
fb70aee055 chore: fix pre-commit-config 2023-01-05 11:19:48 +05:30
Jannat Patel
7bf69eb77d chore: fix pre-commit-config 2023-01-05 11:18:32 +05:30
Jannat Patel
7ded9a23be Merge pull request #463 from pateljannat/user-singles-issue 2023-01-05 09:38:25 +05:30
Jannat Patel
281af15d65 fix: converted query to qb 2023-01-04 16:57:35 +05:30
Jannat Patel
ec31c96120 fix: linters 2023-01-04 16:29:07 +05:30
Jannat Patel
b970eb1541 fix: user doctype singles issue 2023-01-03 22:04:59 +05:30
Jannat Patel
7f6b90d5f4 Merge pull request #461 from NagariaHussain/fix-meta 2023-01-03 18:49:52 +05:30
Hussain Nagaria
d28096ede6 Revert "feat: add meta image field in LMS course"
This reverts commit 37e8c3ab84.
2023-01-03 17:32:49 +05:30
Hussain Nagaria
12b2b0d0eb fix: linter 2023-01-03 17:01:00 +05:30
Hussain Nagaria
a0e281fb30 feat(ux): add View in Website button in LMS Course 2023-01-03 16:52:50 +05:30
Hussain Nagaria
37e8c3ab84 feat: add meta image field in LMS course 2023-01-03 16:48:52 +05:30
Hussain Nagaria
16cb564a6a fix: render meta block in portal base pages 2023-01-03 16:48:16 +05:30
Jannat Patel
cd88657bc9 Merge pull request #460 from pateljannat/readme 2022-12-30 18:11:42 +05:30
Jannat Patel
d82a32b06a docs: grammar correction in readme 2022-12-30 18:03:01 +05:30
Jannat Patel
094bd943ee docs: updated screenshots in readme 2022-12-30 15:58:31 +05:30
Jannat Patel
1564de346d docs: improved readme 2022-12-30 12:56:41 +05:30
Jannat Patel
a5268af269 Merge pull request #459 from pateljannat/onboarding-fixes 2022-12-29 16:43:14 +05:30
Jannat Patel
565d9e093c fix: onboarding header 2022-12-29 16:29:03 +05:30
Jannat Patel
cb75606b05 Merge pull request #458 from pateljannat/lesson-issues 2022-12-29 14:39:23 +05:30
Jannat Patel
7c36294359 fix: removed unnecessary code 2022-12-29 11:32:31 +05:30
Jannat Patel
ad084389cc fix: minor issues 2022-12-29 11:31:52 +05:30
Jannat Patel
aa8c65a00a Merge pull request #454 from pateljannat/course-count 2022-12-28 15:29:06 +05:30
Jannat Patel
95ec31e238 fix: formatting 2022-12-28 15:10:01 +05:30
Jannat Patel
b5f3a0fa98 feat: course count in list view 2022-12-28 13:13:03 +05:30
Jannat Patel
36bf0d7fb9 fix: rectified condition for login redirection 2022-12-28 11:07:37 +05:30
Jannat Patel
1719887ac4 Merge pull request #453 from pateljannat/setup-wizard-check-on-login 2022-12-27 17:39:06 +05:30
Jannat Patel
7f149bf3b1 fix: login redirect condition 2022-12-27 17:06:41 +05:30
Jannat Patel
f592e6655f fix: docker setup 2022-12-27 16:36:40 +05:30
Jannat Patel
46399c7b13 revert: docker setup 2022-12-27 15:44:12 +05:30
Jannat Patel
0ec66f0f2d fix: docker setup 2022-12-27 15:17:33 +05:30
Jannat Patel
96c8b64e26 Merge pull request #452 from pateljannat/search 2022-12-26 16:46:46 +05:30
Jannat Patel
bd0b7a8286 fix: removed unused code 2022-12-26 13:56:03 +05:30
Jannat Patel
263b3ec476 fix: formatting 2022-12-26 13:27:57 +05:30
Jannat Patel
46075130ab fix: search ux 2022-12-26 13:24:29 +05:30
Jannat Patel
0f314bc4e3 feat: new search ui 2022-12-22 15:47:03 +05:30
Jannat Patel
2b45e7d77c Merge pull request #450 from pateljannat/onboarding-signup 2022-12-21 12:04:49 +05:30
Jannat Patel
987c3e5fe2 Merge pull request #451 from mohsinalimat/main 2022-12-21 10:59:33 +05:30
Jannat Patel
1e1580d58a fix: patch format 2022-12-21 10:40:30 +05:30
Jannat Patel
da9667e1f7 feat: base template and patch for onboarding 2022-12-20 13:32:30 +05:30
Jannat Patel
9e42fdd786 feat: skip onboarding 2022-12-20 11:34:56 +05:30
Jannat Patel
de19abbc5e feat: onboarding ui 2022-12-19 23:25:53 +05:30
MohsinAli
5448a99177 fix: doc url 2022-12-17 17:01:00 +05:30
Jannat Patel
f93d7b0193 signup-and-onboarding 2022-12-16 16:44:55 +05:30
Jannat Patel
d3bda1b5d0 Merge pull request #449 from pateljannat/revert-navbar-settings 2022-12-15 10:35:16 +05:30
Jannat Patel
1c49e78b13 revert: navbar settings 2022-12-15 10:28:17 +05:30
Jannat Patel
9d373d4091 Merge pull request #446 from pateljannat/navbar-settings
Resolves https://github.com/frappe/lms/issues/442
2022-12-12 13:55:31 +05:30
Jannat Patel
26edfc7bb9 fix: remove after_install hook 2022-12-12 13:47:48 +05:30
Jannat Patel
b527c9b160 fix: format 2022-12-12 13:39:01 +05:30
Jannat Patel
0356b8e2d2 feat: pages to navbar settings 2022-12-12 13:31:11 +05:30
Jannat Patel
1bf093d1b9 Merge pull request #443 from pateljannat/course-redirection-issue 2022-12-12 11:37:33 +05:30
Jannat Patel
a78d127702 fix: formatting 2022-12-12 11:28:38 +05:30
Jannat Patel
028c0725c3 fix: hide start learning when no lesson in course 2022-12-12 11:17:51 +05:30
Jannat Patel
424d35bf42 fix: course outline style 2022-12-07 16:06:55 +05:30
Jannat Patel
1effdd8482 Merge pull request #441 from pateljannat/rename-instructor-to-course-creator 2022-12-02 23:46:31 +05:30
Jannat Patel
a780b7520f fix: rename instructor role to course creator 2022-12-01 15:22:18 +05:30
Jannat Patel
233bf36ef6 Merge pull request #440 from pateljannat/rename-skill 2022-12-01 15:03:01 +05:30
Jannat Patel
616a45ebc5 fix: linter 2022-12-01 13:13:01 +05:30
Jannat Patel
136f16c9cc fix: renamed skill doctype to user skill 2022-12-01 12:48:33 +05:30
Jannat Patel
609628b9cf fix: progress page style 2022-11-29 16:18:15 +05:30
Jannat Patel
1e0d2e0f2a Merge pull request #436 from pateljannat/optimisation 2022-11-28 14:44:12 +05:30
Jannat Patel
da7e52f85f perf: course card improvements 2022-11-28 12:40:07 +05:30
Jannat Patel
4640ce82f6 docs: updated readme 2022-11-28 10:26:37 +05:30
Jannat Patel
03ff9e0521 Merge pull request #434 from pateljannat/student-class-view 2022-11-28 10:13:41 +05:30
Jannat Patel
f566211d82 feat: students view for classes 2022-11-25 17:46:46 +05:30
Jannat Patel
66ddea2031 Merge pull request #433 from pateljannat/activity-details 2022-11-25 09:29:54 +05:30
Jannat Patel
8b5a9e1639 fix: removed unnecessary lines of code 2022-11-25 09:21:59 +05:30
Jannat Patel
9a183d2ef1 fix: removed quiz result view 2022-11-25 09:02:19 +05:30
Jannat Patel
807f77755e feat: activity details in class 2022-11-24 18:57:45 +05:30
Jannat Patel
c0a851e045 Merge pull request #432 from pateljannat/class-evaluations 2022-11-23 15:24:39 +05:30
Jannat Patel
96849afcba fix: formatting 2022-11-23 15:14:15 +05:30
Jannat Patel
91e71091ef fix: show evaluation in read only mode 2022-11-23 15:12:57 +05:30
Jannat Patel
f691ebd146 feat: class evaluation 2022-11-23 14:39:18 +05:30
Jannat Patel
f620c431a1 Merge pull request #431 from pateljannat/last-active 2022-11-23 09:52:36 +05:30
Jannat Patel
019743b245 fix: formating 2022-11-22 08:46:39 +05:30
Jannat Patel
1d8e3de136 feat: last active time of class students 2022-11-22 08:43:12 +05:30
Jannat Patel
0f46f6a1c1 Merge pull request #429 from pateljannat/classes 2022-11-21 14:08:29 +05:30
Jannat Patel
b5078c1f1f fix: removed unused file 2022-11-21 13:36:37 +05:30
Jannat Patel
88f9114dd6 ci: updated flake8 url 2022-11-21 12:33:26 +05:30
Jannat Patel
cfcc1b3162 fix: formatting 2022-11-21 12:27:52 +05:30
Jannat Patel
ed2fababff feat: assignment comments display 2022-11-21 12:08:17 +05:30
Jannat Patel
74210245cf feat: assignment submission and ui 2022-11-18 17:05:38 +05:30
Jannat Patel
a4ec058a81 feat: student progress 2022-11-16 18:43:10 +05:30
Jannat Patel
ae2c15fe8c feat: progress page 2022-11-15 18:56:45 +05:30
Jannat Patel
d9e44e0f91 fix: renamed instructor and moderator roles 2022-11-14 17:25:07 +05:30
Jannat Patel
3e1f29af48 feat: add and remove students and courses from class 2022-11-14 16:20:13 +05:30
Jannat Patel
7ac3f6d8ef Merge branch 'main' of https://github.com/frappe/lms into classes 2022-11-11 12:00:12 +05:30
Jannat Patel
e0f2b9c1ab Merge pull request #428 from pateljannat/lesson-chart 2022-11-11 10:54:52 +05:30
Jannat Patel
3785e7066e fix: formatting 2022-11-11 10:46:35 +05:30
Jannat Patel
157f6b45e9 feat: add pages to nav after install 2022-11-11 10:40:29 +05:30
Jannat Patel
c8dbc18179 feat: statistics page 2022-11-10 20:21:43 +05:30
Jannat Patel
1d5d86ef6c feat: claasses 2022-11-09 16:36:26 +05:30
Jannat Patel
f1746978b2 Merge pull request #427 from pateljannat/more-stats 2022-11-09 15:33:34 +05:30
Jannat Patel
e1f4dae832 fix: linting 2022-11-09 15:27:42 +05:30
Jannat Patel
94e7f6a1f4 feat: course and lesson completion count 2022-11-09 15:21:08 +05:30
Jannat Patel
d3ea923da7 fix: profile button visibility 2022-11-09 11:42:16 +05:30
Jannat Patel
dc27dd5d7e Merge pull request #425 from pateljannat/stats-format 2022-11-08 11:55:36 +05:30
Jannat Patel
26f76acdd2 fix: format stats 2022-11-08 11:29:46 +05:30
Jannat Patel
719a32e4a5 Merge pull request #424 from pateljannat/workspace-links 2022-11-07 18:59:59 +05:30
Jannat Patel
cdf004cdec fix: workspace links 2022-11-07 18:50:43 +05:30
Jannat Patel
9d5f495842 Merge pull request #422 from pateljannat/semgrep 2022-11-04 13:54:08 +05:30
Jannat Patel
8204fa8ee7 test: slugify issue 2022-11-04 13:48:12 +05:30
Jannat Patel
9f9dd25f91 fix: translations 2022-11-04 13:39:25 +05:30
Jannat Patel
bd929bfa3f fix: translations 2022-11-04 13:27:14 +05:30
Jannat Patel
5916695d30 ci: removed isort 2022-11-04 12:57:24 +05:30
Jannat Patel
cca42dca49 ci: flake8 issues 2022-11-04 12:43:15 +05:30
Jannat Patel
33065c0ed3 fix: pre commit in profile 2022-11-04 11:49:25 +05:30
Jannat Patel
603eddf878 fix: pre commit issues 2022-11-04 11:47:09 +05:30
Jannat Patel
cda26ab248 ci: test pre commit 2022-11-04 11:37:59 +05:30
Jannat Patel
e73d59d538 ci: pre commit yaml 2022-11-04 11:25:35 +05:30
Jannat Patel
893fac348d ci: pre commit config 2022-11-04 11:22:52 +05:30
Jannat Patel
642b28bad9 Merge pull request #421 from pateljannat/tabs-url 2022-11-04 11:17:23 +05:30
Jannat Patel
b9db14ad44 ci: semgrep 2022-11-04 11:14:37 +05:30
Jannat Patel
0c23ead398 fix: tab urls 2022-11-04 10:46:48 +05:30
Jannat Patel
e9009dcb9c fix: quiz button mayout 2022-11-03 15:23:16 +05:30
Jannat Patel
0d0e64f930 fix: no cache for quiz 2022-11-03 15:01:06 +05:30
Jannat Patel
b1bdf6516e fix: removed unused field 2022-11-03 14:21:06 +05:30
Jannat Patel
eca4f89d8b Merge pull request #419 from pateljannat/course-permission-messages 2022-11-03 11:27:46 +05:30
Jannat Patel
199cbcf33f fix: messages if access lacking 2022-11-03 11:20:58 +05:30
Jannat Patel
1f4c7fcb0f fix: course permission messages 2022-11-03 10:59:39 +05:30
Jannat Patel
59b8c781e3 fix: assignment issues 2022-11-01 14:39:30 +05:30
Jannat Patel
9133a3f50b fix: batch issue 2022-11-01 12:12:08 +05:30
Jannat Patel
b9f4ba6527 Merge pull request #417 from pateljannat/assignments-refactor 2022-10-31 17:22:36 +05:30
Jannat Patel
7b5fe82de9 fix: removed unused field and code 2022-10-31 17:17:46 +05:30
Jannat Patel
d74db85b82 fix: validations 2022-10-31 16:54:22 +05:30
Jannat Patel
915bbdf247 fix: batch context 2022-10-31 11:50:36 +05:30
Jannat Patel
b3412b42b7 refactor: assignments 2022-10-28 19:22:48 +05:30
Jannat Patel
c6b917fa83 Merge branch 'main' of https://github.com/frappe/lms 2022-10-27 17:40:31 +05:30
Jannat Patel
c286afa45f fix: stats graph for the current day 2022-10-27 17:40:27 +05:30
Jannat Patel
c74faa3340 Merge pull request #412 from pateljannat/user-onboarding 2022-10-27 13:38:32 +05:30
Jannat Patel
fa4e8a1ea6 Merge pull request #413 from pateljannat/stats-template 2022-10-27 11:33:49 +05:30
Jannat Patel
42c664a379 Merge pull request #416 from pateljannat/cohort-fixes 2022-10-27 11:31:38 +05:30
Jannat Patel
b84a955ee1 fix: cohorts 2022-10-27 11:23:44 +05:30
Jannat Patel
211ca3111f fix: stats template 2022-10-21 11:00:37 +05:30
Jannat Patel
935e2a976e fix: certifications section in workspace 2022-10-20 20:09:12 +05:30
Jannat Patel
5d38b4dfa0 feat: onboarding 2022-10-20 17:41:26 +05:30
Jannat Patel
cbf852828c Merge pull request #409 from pateljannat/reviews-cta 2022-10-19 17:52:49 +05:30
Jannat Patel
7d8b366a73 fix: reviews CTA 2022-10-19 17:29:05 +05:30
Jannat Patel
4ad457d568 chore: fix subscription limit for course members 2022-10-19 09:56:22 +05:30
Jannat Patel
2ab0cb2787 Merge pull request #406 from pateljannat/stats 2022-10-18 09:52:45 +05:30
Jannat Patel
4feab27c59 fix: show stats to guest users 2022-10-18 09:42:29 +05:30
Jannat Patel
3c1449c898 fix: import chart lib from website bundle 2022-10-17 19:47:11 +05:30
Jannat Patel
7d029c5305 fix: stats grid width 2022-10-17 11:26:47 +05:30
Jannat Patel
13274c01d7 fix: chart color 2022-10-17 10:56:06 +05:30
Jannat Patel
f37229c202 feat: statistics section 2022-10-14 20:33:27 +05:30
Jannat Patel
61f9ff6892 Merge pull request #405 from pateljannat/cohorts 2022-10-13 20:51:46 +05:30
Jannat Patel
3df08b99b3 fix: cohort translations 2022-10-13 17:28:22 +05:30
Jannat Patel
f9748cb723 fix: cohort issue 2022-10-13 17:12:13 +05:30
Jannat Patel
437f637be9 Merge pull request #404 from pateljannat/start-learning-issue 2022-10-13 13:19:39 +05:30
Jannat Patel
7d2b86c548 fix: dont show start learning from course page if disabled 2022-10-13 13:04:22 +05:30
Jannat Patel
c10ff68ee7 Merge pull request #383 from joebordes/i18n_es_001 2022-10-13 12:33:09 +05:30
Jannat Patel
b2a8dd13f6 Merge pull request #402 from pateljannat/dashboard-profile-merge 2022-10-12 15:55:21 +05:30
Jannat Patel
fb8ab132e9 fix: heading for course list page 2022-10-12 11:14:02 +05:30
Jannat Patel
7ce2e45719 Merge branch 'main' of https://github.com/frappe/lms into dashboard-profile-merge 2022-10-12 10:53:38 +05:30
Jannat Patel
c6d15d2605 Merge pull request #401 from pateljannat/ui-components 2022-10-12 10:53:12 +05:30
Jannat Patel
8d57ea4216 fix: better modal UI 2022-10-12 10:44:28 +05:30
Jannat Patel
fdf1bbd1e2 refactor: merged profile and dashboard page 2022-10-11 17:23:36 +05:30
Jannat Patel
662813b378 Merge pull request #400 from pateljannat/quiz-submission 2022-10-11 10:13:18 +05:30
Jannat Patel
8709ae7113 fix: quiz submission 2022-10-11 09:53:21 +05:30
Jannat Patel
ac22b71171 Merge pull request #397 from pateljannat/misc-fixes 2022-10-10 15:47:12 +05:30
Jannat Patel
328d1d6546 fix: label of login button in review section 2022-10-10 13:31:15 +05:30
Jannat Patel
11277d2ef3 fix: misc ux 2022-10-10 13:11:49 +05:30
Jannat Patel
54dc6102a6 Merge pull request #395 from pateljannat/delete-custom-fields-on-uninstall 2022-10-07 10:07:16 +05:30
Jannat Patel
c0c9b50a5f fix: delete custom fields after app in uninstalled 2022-10-06 18:08:27 +05:30
Jannat Patel
e780a6fc7c fix: get course directly from lesson for assignment folder 2022-10-04 19:23:51 +05:30
Jannat Patel
fd89b288e5 fix: username validation 2022-10-04 18:11:55 +05:30
joebordes
a05c3a5e94 i18n(ES) syntax and CSV format 2022-10-02 03:19:12 +02:00
Jannat Patel
43e91c9275 Merge pull request #382 from pateljannat/lms-statistics 2022-09-30 11:17:32 +05:30
Jannat Patel
26dd2935d7 fix: renamed dashboard stats to LMS Statistics 2022-09-30 10:51:51 +05:30
Jannat Patel
f653871e3a fix: duplicate function names 2022-09-29 18:30:45 +05:30
Jannat Patel
89b91a081c fix: course restriction condition 2022-09-29 18:02:50 +05:30
Jannat Patel
246b26079b perf: course cards get all memberships at once 2022-09-29 16:59:08 +05:30
Jannat Patel
41a9e422d5 fix: course list page performance 2022-09-29 13:19:09 +05:30
Jannat Patel
0704d7f4a4 Merge pull request #381 from pateljannat/dashboard-stats 2022-09-29 09:04:15 +05:30
Jannat Patel
1e66742d02 fix: batch creation error 2022-09-28 21:55:35 +05:30
Jannat Patel
d55f827d93 feat: dashboard stat 2022-09-28 18:34:14 +05:30
Jannat Patel
40c68d4d63 Merge pull request #380 from pateljannat/progress-refactor 2022-09-28 12:58:15 +05:30
Jannat Patel
5c58ddc800 fix: progress tracking 2022-09-28 12:42:15 +05:30
Jannat Patel
94171cbc0e Merge pull request #379 from pateljannat/notifications 2022-09-27 18:22:40 +05:30
Jannat Patel
cf8549bb28 fix: removed unused functions 2022-09-27 18:21:57 +05:30
Jannat Patel
a291d73828 feat: show notifications from logs 2022-09-27 18:13:46 +05:30
Jannat Patel
a6156ec863 feat: get notifications 2022-09-26 22:09:18 +05:30
Jannat Patel
be583cc86d fix: conflicts 2022-09-26 09:45:16 +05:30
Jannat Patel
00c55f5e82 Merge branch 'main' of https://github.com/frappe/lms 2022-09-23 07:12:16 +05:30
Jannat Patel
c9fd1f5252 fix: discussions component visibility conditions 2022-09-23 07:12:12 +05:30
Jannat Patel
992d1065ac Merge pull request #378 from pateljannat/subscription 2022-09-22 22:18:09 +05:30
Jannat Patel
247017d19a fix: changed essential plan to pro 2022-09-21 20:38:56 +05:30
Jannat Patel
b9fe05c27f feat: subscription add ons 2022-09-21 17:37:56 +05:30
Jannat Patel
b01a2cfd79 Merge pull request #377 from pateljannat/private-files 2022-09-20 15:39:07 +05:30
Jannat Patel
37f2e7eeda fix: check if path is present 2022-09-19 17:56:49 +05:30
Jannat Patel
4ba6ea9190 fix: removed unnecessary import 2022-09-19 10:34:49 +05:30
Jannat Patel
7c1c061681 fix: change private files to public for company logo, user image and course image 2022-09-16 19:06:53 +05:30
Jannat Patel
47e4175c9a Merge pull request #376 from pateljannat/ux-fix 2022-09-16 16:10:49 +05:30
Jannat Patel
023fd73b86 fix: removed unused classes 2022-09-16 16:05:33 +05:30
Jannat Patel
f7ba72217b fix: controls script loading 2022-09-16 11:37:11 +05:30
Jannat Patel
47b9b1dcd6 fix: show first chapter and question form by default 2022-09-15 22:52:17 +05:30
Jannat Patel
f3adbfef55 Merge pull request #375 from pateljannat/fixes 2022-09-14 20:42:54 +05:30
Jannat Patel
bc9225f8ed fix: course count on profile page 2022-09-14 20:07:58 +05:30
Jannat Patel
62ac0089c9 fix: misc ux 2022-09-14 17:10:38 +05:30
Jannat Patel
af059141f0 fix: profile ux 2022-09-13 17:48:54 +05:30
Jannat Patel
efe73a21d9 fix: profile ui 2022-09-13 17:13:25 +05:30
Jannat Patel
adad299724 Merge pull request #374 from pateljannat/certificate-on-profile 2022-09-13 13:11:38 +05:30
Jannat Patel
15b832eefb fix: styles 2022-09-13 13:03:21 +05:30
Jannat Patel
434b6fdc8f Merge pull request #373 from pateljannat/description-field 2022-09-13 12:49:40 +05:30
Jannat Patel
99c886a9cb fix: conflicts 2022-09-13 12:49:06 +05:30
Jannat Patel
7d18215bc9 feat: certificates section in profile 2022-09-13 12:47:01 +05:30
Jannat Patel
7d7f674d9e fix: empty states 2022-09-12 18:17:06 +05:30
Jannat Patel
46861486c9 fix: text editor for description field 2022-09-12 13:00:51 +05:30
Jannat Patel
d959cacd15 Merge pull request #372 from pateljannat/course-moderator 2022-09-12 12:35:44 +05:30
Jannat Patel
d8d0ce5b45 fix: empty state for review section 2022-09-12 12:15:30 +05:30
Jannat Patel
b94a4ef9d6 feat: role settings from profile 2022-09-12 12:06:36 +05:30
Jannat Patel
212ed8e428 feat: course settings from website 2022-09-09 18:16:02 +05:30
Jannat Patel
6d14bc2f54 fix: encode course image 2022-09-09 16:04:53 +05:30
Jannat Patel
9dc10c3756 feat: allow moderators to edit course 2022-09-09 15:37:35 +05:30
Jannat Patel
316e7be51e Merge branch 'main' of https://github.com/frappe/lms into course-moderator 2022-09-09 11:54:39 +05:30
Jannat Patel
14842a6d56 Merge pull request #371 from pateljannat/ui-fix 2022-09-06 13:12:33 +05:30
Jannat Patel
ce7f3ffca9 fix: no preview message 2022-09-06 11:38:40 +05:30
Jannat Patel
4c969420f3 feat: course moderator 2022-09-06 11:19:11 +05:30
Jannat Patel
36aca1e664 fix: ui for review, instructors and profile 2022-09-05 18:05:16 +05:30
Jannat Patel
3a08f57fb1 fix: context for dashboard 2022-09-05 14:53:13 +05:30
Jannat Patel
8f86a8aba6 chore: removed log 2022-09-05 14:46:40 +05:30
Jannat Patel
e84e02ff07 fix: profile, dashboard and tests 2022-09-05 13:32:51 +05:30
Jannat Patel
7ef625c598 chore: logging user 2022-09-05 11:35:21 +05:30
Jannat Patel
2819e55a61 fix: dashboard function parameters 2022-09-05 10:34:40 +05:30
Jannat Patel
25d9b08dd5 Merge pull request #370 from pateljannat/dashboard 2022-09-05 09:32:16 +05:30
Jannat Patel
6a760c3019 chore: removed logs 2022-09-05 09:25:00 +05:30
Jannat Patel
8088a464ad fix: dashboard creators section issue 2022-09-05 09:16:57 +05:30
Jannat Patel
e41c83a68c fix: spelling in readme 2022-09-02 17:58:52 +05:30
Jannat Patel
2d5b8430bd fix: images and links in readme 2022-09-02 17:55:00 +05:30
Jannat Patel
eabbe3e3ed fix: readme 2022-09-02 17:50:29 +05:30
Jannat Patel
c37cdbdc5f chore: added logs 2022-09-02 17:18:57 +05:30
Jannat Patel
8a0df559c3 Merge pull request #368 from pateljannat/video-and-quiz-field 2022-09-02 14:58:17 +05:30
Jannat Patel
dfc1c9c228 feat: seperate inputs for adding youtube video and quiz 2022-09-02 13:05:26 +05:30
Jannat Patel
ad20c1cbf1 fix: membership doctype structure 2022-09-01 17:12:32 +05:30
Jannat Patel
6f4677b36b fix: ui issues 2022-08-31 15:34:18 +05:30
Jannat Patel
b3a9274cd3 fix: minor UI 2022-08-30 12:50:26 +05:30
Jannat Patel
7a7bc3e0db fix: removed desk access from course instructor role 2022-08-29 09:21:45 +05:30
Jannat Patel
425bb54057 feat: notifications tab in dashboard 2022-08-29 09:19:06 +05:30
Jannat Patel
d82df84cf6 Merge pull request #357 from pateljannat/new-course-ui 2022-08-26 17:39:34 +05:30
Jannat Patel
7d697f068f fix: ux issues 2022-08-26 16:35:02 +05:30
Jannat Patel
4499b34b51 fix: minor issues 2022-08-24 18:20:19 +05:30
Jannat Patel
9c6cc8ecd4 fix: removed web forms of old course creation flow 2022-08-23 18:27:39 +05:30
Jannat Patel
668130d443 feat: access for course creation 2022-08-22 12:58:54 +05:30
Jannat Patel
5aba690318 feat: update quiz 2022-08-19 18:22:43 +05:30
Jannat Patel
7397bf389e feat: add a new quiz 2022-08-19 11:43:49 +05:30
Jannat Patel
e1b16e9ae3 feat: quiz-creation-ui 2022-08-18 19:52:27 +05:30
Jannat Patel
eb50f6fd8f feat: quiz listing 2022-08-16 17:08:43 +05:30
Jannat Patel
5d6dc16a19 fix: create course button and search bar width 2022-08-12 12:34:04 +05:30
Jannat Patel
64dc76d616 fix: text editor for lesson 2022-08-12 09:09:50 +05:30
Jannat Patel
301664ce93 fix: ui for course creation 2022-08-10 19:45:58 +05:30
Jannat Patel
a4534d8f3e feat: update lesson 2022-08-09 18:32:29 +05:30
Jannat Patel
f161173cb6 Merge pull request #358 from pateljannat/download-certificate-pdf 2022-08-08 16:47:46 +05:30
Jannat Patel
c58f5efcdd feat: export certificate 2022-08-08 16:40:40 +05:30
Jannat Patel
65edd2ce22 feat: new lesson redirect 2022-08-08 11:47:23 +05:30
Jannat Patel
0723f3091c fix: removed unnecessary code 2022-08-01 17:56:45 +05:30
Jannat Patel
a95204f02e feat: add and update a chapter 2022-08-01 17:53:57 +05:30
Jannat Patel
6dd12e111d feat: new course ui 2022-07-28 18:22:57 +05:30
Jannat Patel
6e741bd800 Merge pull request #354 from pateljannat/readme-update 2022-07-19 15:40:54 +05:30
Jannat Patel
d37e53bd8e chore: center align readme header 2022-07-19 15:15:04 +05:30
Jannat Patel
fd3585697b chore: readme update 2022-07-19 15:10:46 +05:30
Jannat Patel
e92e6ec1c6 fix: removed the blue arrow from the course cards template 2022-07-13 16:05:24 +05:30
Jannat Patel
f0c89cbbba Merge pull request #352 from pateljannat/delete-old-module-documents
fix: delete doctypes from old modules
2022-07-07 17:16:01 +05:30
Jannat Patel
d20f932316 fix: delete webforms of unused modules 2022-07-07 17:08:53 +05:30
Jannat Patel
e011ef469f fix: delete doctypes from old modules 2022-07-05 18:50:10 +05:30
Jannat Patel
384850b452 fix: don't load api file during app init 2022-07-04 16:36:22 +05:30
Jannat Patel
e467aba32f Merge pull request #350 from pateljannat/job-board-redesign 2022-07-01 18:08:43 +05:30
Jannat Patel
56c51b73b0 fix: job details redesign 2022-07-01 17:57:52 +05:30
Jannat Patel
1aa82dd03e Merge pull request #351 from frappe/ankush-patch-1 2022-07-01 16:27:43 +05:30
Ankush Menat
a3b7c67ef9 ci: use python 3.10 2022-07-01 16:01:53 +05:30
Jannat Patel
de0200f352 fix: job list ui 2022-06-30 17:45:48 +05:30
Jannat Patel
999c267dfe Merge pull request #348 from pateljannat/web-templates
fix: web template ui
2022-06-29 16:13:10 +05:30
Jannat Patel
c9a6c2948e fix: new design for testimonial cards 2022-06-29 16:05:18 +05:30
Jannat Patel
041157a85f fix: subtitle field for testimonial and course cards 2022-06-28 18:00:53 +05:30
Jannat Patel
cd009936e2 fix: save member info in quiz submission 2022-06-27 17:42:42 +05:30
Jannat Patel
f43dfd47d0 revert: markdown file changes 2022-06-24 19:11:18 +05:30
Jannat Patel
7082467352 fix: made bio field small text in profile edit form 2022-06-24 19:10:42 +05:30
Jannat Patel
f05d3581c1 Merge pull request #346 from pateljannat/user-name-hooks-fix
fix: renamed apps in hooks and rectified username validation conditions
2022-06-23 10:26:35 +05:30
Jannat Patel
02e560cb18 fix: renamed apps in hooks and rectified username validation conditions 2022-06-23 10:12:26 +05:30
Jannat Patel
b2d38ad9d6 Merge pull request #345 from pateljannat/minor-fix 2022-06-21 16:37:44 +05:30
Jannat Patel
2743f1adc9 fix: removed unnecessary space 2022-06-21 16:19:42 +05:30
Jannat Patel
5e875b6d71 refactor: member field in lms quiz submission 2022-06-20 17:44:14 +05:30
Jannat Patel
6ccb5e8dbf Merge pull request #344 from pateljannat/testimonials-redesign 2022-06-17 19:02:25 +05:30
Jannat Patel
ad42a3d41c fix: testimonials new design 2022-06-17 18:55:26 +05:30
Jannat Patel
b40e0068ab fix: show only published courses in dashboard 2022-06-15 09:48:29 +05:30
Jannat Patel
f8dbbc1d11 fix: quiz question style 2022-06-14 17:12:32 +05:30
Jannat Patel
951070757c fix: space between lock icon and lesson title 2022-06-13 17:57:28 +05:30
Jannat Patel
c2a93c6c02 fix: course card template icon and translation 2022-06-09 16:39:29 +05:30
Jannat Patel
9dc82963c4 Merge pull request #342 from pateljannat/quiz-style-fixes
fix: quiz ui
2022-06-08 10:06:35 +05:30
Jannat Patel
148fce42ba fix: quiz ui 2022-06-08 09:56:19 +05:30
Jannat Patel
92f1263314 fix: course card meta info 2022-06-07 13:12:07 +05:30
Jannat Patel
5fad44369c Merge pull request #339 from fproldan/translations 2022-06-07 11:37:24 +05:30
Jannat Patel
eb3d7c9615 Merge branch 'main' into translations 2022-06-07 11:28:42 +05:30
Jannat Patel
5437a98539 Merge pull request #341 from pateljannat/ux-fixes
fix: replaced some dialogs with alerts
2022-06-07 11:06:53 +05:30
Francisco Roldan
d9b26f31f8 trans: profile 2022-06-06 14:50:08 -03:00
Jannat Patel
9916ec132b fix: revert unnecessary changes 2022-06-06 20:53:22 +05:30
Jannat Patel
1f3806a7bd fix: replaced some dialogs with alerts 2022-06-06 11:15:06 +05:30
Jannat Patel
55a770f129 fix: certificate request notification template 2022-06-03 13:36:50 +05:30
Jannat Patel
d742d595b2 feat: notifications for certificate request 2022-06-03 12:01:58 +05:30
Jannat Patel
9f575902b0 fix: lms certificate existing request condition 2022-06-03 09:16:54 +05:30
Jannat Patel
6e49cf14fa fix: validation for certificate request 2022-06-02 19:28:40 +05:30
Jannat Patel
4d96abb786 Merge branch 'main' of https://github.com/frappe/lms 2022-05-27 11:44:45 +05:30
Jannat Patel
b6d9470a4e fix: removed meta info from certificate page 2022-05-27 11:44:41 +05:30
Francisco Roldan
6ef86dce8c fix: es 2022-05-26 09:52:04 -03:00
Francisco Roldan
5a33f4c707 fix: translations 2022-05-26 09:49:51 -03:00
Francisco Roldan
119c1cbb35 fix: translations 2022-05-26 09:48:35 -03:00
Francisco Roldan
2be2646d95 fix: translations 2022-05-26 09:45:56 -03:00
Francisco Roldan
0609174a14 fix: translations 2022-05-26 09:43:11 -03:00
Francisco Roldan
227ca0ed41 fix: translations 2022-05-26 09:34:02 -03:00
Francisco Roldan
cc90ccece2 feat: translations 2022-05-25 14:38:50 -03:00
Francisco Roldan
9ab92165c8 feat: translations 2022-05-25 14:24:54 -03:00
Jannat Patel
e1fc0d08b7 Merge pull request #337 from pateljannat/ui-fixes
fix: course banner spaces
2022-05-25 14:33:56 +05:30
Jannat Patel
21dad2d72e fix: eval slot display 2022-05-25 13:20:39 +05:30
Jannat Patel
87fe3e72a2 fix: course certificate price display 2022-05-24 16:51:55 +05:30
Jannat Patel
c92220f1e5 Merge branch 'main' of https://github.com/frappe/lms into ui-fixes 2022-05-24 11:05:20 +05:30
Jannat Patel
eabeb612b4 fix: adding missing closing div for job details 2022-05-23 17:14:46 +05:30
Jannat Patel
900e61291a Merge pull request #336 from pateljannat/format-amount 2022-05-19 17:17:10 +05:30
Jannat Patel
51d9f1943b fix: format certificate amount on course home page 2022-05-19 17:00:19 +05:30
Jannat Patel
282b07dffc fix: format amount on course cards 2022-05-19 16:49:53 +05:30
Jannat Patel
6521415ae0 fix: course overlay site 2022-05-19 15:59:41 +05:30
Jannat Patel
2819be4508 Merge branch 'main' of https://github.com/frappe/lms into ui-fixes 2022-05-18 11:13:26 +05:30
Jannat Patel
a60805a971 Merge pull request #335 from pateljannat/quiz-timer 2022-05-18 11:04:26 +05:30
Jannat Patel
af21d33165 fix: page reload condition 2022-05-18 10:47:49 +05:30
Jannat Patel
e465ad58ca fix: removed unnecessary tags 2022-05-17 17:47:27 +05:30
Jannat Patel
cd56fc6179 fix: banner style and page exit condition 2022-05-17 17:29:11 +05:30
Jannat Patel
1ef70dd4e4 fix: submit quiz if user leaves page 2022-05-17 17:12:54 +05:30
Jannat Patel
a460ea5194 fix: start banner style 2022-05-17 16:04:03 +05:30
Jannat Patel
5ebf7b7992 fix: start banner style 2022-05-17 15:31:05 +05:30
Jannat Patel
c9b50e7db6 feat: timer in quiz 2022-05-17 11:52:10 +05:30
Jannat Patel
b9993796a0 fix: certificate style and meta 2022-05-16 13:22:30 +05:30
Jannat Patel
4fb2241621 feat: see on website link for lms certificate 2022-05-13 19:47:36 +05:30
Jannat Patel
fa49dc08a3 fix: certificate footer style 2022-05-13 18:51:07 +05:30
Jannat Patel
3d939f18df fix: removed get certificate button from course page 2022-05-11 15:08:37 +05:30
Jannat Patel
0d38b9aab1 fix: course banner spaces 2022-05-11 15:07:26 +05:30
Jannat Patel
28207f45cd Merge pull request #332 from pateljannat/certificate-design 2022-05-11 14:39:25 +05:30
Jannat Patel
72a5e9eb05 fix: return 1.1 if current lesson not found 2022-05-09 15:05:50 +05:30
Jannat Patel
91dc99d8ef fix: certificate custom and style 2022-05-09 13:17:20 +05:30
Jannat Patel
305a34b26d fix: course card info condition 2022-05-06 09:45:42 +05:30
Jannat Patel
67349bbce6 fix: job list view card style 2022-05-06 08:39:34 +05:30
Jannat Patel
242ba89b95 fix: course card cleanup 2022-05-04 19:10:40 +05:30
Jannat Patel
295280f8cf Merge pull request #331 from pateljannat/cleanup
fix: UI Cleanup
2022-05-04 17:53:31 +05:30
Jannat Patel
eb0f4728c4 fix: course page style 2022-05-04 17:40:48 +05:30
Jannat Patel
8017715bc7 fix: ui cleanup 2022-05-04 16:54:16 +05:30
Jannat Patel
503c74c488 fix: show currency and certificate price in all course cards 2022-04-29 15:05:29 +05:30
Jannat Patel
32cdaa8baa Merge pull request #329 from pateljannat/max-eval-attempt 2022-04-28 16:37:21 +05:30
Jannat Patel
83176a0293 fix: renamed reapplication field to duration 2022-04-28 16:30:51 +05:30
Jannat Patel
5db3d14b17 test: evaluation eligibility 2022-04-28 14:10:10 +05:30
Jannat Patel
bc6ae25aa6 Merge branch 'main' of https://github.com/frappe/lms into max-eval-attempt 2022-04-27 17:34:10 +05:30
Jannat Patel
8e3900fab7 Merge branch 'main' of https://github.com/frappe/lms 2022-04-27 17:21:39 +05:30
Jannat Patel
51b3d59094 fix: certificate price on course card web template 2022-04-27 17:21:36 +05:30
Jannat Patel
3585645580 feat: conditions for evaluation eligibility 2022-04-27 17:20:30 +05:30
Jannat Patel
1e3c20d118 Merge branch 'main' of https://github.com/frappe/lms into max-eval-attempt 2022-04-27 10:48:46 +05:30
Jannat Patel
f83f13af59 Merge pull request #328 from pateljannat/course-outline-start-learning-issue
fix: no preview modal for upcoming courses.
2022-04-26 15:44:00 +05:30
Jannat Patel
54d0bc56a4 fix: indentation 2022-04-26 15:30:52 +05:30
Jannat Patel
c722673dbd fix: dont show notify button from outline if already opted 2022-04-26 15:27:35 +05:30
Jannat Patel
88d34a9daf fix: no preview modal for upcoming courses. 2022-04-26 15:14:31 +05:30
Jannat Patel
e91237ec05 feat: check no of attempts 2022-04-26 13:17:09 +05:30
Jannat Patel
430a2bc08d feat: max attempts fields 2022-04-25 18:48:31 +05:30
Jannat Patel
3bbe5d33d3 Merge pull request #327 from pateljannat/image-in-lesson-webform
feat: image markdown extension
2022-04-25 11:42:58 +05:30
Jannat Patel
674c6a1684 fix: web form description and redirection 2022-04-25 10:42:07 +05:30
Jannat Patel
f34519e3ff fix: upload image component in lesson web form 2022-04-22 12:22:25 +05:30
Jannat Patel
f047be816a fix: validate url for job opportunity 2022-04-21 11:56:24 +05:30
Jannat Patel
593c20d62b fix: login without user category 2022-04-21 08:42:18 +05:30
Jannat Patel
a4bfad6138 fix: class name change for testimonial author 2022-04-20 17:54:37 +05:30
Jannat Patel
89de3c5f7a fix: class name change for testimonial author 2022-04-20 17:48:44 +05:30
Jannat Patel
81fb664ad9 feat: image markdown extension 2022-04-20 17:45:40 +05:30
Jannat Patel
b65597b884 fix: replaced html5lib with lxml for lesson markdown 2022-04-20 11:26:54 +05:30
Jannat Patel
d5423947f3 Merge pull request #325 from pateljannat/designation-to-category 2022-04-20 10:36:48 +05:30
Jannat Patel
f80db23642 fix: changed designation to user category 2022-04-20 10:22:35 +05:30
Jannat Patel
935906e328 Merge pull request #324 from pateljannat/designation-during-signup
feat: Designation during signup
2022-04-19 16:39:34 +05:30
Jannat Patel
3ed7f68054 fix: data attribute for certificate price 2022-04-19 16:18:48 +05:30
Jannat Patel
c894b75f4b feat: designation during signup 2022-04-19 15:53:25 +05:30
Jannat Patel
ef43d6905f fix: take country from doctype at signup 2022-04-14 09:03:18 +05:30
Jannat Patel
ab7ebedcd5 fix: check evaluator schedule for certificate request 2022-04-13 17:53:46 +05:30
Jannat Patel
8ca19afd87 Merge pull request #323 from pateljannat/start-learning-fixes 2022-04-11 16:08:32 +05:30
Jannat Patel
70e1e550e3 fix: certificate request flow and other minor changes 2022-04-11 15:35:40 +05:30
Jannat Patel
cb0087c433 fix: no preview modal start learning button 2022-04-07 23:03:53 +05:30
Jannat Patel
d867f86c08 fix: replaced save with insert for certificate doctype rename patch 2022-04-07 22:46:40 +05:30
Jannat Patel
1891029eed fix: ignore mandatory for certificate doctype rename patch 2022-04-07 22:38:49 +05:30
Jannat Patel
157090a122 fix: reload doc in certificate doctype rename patch 2022-04-07 22:33:06 +05:30
Jannat Patel
0ddf2aad79 fix: removed certification student to member rename patch 2022-04-07 22:27:26 +05:30
Jannat Patel
4f47a5032c fix: removed post_model_sync from patches.txt 2022-04-07 22:13:19 +05:30
Jannat Patel
ae957ab642 fix: average rating precision 2022-04-07 21:58:49 +05:30
Jannat Patel
b69a7022b5 Merge pull request #319 from pateljannat/certification 2022-04-07 14:58:27 +05:30
Jannat Patel
c19bd88a8e fix: added post_model_sync in patches.txt 2022-04-07 14:42:05 +05:30
Jannat Patel
4967b70e7c fix: validate same slot addition twice 2022-04-07 14:32:02 +05:30
Jannat Patel
cdfad8cc67 feat: cerificate price 2022-04-07 12:57:42 +05:30
Jannat Patel
dcaccaca35 fix: certificate design 2022-04-05 21:13:21 +05:30
Jannat Patel
d954262184 fix: redirect to list when course does not exist 2022-04-04 12:46:35 +05:30
Jannat Patel
208720545e Merge branch 'main' of https://github.com/frappe/lms into certification 2022-04-01 18:59:35 +05:30
Jannat Patel
2cbadc6946 Merge pull request #311 from pateljannat/discussion-component-redesign 2022-04-01 18:58:59 +05:30
Jannat Patel
ebfa49ed8e chore: renamed lms certification to lms certificate 2022-04-01 18:56:57 +05:30
Jannat Patel
e70c3ef939 feat: request for certification 2022-04-01 17:30:17 +05:30
Jannat Patel
0523f701c2 fix: profile page fixes 2022-03-31 18:03:11 +05:30
Jannat Patel
c6b46295bc fix: date field 2022-03-31 17:54:31 +05:30
Jannat Patel
16ddfb2a20 feat: certification request 2022-03-30 22:52:38 +05:30
Jannat Patel
ca5ea6032c feat: certificate evaluation 2022-03-29 16:49:50 +05:30
Jannat Patel
b4eda0e7cd Merge pull request #318 from pateljannat/workspace-issue 2022-03-28 17:52:42 +05:30
Jannat Patel
9d2a9bbd9c fix: workspace published field filter 2022-03-28 17:40:55 +05:30
Jannat Patel
ef13c8fe8d fix: update patch date 2022-03-25 18:53:35 +05:30
Jannat Patel
aa6932f547 fix: reload doctype in patch 2022-03-25 18:53:07 +05:30
Jannat Patel
5d3c132e83 Merge pull request #317 from pateljannat/field-name-uniformity 2022-03-25 16:13:25 +05:30
Jannat Patel
56f4f6c977 fix: patch for published field 2022-03-25 15:56:43 +05:30
Jannat Patel
77df068fea fix: field cleanup 2022-03-24 18:59:58 +05:30
Jannat Patel
b9a1bf9f24 fix: conflicts 2022-03-24 09:56:54 +05:30
Jannat Patel
2b348916f4 Merge pull request #316 from pateljannat/rename-to-lms 2022-03-23 19:20:36 +05:30
Jannat Patel
70bc5ea2ec fix: conflicts 2022-03-23 19:13:30 +05:30
Jannat Patel
eff9e553a1 fix: course home card ui 2022-03-23 19:10:02 +05:30
Jannat Patel
e1bfca1883 fix: breadcrumb from lesson page 2022-03-23 15:20:57 +05:30
Jannat Patel
190dbab3d0 fix: ui issues 2022-03-23 15:18:32 +05:30
Jannat Patel
a1895b1f78 fix: removed unused modules from modules.txt 2022-03-21 14:14:24 +05:30
Jannat Patel
1091774003 Merge branch 'main' of https://github.com/frappe/school into rename-to-lms 2022-03-21 12:58:06 +05:30
Jannat Patel
ae29eb35fd fix: removed unused modules 2022-03-21 12:57:16 +05:30
Jannat Patel
5ca0a89789 fix: reload doctypes in patch 2022-03-21 10:16:09 +05:30
Jannat Patel
6c6e836f0d fix: reload doctypes in recent patches 2022-03-21 09:47:18 +05:30
Jannat Patel
c971d34d67 refactor: renamed app to lms 2022-03-19 17:30:00 +05:30
Jannat Patel
1b04615bff Merge pull request #313 from pateljannat/course-creation-through-ui 2022-03-19 14:19:25 +05:30
Jannat Patel
40eb8dec68 fix: branch shift for semantic 2022-03-19 12:57:10 +05:30
Jannat Patel
2556e98c26 fix: version change for semantic pull request 2022-03-19 12:33:56 +05:30
Jannat Patel
2204da25ed fix: semantic pull request workflow 2022-03-19 12:22:13 +05:30
Jannat Patel
ab1eb6de6b Merge pull request #315 from pateljannat/semantic-pull-request 2022-03-19 11:32:51 +05:30
Jannat Patel
16278a72e9 chore: semantic pull request check 2022-03-19 11:20:37 +05:30
Jannat Patel
573a1f22dc fix: button positions on course home 2022-03-19 10:09:32 +05:30
Jannat Patel
da370a7dd2 fix: better msg on web form save 2022-03-19 09:31:39 +05:30
Jannat Patel
6567660639 Merge pull request #314 from pateljannat/ui-cleanup 2022-03-17 15:23:51 +05:30
Jannat Patel
984054f00f fix: icon position on course card 2022-03-17 15:17:21 +05:30
Jannat Patel
9351edebe0 fix: jobs, quiz and community page cleanup 2022-03-17 14:23:06 +05:30
Jannat Patel
36465f0859 fix: icon background and space cleanup 2022-03-17 11:25:34 +05:30
Jannat Patel
ef5cf4bd96 fix: course home, course cards and course outline cleanup 2022-03-16 18:53:09 +05:30
Jannat Patel
27e1aec001 fix: dashboard links, web form redirects and patch for status 2022-03-15 16:51:39 +05:30
Jannat Patel
aa9ef65375 dashboard and patch for lesson 2022-03-14 19:07:02 +05:30
Jannat Patel
c8af6d3672 feat: course creation from portal setting 2022-03-11 11:15:13 +05:30
Jannat Patel
ffe5370264 Merge branch 'main' of https://github.com/frappe/school 2022-03-10 08:42:17 +05:30
Jannat Patel
ef0156c068 fix: removed batch from list and filter of membership 2022-03-10 08:42:13 +05:30
Jannat Patel
00883170f3 Merge pull request #312 from pateljannat/cookie-policy 2022-03-10 08:41:35 +05:30
Jannat Patel
fb72704a33 feat: cookie policy 2022-03-09 14:32:50 +05:30
Jannat Patel
8f9cd72975 feat: course creation from ui 2022-03-09 12:29:03 +05:30
Jannat Patel
913e87c4f5 Merge branch 'main' of https://github.com/frappe/school into course-creation-through-ui 2022-03-07 18:28:54 +05:30
Jannat Patel
3bdf6df70d fix: allow locked lessons o instructors through outline 2022-03-07 18:28:12 +05:30
Jannat Patel
5e973b21ae feat: course web form 2022-03-07 18:21:11 +05:30
Jannat Patel
23e2611725 feat: discussions redesign 2022-03-07 12:52:09 +05:30
Jannat Patel
f8784afd72 Merge pull request #310 from pateljannat/minor-fixes 2022-02-24 14:24:41 +05:30
Jannat Patel
46a73c8ef1 fix: classname 2022-02-24 12:56:39 +05:30
Jannat Patel
bcd80b616d fix: empty states redesign and misc changes 2022-02-24 12:40:13 +05:30
Jannat Patel
b5d870d885 fix: indentation and headline field 2022-02-23 17:39:04 +05:30
Jannat Patel
f9ac77606e Merge pull request #309 from pateljannat/privacy-policy-during-signup 2022-02-23 17:12:12 +05:30
Jannat Patel
ce554ed53f feat: privacy policy and other misc changes 2022-02-23 16:52:29 +05:30
Jannat Patel
27d48f85a9 Merge pull request #308 from pateljannat/css-cleanup 2022-02-23 16:33:46 +05:30
Jannat Patel
059ff14e6d fix: added missing style 2022-02-23 14:31:14 +05:30
Jannat Patel
8cfb3569fe fix: css cleanup and testimonials redesign 2022-02-23 13:14:22 +05:30
Jannat Patel
1ac3e9b364 Merge pull request #307 from pateljannat/community-page-redesign 2022-02-23 12:16:41 +05:30
Jannat Patel
22c6a3da4f feat: community page redesign 2022-02-23 11:37:05 +05:30
Jannat Patel
737405d449 Merge pull request #306 from pateljannat/profile-redesign 2022-02-23 09:57:27 +05:30
Jannat Patel
e805ae7757 feat: profile page redesign 2022-02-23 09:36:50 +05:30
Jannat Patel
d5cf0fee64 Merge branch 'main' of https://github.com/frappe/school into profile-redesign 2022-02-22 11:34:22 +05:30
Jannat Patel
48e2ae6e52 Merge pull request #305 from pateljannat/lesson-page-fixes 2022-02-22 11:30:16 +05:30
Jannat Patel
351e784733 fix: conflicts 2022-02-22 11:18:57 +05:30
Jannat Patel
6c64181bf4 fix: overlay position when related courses 2022-02-22 11:15:02 +05:30
Jannat Patel
d64e6a12a7 Merge pull request #304 from pateljannat/quiz-redesign 2022-02-21 18:45:19 +05:30
Jannat Patel
ccddc9a404 fix: margin before explanation 2022-02-21 18:03:27 +05:30
Jannat Patel
aee35aa66d fix: ui after question check 2022-02-21 16:30:10 +05:30
Jannat Patel
0cf953b3eb fix: markup lib 2022-02-21 16:01:07 +05:30
Jannat Patel
eb073ebe87 fix: quiz card layout 2022-02-21 15:23:23 +05:30
Jannat Patel
c3fac64280 fix: translations and sidebar 2022-02-21 14:55:20 +05:30
Jannat Patel
28ef8e7db7 feat: quiz redesign 2022-02-21 11:43:05 +05:30
Jannat Patel
e3eda95b35 Merge pull request #303 from pateljannat/course-page-redesign 2022-02-18 12:52:05 +05:30
Jannat Patel
894a68823f fix: button width 2022-02-18 12:44:42 +05:30
Jannat Patel
dc3843087e feat: course page redesign 2022-02-18 12:26:08 +05:30
Jannat Patel
aaae9fe8bc Merge pull request #302 from pateljannat/reviews-empty-state 2022-02-17 17:24:23 +05:30
Jannat Patel
3dc9fc52a7 style: reviews empty state 2022-02-17 17:17:26 +05:30
Jannat Patel
2d373ba509 fix: avg rating condition 2022-02-17 16:53:40 +05:30
Jannat Patel
f200e79dc8 style: banner 2022-02-17 16:51:21 +05:30
Jannat Patel
ae9518a006 Merge pull request #301 from pateljannat/course-list-page 2022-02-17 15:04:48 +05:30
Jannat Patel
96c24e8e5f test: certificate with expiry 2022-02-17 14:56:33 +05:30
Jannat Patel
cc0c1cc320 fix: removed console statements 2022-02-17 14:40:33 +05:30
Jannat Patel
9834c83126 revert: print statement 2022-02-17 13:43:11 +05:30
Jannat Patel
4b8cb5a4e4 fix: test data 2022-02-17 13:37:29 +05:30
Jannat Patel
7e2f473e22 fix: import statement 2022-02-17 13:05:47 +05:30
Jannat Patel
ee9f858933 test: certificate creation 2022-02-17 12:46:35 +05:30
Jannat Patel
69f322d34c fix: certification flow 2022-02-17 11:38:27 +05:30
Jannat Patel
91099188f2 Merge pull request #300 from pateljannat/course-home-redesign 2022-02-17 10:12:56 +05:30
Jannat Patel
1e7209bafa style: banner 2022-02-16 20:41:20 +05:30
Jannat Patel
a23a356bf6 style: course home 2022-02-16 19:12:25 +05:30
Jannat Patel
5218e134a9 Merge pull request #299 from pateljannat/jobs-redesign 2022-02-14 16:22:58 +05:30
Jannat Patel
55a87999e4 fix: date format 2022-02-14 16:14:53 +05:30
Jannat Patel
6cd7861b2c style: job card redesign 2022-02-14 13:46:02 +05:30
Jannat Patel
6dfaeddc0a Merge pull request #298 from pateljannat/ip-issue-fix 2022-02-11 15:06:51 +05:30
Jannat Patel
4846549a90 fix: ip issue 2022-02-11 12:56:11 +05:30
Jannat Patel
942837b4d9 fix: instructor patch 2022-02-11 10:33:06 +05:30
Jannat Patel
259b4aabcc Merge pull request #297 from pateljannat/redesign-school 2022-02-11 10:05:52 +05:30
Jannat Patel
6200b6a4b0 fix: suffix message for course card instructor 2022-02-10 12:59:31 +05:30
Jannat Patel
6ee1413996 fix: import 2022-02-10 10:32:23 +05:30
Jannat Patel
08fff1700f fix: tests and moved course functions to lms utils 2022-02-10 10:22:01 +05:30
Jannat Patel
fd5b7976e7 fix: get_doc references 2022-02-10 09:53:08 +05:30
Jannat Patel
e17637d27b fix: conflicts 2022-02-08 16:34:24 +05:30
Jannat Patel
57c69a7d6c fix: removing get_doc dependencies for lms course 2022-02-08 16:13:38 +05:30
Jannat Patel
bf3a496ea3 feat: multiple instructors on course card and course home 2022-02-07 13:41:28 +05:30
Jannat Patel
3e46db9c11 feat: multiple instructors 2022-02-07 12:01:07 +05:30
Jannat Patel
50c624e305 Merge pull request #295 from anandology/context-in-page-extensions 2022-02-07 11:33:49 +05:30
Anand Chitipothu
6d4e64059a feat: pass context to page extensions
Pass the context to page extensions to allow them to make decisions
based on the context. For example, an extension to load the course
specific scripts. This is currently not possible because the course
details are not availale to the page extensions. Made this possible by
passing the context to page extensions.
2022-01-25 07:32:13 +05:30
Jannat Patel
ec879b12b3 Merge pull request #291 from pateljannat/jobs-improvement 2022-01-11 19:55:18 +05:30
Jannat Patel
5ace8f5570 fix: email content 2022-01-11 19:41:59 +05:30
Jannat Patel
2fe5a6b248 Merge branch 'main' of https://github.com/frappe/school into jobs-improvement 2022-01-11 19:30:53 +05:30
Jannat Patel
19f5251736 fix: login button before job application 2022-01-11 19:27:12 +05:30
Jannat Patel
a87e3d66a6 fix: hide apply and report button from guest users 2022-01-11 17:50:14 +05:30
Jannat Patel
62acdde68f fix: email 2022-01-11 16:33:20 +05:30
Jannat Patel
e214573cd1 fix: job reporting 2022-01-11 15:10:31 +05:30
Jannat Patel
8fff1cd817 fix: jobs ui 2022-01-10 21:39:26 +05:30
Jannat Patel
20eb0c4d64 Merge pull request #290 from pateljannat/community-and-job-redesign 2022-01-10 17:00:02 +05:30
Jannat Patel
ff05292bdb fix: community cards 2022-01-10 16:45:06 +05:30
Jannat Patel
326bc88f19 Merge pull request #288 from pateljannat/community-page-fix 2022-01-07 11:10:09 +05:30
Jannat Patel
f0a7612369 fix: exclude disabled users 2022-01-06 21:29:04 +05:30
Jannat Patel
515be5de33 Merge pull request #287 from pateljannat/members-page 2022-01-06 17:19:25 +05:30
Jannat Patel
e1e7354d85 feat: search in community page 2022-01-06 17:10:07 +05:30
Jannat Patel
2ec6a06204 Merge branch 'main' of https://github.com/frappe/school into members-page 2022-01-03 16:36:23 +05:30
Jannat Patel
9150def93e Merge pull request #285 from pateljannat/profile-fixes 2022-01-03 10:21:05 +05:30
Jannat Patel
730f1a6c47 fix: conditions to hide contacts section 2022-01-03 09:55:34 +05:30
Jannat Patel
7c12d094c5 fix: logo dimensions 2022-01-03 09:40:30 +05:30
Jannat Patel
8aceaf0595 Merge pull request #282 from pateljannat/job-posting 2021-12-30 14:54:08 +05:30
Jannat Patel
5a1bdc156d fix: email on job creation 2021-12-30 13:08:52 +05:30
Jannat Patel
aa81426189 fix: show jobs with Open status 2021-12-30 11:51:27 +05:30
Jannat Patel
7a5d39cc94 fix: new module called job 2021-12-30 10:08:15 +05:30
Jannat Patel
b1b8f202c9 feat: job posting 2021-12-28 22:26:52 +05:30
Jannat Patel
fcfda68d88 Merge pull request #281 from pateljannat/rating-field 2021-12-27 15:19:43 +05:30
Jannat Patel
e966e4c7ed fix: rating field issue 2021-12-27 13:26:50 +05:30
Jannat Patel
42455c72f9 fix: revert unnecesary change 2021-12-27 12:37:49 +05:30
Jannat Patel
ef5f49016e fix: structure of course home page 2021-12-27 12:37:17 +05:30
Jannat Patel
6417dfb4a1 Merge pull request #279 from pateljannat/upload-in-lessons 2021-12-24 16:24:42 +05:30
Jannat Patel
40985da9ca fix: updating existing assignment 2021-12-23 20:30:31 +05:30
Jannat Patel
e07c26c17d Merge pull request #280 from frappe/make-contact-display-configurable 2021-12-23 20:23:05 +05:30
Jannat Patel
9f2cba49ee feat: hide primary contact from profile 2021-12-23 19:58:42 +05:30
Jannat Patel
6e3de21f6e fix: file type support 2021-12-23 17:58:39 +05:30
Jannat Patel
a6bdbd7cf1 feat: lesson assignment 2021-12-22 22:13:33 +05:30
Jannat Patel
b822428d52 Merge pull request #277 from pateljannat/custom-signup 2021-12-21 16:13:15 +05:30
Jannat Patel
03a7df1c98 fix: mandatory terms of use 2021-12-21 16:02:30 +05:30
Jannat Patel
08b7290070 fix: display internship in profile 2021-12-21 15:54:47 +05:30
Jannat Patel
6188c698e3 fix: checkbox for terms of use 2021-12-21 15:41:32 +05:30
Jannat Patel
7d9b60c16a fix: conflicts 2021-12-21 11:34:43 +05:30
Jannat Patel
df3c5060e9 Merge pull request #278 from pateljannat/profile-restrictions 2021-12-21 11:22:01 +05:30
Jannat Patel
ff702c9d14 fix: restrict profile and mark as complete 2021-12-21 11:11:39 +05:30
Jannat Patel
ea06fe8cf8 feat: hooks for profile mandatory fields 2021-12-20 14:18:22 +05:30
Jannat Patel
f8b0d9b180 feat: hooks for profile mandatory fields 2021-12-20 14:18:10 +05:30
Jannat Patel
d3a3e7066d fix: removed unnecessary imports 2021-12-20 11:28:55 +05:30
Jannat Patel
45e3964285 fix: renamed signup hook and moved default form to a template 2021-12-20 11:06:51 +05:30
Jannat Patel
4edf4936c1 fix: pass path in hooks instead of function 2021-12-20 10:04:50 +05:30
Jannat Patel
067be4973d fix: string translation 2021-12-20 09:42:31 +05:30
Jannat Patel
6a3442d058 fix: user and country data 2021-12-17 19:42:57 +05:30
Jannat Patel
0b83307f7d fix: custom signup form 2021-12-17 11:24:28 +05:30
Jannat Patel
f36042f537 Merge pull request #272 from anandology/cohorts-v1 2021-12-17 10:45:56 +05:30
Jannat Patel
668a5d6334 fix: labels and order 2021-12-16 15:20:08 +05:30
Anand Chitipothu
eb59713b65 fix: delete invalid links from Cohort doctype 2021-12-16 11:45:29 +05:30
Jannat Patel
fbc6187062 fix: profile settings 2021-12-16 10:06:58 +05:30
Anand Chitipothu
274ecaa222 fix: typo in exercise_submission.py
Corrected the use of save instead of insert.
2021-12-15 22:27:57 +05:30
Anand Chitipothu
051196179d fix: failing test in doctype Exercise 2021-12-15 11:42:52 +05:30
Anand Chitipothu
cddfc4550d Merge branch 'main' into cohorts-v1 2021-12-15 11:25:30 +05:30
Anand Chitipothu
465bc3b24a feat: allow the same custom page to be avaiable both for cohort and subgroup 2021-12-14 22:09:51 +05:30
Jannat Patel
38087f0b02 Merge pull request #275 from pateljannat/enhanced-profile 2021-12-14 18:09:15 +05:30
Jannat Patel
3237a539f7 fix: removed print statement 2021-12-14 18:04:41 +05:30
Jannat Patel
828d5764d0 fix: made user fields non mandatory 2021-12-14 17:21:08 +05:30
Jannat Patel
15fc3742d2 fix: ci install app command 2021-12-14 16:56:24 +05:30
Jannat Patel
8489b1d943 fix: text editor for bio and profile redirect changes 2021-12-14 16:46:06 +05:30
Jannat Patel
682188540c feat: new profile fields 2021-12-14 16:28:15 +05:30
Anand Chitipothu
8f740d70e0 fix: broken link to the course on join page 2021-12-13 21:30:19 +05:30
Anand Chitipothu
bc80c2200d feat: add anchor to exercise to allow linking to an exercise 2021-12-13 11:16:56 +05:30
Jannat Patel
fd524f627e fix: profile web form 2021-12-09 19:07:04 +05:30
Anand Chitipothu
59b3b68bde fix: fixed the issue of duplicate join requests
Someone was spamming mon.school by generating thousands of join
requests. Added to fix to avoid creating duplicate requests.
2021-12-09 18:21:29 +05:30
Anand Chitipothu
943c8eabbf feat: added custom pages at subgroup level 2021-12-09 01:17:03 +05:30
Anand Chitipothu
b83918c2aa feat: added Exercise Latest Submission doctype
Issue #274
2021-12-08 23:07:53 +05:30
Jannat Patel
5b4db8fd54 feat: child tables for profile sections 2021-12-07 16:58:55 +05:30
Anand Chitipothu
c8d7ac48ea fix: CohortSubgroup.has_student
Fixed the wrong query.

Issue #271
2021-12-07 15:37:46 +05:30
Anand Chitipothu
3cd4e64957 feat: allow cohort admins to add mentors
Issue #271
2021-12-05 02:10:58 +05:30
Anand Chitipothu
2f994628c3 fix: show students/mentors on subgroup page alphabetically
Issue #271
2021-12-05 01:33:33 +05:30
Anand Chitipothu
f68fc02e57 style: improved the ux of approve/reject flow
Issue #271
2021-12-05 01:29:48 +05:30
Anand Chitipothu
0637b9c8f8 fix: allow admins to manage join requests
Issue #271
2021-12-05 01:29:24 +05:30
Anand Chitipothu
7001ddc96f feat: made all the cohort pages public
There is some info on the page that is only accessible to mentors and
admins and not shown to other users.
2021-12-05 01:04:46 +05:30
Anand Chitipothu
fe31a64175 style: updated the styles of subgroup links on cohort page 2021-12-05 00:22:27 +05:30
Anand Chitipothu
cd0cc2b501 feat: added support to get subgroups in sorted order
Issue #271
2021-12-05 00:13:05 +05:30
Anand Chitipothu
ebcb3c5466 fix: fixed the issue with rendering custom cohort page
Issue #271
2021-12-05 00:01:42 +05:30
Anand Chitipothu
a1d0f3948a feat: added support for custom web pages for cohorts
This allows adding custom web pages to each cohort by defining a web
template and attaching it to the cohort.

Issue #271
2021-12-04 23:47:29 +05:30
Anand Chitipothu
22f5508bea style: improved the display of users and mentors in a subgroup
Using MemberCard insted of Avatar macro.

Issue #271
2021-12-04 23:14:37 +05:30
Anand Chitipothu
63c4f708c3 feat: improved the subgroup page load time
Using `get_cached_doc` instead of `get_doc` for loading students and
mentors.

Issue #271
2021-12-04 23:03:58 +05:30
Anand Chitipothu
52fd891370 fix: show the recent join requests on the top
Issue #271
2021-12-04 22:52:56 +05:30
Anand Chitipothu
fb447a30e4 feat: added undo of rejected join requests
Also improved the dispaly of timestamp, showing the diff now.

Issue #271
2021-12-04 22:47:23 +05:30
Anand Chitipothu
e0c73e26ee fix: increased the page_length when querying for students of a subgroup. 2021-12-04 17:19:49 +05:30
Anand Chitipothu
d5da5bd8aa feat: allow all mentors to see the cohort status
Issue #271
2021-12-04 07:25:15 +05:30
Anand Chitipothu
d84302682e fix: permission issue on cohort page
Using get_all instead of get_list to disable permission check.

Issue #271
2021-12-03 16:03:14 +05:30
Anand Chitipothu
c963e93b52 feat: allow students who have already joined the course to join the cohort
Issue #271
2021-12-03 00:28:13 +05:30
Anand Chitipothu
c96e3ee2f9 feat: show counts on cohort listing and view pages
Issue #271
2021-12-02 10:36:17 +05:30
Jannat Patel
a78019ccbc fix: mark as complete label 2021-12-01 18:59:29 +05:30
Anand Chitipothu
e014c94446 fix: mentor counts on cohort page
The group by clause was missing in the query.

Issue #271
2021-12-01 12:19:03 +05:30
Anand Chitipothu
6c747ff8b4 feat: added get_url method to cohort doctypes
This is required to make it easier to include links in the email
notification to mentors.

Issue #271
2021-12-01 08:43:10 +05:30
Anand Chitipothu
ffd9e9d48e feat: Added support for approve/reject join requests to a cohort subgroup
Issue #271
2021-11-30 18:06:36 +05:30
Anand Chitipothu
3328359ba4 style: "manage the course" button
Issue #271
2021-11-30 18:06:27 +05:30
Jannat Patel
66f6c1fd46 Merge pull request #273 from pateljannat/testimonial-card-fix 2021-11-30 11:15:59 +05:30
Jannat Patel
aaa845a0f8 fix: testimonial cards height and shadows 2021-11-30 11:04:29 +05:30
Anand Chitipothu
f1157895db feat: added portal page to join a cohort
Issue #271
2021-11-30 08:29:24 +05:30
Anand Chitipothu
1277cfed64 feat: added cohort and subgroup pages
Issue #271
2021-11-30 07:46:48 +05:30
Anand Chitipothu
102fa9c0a8 feat: added a page to list cohorts of a course
- added a page /courses/<course>/manage that lists the active cohorts
- only accessible to mentors and staff
- also added a "manage the course" button on course page for mentors/staff

Issue #271
2021-11-29 17:33:45 +05:30
Anand Chitipothu
7cd57cadb2 feat: added doctypes for cohorts
Issue #271
2021-11-29 17:26:38 +05:30
Jannat Patel
2a56b7ade2 Merge pull request #270 from pateljannat/mark-as-complete 2021-11-29 16:29:21 +05:30
Jannat Patel
cf8be3ca21 style: discussons empty state and mark as complete message 2021-11-29 16:20:49 +05:30
Jannat Patel
715a1b5df5 fix: mark as complete behaviour 2021-11-29 16:02:59 +05:30
Jannat Patel
0a374a0e78 Merge pull request #269 from pateljannat/search-generic 2021-11-26 11:44:23 +05:30
Jannat Patel
36996a54a5 fix: search-settings 2021-11-26 11:34:10 +05:30
Jannat Patel
3f687e4c4a Merge pull request #265 from pateljannat/improve-notify-me-behaviour 2021-11-25 14:09:03 +05:30
Jannat Patel
315d373d2d fix: hide notify me button on callback 2021-11-25 13:06:12 +05:30
Jannat Patel
6ae346df44 fix: notify-me-ux 2021-11-23 22:28:07 +05:30
Jannat Patel
9582a27dc6 Merge pull request #264 from pateljannat/search-empty-state-improvements 2021-11-22 10:14:48 +05:30
Jannat Patel
6195d72c3c fix: indentation 2021-11-22 10:08:54 +05:30
Jannat Patel
3f0309c36a fix: search empty state improvements 2021-11-22 10:05:04 +05:30
Jannat Patel
08ea7401cc Merge pull request #263 from pateljannat/search-improvements 2021-11-19 19:44:55 +05:30
Jannat Patel
f3d7f09476 feat: search empty state 2021-11-19 19:12:19 +05:30
Jannat Patel
36150d5b09 fix: allow guests to search 2021-11-18 15:44:19 +05:30
Jannat Patel
e5deb2ddd7 Merge pull request #262 from pateljannat/testimonials 2021-11-18 15:25:33 +05:30
Jannat Patel
d60aa54903 fix: condition if testimonials are less than multiple of three 2021-11-18 15:12:41 +05:30
Jannat Patel
2627cee938 fix: increased margin above explore more link 2021-11-18 15:07:29 +05:30
Jannat Patel
e7f47a4485 fix: slider height 2021-11-18 10:09:11 +05:30
Jannat Patel
5bfe56c091 fix: slider 2021-11-17 20:34:10 +05:30
Jannat Patel
f08586ee12 feat: testimonials template 2021-11-16 19:32:05 +05:30
Jannat Patel
af17270c52 fix: back tracing result on search 2021-11-15 19:30:01 +05:30
Jannat Patel
06b4062003 Merge pull request #261 from pateljannat/search 2021-11-15 19:08:24 +05:30
Jannat Patel
6cba6972bc feat: search for courses 2021-11-15 19:00:23 +05:30
Jannat Patel
f7a23e629c fix: conflicts 2021-11-15 13:29:02 +05:30
Jannat Patel
e67b37be28 Merge pull request #260 from pateljannat/course-cards-cleanup 2021-11-12 19:35:52 +05:30
Jannat Patel
1fa7dfe41f fix: removed arrow interaction 2021-11-12 19:20:18 +05:30
Jannat Patel
e781071ebf Merge pull request #257 from pateljannat/empty-states 2021-11-12 18:48:12 +05:30
Jannat Patel
1697c5d5b5 feat: search bar on course list 2021-11-12 10:10:39 +05:30
Jannat Patel
091fefb601 fix: removed unused css variables 2021-11-11 09:48:11 +05:30
Jannat Patel
7939e6c619 style: course cards and templates 2021-11-10 17:08:46 +05:30
Jannat Patel
f8788dc32c fix: empty state logo and link style 2021-11-08 16:49:31 +05:30
Jannat Patel
4db51bff79 style: empty state for reviews 2021-11-04 22:03:26 +05:30
Jannat Patel
6f96da74c7 empty state for discussion 2021-11-02 18:27:52 +05:30
Jannat Patel
f1692763d3 Merge pull request #255 from pateljannat/fixes 2021-11-01 15:08:00 +05:30
968 changed files with 52270 additions and 19915 deletions

View File

@@ -9,7 +9,7 @@ root = true
end_of_line = lf
insert_final_newline = true
charset = utf-8
indent_style = space
indent_style = tab
trim_trailing_whitespace = true
# Python
@@ -26,4 +26,4 @@ indent_style = tab
# HTML, CSS, javascript, JSON and YAML
[*.{html,css,js,json,yml,yaml}]
indent_size = 2
indent_size = 4

37
.flake8 Normal file
View File

@@ -0,0 +1,37 @@
[flake8]
ignore =
E121,
E126,
E127,
E128,
E203,
E225,
E226,
E231,
E241,
E251,
E261,
E265,
E302,
E303,
E305,
E402,
E501,
E741,
W291,
W292,
W293,
W391,
W503,
W504,
F403,
B007,
B950,
W191,
E124, # closing bracket, irritating while writing QB code
E131, # continuation line unaligned for hanging indent
E123, # closing bracket does not match indentation of opening bracket's line
E101, # ensured by use of black
max-line-length = 200
exclude=.github/helper/semgrep_rules

74
.github/helper/flake8.conf vendored Normal file
View File

@@ -0,0 +1,74 @@
[flake8]
ignore =
B001,
B007,
B009,
B010,
B950,
E101,
E111,
E114,
E116,
E117,
E121,
E122,
E123,
E124,
E125,
E126,
E127,
E128,
E131,
E201,
E202,
E203,
E211,
E221,
E222,
E223,
E224,
E225,
E226,
E228,
E231,
E241,
E242,
E251,
E261,
E262,
E265,
E266,
E271,
E272,
E273,
E274,
E301,
E302,
E303,
E305,
E306,
E402,
E501,
E502,
E701,
E702,
E703,
E741,
F401,
F403,
F405,
W191,
W291,
W292,
W293,
W391,
W503,
W504,
E711,
E129,
F841,
E713,
E712,
max-line-length = 200

46
.github/helper/install.sh vendored Normal file
View File

@@ -0,0 +1,46 @@
#!/bin/bash
set -e
cd ~ || exit
echo "Setting Up Bench..."
pip install frappe-bench
bench -v init frappe-bench --skip-assets --python "$(which python)"
cd ./frappe-bench || exit
bench -v setup requirements
echo "Setting Up LMS App..."
bench get-app lms "${GITHUB_WORKSPACE}"
echo "Setting Up Sites & Database..."
mkdir ~/frappe-bench/sites/lms.test
cp "${GITHUB_WORKSPACE}/.github/helper/site_config.json" ~/frappe-bench/sites/lms.test/site_config.json
mariadb --host 127.0.0.1 --port 3306 -u root -p123 -e "SET GLOBAL character_set_server = 'utf8mb4'";
mariadb --host 127.0.0.1 --port 3306 -u root -p123 -e "SET GLOBAL collation_server = 'utf8mb4_unicode_ci'";
mariadb --host 127.0.0.1 --port 3306 -u root -p123 -e "CREATE DATABASE test_lms";
mariadb --host 127.0.0.1 --port 3306 -u root -p123 -e "CREATE USER 'test_lms'@'localhost' IDENTIFIED BY 'test_lms'";
mariadb --host 127.0.0.1 --port 3306 -u root -p123 -e "GRANT ALL PRIVILEGES ON \`test_lms\`.* TO 'test_lms'@'localhost'";
mariadb --host 127.0.0.1 --port 3306 -u root -p123 -e "FLUSH PRIVILEGES";
echo "Setting Up Procfile..."
sed -i 's/^watch:/# watch:/g' Procfile
sed -i 's/^schedule:/# schedule:/g' Procfile
echo "Starting Bench..."
bench start &> bench_start.log &
CI=Yes bench build &
build_pid=$!
bench --site lms.test reinstall --yes
bench --site lms.test install-app lms
wait $build_pid

14
.github/helper/install_dependencies.sh vendored Normal file
View File

@@ -0,0 +1,14 @@
#!/bin/bash
set -e
echo "Setting Up System Dependencies..."
sudo apt update
sudo apt remove mysql-server mysql-client
sudo apt install libcups2-dev redis-server mariadb-client-10.6
install_wkhtmltopdf() {
wget -q https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.focal_amd64.deb
sudo apt install ./wkhtmltox_0.12.6-1.focal_amd64.deb
}
install_wkhtmltopdf &

20
.github/helper/site_config.json vendored Normal file
View File

@@ -0,0 +1,20 @@
{
"db_host": "127.0.0.1",
"db_port": 3306,
"db_name": "test_lms",
"db_password": "test_lms",
"allow_tests": true,
"enable_ui_tests": true,
"db_type": "mariadb",
"auto_email_id": "test@example.com",
"mail_server": "smtp.example.com",
"mail_login": "test@example.com",
"mail_password": "test",
"admin_password": "admin",
"root_login": "root",
"root_password": "123",
"host_name": "http://lms.test:8000",
"monitor": 1,
"server_script_enabled": true,
"mute_emails": true
}

32
.github/try-on-f-cloud.svg vendored Normal file
View File

@@ -0,0 +1,32 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="4 2 193 52">
<g filter="url(#filter0_dd)">
<rect x="4" y="2" width="193" height="52" rx="6" fill="#2490EF"/>
<path d="M28 22.2891H32.8786V35.5H36.2088V22.2891H41.0874V19.5H28V22.2891Z" fill="white"/>
<path d="M41.6982 35.5H45.0129V28.7109C45.0129 27.2344 46.0866 26.2188 47.5494 26.2188C48.0085 26.2188 48.6388 26.2969 48.95 26.3984V23.4453C48.6543 23.375 48.2419 23.3281 47.9074 23.3281C46.5691 23.3281 45.472 24.1094 45.0362 25.5938H44.9117V23.5H41.6982V35.5Z" fill="white"/>
<path d="M52.8331 40C55.2996 40 56.6068 38.7344 57.2837 36.7969L61.9289 23.5156L58.4197 23.5L55.9221 32.3125H55.7976L53.3233 23.5H49.8374L54.1247 35.8437L53.9302 36.3516C53.4944 37.4766 52.6619 37.5312 51.4947 37.1719L50.7478 39.6562C51.2224 39.8594 51.9927 40 52.8331 40Z" fill="white"/>
<path d="M73.6142 35.7344C77.2401 35.7344 79.4966 33.2422 79.4966 29.5469C79.4966 25.8281 77.2401 23.3438 73.6142 23.3438C69.9883 23.3438 67.7319 25.8281 67.7319 29.5469C67.7319 33.2422 69.9883 35.7344 73.6142 35.7344ZM73.6298 33.1562C71.9569 33.1562 71.101 31.6171 71.101 29.5233C71.101 27.4296 71.9569 25.8827 73.6298 25.8827C75.2715 25.8827 76.1274 27.4296 76.1274 29.5233C76.1274 31.6171 75.2715 33.1562 73.6298 33.1562Z" fill="white"/>
<path d="M84.7253 28.5625C84.7331 27.0156 85.6512 26.1094 86.9895 26.1094C88.3201 26.1094 89.1215 26.9844 89.1137 28.4531V35.5H92.4284V27.8594C92.4284 25.0625 90.7945 23.3438 88.3046 23.3438C86.5306 23.3438 85.2466 24.2187 84.7097 25.6172H84.5697V23.5H81.4106V35.5H84.7253V28.5625Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M102.429 19.5H113.429V22.3141H102.429V19.5ZM102.429 35.5V26.6794H112.699V29.4982H105.94V35.5H102.429Z" fill="white"/>
<path d="M131.584 24.9625C131.09 21.5057 128.345 19.5 124.785 19.5C120.589 19.5 117.429 22.463 117.429 27.4924C117.429 32.5142 120.55 35.4848 124.785 35.4848C128.604 35.4848 131.137 33.0916 131.584 30.1211L128.651 30.1059C128.282 31.9293 126.745 32.9549 124.824 32.9549C122.22 32.9549 120.354 31.0632 120.354 27.4924C120.354 23.9824 122.204 22.0299 124.832 22.0299C126.784 22.0299 128.314 23.1011 128.651 24.9625H131.584Z" fill="white"/>
<path d="M136.409 19.7124H133.571V35.2718H136.409V19.7124Z" fill="white"/>
<path d="M144.031 35.5001C147.56 35.5001 149.803 33.0917 149.803 29.483C149.803 25.8667 147.56 23.4507 144.031 23.4507C140.502 23.4507 138.259 25.8667 138.259 29.483C138.259 33.0917 140.502 35.5001 144.031 35.5001ZM144.047 33.2969C142.094 33.2969 141.137 31.6103 141.137 29.4754C141.137 27.3406 142.094 25.6312 144.047 25.6312C145.968 25.6312 146.925 27.3406 146.925 29.4754C146.925 31.6103 145.968 33.2969 144.047 33.2969Z" fill="white"/>
<path d="M159.338 30.3641C159.338 32.1419 158.028 33.0232 156.773 33.0232C155.409 33.0232 154.499 32.0887 154.499 30.6072V23.6025H151.66V31.0327C151.66 33.8361 153.307 35.4239 155.675 35.4239C157.479 35.4239 158.749 34.5046 159.298 33.1979H159.424V35.272H162.176V23.6025H159.338V30.3641Z" fill="white"/>
<path d="M169.014 35.4769C171.084 35.4769 172.017 34.2841 172.464 33.4332H172.637V35.2718H175.429V19.7124H172.582V25.532H172.464C172.033 24.6887 171.147 23.4503 169.022 23.4503C166.238 23.4503 164.05 25.5624 164.05 29.4522C164.05 33.2965 166.175 35.4769 169.014 35.4769ZM169.806 33.2205C167.931 33.2205 166.943 31.6251 166.943 29.437C166.943 27.2642 167.916 25.7067 169.806 25.7067C171.633 25.7067 172.637 27.173 172.637 29.437C172.637 31.701 171.617 33.2205 169.806 33.2205Z" fill="white"/>
</g>
<defs>
<filter id="filter0_dd" x="0" y="0" width="201" height="60" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset/>
<feGaussianBlur stdDeviation="0.25"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="2"/>
<feGaussianBlur stdDeviation="2"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.13 0"/>
<feBlend mode="normal" in2="effect1_dropShadow" result="effect2_dropShadow"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect2_dropShadow" result="shape"/>
</filter>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@@ -1,4 +1,4 @@
name: Run tests
name: Server Tests
on:
push:
branches:
@@ -32,11 +32,11 @@ jobs:
- name: setup python
uses: actions/setup-python@v2
with:
python-version: '3.9'
python-version: '3.10'
- name: setup node
uses: actions/setup-node@v2
with:
node-version: '14'
node-version: '18'
check-latest: true
- name: setup cache for bench
uses: actions/cache@v2
@@ -57,15 +57,15 @@ jobs:
mkdir -p ~/bench-cache
(cd && tar czf ~/bench-cache/bench.tgz frappe-bench)
fi
- name: add school app to bench
- name: add lms app to bench
working-directory: /home/runner/frappe-bench
run: bench get-app school $GITHUB_WORKSPACE
run: bench get-app lms $GITHUB_WORKSPACE
- name: create bench site
working-directory: /home/runner/frappe-bench
run: bench new-site --mariadb-root-password root --admin-password admin frappe.local
- name: install school app
- name: install lms app
working-directory: /home/runner/frappe-bench
run: bench --verbose --site frappe.local install-app school
run: bench --site frappe.local install-app lms
- name: setup requirements
working-directory: /home/runner/frappe-bench
run: bench setup requirements --dev
@@ -77,5 +77,4 @@ jobs:
run: bench --site frappe.local build
- name: run tests
working-directory: /home/runner/frappe-bench
run: bench --site frappe.local run-tests --app school
run: bench --site frappe.local run-tests --app lms

33
.github/workflows/linters.yml vendored Normal file
View File

@@ -0,0 +1,33 @@
name: Linters
on:
pull_request:
workflow_dispatch:
push:
branches: [ main ]
jobs:
linters:
name: Semantic Commits
runs-on: ubuntu-latest
if: github.event_name == 'pull_request'
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install and Run Pre-commit
uses: pre-commit/action@v2.0.3
- name: Download Semgrep rules
run: git clone --depth 1 https://github.com/frappe/semgrep-rules.git frappe-semgrep-rules
- name: Download semgrep
run: pip install semgrep
- name: Run Semgrep rules
run: semgrep ci --config ./frappe-semgrep-rules/rules

19
.github/workflows/semantic.yml vendored Normal file
View File

@@ -0,0 +1,19 @@
name: Semantic Pull Request
on:
push:
branches: [ main ]
pull_request: {}
jobs:
# This workflow contains a single job called "build"
semantic:
name: Validate PR title
runs-on: ubuntu-latest
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v2
- uses: zeke/semantic-pull-requests@main

121
.github/workflows/ui-tests.yml vendored Normal file
View File

@@ -0,0 +1,121 @@
name: UI
on:
pull_request:
workflow_dispatch:
push:
branches: [ main ]
permissions:
# Do not change this as GITHUB_TOKEN is being used by roulette
contents: read
jobs:
test:
runs-on: ubuntu-latest
if: ${{ github.repository_owner == 'frappe' }}
timeout-minutes: 60
strategy:
fail-fast: false
name: UI Tests (Cypress)
services:
mariadb:
image: mariadb:10.6
env:
MARIADB_ROOT_PASSWORD: 123
ports:
- 3306:3306
options: --health-cmd="mysqladmin ping" --health-interval=5s --health-timeout=2s --health-retries=3
steps:
- name: Clone
uses: actions/checkout@v3
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Check for valid Python & Merge Conflicts
run: |
python -m compileall -q -f "${GITHUB_WORKSPACE}"
if grep -lr --exclude-dir=node_modules "^<<<<<<< " "${GITHUB_WORKSPACE}"
then echo "Found merge conflicts"
exit 1
fi
- uses: actions/setup-node@v3
with:
node-version: 18
check-latest: true
- name: Add to Hosts
run: |
echo "127.0.0.1 lms.test" | sudo tee -a /etc/hosts
- name: Cache pip
uses: actions/cache@v3
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/*requirements.txt', '**/pyproject.toml', '**/setup.py') }}
restore-keys: |
${{ runner.os }}-pip-
${{ runner.os }}-
- name: Get yarn cache directory path
id: yarn-cache-dir-path
run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
- uses: actions/cache@v3
id: yarn-cache
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-ui-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-ui-
- name: Cache cypress binary
uses: actions/cache@v3
with:
path: ~/.cache/Cypress
key: ${{ runner.os }}-cypress
- name: Install Dependencies
run: |
bash ${GITHUB_WORKSPACE}/.github/helper/install_dependencies.sh
bash ${GITHUB_WORKSPACE}/.github/helper/install.sh
env:
BEFORE: ${{ env.GITHUB_EVENT_PATH.before }}
AFTER: ${{ env.GITHUB_EVENT_PATH.after }}
TYPE: ui
DB: mariadb
- name: Site Setup
run: |
cd ~/frappe-bench/
bench --site lms.test execute frappe.utils.install.complete_setup_wizard
bench --site lms.test execute frappe.tests.ui_test_helpers.create_test_user
- name: cypress pre-requisites
run: |
cd ~/frappe-bench/apps/lms
yarn add cypress@^10 --no-lockfile
- name: UI Tests
run: cd ~/frappe-bench/ && bench --site lms.test run-ui-tests lms --headless
env:
CYPRESS_BASE_URL: http://lms.test:8000
CYPRESS_RECORD_KEY: 095366ec-7b9f-41bd-aeec-03bb76d627fe
- name: Stop server and wait for coverage file
run: |
ps -ef | grep "[f]rappe serve" | awk '{print $2}' | xargs kill -s SIGINT
sleep 5
- name: Show bench output
if: ${{ always() }}
run: cat ~/frappe-bench/bench_start.log || true

8
.gitignore vendored
View File

@@ -3,8 +3,12 @@
*.egg-info
*.swp
tags
school/docs/current
school/public/dist
lms/docs/current
lms/public/dist
__pycache__/
*.py[cod]
*$py.class
node_modules
package-lock.json
lms/public/frontend
lms/www/lms.html

57
.pre-commit-config.yaml Normal file
View File

@@ -0,0 +1,57 @@
exclude: 'node_modules|.git'
default_stages: [commit]
fail_fast: false
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.3.0
hooks:
- id: trailing-whitespace
files: "lms.*"
exclude: ".*json$|.*txt$|.*csv|.*md|.*svg"
- id: check-yaml
- id: check-merge-conflict
- id: check-ast
- id: check-json
- id: check-toml
- id: debug-statements
- repo: https://github.com/asottile/pyupgrade
rev: v2.34.0
hooks:
- id: pyupgrade
args: ['--py310-plus']
- repo: https://github.com/adityahase/black
rev: 9cb0a69f4d0030cdf687eddf314468b39ed54119
hooks:
- id: black
additional_dependencies: ['click==8.0.4']
- repo: https://github.com/pre-commit/mirrors-prettier
rev: v2.7.1
hooks:
- id: prettier
types_or: [javascript, vue]
# Ignore any files that might contain jinja / bundles
exclude: |
(?x)^(
lms/public/dist/.*|
.*node_modules.*|
.*boilerplate.*|
lms/www/website_script.js|
lms/templates/includes/.*|
lms/public/js/lib/.*
)$
- repo: https://github.com/PyCQA/flake8
rev: 5.0.4
hooks:
- id: flake8
additional_dependencies: ['flake8-bugbear',]
args: ['--config', '.github/helper/flake8.conf']
ci:
autoupdate_schedule: weekly
skip: []
submodules: false

View File

@@ -1,5 +1,5 @@
1. Go to the apps/school directory of your installation and execute git pull --unshallow to ensure that you have the full git repository. Also fork the frappe/school repository on GitHub.
1. Go to the apps/lms directory of your installation and execute git pull --unshallow to ensure that you have the full git repository. Also fork the frappe/lms repository on GitHub.
1. Check out a working branch in git (e.g. git checkout -b my-new-branch).
1. Make your proposed changes to the source
1. Run your local version (e.g. bench start in your bench installation). Make sure that your changes work the way you want them to.

View File

@@ -4,15 +4,15 @@ include *.json
include *.md
include *.py
include *.txt
recursive-include school *.css
recursive-include school *.csv
recursive-include school *.html
recursive-include school *.ico
recursive-include school *.js
recursive-include school *.json
recursive-include school *.md
recursive-include school *.png
recursive-include school *.py
recursive-include school *.svg
recursive-include school *.txt
recursive-exclude school *.pyc
recursive-include lms *.css
recursive-include lms *.csv
recursive-include lms *.html
recursive-include lms *.ico
recursive-include lms *.js
recursive-include lms *.json
recursive-include lms *.md
recursive-include lms *.png
recursive-include lms *.py
recursive-include lms *.svg
recursive-include lms *.txt
recursive-exclude lms *.pyc

110
README.md
View File

@@ -1,25 +1,109 @@
## School
<p align="center">
<a href="https://www.frappelms.com/">
<img src="https://frappe.io/files/lms.png" alt="Frappe LMS" width="50px" height="50px">
</a>
<p align="center">Easy to use, open source, learning management system.</p>
</p>
Create online courses without much hassle.
![Course Home](/school/public/images/course-home.png)
&nbsp;
<p align="center">
<a href="https://www.producthunt.com/posts/frappe-lms?utm_source=badge-top-post-topic-badge&utm_medium=badge&utm_souce=badge-frappe&#0045;lms" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/top-post-topic-badge.svg?post_id=396079&theme=dark&period=weekly&topic_id=204" alt="Frappe&#0032;LMS - Easy&#0032;to&#0032;use&#0044;&#0032;100&#0037;&#0032;open&#0032;source&#0032;learning&#0032;management&#0032;system | Product Hunt" style="width: 250px; height: 54px;" width="250" height="54" /></a>
</p>
<div align="center" style="max-height: 40px;">
<a href="https://frappecloud.com/lms/signup">
<img src=".github/try-on-f-cloud.svg" height="40">
</a>
</div>
&nbsp;
<p align="center">
<a href="https://dashboard.cypress.io/projects/vandxn/runs">
<img alt="cypress" src="https://img.shields.io/endpoint?url=https://dashboard.cypress.io/badge/simple/vandxn/main&style=flat&logo=cypress">
</a>
<a href="https://github.com/frappe/lms/blob/main/LICENSE">
<img alt="license" src="https://img.shields.io/badge/license-AGPLv3-blue">
</a>
</p>
<img width="1402" alt="Lesson" src="https://frappelms.com/files/banner.png">
<details>
<summary>Show more screenshots</summary>
<img width="1520" alt="ss1" src="https://user-images.githubusercontent.com/31363128/210056046-584bc8aa-d28c-4514-b031-73817012837d.png">
<img width="830" alt="ss2" src="https://user-images.githubusercontent.com/31363128/210056097-36849182-6db0-43a2-8c62-5333cd2aedf4.png">
<img width="941" alt="ss3" src="https://user-images.githubusercontent.com/31363128/210056134-01a7c429-1ef4-434e-9d43-128dda35d7e5.png">
</details>
Frappe LMS is an easy-to-use, open-source learning management system. You can use it to create and share online courses. The app has a clear UI that helps students focus only on what's important and assists in distraction-free learning.
You can create courses and lessons through simple forms. Lessons can be in the form of text, videos, quizzes or a combination of all these. You can keep your students engaged with quizzes to help revise and test the concepts learned. Course Instructors and Students can reach out to each other through the discussions section available for each lesson and get queries resolved.
## Features
- Create online courses. 📚
- Add detailed descriptions and preview videos to the course. 🎬
- Add videos, quizzes, and assignments to your lessons and make them interesting and interactive 📝
- Discussions section below each lesson where instructors and students can interact with each other. 💬
- Create batches to group your students based on courses and track their progress 🏛
- Statistics dashboard that provides all important numbers at a glimpse. 📈
- Job Board where users can post and look for jobs. 💼
- People directory with each person's profile page 👨‍👩‍👧‍👦
- Set cover image, profile photo, short bio, and other professional information. 🦹🏼‍♀️
- Simple layout that optimizes readability 🤓
- Delightful user experience in overall usage ✨
1. Simple Backend Forms.
1. The UI is clean and minimal.
1. Lessons can be in the form of texts, videos, quizzes or a combination of all of these.
## Tech Stack
## Development Setup
Frappe LMS is built on [Frappe Framework](https://frappeframework.com) which is a batteries-included python web framework.
These are some of the tools it's built on:
- [Python](https://www.python.org)
- [Redis](https://redis.io/)
- [MariaDB](https://mariadb.org/)
- [Socket.io](https://socket.io/)
1. [Through Docker](docker-installation.md)
1. [Direct install through bench](bench-installation.md)
## Local Setup
### Docker
You need Docker, docker-compose, and git setup on your machine. Refer to [Docker documentation](https://docs.docker.com/). After that, run the following commands:
```
git clone https://github.com/frappe/lms
cd apps/lms/docker
docker-compose up
```
Wait for some time until the setup script creates a site. After that, you can access `http://localhost:8000` in your browser and the app's login screen should show up.
### Frappe Bench
Currently, this app depends on the `develop` branch of [frappe](https://github.com/frappe/frappe).
1. Setup frappe-bench by following [this guide](https://frappeframework.com/docs/v14/user/en/installation)
1. In the frappe-bench directory, run `bench start` and keep it running. Open a new terminal session and cd into the `frappe-bench` directory.
1. Run the following commands:
```sh
bench new-site lms.test
bench get-app lms
bench --site lms.test install-app lms
bench --site lms.test add-to-hosts
1. Now, you can access the site at `http://lms.test:8000`
### Contributing
## Deployment
Frappe LMS is an app built on top of the Frappe Framework. So, you can follow any deployment guide for hosting a Frappe Framework-based site.
1. [Contribution Guidelines](Contribution.md)
### Managed Hosting
Frappe LMS can be deployed in a few clicks on [Frappe Cloud](https://frappecloud.com/marketplace/apps/lms).
### Self-hosting
If you want to self-host, you can follow official [Frappe Bench Installation](https://github.com/frappe/bench#installation) instructions.
## Bugs and Feature Requests
If you find any bugs or have a feature idea for the app, feel free to report them here on [GitHub Issues](https://github.com/frappe/lms/issues). Make sure you share enough information (app screenshots, browser console screenshots, stack traces, etc) for project maintainers.
## License
[GNU AFFERO GENERAL PUBLIC LICENSE](license.txt)
Distributed under [GNU AFFERO GENERAL PUBLIC LICENSE](license.txt)

5
SECURITY.md Normal file
View File

@@ -0,0 +1,5 @@
# Security Policy
The Frappe team and community take security issues seriously. To report a security issue, please go through the information mentioned [here](https://frappe.io/security).
We appreciate your efforts to responsibly disclose your findings. We'll endeavor to respond quickly and will keep you updated throughout the process.

View File

@@ -2,9 +2,9 @@ To setup the repository locally follow the steps mentioned below:
1. Install bench and setup a frappe-bench directory by following the [Installation Steps](https://frappeframework.com/docs/user/en/installation).
1. Start the server by running bench start.
1. In a separate terminal window, create a new site by running bench new-site school.test.
1. Fork the school app
1. In a separate terminal window, create a new site by running bench new-site lms.test.
1. Fork the LMS app
1. Run bench get-app <url-of-your-form>.
1. Run bench --site school.test install-app school.
1. Map your site to localhost with the command ```bench --site school.test add-to-hosts```
1. Now open the URL http://school.test:8000/ in your browser, you should see the app running.
1. Run bench --site lms.test install-app lms.
1. Map your site to localhost with the command ```bench --site lms.test add-to-hosts```
1. Now open the URL http://lms.test:8000/ in your browser, you should see the app running.

18
cypress.config.js Normal file
View File

@@ -0,0 +1,18 @@
const { defineConfig } = require("cypress");
module.exports = defineConfig({
projectId: "vandxn",
adminPassword: "admin",
testUser: "frappe@example.com",
defaultCommandTimeout: 20000,
pageLoadTimeout: 15000,
video: true,
videoUploadOnPasses: false,
retries: {
runMode: 2,
openMode: 0,
},
e2e: {
baseUrl: "http://pyp:8000",
},
});

View File

@@ -0,0 +1,133 @@
describe("Course Creation", () => {
it("creates a new course", () => {
cy.login();
cy.visit("/courses");
// Create a course
cy.get("a.btn").contains("Create a Course").click();
cy.wait(1000);
cy.url().should("include", "/courses/new-course/edit");
cy.get("#title").type("Test Course");
cy.get("#intro").type("Test Course Short Introduction");
cy.get("#description").type("Test Course Description");
cy.get("#video-link").type("-LPmw2Znl2c");
cy.get("#tags-input").type("Test");
cy.get("#published").check();
cy.wait(1000);
cy.button("Save").click();
// Add Chapter
cy.wait(1000);
cy.link("Course Outline").click();
cy.wait(1000);
cy.get(".edit-header .btn-add-chapter").click();
cy.wait(500);
cy.get("#chapter-title").type("Test Chapter");
cy.get("#chapter-description").type("Test Chapter Description");
cy.button("Save").click();
// Add Lesson
cy.wait(1000);
cy.link("Add Lesson").click();
cy.wait(1000);
cy.get("#lesson-title").type("Test Lesson");
// Content
cy.get(".collapse-section.collapsed:first").click();
cy.get("#lesson-content .ce-block")
.click()
.type(
"This is an extremely big paragraph that is meant to test the UI. This is a very long paragraph. It contains more than once sentence. Its meant to be this long as this is a UI test. Its unbearably long and I'm not sure why I'm typing this much. I'm just going to keep typing until I feel like its long enough. I think its long enough now. I'm going to stop typing now. {enter}"
);
cy.get("#lesson-content .ce-toolbar__plus").click();
cy.get('#lesson-content [data-item-name="youtube"]').click();
cy.get('input[data-fieldname="youtube"]').type("GoDtyItReto");
cy.button("Insert").click();
cy.wait(1000);
cy.button("Save").click();
// View Course
cy.wait(1000);
cy.visit("/courses");
cy.get(".course-card-title:first").contains("Test Course");
cy.get(".course-card:first").click();
cy.url().should("include", "/courses/test-course");
cy.get("#title").contains("Test Course");
cy.get(".preview-video").should(
"have.attr",
"src",
"https://www.youtube.com/embed/-LPmw2Znl2c"
);
cy.get("#intro").contains("Test Course Short Introduction");
// View Chapter
cy.get(".chapter-title-main:first").contains("Test Chapter");
cy.get(".chapter-description:first").contains(
"Test Chapter Description"
);
cy.get(".lesson-info:first").contains("Test Lesson");
cy.get(".lesson-info:first").click();
// View Lesson
cy.wait(1000);
cy.url().should("include", "learn/1.1");
cy.get("#title").contains("Test Lesson");
cy.get(".lesson-video iframe").should(
"have.attr",
"src",
"https://www.youtube.com/embed/GoDtyItReto"
);
cy.get(".lesson-content-card").contains(
"This is an extremely big paragraph that is meant to test the UI. This is a very long paragraph. It contains more than once sentence. Its meant to be this long as this is a UI test. Its unbearably long and I'm not sure why I'm typing this much. I'm just going to keep typing until I feel like its long enough. I think its long enough now. I'm going to stop typing now."
);
// Add Discussion
cy.get(".reply").click();
cy.wait(500);
cy.get(".discussion-modal").should("be.visible");
// Enter title
cy.get(".modal .topic-title")
.type("Discussion from tests")
.should("have.value", "Discussion from tests");
// Enter comment
cy.get(".modal .discussions-comment").type(
"This is a discussion from the cypress ui tests."
);
// Submit
cy.get(".modal .submit-discussion").click();
cy.wait(2000);
// Check if discussion is added to page and content is visible
cy.get(".sidebar-parent:first .discussion-topic-title").should(
"have.text",
"Discussion from tests"
);
cy.get(".sidebar-parent:first .discussion-topic-title").click();
cy.get(".discussion-on-page:visible").should("have.class", "show");
cy.get(
".discussion-on-page:visible .reply-card .reply-text .ql-editor p"
).should(
"have.text",
"This is a discussion from the cypress ui tests."
);
cy.get(".discussion-form:visible .discussions-comment").type(
"This is a discussion from the cypress ui tests. \n\nThis comment was entered through the commentbox on the page."
);
cy.get(".discussion-form:visible .submit-discussion").click();
cy.wait(3000);
cy.get(".discussion-on-page:visible").should("have.class", "show");
cy.get(".discussion-on-page:visible")
.children(".reply-card")
.eq(1)
.find(".reply-text")
.should(
"have.text",
"This is a discussion from the cypress ui tests. This comment was entered through the commentbox on the page.\n"
);
});
});

View File

@@ -0,0 +1,5 @@
{
"name": "Using fixtures to represent data",
"email": "hello@cypress.io",
"body": "Fixtures are a great way to mock data for responses to routes"
}

View File

@@ -0,0 +1,55 @@
// ***********************************************
// This example commands.js shows you how to
// create various custom commands and overwrite
// existing commands.
//
// For more comprehensive examples of custom
// commands please read more here:
// https://on.cypress.io/custom-commands
// ***********************************************
//
//
// -- This is a parent command --
// Cypress.Commands.add('login', (email, password) => { ... })
//
//
// -- This is a child command --
// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
//
//
// -- This is a dual command --
// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
//
//
// -- This will overwrite an existing command --
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
Cypress.Commands.add("login", (email, password) => {
if (!email) {
email = Cypress.config("testUser") || "Administrator";
}
if (!password) {
password = Cypress.config("adminPassword");
}
cy.request({
url: "/api/method/login",
method: "POST",
body: { usr: email, pwd: password },
});
});
Cypress.Commands.add("button", (text) => {
return cy.get(`button:contains("${text}")`);
});
Cypress.Commands.add("link", (text) => {
return cy.get(`a:contains("${text}")`);
});
Cypress.Commands.add("iconButton", (text) => {
return cy.get(`button[aria-label="${text}"]`);
});
Cypress.Commands.add("dialog", (selector) => {
return cy.get(`[role=dialog] ${selector}`);
});

20
cypress/support/e2e.js Normal file
View File

@@ -0,0 +1,20 @@
// ***********************************************************
// This example support/e2e.js is processed and
// loaded automatically before your test files.
//
// This is a great place to put global configuration and
// behavior that modifies Cypress.
//
// You can change the location of this file or turn off
// automatically serving support files with the
// 'supportFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/configuration
// ***********************************************************
// Import commands.js using ES2015 syntax:
import "./commands";
// Alternatively you can use CommonJS syntax:
// require('./commands')

View File

@@ -1,25 +0,0 @@
version: "3"
services:
mariadb:
image: mariadb
volumes:
- mariadb-storage:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=root
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
bench:
image: anandology/frappe-bench:2021.10
volumes:
- .:/opt/frappe-bench/apps/school
environment:
- FRAPPE_APPS=school
- FRAPPE_ALLOW_TESTS=true
- FRAPPE_SITE_NAME=frappe.localhost
depends_on:
- mariadb
ports:
- 8000:8000
- 9000:9000
volumes:
mariadb-storage: {}

View File

@@ -1,9 +1,11 @@
**Step 1:** Clone the repo
```
$ git clone https://github.com/frappe/school.git
$ git clone https://github.com/frappe/lms.git
$ cd school
$ cd lms
$ cd docker
```
**Step 2:** Run docker-compose

32
docker/docker-compose.yml Normal file
View File

@@ -0,0 +1,32 @@
version: "3.7"
name: lms
services:
mariadb:
image: mariadb:10.6
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --skip-character-set-client-handshake
- --skip-innodb-read-only-compressed # Temporary fix for MariaDB 10.6
environment:
MYSQL_ROOT_PASSWORD: 123
volumes:
- mariadb-data:/var/lib/mysql
redis:
image: redis:alpine
frappe:
image: frappe/bench:latest
command: bash /workspace/init.sh
environment:
- SHELL=/bin/bash
working_dir: /home/frappe
volumes:
- .:/workspace
ports:
- 8000:8000
- 9000:9000
volumes:
mariadb-data:

41
docker/init.sh Normal file
View File

@@ -0,0 +1,41 @@
#!bin/bash
if [ -d "/home/frappe/frappe-bench/apps/frappe" ]; then
echo "Bench already exists, skipping init"
cd frappe-bench
bench start
else
echo "Creating new bench..."
fi
export PATH="${NVM_DIR}/versions/node/v${NODE_VERSION_DEVELOP}/bin/:${PATH}"
bench init --skip-redis-config-generation frappe-bench
cd frappe-bench
# Use containers instead of localhost
bench set-mariadb-host mariadb
bench set-redis-cache-host redis:6379
bench set-redis-queue-host redis:6379
bench set-redis-socketio-host redis:6379
# Remove redis, watch from Procfile
sed -i '/redis/d' ./Procfile
sed -i '/watch/d' ./Procfile
bench get-app lms
bench new-site lms.localhost \
--force \
--mariadb-root-password 123 \
--admin-password admin \
--no-mariadb-socket
bench --site lms.localhost install-app lms
bench --site lms.localhost set-config developer_mode 1
bench --site lms.localhost clear-cache
bench --site lms.localhost set-config mute_emails 1
bench use lms.localhost
bench start

1
frappe-ui Submodule

Submodule frappe-ui added at c5faaae38e

5
frontend/.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
node_modules
.DS_Store
dist
dist-ssr
*.local

View File

@@ -0,0 +1,4 @@
{
"semi": false,
"singleQuote": true
}

42
frontend/README.md Normal file
View File

@@ -0,0 +1,42 @@
# Frappe UI Starter
This template should help get you started developing custom frontend for Frappe
apps with Vue 3 and the Frappe UI package.
This boilerplate sets up Vue 3, Vue Router, TailwindCSS, and Frappe UI out of
the box.
## Usage
This template is meant to be cloned inside an existing Frappe App. Assuming your
apps name is `todo`. Clone this template in the root folder of your app using `degit`.
```
cd apps/todo
npx degit netchampfaris/frappe-ui-starter frontend
cd frontend
yarn
yarn dev
```
In a development environment, you need to put the below key-value pair in your `site_config.json` file:
```
"ignore_csrf": 1
```
This will prevent `CSRFToken` errors while using the vite dev server. In production environment, the `csrf_token` is attached to the `window` object in `index.html` for you.
The Vite dev server will start on the port `8080`. This can be changed from `vite.config.js`.
The development server is configured to proxy your frappe app (usually running on port `8000`). If you have a site named `todo.test`, open `http://todo.test:8080` in your browser. If you see a button named "Click to send 'ping' request", congratulations!
If you notice the browser URL is `/frontend`, this is the base URL where your frontend app will run in production.
To change this, open `src/router.js` and change the base URL passed to `createWebHistory`.
## Resources
- [Vue 3](https://v3.vuejs.org/guide/introduction.html)
- [Vue Router](https://next.router.vuejs.org/guide/)
- [Frappe UI](https://github.com/frappe/frappe-ui)
- [TailwindCSS](https://tailwindcss.com/docs/utility-first)
- [Vite](https://vitejs.dev/guide/)

49
frontend/index.html Normal file
View File

@@ -0,0 +1,49 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Frappe Learning</title>
<meta name="title" content="{{ meta.title }}" />
<meta name="image" content="{{ meta.image }}" />
<meta name="description" content="{{ meta.description }}" />
<meta name="keywords" content="{{ meta.keywords }}" />
<meta property="og:title" content="{{ meta.title }}" />
<meta property="og:image" content="{{ meta.image }}" />
<meta property="og:description" content="{{ meta.description }}" />
<meta name="twitter:title" content="{{ meta.title }}" />
<meta name="twitter:image" content="{{ meta.image }}" />
<meta name="twitter:description" content="{{ meta.description }}" />
</head>
<body>
<div id="app">
<div id="seo-content">
<h1>{{ meta.title }}</h1>
<p>
{{ meta.description }}
</p>
<p>
The content here is just for seo purposes. The actual content will be loaded in a few seconds.
</p>
<p>
Seo checks if a page has more than 300 words. So, here are some more words to make it more than 300 words.
Page descriptions are the HTML meta tags that provide a brief summary of a web page.
Search engines use meta descriptions to help identify the page's topic - they don't use them to rank the page, but they do use them to determine whether or not to display the page in search results.
Meta descriptions are important because they're often the first thing people see when they're deciding which search result to click on.
They're also important because they can help improve your click-through rate (CTR) from search results.
A good meta description can entice people to click on your page instead of someone else's.
</p>
<a href="{{ meta.link }}">Know More</a>
</div>
</div>
<div id="modals"></div>
<div id="popovers"></div>
<script>
window.csrf_token = '{{ csrf_token }}'
document.getElementById('seo-content').style.display = 'none';
</script>
<script type="module" src="/src/main.js"></script>
</body>
</html>

38
frontend/package.json Normal file
View File

@@ -0,0 +1,38 @@
{
"name": "frappe-ui-frontend",
"private": true,
"version": "0.0.0",
"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"
},
"dependencies": {
"@editorjs/checklist": "^1.6.0",
"@editorjs/editorjs": "^2.29.0",
"@editorjs/embed": "^2.7.0",
"@editorjs/header": "^2.8.1",
"@editorjs/image": "^2.9.0",
"@editorjs/nested-list": "^1.4.2",
"@editorjs/paragraph": "^2.11.3",
"chart.js": "^4.4.1",
"dayjs": "^1.11.6",
"feather-icons": "^4.28.0",
"frappe-ui": "^0.1.50",
"lucide-vue-next": "^0.309.0",
"markdown-it": "^14.0.0",
"pinia": "^2.0.33",
"socket.io-client": "^4.7.2",
"tailwindcss": "^3.3.3",
"vue": "^3.2.25",
"vue-chartjs": "^5.3.0",
"vue-router": "^4.0.12"
},
"devDependencies": {
"@vitejs/plugin-vue": "^5.0.3",
"autoprefixer": "^10.4.2",
"postcss": "^8.4.5",
"vite": "^5.0.11"
}
}

View File

@@ -0,0 +1,6 @@
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}

BIN
frontend/public/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 440 B

25
frontend/src/App.vue Normal file
View File

@@ -0,0 +1,25 @@
<template>
<Layout>
<router-view />
</Layout>
<Dialogs />
<Toasts />
</template>
<script setup>
import { Toasts } from 'frappe-ui'
import { Dialogs } from '@/utils/dialogs'
import { computed, defineAsyncComponent } from 'vue'
import { useScreenSize } from './utils/composables'
import DesktopLayout from './components/DesktopLayout.vue'
import MobileLayout from './components/MobileLayout.vue'
const screenSize = useScreenSize()
const Layout = computed(() => {
if (screenSize.width < 640) {
return MobileLayout
} else {
return DesktopLayout
}
})
</script>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,152 @@
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 100;
font-display: swap;
src: url("Inter-Thin.woff2?v=3.12") format("woff2"),
url("Inter-Thin.woff?v=3.12") format("woff");
}
@font-face {
font-family: 'Inter';
font-style: italic;
font-weight: 100;
font-display: swap;
src: url("Inter-ThinItalic.woff2?v=3.12") format("woff2"),
url("Inter-ThinItalic.woff?v=3.12") format("woff");
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 200;
font-display: swap;
src: url("Inter-ExtraLight.woff2?v=3.12") format("woff2"),
url("Inter-ExtraLight.woff?v=3.12") format("woff");
}
@font-face {
font-family: 'Inter';
font-style: italic;
font-weight: 200;
font-display: swap;
src: url("Inter-ExtraLightItalic.woff2?v=3.12") format("woff2"),
url("Inter-ExtraLightItalic.woff?v=3.12") format("woff");
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 300;
font-display: swap;
src: url("Inter-Light.woff2?v=3.12") format("woff2"),
url("Inter-Light.woff?v=3.12") format("woff");
}
@font-face {
font-family: 'Inter';
font-style: italic;
font-weight: 300;
font-display: swap;
src: url("Inter-LightItalic.woff2?v=3.12") format("woff2"),
url("Inter-LightItalic.woff?v=3.12") format("woff");
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url("Inter-Regular.woff2?v=3.12") format("woff2"),
url("Inter-Regular.woff?v=3.12") format("woff");
}
@font-face {
font-family: 'Inter';
font-style: italic;
font-weight: 400;
font-display: swap;
src: url("Inter-Italic.woff2?v=3.12") format("woff2"),
url("Inter-Italic.woff?v=3.12") format("woff");
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 500;
font-display: swap;
src: url("Inter-Medium.woff2?v=3.12") format("woff2"),
url("Inter-Medium.woff?v=3.12") format("woff");
}
@font-face {
font-family: 'Inter';
font-style: italic;
font-weight: 500;
font-display: swap;
src: url("Inter-MediumItalic.woff2?v=3.12") format("woff2"),
url("Inter-MediumItalic.woff?v=3.12") format("woff");
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url("Inter-SemiBold.woff2?v=3.12") format("woff2"),
url("Inter-SemiBold.woff?v=3.12") format("woff");
}
@font-face {
font-family: 'Inter';
font-style: italic;
font-weight: 600;
font-display: swap;
src: url("Inter-SemiBoldItalic.woff2?v=3.12") format("woff2"),
url("Inter-SemiBoldItalic.woff?v=3.12") format("woff");
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url("Inter-Bold.woff2?v=3.12") format("woff2"),
url("Inter-Bold.woff?v=3.12") format("woff");
}
@font-face {
font-family: 'Inter';
font-style: italic;
font-weight: 700;
font-display: swap;
src: url("Inter-BoldItalic.woff2?v=3.12") format("woff2"),
url("Inter-BoldItalic.woff?v=3.12") format("woff");
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 800;
font-display: swap;
src: url("Inter-ExtraBold.woff2?v=3.12") format("woff2"),
url("Inter-ExtraBold.woff?v=3.12") format("woff");
}
@font-face {
font-family: 'Inter';
font-style: italic;
font-weight: 800;
font-display: swap;
src: url("Inter-ExtraBoldItalic.woff2?v=3.12") format("woff2"),
url("Inter-ExtraBoldItalic.woff?v=3.12") format("woff");
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 900;
font-display: swap;
src: url("Inter-Black.woff2?v=3.12") format("woff2"),
url("Inter-Black.woff?v=3.12") format("woff");
}
@font-face {
font-family: 'Inter';
font-style: italic;
font-weight: 900;
font-display: swap;
src: url("Inter-BlackItalic.woff2?v=3.12") format("woff2"),
url("Inter-BlackItalic.woff?v=3.12") format("woff");
}

View File

@@ -0,0 +1,62 @@
<template>
<div v-if="communications.data?.length">
<div v-for="comm in communications.data">
<div class="mb-8">
<div class="flex items-center justify-between mb-2">
<div class="flex items-center">
<Avatar :label="comm.sender_full_name" size="lg" />
<div class="ml-2">
{{ comm.sender_full_name }}
</div>
</div>
<div class="text-sm">
{{ timeAgo(comm.communication_date) }}
</div>
</div>
<div
class="prose prose-sm bg-gray-50 !min-w-full px-4 py-2 rounded-md"
v-html="comm.content"
></div>
</div>
</div>
</div>
<div v-else class="text-sm italic text-gray-600">
{{ __('No announcements') }}
</div>
</template>
<script setup>
import { createListResource, Avatar } from 'frappe-ui'
import { timeAgo } from '@/utils'
const props = defineProps({
batch: {
type: String,
required: true,
},
})
const communications = createListResource({
doctype: 'Communication',
fields: [
'subject',
'content',
'recipients',
'cc',
'communication_date',
'sender',
'sender_full_name',
],
filters: {
reference_doctype: 'LMS Batch',
reference_name: props.batch,
},
orderBy: 'communication_date desc',
auto: true,
cache: ['batch', props.batch],
})
</script>
<style>
.prose-sm p {
margin: 0 0 0.5rem;
}
</style>

View File

@@ -0,0 +1,55 @@
<template>
<div
class="flex h-full flex-col justify-between transition-all duration-300 ease-in-out bg-gray-50"
:class="isSidebarCollapsed ? 'w-14' : 'w-56'"
>
<div
class="flex flex-col overflow-hidden"
:class="isSidebarCollapsed ? 'items-center' : ''"
>
<UserDropdown class="p-2" :isCollapsed="isSidebarCollapsed" />
<div class="flex flex-col overflow-y-auto">
<SidebarLink
v-for="link in links"
:link="link"
:isCollapsed="isSidebarCollapsed"
class="mx-2 my-0.5"
/>
</div>
</div>
<SidebarLink
:link="{
label: isSidebarCollapsed ? 'Expand' : 'Collapse',
}"
:isCollapsed="isSidebarCollapsed"
@click="isSidebarCollapsed = !isSidebarCollapsed"
class="m-2"
>
<template #icon>
<span class="grid h-5 w-6 flex-shrink-0 place-items-center">
<CollapseSidebar
class="h-4.5 w-4.5 text-gray-700 duration-300 ease-in-out"
:class="{ '[transform:rotateY(180deg)]': isSidebarCollapsed }"
/>
</span>
</template>
</SidebarLink>
</div>
</template>
<script setup>
import UserDropdown from '@/components/UserDropdown.vue'
import CollapseSidebar from '@/components/Icons/CollapseSidebar.vue'
import SidebarLink from '@/components/SidebarLink.vue'
import { useStorage } from '@vueuse/core'
import { ref } from 'vue'
import { getSidebarLinks } from '../utils'
const links = getSidebarLinks()
const getSidebarFromStorage = () => {
return useStorage('sidebar_is_collapsed', false)
}
let isSidebarCollapsed = ref(getSidebarFromStorage())
</script>

View File

@@ -0,0 +1,98 @@
<template>
<div>
<div class="text-lg font-semibold mb-4">
{{ __('Assessments') }}
</div>
<div v-if="assessments.data?.length">
<ListView
:columns="getAssessmentColumns()"
:rows="assessments.data"
row-key="name"
:options="{
selectable: false,
showTooltip: false,
getRowRoute: (row) => {
if (row.submission) {
return {
name: 'AssignmentSubmission',
params: {
assignmentName: row.assessment_name,
submissionName: row.submission.name,
},
}
} else {
return {
name: 'AssignmentSubmission',
params: {
assignmentName: row.assessment_name,
submissionName: 'new',
},
}
}
},
}"
>
</ListView>
</div>
<div v-else class="text-sm italic text-gray-600">
{{ __('No Assessments') }}
</div>
</div>
</template>
<script setup>
import { ListView, createResource } from 'frappe-ui'
import { inject } from 'vue'
const user = inject('$user')
const props = defineProps({
batch: {
type: String,
required: true,
},
rows: {
type: Array,
},
columns: {
type: Array,
},
options: {
type: Object,
default: () => ({
selectable: true,
totalCount: 0,
rowCount: 0,
}),
},
})
const assessments = createResource({
url: 'lms.lms.utils.get_assessments',
params: {
batch: props.batch,
},
auto: true,
})
const getAssessmentColumns = () => {
let columns = [
{
label: 'Assessment',
key: 'title',
},
{
label: 'Type',
key: 'assessment_type',
},
]
if (!user.data?.is_moderator) {
columns.push({
label: 'Status/Score',
key: 'status',
align: 'center',
})
}
return columns
}
</script>

View File

@@ -0,0 +1,75 @@
<template>
<div
class="flex flex-col border border-gray-200 rounded-md p-4 h-full"
style="min-height: 150px"
>
<Badge
v-if="batch.seat_count && batch.seats_left > 0"
theme="green"
class="self-start mb-2"
>
{{ batch.seats_left }} {{ __('Seat Left') }}
</Badge>
<Badge
v-else-if="batch.seat_count && batch.seats_left <= 0"
theme="red"
class="self-start mb-2"
>
{{ __('Sold Out') }}
</Badge>
<div class="text-xl font-semibold mb-1">
{{ batch.title }}
</div>
<div class="short-introduction">
{{ batch.description }}
</div>
<div class="mt-auto">
<div v-if="batch.amount" class="font-semibold text-lg mb-4">
{{ batch.price }}
</div>
<div class="flex items-center mb-3">
<BookOpen class="h-4 w-4 stroke-1.5 mr-2 text-gray-700" />
<span> {{ batch.courses.length }} {{ __('Courses') }} </span>
</div>
<div class="flex items-center mb-3">
<Calendar class="h-4 w-4 stroke-1.5 mr-2 text-gray-700" />
<span>
{{ dayjs(batch.start_date).format('DD MMM YYYY') }} -
{{ dayjs(batch.end_date).format('DD MMM YYYY') }}
</span>
</div>
<div class="flex items-center">
<Clock class="h-4 w-4 stroke-1.5 mr-2 text-gray-700" />
<span>
{{ formatTime(batch.start_time) }} - {{ formatTime(batch.end_time) }}
</span>
</div>
</div>
</div>
</template>
<script setup>
import { Calendar, Clock, BookOpen } from 'lucide-vue-next'
import { inject } from 'vue'
import { Badge } from 'frappe-ui'
import { formatTime } from '../utils'
const dayjs = inject('$dayjs')
const props = defineProps({
batch: {
type: Object,
default: null,
},
})
</script>
<style>
.short-introduction {
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
text-overflow: ellipsis;
width: 100%;
overflow: hidden;
margin: 0.25rem 0 1.25rem;
line-height: 1.5;
}
</style>

View File

@@ -0,0 +1,141 @@
<template>
<div>
<div class="flex items-center justify-between mb-4">
<div class="text-xl font-semibold">
{{ __('Courses') }}
</div>
<Button
v-if="user.data?.is_moderator"
variant="solid"
@click="openCourseModal()"
>
<template #prefix>
<Plus class="h-4 w-4" />
</template>
{{ __('Add Course') }}
</Button>
</div>
<div v-if="courses.data?.length">
<ListView
:columns="getCoursesColumns()"
:rows="courses.data"
row-key="name"
:options="{ showTooltip: false }"
>
<ListHeader
class="mb-2 grid items-center space-x-4 rounded bg-gray-100 p-2"
>
<ListHeaderItem :item="item" v-for="item in getCoursesColumns()">
<template #prefix="{ item }">
<component
v-if="item.icon"
:is="item.icon"
class="h-4 w-4 stroke-1.5 ml-4"
/>
</template>
</ListHeaderItem>
</ListHeader>
<ListRows>
<ListRow :row="row" v-for="row in courses.data">
<template #default="{ column, item }">
<ListRowItem :item="row[column.key]" :align="column.align">
<div>
{{ row[column.key] }}
</div>
</ListRowItem>
</template>
</ListRow>
</ListRows>
<ListSelectBanner>
<template #actions="{ unselectAll, selections }">
<div class="flex gap-2">
<Button variant="ghost" @click="removeCourses(selections)">
<Trash2 class="h-4 w-4 stroke-1.5" />
</Button>
</div>
</template>
</ListSelectBanner>
</ListView>
</div>
<BatchCourseModal
v-model="showCourseModal"
:batch="batch"
v-model:courses="courses"
/>
</div>
</template>
<script setup>
import { ref, inject } from 'vue'
import BatchCourseModal from '@/components/Modals/BatchCourseModal.vue'
import {
createResource,
Button,
ListHeader,
ListHeaderItem,
ListSelectBanner,
ListRow,
ListRows,
ListView,
ListRowItem,
} from 'frappe-ui'
import { Plus, Trash2 } from 'lucide-vue-next'
const showCourseModal = ref(false)
const user = inject('$user')
const props = defineProps({
batch: {
type: String,
required: true,
},
})
const courses = createResource({
url: 'lms.lms.utils.get_batch_courses',
params: {
batch: props.batch,
},
cache: ['batchCourses', props.batchName],
auto: true,
})
const openCourseModal = () => {
showCourseModal.value = true
}
const getCoursesColumns = () => {
return [
{
label: 'Title',
key: 'title',
},
{
label: 'Lessons',
key: 'lesson_count',
},
{
label: 'Enrollments',
key: 'enrollment_count',
},
]
}
const removeCourse = createResource({
url: 'frappe.client.delete',
makeParams(values) {
return {
doctype: 'Batch Course',
name: values.course,
}
},
})
const removeCourses = (selections) => {
console.log(selections)
selections.forEach(async (course) => {
removeCourse.submit({ course })
await setTimeout(1000)
})
courses.reload()
}
</script>

View File

@@ -0,0 +1,26 @@
<template>
<div>
<UpcomingEvaluations
:batch="batch.data.name"
:endDate="batch.data.evaluation_end_date"
:courses="batch.data.courses"
:isStudent="isStudent"
/>
<Assessments :batch="batch.data.name" />
</div>
</template>
<script setup>
import UpcomingEvaluations from '@/components/UpcomingEvaluations.vue'
import Assessments from '@/components/Assessments.vue'
const props = defineProps({
batch: {
type: Object,
default: null,
},
isStudent: {
type: Boolean,
default: false,
},
})
</script>

View File

@@ -0,0 +1,115 @@
<template>
<div v-if="batch.data" class="shadow rounded-md p-5" style="width: 300px">
<Badge
v-if="batch.data.seat_count && seats_left > 0"
theme="green"
class="self-start mb-2 float-right"
>
{{ seats_left }} {{ __('Seat Left') }}
</Badge>
<Badge
v-else-if="batch.data.seat_count && seats_left <= 0"
theme="red"
class="self-start mb-2 float-right"
>
{{ __('Sold Out') }}
</Badge>
<div v-if="batch.data.amount" class="text-lg font-semibold mb-3">
{{ formatNumberIntoCurrency(batch.data.amount, batch.data.currency) }}
</div>
<div class="flex items-center mb-3">
<BookOpen class="h-4 w-4 stroke-1.5 mr-2 text-gray-700" />
<span> {{ batch.data.courses.length }} {{ __('Courses') }} </span>
</div>
<div class="flex items-center mb-3">
<Calendar class="h-4 w-4 stroke-1.5 mr-2 text-gray-700" />
<span>
{{ dayjs(batch.data.start_date).format('DD MMM YYYY') }} -
{{ dayjs(batch.data.end_date).format('DD MMM YYYY') }}
</span>
</div>
<div class="flex items-center">
<Clock class="h-4 w-4 stroke-1.5 mr-2 text-gray-700" />
<span>
{{ formatTime(batch.data.start_time) }} -
{{ formatTime(batch.data.end_time) }}
</span>
</div>
<router-link
v-if="user?.data?.is_moderator"
:to="{
name: 'Batch',
params: {
batchName: batch.data.name,
},
}"
>
<Button variant="solid" class="w-full mt-4">
<span>
{{ __('Manage Batch') }}
</span>
</Button>
</router-link>
<router-link
:to="{
name: 'Billing',
params: {
type: 'batch',
name: batch.data.name,
},
}"
v-else-if="batch.data.paid_batch"
>
<Button class="w-full mt-4" variant="solid">
<span>
{{ __('Register Now') }}
</span>
</Button>
</router-link>
<Button
variant="solid"
class="w-full mt-2"
v-else-if="batch.data.allow_self_enrollment"
>
{{ __('Enroll Now') }}
</Button>
<router-link
v-if="user?.data?.is_moderator"
:to="{
name: 'BatchCreation',
params: {
batchName: batch.data.name,
},
}"
>
<Button class="w-full mt-2">
<span>
{{ __('Edit') }}
</span>
</Button>
</router-link>
</div>
</template>
<script setup>
import { formatNumberIntoCurrency, formatTime } from '@/utils'
import { BookOpen, Calendar, Clock } from 'lucide-vue-next'
import { inject, computed } from 'vue'
import { Badge, Button } from 'frappe-ui'
const dayjs = inject('$dayjs')
const user = inject('$user')
const props = defineProps({
batch: {
type: Object,
default: null,
},
})
const seats_left = computed(() => {
if (props.batch.data?.seat_count) {
return props.batch.data?.seat_count - props.batch.data?.students?.length
}
return null
})
</script>

View File

@@ -0,0 +1,151 @@
<template>
<Button class="float-right mb-3" variant="solid" @click="openStudentModal()">
<template #prefix>
<Plus class="h-4 w-4" />
</template>
{{ __('Add Student') }}
</Button>
<div class="text-lg font-semibold mb-4">
{{ __('Students') }}
</div>
<div v-if="students.data?.length">
<ListView
:columns="getStudentColumns()"
:rows="students.data"
row-key="name"
:options="{ showTooltip: false }"
>
<ListHeader
class="mb-2 grid items-center space-x-4 rounded bg-gray-100 p-2"
>
<ListHeaderItem :item="item" v-for="item in getStudentColumns()">
<template #prefix="{ item }">
<component
v-if="item.icon"
:is="item.icon"
class="h-4 w-4 stroke-1.5 ml-4"
/>
</template>
</ListHeaderItem>
</ListHeader>
<ListRows>
<ListRow :row="row" v-for="row in students.data">
<template #default="{ column, item }">
<ListRowItem :item="row[column.key]" :align="column.align">
<template #prefix>
<div v-if="column.key == 'full_name'">
<Avatar
class="flex items-center"
:image="row['user_image']"
:label="item"
size="sm"
/>
</div>
</template>
<div>
{{ row[column.key] }}
</div>
</ListRowItem>
</template>
</ListRow>
</ListRows>
<ListSelectBanner>
<template #actions="{ unselectAll, selections }">
<div class="flex gap-2">
<Button variant="ghost" @click="removeStudents(selections)">
<Trash2 class="h-4 w-4 stroke-1.5" />
</Button>
</div>
</template>
</ListSelectBanner>
</ListView>
</div>
<div v-else class="text-sm italic text-gray-600">
{{ __('There are no students in this batch.') }}
</div>
<StudentModal
:batch="props.batch"
v-model="showStudentModal"
v-model:reloadStudents="students"
/>
</template>
<script setup>
import {
createResource,
ListHeader,
ListHeaderItem,
ListSelectBanner,
ListRow,
ListRows,
ListView,
ListRowItem,
Avatar,
Button,
} from 'frappe-ui'
import { Trash2, Plus } from 'lucide-vue-next'
import { ref } from 'vue'
import StudentModal from '@/components/Modals/StudentModal.vue'
const showStudentModal = ref(false)
const props = defineProps({
batch: {
type: String,
default: null,
},
})
const students = createResource({
url: 'lms.lms.utils.get_batch_students',
cache: ['students', props.batch],
params: {
batch: props.batch,
},
auto: true,
})
const getStudentColumns = () => {
return [
{
label: 'Full Name',
key: 'full_name',
},
{
label: 'Courses Done',
key: 'courses_completed',
align: 'center',
},
{
label: 'Assessments Done',
key: 'assessments_completed',
align: 'center',
},
{
label: 'Last Active',
key: 'last_active',
},
]
}
const openStudentModal = () => {
showStudentModal.value = true
}
const removeStudent = createResource({
url: 'frappe.client.delete',
makeParams(values) {
return {
doctype: 'Batch Student',
name: values.student,
}
},
})
const removeStudents = (selections) => {
selections.forEach(async (student) => {
removeStudent.submit({ student })
await setTimeout(1000)
})
students.reload()
}
</script>

View File

@@ -0,0 +1,277 @@
<template>
<Combobox v-model="selectedValue" nullable v-slot="{ open: isComboboxOpen }">
<Popover class="w-full" v-model:show="showOptions">
<template #target="{ open: openPopover, togglePopover }">
<slot name="target" v-bind="{ open: openPopover, togglePopover }">
<div class="w-full">
<button
class="flex w-full items-center justify-between focus:outline-none"
:class="inputClasses"
@click="() => togglePopover()"
>
<div class="flex items-center">
<slot name="prefix" />
<span
class="overflow-hidden text-ellipsis whitespace-nowrap text-base leading-5"
v-if="selectedValue"
>
{{ displayValue(selectedValue) }}
</span>
<span class="text-base leading-5 text-gray-500" v-else>
{{ placeholder || '' }}
</span>
</div>
<ChevronDown class="h-4 w-4 stroke-1.5" />
</button>
</div>
</slot>
</template>
<template #body="{ isOpen }">
<div v-show="isOpen">
<div class="mt-1 rounded-lg bg-white py-1 text-base shadow-2xl">
<div class="relative px-1.5 pt-0.5">
<ComboboxInput
ref="search"
class="form-input w-full"
type="text"
@change="
(e) => {
query = e.target.value
}
"
:value="query"
autocomplete="off"
placeholder="Search"
/>
<button
class="absolute right-1.5 inline-flex h-7 w-7 items-center justify-center"
@click="selectedValue = null"
>
<X class="h-4 w-4 stroke-1.5" />
</button>
</div>
<ComboboxOptions
class="my-1 max-h-[12rem] overflow-y-auto px-1.5"
static
>
<div
class="mt-1.5"
v-for="group in groups"
:key="group.key"
v-show="group.items.length > 0"
>
<div
v-if="group.group && !group.hideLabel"
class="px-2.5 py-1.5 text-sm font-medium text-gray-500"
>
{{ group.group }}
</div>
<ComboboxOption
as="template"
v-for="option in group.items"
:key="option.value"
:value="option"
v-slot="{ active, selected }"
>
<li
:class="[
'flex items-center rounded px-2.5 py-1.5 text-base',
{ 'bg-gray-100': active },
]"
>
<slot
name="item-prefix"
v-bind="{ active, selected, option }"
/>
<slot
name="item-label"
v-bind="{ active, selected, option }"
>
{{ option.label }}
</slot>
</li>
</ComboboxOption>
</div>
<li
v-if="groups.length == 0"
class="mt-1.5 rounded-md px-2.5 py-1.5 text-base text-gray-600"
>
No results found
</li>
</ComboboxOptions>
<div v-if="slots.footer" class="border-t p-1.5 pb-0.5">
<slot
name="footer"
v-bind="{ value: search?.el._value, close }"
></slot>
</div>
</div>
</div>
</template>
</Popover>
</Combobox>
</template>
<script setup>
import {
Combobox,
ComboboxInput,
ComboboxOptions,
ComboboxOption,
} from '@headlessui/vue'
import { Popover, Button } from 'frappe-ui'
import { ChevronDown, X } from 'lucide-vue-next'
import { ref, computed, useAttrs, useSlots, watch, nextTick } from 'vue'
const props = defineProps({
modelValue: {
type: String,
default: '',
},
options: {
type: Array,
default: () => [],
},
size: {
type: String,
default: 'md',
},
variant: {
type: String,
default: 'subtle',
},
placeholder: {
type: String,
default: '',
},
disabled: {
type: Boolean,
default: false,
},
filterable: {
type: Boolean,
default: true,
},
})
const emit = defineEmits(['update:modelValue', 'update:query', 'change'])
const query = ref('')
const showOptions = ref(false)
const search = ref(null)
const attrs = useAttrs()
const slots = useSlots()
const valuePropPassed = computed(() => 'value' in attrs)
const selectedValue = computed({
get() {
return valuePropPassed.value ? attrs.value : props.modelValue
},
set(val) {
query.value = ''
if (val) {
showOptions.value = false
}
emit(valuePropPassed.value ? 'change' : 'update:modelValue', val)
},
})
function close() {
showOptions.value = false
}
const groups = computed(() => {
if (!props.options || props.options.length == 0) return []
let groups = props.options[0]?.group
? props.options
: [{ group: '', items: props.options }]
return groups
.map((group, i) => {
return {
key: i,
group: group.group,
hideLabel: group.hideLabel || false,
items: props.filterable ? filterOptions(group.items) : group.items,
}
})
.filter((group) => group.items.length > 0)
})
function filterOptions(options) {
if (!query.value) {
return options
}
return options.filter((option) => {
let searchTexts = [option.label, option.value]
return searchTexts.some((text) =>
(text || '').toString().toLowerCase().includes(query.value.toLowerCase())
)
})
}
function displayValue(option) {
if (typeof option === 'string') {
let allOptions = groups.value.flatMap((group) => group.items)
let selectedOption = allOptions.find((o) => o.value === option)
return selectedOption?.label || option
}
return option?.label
}
watch(query, (q) => {
emit('update:query', q)
})
watch(showOptions, (val) => {
if (val) {
nextTick(() => {
search.value.el.focus()
})
}
})
const textColor = computed(() => {
return props.disabled ? 'text-gray-600' : 'text-gray-800'
})
const inputClasses = computed(() => {
let sizeClasses = {
sm: 'text-base rounded h-7',
md: 'text-base rounded h-8',
lg: 'text-lg rounded-md h-10',
xl: 'text-xl rounded-md h-10',
}[props.size]
let paddingClasses = {
sm: 'py-1.5 px-2',
md: 'py-1.5 px-2.5',
lg: 'py-1.5 px-3',
xl: 'py-1.5 px-3',
}[props.size]
let variant = props.disabled ? 'disabled' : props.variant
let variantClasses = {
subtle:
'border border-gray-100 bg-gray-100 placeholder-gray-500 hover:border-gray-200 hover:bg-gray-200 focus:bg-white focus:border-gray-500 focus:shadow-sm focus:ring-0 focus-visible:ring-2 focus-visible:ring-gray-400',
outline:
'border border-gray-300 bg-white placeholder-gray-500 hover:border-gray-400 hover:shadow-sm focus:bg-white focus:border-gray-500 focus:shadow-sm focus:ring-0 focus-visible:ring-2 focus-visible:ring-gray-400',
disabled: [
'border bg-gray-50 placeholder-gray-400',
props.variant === 'outline' ? 'border-gray-300' : 'border-transparent',
],
}[variant]
return [
sizeClasses,
paddingClasses,
variantClasses,
textColor.value,
'transition-colors w-full',
]
})
defineExpose({ query })
</script>

View File

@@ -0,0 +1,146 @@
<template>
<div class="space-y-1.5">
<label class="block" :class="labelClasses" v-if="attrs.label">
{{ attrs.label }}
</label>
<Autocomplete
ref="autocomplete"
:options="options.data"
v-model="value"
:size="attrs.size || 'sm'"
:variant="attrs.variant"
:placeholder="attrs.placeholder"
:filterable="false"
>
<template #target="{ open, togglePopover }">
<slot name="target" v-bind="{ open, togglePopover }" />
</template>
<template #prefix>
<slot name="prefix" />
</template>
<template #item-prefix="{ active, selected, option }">
<slot name="item-prefix" v-bind="{ active, selected, option }" />
</template>
<template #item-label="{ active, selected, option }">
<slot name="item-label" v-bind="{ active, selected, option }" />
</template>
<template v-if="attrs.onCreate" #footer="{ value, close }">
<div>
<Button
variant="ghost"
class="w-full !justify-start"
label="Create New"
@click="attrs.onCreate(value, close)"
>
<template #prefix>
<Plus class="h-4 w-4 stroke-1.5" />
</template>
</Button>
</div>
</template>
</Autocomplete>
</div>
</template>
<script setup>
import Autocomplete from '@/components/Controls/Autocomplete.vue'
import { watchDebounced } from '@vueuse/core'
import { createResource, Button } from 'frappe-ui'
import { Plus } from 'lucide-vue-next'
import { useAttrs, computed, ref } from 'vue'
const props = defineProps({
doctype: {
type: String,
required: true,
},
filters: {
type: Object,
default: () => ({}),
},
modelValue: {
type: String,
default: '',
},
})
const emit = defineEmits(['update:modelValue', 'change'])
const attrs = useAttrs()
const valuePropPassed = computed(() => 'value' in attrs)
const value = computed({
get: () => (valuePropPassed.value ? attrs.value : props.modelValue),
set: (val) => {
return (
val?.value &&
emit(valuePropPassed.value ? 'change' : 'update:modelValue', val?.value)
)
},
})
const autocomplete = ref(null)
const text = ref('')
watchDebounced(
() => autocomplete.value?.query,
(val) => {
val = val || ''
if (text.value === val) return
text.value = val
reload(val)
},
{ debounce: 300, immediate: true }
)
watchDebounced(
() => props.doctype,
() => reload(''),
{ debounce: 300, immediate: true }
)
const options = createResource({
url: 'frappe.desk.search.search_link',
cache: [props.doctype, text.value],
method: 'POST',
params: {
txt: text.value,
doctype: props.doctype,
filters: props.filters,
},
transform: (data) => {
return data.map((option) => {
return {
label: option.value,
value: option.value,
}
})
},
})
function reload(val) {
options.update({
params: {
txt: val,
doctype: props.doctype,
filters: props.filters,
},
})
options.reload()
}
const labelClasses = computed(() => {
return [
{
sm: 'text-xs',
md: 'text-base',
}[attrs.size || 'sm'],
'text-gray-600',
]
})
</script>

View File

@@ -0,0 +1,38 @@
<template>
<div class="flex text-center">
<div v-for="index in 5">
<Star
:class="index <= rating ? 'fill-orange-500' : ''"
class="h-6 w-6 fill-gray-400 text-gray-50 mr-1 cursor-pointer"
@click="markRating(index)"
/>
</div>
</div>
</template>
<script setup>
import { Star } from 'lucide-vue-next'
import { ref } from 'vue'
const props = defineProps({
id: {
type: String,
default: '',
},
modelValue: {
type: Number,
default: 0,
},
})
const emit = defineEmits(['update:modelValue'])
let rating = ref(props.modelValue)
let emitChange = (value) => {
emit('update:modelValue', value)
}
function markRating(index) {
emitChange(index)
rating.value = index
}
</script>

View File

@@ -0,0 +1,187 @@
<template>
<div
v-if="course.title"
class="flex flex-col h-full rounded-md shadow-md text-base overflow-auto"
style="min-height: 320px"
>
<div
class="course-image"
:class="{ 'default-image': !course.image }"
:style="{ backgroundImage: 'url(' + encodeURI(course.image) + ')' }"
>
<div class="flex relative top-4 left-4 w-fit flex-wrap">
<Badge theme="gray" size="md" class="mr-2" v-for="tag in course.tags">
{{ tag }}
</Badge>
</div>
<div v-if="!course.image" class="image-placeholder">
{{ course.title[0] }}
</div>
</div>
<div class="flex flex-col flex-auto p-4">
<div class="flex items-center justify-between mb-2">
<div v-if="course.lesson_count">
<Tooltip :text="__('Lessons')">
<span class="flex items-center">
<BookOpen class="h-4 w-4 stroke-1.5 text-gray-700 mr-1" />
{{ course.lesson_count }}
</span>
</Tooltip>
</div>
<div v-if="course.enrollment_count">
<Tooltip :text="__('Enrolled Students')">
<span class="flex items-center">
<Users class="h-4 w-4 stroke-1.5 text-gray-700 mr-1" />
{{ course.enrollment_count }}
</span>
</Tooltip>
</div>
<div v-if="course.avg_rating">
<Tooltip :text="__('Average Rating')">
<span class="flex items-center">
<Star class="h-4 w-4 stroke-1.5 text-gray-700 mr-1" />
{{ course.avg_rating }}
</span>
</Tooltip>
</div>
<div v-if="course.status != 'Approved'">
<Badge
variant="solid"
:theme="course.status === 'Under Review' ? 'orange' : 'blue'"
size="sm"
>
{{ course.status }}
</Badge>
</div>
</div>
<div class="text-xl font-semibold leading-6">
{{ course.title }}
</div>
<div class="short-introduction">
{{ course.short_introduction }}
</div>
<div
v-if="user && course.membership"
class="w-full bg-gray-200 rounded-full h-1 mb-2"
>
<div
class="bg-gray-900 h-1 rounded-full"
:style="{ width: Math.ceil(course.membership.progress) + '%' }"
></div>
</div>
<div v-if="user && course.membership" class="text-sm mb-4">
{{ Math.ceil(course.membership.progress) }}% completed
</div>
<div class="flex items-center justify-between mt-auto">
<div class="flex avatar-group overlap">
<div
class="mr-1"
:class="{ 'avatar-group overlap': course.instructors.length > 1 }"
>
<UserAvatar
v-for="instructor in course.instructors"
:user="instructor"
/>
</div>
<span v-if="course.instructors.length == 1">
{{ course.instructors[0].full_name }}
</span>
<span v-if="course.instructors.length == 2">
{{ course.instructors[0].first_name }} and
{{ course.instructors[1].first_name }}
</span>
<span v-if="course.instructors.length > 2">
{{ course.instructors[0].first_name }} and
{{ course.instructors.length - 1 }} others
</span>
</div>
<div class="font-semibold">
{{ course.price }}
</div>
</div>
</div>
</div>
</template>
<script setup>
import { BookOpen, Users, Star } from 'lucide-vue-next'
import UserAvatar from '@/components/UserAvatar.vue'
import { sessionStore } from '@/stores/session'
import { Badge, Tooltip } from 'frappe-ui'
const { user } = sessionStore()
const props = defineProps({
course: {
type: Object,
default: null,
},
})
</script>
<style>
.course-image {
height: 168px;
width: 100%;
background-size: cover;
background-position: center;
background-repeat: no-repeat;
}
.course-card-pills {
background: #ffffff;
margin-left: 0;
margin-right: 0.5rem;
padding: 3.5px 8px;
font-size: 11px;
text-align: center;
letter-spacing: 0.011em;
text-transform: uppercase;
font-weight: 600;
width: fit-content;
}
.default-image {
display: flex;
flex-direction: column;
align-items: center;
background-color: theme('colors.orange.100');
color: theme('colors.orange.600');
}
.avatar-group {
display: inline-flex;
align-items: center;
}
.avatar-group .avatar {
transition: margin 0.1s ease-in-out;
}
.image-placeholder {
display: flex;
align-items: center;
flex: 1;
font-size: 5rem;
color: theme('colors.gray.700');
font-weight: 600;
}
.avatar-group.overlap .avatar + .avatar {
margin-left: calc(-8px);
}
.short-introduction {
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
text-overflow: ellipsis;
width: 100%;
overflow: hidden;
margin: 0.25rem 0 1.25rem;
line-height: 1.5;
}
</style>

View File

@@ -0,0 +1,164 @@
<template>
<div class="shadow rounded-md min-w-80">
<iframe
v-if="course.data.video_link"
:src="video_link"
class="rounded-t-md min-h-56 w-full"
/>
<div class="p-5">
<div v-if="course.data.price" class="text-2xl font-semibold mb-3">
{{ course.data.price }}
</div>
<router-link
v-if="course.data.membership"
:to="{
name: 'Lesson',
params: {
courseName: course.name,
chapterNumber: course.data.current_lesson
? course.data.current_lesson.split('.')[0]
: 1,
lessonNumber: course.data.current_lesson
? course.data.current_lesson.split('.')[1]
: 1,
},
}"
>
<Button variant="solid" size="md" class="w-full">
<span>
{{ __('Continue Learning') }}
</span>
</Button>
</router-link>
<router-link
v-else-if="course.data.paid_course"
:to="{
name: 'Billing',
params: {
type: 'course',
name: course.data.name,
},
}"
>
<Button variant="solid" size="md" class="w-full">
<span>
{{ __('Buy this course') }}
</span>
</Button>
</router-link>
<Button
v-else
@click="enrollStudent()"
variant="solid"
class="w-full"
size="md"
>
<span>
{{ __('Start Learning') }}
</span>
</Button>
<router-link
v-if="user?.data?.is_moderator || is_instructor()"
:to="{
name: 'CreateCourse',
params: {
courseName: course.data.name,
},
}"
>
<Button variant="subtle" class="w-full mt-2" size="md">
<span>
{{ __('Edit') }}
</span>
</Button>
</router-link>
<div class="mt-8 mb-4 font-medium">
{{ __('This course has:') }}
</div>
<div class="flex items-center mb-3">
<BookOpen class="h-5 w-5 stroke-1.5 text-gray-600" />
<span class="ml-2">
{{ course.data.lesson_count }} {{ __('Lessons') }}
</span>
</div>
<div class="flex items-center mb-3">
<Users class="h-5 w-5 stroke-1.5 text-gray-600" />
<span class="ml-2">
{{ course.data.enrollment_count_formatted }}
{{ __('Enrolled Students') }}
</span>
</div>
<div class="flex items-center">
<Star class="h-5 w-5 stroke-1.5 fill-orange-500 text-gray-50" />
<span class="ml-2">
{{ course.data.avg_rating }} {{ __('Rating') }}
</span>
</div>
</div>
</div>
</template>
<script setup>
import { BookOpen, Users, Star } from 'lucide-vue-next'
import { computed, inject } from 'vue'
import { Button, createResource } from 'frappe-ui'
import { createToast } from '@/utils/'
import { useRouter } from 'vue-router'
const router = useRouter()
const user = inject('$user')
const props = defineProps({
course: {
type: Object,
default: null,
},
})
const video_link = computed(() => {
if (props.course.data.video_link) {
return 'https://www.youtube.com/embed/' + props.course.data.video_link
}
return null
})
function enrollStudent() {
if (!user.data) {
createToast({
title: 'Please Login',
icon: 'alert-circle',
iconClasses: 'text-yellow-600 bg-yellow-100',
})
setTimeout(() => {
window.location.href = `/login?redirect-to=${window.location.pathname}`
}, 3000)
} else {
const enrollStudentResource = createResource({
url: 'lms.lms.doctype.lms_enrollment.lms_enrollment.create_membership',
})
console.log(props.course)
enrollStudentResource
.submit({
course: props.course.data.name,
})
.then(() => {
createToast({
title: 'Enrolled Successfully',
icon: 'check',
iconClasses: 'text-green-600 bg-green-100',
})
setTimeout(() => {
router.push({
name: 'Lesson',
params: {
courseName: props.course.data.name,
chapterNumber: 1,
lessonNumber: 1,
},
})
}, 3000)
})
}
}
const is_instructor = () => {}
</script>

View File

@@ -0,0 +1,170 @@
<template>
<div class="text-base">
<div
v-if="title && (outline.data?.length || allowEdit)"
class="flex items-center justify-between mb-4"
>
<div class="font-semibold" :class="allowEdit ? 'text-base' : 'text-lg'">
{{ __(title) }}
</div>
<Button size="sm" v-if="allowEdit" @click="openChapterModal()">
{{ __('Add Chapter') }}
</Button>
<!-- <span class="font-medium cursor-pointer" @click="expandAllChapters()">
{{ expandAll ? __("Collapse all chapters") : __("Expand all chapters") }}
</span> -->
</div>
<div
:class="{
'shadow rounded-md pt-2 px-2': showOutline && outline.data?.length,
}"
>
<Disclosure
v-slot="{ open }"
v-for="(chapter, index) in outline.data"
:key="chapter.name"
:defaultOpen="openChapterDetail(chapter.idx)"
>
<DisclosureButton ref="" class="flex w-full px-2 py-3">
<ChevronRight
:class="{
'rotate-90 transform duration-200': open,
'duration-200': !open,
open: index == 1,
}"
class="h-4 w-4 text-gray-900 stroke-1 mr-2"
/>
<div class="text-base text-left font-medium leading-5">
{{ chapter.title }}
</div>
</DisclosureButton>
<DisclosurePanel class="pb-2">
<div v-for="lesson in chapter.lessons" :key="lesson.name">
<div class="outline-lesson pl-8 py-2">
<router-link
:to="{
name: allowEdit ? 'CreateLesson' : 'Lesson',
params: {
courseName: courseName,
chapterNumber: lesson.number.split('.')[0],
lessonNumber: lesson.number.split('.')[1],
},
}"
>
<div class="flex items-center text-sm leading-5">
<MonitorPlay
v-if="lesson.icon === 'icon-youtube'"
class="h-4 w-4 text-gray-900 stroke-1 mr-2"
/>
<HelpCircle
v-else-if="lesson.icon === 'icon-quiz'"
class="h-4 w-4 text-gray-900 stroke-1 mr-2"
/>
<FileText
v-else-if="lesson.icon === 'icon-list'"
class="h-4 w-4 text-gray-900 stroke-1 mr-2"
/>
{{ lesson.title }}
<Check
v-if="lesson.is_complete"
class="h-4 w-4 text-green-500 stroke-1.5 ml-2"
/>
</div>
</router-link>
</div>
</div>
<div v-if="allowEdit" class="flex mt-2 pl-8">
<router-link
:to="{
name: 'CreateLesson',
params: {
courseName: courseName,
chapterNumber: chapter.idx,
lessonNumber: chapter.lessons.length + 1,
},
}"
>
<Button>
{{ __('Add Lesson') }}
</Button>
</router-link>
<Button class="ml-2" @click="openChapterModal(chapter)">
{{ __('Edit Chapter') }}
</Button>
</div>
</DisclosurePanel>
</Disclosure>
</div>
</div>
<ChapterModal
v-model="showChapterModal"
v-model:outline="outline"
:course="courseName"
:chapterDetail="getCurrentChapter()"
/>
</template>
<script setup>
import { Button, createResource } from 'frappe-ui'
import { ref } from 'vue'
import { Disclosure, DisclosureButton, DisclosurePanel } from '@headlessui/vue'
import {
ChevronRight,
MonitorPlay,
HelpCircle,
FileText,
Check,
} from 'lucide-vue-next'
import { useRoute } from 'vue-router'
import ChapterModal from '@/components/Modals/ChapterModal.vue'
const route = useRoute()
const expandAll = ref(true)
const showChapterModal = ref(false)
const currentChapter = ref(null)
const props = defineProps({
courseName: {
type: String,
required: true,
},
showOutline: {
type: Boolean,
default: false,
},
title: {
type: String,
default: '',
},
allowEdit: {
type: Boolean,
default: false,
},
})
const outline = createResource({
url: 'lms.lms.utils.get_course_outline',
cache: ['course_outline', props.courseName],
params: {
course: props.courseName,
},
auto: true,
})
const openChapterDetail = (index) => {
return index == route.params.chapterNumber || index == 1
}
const openChapterModal = (chapter = null) => {
currentChapter.value = chapter
showChapterModal.value = true
}
const getCurrentChapter = () => {
return currentChapter.value
}
</script>
<style>
.outline-lesson:has(.router-link-active) {
background-color: theme('colors.gray.100');
}
</style>

View File

@@ -0,0 +1,103 @@
<template>
<div v-if="reviews.data" class="mt-20 mb-10">
<Button
v-if="membership && !hasReviewed.data"
@click="openReviewModal()"
class="float-right"
>
{{ __('Write a Review') }}
</Button>
<div class="flex items-center font-semibold text-2xl">
<Star class="h-6 w-6 stroke-1 text-gray-50 fill-orange-500 mr-1" />
{{ avg_rating }} {{ __('ratings and ') }} {{ reviews.data.length }}
{{ __('reviews') }}
</div>
<div class="grid gap-8 mt-10">
<div v-for="(review, index) in reviews.data">
<div class="flex items-center">
<UserAvatar :user="review.owner_details" :size="'2xl'" />
<div class="mx-4">
<span class="text-lg font-medium mr-4">
{{ review.owner_details.full_name }}
</span>
<span>
{{ review.creation }}
</span>
<div class="flex mt-2">
<Star
v-for="index in 5"
class="h-5 w-5 text-gray-100 bg-gray-200 rounded-sm mr-2"
:class="
index <= Math.ceil(review.rating)
? 'fill-orange-500'
: 'fill-gray-600'
"
/>
</div>
</div>
</div>
<div v-if="review.review" class="mt-4 leading-5">
{{ review.review }}
</div>
</div>
</div>
</div>
<ReviewModal
v-model="showReviewModal"
v-model:reloadReviews="reviews"
v-model:hasReviewed="hasReviewed"
:courseName="courseName"
/>
</template>
<script setup>
import { Star } from 'lucide-vue-next'
import { createResource, Button } from 'frappe-ui'
import { computed, ref, inject } from 'vue'
import UserAvatar from '@/components/UserAvatar.vue'
import ReviewModal from '@/components/Modals/ReviewModal.vue'
const user = inject('$user')
const props = defineProps({
courseName: {
type: String,
required: true,
},
avg_rating: {
type: Number,
required: true,
},
membership: {
type: Object,
required: false,
},
})
const hasReviewed = createResource({
url: 'frappe.client.get_count',
cache: ['eligible_to_review', props.courseName, props.membership?.member],
params: {
doctype: 'LMS Course Review',
filters: {
course: props.courseName,
owner: props.membership?.member,
},
},
auto: user.data?.name ? true : false,
})
const reviews = createResource({
url: 'lms.lms.utils.get_reviews',
cache: ['course_reviews', props.courseName],
params: {
course: props.courseName,
},
auto: true,
})
const showReviewModal = ref(false)
function openReviewModal() {
showReviewModal.value = true
}
</script>

View File

@@ -0,0 +1,30 @@
<template>
<div v-if="course">
<div class="text-xl font-semibold">
{{ course.title }}
</div>
<div v-if="course.chapters.length">
{{ course.chapters }}
</div>
<div v-else class="border bg-white rounded-md p-5 text-center mt-4">
<div>
{{
__(
'There are no chapters in this course. Create and manage chapters from here.'
)
}}
</div>
<Button class="mt-4">
{{ __('Add Chapter') }}
</Button>
</div>
</div>
</template>
<script setup>
const props = defineProps({
course: {
type: Object,
default: {},
},
})
</script>

View File

@@ -0,0 +1,20 @@
<template>
<div class="relative flex h-full flex-col">
<div class="h-full flex-1">
<div class="flex h-screen text-base">
<div
class="relative block min-h-0 flex-shrink-0 overflow-hidden hover:overflow-auto"
>
<slot name="sidebar" />
<AppSidebar />
</div>
<div class="w-full overflow-auto" id="scrollContainer">
<slot />
</div>
</div>
</div>
</div>
</template>
<script setup>
import AppSidebar from './AppSidebar.vue'
</script>

View File

@@ -0,0 +1,231 @@
<template>
<div class="mt-6">
<div v-if="!singleThread" class="flex items-center mb-5">
<Button variant="outline" @click="showTopics = true">
<template #icon>
<ChevronLeft class="w-5 h-5 stroke-1.5 text-gray-700" />
</template>
</Button>
<span class="text-lg font-semibold ml-2">
{{ topic.title }}
</span>
</div>
<div v-for="(reply, index) in replies.data">
<div
class="py-3"
:class="{ 'border-b': index + 1 != replies.data.length }"
>
<div class="flex items-center justify-between mb-2">
<div class="flex items-center">
<UserAvatar :user="reply.user" class="mr-2" />
<span>
{{ reply.user.full_name }}
</span>
<span class="text-sm ml-2">
{{ timeAgo(reply.creation) }}
</span>
</div>
<Dropdown
v-if="user.data.name == reply.owner && !reply.editable"
:options="[
{
label: 'Edit',
onClick() {
reply.editable = true
},
},
{
label: 'Delete',
onClick() {
deleteReply(reply)
},
},
]"
>
<template v-slot="{ open }">
<MoreHorizontal class="w-4 h-4 stroke-1.5 cursor-pointer" />
</template>
</Dropdown>
<div v-if="reply.editable">
<Button variant="ghost" @click="postEdited(reply)">
{{ __('Post') }}
</Button>
<Button variant="ghost" @click="reply.editable = false">
{{ __('Discard') }}
</Button>
</div>
</div>
<TextEditor
:content="reply.reply"
@change="(val) => (reply.reply = val)"
:editable="reply.editable || false"
:fixedMenu="reply.editable || false"
:editorClass="
reply.editable
? 'ProseMirror prose prose-table:table-fixed prose-td:p-2 prose-th:p-2 prose-td:border prose-th:border prose-td:border-gray-300 prose-th:border-gray-300 prose-td:relative prose-th:relative prose-th:bg-gray-100 prose-sm max-w-none'
: 'prose-sm'
"
/>
</div>
</div>
<TextEditor
class="mt-5"
:content="newReply"
@change="(val) => (newReply = val)"
placeholder="Type your reply here..."
:fixedMenu="true"
editorClass="ProseMirror prose prose-table:table-fixed prose-td:p-2 prose-th:p-2 prose-td:border prose-th:border prose-td:border-gray-300 prose-th:border-gray-300 prose-td:relative prose-th:relative prose-th:bg-gray-100 prose-sm max-w-none border border-gray-300 rounded-b-md min-h-[7rem] py-1 px-2"
/>
<div class="flex justify-between mt-2">
<span> </span>
<Button @click="postReply()">
<span>
{{ __('Post') }}
</span>
</Button>
</div>
</div>
</template>
<script setup>
import { createResource, TextEditor, Button, Dropdown } from 'frappe-ui'
import { timeAgo } from '../utils'
import UserAvatar from '@/components/UserAvatar.vue'
import { ChevronLeft, MoreHorizontal } from 'lucide-vue-next'
import { ref, inject, onMounted } from 'vue'
import { createToast } from '../utils'
const showTopics = defineModel('showTopics')
const newReply = ref('')
const socket = inject('$socket')
const user = inject('$user')
const props = defineProps({
topic: {
type: Object,
required: true,
},
singleThread: {
type: Boolean,
default: false,
},
})
onMounted(() => {
socket.on('publish_message', (data) => {
replies.reload()
})
socket.on('update_message', (data) => {
replies.reload()
})
socket.on('delete_message', (data) => {
replies.reload()
})
})
const replies = createResource({
url: 'lms.lms.utils.get_discussion_replies',
cache: ['replies', props.topic],
makeParams(values) {
return {
topic: props.topic.name,
}
},
auto: true,
})
const newReplyResource = createResource({
url: 'frappe.client.insert',
makeParams(values) {
return {
doc: {
doctype: 'Discussion Reply',
reply: newReply.value,
topic: props.topic.name,
},
}
},
})
const postReply = () => {
newReplyResource.submit(
{},
{
validate() {
if (!newReply.value) {
return 'Reply cannot be empty'
}
},
onSuccess() {
newReply.value = ''
replies.reload()
},
onError(err) {
createToast({
title: 'Error',
text: err.messages?.[0] || err,
icon: 'x',
iconClasses: 'bg-red-600 text-white rounded-md p-px',
position: 'top-center',
timeout: 10,
})
},
}
)
}
const editReplyResource = createResource({
url: 'frappe.client.set_value',
makeParams(values) {
return {
doctype: 'Discussion Reply',
name: values.name,
fieldname: 'reply',
value: values.reply,
}
},
})
const postEdited = (reply) => {
editReplyResource.submit(
{
name: reply.name,
reply: reply.reply,
},
{
validate() {
if (!reply.reply) {
return 'Reply cannot be empty'
}
},
onSuccess() {
reply.editable = false
replies.reload()
},
}
)
}
const deleteReplyResource = createResource({
url: 'frappe.client.delete',
makeParams(values) {
return {
doctype: 'Discussion Reply',
name: values.name,
}
},
})
const deleteReply = (reply) => {
deleteReplyResource.submit(
{
name: reply.name,
},
{
onSuccess() {
replies.reload()
},
}
)
}
</script>

View File

@@ -0,0 +1,132 @@
<template>
<div>
<Button v-if="!singleThread" class="float-right" @click="openTopicModal()">
{{ __('New {0}').format(title) }}
</Button>
<div class="text-xl font-semibold">
{{ __(title) }}
</div>
</div>
<div v-if="topics.data?.length && !singleThread">
<div v-if="showTopics" v-for="(topic, index) in topics.data">
<div
@click="showReplies(topic)"
class="flex items-center cursor-pointer py-5 w-full"
:class="{ 'border-b': index + 1 != topics.data.length }"
>
<UserAvatar :user="topic.user" size="2xl" class="mr-4" />
<div>
<div class="text-lg font-semibold mb-1">
{{ topic.title }}
</div>
<div class="flex items-center">
<span>
{{ topic.user.full_name }}
</span>
<span class="text-sm ml-3">
{{ timeAgo(topic.creation) }}
</span>
</div>
</div>
</div>
</div>
<div v-else>
<DiscussionReplies
:topic="currentTopic"
v-model:showTopics="showTopics"
/>
</div>
</div>
<div v-else-if="singleThread && topics.data">
<DiscussionReplies :topic="topics.data" :singleThread="singleThread" />
</div>
<div v-else class="flex justify-center border mt-5 p-5 rounded-md">
<MessageSquareIcon class="w-10 h-10 stroke-1.5 text-gray-800 mr-2" />
<div>
<div class="text-xl font-semibold mb-2">
{{ __(emptyStateTitle) }}
</div>
<div>
{{ __(emptyStateText) }}
</div>
</div>
</div>
<DiscussionModal
v-model="showTopicModal"
:title="__('New {0}').format(title)"
:doctype="props.doctype"
:docname="props.docname"
v-model:reloadTopics="topics"
/>
</template>
<script setup>
import { createResource, Button, TextEditor } from 'frappe-ui'
import UserAvatar from '@/components/UserAvatar.vue'
import { timeAgo } from '../utils'
import { ref, onMounted, inject } from 'vue'
import DiscussionReplies from '@/components/DiscussionReplies.vue'
import DiscussionModal from '@/components/Modals/DiscussionModal.vue'
import { MessageSquareIcon } from 'lucide-vue-next'
const showTopics = ref(true)
const currentTopic = ref(null)
const socket = inject('$socket')
const user = inject('$user')
const showTopicModal = ref(false)
const props = defineProps({
title: {
type: String,
required: true,
},
doctype: {
type: String,
required: true,
},
docname: {
type: String,
required: true,
},
emptyStateTitle: {
type: String,
default: 'No topics yet',
},
emptyStateText: {
type: String,
default: 'Be the first to start a discussion',
},
singleThread: {
type: Boolean,
default: false,
},
})
onMounted(() => {
if (user.data) topics.reload()
socket.on('new_discussion_topic', (data) => {
topics.refresh()
})
})
const topics = createResource({
url: 'lms.lms.utils.get_discussion_topics',
cache: ['topics', props.doctype, props.docname],
makeParams() {
return {
doctype: props.doctype,
docname: props.docname,
single_thread: props.singleThread,
}
},
})
const showReplies = (topic) => {
showTopics.value = false
currentTopic.value = topic
}
const openTopicModal = () => {
showTopicModal.value = true
}
</script>

View File

@@ -0,0 +1,23 @@
<template>
<svg
width="18"
height="18"
viewBox="0 0 18 18"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<g clip-path="url(#clip0_1584_1676)">
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M3.17474 0.625C2.34632 0.625 1.67474 1.29657 1.67474 2.125V7.475C1.67474 8.30343 2.34632 8.975 3.17474 8.975H14.8247C15.6532 8.975 16.3247 8.30343 16.3247 7.475V2.125C16.3247 1.29657 15.6532 0.625 14.8247 0.625H3.17474ZM2.67474 2.125C2.67474 1.84886 2.8986 1.625 3.17474 1.625H14.8247C15.1009 1.625 15.3247 1.84886 15.3247 2.125V7.475C15.3247 7.75114 15.1009 7.975 14.8247 7.975H3.17474C2.8986 7.975 2.67474 7.75114 2.67474 7.475V2.125ZM4.27478 10.0749C3.99864 10.0749 3.77478 10.2987 3.77478 10.5749V12.6749C3.77478 12.951 3.99864 13.1749 4.27478 13.1749C4.55092 13.1749 4.77478 12.951 4.77478 12.6749V11.0749H6.92478V12.6749C6.92478 12.951 7.14864 13.1749 7.42478 13.1749C7.70092 13.1749 7.92478 12.951 7.92478 12.6749V10.5749C7.92478 10.2987 7.70092 10.0749 7.42478 10.0749H4.27478ZM10.0749 10.5749C10.0749 10.2987 10.2987 10.0749 10.5749 10.0749H13.7249C14.001 10.0749 14.2249 10.2987 14.2249 10.5749V12.6749C14.2249 12.951 14.001 13.1749 13.7249 13.1749C13.4487 13.1749 13.2249 12.951 13.2249 12.6749V11.0749H11.0749V12.6749C11.0749 12.951 10.851 13.1749 10.5749 13.1749C10.2987 13.1749 10.0749 12.951 10.0749 12.6749V10.5749ZM1.125 14.275C0.848858 14.275 0.625 14.4988 0.625 14.775V16.875C0.625 17.1511 0.848858 17.375 1.125 17.375C1.40114 17.375 1.625 17.1511 1.625 16.875V15.275H3.775V16.875C3.775 17.1511 3.99886 17.375 4.275 17.375C4.55114 17.375 4.775 17.1511 4.775 16.875V14.775C4.775 14.4988 4.55114 14.275 4.275 14.275H1.125ZM13.2252 14.775C13.2252 14.4988 13.4491 14.275 13.7252 14.275H16.8752C17.1514 14.275 17.3752 14.4988 17.3752 14.775V16.875C17.3752 17.1511 17.1514 17.375 16.8752 17.375C16.5991 17.375 16.3752 17.1511 16.3752 16.875V15.275H14.2252V16.875C14.2252 17.1511 14.0014 17.375 13.7252 17.375C13.4491 17.375 13.2252 17.1511 13.2252 16.875V14.775ZM7.42511 14.275C7.14897 14.275 6.92511 14.4988 6.92511 14.775V16.875C6.92511 17.1511 7.14897 17.375 7.42511 17.375C7.70125 17.375 7.92511 17.1511 7.92511 16.875V15.275H10.0751V16.875C10.0751 17.1511 10.299 17.375 10.5751 17.375C10.8513 17.375 11.0751 17.1511 11.0751 16.875V14.775C11.0751 14.4988 10.8513 14.275 10.5751 14.275H7.42511Z"
fill="#525252"
/>
</g>
<defs>
<clipPath id="clip0_1584_1676">
<rect width="18" height="18" fill="white" />
</clipPath>
</defs>
</svg>
</template>

View File

@@ -0,0 +1,27 @@
<template>
<svg
width="18"
height="18"
viewBox="0 0 18 18"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M10.875 9.06223L3 9.06232"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
/>
<path
d="M6.74537 5.31699L3 9.06236L6.74527 12.8076"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
/>
<path
d="M14.1423 4L14.1423 14.125"
stroke="currentColor"
stroke-linecap="round"
/>
</svg>
</template>

View File

@@ -0,0 +1,18 @@
<template>
<svg
width="16"
height="16"
viewBox="0 0 16 16"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<circle
cx="8"
cy="8"
r="4.5"
fill="transparent"
stroke="currentColor"
stroke-width="3"
/>
</svg>
</template>

View File

@@ -0,0 +1,36 @@
<template>
<svg
width="118"
height="118"
viewBox="0 0 118 118"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M93.9278 0H23.1013C10.3428 0 0 10.3428 0 23.1013V93.9278C0 106.686 10.3428 117.029 23.1013 117.029H93.9278C106.686 117.029 117.029 106.686 117.029 93.9278V23.1013C117.029 10.3428 106.686 0 93.9278 0Z"
fill="url(#paint0_radial_174_336)"
/>
<path
d="M93.9278 0H23.1013C10.3428 0 0 10.3428 0 23.1013V93.9278C0 106.686 10.3428 117.029 23.1013 117.029H93.9278C106.686 117.029 117.029 106.686 117.029 93.9278V23.1013C117.029 10.3428 106.686 0 93.9278 0Z"
fill="#0B3D3D"
fill-opacity="0.8"
/>
<path
d="M95.1879 33.1294L91.4077 32.0268C80.1721 28.7716 67.9389 30.9242 58.5409 37.7496C52.083 33.0769 43.9975 30.5042 36.1746 30.5042H21.8938V41.0048H36.2796C42.2649 41.0048 48.1978 42.9999 52.923 46.6226L58.5934 50.9279L64.2637 46.6226C70.144 42.1599 77.5469 40.2698 84.7923 41.2673V76.1818C75.5518 75.2367 66.2063 77.7044 58.6459 83.2172C51.0854 77.7044 41.6349 75.2367 32.4994 76.1818V52.8705H21.9988V86.4724H95.3454V33.1294H95.1879Z"
fill="#58FF9B"
/>
<defs>
<radialGradient
id="paint0_radial_174_336"
cx="0"
cy="0"
r="1"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(117.24 -101.5) rotate(105.042) scale(226.282)"
>
<stop offset="0.445162" stop-color="#1F7676" />
<stop offset="1" stop-color="#0A4B4B" />
</radialGradient>
</defs>
</svg>
</template>

View File

@@ -0,0 +1,81 @@
<template>
<div class="flex shadow rounded-md p-4 h-full">
<img
:src="job.company_logo"
class="w-12 h-12 rounded-lg object-contain mr-4"
:alt="job.company_name"
/>
<div>
<div class="text-xl font-semibold mb-2">
{{ job.job_title }}
</div>
<div>
{{ __('posted by') }}
<span class="font-medium">
{{ job.company_name }}
</span>
</div>
<div class="flex items-center my-4">
<Badge :label="job.type" theme="green" size="lg" class="mr-4" />
<Badge :label="job.location.split(' ')[0]" theme="gray" size="lg">
<template #prefix>
<MapPin class="h-4 w-4 stroke-1.5" />
</template>
</Badge>
</div>
<div>
{{ __('posted on') }}
<span class="font-medium">
{{ dayjs(job.creation).format('DD MMM YYYY') }}
</span>
</div>
</div>
</div>
<!-- <div class="flex flex-col shadow rounded-md p-4 h-full">
<div class="flex justify-between">
<div>
<div class="text-xl font-semibold mb-2">
{{ job.job_title }}
</div>
<div>
{{ __("posted by") }}
<span class="font-medium">
{{ job.company_name }}
</span>
</div>
</div>
<img
:src="job.company_logo"
class="w-12 h-12 rounded-lg object-contain"
/>
</div>
<div class="flex justify-between mt-8">
<div class="flex items-center">
<Badge :label="job.type" theme="green" size="lg" class="mr-4"/>
<Badge :label="job.location" theme="gray" size="lg">
<template #prefix>
<MapPin class="h-4 w-4 stroke-1.5" />
</template>
</Badge>
</div>
<div>
<span class="font-medium">
{{ dayjs(job.creation).format('DD MMM YYYY') }}
</span>
</div>
</div>
</div> -->
</template>
<script setup>
import { MapPin } from 'lucide-vue-next'
import { Badge } from 'frappe-ui'
import { inject } from 'vue'
const dayjs = inject('$dayjs')
const props = defineProps({
job: {
type: Object,
default: null,
},
})
</script>

Some files were not shown because too many files have changed in this diff Show More