From 4891be1d8c9a509047dc3cc85eafc9e91c00e093 Mon Sep 17 00:00:00 2001 From: pateljannat Date: Thu, 15 Jul 2021 11:16:01 +0530 Subject: [PATCH] fix: profile page fixes and course completion tick --- community/fixtures/custom_field.json | 265 ++++++++++++++++++++ community/hooks.py | 7 +- community/lms/web_form/profile/profile.js | 10 +- community/lms/web_form/profile/profile.json | 102 ++++++-- community/lms/widgets/ChapterTeaser.html | 2 +- community/lms/widgets/CourseCard.html | 10 + community/lms/widgets/MemberCard.html | 2 +- community/overrides/user.py | 9 + community/public/css/style.css | 166 +++++++++++- community/public/icons/github.svg | 9 + community/public/icons/medium.svg | 9 + community/public/images/profile-banner.png | Bin 0 -> 27197 bytes community/public/images/profile-cover.png | 0 community/www/courses/index.html | 13 - community/www/profiles/profile.html | 44 +++- 15 files changed, 598 insertions(+), 50 deletions(-) create mode 100644 community/public/icons/github.svg create mode 100644 community/public/icons/medium.svg create mode 100644 community/public/images/profile-banner.png create mode 100644 community/public/images/profile-cover.png diff --git a/community/fixtures/custom_field.json b/community/fixtures/custom_field.json index d3bb2124..e450d748 100644 --- a/community/fixtures/custom_field.json +++ b/community/fixtures/custom_field.json @@ -104,5 +104,270 @@ "translatable": 1, "unique": 0, "width": null + }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "User", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "medium", + "fieldtype": "Data", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "github", + "label": "Medium ID", + "length": 0, + "mandatory_depends_on": null, + "modified": "2021-06-30 14:46:55.834145", + "name": "User-medium", + "no_copy": 0, + "non_negative": 0, + "options": null, + "parent": null, + "parentfield": null, + "parenttype": null, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "translatable": 1, + "unique": 0, + "width": null + }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "User", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "city", + "fieldtype": "Data", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "mute_sounds", + "label": "City", + "length": 0, + "mandatory_depends_on": null, + "modified": "2021-06-30 14:46:55.834145", + "name": "User-city", + "no_copy": 0, + "non_negative": 0, + "options": null, + "parent": null, + "parentfield": null, + "parenttype": null, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "translatable": 1, + "unique": 0, + "width": null + }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "User", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "college", + "fieldtype": "Data", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "city", + "label": "College Name", + "length": 0, + "mandatory_depends_on": null, + "modified": "2021-06-30 14:46:55.834145", + "name": "User-college", + "no_copy": 0, + "non_negative": 0, + "options": null, + "parent": null, + "parentfield": null, + "parenttype": null, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "translatable": 1, + "unique": 0, + "width": null + }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "User", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "branch", + "fieldtype": "Data", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "college", + "label": "Branch", + "length": 0, + "mandatory_depends_on": null, + "modified": "2021-06-30 14:46:55.834145", + "name": "User-branch", + "no_copy": 0, + "non_negative": 0, + "options": null, + "parent": null, + "parentfield": null, + "parenttype": null, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "translatable": 1, + "unique": 0, + "width": null + }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "User", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "profession", + "fieldtype": "Data", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "medium", + "label": "Profession", + "length": 0, + "mandatory_depends_on": null, + "modified": "2021-06-30 14:46:55.834145", + "name": "User-profession", + "no_copy": 0, + "non_negative": 0, + "options": null, + "parent": null, + "parentfield": null, + "parenttype": null, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "translatable": 1, + "unique": 0, + "width": null } ] diff --git a/community/hooks.py b/community/hooks.py index 61b681f5..691d75ee 100644 --- a/community/hooks.py +++ b/community/hooks.py @@ -167,7 +167,8 @@ whitelist = [ "/add-a-new-batch", "/new-sign-up", "/message", - "/about" + "/about", + "/edit-profile" ] whitelist_rules = [{"from_route": p, "to_route": p[1:]} for p in whitelist] @@ -178,6 +179,10 @@ profile_rules = [ website_route_rules = primary_rules + whitelist_rules + profile_rules +website_redirects = [ + {"source": "/update-profile", "target": "/edit-profile"}, +] + update_website_context = 'community.widgets.update_website_context' ## Specify the additional tabs to be included in the user profile page. diff --git a/community/lms/web_form/profile/profile.js b/community/lms/web_form/profile/profile.js index 699703c5..027cef49 100644 --- a/community/lms/web_form/profile/profile.js +++ b/community/lms/web_form/profile/profile.js @@ -1,3 +1,7 @@ -frappe.ready(function() { - // bind events here -}) \ No newline at end of file +frappe.ready(function () { + frappe.web_form.after_load = () => { + if (!frappe.utils.get_url_arg("name")) { + window.location.href = `/edit-profile?name=${frappe.session.user}`; + } + } +}) diff --git a/community/lms/web_form/profile/profile.json b/community/lms/web_form/profile/profile.json index c4962a94..4c3fcc7d 100644 --- a/community/lms/web_form/profile/profile.json +++ b/community/lms/web_form/profile/profile.json @@ -12,6 +12,7 @@ "breadcrumbs": "", "button_label": "Save", "creation": "2021-06-30 13:48:13.682851", + "custom_css": "[data-doctype=\"Web Form\"] {\n max-width: 720px;\n margin: 6rem auto;\n}", "doc_type": "User", "docstatus": 0, "doctype": "Web Form", @@ -19,14 +20,14 @@ "is_standard": 1, "login_required": 1, "max_attachment_size": 0, - "modified": "2021-06-30 15:53:20.967466", + "modified": "2021-07-14 17:15:15.424855", "modified_by": "Administrator", "module": "LMS", "name": "profile", "owner": "Administrator", "payment_button_label": "Buy Now", "published": 1, - "route": "profile", + "route": "edit-profile", "route_to_success_link": 0, "show_attachments": 0, "show_in_grid": 0, @@ -84,18 +85,6 @@ "reqd": 0, "show_in_filter": 0 }, - { - "allow_read_on_all_link_options": 0, - "fieldname": "username", - "fieldtype": "Data", - "hidden": 0, - "label": "Username", - "max_length": 0, - "max_value": 0, - "read_only": 0, - "reqd": 0, - "show_in_filter": 0 - }, { "allow_read_on_all_link_options": 0, "fieldname": "mobile_no", @@ -120,6 +109,91 @@ "read_only": 0, "reqd": 0, "show_in_filter": 0 + }, + { + "allow_read_on_all_link_options": 0, + "fieldname": "linkedin", + "fieldtype": "Data", + "hidden": 0, + "label": "LinkedIn ID", + "max_length": 0, + "max_value": 0, + "read_only": 0, + "reqd": 0, + "show_in_filter": 0 + }, + { + "allow_read_on_all_link_options": 0, + "fieldname": "github", + "fieldtype": "Data", + "hidden": 0, + "label": "Github ID", + "max_length": 0, + "max_value": 0, + "read_only": 0, + "reqd": 0, + "show_in_filter": 0 + }, + { + "allow_read_on_all_link_options": 0, + "fieldname": "medium", + "fieldtype": "Data", + "hidden": 0, + "label": "Medium ID", + "max_length": 0, + "max_value": 0, + "read_only": 0, + "reqd": 0, + "show_in_filter": 0 + }, + { + "allow_read_on_all_link_options": 0, + "fieldname": "city", + "fieldtype": "Data", + "hidden": 0, + "label": "City", + "max_length": 0, + "max_value": 0, + "read_only": 0, + "reqd": 0, + "show_in_filter": 0 + }, + { + "allow_read_on_all_link_options": 0, + "fieldname": "college", + "fieldtype": "Data", + "hidden": 0, + "label": "College Name", + "max_length": 0, + "max_value": 0, + "read_only": 0, + "reqd": 0, + "show_in_filter": 0 + }, + { + "allow_read_on_all_link_options": 0, + "depends_on": "college", + "fieldname": "branch", + "fieldtype": "Data", + "hidden": 0, + "label": "Branch", + "max_length": 0, + "max_value": 0, + "read_only": 0, + "reqd": 0, + "show_in_filter": 0 + }, + { + "allow_read_on_all_link_options": 0, + "fieldname": "profession", + "fieldtype": "Data", + "hidden": 0, + "label": "Profession", + "max_length": 0, + "max_value": 0, + "read_only": 0, + "reqd": 0, + "show_in_filter": 0 } ] } \ No newline at end of file diff --git a/community/lms/widgets/ChapterTeaser.html b/community/lms/widgets/ChapterTeaser.html index 526e92fb..9f8afba0 100644 --- a/community/lms/widgets/ChapterTeaser.html +++ b/community/lms/widgets/ChapterTeaser.html @@ -25,7 +25,7 @@ {{ lesson.title }} {% if membership %} - {% endif %} diff --git a/community/lms/widgets/CourseCard.html b/community/lms/widgets/CourseCard.html index 1634e305..ba0250ee 100644 --- a/community/lms/widgets/CourseCard.html +++ b/community/lms/widgets/CourseCard.html @@ -70,3 +70,13 @@ {% endif %} + diff --git a/community/lms/widgets/MemberCard.html b/community/lms/widgets/MemberCard.html index 0ecc2d72..d780eb34 100644 --- a/community/lms/widgets/MemberCard.html +++ b/community/lms/widgets/MemberCard.html @@ -1,5 +1,5 @@
- {% set avatar_class = "avatar-large" if not dimension_class else "avatar-xl"%} + {% set avatar_class = "avatar-large" if not dimension_class else "avatar-large"%} {{ widgets.Avatar(member=member, avatar_class=avatar_class) }}
{{ member.full_name }} diff --git a/community/overrides/user.py b/community/overrides/user.py index 8588a350..91cd5abd 100644 --- a/community/overrides/user.py +++ b/community/overrides/user.py @@ -59,3 +59,12 @@ class CustomUser(User): filters["member_type"] = member_type return frappe.get_all("LMS Batch Membership", filters, ["name", "course"]) + + def get_mentored_courses(self): + """ Returns all courses mentored by this user """ + return frappe.get_all("LMS Course Mentor Mapping", + { + "mentor": self.name + }, + ["name", "course"] + ) diff --git a/community/public/css/style.css b/community/public/css/style.css index 1fd78522..b94b4a39 100644 --- a/community/public/css/style.css +++ b/community/public/css/style.css @@ -303,6 +303,11 @@ input[type=checkbox] { height: 45px; } +@media (max-width: 360px) { + .course-card-title { + font-size: 14px; + } +} .card-divider { border: 1px solid #F4F5F6; margin-bottom: 16px; @@ -862,11 +867,30 @@ div.custom-checkbox>label>input:checked+img { margin: 0; } -.avatar-xl { +.avatar-large { width: 88px; height: 88px; } +.avatar-xl { + width: 112px; + height: 112px; +} + +@media (max-width: 500px) { + .avatar-xl { + width: 88px; + height: 88px; + } +} + +@media (max-width: 375px) { + .avatar-xl { + width: 50px; + height: 50px; + } +} + .description-card { padding: 24px; flex-direction: column; @@ -1066,15 +1090,6 @@ div.custom-checkbox>label>input:checked+img { font-weight: bold; } -.lesson-progress-tick { - width: 16px; - height: 16px; - background: #4C5A67; - border-radius: 2px; - padding: 2px; - margin: 0px 4px 4px; -} - .profile-page { max-width: 1150px; margin: 0 auto; @@ -1082,16 +1097,141 @@ div.custom-checkbox>label>input:checked+img { padding-bottom: 1rem; } +.profile-banner { + width: 100%; + height: 248px; + border-radius: 12px 12px 0px 0px; +} + +@media (max-width: 500px) { + .profile-banner { + height: 150px; + } +} + +.profile-info { + height: 68px; + background: #ffffff; + border-radius: 0px 0px 12px 12px; +} + +.profile-avatar { + position: relative; + top: 188px; + left: 40px; + display: flex; +} + +@media (max-width: 500px) { + .profile-avatar { + top: 95px; + left: 10px; + } +} + +@media (max-width: 375px) { + .profile-avatar { + top: 120px; + left: 10px; + } +} + +.profile-name { + color: #FFFFFF; + font-weight: 600; + font-size: 22px; + line-height: 156%; + letter-spacing: -0.0175em; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.64); + padding: 20px; +} + +@media (max-width: 375px) { + .profile-name { + font-size: 16px; + padding: 5px; + } +} + +.creator-badge { + background: #48BB74; + padding: 4px 6px; + color: #ffffff; + font-style: normal; + font-weight: bold; + font-size: 10px; + line-height: 120%; + text-align: center; + letter-spacing: 0.011em; + text-transform: uppercase; + height: fit-content; + box-shadow: 0px 1px 1px rgb(0 0 0 / 16%); + border-radius: 4px; + margin-top: 25px; +} + +@media (max-width: 375px) { + .creator-badge { + font-size: 8px; + margin: 8px 0px 0px; + } +} + +.profile-profession { + position: relative; + top: 16px; + left: 174px; + font-size: 12px; + line-height: 165%; +} + +@media (max-width: 500px) { + .profile-profession { + top: 10px; + left: 120px; + } +} + +@media (max-width: 375px) { + .profile-profession { + top: 5px; + left: 70px; + } +} + +.social-icons { + float: right; + margin: 16px; +} + +@media (max-width: 500px) { + .social-icons { + margin: 10px; + } +} + +@media (max-width: 375px) { + .social-icons { + margin: 5px; + } +} + .profile-courses { margin-top: 3rem; } -@media (max-width: 375px) { +@media (max-width: 500px) { .profile-courses { padding: 0px 24px 0px; } } +@media (max-width: 360px) { + .profile-courses { + padding: 0px 10px 0px; + } +} + .progress-text { font-size: 12px; line-height: 165%; @@ -1123,9 +1263,9 @@ div.custom-checkbox>label>input:checked+img { } } -@media (max-width: 375px) { +@media (max-width: 600px) { .progress-card { - width: 312px; + width: 100%; } } diff --git a/community/public/icons/github.svg b/community/public/icons/github.svg new file mode 100644 index 00000000..f946cae0 --- /dev/null +++ b/community/public/icons/github.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/community/public/icons/medium.svg b/community/public/icons/medium.svg new file mode 100644 index 00000000..df87d2cc --- /dev/null +++ b/community/public/icons/medium.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/community/public/images/profile-banner.png b/community/public/images/profile-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..5d9443baf5a61fd391c5dda9257656e32d011685 GIT binary patch literal 27197 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 z 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 eh%qhK6lyF8Y0B7L

{% endblock %} - -{% block script %} - -{% endblock %} diff --git a/community/www/profiles/profile.html b/community/www/profiles/profile.html index c4e05404..a0274de3 100644 --- a/community/www/profiles/profile.html +++ b/community/www/profiles/profile.html @@ -7,7 +7,7 @@ {% block content %}
- {{ widgets.MemberCard(member=member, show_course_count=True, dimension_class="member-card-xl") }} + {{ ProfileBanner(member) }} {{ AboutOverviewSection(member) }} {{ CoursesCreated(member) }} {{ CoursesMentored(member) }} @@ -17,6 +17,42 @@
{% endblock %} +{% macro ProfileBanner(member) %} +
+
+
+ {{ widgets.Avatar(member=member, avatar_class="avatar-xl") }} +
{{ member.full_name }}
+ {% if member.get_authored_courses() | length %} +
Creator
+ {% endif %} +
+
+
+ {% if member.profession %} + {{ member.profession }} + {% endif %} + +
+
+{% endmacro %} + {% macro AboutOverviewSection(member) %}
{% if member.bio %} @@ -75,14 +111,14 @@ {% endmacro %} {% macro CoursesMentored(member) %} -{% if member.get_course_membership("Mentor") | length %} +{% if member.get_mentored_courses() | length %}
Courses Mentored
- {% for membership in member.get_course_membership("Mentor") %} - {% set course_details = frappe.get_doc("LMS Course", membership.course) %} + {% for mentorship in member.get_mentored_courses() %} + {% set course_details = frappe.get_doc("LMS Course", mentorship.course) %} {{ widgets.CourseCard(course=course_details) }} {% endfor %}