{"version":3,"file":"form-base-search.mjs","names":[],"sources":["../../../../../../packages/components/form-base/src/form-base-search.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { reactive, ref } from 'vue'\nimport formBaseSearchItem from './form-base-search-item.vue'\n\ndefineOptions({\n  name: 'formBaseSearch',\n})\n\nconst clickNum = ref(0)\nconst visible = ref(false)\n\nconst list = [\n  {\n    fieldName: 'birthday',\n    fieldType: 'java.time.LocalDate',\n    supportedOperators: [\n      'EQ',\n      'GT',\n      'GE',\n      'LT',\n      'LE',\n      'BETWEEN',\n      'NOT_BETWEEN',\n    ],\n    enabled: true,\n    priority: 20,\n    description: '出生日期',\n  },\n  {\n    fieldName: 'lastLogin',\n    fieldType: 'java.time.LocalDateTime',\n    supportedOperators: [\n      'EQ',\n      'GT',\n      'GE',\n      'LT',\n      'LE',\n      'BETWEEN',\n      'NOT_BETWEEN',\n    ],\n    enabled: true,\n    priority: 20,\n    description: '上次登录时间',\n  },\n  {\n    fieldName: 'education',\n    fieldType: 'java.lang.String',\n    supportedOperators: ['EQ', 'LIKE', 'LIKE_LEFT', 'LIKE_RIGHT'],\n    enabled: true,\n    priority: 20,\n    description: '学历',\n  },\n  {\n    fieldName: 'gender',\n    fieldType: 'java.lang.String',\n    supportedOperators: ['EQ', 'LIKE', 'LIKE_LEFT', 'LIKE_RIGHT'],\n    enabled: true,\n    priority: 20,\n    description: '性别',\n  },\n  {\n    fieldName: 'timezone',\n    fieldType: 'java.lang.String',\n    supportedOperators: ['EQ', 'LIKE', 'LIKE_LEFT', 'LIKE_RIGHT'],\n    enabled: true,\n    priority: 20,\n    description: '时区',\n  },\n  {\n    fieldName: 'extJson',\n    fieldType: 'java.lang.Object',\n    supportedOperators: ['EQ', 'NE'],\n    enabled: true,\n    priority: 20,\n    description: '扩展字段(JSON格式)',\n  },\n  {\n    fieldName: 'remark',\n    fieldType: 'java.lang.String',\n    supportedOperators: ['EQ', 'LIKE', 'LIKE_LEFT', 'LIKE_RIGHT'],\n    enabled: true,\n    priority: 20,\n    description: '备注',\n  },\n  {\n    fieldName: 'language',\n    fieldType: 'java.lang.String',\n    supportedOperators: ['EQ', 'LIKE', 'LIKE_LEFT', 'LIKE_RIGHT'],\n    enabled: true,\n    priority: 20,\n    description: '语言偏好',\n  },\n  {\n    fieldName: 'enabled',\n    fieldType: 'java.lang.Boolean',\n    supportedOperators: ['EQ', 'NE'],\n    enabled: true,\n    priority: 20,\n    description: '是否启用',\n  },\n  {\n    fieldName: 'lastLoginIp',\n    fieldType: 'java.lang.String',\n    supportedOperators: ['EQ', 'LIKE', 'LIKE_LEFT', 'LIKE_RIGHT'],\n    enabled: true,\n    priority: 20,\n    description: '登录IP',\n  },\n  {\n    fieldName: 'registerSource',\n    fieldType: 'java.lang.String',\n    supportedOperators: ['EQ', 'LIKE', 'LIKE_LEFT', 'LIKE_RIGHT'],\n    enabled: true,\n    priority: 20,\n    description: '注册来源',\n  },\n  {\n    fieldName: 'securityLevel',\n    fieldType: 'java.lang.Integer',\n    supportedOperators: ['EQ', 'GT', 'GE', 'LT', 'LE', 'BETWEEN'],\n    enabled: true,\n    priority: 20,\n    description: '安全等级',\n  },\n  {\n    fieldName: 'score',\n    fieldType: 'java.lang.Integer',\n    supportedOperators: ['EQ', 'GT', 'GE', 'LT', 'LE', 'BETWEEN'],\n    enabled: true,\n    priority: 20,\n    description: '分数',\n  },\n  {\n    fieldName: 'twoFactorEnabled',\n    fieldType: 'java.lang.Boolean',\n    supportedOperators: ['EQ', 'NE'],\n    enabled: true,\n    priority: 20,\n    description: '双因子认证',\n  },\n  {\n    fieldName: 'province',\n    fieldType: 'java.lang.String',\n    supportedOperators: ['EQ', 'IN', 'LIKE', 'LIKE_LEFT', 'LIKE_RIGHT'],\n    enabled: true,\n    priority: 20,\n    description: '省份',\n  },\n  {\n    fieldName: 'nickname',\n    fieldType: 'java.lang.String',\n    supportedOperators: ['EQ', 'LIKE', 'LIKE_LEFT', 'LIKE_RIGHT'],\n    enabled: true,\n    priority: 20,\n    description: '昵称',\n  },\n  {\n    fieldName: 'passed',\n    fieldType: 'java.lang.Boolean',\n    supportedOperators: ['EQ', 'NE'],\n    enabled: true,\n    priority: 20,\n    description: '是否通过',\n  },\n  {\n    fieldName: 'id',\n    fieldType: 'java.lang.Long',\n    supportedOperators: ['EQ', 'GT', 'GE', 'LT', 'LE', 'BETWEEN'],\n    enabled: true,\n    priority: 20,\n    description: '主键ID',\n  },\n  {\n    fieldName: 'email',\n    fieldType: 'java.lang.String',\n    supportedOperators: ['EQ', 'LIKE', 'LIKE_LEFT', 'LIKE_RIGHT'],\n    enabled: true,\n    priority: 20,\n    description: '电子邮箱',\n  },\n  {\n    fieldName: 'loginChannel',\n    fieldType: 'java.lang.String',\n    supportedOperators: ['EQ', 'LIKE', 'LIKE_LEFT', 'LIKE_RIGHT'],\n    enabled: true,\n    priority: 20,\n    description: '登录渠道',\n  },\n  {\n    fieldName: 'accessLevel',\n    fieldType: 'java.lang.Integer',\n    supportedOperators: ['EQ', 'GT', 'GE', 'LT', 'LE', 'BETWEEN'],\n    enabled: true,\n    priority: 20,\n    description: '访问级别',\n  },\n  {\n    fieldName: 'lastModifiedDate',\n    fieldType: 'java.time.LocalDateTime',\n    supportedOperators: [\n      'EQ',\n      'GT',\n      'GE',\n      'LT',\n      'LE',\n      'BETWEEN',\n      'NOT_BETWEEN',\n    ],\n    enabled: true,\n    priority: 20,\n    description: '最后修改时间',\n  },\n  {\n    fieldName: 'avatarUrl',\n    fieldType: 'java.lang.String',\n    supportedOperators: ['EQ', 'LIKE', 'LIKE_LEFT', 'LIKE_RIGHT'],\n    enabled: true,\n    priority: 20,\n    description: '头像URL',\n  },\n  {\n    fieldName: 'retryCount',\n    fieldType: 'java.lang.Integer',\n    supportedOperators: ['EQ', 'GT', 'GE', 'LT', 'LE', 'BETWEEN'],\n    enabled: true,\n    priority: 20,\n    description: '登录失败次数',\n  },\n  {\n    fieldName: 'phoneVerified',\n    fieldType: 'java.lang.Boolean',\n    supportedOperators: ['EQ', 'NE'],\n    enabled: true,\n    priority: 20,\n    description: '手机是否验证',\n  },\n  {\n    fieldName: 'lastModifiedBy',\n    fieldType: 'java.lang.String',\n    supportedOperators: ['EQ', 'LIKE', 'LIKE_LEFT', 'LIKE_RIGHT'],\n    enabled: true,\n    priority: 20,\n    description: '最后修改人',\n  },\n  {\n    fieldName: 'active',\n    fieldType: 'java.lang.Boolean',\n    supportedOperators: ['EQ', 'NE'],\n    enabled: true,\n    priority: 20,\n    description: '是否激活',\n  },\n  {\n    fieldName: 'version',\n    fieldType: 'java.lang.Integer',\n    supportedOperators: ['EQ', 'GT', 'GE', 'LT', 'LE', 'BETWEEN'],\n    enabled: true,\n    priority: 20,\n    description: '乐观锁',\n  },\n  {\n    fieldName: 'loginCount',\n    fieldType: 'java.lang.Integer',\n    supportedOperators: ['EQ', 'GT', 'GE', 'LT', 'LE', 'BETWEEN'],\n    enabled: true,\n    priority: 20,\n    description: '登录次数',\n  },\n  {\n    fieldName: 'tags',\n    fieldType: 'java.lang.String',\n    supportedOperators: ['EQ', 'LIKE', 'LIKE_LEFT', 'LIKE_RIGHT'],\n    enabled: true,\n    priority: 20,\n    description: '标签',\n  },\n  {\n    fieldName: 'passwordUpdatedAt',\n    fieldType: 'java.time.LocalDateTime',\n    supportedOperators: [\n      'EQ',\n      'GT',\n      'GE',\n      'LT',\n      'LE',\n      'BETWEEN',\n      'NOT_BETWEEN',\n    ],\n    enabled: true,\n    priority: 20,\n    description: '密码更新时间',\n  },\n  {\n    fieldName: 'emailVerified',\n    fieldType: 'java.lang.Boolean',\n    supportedOperators: ['EQ', 'NE'],\n    enabled: true,\n    priority: 20,\n    description: '邮箱是否验证',\n  },\n  {\n    fieldName: 'realName',\n    fieldType: 'java.lang.String',\n    supportedOperators: ['EQ', 'LIKE', 'LIKE_LEFT', 'LIKE_RIGHT'],\n    enabled: true,\n    priority: 20,\n    description: '真实姓名',\n  },\n  {\n    fieldName: 'createdDate',\n    fieldType: 'java.time.LocalDateTime',\n    supportedOperators: [\n      'EQ',\n      'GT',\n      'GE',\n      'LT',\n      'LE',\n      'BETWEEN',\n      'NOT_BETWEEN',\n    ],\n    enabled: true,\n    priority: 20,\n    description: '创建时间',\n  },\n  {\n    fieldName: 'createdBy',\n    fieldType: 'java.lang.String',\n    supportedOperators: ['EQ', 'LIKE', 'LIKE_LEFT', 'LIKE_RIGHT'],\n    enabled: true,\n    priority: 20,\n    description: '创建人',\n  },\n  {\n    fieldName: 'phone',\n    fieldType: 'java.lang.String',\n    supportedOperators: ['EQ', 'LIKE', 'LIKE_LEFT', 'LIKE_RIGHT'],\n    enabled: true,\n    priority: 20,\n    description: '手机号',\n  },\n  {\n    fieldName: 'grade',\n    fieldType: 'java.lang.String',\n    supportedOperators: ['EQ', 'LIKE', 'LIKE_LEFT', 'LIKE_RIGHT'],\n    enabled: true,\n    priority: 20,\n    description: '年级',\n  },\n  {\n    fieldName: 'tenantId',\n    fieldType: 'java.lang.String',\n    supportedOperators: ['EQ', 'LIKE', 'LIKE_LEFT', 'LIKE_RIGHT'],\n    enabled: true,\n    priority: 20,\n    description: '租户ID',\n  },\n  {\n    fieldName: 'idCardNumber',\n    fieldType: 'java.lang.String',\n    supportedOperators: ['EQ', 'LIKE', 'LIKE_LEFT', 'LIKE_RIGHT'],\n    enabled: true,\n    priority: 20,\n    description: '身份证号',\n  },\n  {\n    fieldName: 'lastLoginDevice',\n    fieldType: 'java.lang.String',\n    supportedOperators: ['EQ', 'LIKE', 'LIKE_LEFT', 'LIKE_RIGHT'],\n    enabled: true,\n    priority: 20,\n    description: '登录设备',\n  },\n  {\n    fieldName: 'userType',\n    fieldType: 'java.lang.String',\n    supportedOperators: ['EQ', 'LIKE', 'LIKE_LEFT', 'LIKE_RIGHT'],\n    enabled: true,\n    priority: 20,\n    description: '用户类型',\n  },\n  {\n    fieldName: 'passwordExpired',\n    fieldType: 'java.lang.Boolean',\n    supportedOperators: ['EQ', 'NE'],\n    enabled: true,\n    priority: 20,\n    description: '密码是否过期',\n  },\n  {\n    fieldName: 'region',\n    fieldType: 'java.lang.String',\n    supportedOperators: ['EQ', 'LIKE', 'LIKE_LEFT', 'LIKE_RIGHT'],\n    enabled: true,\n    priority: 20,\n    description: '地区',\n  },\n  {\n    fieldName: 'age',\n    fieldType: 'java.lang.Integer',\n    supportedOperators: ['EQ', 'GT', 'GE', 'LT', 'LE', 'BETWEEN'],\n    enabled: true,\n    priority: 20,\n    description: '年龄',\n  },\n  {\n    fieldName: 'status',\n    fieldType: 'java.lang.String',\n    supportedOperators: ['EQ', 'LIKE', 'LIKE_LEFT', 'LIKE_RIGHT'],\n    enabled: true,\n    priority: 20,\n    description: '状态',\n  },\n  {\n    fieldName: 'username',\n    fieldType: 'java.lang.String',\n    supportedOperators: ['EQ', 'LIKE', 'LIKE_LEFT', 'LIKE_RIGHT'],\n    enabled: true,\n    priority: 20,\n    description: '用户名',\n  },\n]\n\nlet searchList = reactive<any>([])\n\n// const searchList = reactive<any>([\n//   {\n//     checkboxValue: true,\n//     level: 0,\n//     fieldName: \"project\",\n//   },\n//   {\n//     checkboxValue: true,\n//     level: 0,\n//     fieldName: \"project\",\n//   },\n//   {\n//     checkboxValue: true,\n//     level: 0,\n//     fieldName: \"project2\",\n//     isGroup: true,\n//     children: [\n//       {\n//         checkboxValue: true,\n//         level: 1,\n//         fieldName: \"project2-1\",\n//       },\n//       {\n//         checkboxValue: true,\n//         level: 1,\n//         fieldName: \"project2-1\",\n//       }\n//     ]\n//   },\n//   {\n//     checkboxValue: true,\n//     level: 0,\n//     fieldName: \"project3\",\n//     isGroup: true,\n//     children: [\n//       {\n//         checkboxValue: true,\n//         level: 1,\n//         fieldName: \"project3-1\",\n//       },\n//       {\n//         checkboxValue: true,\n//         level: 1,\n//         fieldName: \"project3-3\",\n//       },\n//       {\n//         checkboxValue: true,\n//         level: 1,\n//         isGroup: true,\n//         fieldName: \"project3-2\",\n//         children: [\n//           {\n//             checkboxValue: true,\n//             level: 2,\n//             fieldName: \"project3-2-1\",\n//           }\n//         ]\n//       }\n//     ]\n//   },\n//   {\n//     checkboxValue: true,\n//     level: 0,\n//     fieldName: \"project4\",\n//     isGroup: true,\n//     children: [\n//       {\n//         checkboxValue: true,\n//         level: 1,\n//         fieldName: \"project4-1\",\n//       },\n//       {\n//         checkboxValue: true,\n//         level: 1,\n//         isGroup: true,\n//         fieldName: \"project4-1\",\n//         children: [\n//           {\n//             checkboxValue: true,\n//             level: 2,\n//             fieldName: \"project4-1-1\",\n//           },\n//           {\n//             checkboxValue: true,\n//             level: 2,\n//             isGroup: true,\n//             fieldName: \"project4-1-1\",\n//             children: [\n//                 {\n//                 checkboxValue: true,\n//                 level: 3,\n//                 fieldName: \"project4-1-1\",\n//               }\n//             ]\n//           }\n//         ]\n//       }\n//     ]\n//   },\n// ])\n\nconst state1 = list.map((item) => item.fieldName)\n\nconst methods = {\n  handleClickAdd(item: any) {\n    clickNum.value++\n    if (Object.keys(item).length > 0) {\n      if (item.level === 0) {\n        searchList.push({\n          checkboxValue: true,\n          level: 0,\n          pid: item.uid,\n          uid: methods.generateUUID(),\n          fieldName: state1[clickNum.value % state1.length],\n        })\n      } else {\n        const pNode = methods.flat(searchList, item.pid)\n        pNode.children.push({\n          checkboxValue: true,\n          level: pNode.level + 1,\n          pid: pNode.uid,\n          uid: methods.generateUUID(),\n          fieldName: state1[clickNum.value % state1.length],\n        })\n      }\n    } else {\n      searchList.push({\n        checkboxValue: true,\n        level: 0,\n        pid: 0,\n        uid: methods.generateUUID(),\n        fieldName: state1[clickNum.value % state1.length],\n      })\n    }\n  },\n  handleClickGroup(item: any) {\n    clickNum.value++\n    if (Object.keys(item).length > 0) {\n      if (item.level === 0) {\n        const id = methods.generateUUID()\n        searchList.push({\n          checkboxValue: true,\n          level: 0,\n          isGroup: true,\n          uid: id,\n          pid: item.uid,\n          children: [\n            {\n              checkboxValue: true,\n              level: 1,\n              pid: id,\n              uid: methods.generateUUID(),\n              fieldName: state1[clickNum.value % state1.length],\n            },\n          ],\n        })\n      } else {\n        const pNode = methods.flat(searchList, item.pid)\n        const id = methods.generateUUID()\n        pNode.children.push({\n          checkboxValue: true,\n          level: pNode.level + 1,\n          uid: id,\n          pid: pNode.uid,\n          isGroup: true,\n          children: [\n            {\n              checkboxValue: true,\n              uid: methods.generateUUID(),\n              pid: id,\n              level: pNode.level + 2,\n              fieldName: state1[clickNum.value % state1.length],\n            },\n          ],\n        })\n      }\n    } else {\n      const id = methods.generateUUID()\n      searchList.push({\n        checkboxValue: true,\n        level: 0,\n        uid: id,\n        pid: 0,\n        isGroup: true,\n        children: [\n          {\n            checkboxValue: true,\n            level: 1,\n            pid: id,\n            uid: methods.generateUUID(),\n            fieldName: state1[clickNum.value % state1.length],\n          },\n        ],\n      })\n    }\n  },\n  add(item: any) {\n    methods.handleClickAdd(item)\n  },\n  group(item: any) {\n    methods.handleClickGroup(item)\n  },\n  hanldeCheckbox(item: any) {\n    const fn = (data: any) => {\n      data.forEach((k: any) => {\n        k.checkboxValue = item.checkboxValue\n        if (k.children && k.children.length > 0) {\n          fn(k.children)\n        }\n      })\n    }\n    if (item.children) {\n      fn(item.children)\n    }\n  },\n  handleClear() {\n    clickNum.value = 0\n    searchList.length = 0\n  },\n  generateUUID() {\n    const template = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'\n    return template.replace(/[xy]/g, (c) => {\n      const r = (Math.random() * 16) | 0\n      const v = c === 'x' ? r : (r & 0x3) | 0x8\n      return v.toString(16)\n    })\n  },\n  flat(arr: any, pid: any): any {\n    for (let node of arr) {\n      if (node.uid === pid) {\n        return node // 找到匹配的节点，返回它\n      } else if (node.children) {\n        const found = methods.flat(node.children, pid) // 递归查找子节点\n        if (found) {\n          return found // 如果在子节点中找到，返回它\n        }\n      }\n    }\n    return null // 如果没有找到，返回null\n  },\n}\n</script>\n\n<template>\n  <el-popover\n    placement=\"bottom-start\"\n    :width=\"800\"\n    trigger=\"click\"\n    :visible=\"visible\"\n  >\n    <div style=\"display: flex; height: 100%\">\n      <div style=\"flex: 1; height: 100%\">\n        <div>\n          <el-button text @click=\"methods.handleClear\">清空</el-button>\n        </div>\n        <div class=\"form-base-search\">\n          <template v-if=\"searchList.length > 0\">\n            <formBaseSearchItem\n              v-for=\"(item, index) in searchList\"\n              :key=\"index\"\n              :item-data=\"item\"\n              @add=\"methods.add\"\n              @group=\"methods.group\"\n              @changeCheckbox=\"methods.hanldeCheckbox\"\n              :state1=\"state1\"\n              :dataList=\"list\"\n            ></formBaseSearchItem>\n          </template>\n          <template v-else>\n            <div class=\"form-base-search-item\">\n              <div class=\"form-base-search-item-top\">\n                <div\n                  class=\"form-base-search-item-btn\"\n                  @click=\"methods.handleClickAdd({})\"\n                >\n                  +\n                </div>\n                <div\n                  class=\"form-base-search-item-btn\"\n                  @click=\"methods.handleClickGroup({})\"\n                >\n                  <span>()</span>\n                  <span>+</span>\n                </div>\n              </div>\n            </div>\n          </template>\n        </div>\n      </div>\n\n      <div style=\"width: 400px; height: 480px; overflow: auto\">\n        <pre>{{ searchList }}</pre>\n      </div>\n    </div>\n    <template #reference>\n      <el-button @click=\"visible = !visible\">筛选</el-button>\n    </template>\n  </el-popover>\n</template>\n"],"mappings":""}