hongluan-business-ui
Version:
Hongluan Business Component Library for Vue 3
1 lines • 16 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../../../../../../packages/components/data-filter/src/index.vue"],"sourcesContent":["<template>\n <hl-tooltip\n ref=\"popoverRef\"\n :width=\"width\"\n trigger=\"click\"\n :placement=\"placement\"\n :fallback-placements=\"fallbackPlacements\"\n :show-arrow=\"false\"\n :popper-class=\"prefix + '-data-filter-popper'\"\n :gpu-acceleration=\"false\"\n :outside-ignore=\"outsideIgnoreComputed\"\n transition=\"dropdown\"\n >\n <template #default>\n <slot name=\"reference\">\n <hl-button\n type=\"primary\"\n :icon-position=\"iconPosition\"\n :equal=\"!$slots.default\"\n effect=\"light\"\n :class=\"prefix + '-data-filter'\"\n v-bind=\"$attrs\"\n >\n <template #icon>\n <slot name=\"icon\">\n <hl-icon v-if=\"!$slots.default && !$slots.icon\">\n <system-search />\n </hl-icon>\n </slot>\n </template>\n <template #default>\n <slot></slot>\n <hl-badge\n type=\"primary\"\n position=\"rt\"\n :hidden=\"!displayItems.length\"\n :value=\"displayItems.length\"\n :max=\"max\"\n round\n />\n </template>\n </hl-button>\n </slot>\n </template>\n <template #content>\n <hl-panel\n body-padding=\"var(--xl)\"\n :style=\"{ height: maxHeight, '--data-filter-panel-width': typeof width === 'number' ? width + 'px' : width }\"\n full-body\n >\n <template #header>\n <div class=\"panel-title\">\n <h4>{{ title }}</h4>\n </div>\n </template>\n <hl-scrollbar>\n <hl-form label-suffix=\":\" :item-gap=\"itemGap\" :gap=\"gap\" style=\"padding: var(--panel-padding)\">\n <hl-form-item v-if=\"displayItems.length && selectedSectionOpt.show\" :class=\"{ 'no-selected-items': !displayItems.length }\">\n <template #label>\n <span>已选择:</span>\n </template>\n <hl-group wrap gap=\"var(--sm)\" class=\"selected-items\">\n <hl-tag\n v-for=\"item in displayItems\"\n :key=\"item.name\"\n type=\"primary\"\n class=\"selected-item-tag\"\n :closable=\"selectedSectionOpt.closable\"\n @close=\"removeDisplayItem(item)\"\n >\n {{ item.display }}\n </hl-tag>\n </hl-group>\n </hl-form-item>\n <hl-form-item v-for=\"item in searchItems\" :key=\"item.name\" :label=\"item.label\">\n <hl-time-picker\n v-if=\"item.type === 'timepicker'\"\n :ref=\"ref => addRef(ref)\"\n v-model=\"item.value\"\n block\n clearable\n :fill=\"fill\"\n v-bind=\"getDateTimeProps(item)\"\n />\n <hl-date-picker\n v-else-if=\"isDatePicker(item.type)\"\n :ref=\"ref => addRef(ref)\"\n v-model=\"item.value\"\n :type=\"item.type\"\n block\n clearable\n :fill=\"fill\"\n v-bind=\"getDateTimeProps(item)\"\n />\n <hl-select\n v-else-if=\"item.type === 'select'\"\n :ref=\"ref => addRef(ref)\"\n v-model=\"item.value\"\n :fill=\"fill\"\n block\n clearable\n v-bind=\"getSelectProps(item)\"\n >\n <hl-option v-for=\"opt in item.options\" :key=\"getKey(item, opt)\" :label=\"getLabel(item, opt)\" :value=\"getKey(item, opt)\" />\n </hl-select>\n <template v-else-if=\"item.type === 'slot'\">\n <slot :name=\"item.slotName\" :value=\"item.value\" :item=\"item\"> </slot>\n </template>\n <hl-input\n v-else-if=\"item.type === 'input' || !item.type\"\n v-model=\"item.value\"\n :fill=\"fill\"\n block\n clearable\n v-bind=\"getInputProps(item)\"\n />\n </hl-form-item>\n </hl-form>\n </hl-scrollbar>\n <template #footer>\n <slot name=\"footer\">\n <hl-button type=\"primary\" @click=\"search\">{{ searchLabel }}</hl-button>\n </slot>\n </template>\n </hl-panel>\n </template>\n </hl-tooltip>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, onMounted, ref, watch, computed } from 'vue'\nimport { cloneDeep } from 'lodash-unified'\nimport { HlTooltip, HlTag, HlForm, HlFormItem, HlPanel, HlGroup, HlBadge, HlInput, HlSelect, HlOption, HlDatePicker, HlTimePicker, HlButton, HlIcon, SystemSearch } from 'hongluan-ui'\nimport { usePrefix } from '@hongluan-business-ui/utils/util'\nimport { Utils } from './utils'\n\nimport type { PropType } from 'vue'\nimport type { MaybeElementRef } from '@vueuse/core'\nimport type { Indexable } from '@hongluan-business-ui/utils/types'\nimport type { SelectorItem } from '@hongluan-business-ui/components/table-searchbar/src/searchbar'\nimport type { DisplayItem } from './utils'\n\nexport default defineComponent({\n name: 'DataFilter',\n components: { HlTooltip, HlTag, HlForm, HlFormItem, HlPanel, HlGroup, HlBadge, HlInput, HlSelect, HlOption, HlDatePicker, HlTimePicker, HlButton, HlIcon, SystemSearch },\n inheritAttrs: false,\n props: {\n iconPosition: {\n type: String as PropType<'left' | 'right'>,\n default: 'right',\n },\n title: {\n type: String,\n default: '数据筛选',\n },\n width: {\n type: [String, Number],\n default: 380,\n },\n maxHeight: {\n type: String,\n default: '300px',\n },\n fill: {\n type: Boolean,\n default: false,\n },\n placement: {\n type: String,\n default: 'bottom',\n },\n fallbackPlacements: {\n type: Array as PropType<string[]>,\n default: () => [],\n },\n items: {\n type: Array as PropType<SelectorItem[]>,\n default: () => [],\n },\n selectedSection: Object as PropType<{ show: true; closable: true; }>,\n max: {\n type: Number,\n default: 99,\n },\n gap: String,\n itemGap: String,\n searchLabel: {\n type: String,\n default: ' 搜 索 ',\n },\n outsideIgnore: {\n type: Array as PropType<MaybeElementRef[]>,\n default: () => [],\n },\n },\n emits: ['search', 'remove-selected-item'],\n setup(props, { emit }) {\n const { prefix } = usePrefix()\n const popoverRef = ref(null)\n const searchItems = ref(cloneDeep(props.items))\n const displayItems = ref<DisplayItem[]>([])\n const popperPaneRefs = ref([])\n\n const selectedSectionOpt = computed(() => ({ show: true, closable: true, ...(props.selectedSection || {}) }))\n\n const outsideIgnoreComputed = computed(() => popperPaneRefs.value)\n\n const addRef = (compRef: any) => {\n if (compRef) {\n if (compRef.popperPaneRef) {\n popperPaneRefs.value.push(compRef.popperPaneRef)\n } else {\n popperPaneRefs.value.push(compRef)\n }\n }\n }\n\n const isDatePicker = (type: string) => {\n return 'year/month/date/dates/week/datetime/datetimerange/daterange/monthrange'.indexOf(type) !== -1\n }\n const getDateTimeProps = (item: SelectorItem) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { value: __, label: ___, display: ____, ...others } = item\n return others\n }\n const getSelectProps = (item: SelectorItem) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { options: _, value: __, prop: ___, type: ____, label: _____, display: ______, ...others } = item\n return others\n }\n const getInputProps = (item: SelectorItem) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { label: _, type: __, display: ___, ...others } = item\n return others\n }\n const changeValue = () => {\n displayItems.value = Utils.getDisplayItems(searchItems.value)\n }\n\n const getDisplayItemsCount = () => displayItems.value.length\n const updateDisplayItem = (item: DisplayItem) => {\n const idx = displayItems.value.findIndex(di => item.name === di.name)\n if (idx == -1) {\n displayItems.value.push(item)\n } else {\n displayItems.value[idx] = item\n }\n }\n const removeDisplayItem = (item: DisplayItem) => {\n displayItems.value = displayItems.value.filter(di => di !== item)\n Utils.syncDisplaySearchItems(displayItems.value, searchItems.value)\n emit('remove-selected-item', item)\n }\n\n const emitChange = () => {\n const mapParams: Indexable<unknown> = {}\n const originalParams: Indexable<unknown> = {}\n\n searchItems.value\n .filter(item => item.type !== 'slot')\n .filter(item => (Array.isArray(item.value) ? item.value.length : item.value))\n .forEach(item => {\n if (/range|dates/.test(item.type) || item['is-range']) {\n mapParams[item.name + 'Start'] = item.value[0]\n mapParams[item.name + 'End'] = item.value[1]\n } else {\n mapParams[item.name] = item.value\n }\n originalParams[item.name] = item.value\n })\n\n let urlParams = ''\n Object.keys(mapParams).forEach(k => {\n if (Array.isArray(mapParams[k])) {\n urlParams = (mapParams[k] as Array<unknown>).reduce((prev, cur) => {\n prev += `&${k}=${cur}`\n return prev\n }, urlParams) as string\n } else {\n urlParams += `&${k}=${mapParams[k]}`\n }\n })\n if (urlParams[0] === '&') {\n urlParams = urlParams.slice(1)\n }\n\n emit('search', urlParams, mapParams, originalParams)\n }\n const search = () => {\n changeValue()\n emitChange()\n popoverRef.value.hide()\n }\n const resetFields = (names: string[] = []) => {\n searchItems.value.forEach((_, idx) => {\n if (names.length) {\n if (names.includes(searchItems.value[idx].name)) {\n searchItems.value[idx].value = props.items[idx].value\n }\n }\n else {\n searchItems.value[idx].value = props.items[idx].value\n }\n })\n changeValue()\n emitChange()\n }\n\n watch(\n () => props.items?.length,\n () => {\n searchItems.value = cloneDeep(props.items)\n },\n )\n\n watch(() => props.outsideIgnore, newVal => {\n newVal?.forEach(v => {\n addRef(v)\n })\n }, {\n immediate: true,\n })\n\n onMounted(() => {\n displayItems.value = Utils.getDisplayItems(searchItems.value)\n })\n\n return {\n prefix,\n popoverRef,\n searchItems,\n displayItems,\n outsideIgnoreComputed,\n addRef,\n selectedSectionOpt,\n getKey: Utils.getKey,\n getLabel: Utils.getLabel,\n isDatePicker,\n changeValue,\n search,\n getDisplayItemsCount,\n removeDisplayItem,\n updateDisplayItem,\n getDateTimeProps,\n getSelectProps,\n getInputProps,\n resetFields,\n }\n },\n})\n</script>\n"],"names":["_withCtx","_createBlock"],"mappings":";;;;;;;AA8IA,MAAK,YAAa,gBAAa;AAAA,EAC7B,MAAM;AAAA,EACN,YAAY,EAAE,WAAW,OAAO,QAAQ,YAAY,SAAS,SAAS,SAAS,SAAS,UAAU,UAAU,cAAc,cAAc,UAAU,QAAQ;AAAA,EAC1J,cAAc;AAAA,EACd,OAAO;AAAA,IACL,cAAc;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA;AAAA,IAEX,OAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA;AAAA,IAEX,OAAO;AAAA,MACL,MAAM,CAAC,QAAQ;AAAA,MACf,SAAS;AAAA;AAAA,IAEX,WAAW;AAAA,MACT,MAAM;AAAA,MACN,SAAS;AAAA;AAAA,IAEX,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA;AAAA,IAEX,WAAW;AAAA,MACT,MAAM;AAAA,MACN,SAAS;AAAA;AAAA,IAEX,oBAAoB;AAAA,MAClB,MAAM;AAAA,MACN,SAAS,MAAM;AAAA;AAAA,IAEjB,OAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,MAAM;AAAA;AAAA,IAEjB,iBAAiB;AAAA,IACjB,KAAK;AAAA,MACH,MAAM;AAAA,MACN,SAAS;AAAA;AAAA,IAEX,KAAK;AAAA,IACL,SAAS;AAAA,IACT,aAAa;AAAA,MACX,MAAM;AAAA,MACN,SAAS;AAAA;AAAA,IAEX,eAAe;AAAA,MACb,MAAM;AAAA,MACN,SAAS,MAAM;AAAA;AAAA;AAAA,EAGnB,OAAO,CAAC,UAAU;AAAA,EAClB,MAAM,OAAO,EAAE,QAAQ;AACrB,UAAM,EAAE,WAAW;AACnB,UAAM,aAAa,IAAI;AACvB,UAAM,cAAc,IAAI,UAAU,MAAM;AACxC,UAAM,eAAe,IAAmB;AACxC,UAAM,iBAAiB,IAAI;AAE3B,UAAM,qBAAqB,SAAS,SAAS,MAAM,MAAM,UAAU,SAAU,MAAM,mBAAmB;AAEtG,UAAM,wBAAwB,SAAS,MAAM,eAAe;AAE5D,UAAM,SAAS,CAAC,YAAiB;AAC/B,UAAI,SAAS;AACX,YAAI,QAAQ,eAAe;AACzB,yBAAe,MAAM,KAAK,QAAQ;AAAA,eAC7B;AACL,yBAAe,MAAM,KAAK;AAAA;AAAA;AAAA;AAKhC,UAAM,eAAe,CAAC,SAAiB;AACrC,aAAO,yEAAyE,QAAQ,UAAU;AAAA;AAEpG,UAAM,mBAAmB,CAAC,SAAuB;AAE/C,YAAM,EAAE,OAAO,IAAI,OAAO,KAAK,SAAS,SAAS,WAAW;AAC5D,aAAO;AAAA;AAET,UAAM,iBAAiB,CAAC,SAAuB;AAE7C,YAAM,EAAE,SAAS,GAAG,OAAO,IAAI,MAAM,KAAK,MAAM,MAAM,OAAO,OAAO,SAAS,WAAW,WAAW;AACnG,aAAO;AAAA;AAET,UAAM,gBAAgB,CAAC,SAAuB;AAE5C,YAAM,EAAE,OAAO,GAAG,MAAM,IAAI,SAAS,QAAQ,WAAW;AACxD,aAAO;AAAA;AAET,UAAM,cAAc,MAAM;AACxB,mBAAa,QAAQ,MAAM,gBAAgB,YAAY;AAAA;AAGzD,UAAM,uBAAuB,MAAM,aAAa,MAAM;AACtD,UAAM,oBAAoB,CAAC,SAAsB;AAC/C,YAAM,MAAM,aAAa,MAAM,UAAU,QAAM,KAAK,SAAS,GAAG;AAChE,UAAI,OAAO,IAAI;AACb,qBAAa,MAAM,KAAK;AAAA,aACnB;AACL,qBAAa,MAAM,OAAO;AAAA;AAAA;AAG9B,UAAM,oBAAoB,CAAC,SAAsB;AAC/C,mBAAa,QAAQ,aAAa,MAAM,OAAO,QAAM,OAAO;AAC5D,YAAM,uBAAuB,aAAa,OAAO,YAAY;AAC7D,WAAK,wBAAwB;AAAA;AAG/B,UAAM,aAAa,MAAM;AACvB,YAAM,YAAgC;AACtC,YAAM,iBAAqC;AAE3C,kBAAY,MACT,OAAO,UAAQ,KAAK,SAAS,QAC7B,OAAO,UAAS,MAAM,QAAQ,KAAK,SAAS,KAAK,MAAM,SAAS,KAAK,OACrE,QAAQ,UAAQ;AACf,YAAI,cAAc,KAAK,KAAK,SAAS,KAAK,aAAa;AACrD,oBAAU,KAAK,OAAO,WAAW,KAAK,MAAM;AAC5C,oBAAU,KAAK,OAAO,SAAS,KAAK,MAAM;AAAA,eACrC;AACL,oBAAU,KAAK,QAAQ,KAAK;AAAA;AAE9B,uBAAe,KAAK,QAAQ,KAAK;AAAA;AAGrC,UAAI,YAAY;AAChB,aAAO,KAAK,WAAW,QAAQ,OAAK;AAClC,YAAI,MAAM,QAAQ,UAAU,KAAK;AAC/B,sBAAa,UAAU,GAAsB,OAAO,CAAC,MAAM,QAAQ;AACjE,oBAAQ,IAAI,KAAK;AACjB,mBAAO;AAAA,aACN;AAAA,eACE;AACL,uBAAa,IAAI,KAAK,UAAU;AAAA;AAAA;AAGpC,UAAI,UAAU,OAAO,KAAK;AACxB,oBAAY,UAAU,MAAM;AAAA;AAG9B,WAAK,UAAU,WAAW,WAAW;AAAA;AAEvC,UAAM,SAAS,MAAM;AACnB;AACA;AACA,iBAAW,MAAM;AAAA;AAEnB,UAAM,cAAc,CAAC,QAAkB,OAAO;AAC5C,kBAAY,MAAM,QAAQ,CAAC,GAAG,QAAQ;AACpC,YAAI,MAAM,QAAQ;AAChB,cAAI,MAAM,SAAS,YAAY,MAAM,KAAK,OAAO;AAC/C,wBAAY,MAAM,KAAK,QAAQ,MAAM,MAAM,KAAK;AAAA;AAAA,eAG/C;AACH,sBAAY,MAAM,KAAK,QAAQ,MAAM,MAAM,KAAK;AAAA;AAAA;AAGpD;AACA;AAAA;AAGF,UACE,MAAM;AAEJ;AAAoC;AAIxC;AACE;AACE;AAAO;AAAA;AAER,iBACU;AAAA;AAGb;AACE;AAAuD;AAGzD;AAAO,MACL;AAAA,MACA;AAAA;AACA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAc,MACd;AAAgB,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;AA5NS;AA5HP;AACI;AACA,IACP;AAAW,IACX;AAAqB,IACrB;AAAY,IACZ,gBAAc;AAAM,IACpB;AAAkB,IAClB;AAAgB,IACjB;AAAW;IAEA,kBACT;AA4BO;AAAA;AADO;AAzBL;AACW;AACA,UAChB;AAAO,UACN,qBAAa;AAAA;AACA,UAEH,MAAI,SACb;AAIO;AAAA,eAHW;AAEN;AADS;AAAA;AAAA;;;;;AAKR;AAAA,YACb;AAOE;AANK,uBACI;AAAA;AACc,cACtB;AAAoB,cACpB;AAAK,cACN;AAAA;;;;;;aAMQ;AAgFL;AAAA;AA9EI;AACwF;AACrG;QAEW,sBAGH;AAAA;AAAA;AADQ;AAAA;AAAA,8BAsEP;AAAA;AAAA;AADkE,cAA5D;AAAK;AAAkB;;AAAyB;AAAH;AAAA;;;;;AAH7C;AAAA;AADH;AAAA;AA7DY;AAAe;AAAe,gBAAK;AAAA;;AAiBxC,oCAhBkB;AAgBlB;;AAhBkG;oBACpG;AACQ;AAAjB;AAAA;AAaS,sBAXX;AAWW;AAXD,6BAASA;AAAA;AAAkB;;AAEL;;AAQrB;AAPI;AACN;AACC,8BACL,UAAU;AAAmB,8BAC7B;AAAyB;;AAER;AAAH;AAAA;;;;;;;;;;;AA8CN,sBA1C4B,UAAU;AAAA,4BAAc,KAAK;AAAA;;AASpE,6BAPW;AAOX;;;AANoB;AACN;AAAK,0BACnB;AAAA,0BACA;AAAA,0BACC;AAAM;AAYP;;+BAPM,sBAAc;AAAA;AACN;AAAK,0BAClB,MAAM;AAAK,0BACZ;AAAA,0BACA;AAAA,0BACC,MAAM;AAAA;AAaG;;+BARJ,sBAAc;AAAA;AACN;AAAK,0BAClB,MAAM;AAAA,0BACP;AAAA,0BACA;AAAA;AAC2B;AAEW;mDAAtC;AAA0H;AAAhE,sCAAc;AAAe,kDAAqBC;AAAM;;;;;AAGxF;0BAAG;AAAY;AAAQ,6BAGtC;AAMX;;AALc;AAAK,0BAClB,MAAM;AAAA,0BACP;AAAA,0BACA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;"}