added table of co-worker

This commit is contained in:
2026-08-16 20:27:13 +03:30
parent 609f6b2fa3
commit f192d3e171
3 changed files with 17 additions and 58 deletions
@@ -179,16 +179,10 @@ export const SYSTEM_SETTING_GROUPS: SettingGroupDef[] = [
title: 'دسترسی مشتری به قابلیت‌ها', title: 'دسترسی مشتری به قابلیت‌ها',
icon: 'vuesax-linear:people', icon: 'vuesax-linear:people',
match: (k) => match: (k) =>
/^(enable_conditional_order|enable_product_funds|has_page_price_trigger|has_page_notification|has_page_gift_card|enable_customer_level_profit|banner_enabled|jibit_enabled|customer_direct_sms|has_page_earn_money|tracking_systems_enabled|permision__enabled|show_to_users_chat)$/.test( /^(enable_conditional_order|enable_product_funds|has_page_price_trigger|has_page_notification|has_page_gift_card|enable_customer_level_profit|banner_enabled|jibit_enabled|customer_direct_sms|has_page_earn_money|group_sms|tracking_systems_enabled|permision__enabled|show_to_users_chat)$/.test(
k k
) )
}, },
{
id: 'limits',
title: 'محدودیت‌ها',
icon: 'vuesax-linear:lock',
match: (k) => k === 'group_sms'
},
{ {
id: 'support_chat', id: 'support_chat',
title: 'چت پشتیبانی', title: 'چت پشتیبانی',
@@ -1,7 +1,7 @@
<template> <template>
<a-form :model="form" ref="formRef" autocomplete="off"> <a-form :model="form" ref="formRef" autocomplete="off">
<div class="space-y-3 md:grid md:grid-cols-4 md:gap-2 md:space-y-0"> <div class="space-y-3 md:grid md:grid-cols-4 md:gap-2 md:space-y-0">
<a-form-item label="انتخاب گروه"> <a-form-item label="انتخاب گروه" class="md:col-span-4">
<BasicSelect <BasicSelect
v-model:value="selectedGroup" v-model:value="selectedGroup"
:items="groupItems" :items="groupItems"
@@ -12,23 +12,6 @@
/> />
</a-form-item> </a-form-item>
<a-form-item label="شماره های تکی" name="numbers" class="md:col-span-3">
<BasicSelect
v-model:value="form.single"
mode="tags"
valueName="name"
keyName="mobile"
type="tel"
noData="لطفا شماره موبایل را وارد کنید و سپس روی کیبورد خود کلید تایید را بزنید"
class="w-full sms-selector"
>
<template #notFoundContent>
<a-spin v-if="loading" size="small" />
<div v-else class="w-full text-center font-bold">لطفا شماره را وارد کنید</div>
</template>
</BasicSelect>
</a-form-item>
<a-form-item label="انتخاب کاربر" class="md:col-span-4 mb-0"> <a-form-item label="انتخاب کاربر" class="md:col-span-4 mb-0">
<BasicInput <BasicInput
place-holder="جستجو" place-holder="جستجو"
@@ -42,13 +25,13 @@
rowKey="mobile" rowKey="mobile"
:row-selection="{ selectedRowKeys: form.numbers, onChange: onSelectChange }" :row-selection="{ selectedRowKeys: form.numbers, onChange: onSelectChange }"
:columns="columns" :columns="columns"
:scroll="{ y: 280, x: 500 }" :scroll="{ y: '20vh', x: 500 }"
:pagination="false" :pagination="false"
:data-source="groupNumbers" :data-source="groupNumbers"
/> />
<div <div
class="md:hidden max-h-64 overflow-y-auto rounded-xl border border-gray-200 bg-gray-50 p-2 space-y-1" class="md:hidden max-h-48 overflow-y-auto rounded-xl border border-gray-200 bg-gray-50 p-2 space-y-1"
> >
<div v-if="customersLoading" class="flex justify-center py-6"> <div v-if="customersLoading" class="flex justify-center py-6">
<a-spin size="small" /> <a-spin size="small" />
@@ -131,6 +114,7 @@ async function loadGroupNumbers(val: string[]) {
if (!val.length) { if (!val.length) {
groupNumbers.value = [] groupNumbers.value = []
baseGroupNumbers = [] baseGroupNumbers = []
props.form.numbers = []
return return
} }
@@ -139,6 +123,9 @@ async function loadGroupNumbers(val: string[]) {
const { customers } = await getCustomerList(val) const { customers } = await getCustomerList(val)
groupNumbers.value = customers groupNumbers.value = customers
baseGroupNumbers = customers baseGroupNumbers = customers
// فقط شماره‌های همین لیست مشتری بمانند
const allowed = new Set(customers.map((c) => c.mobile).filter(Boolean) as string[])
props.form.numbers = (props.form.numbers ?? []).filter((n) => allowed.has(n))
} catch (e) { } catch (e) {
console.error(e) console.error(e)
} finally { } finally {
@@ -147,7 +134,8 @@ async function loadGroupNumbers(val: string[]) {
} }
function onSelectChange(changableRowKeys: string[]) { function onSelectChange(changableRowKeys: string[]) {
props.form.numbers = changableRowKeys const allowed = new Set(baseGroupNumbers.map((c) => c.mobile).filter(Boolean) as string[])
props.form.numbers = changableRowKeys.filter((n) => allowed.has(n))
} }
function isSelected(mobile?: string) { function isSelected(mobile?: string) {
@@ -157,6 +145,7 @@ function isSelected(mobile?: string) {
function toggleCustomer(mobile: string | undefined, checked: boolean) { function toggleCustomer(mobile: string | undefined, checked: boolean) {
if (!mobile) return if (!mobile) return
if (!baseGroupNumbers.some((c) => c.mobile === mobile)) return
const numbers = new Set(props.form.numbers ?? []) const numbers = new Set(props.form.numbers ?? [])
if (checked) numbers.add(mobile) if (checked) numbers.add(mobile)
else numbers.delete(mobile) else numbers.delete(mobile)
@@ -172,6 +161,7 @@ function resetAll() {
selectedGroup.value = [] selectedGroup.value = []
groupNumbers.value = [] groupNumbers.value = []
baseGroupNumbers = [] baseGroupNumbers = []
props.form.numbers = []
} }
defineExpose({ defineExpose({
@@ -179,16 +169,3 @@ defineExpose({
resetAll resetAll
}) })
</script> </script>
<style scoped>
.sms-selector :deep(.ant-select-selector) {
max-height: 5vh;
overflow-y: auto;
}
@media (max-width: 767px) {
.sms-selector :deep(.ant-select-selector) {
max-height: 12vh;
}
}
</style>
+5 -17
View File
@@ -28,9 +28,7 @@
show-icon show-icon
message="ارسال ۱۰تایی انجام می‌شود. تا پایان کار پنل را نبندید و صفحه را رفرش نکنید." message="ارسال ۱۰تایی انجام می‌شود. تا پایان کار پنل را نبندید و صفحه را رفرش نکنید."
/> />
<div class="sms-editor-scroll"> <SmsEditorFormBody ref="smsEditorRef" :form="form" :group-items="groupItems" :loading="loading" />
<SmsEditorFormBody ref="smsEditorRef" :form="form" :group-items="groupItems" :loading="loading" />
</div>
</BasicActionSheet> </BasicActionSheet>
</div> </div>
</template> </template>
@@ -60,8 +58,7 @@ const sendStore = useGroupSmsSendStore()
const form = ref<Sms>({ const form = ref<Sms>({
message: '', message: '',
numbers: [], numbers: []
single: []
}) })
const addSMSVisible = ref<boolean>(false) const addSMSVisible = ref<boolean>(false)
@@ -115,8 +112,7 @@ async function add() {
function resetData() { function resetData() {
form.value = { form.value = {
message: '', message: '',
numbers: [], numbers: []
single: []
} }
smsEditorRef.value?.resetAll?.() smsEditorRef.value?.resetAll?.()
} }
@@ -132,9 +128,9 @@ function ok() {
} }
smsEditorRef.value?.validateFields?.().then(async () => { smsEditorRef.value?.validateFields?.().then(async () => {
const numbers = uniqueNumbers([...(form.value.numbers ?? []), ...(form.value.single ?? [])]) const numbers = uniqueNumbers([...(form.value.numbers ?? [])])
if (!numbers.length) { if (!numbers.length) {
message.warning('حداقل یک شماره انتخاب کنید') message.warning('حداقل یک مشتری از لیست انتخاب کنید')
return return
} }
if (!form.value.message?.trim()) { if (!form.value.message?.trim()) {
@@ -149,11 +145,3 @@ function ok() {
}) })
} }
</script> </script>
<style scoped>
.sms-editor-scroll {
max-height: min(62vh, 560px);
overflow-y: auto;
padding-inline-end: 4px;
}
</style>