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>
|
</h2>
|
||||||
<div class="grid grid-cols-5 gap-4">
|
<div class="grid grid-cols-5 gap-4">
|
||||||
<div v-if="badges.data" v-for="badge in badges.data">
|
<div v-if="badges.data" v-for="badge in badges.data">
|
||||||
<Popover trigger="hover" hoverDelay="0.0">
|
<Popover trigger="hover">
|
||||||
<template #target>
|
<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>
|
||||||
<template #body-main>
|
<template #body-main>
|
||||||
<div class="w-[250px] text-base">
|
<div class="w-[250px] text-base">
|
||||||
@@ -20,7 +34,7 @@
|
|||||||
<div class="text-2xl font-semibold mb-2">
|
<div class="text-2xl font-semibold mb-2">
|
||||||
{{ badge.badge }}
|
{{ badge.badge }}
|
||||||
</div>
|
</div>
|
||||||
<div class="mb-4">
|
<div class="leading-5 mb-4">
|
||||||
{{ badge.badge_description }}
|
{{ badge.badge_description }}
|
||||||
</div>
|
</div>
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
@@ -39,8 +53,8 @@
|
|||||||
</template>
|
</template>
|
||||||
<script setup>
|
<script setup>
|
||||||
import { createResource, Popover } from 'frappe-ui'
|
import { createResource, Popover } from 'frappe-ui'
|
||||||
import BadgePopover from '@/components/BadgePopover.vue'
|
|
||||||
import { inject } from 'vue'
|
import { inject } from 'vue'
|
||||||
|
import { X } from 'lucide-vue-next'
|
||||||
|
|
||||||
const dayjs = inject('$dayjs')
|
const dayjs = inject('$dayjs')
|
||||||
|
|
||||||
@@ -61,5 +75,15 @@ const badges = createResource({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
auto: true,
|
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>
|
</script>
|
||||||
|
|||||||
@@ -1,8 +1,26 @@
|
|||||||
// Copyright (c) 2024, Frappe and contributors
|
// Copyright (c) 2024, Frappe and contributors
|
||||||
// For license information, please see license.txt
|
// For license information, please see license.txt
|
||||||
|
|
||||||
// frappe.ui.form.on("LMS Badge", {
|
frappe.ui.form.on("LMS Badge", {
|
||||||
// refresh(frm) {
|
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,
|
"index_web_pages_for_search": 1,
|
||||||
"links": [],
|
"links": [
|
||||||
"modified": "2024-04-30 17:16:17.725459",
|
{
|
||||||
|
"link_doctype": "LMS Badge Assignment",
|
||||||
|
"link_fieldname": "badge"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"modified": "2024-05-02 14:23:32.198858",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "LMS",
|
"module": "LMS",
|
||||||
"name": "LMS Badge",
|
"name": "LMS Badge",
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ class LMSBadge(Document):
|
|||||||
if self.grant_only_once:
|
if self.grant_only_once:
|
||||||
if frappe.db.exists(
|
if frappe.db.exists(
|
||||||
"LMS Badge Assignment",
|
"LMS Badge Assignment",
|
||||||
{"badge": self.name, "user": frappe.session.user},
|
{"badge": self.name, "member": frappe.session.user},
|
||||||
):
|
):
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ class LMSBadge(Document):
|
|||||||
assignment.update(
|
assignment.update(
|
||||||
{
|
{
|
||||||
"badge": self.name,
|
"badge": self.name,
|
||||||
"user": frappe.session.user,
|
"member": frappe.session.user,
|
||||||
"issued_on": frappe.utils.now(),
|
"issued_on": frappe.utils.now(),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -161,6 +161,7 @@ def get_lesson_details(chapter):
|
|||||||
)
|
)
|
||||||
lesson_details.number = f"{chapter.idx}.{row.idx}"
|
lesson_details.number = f"{chapter.idx}.{row.idx}"
|
||||||
lesson_details.icon = get_lesson_icon(lesson_details.body)
|
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)
|
lessons.append(lesson_details)
|
||||||
return lessons
|
return lessons
|
||||||
|
|
||||||
|
|||||||
@@ -15,10 +15,10 @@
|
|||||||
<meta name="twitter:title" content="{{ meta.title }}" />
|
<meta name="twitter:title" content="{{ meta.title }}" />
|
||||||
<meta name="twitter:image" content="{{ meta.image }}" />
|
<meta name="twitter:image" content="{{ meta.image }}" />
|
||||||
<meta name="twitter:description" content="{{ meta.description }}" />
|
<meta name="twitter:description" content="{{ meta.description }}" />
|
||||||
<script type="module" crossorigin src="/assets/lms/frontend/assets/index-BIja_89l.js"></script>
|
<script type="module" crossorigin src="/assets/lms/frontend/assets/index-CushEWOj.js"></script>
|
||||||
<link rel="modulepreload" crossorigin href="/assets/lms/frontend/assets/frappe-ui-Ccuocnz7.js">
|
<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/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>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="app">
|
<div id="app">
|
||||||
|
|||||||
Reference in New Issue
Block a user