fix: multiple badges
This commit is contained in:
@@ -1,9 +0,0 @@
|
||||
<template></template>
|
||||
<script setup>
|
||||
const props = defineProps({
|
||||
badge: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
})
|
||||
</script>
|
||||
@@ -5,9 +5,23 @@
|
||||
</h2>
|
||||
<div class="grid grid-cols-5 gap-4">
|
||||
<div v-if="badges.data" v-for="badge in badges.data">
|
||||
<Popover trigger="hover" hoverDelay="0.0">
|
||||
<Popover trigger="hover">
|
||||
<template #target>
|
||||
<img :src="badge.badge_image" :alt="badge.badge" class="h-[80px]" />
|
||||
<div class="relative">
|
||||
<img
|
||||
:src="badge.badge_image"
|
||||
:alt="badge.badge"
|
||||
class="h-[80px]"
|
||||
/>
|
||||
<div
|
||||
class="flex items-end bg-gray-100 p-2 text-xs font-semibold rounded-full absolute right-0 bottom-0"
|
||||
>
|
||||
<span>
|
||||
<X class="w-3 h-3" />
|
||||
</span>
|
||||
{{ badge.count }}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<template #body-main>
|
||||
<div class="w-[250px] text-base">
|
||||
@@ -20,7 +34,7 @@
|
||||
<div class="text-2xl font-semibold mb-2">
|
||||
{{ badge.badge }}
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<div class="leading-5 mb-4">
|
||||
{{ badge.badge_description }}
|
||||
</div>
|
||||
<div class="flex flex-col">
|
||||
@@ -39,8 +53,8 @@
|
||||
</template>
|
||||
<script setup>
|
||||
import { createResource, Popover } from 'frappe-ui'
|
||||
import BadgePopover from '@/components/BadgePopover.vue'
|
||||
import { inject } from 'vue'
|
||||
import { X } from 'lucide-vue-next'
|
||||
|
||||
const dayjs = inject('$dayjs')
|
||||
|
||||
@@ -61,5 +75,15 @@ const badges = createResource({
|
||||
},
|
||||
},
|
||||
auto: true,
|
||||
transform(data) {
|
||||
let finalBadges = []
|
||||
let groupedBadges = Object.groupBy(data, ({ badge }) => badge)
|
||||
for (let badge in groupedBadges) {
|
||||
let badgeData = groupedBadges[badge][0]
|
||||
badgeData.count = groupedBadges[badge].length
|
||||
finalBadges.push(badgeData)
|
||||
}
|
||||
return finalBadges
|
||||
},
|
||||
})
|
||||
</script>
|
||||
|
||||
@@ -1,8 +1,26 @@
|
||||
// Copyright (c) 2024, Frappe and contributors
|
||||
// For license information, please see license.txt
|
||||
|
||||
// frappe.ui.form.on("LMS Badge", {
|
||||
// refresh(frm) {
|
||||
frappe.ui.form.on("LMS Badge", {
|
||||
reference_doctype: (frm) => {
|
||||
frm.events.set_fields_to_check(frm);
|
||||
},
|
||||
|
||||
// },
|
||||
// });
|
||||
set_fields_to_check: (frm) => {
|
||||
const reference_doctype = frm.doc.reference_doctype;
|
||||
if (!reference_doctype) return;
|
||||
|
||||
frappe.model.with_doctype(reference_doctype, () => {
|
||||
const map_for_options = (df) => ({
|
||||
label: df.label,
|
||||
value: df.fieldname,
|
||||
});
|
||||
const fields = frappe.meta
|
||||
.get_docfields(frm.doc.reference_doctype)
|
||||
.filter(frappe.model.is_value_type);
|
||||
|
||||
const fields_to_check = fields.map(map_for_options);
|
||||
frm.set_df_property("field_to_check", "options", fields_to_check);
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
@@ -85,8 +85,13 @@
|
||||
}
|
||||
],
|
||||
"index_web_pages_for_search": 1,
|
||||
"links": [],
|
||||
"modified": "2024-04-30 17:16:17.725459",
|
||||
"links": [
|
||||
{
|
||||
"link_doctype": "LMS Badge Assignment",
|
||||
"link_fieldname": "badge"
|
||||
}
|
||||
],
|
||||
"modified": "2024-05-02 14:23:32.198858",
|
||||
"modified_by": "Administrator",
|
||||
"module": "LMS",
|
||||
"name": "LMS Badge",
|
||||
|
||||
@@ -36,7 +36,7 @@ class LMSBadge(Document):
|
||||
if self.grant_only_once:
|
||||
if frappe.db.exists(
|
||||
"LMS Badge Assignment",
|
||||
{"badge": self.name, "user": frappe.session.user},
|
||||
{"badge": self.name, "member": frappe.session.user},
|
||||
):
|
||||
return
|
||||
|
||||
@@ -44,7 +44,7 @@ class LMSBadge(Document):
|
||||
assignment.update(
|
||||
{
|
||||
"badge": self.name,
|
||||
"user": frappe.session.user,
|
||||
"member": frappe.session.user,
|
||||
"issued_on": frappe.utils.now(),
|
||||
}
|
||||
)
|
||||
|
||||
@@ -161,6 +161,7 @@ def get_lesson_details(chapter):
|
||||
)
|
||||
lesson_details.number = f"{chapter.idx}.{row.idx}"
|
||||
lesson_details.icon = get_lesson_icon(lesson_details.body)
|
||||
lesson_details.is_complete = get_progress(lesson_details.course, lesson_details.name)
|
||||
lessons.append(lesson_details)
|
||||
return lessons
|
||||
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
<meta name="twitter:title" content="{{ meta.title }}" />
|
||||
<meta name="twitter:image" content="{{ meta.image }}" />
|
||||
<meta name="twitter:description" content="{{ meta.description }}" />
|
||||
<script type="module" crossorigin src="/assets/lms/frontend/assets/index-BIja_89l.js"></script>
|
||||
<link rel="modulepreload" crossorigin href="/assets/lms/frontend/assets/frappe-ui-Ccuocnz7.js">
|
||||
<script type="module" crossorigin src="/assets/lms/frontend/assets/index-CushEWOj.js"></script>
|
||||
<link rel="modulepreload" crossorigin href="/assets/lms/frontend/assets/frappe-ui-BI4McHL7.js">
|
||||
<link rel="stylesheet" crossorigin href="/assets/lms/frontend/assets/frappe-ui-DzKBfka9.css">
|
||||
<link rel="stylesheet" crossorigin href="/assets/lms/frontend/assets/index-DCVPIR2L.css">
|
||||
<link rel="stylesheet" crossorigin href="/assets/lms/frontend/assets/index-Dhpy-T0p.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="app">
|
||||
|
||||
Reference in New Issue
Block a user