Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
8ccffb9
feat(subscription):
alireza013013 Jul 23, 2026
fd606aa
feat(subscription):
alireza013013 Jul 23, 2026
7fb25db
feat(subscription): add admin subscription price management functiona…
alireza013013 Jul 23, 2026
67a6937
feat(subscription): add admin subscription gateway mapping functional…
alireza013013 Jul 23, 2026
3c0dc7d
fix(api composable): remove getItemById from feature,gateway,price
alireza013013 Jul 23, 2026
0fd5a30
feat(subscription):
alireza013013 Jul 23, 2026
71b6cb5
feat(subscription):
alireza013013 Jul 24, 2026
8d9809d
feat(subscription):
alireza013013 Jul 24, 2026
30cf149
feat(subscription):
alireza013013 Jul 24, 2026
9aca0ec
feat(subscription): - complete gateway tab and get data show in table
alireza013013 Jul 25, 2026
35ea26f
Merge branch 'upgrade-v4' of https://github.com/GamaEdtech/gamatrain-…
alireza013013 Jul 25, 2026
7c1773e
refactor(subscription): replace custom error handling with centralize…
alireza013013 Jul 25, 2026
081b9c7
Merge branch 'upgrade-v4' of https://github.com/GamaEdtech/gamatrain-…
alireza013013 Aug 2, 2026
4049dac
Merge branch 'upgrade-v4' of https://github.com/GamaEdtech/gamatrain-…
alireza013013 Aug 2, 2026
8ec1c19
refactor(subscription): move all these refs inside the exported comp…
alireza013013 Aug 2, 2026
29b82a1
feat(subscription): implement feature codes retrieval and update form…
alireza013013 Aug 2, 2026
346c97c
fix(admin layout): change group Subscription in menu
alireza013013 Aug 2, 2026
eeaa8f7
feat(subscription): add unlimited limit option for features and updat…
alireza013013 Aug 2, 2026
6631476
Merge branch 'upgrade-v4' of https://github.com/GamaEdtech/gamatrain-…
alireza013013 Aug 2, 2026
e08cddb
fix(features): update limit display logic to handle null values
alireza013013 Aug 3, 2026
09298c5
fix(admin subscription):
alireza013013 Aug 3, 2026
d4cdb0f
feat(subscription price): allow null country code and add worldwide o…
alireza013013 Aug 4, 2026
1cdf3c8
feat(feature plan):
alireza013013 Aug 4, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions app/components/admin/subscription/features/add.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<template>
<admin-subscription-features-form
mode="add"
:loading="loadingAddItem"
@submit="add"
/>
</template>

<script setup lang="ts">
import type { AddAdminSubscriptionFeatureDTO } from '@/types'

const emit = defineEmits(['AddItemSuccessFull'])
const { addItem, loadingAddItem } = useSubscriptionFeatureAdmin()

const add = async (payload: AddAdminSubscriptionFeatureDTO) => {
const response = await addItem(payload)

if (response.succeeded) {
emit('AddItemSuccessFull')
}
}
</script>
31 changes: 31 additions & 0 deletions app/components/admin/subscription/features/detail.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<template>
<admin-subscription-features-form
mode="edit"
:initial-value="item"
:loading="loadingEditItem"
@submit="edit"
/>
</template>

<script setup lang="ts">
import type {
AddAdminSubscriptionFeatureDTO,
AdminSubscriptionFeatureDTO,
} from '@/types'

interface DetailProps {
item: AdminSubscriptionFeatureDTO
}

const props = defineProps<DetailProps>()
const emit = defineEmits(['EditItemSuccessFull'])
const { editItem, loadingEditItem } = useSubscriptionFeatureAdmin()

const edit = async (payload: AddAdminSubscriptionFeatureDTO) => {
const response = await editItem(payload, props.item.id)

if (response.succeeded) {
emit('EditItemSuccessFull')
}
}
</script>
166 changes: 166 additions & 0 deletions app/components/admin/subscription/features/form.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
<template>
<div class="w-100 d-flex flex-column pa-4">
<v-form
v-model="isFormValid"
class="w-100 d-flex flex-column align-start ga-2"
>
<div class="w-100 d-flex flex-column align-start justify-start ga-1">
<common-gombo-box
v-model="form.code"
label="Code"
:items="featurCodes.map((item) => ({
id: item,
title: item,
}))"
:data-loading="loadingGetFeatureCodes"
rounded="lg"
density="compact"
base-color="grey200"
color="primary"
:defalut-lable="false"
:rules="[required]"
/>
</div>

<div class="w-100 d-flex flex-column align-start justify-start ga-1">
<div class="text-h6 text-grey700 ml-2">
Name
</div>
<v-text-field
v-model="form.name"
rounded="lg"
density="compact"
placeholder="Name"
variant="outlined"
autocomplete="off"
persistent-clear
base-color="grey200"
color="primary"
active-color="primary"
bg-color="white"
class="w-100"
:rules="[required]"
/>
</div>

<div class="w-100 d-flex flex-column align-start justify-start ga-1">
<div class="text-h6 text-grey700 ml-2">
Description
</div>
<v-textarea
v-model="form.description"
rounded="lg"
density="compact"
placeholder="Description"
variant="outlined"
autocomplete="off"
persistent-clear
base-color="grey200"
color="primary"
active-color="primary"
bg-color="white"
class="w-100"
rows="3"
auto-grow
:rules="[required]"
/>
</div>

<div class="w-100 d-flex flex-column align-start justify-start ga-1">
<v-checkbox
v-model="form.isActive"
color="primary"
class="text-h4"
hide-details
false-icon="md:check_box_outline_blank"
true-icon="md:check_box"
>
<template #label>
<span class="text-h6 text-grey700 text-no-wrap ml-2">Is Active</span>
</template>
</v-checkbox>
</div>
</v-form>

<v-btn
color="success"
rounded="xl"
variant="outlined"
height="40"
width="200"
class="text-h5 mt-8 mx-auto"
:loading="loading"
:disabled="!isFormValid || loading"
flat
@click="submit"
>
{{ mode === 'add' ? 'Add' : 'Edit' }}
</v-btn>
</div>
</template>

<script setup lang="ts">
import type {
AddAdminSubscriptionFeatureDTO,
AdminSubscriptionFeatureDTO,
} from '@/types'

interface FeatureFormProps {
mode: 'add' | 'edit'
initialValue?: AdminSubscriptionFeatureDTO | null
loading?: boolean
}

const props = withDefaults(defineProps<FeatureFormProps>(), {
initialValue: null,
loading: false,
})

const emit = defineEmits<{
submit: [payload: AddAdminSubscriptionFeatureDTO]
}>()

const { required } = useValidationRules()
const { featurCodes,
loadingGetFeatureCodes,
getFeatureCodes } = useSubscriptionFeatureAdmin()

const form = reactive<AddAdminSubscriptionFeatureDTO>({
code: '',
name: '',
description: '',
isActive: true,
})

const isFormValid = ref(false)

const fillForm = (value: AdminSubscriptionFeatureDTO | null) => {
if (!value) return

form.code = value.code
form.name = value.name
form.description = value.description
form.isActive = value.isActive
}

watch(
() => props.initialValue,
value => fillForm(value),
{ immediate: true },
)

const submit = () => {
if (!isFormValid.value) return

emit('submit', {
code: form.code,
name: form.name,
description: form.description,
isActive: form.isActive,
})
}

onMounted(() => {
getFeatureCodes()
})
</script>
Loading