From f70df2a1c8a6a7417455c09d0e95d2e568bafc40 Mon Sep 17 00:00:00 2001 From: NanGua-QWQ Date: Fri, 27 Mar 2026 21:50:22 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BD=BF=E7=94=A8react-awesome-query-b?= =?UTF-8?q?uilder=E5=AE=9E=E7=8E=B0=E8=87=AA=E5=8A=A8=E5=8A=A0=E5=88=86?= =?UTF-8?q?=E8=A7=84=E5=88=99=E6=9E=84=E5=BB=BA=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 5 - pnpm-lock.yaml | 140 ++-------- src/components/AutoScoreManager.tsx | 42 +-- src/components/autoScore/BuilderUtils.ts | 149 +++++++++++ src/components/autoScore/Rule.tsx | 204 ++++++++++++++ src/components/autoScore/aaa.tsx | 104 ++++++++ src/components/autoScore/actionComponent.tsx | 107 -------- .../autoScore/ruleBuilderOverride.css | 251 ------------------ src/components/autoScore/ruleBuilderUtils.ts | 117 -------- src/components/autoScore/ruleComponent.tsx | 64 ----- 10 files changed, 478 insertions(+), 705 deletions(-) create mode 100644 src/components/autoScore/BuilderUtils.ts create mode 100644 src/components/autoScore/Rule.tsx create mode 100644 src/components/autoScore/aaa.tsx delete mode 100644 src/components/autoScore/actionComponent.tsx delete mode 100644 src/components/autoScore/ruleBuilderOverride.css delete mode 100644 src/components/autoScore/ruleBuilderUtils.ts delete mode 100644 src/components/autoScore/ruleComponent.tsx diff --git a/package.json b/package.json index 8aebb7b..9db5c3a 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,6 @@ "dependencies": { "@ant-design/icons": "^6.1.0", "@react-awesome-query-builder/antd": "6.7.0-alpha.0", - "@react-querybuilder/antd": "^8.14.0", - "@react-querybuilder/dnd": "^8.14.0", "@tauri-apps/api": "^2.5.0", "antd": "^6.3.1", "dayjs": "^1.11.20", @@ -28,9 +26,6 @@ "json-rules-engine": "^7.3.1", "pinyin-pro": "^3.27.0", "react": "^19.2.1", - "react-dnd": "^16.0.1", - "react-dnd-html5-backend": "^16.0.1", - "react-dnd-touch-backend": "^16.0.1", "react-dom": "^19.2.1", "react-i18next": "^16.5.6", "react-querybuilder": "^8.14.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d409fb3..8b2c5bb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,12 +14,6 @@ importers: '@react-awesome-query-builder/antd': specifier: 6.7.0-alpha.0 version: 6.7.0-alpha.0(@ant-design/icons@6.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(antd@6.3.2(moment@2.30.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(dayjs@1.11.20)(moment@2.30.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-querybuilder/antd': - specifier: ^8.14.0 - version: 8.14.0(@ant-design/icons@6.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(antd@6.3.2(moment@2.30.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(dayjs@1.11.20)(react-querybuilder@8.14.0(@types/react@19.2.14)(json-logic-js@2.0.5)(react@19.2.4)(redux@5.0.1))(react@19.2.4) - '@react-querybuilder/dnd': - specifier: ^8.14.0 - version: 8.14.0(react-dnd-html5-backend@16.0.1)(react-dnd-touch-backend@16.0.1)(react-dnd@16.0.1(@types/hoist-non-react-statics@3.3.7(@types/react@19.2.14))(@types/node@22.19.15)(@types/react@19.2.14)(react@19.2.4))(react-querybuilder@8.14.0(@types/react@19.2.14)(json-logic-js@2.0.5)(react@19.2.4)(redux@5.0.1))(react@19.2.4) '@tauri-apps/api': specifier: ^2.5.0 version: 2.10.1 @@ -41,15 +35,6 @@ importers: react: specifier: ^19.2.1 version: 19.2.4 - react-dnd: - specifier: ^16.0.1 - version: 16.0.1(@types/hoist-non-react-statics@3.3.7(@types/react@19.2.14))(@types/node@22.19.15)(@types/react@19.2.14)(react@19.2.4) - react-dnd-html5-backend: - specifier: ^16.0.1 - version: 16.0.1 - react-dnd-touch-backend: - specifier: ^16.0.1 - version: 16.0.1 react-dom: specifier: ^19.2.1 version: 19.2.4(react@19.2.4) @@ -791,24 +776,6 @@ packages: react: ^16.8.4 || ^17.0.1 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.4 || ^17.0.1 || ^18.0.0 || ^19.0.0 - '@react-dnd/asap@5.0.2': - resolution: {integrity: sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==} - - '@react-dnd/invariant@4.0.2': - resolution: {integrity: sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==} - - '@react-dnd/shallowequal@4.0.2': - resolution: {integrity: sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==} - - '@react-querybuilder/antd@8.14.0': - resolution: {integrity: sha512-H6SMCmKtciOIJyXo29oLMMDIG1+ydE7eoIqAIhItsvJN7iLcAPhvKd5+CuHyOWj9tokEAHGpdm4BP+KPFAxTNw==} - peerDependencies: - '@ant-design/icons': '>=5' - antd: '>=5.11.0' - dayjs: '>=1' - react: '>=18' - react-querybuilder: 8.14.0 - '@react-querybuilder/core@8.14.0': resolution: {integrity: sha512-j1pIY0Yyn/dXu9ZST/DVY7TqRmIO1hY/mZ8653DaeHaDzUF37tOdkm/NQDU9RfM0KXIWsJY5zlvYAR1DypZ+7g==} peerDependencies: @@ -823,20 +790,6 @@ packages: sequelize: optional: true - '@react-querybuilder/dnd@8.14.0': - resolution: {integrity: sha512-g0BHs9Vtbm7OhnhIq1pxJNY3JXNmSbA7NVTlOuqoAfFl0D46rZfGInVzoBfpwVpoLtQIXPO25Y5N/1/LcWuSNg==} - peerDependencies: - react: '>=18' - react-dnd: '>=14.0.0' - react-dnd-html5-backend: '>=14.0.0' - react-dnd-touch-backend: '>=14.0.0' - react-querybuilder: 8.14.0 - peerDependenciesMeta: - react-dnd-html5-backend: - optional: true - react-dnd-touch-backend: - optional: true - '@reduxjs/toolkit@2.11.2': resolution: {integrity: sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==} peerDependencies: @@ -889,66 +842,79 @@ packages: resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.59.0': resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.59.0': resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.59.0': resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.59.0': resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.59.0': resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} cpu: [loong64] os: [linux] + libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.59.0': resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.59.0': resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} cpu: [ppc64] os: [linux] + libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.59.0': resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.59.0': resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.59.0': resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.59.0': resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.59.0': resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openbsd-x64@4.59.0': resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} @@ -1012,30 +978,35 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@tauri-apps/cli-linux-arm64-musl@2.10.1': resolution: {integrity: sha512-MIj78PDDGjkg3NqGptDOGgfXks7SYJwhiMh8SBoZS+vfdz7yP5jN18bNaLnDhsVIPARcAhE1TlsZe/8Yxo2zqg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@tauri-apps/cli-linux-riscv64-gnu@2.10.1': resolution: {integrity: sha512-X0lvOVUg8PCVaoEtEAnpxmnkwlE1gcMDTqfhbefICKDnOTJ5Est3qL0SrWxizDackIOKBcvtpejrSiVpuJI1kw==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] + libc: [glibc] '@tauri-apps/cli-linux-x64-gnu@2.10.1': resolution: {integrity: sha512-2/12bEzsJS9fAKybxgicCDFxYD1WEI9kO+tlDwX5znWG2GwMBaiWcmhGlZ8fi+DMe9CXlcVarMTYc0L3REIRxw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@tauri-apps/cli-linux-x64-musl@2.10.1': resolution: {integrity: sha512-Y8J0ZzswPz50UcGOFuXGEMrxbjwKSPgXftx5qnkuMs2rmwQB5ssvLb6tn54wDSYxe7S6vlLob9vt0VKuNOaCIQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@tauri-apps/cli-win32-arm64-msvc@2.10.1': resolution: {integrity: sha512-iSt5B86jHYAPJa/IlYw++SXtFPGnWtFJriHn7X0NFBVunF6zu9+/zOn8OgqIWSl8RgzhLGXQEEtGBdR4wzpVgg==} @@ -1372,9 +1343,6 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} - dnd-core@16.0.1: - resolution: {integrity: sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==} - doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -2029,27 +1997,6 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - react-dnd-html5-backend@16.0.1: - resolution: {integrity: sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw==} - - react-dnd-touch-backend@16.0.1: - resolution: {integrity: sha512-NonoCABzzjyWGZuDxSG77dbgMZ2Wad7eQiCd/ECtsR2/NBLTjGksPUx9UPezZ1nQ/L7iD130Tz3RUshL/ClKLA==} - - react-dnd@16.0.1: - resolution: {integrity: sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==} - peerDependencies: - '@types/hoist-non-react-statics': '>= 3.3.1' - '@types/node': '>= 12' - '@types/react': '>= 16' - react: '>= 16.14' - peerDependenciesMeta: - '@types/hoist-non-react-statics': - optional: true - '@types/node': - optional: true - '@types/react': - optional: true - react-dom@19.2.4: resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} peerDependencies: @@ -3210,20 +3157,6 @@ snapshots: - '@types/react-dom' - react-native - '@react-dnd/asap@5.0.2': {} - - '@react-dnd/invariant@4.0.2': {} - - '@react-dnd/shallowequal@4.0.2': {} - - '@react-querybuilder/antd@8.14.0(@ant-design/icons@6.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(antd@6.3.2(moment@2.30.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(dayjs@1.11.20)(react-querybuilder@8.14.0(@types/react@19.2.14)(json-logic-js@2.0.5)(react@19.2.4)(redux@5.0.1))(react@19.2.4)': - dependencies: - '@ant-design/icons': 6.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - antd: 6.3.2(moment@2.30.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - dayjs: 1.11.20 - react: 19.2.4 - react-querybuilder: 8.14.0(@types/react@19.2.14)(json-logic-js@2.0.5)(react@19.2.4)(redux@5.0.1) - '@react-querybuilder/core@8.14.0(json-logic-js@2.0.5)': dependencies: '@ts-jison/lexer': 0.4.1-alpha.1 @@ -3233,15 +3166,6 @@ snapshots: optionalDependencies: json-logic-js: 2.0.5 - '@react-querybuilder/dnd@8.14.0(react-dnd-html5-backend@16.0.1)(react-dnd-touch-backend@16.0.1)(react-dnd@16.0.1(@types/hoist-non-react-statics@3.3.7(@types/react@19.2.14))(@types/node@22.19.15)(@types/react@19.2.14)(react@19.2.4))(react-querybuilder@8.14.0(@types/react@19.2.14)(json-logic-js@2.0.5)(react@19.2.4)(redux@5.0.1))(react@19.2.4)': - dependencies: - react: 19.2.4 - react-dnd: 16.0.1(@types/hoist-non-react-statics@3.3.7(@types/react@19.2.14))(@types/node@22.19.15)(@types/react@19.2.14)(react@19.2.4) - react-querybuilder: 8.14.0(@types/react@19.2.14)(json-logic-js@2.0.5)(react@19.2.4)(redux@5.0.1) - optionalDependencies: - react-dnd-html5-backend: 16.0.1 - react-dnd-touch-backend: 16.0.1 - '@reduxjs/toolkit@2.11.2(react-redux@9.2.0(@types/react@19.2.14)(react@19.2.4)(redux@5.0.1))(react@19.2.4)': dependencies: '@standard-schema/spec': 1.1.0 @@ -3811,12 +3735,6 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 - dnd-core@16.0.1: - dependencies: - '@react-dnd/asap': 5.0.2 - '@react-dnd/invariant': 4.0.2 - redux: 4.2.1 - doctrine@2.1.0: dependencies: esutils: 2.0.3 @@ -4594,28 +4512,6 @@ snapshots: react-dom: 19.2.4(react@19.2.4) react-is: 18.3.1 - react-dnd-html5-backend@16.0.1: - dependencies: - dnd-core: 16.0.1 - - react-dnd-touch-backend@16.0.1: - dependencies: - '@react-dnd/invariant': 4.0.2 - dnd-core: 16.0.1 - - react-dnd@16.0.1(@types/hoist-non-react-statics@3.3.7(@types/react@19.2.14))(@types/node@22.19.15)(@types/react@19.2.14)(react@19.2.4): - dependencies: - '@react-dnd/invariant': 4.0.2 - '@react-dnd/shallowequal': 4.0.2 - dnd-core: 16.0.1 - fast-deep-equal: 3.1.3 - hoist-non-react-statics: 3.3.2 - react: 19.2.4 - optionalDependencies: - '@types/hoist-non-react-statics': 3.3.7(@types/react@19.2.14) - '@types/node': 22.19.15 - '@types/react': 19.2.14 - react-dom@19.2.4(react@19.2.4): dependencies: react: 19.2.4 diff --git a/src/components/AutoScoreManager.tsx b/src/components/AutoScoreManager.tsx index 3ac5a76..f6c90ac 100644 --- a/src/components/AutoScoreManager.tsx +++ b/src/components/AutoScoreManager.tsx @@ -1,7 +1,7 @@ import { useState, useEffect } from "react" import { HolderOutlined } from "@ant-design/icons" import { useTranslation } from "react-i18next" -import RuleComponent from "./autoScore/ruleComponent" +import DemoQueryBuilder from "./autoScore/aaa" import { Card, Form, @@ -426,44 +426,8 @@ export const AutoScoreManager: React.FC = () => { - - - {/* - - {triggerList.map((trigger, index) => renderTriggerItem(trigger, index))} - {' '} - - - - */} - - {/* - - {actionList.map((action) => renderActionItem(action))} - - - */} - + +
- ))} - - - - - ) -} - -export default ActionComponent diff --git a/src/components/autoScore/ruleBuilderOverride.css b/src/components/autoScore/ruleBuilderOverride.css deleted file mode 100644 index 045ac08..0000000 --- a/src/components/autoScore/ruleBuilderOverride.css +++ /dev/null @@ -1,251 +0,0 @@ -.ruleGroup { - background-color: var(--ss-card-bg, #fff); - border: 1px solid var(--ss-border-color, #d9d9d9); - border-radius: 8px; - padding: 16px; - margin-bottom: 12px; -} - -.ruleGroup-header { - display: flex; - align-items: center; - gap: 12px; - margin-bottom: 12px; - flex-wrap: wrap; -} - -.ruleGroup-combinators, -.ruleGroup-addRule, -.ruleGroup-addGroup { - margin-right: 8px; -} - -.ruleGroup-body { - padding-left: 12px; - border-left: 2px solid var(--ss-primary-color, #1677ff); - margin-left: 4px; -} - -.rule { - display: flex; - align-items: center; - gap: 8px; - padding: 8px 12px; - background-color: var(--ss-item-bg, rgba(0, 0, 0, 0.02)); - border-radius: 6px; - margin-bottom: 8px; - flex-wrap: wrap; -} - -.rule:hover { - background-color: var(--ss-item-hover, rgba(0, 0, 0, 0.04)); -} - -.rule-fields, -.rule-operators, -.rule-value, -.rule-subfields { - min-width: 120px; -} - -.rule-fields .ant-select-selector, -.rule-operators .ant-select-selector, -.rule-subfields .ant-select-selector { - background-color: var(--ss-input-bg, #fff) !important; - border-color: var(--ss-border-color, #d9d9d9) !important; - color: var(--ss-text-main, rgba(0, 0, 0, 0.88)) !important; -} - -.rule-fields .ant-select-selector:hover, -.rule-operators .ant-select-selector:hover, -.rule-subfields .ant-select-selector:hover { - border-color: var(--ss-primary-color, #1677ff) !important; -} - -.rule-fields .ant-select-focused .ant-select-selector, -.rule-operators .ant-select-focused .ant-select-selector, -.rule-subfields .ant-select-focused .ant-select-selector { - border-color: var(--ss-primary-color, #1677ff) !important; - box-shadow: 0 0 0 2px rgba(var(--ss-primary-rgb, 22, 119, 255), 0.1) !important; -} - -.rule-value .ant-input, -.rule-value .ant-input-number, -.rule-value .ant-select-selector { - background-color: var(--ss-input-bg, #fff) !important; - border-color: var(--ss-border-color, #d9d9d9) !important; - color: var(--ss-text-main, rgba(0, 0, 0, 0.88)) !important; -} - -.rule-value .ant-input:hover, -.rule-value .ant-input-number:hover, -.rule-value .ant-select-selector:hover { - border-color: var(--ss-primary-color, #1677ff) !important; -} - -.rule-value .ant-input:focus, -.rule-value .ant-input-number-focused, -.rule-value .ant-select-focused .ant-select-selector { - border-color: var(--ss-primary-color, #1677ff) !important; - box-shadow: 0 0 0 2px rgba(var(--ss-primary-rgb, 22, 119, 255), 0.1) !important; -} - -.rule-value .ant-input-number-input { - color: var(--ss-text-main, rgba(0, 0, 0, 0.88)) !important; -} - -.rule-remove, -.ruleGroup-remove { - color: #fff !important; - background-color: var(--ant-color-error, #ff4d4f) !important; - border-color: var(--ant-color-error, #ff4d4f) !important; - transition: all 0.2s; -} - -.rule-remove:hover, -.ruleGroup-remove:hover { - color: #fff !important; - background-color: #ff7875 !important; - border-color: #ff7875 !important; -} - -.ruleGroup-addRule, -.ruleGroup-addGroup { - color: var(--ss-primary-color, #1677ff) !important; - border-color: var(--ss-primary-color, #1677ff) !important; - background-color: transparent !important; -} - -.ruleGroup-addRule:hover, -.ruleGroup-addGroup:hover { - color: #fff !important; - background-color: var(--ss-primary-color, #1677ff) !important; -} - -.betweenRules { - display: flex; - align-items: center; - justify-content: center; - margin: 8px 0; - color: var(--ss-text-secondary, rgba(0, 0, 0, 0.45)); - font-size: 12px; -} - -.betweenRules::before, -.betweenRules::after { - content: ""; - flex: 1; - height: 1px; - background-color: var(--ss-border-color, #d9d9d9); -} - -.betweenRules::before { - margin-right: 12px; -} - -.betweenRules::after { - margin-left: 12px; -} - -.dragHandle { - cursor: grab; - color: var(--ss-text-secondary, rgba(0, 0, 0, 0.45)); - padding: 4px; - margin-right: 4px; -} - -.dragHandle:hover { - color: var(--ss-text-main, rgba(0, 0, 0, 0.88)); -} - -.queryBuilder .ant-select-dropdown { - background-color: var(--ss-card-bg, #fff); -} - -.queryBuilder .ant-select-item { - color: var(--ss-text-main, rgba(0, 0, 0, 0.88)); -} - -.queryBuilder .ant-select-item-option-active { - background-color: var(--ss-item-hover, rgba(0, 0, 0, 0.04)); -} - -.queryBuilder .ant-select-item-option-selected { - background-color: rgba(var(--ss-primary-rgb, 22, 119, 255), 0.1); - color: var(--ss-primary-color, #1677ff); -} - -.queryBuilder .ant-btn { - border-radius: 6px; -} - -.queryBuilder .ant-select-selector, -.queryBuilder .ant-input, -.queryBuilder .ant-input-number { - border-radius: 6px; -} - -[theme-mode="dark"] .ruleGroup { - background-color: var(--ss-card-bg, #1f1f1f); - border-color: var(--ss-border-color, #424242); -} - -[theme-mode="dark"] .rule { - background-color: var(--ss-item-bg, rgba(255, 255, 255, 0.04)); -} - -[theme-mode="dark"] .rule:hover { - background-color: var(--ss-item-hover, rgba(255, 255, 255, 0.08)); -} - -[theme-mode="dark"] .rule-fields .ant-select-selector, -[theme-mode="dark"] .rule-operators .ant-select-selector, -[theme-mode="dark"] .rule-subfields .ant-select-selector, -[theme-mode="dark"] .rule-value .ant-input, -[theme-mode="dark"] .rule-value .ant-input-number, -[theme-mode="dark"] .rule-value .ant-select-selector { - background-color: var(--ss-input-bg, #141414) !important; - border-color: var(--ss-border-color, #424242) !important; - color: var(--ss-text-main, rgba(255, 255, 255, 0.85)) !important; -} - -[theme-mode="dark"] .rule-value .ant-input-number-input { - color: var(--ss-text-main, rgba(255, 255, 255, 0.85)) !important; -} - -[theme-mode="dark"] .betweenRules { - color: var(--ss-text-secondary, rgba(255, 255, 255, 0.45)); -} - -[theme-mode="dark"] .betweenRules::before, -[theme-mode="dark"] .betweenRules::after { - background-color: var(--ss-border-color, #424242); -} - -[theme-mode="dark"] .dragHandle { - color: var(--ss-text-secondary, rgba(255, 255, 255, 0.45)); -} - -[theme-mode="dark"] .dragHandle:hover { - color: var(--ss-text-main, rgba(255, 255, 255, 0.85)); -} - -[theme-mode="dark"] .queryBuilder .ant-select-dropdown { - background-color: var(--ss-card-bg, #1f1f1f); -} - -[theme-mode="dark"] .queryBuilder .ant-select-item { - color: var(--ss-text-main, rgba(255, 255, 255, 0.85)); -} - -[theme-mode="dark"] .queryBuilder .ant-select-item-option-active { - background-color: var(--ss-item-hover, rgba(255, 255, 255, 0.08)); -} - -[theme-mode="dark"] .queryBuilder .ant-select-item-option-selected { - background-color: rgba(var(--ss-primary-rgb, 22, 119, 255), 0.2); -} - -.ruleGroup-header .ant-select-selector { - min-width: 80px; -} diff --git a/src/components/autoScore/ruleBuilderUtils.ts b/src/components/autoScore/ruleBuilderUtils.ts deleted file mode 100644 index 4b9c01d..0000000 --- a/src/components/autoScore/ruleBuilderUtils.ts +++ /dev/null @@ -1,117 +0,0 @@ -import type { RuleGroupType, Field, RuleType } from "react-querybuilder" -import { defaultOperators } from "react-querybuilder" -import { fetchAllTags } from "../TagEditorDialog" - -const tags = await fetchAllTags() - -export interface AutoScoreTrigger { - event: string - value?: string - relation?: "AND" | "OR" -} - -export interface AutoScoreAction { - event: string - value?: string - reason?: string -} - -export interface AutoScoreRuleData { - triggers: AutoScoreTrigger[] - actions: AutoScoreAction[] -} - -export const validator = (r: RuleType) => !!r.value - -export const getFields = (t: (key: string) => string): Field[] => [ - { - name: "student_has_tag", - label: t("triggers.studentTag.label"), - placeholder: t("triggers.studentTag.placeholder"), - valueEditorType: "multiselect", - values: tags.map((tag: { id: number; name: string }) => tag.name), - defaultValue: tags.length > 0 ? [tags[0].name] : [], - operators: defaultOperators.filter((op) => op.name === "in"), - }, - { - name: "interval_time_passed", - label: t("triggers.intervalTime.label"), - matchModes: ["all"], - subproperties: [ - { - name: "month", - label: t("triggers.intervalTime.monthLabel"), - inputType: "number", - datatype: "month", - operators: ["="], - }, - /* { name: 'week', label: t('triggers.intervalTime.weekLabel'), inputType: 'week', datatype: 'week', operators: ['='] }, - */ { - name: "time", - label: t("triggers.intervalTime.timeLabel"), - inputType: "time", - datatype: "time", - operators: ["="], - }, - ], - }, -] - -export const defaultQuery: RuleGroupType = { - combinator: "and", - rules: [{ field: "interval_time_passed", operator: "=", value: "1440" }], -} - -export function queryToAutoScoreRule(): AutoScoreRuleData { - const triggers: AutoScoreTrigger[] = [] - - /* const processRuleGroup = (group: RuleGroupType, relation: 'AND' | 'OR' = 'AND') => { - group.rules.forEach((rule, index) => { - if ('rules' in rule) { - processRuleGroup(rule, group.combinator === 'and' ? 'AND' : 'OR') - } else { - const trigger: AutoScoreTrigger = { - event: rule.field, - value: rule.value as string - } - - if (index > 0) { - trigger.relation = relation - } - - triggers.push(trigger) - } - }) - } */ - - /* processRuleGroup(query) */ - - return { - triggers, - actions: [], - } -} - -export function autoScoreRuleToQuery(ruleData: AutoScoreRuleData): RuleGroupType { - const rules: any[] = [] - let currentCombinator: "and" | "or" = "and" - - ruleData.triggers.forEach((trigger, index) => { - if (index === 0) { - currentCombinator = "and" - } else if (trigger.relation === "OR") { - currentCombinator = "or" - } - - rules.push({ - field: trigger.event, - operator: "=", - value: trigger.value || "", - }) - }) - - return { - combinator: currentCombinator, - rules: rules.length > 0 ? rules : defaultQuery.rules, - } -} diff --git a/src/components/autoScore/ruleComponent.tsx b/src/components/autoScore/ruleComponent.tsx deleted file mode 100644 index b9da023..0000000 --- a/src/components/autoScore/ruleComponent.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { formatQuery, QueryBuilder, RuleGroupType } from "react-querybuilder" -import { useState, useEffect } from "react" -import { useTranslation } from "react-i18next" -import { QueryBuilderDnD } from "@react-querybuilder/dnd" -import * as ReactDnD from "react-dnd" -import { QueryBuilderAntD } from "@react-querybuilder/antd" -import * as ReactDndHtml5Backend from "react-dnd-html5-backend" -import * as ReactDndTouchBackend from "react-dnd-touch-backend" -import { - getFields, - defaultQuery, - autoScoreRuleToQuery, - queryToAutoScoreRule, - type AutoScoreRuleData, -} from "./ruleBuilderUtils" -import { Card } from "antd" - -import "./ruleBuilderOverride.css" - -interface RuleComponentProps { - initialData?: AutoScoreRuleData - onChange?: (data: AutoScoreRuleData) => void -} - -export const RuleComponent: React.FC = ({ initialData, onChange }) => { - const { t } = useTranslation() - const [query, setQuery] = useState( - initialData ? autoScoreRuleToQuery(initialData) : defaultQuery - ) - - useEffect(() => { - if (initialData) { - setQuery(autoScoreRuleToQuery(initialData)) - } - }, [initialData]) - - const handleQueryChange = (newQuery: RuleGroupType) => { - setQuery(newQuery) - if (onChange) { - const ruleData = queryToAutoScoreRule() - onChange(ruleData) - } - } - - return ( -
- - - - - - -
-
{formatQuery(query, "json")}
-
-
-
- ) -} - -export default RuleComponent