@jname/vue-mobile-components
Version:
基于 Vue 3 + Vant 4 的移动端组件库
1 lines • 54.6 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../src/contentCard/index.vue","../src/imgUploader/index.vue","../src/hooks/useRefreshList.ts","../src/organization/composables/useOrganizationActions.ts","../src/organization/api.ts","../src/organization/composables/useOrganizationApi.ts","../src/organization/composables/useOrganizationState.ts","../src/organization/index.vue","../src/pullToRefreshList/index.vue","../src/stepsCard/index.vue","../src/tabs/index.vue","../src/index.ts"],"sourcesContent":["<template>\n <div class=\"jname-content-card\">\n <!-- 左侧内容 -->\n <div class=\"jname-content-card__content\">\n <!-- 标题 -->\n <div class=\"jname-content-card__title\">\n {{ title }}\n </div>\n\n <!-- 描述 -->\n <div v-if=\"desc\" class=\"jname-content-card__description\">\n {{ desc }}\n </div>\n\n <!-- 多图模式 -->\n <div\n v-if=\"displayMode === 'multi'\"\n class=\"jname-content-card__images\"\n >\n <Image\n v-for=\"(image, index) in images.slice(0, maxImages)\"\n :key=\"index\"\n :src=\"image\"\n fit=\"cover\"\n lazy-load\n radius=\"10\"\n class=\"jname-content-card__image\"\n />\n </div>\n\n <!-- 元信息 -->\n <div\n v-if=\"$slots.meta || meta?.tagText || meta?.timeText\"\n class=\"jname-content-card__meta\"\n >\n <!-- 元信息插槽 -->\n <slot name=\"meta\">\n <div\n v-if=\"meta?.tagText\"\n class=\"jname-content-card__tag\"\n :class=\"`jname-content-card__tag--${meta?.tagStatus || 'info'}`\"\n >\n {{ meta.tagText }}\n </div>\n <div v-if=\"meta?.timeText\" class=\"jname-content-card__time\">\n <Icon name=\"clock-o\" size=\"16\" />\n {{ meta.timeText }}\n </div>\n </slot>\n </div>\n </div>\n\n <!-- 右侧单图 -->\n <Image\n v-if=\"displayMode === 'single'\"\n :src=\"images[0]\"\n fit=\"cover\"\n lazy-load\n radius=\"10\"\n class=\"jname-content-card__image-single\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { ContentCardProps } from './types';\nimport { Icon, Image } from 'vant';\nimport { computed } from 'vue';\n\ndefineOptions({\n name: 'JContentCard'\n});\n\nconst props = withDefaults(defineProps<ContentCardProps>(), {\n maxImages: 3\n});\n\n// 根据图片数量自动判断显示模式\nconst displayMode = computed(() => {\n if (!props.images?.length) return 'text';\n if (props.images.length === 1) return 'single';\n return 'multi';\n});\n</script>\n\n<style lang=\"less\" scoped>\n@import './index.less';\n</style>\n","<template>\n <Uploader\n v-model=\"innerFileList\"\n v-bind=\"$attrs\"\n :max-count=\"maxCount\"\n :max-size=\"maxSize\"\n :multiple=\"multiple\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :deletable=\"deletable\"\n :before-read=\"handleBeforeRead\"\n @oversize=\"$emit('oversize', $event)\"\n @delete=\"handleDelete\"\n @click-preview=\"handlePreview\"\n >\n <!-- 传递预览覆盖插槽 -->\n <template #preview-cover=\"{ file, index }\">\n <slot name=\"preview-cover\" :file=\"file\" :index=\"index\" />\n </template>\n\n <!-- 传递其他所有插槽 -->\n <template v-for=\"name in computedSlots\" :key=\"name\" #[name]=\"slotData\">\n <slot :name=\"name\" v-bind=\"slotData || {}\" />\n </template>\n </Uploader>\n\n <!-- 错误信息 -->\n <div v-if=\"errorMsg\" class=\"jname-upload-error\">\n {{ errorMsg }}\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { ImagePreviewOptions, UploaderFileListItem } from 'vant';\nimport type { UploaderProps } from './types';\nimport { showImagePreview, showToast, Uploader } from 'vant';\nimport { computed, ref, useSlots, watch } from 'vue';\n\ndefineOptions({\n name: 'JImgUploader'\n});\n\n// 定义默认属性值\nconst props = withDefaults(defineProps<UploaderProps>(), {\n multiple: false,\n maxCount: Infinity,\n maxSize: Infinity,\n formats: () => ['jpg', 'jpeg', 'png', 'gif', 'webp'],\n deletable: true,\n disabled: false,\n readonly: false,\n preview: true,\n uploadText: '上传图片',\n previewOptions: () => ({}),\n formatErrorMsg: '',\n compression: () => ({ enabled: false })\n});\n\n// 定义事件\nconst emit = defineEmits([\n 'update:modelValue',\n 'oversize',\n 'delete',\n 'error',\n 'success',\n 'preview'\n]);\n\n// 获取插槽\nconst slots = useSlots();\n\n// 计算可用的插槽,排除已在模板中单独处理的插槽\nconst computedSlots = computed(() => {\n const slotNames = Object.keys(slots);\n return slotNames.filter(name => name !== 'preview-cover');\n});\n\n// 内部状态\nconst innerFileList = ref<UploaderFileListItem[]>([]);\nconst errorMsg = ref('');\n\n// 格式化错误信息\nconst formattedFormatErrorMsg = computed(() => {\n if (props.formatErrorMsg) return props.formatErrorMsg;\n return `文件格式不正确,请上传${props.formats.join('/')}格式的图片`;\n});\n\n// 将字符串数组转换为文件列表对象数组\nconst convertToFileList = (value: (string | UploaderFileListItem)[]) => {\n return value.map((item) => {\n if (typeof item === 'string') {\n return { url: item };\n }\n return item;\n });\n};\n\n// 监听modelValue变化\nwatch(\n () => props.modelValue,\n (newVal) => {\n innerFileList.value = convertToFileList(newVal);\n },\n { immediate: true, deep: true }\n);\n\n// 监听内部文件列表变化,同步到父组件\nwatch(\n innerFileList,\n (newVal) => {\n // 避免循环更新:只在值真正不同时才emit\n const currentModelValue = convertToFileList(props.modelValue);\n if (JSON.stringify(newVal) !== JSON.stringify(currentModelValue)) {\n emit('update:modelValue', newVal);\n }\n },\n { deep: true }\n);\n\n/**\n * 压缩单个图片文件\n * @param file 原始文件\n * @returns Promise<File> 压缩后的文件\n */\nconst compressImage = async (file: File): Promise<File> => {\n try {\n // 动态导入 compressorjs,只有在需要时才加载\n const { default: Compressor } = await import('compressorjs');\n // 默认压缩选项\n const defaultOptions = {\n quality: 0.8,\n maxWidth: 1920,\n maxHeight: 1920,\n convertSize: 1000000 // 1MB以上才转换格式\n };\n\n // 合并用户配置和默认配置\n const options = { ...defaultOptions, ...props.compression };\n\n return new Promise<File>((resolve) => {\n new Compressor(file, {\n ...options,\n success: (compressedFile) => {\n resolve(compressedFile as File);\n },\n error: (err) => {\n console.warn('图片压缩失败,使用原图:', err);\n resolve(file); // 压缩失败时使用原图\n }\n });\n });\n } catch (error) {\n // 如果 compressorjs 未安装,给出友好的错误提示\n console.error('压缩功能需要安装 compressorjs 依赖包。请运行: npm install compressorjs 或 pnpm add compressorjs');\n console.warn('compressorjs 未找到,使用原图:', error);\n return file; // 无法压缩时使用原图\n }\n};\n\n/**\n * 在读取文件前验证格式和压缩\n * @param file 文件对象\n * @returns 验证结果和处理后的文件\n */\nconst handleBeforeRead = async (file: File | File[]) => {\n errorMsg.value = '';\n const files = Array.isArray(file) ? file : [file];\n\n // 验证文件格式\n for (const file of files) {\n // 获取文件扩展名\n const extension = file.name.split('.').pop()?.toLowerCase() || '';\n\n if (!props.formats.includes(extension)) {\n errorMsg.value = formattedFormatErrorMsg.value;\n showToast(errorMsg.value);\n emit('error', { file, message: errorMsg.value });\n return;\n }\n }\n\n if (props.compression?.enabled) {\n const compressedFiles = await Promise.all(files.map(compressImage));\n emit('success', compressedFiles.length === 1 ? compressedFiles[0] : compressedFiles);\n return compressedFiles.length === 1 ? compressedFiles[0] : compressedFiles;\n }\n\n emit('success', files.length === 1 ? files[0] : files);\n return files.length === 1 ? files[0] : files;\n};\n\n/**\n * 处理文件删除\n * @param file 被删除的文件\n * @param detail 删除的详细信息\n * @param detail.index 被删除文件的索引\n */\nconst handleDelete = (file: UploaderFileListItem, detail: { index: number }) => {\n emit('delete', file, detail);\n};\n\n/**\n * 处理图片预览\n * @param file 被预览的文件\n * @param detail 预览的详细信息\n * @param detail.index 被预览文件的索引\n */\nconst handlePreview = (file: UploaderFileListItem, detail: { index: number }) => {\n if (!props.preview) return;\n\n // 获取所有预览图片URL\n const images = innerFileList.value.map(item => item.url || '');\n\n // 合并默认预览选项和用户自定义选项\n const options: ImagePreviewOptions = {\n images,\n startPosition: detail.index,\n showIndex: true,\n closeable: true,\n showIndicators: images.length > 1,\n // 允许图片旋转\n swipeDuration: 300,\n ...props.previewOptions\n };\n\n // 调用Vant图片预览组件\n showImagePreview(options);\n\n // 触发预览事件\n emit('preview', file, detail);\n};\n\n// 对外暴露方法\ndefineExpose({\n // 清空上传列表\n clear: () => {\n innerFileList.value = [];\n },\n // 手动触发图片预览\n preview: (index = 0) => {\n if (innerFileList.value[index]) {\n handlePreview(innerFileList.value[index], { index });\n }\n }\n});\n</script>\n\n<style scoped lang=\"less\">\n.jname-upload-error {\n margin-top: 8px;\n font-size: 12px;\n color: #ee0a24;\n}\n</style>\n","import type { Ref } from 'vue';\nimport { computed, reactive, ref, unref } from 'vue';\n\nconst useRefreshList = <T extends object>({\n api,\n extraParams = ref({})\n}: {\n api: (params: any) => Promise<{\n data: {\n records: T[];\n total: number;\n };\n }>;\n extraParams?: Ref<Record<string, unknown>>;\n immediate?: boolean;\n}) => {\n const dataSource = ref<T[]>([]);\n // 状态\n const state = reactive({\n finished: false,\n isLoading: false,\n loading: false,\n error: false,\n pageable: {\n pageNum: 1,\n pageSize: 20,\n totalRow: 0\n },\n // 总参数(包含分页和查询参数)\n totalParam: {},\n searchParam: {}\n });\n\n // 分页参数\n const pageParam = computed(() => ({\n pageNum: state.pageable.pageNum,\n pageSize: state.pageable.pageSize\n }));\n\n // 获取列表数据\n const getList = async () => {\n try {\n state.totalParam = {};\n // 使用 unref 确保获取到最新的 extraParams 值,避免响应式更新延迟导致的数据同步问题\n Object.assign(state.totalParam, unref(extraParams), state.searchParam, pageParam.value);\n const { data } = await api(state.totalParam);\n const { records, total } = data;\n state.pageable.totalRow = total;\n\n // 判断是否还有下一页\n const currentPageNum = state.pageable.pageNum;\n const noMoreData = records.length < state.pageable.pageSize || currentPageNum * state.pageable.pageSize >= total;\n\n if (currentPageNum === 1) {\n dataSource.value = records;\n } else {\n dataSource.value = [...dataSource.value, ...records] as T[];\n }\n\n // 设置完成状态\n state.finished = noMoreData;\n\n // 页码递增准备下次请求\n state.pageable.pageNum++;\n\n // 清除错误状态\n state.error = false;\n } catch (err: any) {\n console.error('API Error:', err);\n state.finished = true;\n state.error = true;\n } finally {\n // 完成后重置loading状态\n state.loading = false;\n }\n };\n\n // 上拉加载\n const onLoad = async () => {\n if (state.isLoading) {\n dataSource.value = [];\n state.isLoading = false;\n }\n\n try {\n await getList();\n } finally {\n state.loading = false;\n }\n };\n\n // 下拉刷新\n const onRefresh = async () => {\n state.pageable.pageNum = 1;\n dataSource.value = [];\n state.finished = false;\n state.error = false;\n state.loading = true;\n onLoad();\n };\n\n // 搜索\n const onSearch = (searchParams = {}) => {\n state.searchParam = searchParams;\n\n state.pageable.pageNum = 1;\n dataSource.value = [];\n state.finished = false;\n state.error = false;\n state.loading = true;\n onLoad();\n };\n\n // 重置\n const onReset = () => {\n onSearch({});\n };\n\n return {\n dataSource,\n state,\n onLoad,\n onRefresh,\n onSearch,\n onReset\n };\n};\n\nexport default useRefreshList;\n","import type { Ref } from 'vue';\nimport type { PersonnelItem } from '../types';\nimport { showToast } from 'vant';\nimport { computed, ref } from 'vue';\n\ninterface UseOrganizationActionsOptions {\n multiple?: boolean;\n maxSelected?: number;\n organizationCache: Ref<Map<string, true>>;\n searchState: Ref<{\n xm: string;\n dwh: string;\n }>;\n onRefreshList?: () => void;\n}\n\nconst useOrganizationActions = ({\n multiple = true,\n maxSelected = 10,\n organizationCache,\n searchState,\n onRefreshList\n}: UseOrganizationActionsOptions) => {\n // 选中的人员列表\n const selectedPersonnel = ref<PersonnelItem[]>([]);\n\n // 已选择人员数量\n const selectedCount = computed(() => selectedPersonnel.value.length);\n\n // 处理人员选择/取消选择\n const handlePersonSelection = (person: PersonnelItem) => {\n if (isPersonDisabled(person)) return;\n\n const isAlreadySelected = selectedPersonnel.value.some(selected => selected.id === person.id);\n\n if (isAlreadySelected) {\n // 取消选择该人员\n selectedPersonnel.value = selectedPersonnel.value.filter(selected => selected.id !== person.id);\n } else {\n // 选择该人员\n if (multiple) {\n if (selectedPersonnel.value.length >= maxSelected) {\n showToast(`最多选择${maxSelected}人`);\n return;\n }\n selectedPersonnel.value.push({ ...person, checked: true });\n } else {\n selectedPersonnel.value = [{ ...person, checked: true }];\n }\n }\n };\n\n // 判断人员是否禁用选择\n const isPersonDisabled = (person: PersonnelItem) => {\n if (!multiple && selectedPersonnel.value.length > 0) {\n return !selectedPersonnel.value.some(item => item.id === person.id);\n }\n if (selectedPersonnel.value.length >= maxSelected) {\n return !selectedPersonnel.value.some(item => item.id === person.id);\n }\n return false;\n };\n\n // 处理搜索执行\n const executeSearch = (keyword?: string) => {\n if (keyword !== undefined) {\n searchState.value.xm = keyword;\n }\n if (!searchState.value.xm) {\n organizationCache.value.clear();\n }\n onRefreshList?.();\n };\n\n // 清空所有选中的人员\n const clearAllSelections = () => {\n selectedPersonnel.value = [];\n };\n\n // 同步列表中的选中状态\n const syncListSelectionState = (dataList: PersonnelItem[]) => {\n if (!dataList) return;\n\n dataList.forEach((item: PersonnelItem) => {\n if (!item.isParent) {\n item.checked = selectedPersonnel.value.some(selected => selected.id === item.id);\n }\n });\n };\n\n return {\n selectedCount,\n selectedPersonnel,\n handlePersonSelection,\n executeSearch,\n clearAllSelections,\n isPersonDisabled,\n syncListSelectionState\n };\n};\n\nexport default useOrganizationActions;\n","import type { ApiConfig, Organization, Personnel } from './types';\n\n/**\n * 创建 API 实例\n */\nexport const createOrganizationApi = (config: ApiConfig) => {\n const { baseUrl, getToken } = config;\n\n // 通用fetch请求方法\n const fetchData = async <T>(url: string, params?: Record<string, any>): Promise<{ data: T }> => {\n let fullUrl = `${baseUrl}${url}`;\n\n // 构建查询参数\n if (params) {\n const searchParams = new URLSearchParams();\n Object.keys(params).forEach((key) => {\n const value = params[key];\n if (value !== null && value !== undefined && value !== '') {\n searchParams.append(key, String(value));\n }\n });\n const queryString = searchParams.toString();\n if (queryString) {\n fullUrl += `?${queryString}`;\n }\n }\n\n // 构建请求头\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json'\n };\n\n // 添加认证token\n try {\n const token = getToken();\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n } catch (error) {\n console.warn('获取token失败:', error);\n }\n\n try {\n const response = await fetch(fullUrl, {\n method: 'GET',\n headers\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const data = await response.json();\n return { data: data.data || data };\n } catch (error) {\n console.error('请求失败:', error);\n throw error;\n }\n };\n\n return {\n // 获取组织架构接口\n getOrganizations: () => {\n return fetchData<Organization[]>('/sfzt/select/dept/topNodes');\n },\n\n // 获取人员列表接口\n getPersonnelList: (params: Record<string, any>) => {\n return fetchData<{ list: Personnel[]; total: number }>('/sfzt/select/dept/user/list', params);\n },\n\n // 获取组织架构子节点接口\n getOrganizationsSubNodes: (params: { dwh: string }) => {\n return fetchData<Organization[]>('/sfzt/select/dept/subNodes', params);\n },\n\n // 测试 - 获取区域树\n getAreaTree: () => {\n return fetchData('/school/area/tree');\n }\n };\n};\n","import type { ApiConfig } from '../types';\nimport { ref } from 'vue';\nimport { createOrganizationApi } from '../api';\n\nconst useOrganizationApi = ({\n apiConfig\n}: {\n apiConfig: ApiConfig;\n}) => {\n const api = createOrganizationApi(apiConfig);\n const organizationCatch = ref(new Map<string, true>());\n\n const getOrganizationList = async (params: any) => {\n if (params.xm) {\n return await getPersonnelBySearch(params);\n }\n\n // 获取顶级组织架构\n if (!params.dwh) {\n return await getTopLevelOrganizations();\n }\n\n // 获取子组织架构和人员\n return await getSubOrganizationsAndPersonnel(params);\n };\n\n // 获取顶级组织架构\n const getTopLevelOrganizations = async () => {\n const { data } = await api.getOrganizations();\n\n return {\n data: {\n records: data,\n total: data.length\n }\n };\n };\n\n // 根据搜索条件获取人员\n const getPersonnelBySearch = async (searchParams: Record<string, any>) => {\n const personRecords = await api.getPersonnelList(searchParams);\n\n return {\n data: {\n records: personRecords.data.list || [],\n total: personRecords.data.total\n }\n };\n };\n\n // 获取子组织架构和人员\n const getSubOrganizationsAndPersonnel = async (params: any) => {\n let orgList = [];\n if (!organizationCatch.value.has(params.dwh)) {\n const { data } = await api.getOrganizationsSubNodes(params);\n orgList = data || [];\n organizationCatch.value.set(params.dwh, true);\n }\n\n const { data: personRecords } = await api.getPersonnelList(params);\n const personnelList = personRecords.list || [];\n\n return {\n data: {\n records: [...orgList, ...personnelList],\n total: orgList.length + personRecords.total\n }\n };\n };\n\n return {\n organizationCatch,\n getOrganizationList\n };\n};\n\nexport default useOrganizationApi;\n","import { nextTick, ref, watch } from 'vue';\n\nconst useOrganizationState = () => {\n const searchState = ref({\n xm: '',\n dwh: ''\n });\n // 面包屑容器引用\n const breadcrumbRef = ref<HTMLElement>();\n // 面包屑导航状态\n const breadcrumbs = ref<Array<{ id?: string; name: string; dwh?: string }>>([\n { name: '全部' }\n ]);\n\n // 添加面包屑\n const addBreadcrumb = (item: { id?: string; name: string; dwh?: string }) => {\n breadcrumbs.value.push(item);\n searchState.value.dwh = item.dwh || '';\n };\n\n // 导航到指定层级\n const navigateToBreadcrumb = (index: number) => {\n if (index >= breadcrumbs.value.length) return;\n\n breadcrumbs.value = breadcrumbs.value.slice(0, index + 1);\n const current = breadcrumbs.value[index];\n searchState.value.dwh = current.dwh || '';\n };\n\n // 面包屑自动滚动\n const scrollBreadcrumbToEnd = async () => {\n await nextTick();\n if (breadcrumbRef.value) {\n breadcrumbRef.value.scrollLeft = breadcrumbRef.value.scrollWidth;\n }\n };\n\n // 监听面包屑变化\n watch(breadcrumbs, scrollBreadcrumbToEnd, { deep: true });\n\n // 重置状态\n const resetState = () => {\n searchState.value = { xm: '', dwh: '' };\n breadcrumbs.value = [{ name: '全部' }];\n };\n\n return {\n searchState,\n breadcrumbs,\n breadcrumbRef,\n addBreadcrumb,\n navigateToBreadcrumb,\n resetState\n };\n};\n\nexport default useOrganizationState;\n","<template>\n <Popup\n v-model:show=\"popupVisible\"\n position=\"bottom\"\n :style=\"{ height: popupHeight }\"\n round\n closeable\n :destroy-on-close=\"true\"\n close-icon-position=\"top-right\"\n @close=\"handlePopupClose\"\n >\n <div class=\"jname-organization-popup\">\n <!-- 弹窗头部 -->\n <div class=\"jname-popup-header\">\n <h3 class=\"jname-popup-title\">\n {{ popupTitle }}\n </h3>\n <div v-if=\"selectedCount > 0\" class=\"jname-header-actions\">\n <div class=\"jname-selected-count\">\n 已选择{{ selectedCount }}人\n </div>\n <Button\n size=\"mini\"\n @click=\"clearAllSelections\"\n >\n 清空\n </Button>\n </div>\n </div>\n\n <!-- 面包屑导航 -->\n <div v-if=\"breadcrumbs.length > 1\" class=\"jname-breadcrumb-nav\">\n <div ref=\"breadcrumbRef\" class=\"jname-breadcrumb-content\">\n <span\n v-for=\"(item, index) in breadcrumbs\"\n :key=\"item.id || 'root'\"\n class=\"jname-breadcrumb-item\"\n :class=\"{ active: index === breadcrumbs.length - 1 }\"\n @click=\"handleBreadcrumbClick(index)\"\n >\n {{ item.name }}\n <Icon v-if=\"index < breadcrumbs.length - 1\" name=\"arrow\" />\n </span>\n </div>\n </div>\n\n <!-- 搜索栏 -->\n <div class=\"jname-search-section\">\n <Search\n v-model=\"searchState.xm\"\n placeholder=\"请输入姓名搜索\"\n clearable\n @search=\"executeSearch\"\n @clear=\"executeSearch\"\n />\n </div>\n\n <!-- 组织架构内容 -->\n <div v-if=\"popupVisible\" class=\"jname-popup-content\">\n <List\n v-model:loading=\"state.loading\"\n v-model:error=\"state.error\"\n :finished=\"state.finished\"\n :immediate-check=\"false\"\n :offset=\"50\"\n finished-text=\"没有更多了\"\n loading-text=\"加载中...\"\n v-bind=\"$attrs\"\n @load=\"onLoad\"\n >\n <div class=\"jname-org-list\">\n <TransitionGroup v-if=\"dataSource.length > 0\" name=\"jname-list\" tag=\"div\">\n <template v-for=\"item in dataSource\" :key=\"item.id\">\n <!-- 组织机构项 -->\n <div\n v-if=\"item.isParent\"\n class=\"jname-org-item\"\n @click=\"handleOrganizationNavigation(item)\"\n >\n <div class=\"jname-item-content\">\n <div class=\"jname-org-info\">\n <Icon name=\"friends-o\" class=\"jname-org-icon\" />\n <span class=\"jname-org-name\">{{ item.name }}</span>\n </div>\n <Icon name=\"arrow\" class=\"jname-arrow-icon\" />\n </div>\n </div>\n\n <!-- 人员项 -->\n <div v-else class=\"jname-person-item\" @click=\"handlePersonSelection(item)\">\n <div class=\"jname-item-content\">\n <div class=\"jname-person-info\">\n <Icon name=\"contact\" class=\"jname-person-icon\" />\n <div class=\"jname-person-details\">\n <div class=\"jname-person-name\">\n {{ item.xm }}\n </div>\n <div class=\"jname-person-id\">\n {{ item.xgh }}\n </div>\n </div>\n </div>\n <Checkbox\n :model-value=\"item.checked\"\n :disabled=\"isPersonDisabled(item)\"\n />\n </div>\n </div>\n </template>\n </TransitionGroup>\n </div>\n </List>\n </div>\n\n <!-- 弹窗底部操作 -->\n <div class=\"jname-popup-footer\">\n <Button size=\"large\" @click=\"handlePopupCancel\">\n 取消\n </Button>\n <Button\n type=\"primary\"\n size=\"large\"\n :disabled=\"selectedCount === 0\"\n @click=\"handlePopupConfirm\"\n >\n 确定 {{ selectedCount > 0 ? `(${selectedCount})` : '' }}\n </Button>\n </div>\n </div>\n </Popup>\n</template>\n\n<script setup lang=\"ts\">\nimport type { Emits, PersonnelItem, Props } from './types';\nimport { Button, Checkbox, Icon, List, Popup, Search } from 'vant';\nimport { computed, watch } from 'vue';\nimport { useRefreshList } from '@/hooks';\nimport {\n useOrganizationActions,\n useOrganizationApi,\n useOrganizationState\n} from './composables';\n\ndefineOptions({\n name: 'JOrganization'\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n multiple: true,\n maxSelected: 10,\n modelValue: false,\n popupTitle: '选择人员',\n popupHeight: '80%'\n});\n\nconst emit = defineEmits<Emits>();\n\n// 弹窗显示状态\nconst popupVisible = computed({\n get: () => props.modelValue,\n set: value => emit('update:modelValue', value)\n});\n\n// 组织架构API\nconst { organizationCatch, getOrganizationList } = useOrganizationApi({\n apiConfig: props.apiConfig\n});\n\n// 状态管理\nconst { searchState, breadcrumbRef, breadcrumbs, addBreadcrumb, navigateToBreadcrumb, resetState } = useOrganizationState();\n\n// 下拉刷新列表\nconst { dataSource, state, onRefresh, onLoad } = useRefreshList<PersonnelItem>({\n api: getOrganizationList,\n extraParams: searchState\n});\n\n// 操作逻辑\nconst {\n selectedCount,\n selectedPersonnel,\n handlePersonSelection,\n executeSearch,\n clearAllSelections,\n isPersonDisabled,\n syncListSelectionState\n} = useOrganizationActions({\n multiple: props.multiple,\n maxSelected: props.maxSelected,\n organizationCache: organizationCatch,\n searchState,\n onRefreshList: () => onRefresh()\n});\n\n// 监听选中人员变化,同步到列表显示\nwatch(selectedPersonnel, () => {\n syncListSelectionState(dataSource.value);\n}, { deep: true });\n\n// 处理组织点击\nconst handleOrganizationNavigation = async (org: PersonnelItem) => {\n addBreadcrumb({\n id: org.id,\n name: org.name || org.xm,\n dwh: org.dwh || org.id\n });\n organizationCatch.value.clear();\n onRefresh();\n};\n\n// 处理面包屑点击\nconst handleBreadcrumbClick = async (index: number) => {\n if (index === breadcrumbs.value.length - 1) return;\n navigateToBreadcrumb(index);\n organizationCatch.value.clear();\n onRefresh();\n};\n\n// 弹窗事件\nconst handlePopupConfirm = () => {\n emit('confirm', selectedPersonnel.value);\n popupVisible.value = false;\n};\n\nconst handlePopupCancel = () => {\n emit('cancel');\n popupVisible.value = false;\n};\n\nconst handlePopupClose = () => emit('close');\n\n// 监听弹窗打开,初始化状态\nwatch(popupVisible, (newVal) => {\n if (newVal) {\n resetState();\n clearAllSelections();\n organizationCatch.value.clear();\n onRefresh();\n }\n});\n</script>\n\n<style lang=\"less\" scoped>\n@import './index.less';\n</style>\n","<template>\n <PullRefresh\n v-if=\"!disablePullRefresh\"\n v-model=\"state.isLoading\"\n pulling-text=\"下拉释放刷新\"\n loosing-text=\"下拉释放刷新\"\n loading-text=\"刷新中...\"\n v-bind=\"$attrs\"\n @refresh=\"onRefresh\"\n >\n <List\n v-model:loading=\"state.loading\"\n v-model:error=\"state.error\"\n :finished=\"state.finished\"\n :immediate-check=\"false\"\n :offset=\"50\"\n finished-text=\"没有更多了\"\n loading-text=\"加载中...\"\n v-bind=\"$attrs\"\n @load=\"onLoad\"\n >\n <template #default>\n <slot :data=\"dataSource || []\" />\n </template>\n </List>\n </PullRefresh>\n\n <List\n v-if=\"disablePullRefresh\"\n v-model:loading=\"state.loading\"\n v-model:error=\"state.error\"\n :finished=\"state.finished\"\n :immediate-check=\"false\"\n :offset=\"50\"\n finished-text=\"没有更多了\"\n loading-text=\"加载中...\"\n v-bind=\"$attrs\"\n @load=\"onLoad\"\n >\n <template #default>\n <slot :data=\"dataSource || []\" />\n </template>\n </List>\n</template>\n\n<script lang=\"ts\" setup>\nimport type { Props } from './types';\nimport { List, PullRefresh } from 'vant';\nimport { computed, onMounted } from 'vue';\nimport useRefreshList from '@/hooks/useRefreshList';\n\ndefineOptions({\n name: 'JPullToRefreshList'\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n disablePullRefresh: false,\n extraParams: () => ({}),\n immediate: true\n});\n\n// 使用 computed 确保实时获取最新的 extraParams,避免 toRefs 的异步更新延迟\nconst extraParams = computed(() => props.extraParams);\n\nconst { dataSource, state, onRefresh, onLoad, onSearch, onReset } = useRefreshList({\n api: props.apiFn,\n extraParams\n});\n\nonMounted(() => {\n props.immediate && onLoad();\n});\n\ndefineExpose({\n onRefresh,\n onLoad,\n onSearch,\n onReset,\n dataSource\n});\n</script>\n","<template>\n <div class=\"jname-steps-card\">\n <!-- 左侧时间轴 -->\n <div class=\"jname-steps-card__timeline\">\n <!-- 点和线的容器 -->\n <div class=\"jname-steps-card__timeline-container\">\n <!-- 双点结构 -->\n <div class=\"jname-steps-card__dot-container\">\n <!-- 外层大点 -->\n <div class=\"jname-steps-card__outer-dot\" />\n <!-- 内层小点 -->\n <div class=\"jname-steps-card__inner-dot\" />\n </div>\n <!-- 连接线 -->\n <div\n v-if=\"hasBodyContent\"\n class=\"jname-steps-card__line\"\n :class=\"[bodyHeight > 0 ? 'jname-steps-card__line--visible' : 'jname-steps-card__line--hidden']\"\n />\n </div>\n </div>\n\n <!-- 右侧内容 -->\n <div class=\"jname-steps-card__content\">\n <!-- 头部内容 -->\n <div v-if=\"slots.header\" class=\"jname-steps-card__content-header\">\n <slot name=\"header\" />\n </div>\n\n <!-- 内容区域 -->\n <div v-if=\"slots.default\" ref=\"bodyRef\" class=\"jname-steps-card__content-body\">\n <slot />\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang='ts'>\nimport { computed, onMounted, onUpdated, ref, useSlots } from 'vue';\n\ndefineOptions({\n name: 'JStepsCard'\n});\n\nconst slots = useSlots();\nconst hasBodyContent = computed(() => !!slots.default);\n\nconst bodyRef = ref<HTMLElement | null>(null);\nconst bodyHeight = ref(0);\n\nconst updateHeight = () => {\n if (bodyRef.value) {\n bodyHeight.value = bodyRef.value.offsetHeight;\n }\n};\n\nonMounted(updateHeight);\nonUpdated(updateHeight);\n</script>\n\n<style lang=\"less\" scoped>\n@import './index.less';\n</style>\n","<template>\n <div class=\"jname-tabs-container\">\n <div\n v-for=\"item in tabOptions\"\n :key=\"item.value\"\n class=\"jname-tab-item\"\n :class=\"{ active: modelValue === item.value }\"\n @click=\"handleClick(item.value)\"\n >\n {{ item.label }}\n <span v-if=\"!!item.count\" class=\"jname-tab-count\">({{ item.count }})</span>\n <div\n class=\"jname-tab-indicator\"\n :class=\"{ active: modelValue === item.value }\"\n />\n </div>\n </div>\n</template>\n\n<script setup lang='ts'>\nimport type { PropType } from 'vue';\nimport type { TabItem } from './types';\n\ndefineOptions({\n name: 'JTabs'\n});\n\ndefineProps({\n modelValue: {\n type: String,\n default: ''\n },\n tabOptions: {\n type: Array as PropType<TabItem[]>,\n default: () => []\n }\n});\n\nconst emit = defineEmits(['change', 'update:modelValue']);\nconst handleClick = (value: string) => {\n emit('update:modelValue', value);\n emit('change', value);\n};\n</script>\n\n<style lang=\"less\">\n@import './index.less';\n</style>\n","import type { App } from 'vue';\n\n// 导入自定义组件\nimport JContentCard from './contentCard';\nimport JImgUploader from './imgUploader';\nimport JOrganization from './organization';\nimport JPullToRefreshList from './pullToRefreshList';\nimport JStepsCard from './stepsCard';\nimport JTabs from './tabs';\n\n// 导入样式\nimport './styles/index.less';\n\n// 导出 hooks\nexport * from './hooks';\n\n// 导出类型\nexport * from './types';\n\n// 导出组件\nexport { JContentCard, JImgUploader, JOrganization, JPullToRefreshList, JStepsCard, JTabs };\n\n// 组件列表\nconst components = [JStepsCard, JTabs, JContentCard, JImgUploader, JPullToRefreshList, JOrganization];\n\n// 定义安装函数\nconst install = (app: App) => {\n // 注册自定义组件\n components.forEach((component) => {\n if (component.name) {\n app.component(component.name, component);\n }\n });\n};\n\n// 默认导出\nexport default {\n install,\n version: __VERSION__\n};\n\n// 支持通过 CDN 使用\nif (typeof window !== 'undefined' && (window as any).Vue) {\n install((window as any).Vue);\n}\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_hoisted_3","_toDisplayString","title","desc","_hoisted_4","_hoisted_5","_Fragment","_renderList","images","maxImages","index","_createBlock","_unref","$slots","meta","_hoisted_6","_renderSlot","_normalizeClass","_hoisted_7","_createVNode","file","_mergeProps","$attrs","maxCount","maxSize","multiple","disabled","readonly","deletable","$emit","_withCtx","_normalizeProps","_guardReactiveProps","popupHeight","popupTitle","_TransitionGroup","disablePullRefresh","JStepsCard","JTabs","JContentCard","JImgUploader","JPullToRefreshList","JOrganization"],"mappings":"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