diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b5f5cf6de4f7dbdcd76f99817d52e10a835cdb6..d8ba9016bcb255cc1c65229616c38b85b018a3a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,8 @@ - 分页搜索视图中快捷搜索提示根据当前激活的关系视图显示 - 按钮组支持项显示隐藏 - 编辑表单及编辑器支持注入属性 +- 搜索栏过滤添加编辑删除功能 +- 下拉列表只读样式时对齐 ### Fixed diff --git a/src/control/search-bar/filter-tree/filter-tree.scss b/src/control/search-bar/filter-tree/filter-tree.scss index 8ef4000ef104caaf34b4b6aef9164c05c45e0fbc..01f364f34a0394407ead043b43c4480431df331a 100644 --- a/src/control/search-bar/filter-tree/filter-tree.scss +++ b/src/control/search-bar/filter-tree/filter-tree.scss @@ -77,6 +77,9 @@ $filter-tree: ( position: absolute; top: getCssVar(spacing, base); left: rem(-40px); + @include when (readonly) { + color: getCssVar(color, disabled, text); + } .van-dropdown-menu__bar { box-shadow: none; background-color: transparent; @@ -114,6 +117,13 @@ $filter-tree: ( @include e(item-header) { display: flex; } + @include e(item-footer) { + display: flex; + gap: getCssVar(spacing, super, loose); + .van-button { + width: 100%; + } + } } @include b(filter-field-select) { diff --git a/src/control/search-bar/filter-tree/filter-tree.tsx b/src/control/search-bar/filter-tree/filter-tree.tsx index 98a0595d380eef2503547708ae8969420a75386e..8ac01e084da0c5c4ba958d8bfcf6f21f07f04a4d 100644 --- a/src/control/search-bar/filter-tree/filter-tree.tsx +++ b/src/control/search-bar/filter-tree/filter-tree.tsx @@ -115,6 +115,15 @@ export const FilterTreeControl = defineComponent({ // 新建节点 const addNode: Ref = ref(null); + // 编辑节点 + const editNode: Ref = ref(null); + + // 编辑项index + let editIndex: number | undefined; + + // 拷贝节点 + const copyNode: Ref = ref(null); + // UI实际用的FilterNodes const UiFilterNodes = computed(() => { return props.filterNodes; @@ -340,15 +349,51 @@ export const FilterTreeControl = defineComponent({ emit('cancel'); }; + const closePopup = () => { + addNode.value = null; + editNode.value = null; + copyNode.value = null; + showPopup.value = false; + }; + + const onEditItem = () => { + if (copyNode.value && copyNode.value.value) { + Object.assign(editNode.value!, copyNode.value); + } + closePopup(); + }; + + const onRemove = () => { + if (!UiFilterNodes.value.length) { + return; + } + const children = (UiFilterNodes.value[0] as IFilterNodeGroup).children; + children.splice(editIndex as number, 1); + // 删除根分组时,将第一个过滤节点转为根节点 + if ( + children.length > 0 && + children[0].nodeType === 'GROUP' && + children[0].children.length + ) { + children[0] = children[0].children[0]; + } + closePopup(); + }; + const onAddItem = () => { - if (!UiFilterNodes.value.length || !addNode.value) { + // 新增条件无value时不添加 + if ( + !UiFilterNodes.value.length || + !addNode.value || + !addNode.value.value + ) { return; } const children = (UiFilterNodes.value[0] as IData as IFilterNodeGroup) .children; if (children[0] && !(children[0] as IFilterNodeField).field) { Object.assign(children[0], addNode.value); - showPopup.value = false; + closePopup(); return; } children.push({ @@ -356,8 +401,7 @@ export const FilterTreeControl = defineComponent({ logicType: 'AND', children: [addNode.value], }); - addNode.value = null; - showPopup.value = false; + closePopup(); }; onMounted(() => { @@ -367,6 +411,24 @@ export const FilterTreeControl = defineComponent({ } }); + /** + * @description 过滤项点击 + * @param {MouseEvent} event + * @param {IFilterNodeField} item + */ + const onFilterItemClick = ( + event: MouseEvent, + item: IFilterNodeField, + index: number, + root: boolean, + ) => { + event.stopPropagation(); + editNode.value = item; + copyNode.value = { ...item }; + editIndex = root ? 0 : index + 1; + showPopup.value = true; + }; + /** * 绘制编辑器 * @param node @@ -411,7 +473,11 @@ export const FilterTreeControl = defineComponent({ * @param node * @returns */ - const renderFilterItem = (node: IFilterNodeField) => { + const renderFilterItem = ( + node: IFilterNodeField, + index: number, + root: boolean, + ) => { // 不显示的不绘制 if (node.hidden) { return; @@ -432,7 +498,12 @@ export const FilterTreeControl = defineComponent({ } const opItem = FilterModes.find(x => x.valueOP === node.valueOP); return ( -
+
{ + onFilterItemClick(event, node, index, root); + }} + >
{item.label}
{opItem?.label}
@@ -476,12 +547,12 @@ export const FilterTreeControl = defineComponent({ } return (
-
+
{root ? ibiz.i18n.t('control.searchBar.when') : renderType(node)}
- {node.children.map(child => { + {node.children.map((child, index) => { if (child.nodeType === 'FIELD') { - return renderFilterItem(child); + return renderFilterItem(child, index, root); } // 移动端只支持单层分组 if (child.nodeType === 'GROUP') { @@ -492,8 +563,10 @@ export const FilterTreeControl = defineComponent({ ); }; - const renderNewItem = () => { - const node = addNode.value; + // 绘制气泡项,新建或编辑时使用 + const renderPopupItem = () => { + const editing = !!editNode.value; + const node = editing ? copyNode.value : addNode.value; if (!node) { return; } @@ -507,6 +580,25 @@ export const FilterTreeControl = defineComponent({ editor = renderEditor(node, filterC); } } + let footer = ( +
+ + {ibiz.i18n.t('control.searchBar.add')} + +
+ ); + if (editing) { + footer = ( +
+ + {ibiz.i18n.t('control.searchBar.remove')} + + + {ibiz.i18n.t('control.searchBar.confirm')} + +
+ ); + } return (
@@ -534,13 +626,7 @@ export const FilterTreeControl = defineComponent({
{editor}
- - {ibiz.i18n.t('control.searchBar.add')} - + {footer}
); }; @@ -550,7 +636,7 @@ export const FilterTreeControl = defineComponent({ showPopup, UiFilterNodes, renderFilterGroup, - renderNewItem, + renderPopupItem, onConfirm, onReset, addItem, @@ -574,7 +660,7 @@ export const FilterTreeControl = defineComponent({ })}
- + {ibiz.i18n.t('control.searchBar.reset')} - {this.renderNewItem()} + {this.renderPopupItem()}
); diff --git a/src/editor/dropdown-list/ibiz-dropdown/ibiz-dropdown.scss b/src/editor/dropdown-list/ibiz-dropdown/ibiz-dropdown.scss index 880d61a5c28cddf5e8e85fe1bdda35f576b5b779..ff980178339d5b7a0d6825e7827aabb5192a2fb4 100644 --- a/src/editor/dropdown-list/ibiz-dropdown/ibiz-dropdown.scss +++ b/src/editor/dropdown-list/ibiz-dropdown/ibiz-dropdown.scss @@ -63,12 +63,15 @@ @include b(dropdown-readonly-text-item) { display: inline-block; - padding: 0 rem(16px); + padding: 0; font-size: rem(14px); line-height: rem(24px); color: getCssVar(dropdown, select-option-item-color); background-color: getCssVar(dropdown, select-option-item-bkcolor); border-radius: getCssVar(spacing, base); + @include m(has-bg) { + padding: 0 getCssVar(spacing, base); + } } @include b(dropdown-pop){ diff --git a/src/editor/dropdown-list/ibiz-dropdown/ibiz-dropdown.tsx b/src/editor/dropdown-list/ibiz-dropdown/ibiz-dropdown.tsx index aef2a187229fd405a61d299aee9e97997709393a..18d20e88c1963bbca7b32032f4cc85fe324de276 100644 --- a/src/editor/dropdown-list/ibiz-dropdown/ibiz-dropdown.tsx +++ b/src/editor/dropdown-list/ibiz-dropdown/ibiz-dropdown.tsx @@ -258,7 +258,13 @@ export const IBizDropdown = defineComponent({ const codeListItem = this.getCodeListItem(text); return (