feat: category in settings
This commit is contained in:
102
frontend/src/components/Categories.vue
Normal file
102
frontend/src/components/Categories.vue
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
<template>
|
||||||
|
<div class="flex flex-col min-h-0">
|
||||||
|
<div class="flex items-center justify-between">
|
||||||
|
<div class="text-xl font-semibold mb-1">
|
||||||
|
{{ label }}
|
||||||
|
</div>
|
||||||
|
<Button @click="() => showCategoryForm()">
|
||||||
|
<template #icon>
|
||||||
|
<Plus v-if="!showForm" class="h-3 w-3 stroke-1.5" />
|
||||||
|
<X v-else class="h-3 w-3 stroke-1.5" />
|
||||||
|
</template>
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
v-if="showForm"
|
||||||
|
class="flex items-center justify-between my-4 space-x-2"
|
||||||
|
>
|
||||||
|
<FormControl
|
||||||
|
ref="categoryInput"
|
||||||
|
v-model="category"
|
||||||
|
:placeholder="__('Category Name')"
|
||||||
|
class="flex-1"
|
||||||
|
/>
|
||||||
|
<Button @click="addCategory()" variant="subtle">
|
||||||
|
{{ __('Add') }}
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="overflow-y-scroll">
|
||||||
|
<div class="text-base divide-y">
|
||||||
|
<FormControl
|
||||||
|
:value="cat.name"
|
||||||
|
v-for="cat in categories.data"
|
||||||
|
class="py-3"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import {
|
||||||
|
Button,
|
||||||
|
FormControl,
|
||||||
|
createListResource,
|
||||||
|
createResource,
|
||||||
|
} from 'frappe-ui'
|
||||||
|
import { Plus, X } from 'lucide-vue-next'
|
||||||
|
import { ref } from 'vue'
|
||||||
|
|
||||||
|
const showForm = ref(false)
|
||||||
|
const category = ref(null)
|
||||||
|
const categoryInput = ref(null)
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
label: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
const categories = createListResource({
|
||||||
|
doctype: 'LMS Category',
|
||||||
|
fields: ['name', 'category'],
|
||||||
|
auto: true,
|
||||||
|
})
|
||||||
|
|
||||||
|
const newCategory = createResource({
|
||||||
|
url: 'frappe.client.insert',
|
||||||
|
makeParams(values) {
|
||||||
|
return {
|
||||||
|
doc: {
|
||||||
|
doctype: 'LMS Category',
|
||||||
|
category: category.value,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
const addCategory = () => {
|
||||||
|
newCategory.submit(
|
||||||
|
{},
|
||||||
|
{
|
||||||
|
onSuccess(data) {
|
||||||
|
categories.reload()
|
||||||
|
category.value = null
|
||||||
|
},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
const showCategoryForm = () => {
|
||||||
|
showForm.value = !showForm.value
|
||||||
|
setTimeout(() => {
|
||||||
|
categoryInput.value.$el.querySelector('input').focus()
|
||||||
|
}, 0)
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@@ -38,6 +38,11 @@
|
|||||||
:description="activeTab.description"
|
:description="activeTab.description"
|
||||||
v-model:show="show"
|
v-model:show="show"
|
||||||
/>
|
/>
|
||||||
|
<Categories
|
||||||
|
v-else-if="activeTab.label === 'Categories'"
|
||||||
|
:label="activeTab.label"
|
||||||
|
:description="activeTab.description"
|
||||||
|
/>
|
||||||
<SettingDetails
|
<SettingDetails
|
||||||
v-else
|
v-else
|
||||||
:fields="activeTab.fields"
|
:fields="activeTab.fields"
|
||||||
@@ -56,6 +61,7 @@ import { ref, computed, watch } from 'vue'
|
|||||||
import SettingDetails from '../SettingDetails.vue'
|
import SettingDetails from '../SettingDetails.vue'
|
||||||
import SidebarLink from '@/components/SidebarLink.vue'
|
import SidebarLink from '@/components/SidebarLink.vue'
|
||||||
import Members from '@/components/Members.vue'
|
import Members from '@/components/Members.vue'
|
||||||
|
import Categories from '../Categories.vue'
|
||||||
|
|
||||||
const show = defineModel()
|
const show = defineModel()
|
||||||
const doctype = ref('LMS Settings')
|
const doctype = ref('LMS Settings')
|
||||||
@@ -80,6 +86,11 @@ const tabs = computed(() => {
|
|||||||
description: 'Manage the members of your learning system',
|
description: 'Manage the members of your learning system',
|
||||||
icon: 'UserRoundPlus',
|
icon: 'UserRoundPlus',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: 'Categories',
|
||||||
|
description: 'Manage the members of your learning system',
|
||||||
|
icon: 'Network',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
label: 'Payment Gateway',
|
label: 'Payment Gateway',
|
||||||
icon: 'DollarSign',
|
icon: 'DollarSign',
|
||||||
|
|||||||
@@ -8,12 +8,12 @@
|
|||||||
:items="[{ label: __('Batches'), route: { name: 'Batches' } }]"
|
:items="[{ label: __('Batches'), route: { name: 'Batches' } }]"
|
||||||
/>
|
/>
|
||||||
<div class="flex space-x-2">
|
<div class="flex space-x-2">
|
||||||
<div class="w-40">
|
<div class="w-44">
|
||||||
<Select
|
<Select
|
||||||
v-if="categories.data?.length"
|
v-if="categories.data?.length"
|
||||||
v-model="currentCategory"
|
v-model="currentCategory"
|
||||||
:options="categories.data"
|
:options="categories.data"
|
||||||
:placeholder="__('Filter')"
|
:placeholder="__('Category')"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<router-link
|
<router-link
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
51
lms/fixtures/lms_category.json
Normal file
51
lms/fixtures/lms_category.json
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"category": "Web Development",
|
||||||
|
"docstatus": 0,
|
||||||
|
"doctype": "LMS Category",
|
||||||
|
"modified": "2024-09-20 12:58:16.841571",
|
||||||
|
"name": "Web Development"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": "Business",
|
||||||
|
"docstatus": 0,
|
||||||
|
"doctype": "LMS Category",
|
||||||
|
"modified": "2024-09-20 12:58:32.304850",
|
||||||
|
"name": "Business"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": "Design",
|
||||||
|
"docstatus": 0,
|
||||||
|
"doctype": "LMS Category",
|
||||||
|
"modified": "2024-09-20 12:59:12.621022",
|
||||||
|
"name": "Design"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": "Personal Development",
|
||||||
|
"docstatus": 0,
|
||||||
|
"doctype": "LMS Category",
|
||||||
|
"modified": "2024-09-20 12:59:19.287404",
|
||||||
|
"name": "Personal Development"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": "Finance",
|
||||||
|
"docstatus": 0,
|
||||||
|
"doctype": "LMS Category",
|
||||||
|
"modified": "2024-09-20 12:58:28.579714",
|
||||||
|
"name": "Finance"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": "Frontend",
|
||||||
|
"docstatus": 0,
|
||||||
|
"doctype": "LMS Category",
|
||||||
|
"modified": "2024-05-08 14:05:16.979275",
|
||||||
|
"name": "Frontend"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": "Framework",
|
||||||
|
"docstatus": 0,
|
||||||
|
"doctype": "LMS Category",
|
||||||
|
"modified": "2023-06-15 18:01:41.598282",
|
||||||
|
"name": "Framework"
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -115,7 +115,7 @@ scheduler_events = {
|
|||||||
"daily": ["lms.job.doctype.job_opportunity.job_opportunity.update_job_openings"],
|
"daily": ["lms.job.doctype.job_opportunity.job_opportunity.update_job_openings"],
|
||||||
}
|
}
|
||||||
|
|
||||||
fixtures = ["Custom Field", "Function", "Industry"]
|
fixtures = ["Custom Field", "Function", "Industry", "LMS Category"]
|
||||||
|
|
||||||
# Testing
|
# Testing
|
||||||
# -------
|
# -------
|
||||||
|
|||||||
Reference in New Issue
Block a user