pixivflow 2.0.38 → 2.0.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/DownloadCommand.d.ts.map +1 -1
- package/dist/commands/DownloadCommand.js +50 -2
- package/dist/commands/DownloadCommand.js.map +1 -1
- package/dist/config/validation.d.ts.map +1 -1
- package/dist/config/validation.js +11 -3
- package/dist/config/validation.js.map +1 -1
- package/dist/index.js +37 -14
- package/dist/index.js.map +1 -1
- package/dist/package.json +1 -1
- package/dist/pixiv/AuthClient.d.ts.map +1 -1
- package/dist/pixiv/AuthClient.js +56 -7
- package/dist/pixiv/AuthClient.js.map +1 -1
- package/dist/storage/Database.d.ts +22 -0
- package/dist/storage/Database.d.ts.map +1 -1
- package/dist/storage/Database.js +19 -0
- package/dist/storage/Database.js.map +1 -1
- package/dist/storage/DatabaseMigration.d.ts.map +1 -1
- package/dist/storage/DatabaseMigration.js +29 -0
- package/dist/storage/DatabaseMigration.js.map +1 -1
- package/dist/storage/repositories/TaskHistoryRepository.d.ts +61 -0
- package/dist/storage/repositories/TaskHistoryRepository.d.ts.map +1 -0
- package/dist/storage/repositories/TaskHistoryRepository.js +171 -0
- package/dist/storage/repositories/TaskHistoryRepository.js.map +1 -0
- package/dist/utils/errors.js +11 -11
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/pixiv-url-parser.d.ts +7 -1
- package/dist/utils/pixiv-url-parser.d.ts.map +1 -1
- package/dist/utils/pixiv-url-parser.js +75 -8
- package/dist/utils/pixiv-url-parser.js.map +1 -1
- package/dist/utils/token-manager.d.ts.map +1 -1
- package/dist/utils/token-manager.js +73 -5
- package/dist/utils/token-manager.js.map +1 -1
- package/dist/webui/package.json +1 -1
- package/dist/webui/routes/download.d.ts.map +1 -1
- package/dist/webui/routes/download.js +2 -0
- package/dist/webui/routes/download.js.map +1 -1
- package/dist/webui/routes/handlers/download-basic-handlers.d.ts +11 -0
- package/dist/webui/routes/handlers/download-basic-handlers.d.ts.map +1 -1
- package/dist/webui/routes/handlers/download-basic-handlers.js +199 -8
- package/dist/webui/routes/handlers/download-basic-handlers.js.map +1 -1
- package/dist/webui/services/DownloadTaskManager.d.ts.map +1 -1
- package/dist/webui/services/DownloadTaskManager.js +75 -3
- package/dist/webui/services/DownloadTaskManager.js.map +1 -1
- package/package.json +1 -1
- package/dist/webui/assets/ActionButton-DWq-fh3_.js +0 -2
- package/dist/webui/assets/ActionButton-DWq-fh3_.js.map +0 -1
- package/dist/webui/assets/CheckCircleOutlined-Can0-7ew.js +0 -2
- package/dist/webui/assets/CheckCircleOutlined-Can0-7ew.js.map +0 -1
- package/dist/webui/assets/CloseCircleOutlined-DfRmL2eG.js +0 -2
- package/dist/webui/assets/CloseCircleOutlined-DfRmL2eG.js.map +0 -1
- package/dist/webui/assets/Config-D9TWUGQR.js +0 -16
- package/dist/webui/assets/Config-D9TWUGQR.js.map +0 -1
- package/dist/webui/assets/Dashboard-CaGAH0y2.js +0 -2
- package/dist/webui/assets/Dashboard-CaGAH0y2.js.map +0 -1
- package/dist/webui/assets/DeleteOutlined-u-P2SpoK.js +0 -2
- package/dist/webui/assets/DeleteOutlined-u-P2SpoK.js.map +0 -1
- package/dist/webui/assets/Download-D9E4xrnM.js +0 -2
- package/dist/webui/assets/Download-D9E4xrnM.js.map +0 -1
- package/dist/webui/assets/Files-CKyc_PdW.js +0 -5
- package/dist/webui/assets/Files-CKyc_PdW.js.map +0 -1
- package/dist/webui/assets/PictureOutlined-C8Lbucj1.js +0 -2
- package/dist/webui/assets/PictureOutlined-C8Lbucj1.js.map +0 -1
- package/dist/webui/assets/SortDescendingOutlined-CR-hdhyW.js +0 -2
- package/dist/webui/assets/SortDescendingOutlined-CR-hdhyW.js.map +0 -1
- package/dist/webui/assets/ThunderboltOutlined-CiiB2de5.js +0 -2
- package/dist/webui/assets/ThunderboltOutlined-CiiB2de5.js.map +0 -1
- package/dist/webui/assets/UrlDownload-ClkUOXN_.js +0 -3
- package/dist/webui/assets/UrlDownload-ClkUOXN_.js.map +0 -1
- package/dist/webui/assets/dateUtils-CBk8bEa_.js +0 -2
- package/dist/webui/assets/dateUtils-CBk8bEa_.js.map +0 -1
- package/dist/webui/assets/errorCodeTranslator-DWsWq6B3.js +0 -3
- package/dist/webui/assets/errorCodeTranslator-DWsWq6B3.js.map +0 -1
- package/dist/webui/assets/index-BFgUdwJv.js +0 -214
- package/dist/webui/assets/index-BFgUdwJv.js.map +0 -1
- package/dist/webui/assets/index-CN3FylAF.js +0 -2
- package/dist/webui/assets/index-CN3FylAF.js.map +0 -1
- package/dist/webui/assets/index-CSoUPZat.js +0 -2
- package/dist/webui/assets/index-CSoUPZat.js.map +0 -1
- package/dist/webui/assets/index-CiHwNwrk.js +0 -19
- package/dist/webui/assets/index-CiHwNwrk.js.map +0 -1
- package/dist/webui/assets/index-DHwJxrFi.css +0 -1
- package/dist/webui/assets/index-DTU-FGA4.js +0 -2
- package/dist/webui/assets/index-DTU-FGA4.js.map +0 -1
- package/dist/webui/assets/index-DjpD0HQ5.js +0 -2
- package/dist/webui/assets/index-DjpD0HQ5.js.map +0 -1
- package/dist/webui/assets/index-Dycn6xoz.js +0 -2
- package/dist/webui/assets/index-Dycn6xoz.js.map +0 -1
- package/dist/webui/assets/index-G0EJCamt.js +0 -22
- package/dist/webui/assets/index-G0EJCamt.js.map +0 -1
- package/dist/webui/assets/index-WaraZQH0.js +0 -2
- package/dist/webui/assets/index-WaraZQH0.js.map +0 -1
- package/dist/webui/assets/index-k2rGFxEM.js +0 -8
- package/dist/webui/assets/index-k2rGFxEM.js.map +0 -1
- package/dist/webui/assets/index-lwTtspUb.js +0 -14
- package/dist/webui/assets/index-lwTtspUb.js.map +0 -1
- package/dist/webui/assets/index-pT0W4KjK.js +0 -47
- package/dist/webui/assets/index-pT0W4KjK.js.map +0 -1
- package/dist/webui/assets/index-wvielV9A.js +0 -2
- package/dist/webui/assets/index-wvielV9A.js.map +0 -1
- package/dist/webui/assets/row-FRqVdQDX.js +0 -20
- package/dist/webui/assets/row-FRqVdQDX.js.map +0 -1
- package/dist/webui/assets/useAuth-BMt6dHSB.js +0 -9
- package/dist/webui/assets/useAuth-BMt6dHSB.js.map +0 -1
- package/dist/webui/assets/useConfig-29Ugtjk4.js +0 -9
- package/dist/webui/assets/useConfig-29Ugtjk4.js.map +0 -1
- package/dist/webui/assets/useDownload-Dt6lsP8S.js +0 -2
- package/dist/webui/assets/useDownload-Dt6lsP8S.js.map +0 -1
- package/dist/webui/assets/useErrorHandler-DWHs3RlU.js +0 -84
- package/dist/webui/assets/useErrorHandler-DWHs3RlU.js.map +0 -1
- package/dist/webui/index.html +0 -15
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Config-D9TWUGQR.js","sources":["../../node_modules/@ant-design/icons-svg/es/asn/UpOutlined.js","../../node_modules/@ant-design/icons/es/icons/UpOutlined.js","../../node_modules/@rc-component/mini-decimal/es/supportUtil.js","../../node_modules/@rc-component/mini-decimal/es/numberUtil.js","../../node_modules/@rc-component/mini-decimal/es/BigIntDecimal.js","../../node_modules/@rc-component/mini-decimal/es/NumberDecimal.js","../../node_modules/@rc-component/mini-decimal/es/MiniDecimal.js","../../node_modules/rc-util/es/proxyObject.js","../../node_modules/rc-input-number/es/hooks/useCursor.js","../../node_modules/rc-util/es/hooks/useMobile.js","../../node_modules/rc-input-number/es/StepHandler.js","../../node_modules/rc-input-number/es/utils/numberUtil.js","../../node_modules/rc-input-number/es/hooks/useFrame.js","../../node_modules/rc-input-number/es/InputNumber.js","../../node_modules/antd/es/input-number/style/token.js","../../node_modules/antd/es/input-number/style/index.js","../../node_modules/antd/es/input-number/index.js","../../node_modules/@ant-design/icons-svg/es/asn/SaveOutlined.js","../../node_modules/@ant-design/icons/es/icons/SaveOutlined.js","../../node_modules/@ant-design/icons-svg/es/asn/UploadOutlined.js","../../node_modules/@ant-design/icons/es/icons/UploadOutlined.js","../../src/pages/Config/hooks/useConfigForm.ts","../../src/hooks/useLoadingState.ts","../../src/pages/Config/hooks/useConfigOperations.ts","../../src/pages/Config/hooks/useConfigModals.ts","../../src/pages/Config/hooks/useConfigTabs.ts","../../src/pages/Config/components/ConfigHeader.tsx","../../src/pages/Config/components/ConfigActions.tsx","../../src/components/forms/FormSection.tsx","../../src/pages/Config/components/BasicConfigForm.tsx","../../src/pages/Config/components/NetworkConfigForm.tsx","../../src/pages/Config/components/StorageConfigForm.tsx","../../src/pages/Config/components/SchedulerConfigForm.tsx","../../src/pages/Config/components/DownloadConfigForm.tsx","../../src/pages/Config/components/TargetModal.tsx","../../src/pages/Config/components/targets/TargetsInfoAlert.tsx","../../src/pages/Config/components/targets/TargetsTable.tsx","../../src/pages/Config/components/TargetsConfigForm.tsx","../../src/components/common/CodeEditor.tsx","../../src/pages/Config/components/ConfigJsonEditor.tsx","../../src/pages/Config/components/ConfigFilesManager.tsx","../../src/pages/Config/components/ConfigHistoryManager.tsx","../../src/pages/Config/components/hooks/useConfigTabItems.tsx","../../src/pages/Config/components/ConfigTabs.tsx","../../src/pages/Config/components/ConfigPreviewModal.tsx","../../src/pages/Config/Config.tsx"],"sourcesContent":["// This icon file is generated automatically.\nvar UpOutlined = { \"icon\": { \"tag\": \"svg\", \"attrs\": { \"viewBox\": \"64 64 896 896\", \"focusable\": \"false\" }, \"children\": [{ \"tag\": \"path\", \"attrs\": { \"d\": \"M890.5 755.3L537.9 269.2c-12.8-17.6-39-17.6-51.7 0L133.5 755.3A8 8 0 00140 768h75c5.1 0 9.9-2.5 12.9-6.6L512 369.8l284.1 391.6c3 4.1 7.8 6.6 12.9 6.6h75c6.5 0 10.3-7.4 6.5-12.7z\" } }] }, \"name\": \"up\", \"theme\": \"outlined\" };\nexport default UpOutlined;\n","import _extends from \"@babel/runtime/helpers/esm/extends\";\n// GENERATE BY ./scripts/generate.ts\n// DON NOT EDIT IT MANUALLY\n\nimport * as React from 'react';\nimport UpOutlinedSvg from \"@ant-design/icons-svg/es/asn/UpOutlined\";\nimport AntdIcon from \"../components/AntdIcon\";\nvar UpOutlined = function UpOutlined(props, ref) {\n return /*#__PURE__*/React.createElement(AntdIcon, _extends({}, props, {\n ref: ref,\n icon: UpOutlinedSvg\n }));\n};\n\n/** */\nvar RefIcon = /*#__PURE__*/React.forwardRef(UpOutlined);\nif (process.env.NODE_ENV !== 'production') {\n RefIcon.displayName = 'UpOutlined';\n}\nexport default RefIcon;","export function supportBigInt() {\n return typeof BigInt === 'function';\n}","import { supportBigInt } from \"./supportUtil\";\nexport function isEmpty(value) {\n return !value && value !== 0 && !Number.isNaN(value) || !String(value).trim();\n}\n\n/**\n * Format string number to readable number\n */\nexport function trimNumber(numStr) {\n var str = numStr.trim();\n var negative = str.startsWith('-');\n if (negative) {\n str = str.slice(1);\n }\n str = str\n // Remove decimal 0. `1.000` => `1.`, `1.100` => `1.1`\n .replace(/(\\.\\d*[^0])0*$/, '$1')\n // Remove useless decimal. `1.` => `1`\n .replace(/\\.0*$/, '')\n // Remove integer 0. `0001` => `1`, 000.1' => `.1`\n .replace(/^0+/, '');\n if (str.startsWith('.')) {\n str = \"0\".concat(str);\n }\n var trimStr = str || '0';\n var splitNumber = trimStr.split('.');\n var integerStr = splitNumber[0] || '0';\n var decimalStr = splitNumber[1] || '0';\n if (integerStr === '0' && decimalStr === '0') {\n negative = false;\n }\n var negativeStr = negative ? '-' : '';\n return {\n negative: negative,\n negativeStr: negativeStr,\n trimStr: trimStr,\n integerStr: integerStr,\n decimalStr: decimalStr,\n fullStr: \"\".concat(negativeStr).concat(trimStr)\n };\n}\nexport function isE(number) {\n var str = String(number);\n return !Number.isNaN(Number(str)) && str.includes('e');\n}\n\n/**\n * [Legacy] Convert 1e-9 to 0.000000001.\n * This may lose some precision if user really want 1e-9.\n */\nexport function getNumberPrecision(number) {\n var numStr = String(number);\n if (isE(number)) {\n var precision = Number(numStr.slice(numStr.indexOf('e-') + 2));\n var decimalMatch = numStr.match(/\\.(\\d+)/);\n if (decimalMatch !== null && decimalMatch !== void 0 && decimalMatch[1]) {\n precision += decimalMatch[1].length;\n }\n return precision;\n }\n return numStr.includes('.') && validateNumber(numStr) ? numStr.length - numStr.indexOf('.') - 1 : 0;\n}\n\n/**\n * Convert number (includes scientific notation) to -xxx.yyy format\n */\nexport function num2str(number) {\n var numStr = String(number);\n if (isE(number)) {\n if (number > Number.MAX_SAFE_INTEGER) {\n return String(supportBigInt() ? BigInt(number).toString() : Number.MAX_SAFE_INTEGER);\n }\n if (number < Number.MIN_SAFE_INTEGER) {\n return String(supportBigInt() ? BigInt(number).toString() : Number.MIN_SAFE_INTEGER);\n }\n numStr = number.toFixed(getNumberPrecision(numStr));\n }\n return trimNumber(numStr).fullStr;\n}\nexport function validateNumber(num) {\n if (typeof num === 'number') {\n return !Number.isNaN(num);\n }\n\n // Empty\n if (!num) {\n return false;\n }\n return (\n // Normal type: 11.28\n /^\\s*-?\\d+(\\.\\d+)?\\s*$/.test(num) ||\n // Pre-number: 1.\n /^\\s*-?\\d+\\.\\s*$/.test(num) ||\n // Post-number: .1\n /^\\s*-?\\.\\d+\\s*$/.test(num)\n );\n}","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport { isE, isEmpty, num2str, trimNumber, validateNumber } from \"./numberUtil\";\nvar BigIntDecimal = /*#__PURE__*/function () {\n /** BigInt will convert `0009` to `9`. We need record the len of decimal */\n\n function BigIntDecimal(value) {\n _classCallCheck(this, BigIntDecimal);\n _defineProperty(this, \"origin\", '');\n _defineProperty(this, \"negative\", void 0);\n _defineProperty(this, \"integer\", void 0);\n _defineProperty(this, \"decimal\", void 0);\n _defineProperty(this, \"decimalLen\", void 0);\n _defineProperty(this, \"empty\", void 0);\n _defineProperty(this, \"nan\", void 0);\n if (isEmpty(value)) {\n this.empty = true;\n return;\n }\n this.origin = String(value);\n\n // Act like Number convert\n if (value === '-' || Number.isNaN(value)) {\n this.nan = true;\n return;\n }\n var mergedValue = value;\n\n // We need convert back to Number since it require `toFixed` to handle this\n if (isE(mergedValue)) {\n mergedValue = Number(mergedValue);\n }\n mergedValue = typeof mergedValue === 'string' ? mergedValue : num2str(mergedValue);\n if (validateNumber(mergedValue)) {\n var trimRet = trimNumber(mergedValue);\n this.negative = trimRet.negative;\n var numbers = trimRet.trimStr.split('.');\n this.integer = BigInt(numbers[0]);\n var decimalStr = numbers[1] || '0';\n this.decimal = BigInt(decimalStr);\n this.decimalLen = decimalStr.length;\n } else {\n this.nan = true;\n }\n }\n _createClass(BigIntDecimal, [{\n key: \"getMark\",\n value: function getMark() {\n return this.negative ? '-' : '';\n }\n }, {\n key: \"getIntegerStr\",\n value: function getIntegerStr() {\n return this.integer.toString();\n }\n\n /**\n * @private get decimal string\n */\n }, {\n key: \"getDecimalStr\",\n value: function getDecimalStr() {\n return this.decimal.toString().padStart(this.decimalLen, '0');\n }\n\n /**\n * @private Align BigIntDecimal with same decimal length. e.g. 12.3 + 5 = 1230000\n * This is used for add function only.\n */\n }, {\n key: \"alignDecimal\",\n value: function alignDecimal(decimalLength) {\n var str = \"\".concat(this.getMark()).concat(this.getIntegerStr()).concat(this.getDecimalStr().padEnd(decimalLength, '0'));\n return BigInt(str);\n }\n }, {\n key: \"negate\",\n value: function negate() {\n var clone = new BigIntDecimal(this.toString());\n clone.negative = !clone.negative;\n return clone;\n }\n }, {\n key: \"cal\",\n value: function cal(offset, calculator, calDecimalLen) {\n var maxDecimalLength = Math.max(this.getDecimalStr().length, offset.getDecimalStr().length);\n var myAlignedDecimal = this.alignDecimal(maxDecimalLength);\n var offsetAlignedDecimal = offset.alignDecimal(maxDecimalLength);\n var valueStr = calculator(myAlignedDecimal, offsetAlignedDecimal).toString();\n var nextDecimalLength = calDecimalLen(maxDecimalLength);\n\n // We need fill string length back to `maxDecimalLength` to avoid parser failed\n var _trimNumber = trimNumber(valueStr),\n negativeStr = _trimNumber.negativeStr,\n trimStr = _trimNumber.trimStr;\n var hydrateValueStr = \"\".concat(negativeStr).concat(trimStr.padStart(nextDecimalLength + 1, '0'));\n return new BigIntDecimal(\"\".concat(hydrateValueStr.slice(0, -nextDecimalLength), \".\").concat(hydrateValueStr.slice(-nextDecimalLength)));\n }\n }, {\n key: \"add\",\n value: function add(value) {\n if (this.isInvalidate()) {\n return new BigIntDecimal(value);\n }\n var offset = new BigIntDecimal(value);\n if (offset.isInvalidate()) {\n return this;\n }\n return this.cal(offset, function (num1, num2) {\n return num1 + num2;\n }, function (len) {\n return len;\n });\n }\n }, {\n key: \"multi\",\n value: function multi(value) {\n var target = new BigIntDecimal(value);\n if (this.isInvalidate() || target.isInvalidate()) {\n return new BigIntDecimal(NaN);\n }\n return this.cal(target, function (num1, num2) {\n return num1 * num2;\n }, function (len) {\n return len * 2;\n });\n }\n }, {\n key: \"isEmpty\",\n value: function isEmpty() {\n return this.empty;\n }\n }, {\n key: \"isNaN\",\n value: function isNaN() {\n return this.nan;\n }\n }, {\n key: \"isInvalidate\",\n value: function isInvalidate() {\n return this.isEmpty() || this.isNaN();\n }\n }, {\n key: \"equals\",\n value: function equals(target) {\n return this.toString() === (target === null || target === void 0 ? void 0 : target.toString());\n }\n }, {\n key: \"lessEquals\",\n value: function lessEquals(target) {\n return this.add(target.negate().toString()).toNumber() <= 0;\n }\n }, {\n key: \"toNumber\",\n value: function toNumber() {\n if (this.isNaN()) {\n return NaN;\n }\n return Number(this.toString());\n }\n }, {\n key: \"toString\",\n value: function toString() {\n var safe = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n if (!safe) {\n return this.origin;\n }\n if (this.isInvalidate()) {\n return '';\n }\n return trimNumber(\"\".concat(this.getMark()).concat(this.getIntegerStr(), \".\").concat(this.getDecimalStr())).fullStr;\n }\n }]);\n return BigIntDecimal;\n}();\nexport { BigIntDecimal as default };","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport { getNumberPrecision, isEmpty, num2str } from \"./numberUtil\";\n\n/**\n * We can remove this when IE not support anymore\n */\nvar NumberDecimal = /*#__PURE__*/function () {\n function NumberDecimal(value) {\n _classCallCheck(this, NumberDecimal);\n _defineProperty(this, \"origin\", '');\n _defineProperty(this, \"number\", void 0);\n _defineProperty(this, \"empty\", void 0);\n if (isEmpty(value)) {\n this.empty = true;\n return;\n }\n this.origin = String(value);\n this.number = Number(value);\n }\n _createClass(NumberDecimal, [{\n key: \"negate\",\n value: function negate() {\n return new NumberDecimal(-this.toNumber());\n }\n }, {\n key: \"add\",\n value: function add(value) {\n if (this.isInvalidate()) {\n return new NumberDecimal(value);\n }\n var target = Number(value);\n if (Number.isNaN(target)) {\n return this;\n }\n var number = this.number + target;\n\n // [Legacy] Back to safe integer\n if (number > Number.MAX_SAFE_INTEGER) {\n return new NumberDecimal(Number.MAX_SAFE_INTEGER);\n }\n if (number < Number.MIN_SAFE_INTEGER) {\n return new NumberDecimal(Number.MIN_SAFE_INTEGER);\n }\n var maxPrecision = Math.max(getNumberPrecision(this.number), getNumberPrecision(target));\n return new NumberDecimal(number.toFixed(maxPrecision));\n }\n }, {\n key: \"multi\",\n value: function multi(value) {\n var target = Number(value);\n if (this.isInvalidate() || Number.isNaN(target)) {\n return new NumberDecimal(NaN);\n }\n var number = this.number * target;\n\n // [Legacy] Back to safe integer\n if (number > Number.MAX_SAFE_INTEGER) {\n return new NumberDecimal(Number.MAX_SAFE_INTEGER);\n }\n if (number < Number.MIN_SAFE_INTEGER) {\n return new NumberDecimal(Number.MIN_SAFE_INTEGER);\n }\n var maxPrecision = Math.max(getNumberPrecision(this.number), getNumberPrecision(target));\n return new NumberDecimal(number.toFixed(maxPrecision));\n }\n }, {\n key: \"isEmpty\",\n value: function isEmpty() {\n return this.empty;\n }\n }, {\n key: \"isNaN\",\n value: function isNaN() {\n return Number.isNaN(this.number);\n }\n }, {\n key: \"isInvalidate\",\n value: function isInvalidate() {\n return this.isEmpty() || this.isNaN();\n }\n }, {\n key: \"equals\",\n value: function equals(target) {\n return this.toNumber() === (target === null || target === void 0 ? void 0 : target.toNumber());\n }\n }, {\n key: \"lessEquals\",\n value: function lessEquals(target) {\n return this.add(target.negate().toString()).toNumber() <= 0;\n }\n }, {\n key: \"toNumber\",\n value: function toNumber() {\n return this.number;\n }\n }, {\n key: \"toString\",\n value: function toString() {\n var safe = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n if (!safe) {\n return this.origin;\n }\n if (this.isInvalidate()) {\n return '';\n }\n return num2str(this.number);\n }\n }]);\n return NumberDecimal;\n}();\nexport { NumberDecimal as default };","/* eslint-disable max-classes-per-file */\n\nimport BigIntDecimal from \"./BigIntDecimal\";\nimport NumberDecimal from \"./NumberDecimal\";\nimport { trimNumber } from \"./numberUtil\";\nimport { supportBigInt } from \"./supportUtil\";\n\n// Still support origin export\nexport { NumberDecimal, BigIntDecimal };\nexport default function getMiniDecimal(value) {\n // We use BigInt here.\n // Will fallback to Number if not support.\n if (supportBigInt()) {\n return new BigIntDecimal(value);\n }\n return new NumberDecimal(value);\n}\n\n/**\n * Align the logic of toFixed to around like 1.5 => 2.\n * If set `cutOnly`, will just remove the over decimal part.\n */\nexport function toFixed(numStr, separatorStr, precision) {\n var cutOnly = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n if (numStr === '') {\n return '';\n }\n var _trimNumber = trimNumber(numStr),\n negativeStr = _trimNumber.negativeStr,\n integerStr = _trimNumber.integerStr,\n decimalStr = _trimNumber.decimalStr;\n var precisionDecimalStr = \"\".concat(separatorStr).concat(decimalStr);\n var numberWithoutDecimal = \"\".concat(negativeStr).concat(integerStr);\n if (precision >= 0) {\n // We will get last + 1 number to check if need advanced number\n var advancedNum = Number(decimalStr[precision]);\n if (advancedNum >= 5 && !cutOnly) {\n var advancedDecimal = getMiniDecimal(numStr).add(\"\".concat(negativeStr, \"0.\").concat('0'.repeat(precision)).concat(10 - advancedNum));\n return toFixed(advancedDecimal.toString(), separatorStr, precision, cutOnly);\n }\n if (precision === 0) {\n return numberWithoutDecimal;\n }\n return \"\".concat(numberWithoutDecimal).concat(separatorStr).concat(decimalStr.padEnd(precision, '0').slice(0, precision));\n }\n if (precisionDecimalStr === '.0') {\n return numberWithoutDecimal;\n }\n return \"\".concat(numberWithoutDecimal).concat(precisionDecimalStr);\n}","/**\n * Proxy object if environment supported\n */\nexport default function proxyObject(obj, extendProps) {\n if (typeof Proxy !== 'undefined' && obj) {\n return new Proxy(obj, {\n get: function get(target, prop) {\n if (extendProps[prop]) {\n return extendProps[prop];\n }\n\n // Proxy origin property\n var originProp = target[prop];\n return typeof originProp === 'function' ? originProp.bind(target) : originProp;\n }\n });\n }\n return obj;\n}","import { useRef } from 'react';\nimport warning from \"rc-util/es/warning\";\n/**\n * Keep input cursor in the correct position if possible.\n * Is this necessary since we have `formatter` which may mass the content?\n */\nexport default function useCursor(input, focused) {\n var selectionRef = useRef(null);\n function recordCursor() {\n // Record position\n try {\n var start = input.selectionStart,\n end = input.selectionEnd,\n value = input.value;\n var beforeTxt = value.substring(0, start);\n var afterTxt = value.substring(end);\n selectionRef.current = {\n start: start,\n end: end,\n value: value,\n beforeTxt: beforeTxt,\n afterTxt: afterTxt\n };\n } catch (e) {\n // Fix error in Chrome:\n // Failed to read the 'selectionStart' property from 'HTMLInputElement'\n // http://stackoverflow.com/q/21177489/3040605\n }\n }\n\n /**\n * Restore logic:\n * 1. back string same\n * 2. start string same\n */\n function restoreCursor() {\n if (input && selectionRef.current && focused) {\n try {\n var value = input.value;\n var _selectionRef$current = selectionRef.current,\n beforeTxt = _selectionRef$current.beforeTxt,\n afterTxt = _selectionRef$current.afterTxt,\n start = _selectionRef$current.start;\n var startPos = value.length;\n if (value.startsWith(beforeTxt)) {\n startPos = beforeTxt.length;\n } else if (value.endsWith(afterTxt)) {\n startPos = value.length - selectionRef.current.afterTxt.length;\n } else {\n var beforeLastChar = beforeTxt[start - 1];\n var newIndex = value.indexOf(beforeLastChar, start - 1);\n if (newIndex !== -1) {\n startPos = newIndex + 1;\n }\n }\n input.setSelectionRange(startPos, startPos);\n } catch (e) {\n warning(false, \"Something warning of cursor restore. Please fire issue about this: \".concat(e.message));\n }\n }\n }\n return [recordCursor, restoreCursor];\n}","import _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport { useState } from 'react';\nimport isMobile from \"../isMobile\";\nimport useLayoutEffect from \"./useLayoutEffect\";\n\n/**\n * Hook to detect if the user is on a mobile device\n * Notice that this hook will only detect the device type in effect, so it will always be false in server side\n */\nvar useMobile = function useMobile() {\n var _useState = useState(false),\n _useState2 = _slicedToArray(_useState, 2),\n mobile = _useState2[0],\n setMobile = _useState2[1];\n useLayoutEffect(function () {\n setMobile(isMobile());\n }, []);\n return mobile;\n};\nexport default useMobile;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\n/* eslint-disable react/no-unknown-property */\nimport * as React from 'react';\nimport classNames from 'classnames';\nimport useMobile from \"rc-util/es/hooks/useMobile\";\nimport raf from \"rc-util/es/raf\";\n\n/**\n * When click and hold on a button - the speed of auto changing the value.\n */\nvar STEP_INTERVAL = 200;\n\n/**\n * When click and hold on a button - the delay before auto changing the value.\n */\nvar STEP_DELAY = 600;\nexport default function StepHandler(_ref) {\n var prefixCls = _ref.prefixCls,\n upNode = _ref.upNode,\n downNode = _ref.downNode,\n upDisabled = _ref.upDisabled,\n downDisabled = _ref.downDisabled,\n onStep = _ref.onStep;\n // ======================== Step ========================\n var stepTimeoutRef = React.useRef();\n var frameIds = React.useRef([]);\n var onStepRef = React.useRef();\n onStepRef.current = onStep;\n var onStopStep = function onStopStep() {\n clearTimeout(stepTimeoutRef.current);\n };\n\n // We will interval update step when hold mouse down\n var onStepMouseDown = function onStepMouseDown(e, up) {\n e.preventDefault();\n onStopStep();\n onStepRef.current(up);\n\n // Loop step for interval\n function loopStep() {\n onStepRef.current(up);\n stepTimeoutRef.current = setTimeout(loopStep, STEP_INTERVAL);\n }\n\n // First time press will wait some time to trigger loop step update\n stepTimeoutRef.current = setTimeout(loopStep, STEP_DELAY);\n };\n React.useEffect(function () {\n return function () {\n onStopStep();\n frameIds.current.forEach(function (id) {\n return raf.cancel(id);\n });\n };\n }, []);\n\n // ======================= Render =======================\n var isMobile = useMobile();\n if (isMobile) {\n return null;\n }\n var handlerClassName = \"\".concat(prefixCls, \"-handler\");\n var upClassName = classNames(handlerClassName, \"\".concat(handlerClassName, \"-up\"), _defineProperty({}, \"\".concat(handlerClassName, \"-up-disabled\"), upDisabled));\n var downClassName = classNames(handlerClassName, \"\".concat(handlerClassName, \"-down\"), _defineProperty({}, \"\".concat(handlerClassName, \"-down-disabled\"), downDisabled));\n\n // fix: https://github.com/ant-design/ant-design/issues/43088\n // In Safari, When we fire onmousedown and onmouseup events in quick succession, \n // there may be a problem that the onmouseup events are executed first, \n // resulting in a disordered program execution.\n // So, we need to use requestAnimationFrame to ensure that the onmouseup event is executed after the onmousedown event.\n var safeOnStopStep = function safeOnStopStep() {\n return frameIds.current.push(raf(onStopStep));\n };\n var sharedHandlerProps = {\n unselectable: 'on',\n role: 'button',\n onMouseUp: safeOnStopStep,\n onMouseLeave: safeOnStopStep\n };\n return /*#__PURE__*/React.createElement(\"div\", {\n className: \"\".concat(handlerClassName, \"-wrap\")\n }, /*#__PURE__*/React.createElement(\"span\", _extends({}, sharedHandlerProps, {\n onMouseDown: function onMouseDown(e) {\n onStepMouseDown(e, true);\n },\n \"aria-label\": \"Increase Value\",\n \"aria-disabled\": upDisabled,\n className: upClassName\n }), upNode || /*#__PURE__*/React.createElement(\"span\", {\n unselectable: \"on\",\n className: \"\".concat(prefixCls, \"-handler-up-inner\")\n })), /*#__PURE__*/React.createElement(\"span\", _extends({}, sharedHandlerProps, {\n onMouseDown: function onMouseDown(e) {\n onStepMouseDown(e, false);\n },\n \"aria-label\": \"Decrease Value\",\n \"aria-disabled\": downDisabled,\n className: downClassName\n }), downNode || /*#__PURE__*/React.createElement(\"span\", {\n unselectable: \"on\",\n className: \"\".concat(prefixCls, \"-handler-down-inner\")\n })));\n}","import { trimNumber, num2str } from '@rc-component/mini-decimal';\nexport function getDecupleSteps(step) {\n var stepStr = typeof step === 'number' ? num2str(step) : trimNumber(step).fullStr;\n var hasPoint = stepStr.includes('.');\n if (!hasPoint) {\n return step + '0';\n }\n return trimNumber(stepStr.replace(/(\\d)\\.(\\d)/g, '$1$2.')).fullStr;\n}","import { useRef, useEffect } from 'react';\nimport raf from \"rc-util/es/raf\";\n\n/**\n * Always trigger latest once when call multiple time\n */\nexport default (function () {\n var idRef = useRef(0);\n var cleanUp = function cleanUp() {\n raf.cancel(idRef.current);\n };\n useEffect(function () {\n return cleanUp;\n }, []);\n return function (callback) {\n cleanUp();\n idRef.current = raf(function () {\n callback();\n });\n };\n});","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport _typeof from \"@babel/runtime/helpers/esm/typeof\";\nimport _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nvar _excluded = [\"prefixCls\", \"className\", \"style\", \"min\", \"max\", \"step\", \"defaultValue\", \"value\", \"disabled\", \"readOnly\", \"upHandler\", \"downHandler\", \"keyboard\", \"changeOnWheel\", \"controls\", \"classNames\", \"stringMode\", \"parser\", \"formatter\", \"precision\", \"decimalSeparator\", \"onChange\", \"onInput\", \"onPressEnter\", \"onStep\", \"changeOnBlur\", \"domRef\"],\n _excluded2 = [\"disabled\", \"style\", \"prefixCls\", \"value\", \"prefix\", \"suffix\", \"addonBefore\", \"addonAfter\", \"className\", \"classNames\"];\nimport getMiniDecimal, { getNumberPrecision, num2str, toFixed, validateNumber } from '@rc-component/mini-decimal';\nimport clsx from 'classnames';\nimport { BaseInput } from 'rc-input';\nimport { useLayoutUpdateEffect } from \"rc-util/es/hooks/useLayoutEffect\";\nimport proxyObject from \"rc-util/es/proxyObject\";\nimport { composeRef } from \"rc-util/es/ref\";\nimport * as React from 'react';\nimport useCursor from \"./hooks/useCursor\";\nimport StepHandler from \"./StepHandler\";\nimport { getDecupleSteps } from \"./utils/numberUtil\";\nimport { triggerFocus } from \"rc-input/es/utils/commonUtils\";\nimport useFrame from \"./hooks/useFrame\";\n/**\n * We support `stringMode` which need handle correct type when user call in onChange\n * format max or min value\n * 1. if isInvalid return null\n * 2. if precision is undefined, return decimal\n * 3. format with precision\n * I. if max > 0, round down with precision. Example: max= 3.5, precision=0 afterFormat: 3\n * II. if max < 0, round up with precision. Example: max= -3.5, precision=0 afterFormat: -4\n * III. if min > 0, round up with precision. Example: min= 3.5, precision=0 afterFormat: 4\n * IV. if min < 0, round down with precision. Example: max= -3.5, precision=0 afterFormat: -3\n */\nvar getDecimalValue = function getDecimalValue(stringMode, decimalValue) {\n if (stringMode || decimalValue.isEmpty()) {\n return decimalValue.toString();\n }\n return decimalValue.toNumber();\n};\nvar getDecimalIfValidate = function getDecimalIfValidate(value) {\n var decimal = getMiniDecimal(value);\n return decimal.isInvalidate() ? null : decimal;\n};\nvar InternalInputNumber = /*#__PURE__*/React.forwardRef(function (props, ref) {\n var prefixCls = props.prefixCls,\n className = props.className,\n style = props.style,\n min = props.min,\n max = props.max,\n _props$step = props.step,\n step = _props$step === void 0 ? 1 : _props$step,\n defaultValue = props.defaultValue,\n value = props.value,\n disabled = props.disabled,\n readOnly = props.readOnly,\n upHandler = props.upHandler,\n downHandler = props.downHandler,\n keyboard = props.keyboard,\n _props$changeOnWheel = props.changeOnWheel,\n changeOnWheel = _props$changeOnWheel === void 0 ? false : _props$changeOnWheel,\n _props$controls = props.controls,\n controls = _props$controls === void 0 ? true : _props$controls,\n classNames = props.classNames,\n stringMode = props.stringMode,\n parser = props.parser,\n formatter = props.formatter,\n precision = props.precision,\n decimalSeparator = props.decimalSeparator,\n onChange = props.onChange,\n onInput = props.onInput,\n onPressEnter = props.onPressEnter,\n onStep = props.onStep,\n _props$changeOnBlur = props.changeOnBlur,\n changeOnBlur = _props$changeOnBlur === void 0 ? true : _props$changeOnBlur,\n domRef = props.domRef,\n inputProps = _objectWithoutProperties(props, _excluded);\n var inputClassName = \"\".concat(prefixCls, \"-input\");\n var inputRef = React.useRef(null);\n var _React$useState = React.useState(false),\n _React$useState2 = _slicedToArray(_React$useState, 2),\n focus = _React$useState2[0],\n setFocus = _React$useState2[1];\n var userTypingRef = React.useRef(false);\n var compositionRef = React.useRef(false);\n var shiftKeyRef = React.useRef(false);\n\n // ============================ Value =============================\n // Real value control\n var _React$useState3 = React.useState(function () {\n return getMiniDecimal(value !== null && value !== void 0 ? value : defaultValue);\n }),\n _React$useState4 = _slicedToArray(_React$useState3, 2),\n decimalValue = _React$useState4[0],\n setDecimalValue = _React$useState4[1];\n function setUncontrolledDecimalValue(newDecimal) {\n if (value === undefined) {\n setDecimalValue(newDecimal);\n }\n }\n\n // ====================== Parser & Formatter ======================\n /**\n * `precision` is used for formatter & onChange.\n * It will auto generate by `value` & `step`.\n * But it will not block user typing.\n *\n * Note: Auto generate `precision` is used for legacy logic.\n * We should remove this since we already support high precision with BigInt.\n *\n * @param number Provide which number should calculate precision\n * @param userTyping Change by user typing\n */\n var getPrecision = React.useCallback(function (numStr, userTyping) {\n if (userTyping) {\n return undefined;\n }\n if (precision >= 0) {\n return precision;\n }\n return Math.max(getNumberPrecision(numStr), getNumberPrecision(step));\n }, [precision, step]);\n\n // >>> Parser\n var mergedParser = React.useCallback(function (num) {\n var numStr = String(num);\n if (parser) {\n return parser(numStr);\n }\n var parsedStr = numStr;\n if (decimalSeparator) {\n parsedStr = parsedStr.replace(decimalSeparator, '.');\n }\n\n // [Legacy] We still support auto convert `$ 123,456` to `123456`\n return parsedStr.replace(/[^\\w.-]+/g, '');\n }, [parser, decimalSeparator]);\n\n // >>> Formatter\n var inputValueRef = React.useRef('');\n var mergedFormatter = React.useCallback(function (number, userTyping) {\n if (formatter) {\n return formatter(number, {\n userTyping: userTyping,\n input: String(inputValueRef.current)\n });\n }\n var str = typeof number === 'number' ? num2str(number) : number;\n\n // User typing will not auto format with precision directly\n if (!userTyping) {\n var mergedPrecision = getPrecision(str, userTyping);\n if (validateNumber(str) && (decimalSeparator || mergedPrecision >= 0)) {\n // Separator\n var separatorStr = decimalSeparator || '.';\n str = toFixed(str, separatorStr, mergedPrecision);\n }\n }\n return str;\n }, [formatter, getPrecision, decimalSeparator]);\n\n // ========================== InputValue ==========================\n /**\n * Input text value control\n *\n * User can not update input content directly. It updates with follow rules by priority:\n * 1. controlled `value` changed\n * * [SPECIAL] Typing like `1.` should not immediately convert to `1`\n * 2. User typing with format (not precision)\n * 3. Blur or Enter trigger revalidate\n */\n var _React$useState5 = React.useState(function () {\n var initValue = defaultValue !== null && defaultValue !== void 0 ? defaultValue : value;\n if (decimalValue.isInvalidate() && ['string', 'number'].includes(_typeof(initValue))) {\n return Number.isNaN(initValue) ? '' : initValue;\n }\n return mergedFormatter(decimalValue.toString(), false);\n }),\n _React$useState6 = _slicedToArray(_React$useState5, 2),\n inputValue = _React$useState6[0],\n setInternalInputValue = _React$useState6[1];\n inputValueRef.current = inputValue;\n\n // Should always be string\n function setInputValue(newValue, userTyping) {\n setInternalInputValue(mergedFormatter(\n // Invalidate number is sometime passed by external control, we should let it go\n // Otherwise is controlled by internal interactive logic which check by userTyping\n // You can ref 'show limited value when input is not focused' test for more info.\n newValue.isInvalidate() ? newValue.toString(false) : newValue.toString(!userTyping), userTyping));\n }\n\n // >>> Max & Min limit\n var maxDecimal = React.useMemo(function () {\n return getDecimalIfValidate(max);\n }, [max, precision]);\n var minDecimal = React.useMemo(function () {\n return getDecimalIfValidate(min);\n }, [min, precision]);\n var upDisabled = React.useMemo(function () {\n if (!maxDecimal || !decimalValue || decimalValue.isInvalidate()) {\n return false;\n }\n return maxDecimal.lessEquals(decimalValue);\n }, [maxDecimal, decimalValue]);\n var downDisabled = React.useMemo(function () {\n if (!minDecimal || !decimalValue || decimalValue.isInvalidate()) {\n return false;\n }\n return decimalValue.lessEquals(minDecimal);\n }, [minDecimal, decimalValue]);\n\n // Cursor controller\n var _useCursor = useCursor(inputRef.current, focus),\n _useCursor2 = _slicedToArray(_useCursor, 2),\n recordCursor = _useCursor2[0],\n restoreCursor = _useCursor2[1];\n\n // ============================= Data =============================\n /**\n * Find target value closet within range.\n * e.g. [11, 28]:\n * 3 => 11\n * 23 => 23\n * 99 => 28\n */\n var getRangeValue = function getRangeValue(target) {\n // target > max\n if (maxDecimal && !target.lessEquals(maxDecimal)) {\n return maxDecimal;\n }\n\n // target < min\n if (minDecimal && !minDecimal.lessEquals(target)) {\n return minDecimal;\n }\n return null;\n };\n\n /**\n * Check value is in [min, max] range\n */\n var isInRange = function isInRange(target) {\n return !getRangeValue(target);\n };\n\n /**\n * Trigger `onChange` if value validated and not equals of origin.\n * Return the value that re-align in range.\n */\n var triggerValueUpdate = function triggerValueUpdate(newValue, userTyping) {\n var updateValue = newValue;\n var isRangeValidate = isInRange(updateValue) || updateValue.isEmpty();\n\n // Skip align value when trigger value is empty.\n // We just trigger onChange(null)\n // This should not block user typing\n if (!updateValue.isEmpty() && !userTyping) {\n // Revert value in range if needed\n updateValue = getRangeValue(updateValue) || updateValue;\n isRangeValidate = true;\n }\n if (!readOnly && !disabled && isRangeValidate) {\n var numStr = updateValue.toString();\n var mergedPrecision = getPrecision(numStr, userTyping);\n if (mergedPrecision >= 0) {\n updateValue = getMiniDecimal(toFixed(numStr, '.', mergedPrecision));\n\n // When to fixed. The value may out of min & max range.\n // 4 in [0, 3.8] => 3.8 => 4 (toFixed)\n if (!isInRange(updateValue)) {\n updateValue = getMiniDecimal(toFixed(numStr, '.', mergedPrecision, true));\n }\n }\n\n // Trigger event\n if (!updateValue.equals(decimalValue)) {\n setUncontrolledDecimalValue(updateValue);\n onChange === null || onChange === void 0 || onChange(updateValue.isEmpty() ? null : getDecimalValue(stringMode, updateValue));\n\n // Reformat input if value is not controlled\n if (value === undefined) {\n setInputValue(updateValue, userTyping);\n }\n }\n return updateValue;\n }\n return decimalValue;\n };\n\n // ========================== User Input ==========================\n var onNextPromise = useFrame();\n\n // >>> Collect input value\n var collectInputValue = function collectInputValue(inputStr) {\n recordCursor();\n\n // Update inputValue in case input can not parse as number\n // Refresh ref value immediately since it may used by formatter\n inputValueRef.current = inputStr;\n setInternalInputValue(inputStr);\n\n // Parse number\n if (!compositionRef.current) {\n var finalValue = mergedParser(inputStr);\n var finalDecimal = getMiniDecimal(finalValue);\n if (!finalDecimal.isNaN()) {\n triggerValueUpdate(finalDecimal, true);\n }\n }\n\n // Trigger onInput later to let user customize value if they want to handle something after onChange\n onInput === null || onInput === void 0 || onInput(inputStr);\n\n // optimize for chinese input experience\n // https://github.com/ant-design/ant-design/issues/8196\n onNextPromise(function () {\n var nextInputStr = inputStr;\n if (!parser) {\n nextInputStr = inputStr.replace(/。/g, '.');\n }\n if (nextInputStr !== inputStr) {\n collectInputValue(nextInputStr);\n }\n });\n };\n\n // >>> Composition\n var onCompositionStart = function onCompositionStart() {\n compositionRef.current = true;\n };\n var onCompositionEnd = function onCompositionEnd() {\n compositionRef.current = false;\n collectInputValue(inputRef.current.value);\n };\n\n // >>> Input\n var onInternalInput = function onInternalInput(e) {\n collectInputValue(e.target.value);\n };\n\n // ============================= Step =============================\n var onInternalStep = function onInternalStep(up) {\n var _inputRef$current;\n // Ignore step since out of range\n if (up && upDisabled || !up && downDisabled) {\n return;\n }\n\n // Clear typing status since it may be caused by up & down key.\n // We should sync with input value.\n userTypingRef.current = false;\n var stepDecimal = getMiniDecimal(shiftKeyRef.current ? getDecupleSteps(step) : step);\n if (!up) {\n stepDecimal = stepDecimal.negate();\n }\n var target = (decimalValue || getMiniDecimal(0)).add(stepDecimal.toString());\n var updatedValue = triggerValueUpdate(target, false);\n onStep === null || onStep === void 0 || onStep(getDecimalValue(stringMode, updatedValue), {\n offset: shiftKeyRef.current ? getDecupleSteps(step) : step,\n type: up ? 'up' : 'down'\n });\n (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 || _inputRef$current.focus();\n };\n\n // ============================ Flush =============================\n /**\n * Flush current input content to trigger value change & re-formatter input if needed.\n * This will always flush input value for update.\n * If it's invalidate, will fallback to last validate value.\n */\n var flushInputValue = function flushInputValue(userTyping) {\n var parsedValue = getMiniDecimal(mergedParser(inputValue));\n var formatValue;\n if (!parsedValue.isNaN()) {\n // Only validate value or empty value can be re-fill to inputValue\n // Reassign the formatValue within ranged of trigger control\n formatValue = triggerValueUpdate(parsedValue, userTyping);\n } else {\n formatValue = triggerValueUpdate(decimalValue, userTyping);\n }\n if (value !== undefined) {\n // Reset back with controlled value first\n setInputValue(decimalValue, false);\n } else if (!formatValue.isNaN()) {\n // Reset input back since no validate value\n setInputValue(formatValue, false);\n }\n };\n\n // Solve the issue of the event triggering sequence when entering numbers in chinese input (Safari)\n var onBeforeInput = function onBeforeInput() {\n userTypingRef.current = true;\n };\n var onKeyDown = function onKeyDown(event) {\n var key = event.key,\n shiftKey = event.shiftKey;\n userTypingRef.current = true;\n shiftKeyRef.current = shiftKey;\n if (key === 'Enter') {\n if (!compositionRef.current) {\n userTypingRef.current = false;\n }\n flushInputValue(false);\n onPressEnter === null || onPressEnter === void 0 || onPressEnter(event);\n }\n if (keyboard === false) {\n return;\n }\n\n // Do step\n if (!compositionRef.current && ['Up', 'ArrowUp', 'Down', 'ArrowDown'].includes(key)) {\n onInternalStep(key === 'Up' || key === 'ArrowUp');\n event.preventDefault();\n }\n };\n var onKeyUp = function onKeyUp() {\n userTypingRef.current = false;\n shiftKeyRef.current = false;\n };\n React.useEffect(function () {\n if (changeOnWheel && focus) {\n var onWheel = function onWheel(event) {\n // moving mouse wheel rises wheel event with deltaY < 0\n // scroll value grows from top to bottom, as screen Y coordinate\n onInternalStep(event.deltaY < 0);\n event.preventDefault();\n };\n var input = inputRef.current;\n if (input) {\n // React onWheel is passive and we can't preventDefault() in it.\n // That's why we should subscribe with DOM listener\n // https://stackoverflow.com/questions/63663025/react-onwheel-handler-cant-preventdefault-because-its-a-passive-event-listenev\n input.addEventListener('wheel', onWheel, {\n passive: false\n });\n return function () {\n return input.removeEventListener('wheel', onWheel);\n };\n }\n }\n });\n\n // >>> Focus & Blur\n var onBlur = function onBlur() {\n if (changeOnBlur) {\n flushInputValue(false);\n }\n setFocus(false);\n userTypingRef.current = false;\n };\n\n // ========================== Controlled ==========================\n // Input by precision & formatter\n useLayoutUpdateEffect(function () {\n if (!decimalValue.isInvalidate()) {\n setInputValue(decimalValue, false);\n }\n }, [precision, formatter]);\n\n // Input by value\n useLayoutUpdateEffect(function () {\n var newValue = getMiniDecimal(value);\n setDecimalValue(newValue);\n var currentParsedValue = getMiniDecimal(mergedParser(inputValue));\n\n // When user typing from `1.2` to `1.`, we should not convert to `1` immediately.\n // But let it go if user set `formatter`\n if (!newValue.equals(currentParsedValue) || !userTypingRef.current || formatter) {\n // Update value as effect\n setInputValue(newValue, userTypingRef.current);\n }\n }, [value]);\n\n // ============================ Cursor ============================\n useLayoutUpdateEffect(function () {\n if (formatter) {\n restoreCursor();\n }\n }, [inputValue]);\n\n // ============================ Render ============================\n return /*#__PURE__*/React.createElement(\"div\", {\n ref: domRef,\n className: clsx(prefixCls, className, _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, \"\".concat(prefixCls, \"-focused\"), focus), \"\".concat(prefixCls, \"-disabled\"), disabled), \"\".concat(prefixCls, \"-readonly\"), readOnly), \"\".concat(prefixCls, \"-not-a-number\"), decimalValue.isNaN()), \"\".concat(prefixCls, \"-out-of-range\"), !decimalValue.isInvalidate() && !isInRange(decimalValue))),\n style: style,\n onFocus: function onFocus() {\n setFocus(true);\n },\n onBlur: onBlur,\n onKeyDown: onKeyDown,\n onKeyUp: onKeyUp,\n onCompositionStart: onCompositionStart,\n onCompositionEnd: onCompositionEnd,\n onBeforeInput: onBeforeInput\n }, controls && /*#__PURE__*/React.createElement(StepHandler, {\n prefixCls: prefixCls,\n upNode: upHandler,\n downNode: downHandler,\n upDisabled: upDisabled,\n downDisabled: downDisabled,\n onStep: onInternalStep\n }), /*#__PURE__*/React.createElement(\"div\", {\n className: \"\".concat(inputClassName, \"-wrap\")\n }, /*#__PURE__*/React.createElement(\"input\", _extends({\n autoComplete: \"off\",\n role: \"spinbutton\",\n \"aria-valuemin\": min,\n \"aria-valuemax\": max,\n \"aria-valuenow\": decimalValue.isInvalidate() ? null : decimalValue.toString(),\n step: step\n }, inputProps, {\n ref: composeRef(inputRef, ref),\n className: inputClassName,\n value: inputValue,\n onChange: onInternalInput,\n disabled: disabled,\n readOnly: readOnly\n }))));\n});\nvar InputNumber = /*#__PURE__*/React.forwardRef(function (props, ref) {\n var disabled = props.disabled,\n style = props.style,\n _props$prefixCls = props.prefixCls,\n prefixCls = _props$prefixCls === void 0 ? 'rc-input-number' : _props$prefixCls,\n value = props.value,\n prefix = props.prefix,\n suffix = props.suffix,\n addonBefore = props.addonBefore,\n addonAfter = props.addonAfter,\n className = props.className,\n classNames = props.classNames,\n rest = _objectWithoutProperties(props, _excluded2);\n var holderRef = React.useRef(null);\n var inputNumberDomRef = React.useRef(null);\n var inputFocusRef = React.useRef(null);\n var focus = function focus(option) {\n if (inputFocusRef.current) {\n triggerFocus(inputFocusRef.current, option);\n }\n };\n React.useImperativeHandle(ref, function () {\n return proxyObject(inputFocusRef.current, {\n focus: focus,\n nativeElement: holderRef.current.nativeElement || inputNumberDomRef.current\n });\n });\n return /*#__PURE__*/React.createElement(BaseInput, {\n className: className,\n triggerFocus: focus,\n prefixCls: prefixCls,\n value: value,\n disabled: disabled,\n style: style,\n prefix: prefix,\n suffix: suffix,\n addonAfter: addonAfter,\n addonBefore: addonBefore,\n classNames: classNames,\n components: {\n affixWrapper: 'div',\n groupWrapper: 'div',\n wrapper: 'div',\n groupAddon: 'div'\n },\n ref: holderRef\n }, /*#__PURE__*/React.createElement(InternalInputNumber, _extends({\n prefixCls: prefixCls,\n disabled: disabled,\n ref: inputFocusRef,\n domRef: inputNumberDomRef,\n className: classNames === null || classNames === void 0 ? void 0 : classNames.input\n }, rest)));\n});\nif (process.env.NODE_ENV !== 'production') {\n InputNumber.displayName = 'InputNumber';\n}\nexport default InputNumber;","import { FastColor } from '@ant-design/fast-color';\nimport { initComponentToken } from '../../input/style/token';\nexport const prepareComponentToken = token => {\n var _a;\n const handleVisible = (_a = token.handleVisible) !== null && _a !== void 0 ? _a : 'auto';\n const handleWidth = token.controlHeightSM - token.lineWidth * 2;\n return Object.assign(Object.assign({}, initComponentToken(token)), {\n controlWidth: 90,\n handleWidth,\n handleFontSize: token.fontSize / 2,\n handleVisible,\n handleActiveBg: token.colorFillAlter,\n handleBg: token.colorBgContainer,\n filledHandleBg: new FastColor(token.colorFillSecondary).onBackground(token.colorBgContainer).toHexString(),\n handleHoverColor: token.colorPrimary,\n handleBorderColor: token.colorBorder,\n handleOpacity: handleVisible === true ? 1 : 0,\n handleVisibleWidth: handleVisible === true ? handleWidth : 0\n });\n};","import { unit } from '@ant-design/cssinjs';\nimport { genBasicInputStyle, genInputGroupStyle, genPlaceholderStyle, initInputToken } from '../../input/style';\nimport { genBorderlessStyle, genFilledGroupStyle, genFilledStyle, genOutlinedGroupStyle, genOutlinedStyle, genUnderlinedStyle } from '../../input/style/variants';\nimport { resetComponent, resetIcon } from '../../style';\nimport { genCompactItemStyle } from '../../style/compact-item';\nimport { genStyleHooks, mergeToken } from '../../theme/internal';\nimport { prepareComponentToken } from './token';\nexport const genRadiusStyle = ({\n componentCls,\n borderRadiusSM,\n borderRadiusLG\n}, size) => {\n const borderRadius = size === 'lg' ? borderRadiusLG : borderRadiusSM;\n return {\n [`&-${size}`]: {\n [`${componentCls}-handler-wrap`]: {\n borderStartEndRadius: borderRadius,\n borderEndEndRadius: borderRadius\n },\n [`${componentCls}-handler-up`]: {\n borderStartEndRadius: borderRadius\n },\n [`${componentCls}-handler-down`]: {\n borderEndEndRadius: borderRadius\n }\n }\n };\n};\nconst genInputNumberStyles = token => {\n const {\n componentCls,\n lineWidth,\n lineType,\n borderRadius,\n inputFontSizeSM,\n inputFontSizeLG,\n controlHeightLG,\n controlHeightSM,\n colorError,\n paddingInlineSM,\n paddingBlockSM,\n paddingBlockLG,\n paddingInlineLG,\n colorIcon,\n motionDurationMid,\n handleHoverColor,\n handleOpacity,\n paddingInline,\n paddingBlock,\n handleBg,\n handleActiveBg,\n colorTextDisabled,\n borderRadiusSM,\n borderRadiusLG,\n controlWidth,\n handleBorderColor,\n filledHandleBg,\n lineHeightLG,\n calc\n } = token;\n return [{\n [componentCls]: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, resetComponent(token)), genBasicInputStyle(token)), {\n display: 'inline-block',\n width: controlWidth,\n margin: 0,\n padding: 0,\n borderRadius\n }), genOutlinedStyle(token, {\n [`${componentCls}-handler-wrap`]: {\n background: handleBg,\n [`${componentCls}-handler-down`]: {\n borderBlockStart: `${unit(lineWidth)} ${lineType} ${handleBorderColor}`\n }\n }\n })), genFilledStyle(token, {\n [`${componentCls}-handler-wrap`]: {\n background: filledHandleBg,\n [`${componentCls}-handler-down`]: {\n borderBlockStart: `${unit(lineWidth)} ${lineType} ${handleBorderColor}`\n }\n },\n '&:focus-within': {\n [`${componentCls}-handler-wrap`]: {\n background: handleBg\n }\n }\n })), genUnderlinedStyle(token, {\n [`${componentCls}-handler-wrap`]: {\n background: handleBg,\n [`${componentCls}-handler-down`]: {\n borderBlockStart: `${unit(lineWidth)} ${lineType} ${handleBorderColor}`\n }\n }\n })), genBorderlessStyle(token)), {\n '&-rtl': {\n direction: 'rtl',\n [`${componentCls}-input`]: {\n direction: 'rtl'\n }\n },\n '&-lg': {\n padding: 0,\n fontSize: inputFontSizeLG,\n lineHeight: lineHeightLG,\n borderRadius: borderRadiusLG,\n [`input${componentCls}-input`]: {\n height: calc(controlHeightLG).sub(calc(lineWidth).mul(2)).equal(),\n padding: `${unit(paddingBlockLG)} ${unit(paddingInlineLG)}`\n }\n },\n '&-sm': {\n padding: 0,\n fontSize: inputFontSizeSM,\n borderRadius: borderRadiusSM,\n [`input${componentCls}-input`]: {\n height: calc(controlHeightSM).sub(calc(lineWidth).mul(2)).equal(),\n padding: `${unit(paddingBlockSM)} ${unit(paddingInlineSM)}`\n }\n },\n // ===================== Out Of Range =====================\n '&-out-of-range': {\n [`${componentCls}-input-wrap`]: {\n input: {\n color: colorError\n }\n }\n },\n // Style for input-group: input with label, with button or dropdown...\n '&-group': Object.assign(Object.assign(Object.assign({}, resetComponent(token)), genInputGroupStyle(token)), {\n '&-wrapper': Object.assign(Object.assign(Object.assign({\n display: 'inline-block',\n textAlign: 'start',\n verticalAlign: 'top',\n [`${componentCls}-affix-wrapper`]: {\n width: '100%'\n },\n // Size\n '&-lg': {\n [`${componentCls}-group-addon`]: {\n borderRadius: borderRadiusLG,\n fontSize: token.fontSizeLG\n }\n },\n '&-sm': {\n [`${componentCls}-group-addon`]: {\n borderRadius: borderRadiusSM\n }\n }\n }, genOutlinedGroupStyle(token)), genFilledGroupStyle(token)), {\n // Fix the issue of using icons in Space Compact mode\n // https://github.com/ant-design/ant-design/issues/45764\n [`&:not(${componentCls}-compact-first-item):not(${componentCls}-compact-last-item)${componentCls}-compact-item`]: {\n [`${componentCls}, ${componentCls}-group-addon`]: {\n borderRadius: 0\n }\n },\n [`&:not(${componentCls}-compact-last-item)${componentCls}-compact-first-item`]: {\n [`${componentCls}, ${componentCls}-group-addon`]: {\n borderStartEndRadius: 0,\n borderEndEndRadius: 0\n }\n },\n [`&:not(${componentCls}-compact-first-item)${componentCls}-compact-last-item`]: {\n [`${componentCls}, ${componentCls}-group-addon`]: {\n borderStartStartRadius: 0,\n borderEndStartRadius: 0\n }\n }\n })\n }),\n [`&-disabled ${componentCls}-input`]: {\n cursor: 'not-allowed'\n },\n [componentCls]: {\n '&-input': Object.assign(Object.assign(Object.assign(Object.assign({}, resetComponent(token)), {\n width: '100%',\n padding: `${unit(paddingBlock)} ${unit(paddingInline)}`,\n textAlign: 'start',\n backgroundColor: 'transparent',\n border: 0,\n borderRadius,\n outline: 0,\n transition: `all ${motionDurationMid} linear`,\n appearance: 'textfield',\n fontSize: 'inherit'\n }), genPlaceholderStyle(token.colorTextPlaceholder)), {\n '&[type=\"number\"]::-webkit-inner-spin-button, &[type=\"number\"]::-webkit-outer-spin-button': {\n margin: 0,\n appearance: 'none'\n }\n })\n },\n [`&:hover ${componentCls}-handler-wrap, &-focused ${componentCls}-handler-wrap`]: {\n width: token.handleWidth,\n opacity: 1\n }\n })\n },\n // Handler\n {\n [componentCls]: Object.assign(Object.assign(Object.assign({\n [`${componentCls}-handler-wrap`]: {\n position: 'absolute',\n insetBlockStart: 0,\n insetInlineEnd: 0,\n width: token.handleVisibleWidth,\n opacity: handleOpacity,\n height: '100%',\n borderStartStartRadius: 0,\n borderStartEndRadius: borderRadius,\n borderEndEndRadius: borderRadius,\n borderEndStartRadius: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'stretch',\n transition: `all ${motionDurationMid}`,\n overflow: 'hidden',\n // Fix input number inside Menu makes icon too large\n // We arise the selector priority by nest selector here\n // https://github.com/ant-design/ant-design/issues/14367\n [`${componentCls}-handler`]: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flex: 'auto',\n height: '40%',\n [`\n ${componentCls}-handler-up-inner,\n ${componentCls}-handler-down-inner\n `]: {\n marginInlineEnd: 0,\n fontSize: token.handleFontSize\n }\n }\n },\n [`${componentCls}-handler`]: {\n height: '50%',\n overflow: 'hidden',\n color: colorIcon,\n fontWeight: 'bold',\n lineHeight: 0,\n textAlign: 'center',\n cursor: 'pointer',\n borderInlineStart: `${unit(lineWidth)} ${lineType} ${handleBorderColor}`,\n transition: `all ${motionDurationMid} linear`,\n '&:active': {\n background: handleActiveBg\n },\n // Hover\n '&:hover': {\n height: `60%`,\n [`\n ${componentCls}-handler-up-inner,\n ${componentCls}-handler-down-inner\n `]: {\n color: handleHoverColor\n }\n },\n '&-up-inner, &-down-inner': Object.assign(Object.assign({}, resetIcon()), {\n color: colorIcon,\n transition: `all ${motionDurationMid} linear`,\n userSelect: 'none'\n })\n },\n [`${componentCls}-handler-up`]: {\n borderStartEndRadius: borderRadius\n },\n [`${componentCls}-handler-down`]: {\n borderEndEndRadius: borderRadius\n }\n }, genRadiusStyle(token, 'lg')), genRadiusStyle(token, 'sm')), {\n // Disabled\n '&-disabled, &-readonly': {\n [`${componentCls}-handler-wrap`]: {\n display: 'none'\n },\n [`${componentCls}-input`]: {\n color: 'inherit'\n }\n },\n [`\n ${componentCls}-handler-up-disabled,\n ${componentCls}-handler-down-disabled\n `]: {\n cursor: 'not-allowed'\n },\n [`\n ${componentCls}-handler-up-disabled:hover &-handler-up-inner,\n ${componentCls}-handler-down-disabled:hover &-handler-down-inner\n `]: {\n color: colorTextDisabled\n }\n })\n }];\n};\nconst genAffixWrapperStyles = token => {\n const {\n componentCls,\n paddingBlock,\n paddingInline,\n inputAffixPadding,\n controlWidth,\n borderRadiusLG,\n borderRadiusSM,\n paddingInlineLG,\n paddingInlineSM,\n paddingBlockLG,\n paddingBlockSM,\n motionDurationMid\n } = token;\n return {\n [`${componentCls}-affix-wrapper`]: Object.assign(Object.assign({\n [`input${componentCls}-input`]: {\n padding: `${unit(paddingBlock)} 0`\n }\n }, genBasicInputStyle(token)), {\n // or number handler will cover form status\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n width: controlWidth,\n padding: 0,\n paddingInlineStart: paddingInline,\n '&-lg': {\n borderRadius: borderRadiusLG,\n paddingInlineStart: paddingInlineLG,\n [`input${componentCls}-input`]: {\n padding: `${unit(paddingBlockLG)} 0`\n }\n },\n '&-sm': {\n borderRadius: borderRadiusSM,\n paddingInlineStart: paddingInlineSM,\n [`input${componentCls}-input`]: {\n padding: `${unit(paddingBlockSM)} 0`\n }\n },\n [`&:not(${componentCls}-disabled):hover`]: {\n zIndex: 1\n },\n '&-focused, &:focus': {\n zIndex: 1\n },\n [`&-disabled > ${componentCls}-disabled`]: {\n background: 'transparent'\n },\n [`> div${componentCls}`]: {\n width: '100%',\n border: 'none',\n outline: 'none',\n [`&${componentCls}-focused`]: {\n boxShadow: 'none !important'\n }\n },\n '&::before': {\n display: 'inline-block',\n width: 0,\n visibility: 'hidden',\n content: '\"\\\\a0\"'\n },\n [`${componentCls}-handler-wrap`]: {\n zIndex: 2\n },\n [componentCls]: {\n position: 'static',\n color: 'inherit',\n '&-prefix, &-suffix': {\n display: 'flex',\n flex: 'none',\n alignItems: 'center',\n pointerEvents: 'none'\n },\n '&-prefix': {\n marginInlineEnd: inputAffixPadding\n },\n '&-suffix': {\n insetBlockStart: 0,\n insetInlineEnd: 0,\n height: '100%',\n marginInlineEnd: paddingInline,\n marginInlineStart: inputAffixPadding,\n transition: `margin ${motionDurationMid}`\n }\n },\n [`&:hover ${componentCls}-handler-wrap, &-focused ${componentCls}-handler-wrap`]: {\n width: token.handleWidth,\n opacity: 1\n },\n [`&:not(${componentCls}-affix-wrapper-without-controls):hover ${componentCls}-suffix`]: {\n marginInlineEnd: token.calc(token.handleWidth).add(paddingInline).equal()\n }\n }),\n // 覆盖 affix-wrapper borderRadius!\n [`${componentCls}-underlined`]: {\n borderRadius: 0\n }\n };\n};\nexport default genStyleHooks('InputNumber', token => {\n const inputNumberToken = mergeToken(token, initInputToken(token));\n return [genInputNumberStyles(inputNumberToken), genAffixWrapperStyles(inputNumberToken),\n // =====================================================\n // == Space Compact ==\n // =====================================================\n genCompactItemStyle(inputNumberToken)];\n}, prepareComponentToken, {\n unitless: {\n handleOpacity: true\n },\n resetFont: false\n});","\"use client\";\n\nvar __rest = this && this.__rest || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport * as React from 'react';\nimport DownOutlined from \"@ant-design/icons/es/icons/DownOutlined\";\nimport UpOutlined from \"@ant-design/icons/es/icons/UpOutlined\";\nimport classNames from 'classnames';\nimport RcInputNumber from 'rc-input-number';\nimport ContextIsolator from '../_util/ContextIsolator';\nimport { getMergedStatus, getStatusClassNames } from '../_util/statusUtils';\nimport { devUseWarning } from '../_util/warning';\nimport ConfigProvider, { ConfigContext } from '../config-provider';\nimport DisabledContext from '../config-provider/DisabledContext';\nimport useCSSVarCls from '../config-provider/hooks/useCSSVarCls';\nimport useSize from '../config-provider/hooks/useSize';\nimport { FormItemInputContext } from '../form/context';\nimport useVariant from '../form/hooks/useVariants';\nimport { useCompactItemContext } from '../space/Compact';\nimport useStyle from './style';\nconst InputNumber = /*#__PURE__*/React.forwardRef((props, ref) => {\n if (process.env.NODE_ENV !== 'production') {\n const typeWarning = devUseWarning('InputNumber');\n typeWarning.deprecated(!('bordered' in props), 'bordered', 'variant');\n typeWarning(!(props.type === 'number' && props.changeOnWheel), 'usage', 'When `type=number` is used together with `changeOnWheel`, changeOnWheel may not work properly. Please delete `type=number` if it is not necessary.');\n }\n const {\n getPrefixCls,\n direction\n } = React.useContext(ConfigContext);\n const inputRef = React.useRef(null);\n React.useImperativeHandle(ref, () => inputRef.current);\n const {\n className,\n rootClassName,\n size: customizeSize,\n disabled: customDisabled,\n prefixCls: customizePrefixCls,\n addonBefore,\n addonAfter,\n prefix,\n suffix,\n bordered,\n readOnly,\n status: customStatus,\n controls,\n variant: customVariant\n } = props,\n others = __rest(props, [\"className\", \"rootClassName\", \"size\", \"disabled\", \"prefixCls\", \"addonBefore\", \"addonAfter\", \"prefix\", \"suffix\", \"bordered\", \"readOnly\", \"status\", \"controls\", \"variant\"]);\n const prefixCls = getPrefixCls('input-number', customizePrefixCls);\n // Style\n const rootCls = useCSSVarCls(prefixCls);\n const [wrapCSSVar, hashId, cssVarCls] = useStyle(prefixCls, rootCls);\n const {\n compactSize,\n compactItemClassnames\n } = useCompactItemContext(prefixCls, direction);\n let upIcon = /*#__PURE__*/React.createElement(UpOutlined, {\n className: `${prefixCls}-handler-up-inner`\n });\n let downIcon = /*#__PURE__*/React.createElement(DownOutlined, {\n className: `${prefixCls}-handler-down-inner`\n });\n const controlsTemp = typeof controls === 'boolean' ? controls : undefined;\n if (typeof controls === 'object') {\n upIcon = typeof controls.upIcon === 'undefined' ? upIcon : (/*#__PURE__*/React.createElement(\"span\", {\n className: `${prefixCls}-handler-up-inner`\n }, controls.upIcon));\n downIcon = typeof controls.downIcon === 'undefined' ? downIcon : (/*#__PURE__*/React.createElement(\"span\", {\n className: `${prefixCls}-handler-down-inner`\n }, controls.downIcon));\n }\n const {\n hasFeedback,\n status: contextStatus,\n isFormItemInput,\n feedbackIcon\n } = React.useContext(FormItemInputContext);\n const mergedStatus = getMergedStatus(contextStatus, customStatus);\n const mergedSize = useSize(ctx => {\n var _a;\n return (_a = customizeSize !== null && customizeSize !== void 0 ? customizeSize : compactSize) !== null && _a !== void 0 ? _a : ctx;\n });\n // ===================== Disabled =====================\n const disabled = React.useContext(DisabledContext);\n const mergedDisabled = customDisabled !== null && customDisabled !== void 0 ? customDisabled : disabled;\n const [variant, enableVariantCls] = useVariant('inputNumber', customVariant, bordered);\n const suffixNode = hasFeedback && /*#__PURE__*/React.createElement(React.Fragment, null, feedbackIcon);\n const inputNumberClass = classNames({\n [`${prefixCls}-lg`]: mergedSize === 'large',\n [`${prefixCls}-sm`]: mergedSize === 'small',\n [`${prefixCls}-rtl`]: direction === 'rtl',\n [`${prefixCls}-in-form-item`]: isFormItemInput\n }, hashId);\n const wrapperClassName = `${prefixCls}-group`;\n const element = /*#__PURE__*/React.createElement(RcInputNumber, Object.assign({\n ref: inputRef,\n disabled: mergedDisabled,\n className: classNames(cssVarCls, rootCls, className, rootClassName, compactItemClassnames),\n upHandler: upIcon,\n downHandler: downIcon,\n prefixCls: prefixCls,\n readOnly: readOnly,\n controls: controlsTemp,\n prefix: prefix,\n suffix: suffixNode || suffix,\n addonBefore: addonBefore && (/*#__PURE__*/React.createElement(ContextIsolator, {\n form: true,\n space: true\n }, addonBefore)),\n addonAfter: addonAfter && (/*#__PURE__*/React.createElement(ContextIsolator, {\n form: true,\n space: true\n }, addonAfter)),\n classNames: {\n input: inputNumberClass,\n variant: classNames({\n [`${prefixCls}-${variant}`]: enableVariantCls\n }, getStatusClassNames(prefixCls, mergedStatus, hasFeedback)),\n affixWrapper: classNames({\n [`${prefixCls}-affix-wrapper-sm`]: mergedSize === 'small',\n [`${prefixCls}-affix-wrapper-lg`]: mergedSize === 'large',\n [`${prefixCls}-affix-wrapper-rtl`]: direction === 'rtl',\n [`${prefixCls}-affix-wrapper-without-controls`]: controls === false || mergedDisabled || readOnly\n }, hashId),\n wrapper: classNames({\n [`${wrapperClassName}-rtl`]: direction === 'rtl'\n }, hashId),\n groupWrapper: classNames({\n [`${prefixCls}-group-wrapper-sm`]: mergedSize === 'small',\n [`${prefixCls}-group-wrapper-lg`]: mergedSize === 'large',\n [`${prefixCls}-group-wrapper-rtl`]: direction === 'rtl',\n [`${prefixCls}-group-wrapper-${variant}`]: enableVariantCls\n }, getStatusClassNames(`${prefixCls}-group-wrapper`, mergedStatus, hasFeedback), hashId)\n }\n }, others));\n return wrapCSSVar(element);\n});\nconst TypedInputNumber = InputNumber;\n/** @private Internal Component. Do not use in your production. */\nconst PureInputNumber = props => (/*#__PURE__*/React.createElement(ConfigProvider, {\n theme: {\n components: {\n InputNumber: {\n handleVisible: true\n }\n }\n }\n}, /*#__PURE__*/React.createElement(InputNumber, Object.assign({}, props))));\nif (process.env.NODE_ENV !== 'production') {\n TypedInputNumber.displayName = 'InputNumber';\n}\nTypedInputNumber._InternalPanelDoNotUseOrYouWillBeFired = PureInputNumber;\nexport default TypedInputNumber;","// This icon file is generated automatically.\nvar SaveOutlined = { \"icon\": { \"tag\": \"svg\", \"attrs\": { \"viewBox\": \"64 64 896 896\", \"focusable\": \"false\" }, \"children\": [{ \"tag\": \"path\", \"attrs\": { \"d\": \"M893.3 293.3L730.7 130.7c-7.5-7.5-16.7-13-26.7-16V112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V338.5c0-17-6.7-33.2-18.7-45.2zM384 184h256v104H384V184zm456 656H184V184h136v136c0 17.7 14.3 32 32 32h320c17.7 0 32-14.3 32-32V205.8l136 136V840zM512 442c-79.5 0-144 64.5-144 144s64.5 144 144 144 144-64.5 144-144-64.5-144-144-144zm0 224c-44.2 0-80-35.8-80-80s35.8-80 80-80 80 35.8 80 80-35.8 80-80 80z\" } }] }, \"name\": \"save\", \"theme\": \"outlined\" };\nexport default SaveOutlined;\n","import _extends from \"@babel/runtime/helpers/esm/extends\";\n// GENERATE BY ./scripts/generate.ts\n// DON NOT EDIT IT MANUALLY\n\nimport * as React from 'react';\nimport SaveOutlinedSvg from \"@ant-design/icons-svg/es/asn/SaveOutlined\";\nimport AntdIcon from \"../components/AntdIcon\";\nvar SaveOutlined = function SaveOutlined(props, ref) {\n return /*#__PURE__*/React.createElement(AntdIcon, _extends({}, props, {\n ref: ref,\n icon: SaveOutlinedSvg\n }));\n};\n\n/** */\nvar RefIcon = /*#__PURE__*/React.forwardRef(SaveOutlined);\nif (process.env.NODE_ENV !== 'production') {\n RefIcon.displayName = 'SaveOutlined';\n}\nexport default RefIcon;","// This icon file is generated automatically.\nvar UploadOutlined = { \"icon\": { \"tag\": \"svg\", \"attrs\": { \"viewBox\": \"64 64 896 896\", \"focusable\": \"false\" }, \"children\": [{ \"tag\": \"path\", \"attrs\": { \"d\": \"M400 317.7h73.9V656c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V317.7H624c6.7 0 10.4-7.7 6.3-12.9L518.3 163a8 8 0 00-12.6 0l-112 141.7c-4.1 5.3-.4 13 6.3 13zM878 626h-60c-4.4 0-8 3.6-8 8v154H214V634c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v198c0 17.7 14.3 32 32 32h684c17.7 0 32-14.3 32-32V634c0-4.4-3.6-8-8-8z\" } }] }, \"name\": \"upload\", \"theme\": \"outlined\" };\nexport default UploadOutlined;\n","import _extends from \"@babel/runtime/helpers/esm/extends\";\n// GENERATE BY ./scripts/generate.ts\n// DON NOT EDIT IT MANUALLY\n\nimport * as React from 'react';\nimport UploadOutlinedSvg from \"@ant-design/icons-svg/es/asn/UploadOutlined\";\nimport AntdIcon from \"../components/AntdIcon\";\nvar UploadOutlined = function UploadOutlined(props, ref) {\n return /*#__PURE__*/React.createElement(AntdIcon, _extends({}, props, {\n ref: ref,\n icon: UploadOutlinedSvg\n }));\n};\n\n/** */\nvar RefIcon = /*#__PURE__*/React.forwardRef(UploadOutlined);\nif (process.env.NODE_ENV !== 'production') {\n RefIcon.displayName = 'UploadOutlined';\n}\nexport default RefIcon;","import { useEffect } from 'react';\nimport { Form } from 'antd';\nimport { useTranslation } from 'react-i18next';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useConfig } from '../../../hooks/useConfig';\nimport { translateErrorCode } from '../../../utils/errorCodeTranslator';\nimport { QUERY_KEYS } from '../../../constants';\nimport { useErrorHandler } from '../../../hooks/useErrorHandler';\nimport { ApiError, handleApiError } from '../../../services/api';\nimport type { ConfigData } from '../../../services/api';\n\n/**\n * Hook for managing configuration form\n */\nexport function useConfigForm() {\n const { t } = useTranslation();\n const queryClient = useQueryClient();\n const [form] = Form.useForm<ConfigFormValues>();\n const { config, isLoading, updateAsync, validate, isUpdating, isValidating } = useConfig();\n const { handleError, handleSuccess } = useErrorHandler();\n\n // Load config into form when it's available\n useEffect(() => {\n if (config) {\n const formData = sanitizeConfigForForm(config);\n form.setFieldsValue(formData);\n }\n }, [config, form]);\n\n const handleSave = async () => {\n try {\n const values = form.getFieldsValue();\n await updateAsync(values as Partial<ConfigData>);\n handleSuccess(t('config.saveSuccess'));\n } catch (error) {\n const apiError = handleApiError(error);\n const formattedMessage = formatConfigSaveError(apiError, t);\n handleError(apiError, formattedMessage);\n }\n };\n\n const handleValidate = () => {\n form.validateFields().then((values: ConfigFormValues) => {\n validate(values as Partial<ConfigData>);\n });\n };\n\n const handleTargetChange = async () => {\n // Auto-save targets when changed\n try {\n const values = form.getFieldsValue();\n const payload: Partial<ConfigData> = {\n ...stripConfigMetadata(config),\n ...values,\n targets: values.targets as ConfigData['targets'],\n };\n await updateAsync(payload);\n } catch (error) {\n const apiError = handleApiError(error);\n const autoSaveFailedMessage =\n translateErrorCode(apiError.code, t, apiError.params, t('config.saveFailed')) ??\n t('config.saveFailed');\n handleError(apiError, autoSaveFailedMessage);\n }\n };\n\n const getConfigPreview = () => {\n return JSON.stringify(form.getFieldsValue(), null, 2);\n };\n\n return {\n form,\n config,\n isLoading,\n isUpdating,\n isValidating,\n handleSave,\n handleValidate,\n handleTargetChange,\n getConfigPreview,\n refreshConfig: () => queryClient.invalidateQueries({ queryKey: QUERY_KEYS.CONFIG }),\n };\n}\n\ntype ConfigTarget = NonNullable<ConfigData['targets']>[number];\n\nexport type ConfigFormTarget = {\n type?: ConfigTarget['type'];\n tag?: ConfigTarget['tag'];\n limit?: ConfigTarget['limit'];\n searchTarget?: ConfigTarget['searchTarget'];\n sort?: ConfigTarget['sort'];\n mode?: ConfigTarget['mode'];\n rankingMode?: ConfigTarget['rankingMode'];\n rankingDate?: ConfigTarget['rankingDate'];\n filterTag?: ConfigTarget['filterTag'];\n minBookmarks?: ConfigTarget['minBookmarks'];\n startDate?: ConfigTarget['startDate'];\n endDate?: ConfigTarget['endDate'];\n seriesId?: ConfigTarget['seriesId'];\n novelId?: ConfigTarget['novelId'];\n};\n\nexport type ConfigFormValues = Omit<ConfigData, '_meta' | '_validation' | 'targets'> & {\n targets?: ConfigFormTarget[];\n};\n\nconst sanitizeConfigForForm = (config: ConfigData): ConfigFormValues => {\n const { _meta, _validation, ...configWithoutMeta } = config;\n\n return {\n ...configWithoutMeta,\n targets: Array.isArray(configWithoutMeta.targets) ? configWithoutMeta.targets : [],\n };\n};\n\nconst stripConfigMetadata = (\n data: ConfigData | undefined\n): Partial<ConfigData> => {\n if (!data) {\n return {};\n }\n\n const { _meta, _validation, ...rest } = data;\n return rest;\n};\n\nconst formatConfigSaveError = (\n error: ApiError,\n t: ReturnType<typeof useTranslation>['t']\n): string => {\n if (error.code === 'CONFIG_INVALID' && Array.isArray(error.details)) {\n const errorMessages = error.details.map((detail) => {\n if (typeof detail === 'object' && detail && 'code' in detail) {\n const { code, params } = detail as { code?: string; params?: Record<string, unknown> };\n return translateErrorCode(code, t, params);\n }\n return String(detail);\n });\n\n return `${translateErrorCode(error.code, t)}: ${errorMessages.join(', ')}`;\n }\n\n return (\n translateErrorCode(error.code, t, error.params, error.message) ||\n error.message ||\n t('config.saveFailed')\n );\n};\n\n","import { useState, useCallback, useMemo } from 'react';\nimport { message } from 'antd';\n\n/**\n * Loading state with optional message\n */\nexport interface LoadingState {\n loading: boolean;\n message?: string;\n progress?: number; // 0-100\n}\n\n/**\n * Hook for unified loading state management\n * Provides loading state, loading message, and loading progress\n */\nexport function useLoadingState(initialState: boolean = false) {\n const [loading, setLoading] = useState<boolean>(initialState);\n const [loadingMessage, setLoadingMessage] = useState<string | undefined>(undefined);\n const [progress, setProgress] = useState<number | undefined>(undefined);\n const [messageKey, setMessageKey] = useState<string | undefined>(undefined);\n\n const startLoading = useCallback((msg?: string, key?: string) => {\n setLoading(true);\n if (msg) {\n setLoadingMessage(msg);\n if (key) {\n setMessageKey(key);\n message.loading({ content: msg, key, duration: 0 });\n }\n }\n }, []);\n\n const stopLoading = useCallback((successMessage?: string) => {\n setLoading(false);\n setLoadingMessage(undefined);\n setProgress(undefined);\n \n if (messageKey) {\n message.destroy(messageKey);\n if (successMessage) {\n message.success({ content: successMessage, key: messageKey, duration: 2 });\n }\n setMessageKey(undefined);\n }\n }, [messageKey]);\n\n const updateProgress = useCallback((value: number) => {\n setProgress(Math.max(0, Math.min(100, value)));\n }, []);\n\n const updateMessage = useCallback((msg: string) => {\n setLoadingMessage(msg);\n if (messageKey) {\n message.loading({ content: msg, key: messageKey, duration: 0 });\n }\n }, [messageKey]);\n\n const state: LoadingState = useMemo(\n () => ({\n loading,\n message: loadingMessage,\n progress,\n }),\n [loading, loadingMessage, progress]\n );\n\n return {\n ...state,\n startLoading,\n stopLoading,\n updateProgress,\n updateMessage,\n setLoading,\n };\n}\n\n/**\n * Hook for managing multiple loading states\n */\nexport function useLoadingStates<T extends string>(\n initialStates?: Partial<Record<T, boolean>>\n) {\n const [loadingStates, setLoadingStates] = useState<Partial<Record<T, LoadingState>>>(() => {\n if (!initialStates) {\n return {};\n }\n\n return Object.entries(initialStates).reduce<Partial<Record<T, LoadingState>>>(\n (acc, [key, value]) => {\n acc[key as T] = { loading: Boolean(value) };\n return acc;\n },\n {}\n );\n });\n\n const setLoading = useCallback((key: T, value: boolean, message?: string) => {\n setLoadingStates((prev) => ({\n ...prev,\n [key]: {\n loading: value,\n message: value ? message : undefined,\n progress: value ? prev[key]?.progress : undefined,\n },\n }));\n }, []);\n\n const startLoading = useCallback((key: T, message?: string) => {\n setLoading(key, true, message);\n }, [setLoading]);\n\n const stopLoading = useCallback((key: T, successMessage?: string) => {\n setLoadingStates((prev) => {\n const current = prev[key];\n if (current?.loading && successMessage) {\n // Show success message if provided\n message.success(successMessage);\n }\n return {\n ...prev,\n [key]: {\n loading: false,\n message: undefined,\n progress: undefined,\n },\n };\n });\n }, []);\n\n const updateProgress = useCallback((key: T, value: number) => {\n setLoadingStates((prev) => ({\n ...prev,\n [key]: {\n ...prev[key],\n loading: prev[key]?.loading ?? false,\n progress: Math.max(0, Math.min(100, value)),\n },\n }));\n }, []);\n\n const isLoading = useCallback(\n (key: T) => loadingStates[key]?.loading === true,\n [loadingStates]\n );\n\n const getLoadingState = useCallback(\n (key: T): LoadingState | undefined => loadingStates[key],\n [loadingStates]\n );\n\n const isAnyLoading = useMemo(() => {\n const stateValues = Object.values(loadingStates) as Array<LoadingState | undefined>;\n return stateValues.some((state) => state?.loading === true);\n }, [loadingStates]);\n\n return {\n loadingStates,\n setLoading,\n startLoading,\n stopLoading,\n updateProgress,\n isLoading,\n getLoadingState,\n isAnyLoading,\n };\n}\n\n","import { useCallback, useMemo } from 'react';\nimport { message } from 'antd';\nimport { useTranslation } from 'react-i18next';\nimport { useQueryClient } from '@tanstack/react-query';\nimport type { ConfigData } from '../../../services/api';\nimport { configService } from '../../../services/configService';\nimport { extractErrorInfo } from '../../../utils/errorCodeTranslator';\nimport { QUERY_KEYS } from '../../../constants';\nimport { useConfigFiles } from '../../../hooks/useConfig';\nimport { useErrorHandler } from '../../../hooks/useErrorHandler';\nimport { useLoadingState } from '../../../hooks/useLoadingState';\n\n\nconst IMPORT_LOADING_KEY = 'config-import';\n\n/**\n * Hook for configuration operations (export, import, copy, etc.)\n */\nexport function useConfigOperations(config: ConfigData | undefined) {\n const { t } = useTranslation();\n const queryClient = useQueryClient();\n const { refetch: refetchConfigFiles } = useConfigFiles();\n const { handleWarning, handleSuccess, handleError } = useErrorHandler();\n const { loading: isImporting, startLoading, stopLoading } = useLoadingState();\n\n const configExportPayload = useMemo(() => {\n if (!config) {\n return null;\n }\n\n const { _meta, _validation, ...configWithoutMeta } = config;\n return configWithoutMeta;\n }, [config]);\n\n const handleExportConfig = useCallback(() => {\n if (!configExportPayload) {\n handleWarning(t('config.configNotLoaded'));\n return;\n }\n\n const jsonStr = JSON.stringify(configExportPayload, null, 2);\n const blob = new Blob([jsonStr], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = `config-${new Date().toISOString().split('T')[0]}.json`;\n anchor.click();\n URL.revokeObjectURL(url);\n handleSuccess(t('config.configExported'));\n }, [configExportPayload, handleSuccess, handleWarning, t]);\n\n const parseConfigFile = useCallback(async (file: File): Promise<Partial<ConfigData>> => {\n const fileContent = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (event) => resolve((event.target?.result as string) ?? '');\n reader.onerror = () =>\n reject(new Error(t('config.configReadFailed', { defaultValue: 'Failed to read config file' })));\n reader.readAsText(file);\n });\n\n const parsed = JSON.parse(fileContent) as Partial<ConfigData>;\n if (typeof parsed !== 'object' || parsed === null) {\n throw new Error(t('config.configFormatError'));\n }\n\n const { _meta, _validation, ...normalized } = parsed as ConfigData;\n return normalized;\n }, [t]);\n\n const handleImportConfig = useCallback(() => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = '.json';\n input.multiple = true;\n\n input.onchange = async (event: Event) => {\n const target = event.target as HTMLInputElement;\n const files = Array.from(target.files ?? []);\n if (files.length === 0) {\n return;\n }\n\n startLoading(undefined, IMPORT_LOADING_KEY);\n\n let successCount = 0;\n let failCount = 0;\n const failedFiles: string[] = [];\n let lastImportedPath: string | null = null;\n\n try {\n for (const file of files) {\n let configToImport: Partial<ConfigData>;\n\n try {\n configToImport = await parseConfigFile(file);\n } catch (error) {\n failCount++;\n failedFiles.push(`${file.name}: ${error instanceof Error ? error.message : t('config.configFormatError')}`);\n continue;\n }\n\n try {\n const validationResult = await configService.validateConfig(configToImport);\n if (!validationResult.valid) {\n const errorDetails = Array.isArray(validationResult.errors) && validationResult.errors.length > 0\n ? validationResult.errors.join(', ')\n : t('config.validationFailed');\n failCount++;\n failedFiles.push(`${file.name}: ${errorDetails}`);\n continue;\n }\n } catch (error) {\n console.warn('[Config Import] Validation error:', error);\n }\n\n try {\n const baseName = file.name.replace(/\\.json$/i, '').replace(/^standalone\\.config\\./i, '');\n const timestamp = new Date().toISOString().split('T')[0];\n const importName = baseName ? `${baseName}-${timestamp}` : `imported-${timestamp}`;\n const result = await configService.importConfigFile(configToImport, importName);\n lastImportedPath = result.path;\n successCount++;\n } catch (error) {\n const { message: errorMessage } = extractErrorInfo(error);\n failCount++;\n failedFiles.push(\n `${file.name}: ${errorMessage || (error instanceof Error ? error.message : t('config.unknownError'))}`\n );\n }\n }\n\n if (lastImportedPath) {\n try {\n await configService.switchConfigFile(lastImportedPath);\n } catch (error) {\n handleError(error);\n }\n }\n\n await queryClient.invalidateQueries({ queryKey: QUERY_KEYS.CONFIG });\n await queryClient.invalidateQueries({ queryKey: QUERY_KEYS.CONFIG_FILES });\n refetchConfigFiles();\n\n if (successCount > 0 && failCount === 0) {\n handleSuccess(\n files.length === 1\n ? t('config.configImportedAndSaved')\n : t('config.configBatchImportedSuccess', { count: successCount })\n );\n } else if (successCount > 0 && failCount > 0) {\n message.warning(\n t('config.configBatchImportedPartial', {\n success: successCount,\n total: files.length,\n failed: failCount,\n })\n );\n console.warn('[Config Import] Failed files:\\n', failedFiles.join('\\n'));\n } else {\n const errorMessage =\n files.length === 1\n ? `${t('config.configImportFailed')}: ${failedFiles[0] || t('config.unknownError')}`\n : t('config.configBatchImportedFailed', { count: failCount });\n message.error(errorMessage);\n }\n } finally {\n stopLoading();\n }\n };\n\n input.click();\n }, [\n handleError,\n handleSuccess,\n parseConfigFile,\n queryClient,\n refetchConfigFiles,\n startLoading,\n stopLoading,\n t,\n ]);\n\n const handleCopyConfig = useCallback(\n async (configJson: string) => {\n try {\n await navigator.clipboard.writeText(configJson);\n handleSuccess(t('config.configCopied'));\n } catch (error) {\n handleError(error, t('config.clipboardCopyFailed', { defaultValue: 'Failed to copy config to clipboard' }));\n }\n },\n [handleError, handleSuccess, t]\n );\n\n const handleConfigFileSwitch = useCallback(() => {\n setTimeout(() => {\n window.location.reload();\n }, 1000);\n }, []);\n\n const handleConfigApplied = useCallback(() => {\n setTimeout(() => {\n window.location.reload();\n }, 1000);\n }, []);\n\n return {\n handleExportConfig,\n handleImportConfig,\n handleCopyConfig,\n handleConfigFileSwitch,\n handleConfigApplied,\n isImporting,\n };\n}\n\n","import { useState, useCallback } from 'react';\n\n/**\n * Hook for managing config modals state\n */\nexport function useConfigModals() {\n const [previewVisible, setPreviewVisible] = useState(false);\n const [jsonEditorVisible, setJsonEditorVisible] = useState(false);\n const [editingConfigFile, setEditingConfigFile] = useState<string | null>(null);\n\n const openPreview = useCallback(() => {\n setPreviewVisible(true);\n }, []);\n\n const closePreview = useCallback(() => {\n setPreviewVisible(false);\n }, []);\n\n const openJsonEditor = useCallback((filename: string) => {\n setEditingConfigFile(filename);\n setJsonEditorVisible(true);\n }, []);\n\n const closeJsonEditor = useCallback(() => {\n setJsonEditorVisible(false);\n setEditingConfigFile(null);\n }, []);\n\n return {\n previewVisible,\n jsonEditorVisible,\n editingConfigFile,\n openPreview,\n closePreview,\n openJsonEditor,\n closeJsonEditor,\n };\n}\n\n","import { useState, useCallback } from 'react';\n\n/**\n * Hook for managing config tabs state\n */\nexport function useConfigTabs() {\n const [activeTab, setActiveTab] = useState('files');\n\n const handleTabChange = useCallback((tab: string) => {\n setActiveTab(tab);\n }, []);\n\n return {\n activeTab,\n setActiveTab: handleTabChange,\n };\n}\n\n","import { Typography, Space, Select, Tag } from 'antd';\nimport { useTranslation } from 'react-i18next';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { ConfigFileInfo } from '../../../services/api';\nimport { api } from '../../../services/api';\nimport { useErrorHandler } from '../../../hooks/useErrorHandler';\nimport { QUERY_KEYS } from '../../../constants';\n\nconst { Title, Text } = Typography;\nconst { Option } = Select;\n\ntype MaybePromise<T = void> = T | Promise<T>;\n\ninterface ConfigHeaderProps {\n currentConfigPath: string;\n configFiles: ConfigFileInfo[];\n onConfigFileSwitch: () => MaybePromise;\n refetchConfigFiles: () => MaybePromise<unknown>;\n}\n\n/**\n * ConfigHeader component - Header with title and config file selector\n */\nexport function ConfigHeader({\n currentConfigPath,\n configFiles,\n onConfigFileSwitch,\n refetchConfigFiles,\n}: ConfigHeaderProps) {\n const { t } = useTranslation();\n const queryClient = useQueryClient();\n const { handleError, handleSuccess } = useErrorHandler();\n const activeConfigFile = configFiles?.find((f) => f.isActive);\n\n const handleConfigFileChange = async (filename: string) => {\n const file = configFiles.find((f) => f.filename === filename);\n if (file && !file.isActive) {\n try {\n await api.switchConfigFile(file.path);\n handleSuccess(t('config.configSwitched'));\n await queryClient.invalidateQueries({ queryKey: QUERY_KEYS.CONFIG });\n await queryClient.invalidateQueries({ queryKey: QUERY_KEYS.CONFIG_FILES });\n await Promise.resolve(refetchConfigFiles());\n await Promise.resolve(onConfigFileSwitch());\n } catch (error) {\n handleError(error, t('config.configSwitchFailed'));\n }\n }\n };\n\n return (\n <div style={{ flex: '1 1 auto', minWidth: 200 }}>\n <Title level={2} style={{ margin: 0, whiteSpace: 'normal', wordBreak: 'normal' }}>\n {t('config.title')}\n </Title>\n <Space direction=\"vertical\" size=\"small\" style={{ marginTop: 8 }}>\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n {t('config.currentConfigFile')}: {currentConfigPath}\n </Text>\n {configFiles && configFiles.length > 0 && (\n <Select\n value={activeConfigFile?.filename || undefined}\n onChange={handleConfigFileChange}\n style={{ width: 300, fontSize: 12 }}\n placeholder={t('config.selectConfigFile')}\n size=\"small\"\n >\n {configFiles.map((file) => (\n <Option key={file.filename} value={file.filename}>\n {file.isActive && <Tag color=\"green\" style={{ marginRight: 8 }}>{t('config.activeConfig')}</Tag>}\n {file.filename}\n </Option>\n ))}\n </Select>\n )}\n </Space>\n </div>\n );\n}\n\n","import { Button, Space, Tooltip } from 'antd';\nimport {\n SaveOutlined,\n ReloadOutlined,\n CheckCircleOutlined,\n DownloadOutlined,\n UploadOutlined,\n FileTextOutlined,\n CopyOutlined,\n} from '@ant-design/icons';\nimport { useTranslation } from 'react-i18next';\nimport { useAuth } from '../../../hooks/useAuth';\n\ninterface ConfigActionsProps {\n onRefresh: () => void;\n onPreview: () => void;\n onExport: () => void;\n onImport: () => void;\n onCopy: () => void | Promise<void>;\n onValidate: () => void;\n onSave: () => void;\n isValidating: boolean;\n isUpdating: boolean;\n isImporting?: boolean;\n}\n\n/**\n * ConfigActions component - Action buttons for configuration operations\n */\nexport function ConfigActions({\n onRefresh,\n onPreview,\n onExport,\n onImport,\n onCopy,\n onValidate,\n onSave,\n isValidating,\n isUpdating,\n isImporting = false,\n}: ConfigActionsProps) {\n const { t } = useTranslation();\n const { authenticated } = useAuth();\n \n // Buttons that require authentication\n const requiresAuth = !authenticated;\n const loginTip = t('common.loginRequired');\n\n return (\n <Space wrap>\n <Button icon={<ReloadOutlined />} onClick={onRefresh}>\n {t('common.refresh')}\n </Button>\n <Button icon={<FileTextOutlined />} onClick={onPreview}>\n {t('config.previewConfig')}\n </Button>\n <Button icon={<DownloadOutlined />} onClick={onExport}>\n {t('config.exportConfig')}\n </Button>\n <Tooltip title={requiresAuth ? loginTip : undefined}>\n <Button \n icon={<UploadOutlined />} \n onClick={onImport} \n loading={isImporting} \n disabled={isImporting || requiresAuth}\n >\n {t('config.importConfig')}\n </Button>\n </Tooltip>\n <Button icon={<CopyOutlined />} onClick={onCopy}>\n {t('config.copyConfig')}\n </Button>\n <Button icon={<CheckCircleOutlined />} onClick={onValidate} loading={isValidating}>\n {t('config.validateConfig')}\n </Button>\n <Tooltip title={requiresAuth ? loginTip : undefined}>\n <Button\n type=\"primary\"\n icon={<SaveOutlined />}\n onClick={onSave}\n loading={isUpdating}\n disabled={requiresAuth}\n >\n {t('config.saveConfig')}\n </Button>\n </Tooltip>\n </Space>\n );\n}\n\n","import React from 'react';\nimport { Card, Collapse, Typography, Space } from 'antd';\nimport { FormSectionProps } from './types';\n\nconst { Panel } = Collapse;\nconst { Title, Text } = Typography;\n\n/**\n * Form section component that provides consistent grouping\n * for form fields. Supports both card and collapsible modes.\n */\nexport const FormSection: React.FC<FormSectionProps> = ({\n title,\n description,\n children,\n collapsible = false,\n defaultCollapsed = false,\n card = true,\n extra,\n style,\n className,\n}) => {\n if (collapsible) {\n return (\n <Collapse\n defaultActiveKey={defaultCollapsed ? [] : ['1']}\n style={style}\n className={className}\n >\n <Panel\n header={\n <Space direction=\"vertical\" size={0}>\n <Title level={5} style={{ margin: 0 }}>\n {title}\n </Title>\n {description && (\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n {description}\n </Text>\n )}\n </Space>\n }\n key=\"1\"\n extra={extra}\n >\n {children}\n </Panel>\n </Collapse>\n );\n }\n\n if (card) {\n return (\n <Card\n title={\n <Space direction=\"vertical\" size={0}>\n <Title level={5} style={{ margin: 0 }}>\n {title}\n </Title>\n {description && (\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n {description}\n </Text>\n )}\n </Space>\n }\n extra={extra}\n style={style}\n className={className}\n >\n {children}\n </Card>\n );\n }\n\n return (\n <div style={style} className={className}>\n <Space direction=\"vertical\" size={8} style={{ width: '100%' }}>\n <Title level={5} style={{ margin: 0 }}>\n {title}\n </Title>\n {description && (\n <Text type=\"secondary\" style={{ fontSize: 12 }}>\n {description}\n </Text>\n )}\n {children}\n </Space>\n </div>\n );\n};\n\nexport default FormSection;\n\n","import React from 'react';\nimport { Form, InputNumber, Select, Tooltip, Space } from 'antd';\nimport { QuestionCircleOutlined } from '@ant-design/icons';\nimport { useTranslation } from 'react-i18next';\nimport { FormSection } from '../../../components/forms/FormSection';\n\nconst { Option } = Select;\n\nexport const BasicConfigForm: React.FC = () => {\n const { t } = useTranslation();\n\n return (\n <FormSection title={t('config.tabBasic')}>\n <Form.Item\n label={\n <Space>\n {t('config.logLevel')}\n <Tooltip title={t('config.logLevelTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n </Space>\n }\n name=\"logLevel\"\n >\n <Select>\n <Option value=\"debug\">{t('config.logLevelDebug')}</Option>\n <Option value=\"info\">{t('config.logLevelInfo')}</Option>\n <Option value=\"warn\">{t('config.logLevelWarn')}</Option>\n <Option value=\"error\">{t('config.logLevelError')}</Option>\n </Select>\n </Form.Item>\n\n <Form.Item\n label={\n <Space>\n {t('config.initialDelay')}\n <Tooltip title={t('config.initialDelayTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n </Space>\n }\n name=\"initialDelay\"\n >\n <InputNumber min={0} style={{ width: '100%' }} placeholder={t('config.initialDelayPlaceholder')} />\n </Form.Item>\n </FormSection>\n );\n};\n\n","import React from 'react';\nimport { Form, InputNumber, Input, Select, Switch, Divider } from 'antd';\nimport { useTranslation } from 'react-i18next';\nimport { FormSection } from '../../../components/forms/FormSection';\n\nconst { Option } = Select;\n\nexport const NetworkConfigForm: React.FC = () => {\n const { t } = useTranslation();\n\n return (\n <FormSection title={t('config.tabNetwork')}>\n <Form.Item label={t('config.networkTimeout')} name={['network', 'timeoutMs']}>\n <InputNumber min={1000} style={{ width: '100%' }} />\n </Form.Item>\n\n <Form.Item label={t('config.networkRetries')} name={['network', 'retries']}>\n <InputNumber min={0} max={10} style={{ width: '100%' }} />\n </Form.Item>\n\n <Form.Item label={t('config.networkRetryDelay')} name={['network', 'retryDelay']}>\n <InputNumber min={0} style={{ width: '100%' }} />\n </Form.Item>\n\n <Divider>{t('config.proxySettings')}</Divider>\n\n <Form.Item label={t('config.proxyEnabled')} name={['network', 'proxy', 'enabled']} valuePropName=\"checked\">\n <Switch />\n </Form.Item>\n\n <Form.Item\n noStyle\n shouldUpdate={(prevValues, currentValues) =>\n prevValues.network?.proxy?.enabled !== currentValues.network?.proxy?.enabled\n }\n >\n {({ getFieldValue }) =>\n getFieldValue(['network', 'proxy', 'enabled']) ? (\n <>\n <Form.Item label={t('config.proxyHost')} name={['network', 'proxy', 'host']}>\n <Input />\n </Form.Item>\n <Form.Item label={t('config.proxyPort')} name={['network', 'proxy', 'port']}>\n <InputNumber min={1} max={65535} style={{ width: '100%' }} />\n </Form.Item>\n <Form.Item label={t('config.proxyProtocol')} name={['network', 'proxy', 'protocol']}>\n <Select>\n <Option value=\"http\">HTTP</Option>\n <Option value=\"https\">HTTPS</Option>\n <Option value=\"socks4\">SOCKS4</Option>\n <Option value=\"socks5\">SOCKS5</Option>\n </Select>\n </Form.Item>\n <Form.Item label={t('config.proxyUsername')} name={['network', 'proxy', 'username']}>\n <Input />\n </Form.Item>\n <Form.Item label={t('config.proxyPassword')} name={['network', 'proxy', 'password']}>\n <Input.Password />\n </Form.Item>\n </>\n ) : null\n }\n </Form.Item>\n </FormSection>\n );\n};\n\n","import React from 'react';\nimport { Form, Input, Select } from 'antd';\nimport { useTranslation } from 'react-i18next';\nimport { FormSection } from '../../../components/forms/FormSection';\n\nconst { Option, OptGroup } = Select;\n\nexport const StorageConfigForm: React.FC = () => {\n const { t } = useTranslation();\n\n return (\n <FormSection title={t('config.tabStorage')}>\n <Form.Item label={t('config.storageDatabasePath')} name={['storage', 'databasePath']}>\n <Input />\n </Form.Item>\n\n <Form.Item label={t('config.storageDownloadDirectory')} name={['storage', 'downloadDirectory']}>\n <Input />\n </Form.Item>\n\n <Form.Item label={t('config.storageIllustrationDirectory')} name={['storage', 'illustrationDirectory']}>\n <Input />\n </Form.Item>\n\n <Form.Item label={t('config.storageNovelDirectory')} name={['storage', 'novelDirectory']}>\n <Input />\n </Form.Item>\n\n <Form.Item \n label={t('config.storageIllustrationOrganization')} \n name={['storage', 'illustrationOrganization']}\n tooltip={t('config.storageIllustrationOrganizationTooltip')}\n >\n <Select>\n <OptGroup label={t('config.organizationGroupSimple')}>\n <Option value=\"flat\">{t('config.organizationFlat')}</Option>\n <Option value=\"byAuthor\">{t('config.organizationByAuthor')}</Option>\n <Option value=\"byTag\">{t('config.organizationByTag')}</Option>\n </OptGroup>\n <OptGroup label={t('config.organizationGroupDate')}>\n <Option value=\"byDate\">{t('config.organizationByDate')}</Option>\n <Option value=\"byDay\">{t('config.organizationByDay')}</Option>\n <Option value=\"byDownloadDate\">{t('config.organizationByDownloadDate')}</Option>\n <Option value=\"byDownloadDay\">{t('config.organizationByDownloadDay')}</Option>\n </OptGroup>\n <OptGroup label={t('config.organizationGroupCombined')}>\n <Option value=\"byAuthorAndTag\">{t('config.organizationByAuthorAndTag')}</Option>\n <Option value=\"byDateAndAuthor\">{t('config.organizationByDateAndAuthor')}</Option>\n <Option value=\"byDayAndAuthor\">{t('config.organizationByDayAndAuthor')}</Option>\n <Option value=\"byDownloadDateAndAuthor\">{t('config.organizationByDownloadDateAndAuthor')}</Option>\n <Option value=\"byDownloadDayAndAuthor\">{t('config.organizationByDownloadDayAndAuthor')}</Option>\n </OptGroup>\n </Select>\n </Form.Item>\n\n <Form.Item \n label={t('config.storageNovelOrganization')} \n name={['storage', 'novelOrganization']}\n tooltip={t('config.storageNovelOrganizationTooltip')}\n >\n <Select>\n <OptGroup label={t('config.organizationGroupSimple')}>\n <Option value=\"flat\">{t('config.organizationFlat')}</Option>\n <Option value=\"byAuthor\">{t('config.organizationByAuthor')}</Option>\n <Option value=\"byTag\">{t('config.organizationByTag')}</Option>\n </OptGroup>\n <OptGroup label={t('config.organizationGroupDate')}>\n <Option value=\"byDate\">{t('config.organizationByDate')}</Option>\n <Option value=\"byDay\">{t('config.organizationByDay')}</Option>\n <Option value=\"byDownloadDate\">{t('config.organizationByDownloadDate')}</Option>\n <Option value=\"byDownloadDay\">{t('config.organizationByDownloadDay')}</Option>\n </OptGroup>\n <OptGroup label={t('config.organizationGroupCombined')}>\n <Option value=\"byAuthorAndTag\">{t('config.organizationByAuthorAndTag')}</Option>\n <Option value=\"byDateAndAuthor\">{t('config.organizationByDateAndAuthor')}</Option>\n <Option value=\"byDayAndAuthor\">{t('config.organizationByDayAndAuthor')}</Option>\n <Option value=\"byDownloadDateAndAuthor\">{t('config.organizationByDownloadDateAndAuthor')}</Option>\n <Option value=\"byDownloadDayAndAuthor\">{t('config.organizationByDownloadDayAndAuthor')}</Option>\n </OptGroup>\n </Select>\n </Form.Item>\n </FormSection>\n );\n};\n\n","import React from 'react';\nimport { Form, Switch, Input, InputNumber } from 'antd';\nimport { useTranslation } from 'react-i18next';\nimport { FormSection } from '../../../components/forms/FormSection';\n\nexport const SchedulerConfigForm: React.FC = () => {\n const { t } = useTranslation();\n\n return (\n <FormSection title={t('config.tabScheduler')}>\n <Form.Item label={t('config.schedulerEnabled')} name={['scheduler', 'enabled']} valuePropName=\"checked\">\n <Switch />\n </Form.Item>\n\n <Form.Item label={t('config.schedulerCron')} name={['scheduler', 'cron']}>\n <Input placeholder={t('config.schedulerCronPlaceholder')} />\n </Form.Item>\n\n <Form.Item label={t('config.schedulerTimezone')} name={['scheduler', 'timezone']}>\n <Input placeholder={t('config.schedulerTimezonePlaceholder')} />\n </Form.Item>\n\n <Form.Item label={t('config.schedulerMaxExecutions')} name={['scheduler', 'maxExecutions']}>\n <InputNumber min={1} style={{ width: '100%' }} placeholder={t('config.schedulerMaxExecutionsPlaceholder')} />\n </Form.Item>\n\n <Form.Item label={t('config.schedulerMinInterval')} name={['scheduler', 'minInterval']}>\n <InputNumber min={0} style={{ width: '100%' }} />\n </Form.Item>\n\n <Form.Item label={t('config.schedulerTimeout')} name={['scheduler', 'timeout']}>\n <InputNumber min={1000} style={{ width: '100%' }} placeholder={t('config.schedulerTimeoutPlaceholder')} />\n </Form.Item>\n </FormSection>\n );\n};\n\n","import React from 'react';\nimport { Form, InputNumber } from 'antd';\nimport { useTranslation } from 'react-i18next';\nimport { FormSection } from '../../../components/forms/FormSection';\n\nexport const DownloadConfigForm: React.FC = () => {\n const { t } = useTranslation();\n\n return (\n <FormSection title={t('config.tabDownload')}>\n <Form.Item label={t('config.downloadConcurrency')} name={['download', 'concurrency']}>\n <InputNumber min={1} max={10} style={{ width: '100%' }} />\n </Form.Item>\n\n <Form.Item label={t('config.downloadMaxRetries')} name={['download', 'maxRetries']}>\n <InputNumber min={0} max={10} style={{ width: '100%' }} />\n </Form.Item>\n\n <Form.Item label={t('config.downloadRetryDelay')} name={['download', 'retryDelay']}>\n <InputNumber min={0} style={{ width: '100%' }} />\n </Form.Item>\n\n <Form.Item label={t('config.downloadTimeout')} name={['download', 'timeout']}>\n <InputNumber min={1000} style={{ width: '100%' }} />\n </Form.Item>\n </FormSection>\n );\n};\n\n","import React, { useState, useEffect } from 'react';\nimport { Modal, Form, Input, InputNumber, Select, Steps, Collapse, Card, Button, Space, Tooltip, Typography } from 'antd';\nimport { QuestionCircleOutlined, ThunderboltOutlined } from '@ant-design/icons';\nimport { useTranslation } from 'react-i18next';\nimport { TargetConfig } from './targets/types';\n\nconst { Option } = Select;\nconst { Panel } = Collapse;\nconst { Step } = Steps;\nconst { Text, Paragraph } = Typography;\n\ninterface TargetModalProps {\n visible: boolean;\n editingTarget: TargetConfig | null;\n onSave: (values: TargetConfig) => void;\n onCancel: () => void;\n}\n\nexport const TargetModal: React.FC<TargetModalProps> = ({\n visible,\n editingTarget,\n onSave,\n onCancel,\n}) => {\n const { t } = useTranslation();\n const [form] = Form.useForm();\n const [targetStep, setTargetStep] = useState(0);\n\n // 配置模板\n const configTemplates = {\n tagSearch: {\n name: t('config.templateTagSearch'),\n description: t('config.templateTagSearchDesc'),\n config: {\n type: 'illustration',\n mode: 'search',\n tag: '',\n limit: 20,\n searchTarget: 'partial_match_for_tags',\n sort: 'date_desc',\n },\n },\n ranking: {\n name: t('config.templateRanking'),\n description: t('config.templateRankingDesc'),\n config: {\n type: 'illustration',\n mode: 'ranking',\n rankingMode: 'day',\n limit: 30,\n },\n },\n multiTag: {\n name: t('config.templateMultiTag'),\n description: t('config.templateMultiTagDesc'),\n config: {\n type: 'illustration',\n mode: 'search',\n tag: '',\n limit: 30,\n searchTarget: 'partial_match_for_tags',\n },\n },\n highQuality: {\n name: t('config.templateHighQuality'),\n description: t('config.templateHighQualityDesc'),\n config: {\n type: 'illustration',\n mode: 'search',\n tag: '',\n limit: 20,\n minBookmarks: 1000,\n sort: 'popular_desc',\n },\n },\n novel: {\n name: t('config.templateNovel'),\n description: t('config.templateNovelDesc'),\n config: {\n type: 'novel',\n mode: 'search',\n tag: '',\n limit: 10,\n },\n },\n };\n\n useEffect(() => {\n if (visible) {\n if (editingTarget) {\n form.setFieldsValue(editingTarget);\n setTargetStep(1);\n } else {\n form.resetFields();\n setTargetStep(0);\n }\n }\n }, [visible, editingTarget, form]);\n\n const handleApplyTemplate = (template: typeof configTemplates[keyof typeof configTemplates]) => {\n form.setFieldsValue(template.config);\n setTargetStep(1);\n };\n\n const handleOk = async () => {\n try {\n const values = await form.validateFields();\n onSave(values);\n form.resetFields();\n setTargetStep(0);\n } catch (error) {\n // Validation errors are handled by Ant Design\n }\n };\n\n const handleCancel = () => {\n form.resetFields();\n setTargetStep(0);\n onCancel();\n };\n\n return (\n <Modal\n title={\n <Space>\n {editingTarget ? t('config.editTarget') : t('config.addTarget')}\n {!editingTarget && (\n <Tooltip title={t('config.templateTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n )}\n </Space>\n }\n open={visible}\n onOk={handleOk}\n onCancel={handleCancel}\n width={800}\n okText={t('common.save')}\n cancelText={t('common.cancel')}\n >\n <Steps current={targetStep} style={{ marginBottom: 24 }}>\n <Step title={t('config.stepSelectTemplate')} description={t('config.stepSelectTemplateDesc')} />\n <Step title={t('config.stepConfigure')} description={t('config.stepConfigureDesc')} />\n </Steps>\n\n {targetStep === 0 && !editingTarget && (\n <div>\n <Paragraph type=\"secondary\" style={{ marginBottom: 16 }}>\n {t('config.templateSelectDescription')}\n </Paragraph>\n <Space direction=\"vertical\" style={{ width: '100%' }} size=\"middle\">\n {Object.entries(configTemplates).map(([key, template]) => (\n <Card\n key={key}\n hoverable\n style={{ cursor: 'pointer' }}\n onClick={() => handleApplyTemplate(template)}\n >\n <Space style={{ width: '100%', justifyContent: 'space-between' }}>\n <div>\n <Typography.Title level={5} style={{ margin: 0 }}>\n {template.name}\n </Typography.Title>\n <Text type=\"secondary\">{template.description}</Text>\n </div>\n <Button type=\"primary\" icon={<ThunderboltOutlined />}>\n {t('config.useTemplate')}\n </Button>\n </Space>\n </Card>\n ))}\n <Button\n block\n type=\"dashed\"\n onClick={() => setTargetStep(1)}\n style={{ marginTop: 8 }}\n >\n {t('config.skipTemplate')}\n </Button>\n </Space>\n </div>\n )}\n\n {targetStep === 1 && (\n <Form form={form} layout=\"vertical\">\n <Collapse defaultActiveKey={['basic']} ghost>\n <Panel header={t('config.targetBasicSettings')} key=\"basic\">\n <Form.Item\n label={\n <Space>\n {t('config.targetType')}\n <Tooltip title={t('config.targetTypeTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n </Space>\n }\n name=\"type\"\n rules={[{ required: true, message: t('config.targetTypeRequired') }]}\n >\n <Select>\n <Option value=\"illustration\">{t('config.typeIllustration')}</Option>\n <Option value=\"novel\">{t('config.typeNovel')}</Option>\n </Select>\n </Form.Item>\n\n <Form.Item\n label={\n <Space>\n {t('config.targetMode')}\n <Tooltip title={t('config.targetModeTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n </Space>\n }\n name=\"mode\"\n initialValue=\"search\"\n >\n <Select>\n <Option value=\"search\">{t('config.modeSearch')}</Option>\n <Option value=\"ranking\">{t('config.modeRanking')}</Option>\n </Select>\n </Form.Item>\n\n <Form.Item\n label={\n <Space>\n {t('config.targetLimit')}\n <Tooltip title={t('config.targetLimitTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n </Space>\n }\n name=\"limit\"\n rules={[{ type: 'number', min: 1, max: 1000, message: t('config.targetLimitRange') }]}\n >\n <InputNumber min={1} max={1000} style={{ width: '100%' }} placeholder={t('config.targetLimitPlaceholder')} />\n </Form.Item>\n </Panel>\n\n <Panel header={t('config.targetModeSettings')} key=\"mode\">\n <Form.Item\n noStyle\n shouldUpdate={(prevValues, currentValues) => prevValues.mode !== currentValues.mode}\n >\n {({ getFieldValue }) => {\n const mode = getFieldValue('mode') || 'search';\n if (mode === 'search') {\n return (\n <>\n <Form.Item\n label={\n <Space>\n {t('config.targetTag')}\n <Tooltip title={t('config.targetTagTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n </Space>\n }\n name=\"tag\"\n rules={[\n {\n validator: (_, value) => {\n if (!value || value.trim() === '') {\n return Promise.reject(new Error(t('config.targetTagRequired')));\n }\n return Promise.resolve();\n },\n },\n ]}\n >\n <Input placeholder={t('config.targetTagPlaceholder')} />\n </Form.Item>\n <Form.Item\n label={\n <Space>\n {t('config.searchTarget')}\n <Tooltip title={t('config.searchTargetTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n </Space>\n }\n name=\"searchTarget\"\n initialValue=\"partial_match_for_tags\"\n >\n <Select>\n <Option value=\"partial_match_for_tags\">{t('config.searchTargetPartial')} ({t('common.recommended')})</Option>\n <Option value=\"exact_match_for_tags\">{t('config.searchTargetExact')}</Option>\n <Option value=\"title_and_caption\">{t('config.searchTargetTitle')}</Option>\n </Select>\n </Form.Item>\n <Form.Item\n label={\n <Space>\n {t('config.sort')}\n <Tooltip title={t('config.sortTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n </Space>\n }\n name=\"sort\"\n initialValue=\"date_desc\"\n >\n <Select>\n <Option value=\"date_desc\">{t('config.sortDateDesc')}</Option>\n <Option value=\"date_asc\">{t('config.sortDateAsc')}</Option>\n <Option value=\"popular_desc\">{t('config.sortPopularDesc')}</Option>\n </Select>\n </Form.Item>\n </>\n );\n } else {\n return (\n <>\n <Form.Item\n label={\n <Space>\n {t('config.rankingMode')}\n <Tooltip title={t('config.rankingModeTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n </Space>\n }\n name=\"rankingMode\"\n initialValue=\"day\"\n >\n <Select>\n <Option value=\"day\">{t('config.rankingDay')}</Option>\n <Option value=\"week\">{t('config.rankingWeek')}</Option>\n <Option value=\"month\">{t('config.rankingMonth')}</Option>\n <Option value=\"day_male\">{t('config.rankingDayMale')}</Option>\n <Option value=\"day_female\">{t('config.rankingDayFemale')}</Option>\n <Option value=\"day_ai\">{t('config.rankingDayAI')}</Option>\n <Option value=\"week_original\">{t('config.rankingWeekOriginal')}</Option>\n <Option value=\"week_rookie\">{t('config.rankingWeekRookie')}</Option>\n </Select>\n </Form.Item>\n <Form.Item\n label={\n <Space>\n {t('config.rankingDate')}\n <Tooltip title={t('config.rankingDateTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n </Space>\n }\n name=\"rankingDate\"\n >\n <Input placeholder={t('config.rankingDatePlaceholder')} />\n </Form.Item>\n <Form.Item\n label={\n <Space>\n {t('config.filterTag')}\n <Tooltip title={t('config.filterTagTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n </Space>\n }\n name=\"filterTag\"\n >\n <Input placeholder={t('config.filterTagPlaceholder')} />\n </Form.Item>\n </>\n );\n }\n }}\n </Form.Item>\n </Panel>\n\n <Panel header={t('config.targetAdvancedFilters')} key=\"advanced\">\n <Form.Item\n label={\n <Space>\n {t('config.minBookmarks')}\n <Tooltip title={t('config.minBookmarksTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n </Space>\n }\n name=\"minBookmarks\"\n >\n <InputNumber min={0} style={{ width: '100%' }} placeholder={t('config.minBookmarksPlaceholder')} />\n </Form.Item>\n\n <Form.Item\n label={\n <Space>\n {t('config.startDate')}\n <Tooltip title={t('config.startDateTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n </Space>\n }\n name=\"startDate\"\n >\n <Input placeholder={t('config.startDatePlaceholder')} />\n </Form.Item>\n\n <Form.Item\n label={\n <Space>\n {t('config.endDate')}\n <Tooltip title={t('config.endDateTooltip')}>\n <QuestionCircleOutlined style={{ color: '#999' }} />\n </Tooltip>\n </Space>\n }\n name=\"endDate\"\n >\n <Input placeholder={t('config.endDatePlaceholder')} />\n </Form.Item>\n </Panel>\n </Collapse>\n </Form>\n )}\n </Modal>\n );\n};\n\n","import { Alert } from 'antd';\nimport { useTranslation } from 'react-i18next';\n\nexport function TargetsInfoAlert() {\n const { t } = useTranslation();\n\n return (\n <Alert\n message={t('config.targetsTitle')}\n description={t('config.targetsDescription')}\n type=\"info\"\n showIcon\n />\n );\n}\n\n","import { useMemo } from 'react';\nimport { Card, Table, Button, Space, Tag, Typography, Popconfirm } from 'antd';\nimport type { ColumnsType } from 'antd/es/table';\nimport { EditOutlined, DeleteOutlined, ThunderboltOutlined } from '@ant-design/icons';\nimport { useTranslation } from 'react-i18next';\nimport type { TargetConfig } from './types';\n\nconst { Text } = Typography;\n\ninterface TargetsTableProps {\n targets: TargetConfig[];\n onAdd: () => void;\n onEdit: (target: TargetConfig, index: number) => void;\n onDelete: (index: number) => void;\n}\n\nexport function TargetsTable({\n targets,\n onAdd,\n onEdit,\n onDelete,\n}: TargetsTableProps) {\n const { t } = useTranslation();\n\n const columns = useMemo<ColumnsType<TargetConfig>>(() => [\n {\n title: t('config.targetType'),\n dataIndex: 'type',\n key: 'type',\n width: 100,\n render: (type: string) => (\n <Tag color={type === 'illustration' ? 'blue' : 'green'}>\n {type === 'illustration' ? t('config.typeIllustration') : t('config.typeNovel')}\n </Tag>\n ),\n },\n {\n title: t('config.targetMode'),\n dataIndex: 'mode',\n key: 'mode',\n width: 100,\n render: (mode: string) => {\n if (!mode) return '-';\n return (\n <Tag color={mode === 'ranking' ? 'purple' : 'cyan'}>\n {mode === 'ranking' ? t('config.modeRanking') : t('config.modeSearch')}\n </Tag>\n );\n },\n },\n {\n title: t('config.targetConfig'),\n key: 'config',\n render: (_: unknown, record: TargetConfig) => {\n if (record.mode === 'ranking') {\n const rankingLabels: Record<string, string> = {\n day: t('config.rankingDay'),\n week: t('config.rankingWeek'),\n month: t('config.rankingMonth'),\n day_male: t('config.rankingDayMale'),\n day_female: t('config.rankingDayFemale'),\n day_ai: t('config.rankingDayAI'),\n week_original: t('config.rankingWeekOriginal'),\n week_rookie: t('config.rankingWeekRookie'),\n };\n return (\n <Space direction=\"vertical\" size=\"small\" style={{ fontSize: 12 }}>\n <Text strong>{rankingLabels[record.rankingMode || 'day'] || record.rankingMode}</Text>\n {record.filterTag && <Text type=\"secondary\">{t('config.filterTag')}: {record.filterTag}</Text>}\n {record.rankingDate && <Text type=\"secondary\">{t('config.rankingDate')}: {record.rankingDate}</Text>}\n </Space>\n );\n }\n\n if (record.seriesId) {\n return <Text>{t('config.seriesId')}: {record.seriesId}</Text>;\n }\n\n if (record.novelId) {\n return <Text>{t('config.novelId')}: {record.novelId}</Text>;\n }\n\n return (\n <Space direction=\"vertical\" size=\"small\" style={{ fontSize: 12 }}>\n <Text strong>{record.tag || '-'}</Text>\n {record.searchTarget && (\n <Text type=\"secondary\">\n {record.searchTarget === 'partial_match_for_tags'\n ? t('config.searchTargetPartial')\n : record.searchTarget === 'exact_match_for_tags'\n ? t('config.searchTargetExact')\n : t('config.searchTargetTitle')}\n </Text>\n )}\n {record.sort && (\n <Text type=\"secondary\">\n {record.sort === 'date_desc'\n ? t('config.sortDateDesc')\n : record.sort === 'date_asc'\n ? t('config.sortDateAsc')\n : t('config.sortPopularDesc')}\n </Text>\n )}\n </Space>\n );\n },\n },\n {\n title: t('config.targetFilters'),\n key: 'filters',\n width: 150,\n render: (_: unknown, record: TargetConfig) => (\n <Space direction=\"vertical\" size=\"small\" style={{ fontSize: 12 }}>\n {record.limit && <Text>{t('config.limit')}: {record.limit}</Text>}\n {record.minBookmarks && <Text type=\"secondary\">{t('config.minBookmarks')} ≥ {record.minBookmarks}</Text>}\n {(record.startDate || record.endDate) && (\n <Text type=\"secondary\">\n {record.startDate && `${t('config.from')} ${record.startDate}`}\n {record.endDate && ` ${t('config.to')} ${record.endDate}`}\n </Text>\n )}\n </Space>\n ),\n },\n {\n title: t('common.actions'),\n key: 'action',\n width: 150,\n render: (_: unknown, record: TargetConfig, index: number) => (\n <Space>\n <Button\n type=\"link\"\n icon={<EditOutlined />}\n onClick={() => onEdit(record, index)}\n size=\"small\"\n >\n {t('common.edit')}\n </Button>\n <Popconfirm\n title={t('config.deleteTargetConfirm')}\n onConfirm={() => onDelete(index)}\n okText={t('common.ok')}\n cancelText={t('common.cancel')}\n >\n <Button\n type=\"link\"\n danger\n icon={<DeleteOutlined />}\n size=\"small\"\n >\n {t('common.delete')}\n </Button>\n </Popconfirm>\n </Space>\n ),\n },\n ], [onDelete, onEdit, t]);\n\n return (\n <Card\n title={t('config.targetsList')}\n extra={\n <Button icon={<ThunderboltOutlined />} onClick={onAdd}>\n {t('config.addTarget')}\n </Button>\n }\n >\n <Table\n columns={columns}\n dataSource={targets}\n rowKey={(record) => (\n record._rowKey\n ? record._rowKey\n : String(record._index ?? record.tag ?? record.mode ?? 'target')\n )}\n pagination={false}\n locale={{ emptyText: t('config.targetsEmpty') }}\n />\n </Card>\n );\n}\n\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Form, Space } from 'antd';\nimport type { FormInstance } from 'antd';\nimport { TargetModal } from './TargetModal';\nimport { TargetsInfoAlert } from './targets/TargetsInfoAlert';\nimport { TargetsTable } from './targets/TargetsTable';\nimport type { TargetConfig } from './targets/types';\n\ninterface TargetsConfigFormProps {\n form: FormInstance;\n onTargetChange?: () => void;\n}\n\nexport const TargetsConfigForm: React.FC<TargetsConfigFormProps> = ({\n form,\n onTargetChange,\n}) => {\n const [targetModalVisible, setTargetModalVisible] = useState(false);\n const [editingTarget, setEditingTarget] = useState<TargetConfig | null>(null);\n\n useEffect(() => {\n const currentTargets = form.getFieldValue('targets');\n if (!Array.isArray(currentTargets)) {\n form.setFieldsValue({ targets: [] });\n }\n }, [form]);\n\n const targets =\n Form.useWatch<TargetConfig[]>('targets', form) ||\n (form.getFieldValue('targets') as TargetConfig[] | undefined) ||\n [];\n\n const notifyTargetChange = useCallback(() => {\n if (onTargetChange) {\n onTargetChange();\n }\n }, [onTargetChange]);\n\n const handleAddTarget = useCallback(() => {\n setEditingTarget(null);\n setTargetModalVisible(true);\n }, []);\n\n const handleEditTarget = useCallback((target: TargetConfig, index: number) => {\n setEditingTarget({ ...target, _index: index });\n setTargetModalVisible(true);\n }, []);\n\n const handleDeleteTarget = useCallback((index: number) => {\n const currentTargets = (form.getFieldValue('targets') || []) as TargetConfig[];\n const nextTargets = currentTargets.filter((_target, idx) => idx !== index);\n form.setFieldsValue({ targets: nextTargets });\n notifyTargetChange();\n }, [form, notifyTargetChange]);\n\n const handleSaveTarget = useCallback((values: TargetConfig) => {\n const currentTargets = (form.getFieldValue('targets') || []) as TargetConfig[];\n const nextTargets = [...currentTargets];\n\n if (editingTarget && typeof editingTarget._index === 'number') {\n nextTargets[editingTarget._index] = values;\n } else {\n nextTargets.push(values);\n }\n\n form.setFieldsValue({ targets: nextTargets });\n setTargetModalVisible(false);\n setEditingTarget(null);\n notifyTargetChange();\n }, [editingTarget, form, notifyTargetChange]);\n\n const handleModalClose = useCallback(() => {\n setTargetModalVisible(false);\n setEditingTarget(null);\n }, []);\n\n const targetsWithMetadata = useMemo(\n () => targets.map((target, index) => ({\n ...target,\n _index: index,\n _rowKey: `${target.type || 'target'}-${index}`,\n })),\n [targets],\n );\n\n return (\n <>\n <Form.Item name=\"targets\" hidden>\n <input type=\"hidden\" />\n </Form.Item>\n <Space direction=\"vertical\" style={{ width: '100%' }} size=\"large\">\n <TargetsInfoAlert />\n <TargetsTable\n targets={targetsWithMetadata}\n onAdd={handleAddTarget}\n onEdit={handleEditTarget}\n onDelete={handleDeleteTarget}\n />\n </Space>\n\n <TargetModal\n visible={targetModalVisible}\n editingTarget={editingTarget}\n onSave={handleSaveTarget}\n onCancel={handleModalClose}\n />\n </>\n );\n};\n\n","import React, { useRef, useState } from 'react';\nimport { Space, Button, message } from 'antd';\nimport { CopyOutlined, CheckOutlined } from '@ant-design/icons';\n\nexport interface CodeEditorProps {\n /**\n * Code content\n */\n value: string;\n \n /**\n * Callback when code changes\n */\n onChange?: (value: string) => void;\n \n /**\n * Language mode (for syntax highlighting)\n */\n language?: 'json' | 'javascript' | 'typescript' | 'yaml' | 'xml' | 'html' | 'css' | 'text';\n \n /**\n * Whether the editor is read-only\n */\n readOnly?: boolean;\n \n /**\n * Placeholder text\n */\n placeholder?: string;\n \n /**\n * Minimum height\n */\n minHeight?: number;\n \n /**\n * Maximum height\n */\n maxHeight?: number;\n \n /**\n * Whether to show line numbers\n */\n showLineNumbers?: boolean;\n \n /**\n * Whether to show copy button\n */\n showCopyButton?: boolean;\n \n /**\n * Custom style\n */\n style?: React.CSSProperties;\n \n /**\n * Custom className\n */\n className?: string;\n}\n\n/**\n * Simple code editor component using textarea with basic formatting.\n * For more advanced features, consider using a library like Monaco Editor or CodeMirror.\n */\nexport const CodeEditor: React.FC<CodeEditorProps> = ({\n value,\n onChange,\n language = 'text',\n readOnly = false,\n placeholder = 'Enter code...',\n minHeight = 200,\n maxHeight = 600,\n showCopyButton = true,\n style,\n className,\n}) => {\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const [copied, setCopied] = useState(false);\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (onChange) {\n onChange(e.target.value);\n }\n };\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n message.success('Copied to clipboard');\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n message.error('Failed to copy');\n }\n };\n\n // Format JSON on paste\n const handlePaste = (e: React.ClipboardEvent<HTMLTextAreaElement>) => {\n if (language === 'json' && !readOnly) {\n const pastedText = e.clipboardData.getData('text');\n try {\n const parsed = JSON.parse(pastedText);\n const formatted = JSON.stringify(parsed, null, 2);\n e.preventDefault();\n if (onChange) {\n onChange(formatted);\n }\n } catch {\n // Not valid JSON, allow normal paste\n }\n }\n };\n\n const editorStyle: React.CSSProperties = {\n fontFamily: 'Monaco, Menlo, \"Ubuntu Mono\", Consolas, \"source-code-pro\", monospace',\n fontSize: '14px',\n lineHeight: '1.6',\n padding: '12px',\n border: '1px solid #d9d9d9',\n borderRadius: '4px',\n backgroundColor: language === 'json' ? '#1f1f1f' : '#fff',\n color: language === 'json' ? '#fff' : '#000',\n minHeight: `${minHeight}px`,\n maxHeight: `${maxHeight}px`,\n overflow: 'auto',\n resize: 'vertical',\n width: '100%',\n ...style,\n };\n\n return (\n <div className={className}>\n {showCopyButton && (\n <Space style={{ marginBottom: 8, justifyContent: 'flex-end', width: '100%' }}>\n <Button\n size=\"small\"\n icon={copied ? <CheckOutlined /> : <CopyOutlined />}\n onClick={handleCopy}\n disabled={!value}\n >\n {copied ? 'Copied' : 'Copy'}\n </Button>\n </Space>\n )}\n <textarea\n ref={textareaRef}\n value={value}\n onChange={handleChange}\n onPaste={handlePaste}\n readOnly={readOnly}\n placeholder={placeholder}\n style={editorStyle}\n spellCheck={false}\n />\n </div>\n );\n};\n\nexport default CodeEditor;\n\n","import React, { useState, useEffect, useRef } from 'react';\nimport { Modal, Button, Space, Alert, Spin, message } from 'antd';\nimport { SaveOutlined } from '@ant-design/icons';\nimport { useTranslation } from 'react-i18next';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { api } from '../../../services/api';\nimport { CodeEditor } from '../../../components/common/CodeEditor';\nimport { useConfigFiles } from '../../../hooks/useConfig';\nimport { extractErrorInfo, translateErrorCode } from '../../../utils/errorCodeTranslator';\nimport { QUERY_KEYS } from '../../../constants';\n\ninterface ConfigJsonEditorProps {\n visible: boolean;\n filename: string;\n onClose: () => void;\n onConfigFileSwitch?: () => void;\n}\n\nexport const ConfigJsonEditor: React.FC<ConfigJsonEditorProps> = ({\n visible,\n filename,\n onClose,\n onConfigFileSwitch,\n}) => {\n const { t } = useTranslation();\n const queryClient = useQueryClient();\n const { configFiles, refetch: refetchConfigFiles } = useConfigFiles();\n const [jsonContent, setJsonContent] = useState<string>('');\n const [jsonEditorLoading, setJsonEditorLoading] = useState(false);\n const [lastReadContent, setLastReadContent] = useState<string>('');\n const [hasExternalChanges, setHasExternalChanges] = useState(false);\n const [isEditing, setIsEditing] = useState(false);\n \n const lastReadContentRef = useRef<string>('');\n const jsonContentRef = useRef<string>('');\n const isEditingRef = useRef<boolean>(false);\n\n // Load file content when modal opens\n useEffect(() => {\n if (visible && filename) {\n loadFileContent();\n } else {\n // Reset state when closing\n setJsonContent('');\n setLastReadContent('');\n setHasExternalChanges(false);\n lastReadContentRef.current = '';\n jsonContentRef.current = '';\n }\n }, [visible, filename]);\n\n // Poll for external changes (only when not editing)\n useEffect(() => {\n if (!visible || !filename || isEditingRef.current) {\n return;\n }\n\n let intervalId: NodeJS.Timeout;\n let isPolling = true;\n\n const pollFileContent = async () => {\n // Skip polling if user is editing or modal is closed\n if (!isPolling || !filename || isEditingRef.current) return;\n\n try {\n const response = await api.getConfigFileContent(filename);\n const newContent = response.data.data.content;\n const currentLastRead = lastReadContentRef.current;\n const currentEditorContent = jsonContentRef.current;\n \n // Only update if content changed and user is not editing\n if (newContent !== currentLastRead && newContent !== currentEditorContent && !isEditingRef.current) {\n setHasExternalChanges(true);\n setLastReadContent(newContent);\n lastReadContentRef.current = newContent;\n } else if (newContent === currentEditorContent) {\n setHasExternalChanges(false);\n setLastReadContent(newContent);\n lastReadContentRef.current = newContent;\n } else if (!isEditingRef.current) {\n setLastReadContent(newContent);\n lastReadContentRef.current = newContent;\n }\n } catch (error) {\n console.warn('Failed to poll config file content:', error);\n }\n };\n\n // Initial poll\n pollFileContent();\n // Poll every 5 seconds (reduced from 2 seconds) and only when not editing\n intervalId = setInterval(() => {\n if (!isEditingRef.current) {\n pollFileContent();\n }\n }, 5000);\n\n return () => {\n isPolling = false;\n if (intervalId) {\n clearInterval(intervalId);\n }\n };\n }, [visible, filename, isEditing]);\n\n // Sync refs\n useEffect(() => {\n lastReadContentRef.current = lastReadContent;\n }, [lastReadContent]);\n\n useEffect(() => {\n jsonContentRef.current = jsonContent;\n }, [jsonContent]);\n\n // Sync isEditing ref\n useEffect(() => {\n isEditingRef.current = isEditing;\n }, [isEditing]);\n\n const loadFileContent = async () => {\n try {\n setJsonEditorLoading(true);\n const response = await api.getConfigFileContent(filename);\n const content = response.data.data.content;\n setJsonContent(content);\n setLastReadContent(content);\n lastReadContentRef.current = content;\n jsonContentRef.current = content;\n setHasExternalChanges(false);\n } catch (error) {\n const { message: errorMessage } = extractErrorInfo(error);\n const errorMsg = error instanceof Error ? error.message : undefined;\n message.error(\n `${t('config.configFileReadFailed')}: ${errorMessage || errorMsg || t('config.unknownError')}`\n );\n } finally {\n setJsonEditorLoading(false);\n }\n };\n\n const handleRefresh = async () => {\n await loadFileContent();\n message.success(t('config.jsonEditorRefreshed'));\n };\n\n const handleSave = async () => {\n if (!filename) return;\n \n try {\n setJsonEditorLoading(true);\n \n // Validate JSON first\n try {\n JSON.parse(jsonContent);\n } catch (error) {\n message.error(t('config.jsonFormatError'));\n return;\n }\n \n await api.updateConfigFileContent(filename, jsonContent);\n message.success(t('config.configSaved'));\n \n // Update last read content\n setLastReadContent(jsonContent);\n lastReadContentRef.current = jsonContent;\n jsonContentRef.current = jsonContent;\n setHasExternalChanges(false);\n setIsEditing(false);\n isEditingRef.current = false;\n \n // Refresh config data\n await queryClient.invalidateQueries({ queryKey: QUERY_KEYS.CONFIG });\n await queryClient.invalidateQueries({ queryKey: QUERY_KEYS.CONFIG_FILES });\n refetchConfigFiles();\n \n // If this is the active config, reload the page\n const currentFile = configFiles?.find(\n (f) => f.filename === filename && f.isActive\n );\n if (currentFile) {\n if (onConfigFileSwitch) {\n onConfigFileSwitch();\n } else {\n setTimeout(() => {\n window.location.reload();\n }, 1000);\n }\n } else {\n onClose();\n }\n } catch (error) {\n const { errorCode, message: errorMessage, details } = extractErrorInfo(error);\n if (errorCode === 'CONFIG_INVALID' && details && Array.isArray(details)) {\n const errorMessages = details.map((err: unknown) => {\n if (typeof err === 'object' && err !== null && 'code' in err) {\n const errObj = err as { code: string; params?: Record<string, unknown> };\n return translateErrorCode(errObj.code, t, errObj.params);\n }\n return String(err);\n });\n message.error(`${translateErrorCode(errorCode, t)}: ${errorMessages.join(', ')}`);\n } else {\n message.error(errorMessage || t('config.configSaveFailed'));\n }\n } finally {\n setJsonEditorLoading(false);\n }\n };\n\n const handleFormat = () => {\n try {\n const parsed = JSON.parse(jsonContent);\n const formatted = JSON.stringify(parsed, null, 2);\n setJsonContent(formatted);\n message.success(t('config.jsonFormatted'));\n } catch (error) {\n message.error(t('config.jsonFormatError'));\n }\n };\n\n return (\n <Modal\n title={\n <Space>\n {t('config.editJson')}\n <span style={{ color: '#999', fontSize: 14 }}>({filename})</span>\n </Space>\n }\n open={visible}\n onCancel={onClose}\n width={900}\n footer={[\n <Button key=\"format\" onClick={handleFormat}>\n {t('config.formatJson')}\n </Button>,\n <Button key=\"cancel\" onClick={onClose}>\n {t('common.cancel')}\n </Button>,\n <Button\n key=\"save\"\n type=\"primary\"\n icon={<SaveOutlined />}\n loading={jsonEditorLoading}\n onClick={handleSave}\n >\n {t('config.saveConfig')}\n </Button>,\n ]}\n >\n <Spin spinning={jsonEditorLoading && !jsonContent}>\n {hasExternalChanges && (\n <Alert\n message={t('config.jsonEditorExternalChanges')}\n description={t('config.jsonEditorExternalChangesDesc')}\n type=\"warning\"\n showIcon\n style={{ marginBottom: 16 }}\n action={\n <Button size=\"small\" onClick={handleRefresh}>\n {t('config.refresh')}\n </Button>\n }\n />\n )}\n <CodeEditor\n value={jsonContent}\n onChange={(value) => {\n setJsonContent(value);\n setIsEditing(true);\n isEditingRef.current = true;\n if (hasExternalChanges && value !== lastReadContent) {\n setHasExternalChanges(false);\n }\n }}\n language=\"json\"\n minHeight={400}\n maxHeight={600}\n placeholder={t('config.jsonEditorPlaceholder')}\n />\n <Alert\n message={t('config.jsonEditorWarning')}\n type=\"warning\"\n showIcon\n style={{ marginTop: 16 }}\n />\n </Spin>\n </Modal>\n );\n};\n\n","import React, { useState } from 'react';\nimport { Card, Table, Button, Space, Tag, Typography, Alert, Popconfirm, message } from 'antd';\nimport { EditOutlined, PlayCircleOutlined, DeleteOutlined, ReloadOutlined } from '@ant-design/icons';\nimport { useTranslation } from 'react-i18next';\nimport { useConfigFiles } from '../../../hooks/useConfig';\nimport { useErrorHandler } from '../../../hooks/useErrorHandler';\nimport { extractErrorInfo } from '../../../utils/errorCodeTranslator';\nimport { ConfigJsonEditor } from './ConfigJsonEditor';\n\nconst { Text } = Typography;\n\ninterface ConfigFile {\n filename: string;\n path: string;\n pathRelative: string;\n modifiedTime: string;\n size: number;\n isActive: boolean;\n}\n\ninterface ConfigFilesManagerProps {\n onConfigFileSwitch?: () => void;\n onJsonEditorOpen?: (filename: string) => void;\n}\n\nexport const ConfigFilesManager: React.FC<ConfigFilesManagerProps> = ({\n onConfigFileSwitch,\n onJsonEditorOpen,\n}) => {\n const { t } = useTranslation();\n const { configFiles, isLoading, refetch, switchFileAsync, deleteFileAsync } = useConfigFiles();\n const { handleError } = useErrorHandler();\n const [jsonEditorVisible, setJsonEditorVisible] = useState(false);\n const [editingConfigFile, setEditingConfigFile] = useState<string | null>(null);\n\n const handleEditJson = async (filename: string) => {\n if (onJsonEditorOpen) {\n onJsonEditorOpen(filename);\n return;\n }\n\n try {\n setEditingConfigFile(filename);\n setJsonEditorVisible(true);\n } catch (error: unknown) {\n const { message: errorMessage } = extractErrorInfo(error);\n const errorObj = error instanceof Error ? error : null;\n message.error(\n `${t('config.configFileReadFailed')}: ${errorMessage || errorObj?.message || t('config.unknownError')}`\n );\n }\n };\n\n const handleSwitchFile = async (file: ConfigFile) => {\n if (file.isActive) return;\n\n try {\n await switchFileAsync(file.path);\n message.success(t('config.configSwitched'));\n if (onConfigFileSwitch) {\n onConfigFileSwitch();\n }\n } catch (error: unknown) {\n handleError(error);\n }\n };\n\n const handleDeleteFile = async (filename: string) => {\n try {\n await deleteFileAsync(filename);\n message.success(t('config.configFileDeleted'));\n refetch();\n } catch (error: unknown) {\n handleError(error);\n }\n };\n\n const columns = [\n {\n title: t('config.fileName'),\n dataIndex: 'filename',\n key: 'filename',\n render: (filename: string, record: ConfigFile) => (\n <Space>\n <Text strong={record.isActive}>{filename}</Text>\n {record.isActive && <Tag color=\"green\">{t('config.activeConfig')}</Tag>}\n </Space>\n ),\n },\n {\n title: t('config.filePath'),\n dataIndex: 'pathRelative',\n key: 'pathRelative',\n render: (path: string) => <Text type=\"secondary\" style={{ fontSize: 12 }}>{path}</Text>,\n },\n {\n title: t('config.fileModified'),\n dataIndex: 'modifiedTime',\n key: 'modifiedTime',\n render: (date: string) => new Date(date).toLocaleString(),\n },\n {\n title: t('config.fileSize'),\n dataIndex: 'size',\n key: 'size',\n render: (size: number) => `${(size / 1024).toFixed(2)} KB`,\n },\n {\n title: t('common.actions'),\n key: 'action',\n width: 250,\n render: (_: unknown, record: ConfigFile) => (\n <Space>\n <Button\n type=\"link\"\n icon={<EditOutlined />}\n onClick={() => handleEditJson(record.filename)}\n size=\"small\"\n >\n {t('config.editJson')}\n </Button>\n {!record.isActive && (\n <Button\n type=\"link\"\n icon={<PlayCircleOutlined />}\n onClick={() => handleSwitchFile(record)}\n size=\"small\"\n >\n {t('config.switch')}\n </Button>\n )}\n <Popconfirm\n title={t('config.deleteConfigFileConfirm')}\n onConfirm={() => handleDeleteFile(record.filename)}\n okText={t('common.ok')}\n cancelText={t('common.cancel')}\n >\n <Button\n type=\"link\"\n danger\n icon={<DeleteOutlined />}\n size=\"small\"\n >\n {t('common.delete')}\n </Button>\n </Popconfirm>\n </Space>\n ),\n },\n ];\n\n return (\n <>\n <Card\n title={t('config.configFiles')}\n extra={\n <Button icon={<ReloadOutlined />} onClick={() => refetch()}>\n {t('common.refresh')}\n </Button>\n }\n >\n {configFiles && configFiles.length > 0 ? (\n <Table\n columns={columns}\n dataSource={configFiles}\n rowKey=\"filename\"\n loading={isLoading}\n pagination={{ pageSize: 10 }}\n locale={{ emptyText: t('config.configFilesEmpty') }}\n />\n ) : (\n <Alert\n message={t('config.configFilesEmpty')}\n description={t('config.configFilesEmptyDesc')}\n type=\"info\"\n showIcon\n />\n )}\n </Card>\n\n {jsonEditorVisible && editingConfigFile && (\n <ConfigJsonEditor\n visible={jsonEditorVisible}\n filename={editingConfigFile}\n onClose={() => {\n setJsonEditorVisible(false);\n setEditingConfigFile(null);\n }}\n onConfigFileSwitch={onConfigFileSwitch}\n />\n )}\n </>\n );\n};\n\n","import React from 'react';\nimport { Card, Table, Button, Space, Tag, Typography, Alert, Popconfirm } from 'antd';\nimport { PlayCircleOutlined, DeleteOutlined, ReloadOutlined } from '@ant-design/icons';\nimport { useTranslation } from 'react-i18next';\nimport { useConfigHistory } from '../../../hooks/useConfig';\nimport { useErrorHandler } from '../../../hooks/useErrorHandler';\nimport { message } from 'antd';\n\nconst { Text } = Typography;\n\ninterface ConfigHistoryItem {\n id: number;\n name: string;\n description: string | null;\n created_at: string;\n updated_at: string;\n is_active: number;\n}\n\ninterface ConfigHistoryManagerProps {\n onConfigApplied?: () => void;\n}\n\nexport const ConfigHistoryManager: React.FC<ConfigHistoryManagerProps> = ({\n onConfigApplied,\n}) => {\n const { t } = useTranslation();\n const { history, isLoading, refetch, applyAsync, deleteAsync } = useConfigHistory();\n const { handleError } = useErrorHandler();\n\n const handleApply = async (id: number) => {\n try {\n await applyAsync(id);\n message.success(t('config.configApplied'));\n if (onConfigApplied) {\n onConfigApplied();\n }\n } catch (error: unknown) {\n handleError(error);\n }\n };\n\n const handleDelete = async (id: number) => {\n try {\n await deleteAsync(id);\n message.success(t('config.historyDeleted'));\n refetch();\n } catch (error: unknown) {\n handleError(error);\n }\n };\n\n const columns = [\n {\n title: t('config.historyName'),\n dataIndex: 'name',\n key: 'name',\n render: (name: string, record: ConfigHistoryItem) => (\n <Space>\n <Text strong={record.is_active === 1}>{name}</Text>\n {record.is_active === 1 && (\n <Tag color=\"green\">{t('config.activeConfig')}</Tag>\n )}\n </Space>\n ),\n },\n {\n title: t('config.historyDescription'),\n dataIndex: 'description',\n key: 'description',\n render: (desc: string | null) => desc || <Text type=\"secondary\">-</Text>,\n },\n {\n title: t('config.historyCreatedAt'),\n dataIndex: 'created_at',\n key: 'created_at',\n render: (date: string) => new Date(date).toLocaleString(),\n },\n {\n title: t('config.historyUpdatedAt'),\n dataIndex: 'updated_at',\n key: 'updated_at',\n render: (date: string) => new Date(date).toLocaleString(),\n },\n {\n title: t('common.actions'),\n key: 'action',\n width: 200,\n render: (_: unknown, record: ConfigHistoryItem) => (\n <Space>\n <Button\n type=\"link\"\n icon={<PlayCircleOutlined />}\n onClick={() => handleApply(record.id)}\n size=\"small\"\n >\n {t('config.apply')}\n </Button>\n <Popconfirm\n title={t('config.deleteHistoryConfirm')}\n onConfirm={() => handleDelete(record.id)}\n okText={t('common.ok')}\n cancelText={t('common.cancel')}\n >\n <Button\n type=\"link\"\n danger\n icon={<DeleteOutlined />}\n size=\"small\"\n >\n {t('common.delete')}\n </Button>\n </Popconfirm>\n </Space>\n ),\n },\n ];\n\n return (\n <Card\n title={t('config.configHistory')}\n extra={\n <Button icon={<ReloadOutlined />} onClick={() => refetch()}>\n {t('common.refresh')}\n </Button>\n }\n >\n {history && history.length > 0 ? (\n <Table\n columns={columns}\n dataSource={history}\n rowKey=\"id\"\n loading={isLoading}\n pagination={{ pageSize: 10 }}\n locale={{ emptyText: t('config.historyEmpty') }}\n />\n ) : (\n <Alert\n message={t('config.historyEmpty')}\n description={t('config.historyEmptyDesc')}\n type=\"info\"\n showIcon\n />\n )}\n </Card>\n );\n};\n\n","import { useMemo } from 'react';\nimport type { FormInstance } from 'antd';\nimport type { TabsProps } from 'antd';\nimport { Typography } from 'antd';\nimport {\n FileTextOutlined,\n HistoryOutlined,\n} from '@ant-design/icons';\nimport { useTranslation } from 'react-i18next';\nimport { BasicConfigForm } from '../BasicConfigForm';\nimport { NetworkConfigForm } from '../NetworkConfigForm';\nimport { StorageConfigForm } from '../StorageConfigForm';\nimport { SchedulerConfigForm } from '../SchedulerConfigForm';\nimport { DownloadConfigForm } from '../DownloadConfigForm';\nimport { TargetsConfigForm } from '../TargetsConfigForm';\nimport { ConfigFilesManager } from '../ConfigFilesManager';\nimport { ConfigHistoryManager } from '../ConfigHistoryManager';\nimport type { ConfigFormValues } from '../../hooks';\n\nconst { Text } = Typography;\n\ninterface UseConfigTabItemsParams {\n form: FormInstance<ConfigFormValues>;\n onConfigFileSwitch: () => void;\n onJsonEditorOpen: (filename: string) => void;\n onConfigApplied: () => void;\n onTargetChange: () => void | Promise<void>;\n}\n\n/**\n * Hook that groups config tabs into form tabs and management tabs.\n */\nexport function useConfigTabItems({\n form,\n onConfigFileSwitch,\n onJsonEditorOpen,\n onConfigApplied,\n onTargetChange,\n}: UseConfigTabItemsParams) {\n const { t } = useTranslation();\n\n const managementTabItems = useMemo<TabsProps['items']>(() => [\n {\n key: 'files',\n label: (\n <>\n <FileTextOutlined /> {t('config.tabConfigFiles')}\n </>\n ),\n children: (\n <ConfigFilesManager\n onConfigFileSwitch={onConfigFileSwitch}\n onJsonEditorOpen={onJsonEditorOpen}\n />\n ),\n },\n {\n key: 'history',\n label: (\n <>\n <HistoryOutlined /> {t('config.tabHistory')}\n </>\n ),\n children: (\n <ConfigHistoryManager\n onConfigApplied={onConfigApplied}\n />\n ),\n },\n ], [onConfigApplied, onConfigFileSwitch, onJsonEditorOpen, t]);\n\n const formTabItems = useMemo<TabsProps['items']>(() => [\n {\n key: 'basic',\n label: t('config.tabBasic'),\n children: <BasicConfigForm />,\n },\n {\n key: 'pixiv',\n label: t('config.tabPixiv'),\n children: (\n <div>\n <Text type=\"secondary\">\n {t('config.pixivCredentialsHidden')}\n </Text>\n </div>\n ),\n },\n {\n key: 'network',\n label: t('config.tabNetwork'),\n children: <NetworkConfigForm />,\n },\n {\n key: 'storage',\n label: t('config.tabStorage'),\n children: <StorageConfigForm />,\n },\n {\n key: 'scheduler',\n label: t('config.tabScheduler'),\n children: <SchedulerConfigForm />,\n },\n {\n key: 'download',\n label: t('config.tabDownload'),\n children: <DownloadConfigForm />,\n },\n {\n key: 'targets',\n label: t('config.tabTargets'),\n children: (\n <TargetsConfigForm\n form={form}\n onTargetChange={onTargetChange}\n />\n ),\n },\n ], [form, onTargetChange, t]);\n\n const tabItems = useMemo<TabsProps['items']>(() => [\n ...(managementTabItems || []),\n ...(formTabItems || []),\n ], [formTabItems, managementTabItems]);\n\n return {\n managementTabItems,\n formTabItems,\n tabItems,\n };\n}\n\n\n","import { Form, Tabs } from 'antd';\nimport type { FormInstance } from 'antd';\nimport { useConfigTabItems } from './hooks/useConfigTabItems';\nimport type { ConfigFormValues } from '../hooks';\n\ninterface ConfigTabsProps {\n form: FormInstance<ConfigFormValues>;\n activeTab: string;\n onTabChange: (key: string) => void;\n onConfigFileSwitch: () => void;\n onJsonEditorOpen: (filename: string) => void;\n onConfigApplied: () => void;\n onTargetChange: () => void | Promise<void>;\n}\n\n/**\n * ConfigTabs component - Tab navigation for configuration sections\n */\nexport function ConfigTabs({\n form,\n activeTab,\n onTabChange,\n onConfigFileSwitch,\n onJsonEditorOpen,\n onConfigApplied,\n onTargetChange,\n}: ConfigTabsProps) {\n const { tabItems } = useConfigTabItems({\n form,\n onConfigFileSwitch,\n onJsonEditorOpen,\n onConfigApplied,\n onTargetChange,\n });\n\n return (\n <Form form={form} layout=\"vertical\">\n <Tabs activeKey={activeTab} onChange={onTabChange} items={tabItems} />\n </Form>\n );\n}\n\n","import { Modal, Button, message } from 'antd';\nimport { CopyOutlined } from '@ant-design/icons';\nimport { useTranslation } from 'react-i18next';\nimport { CodeEditor } from '../../../components/common/CodeEditor';\n\ninterface ConfigPreviewModalProps {\n visible: boolean;\n configPreview: string;\n onClose: () => void;\n}\n\n/**\n * Config preview modal component\n */\nexport function ConfigPreviewModal({\n visible,\n configPreview,\n onClose,\n}: ConfigPreviewModalProps) {\n const { t } = useTranslation();\n\n const handleCopy = () => {\n navigator.clipboard.writeText(configPreview);\n message.success(t('config.configCopied'));\n };\n\n return (\n <Modal\n title={t('config.previewConfig')}\n open={visible}\n onCancel={onClose}\n footer={[\n <Button key=\"copy\" icon={<CopyOutlined />} onClick={handleCopy}>\n {t('common.copy')}\n </Button>,\n <Button key=\"close\" onClick={onClose}>\n {t('common.close')}\n </Button>,\n ]}\n width={800}\n >\n <CodeEditor\n value={configPreview}\n readOnly\n language=\"json\"\n minHeight={400}\n maxHeight={600}\n />\n </Modal>\n );\n}\n\n","import { useTranslation } from 'react-i18next';\nimport { useConfigFiles } from '../../hooks/useConfig';\nimport { useConfigForm, useConfigOperations, useConfigModals, useConfigTabs } from './hooks';\nimport { ConfigHeader } from './components/ConfigHeader';\nimport { ConfigActions } from './components/ConfigActions';\nimport { ConfigTabs } from './components/ConfigTabs';\nimport { ConfigPreviewModal } from './components/ConfigPreviewModal';\nimport { ConfigJsonEditor } from './components/ConfigJsonEditor';\nimport { LoadingSpinner } from '../../components/common/LoadingSpinner';\n\nexport default function Config() {\n const { t } = useTranslation();\n const { activeTab, setActiveTab } = useConfigTabs();\n const {\n previewVisible,\n jsonEditorVisible,\n editingConfigFile,\n openPreview,\n closePreview,\n openJsonEditor,\n closeJsonEditor,\n } = useConfigModals();\n\n const {\n form,\n config,\n isLoading,\n isUpdating,\n isValidating,\n handleSave,\n handleValidate,\n handleTargetChange,\n getConfigPreview,\n refreshConfig,\n } = useConfigForm();\n\n const {\n handleExportConfig,\n handleImportConfig,\n handleCopyConfig,\n handleConfigFileSwitch,\n handleConfigApplied,\n isImporting,\n } = useConfigOperations(config);\n\n const { configFiles, refetch: refetchConfigFiles } = useConfigFiles();\n\n\n if (isLoading) {\n return (\n <div style={{ display: 'flex', justifyContent: 'center', padding: '48px 0' }}>\n <LoadingSpinner />\n </div>\n );\n }\n\n const currentConfigPath =\n config?._meta?.configPathRelative ??\n config?._meta?.configPath ??\n t('config.unknown');\n\n return (\n <div>\n <div style={{ marginBottom: 16, width: '100%', display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', gap: 16, flexWrap: 'wrap' }}>\n <ConfigHeader\n currentConfigPath={currentConfigPath}\n configFiles={configFiles}\n onConfigFileSwitch={handleConfigFileSwitch}\n refetchConfigFiles={refetchConfigFiles}\n />\n <ConfigActions\n onRefresh={refreshConfig}\n onPreview={openPreview}\n onExport={handleExportConfig}\n onImport={handleImportConfig}\n onCopy={() => handleCopyConfig(getConfigPreview())}\n onValidate={handleValidate}\n onSave={handleSave}\n isValidating={isValidating}\n isUpdating={isUpdating}\n isImporting={isImporting}\n />\n </div>\n\n <ConfigTabs\n form={form}\n activeTab={activeTab}\n onTabChange={setActiveTab}\n onConfigFileSwitch={handleConfigFileSwitch}\n onJsonEditorOpen={openJsonEditor}\n onConfigApplied={handleConfigApplied}\n onTargetChange={handleTargetChange}\n />\n\n {/* Config Preview Modal */}\n <ConfigPreviewModal\n visible={previewVisible}\n configPreview={getConfigPreview()}\n onClose={closePreview}\n />\n\n {/* JSON Editor Modal - handled by ConfigFilesManager */}\n {jsonEditorVisible && editingConfigFile && (\n <ConfigJsonEditor\n visible={jsonEditorVisible}\n filename={editingConfigFile}\n onClose={closeJsonEditor}\n onConfigFileSwitch={handleConfigFileSwitch}\n />\n )}\n </div>\n );\n}\n\n"],"names":["UpOutlined","props","ref","AntdIcon","_extends","UpOutlinedSvg","RefIcon","React.forwardRef","supportBigInt","isEmpty","value","trimNumber","numStr","str","negative","trimStr","splitNumber","integerStr","decimalStr","negativeStr","isE","number","getNumberPrecision","precision","decimalMatch","validateNumber","num2str","num","BigIntDecimal","_classCallCheck","_defineProperty","mergedValue","trimRet","numbers","_createClass","decimalLength","clone","offset","calculator","calDecimalLen","maxDecimalLength","myAlignedDecimal","offsetAlignedDecimal","valueStr","nextDecimalLength","_trimNumber","hydrateValueStr","num1","num2","len","target","safe","NumberDecimal","maxPrecision","getMiniDecimal","toFixed","separatorStr","cutOnly","precisionDecimalStr","numberWithoutDecimal","advancedNum","advancedDecimal","proxyObject","obj","extendProps","prop","originProp","useCursor","input","focused","selectionRef","useRef","recordCursor","start","end","beforeTxt","afterTxt","restoreCursor","_selectionRef$current","startPos","beforeLastChar","newIndex","e","warning","useMobile","_useState","useState","_useState2","_slicedToArray","mobile","setMobile","useLayoutEffect","isMobile","STEP_INTERVAL","STEP_DELAY","StepHandler","_ref","prefixCls","upNode","downNode","upDisabled","downDisabled","onStep","stepTimeoutRef","React.useRef","frameIds","onStepRef","onStopStep","onStepMouseDown","up","loopStep","React.useEffect","id","raf","handlerClassName","upClassName","classNames","downClassName","safeOnStopStep","sharedHandlerProps","React.createElement","getDecupleSteps","step","stepStr","hasPoint","useFrame","idRef","cleanUp","useEffect","callback","_excluded","_excluded2","getDecimalValue","stringMode","decimalValue","getDecimalIfValidate","decimal","InternalInputNumber","className","style","min","max","_props$step","defaultValue","disabled","readOnly","upHandler","downHandler","keyboard","_props$changeOnWheel","changeOnWheel","_props$controls","controls","parser","formatter","decimalSeparator","onChange","onInput","onPressEnter","_props$changeOnBlur","changeOnBlur","domRef","inputProps","_objectWithoutProperties","inputClassName","inputRef","_React$useState","React.useState","_React$useState2","focus","setFocus","userTypingRef","compositionRef","shiftKeyRef","_React$useState3","_React$useState4","setDecimalValue","setUncontrolledDecimalValue","newDecimal","getPrecision","React.useCallback","userTyping","mergedParser","parsedStr","inputValueRef","mergedFormatter","mergedPrecision","_React$useState5","initValue","_typeof","_React$useState6","inputValue","setInternalInputValue","setInputValue","newValue","maxDecimal","React.useMemo","minDecimal","_useCursor","_useCursor2","getRangeValue","isInRange","triggerValueUpdate","updateValue","isRangeValidate","onNextPromise","collectInputValue","inputStr","finalValue","finalDecimal","nextInputStr","onCompositionStart","onCompositionEnd","onInternalInput","onInternalStep","_inputRef$current","stepDecimal","updatedValue","flushInputValue","parsedValue","formatValue","onBeforeInput","onKeyDown","event","key","shiftKey","onKeyUp","onWheel","onBlur","useLayoutUpdateEffect","currentParsedValue","clsx","composeRef","InputNumber","_props$prefixCls","prefix","suffix","addonBefore","addonAfter","rest","holderRef","inputNumberDomRef","inputFocusRef","option","triggerFocus","React.useImperativeHandle","BaseInput","prepareComponentToken","token","_a","handleVisible","handleWidth","initComponentToken","FastColor","genRadiusStyle","componentCls","borderRadiusSM","borderRadiusLG","size","borderRadius","genInputNumberStyles","lineWidth","lineType","inputFontSizeSM","inputFontSizeLG","controlHeightLG","controlHeightSM","colorError","paddingInlineSM","paddingBlockSM","paddingBlockLG","paddingInlineLG","colorIcon","motionDurationMid","handleHoverColor","handleOpacity","paddingInline","paddingBlock","handleBg","handleActiveBg","colorTextDisabled","controlWidth","handleBorderColor","filledHandleBg","lineHeightLG","calc","resetComponent","genBasicInputStyle","genOutlinedStyle","unit","genFilledStyle","genUnderlinedStyle","genBorderlessStyle","genInputGroupStyle","genOutlinedGroupStyle","genFilledGroupStyle","genPlaceholderStyle","resetIcon","genAffixWrapperStyles","inputAffixPadding","useStyle","genStyleHooks","inputNumberToken","mergeToken","initInputToken","genCompactItemStyle","__rest","s","t","p","getPrefixCls","direction","React.useContext","ConfigContext","rootClassName","customizeSize","customDisabled","customizePrefixCls","bordered","customStatus","customVariant","others","rootCls","useCSSVarCls","wrapCSSVar","hashId","cssVarCls","compactSize","compactItemClassnames","useCompactItemContext","upIcon","downIcon","DownOutlined","controlsTemp","hasFeedback","contextStatus","isFormItemInput","feedbackIcon","FormItemInputContext","mergedStatus","getMergedStatus","mergedSize","useSize","ctx","DisabledContext","mergedDisabled","variant","enableVariantCls","useVariant","suffixNode","React.Fragment","inputNumberClass","wrapperClassName","element","RcInputNumber","ContextIsolator","getStatusClassNames","TypedInputNumber","PureInputNumber","ConfigProvider","SaveOutlined","SaveOutlinedSvg","UploadOutlined","UploadOutlinedSvg","useConfigForm","useTranslation","queryClient","useQueryClient","form","Form","config","isLoading","updateAsync","validate","isUpdating","isValidating","useConfig","handleError","handleSuccess","useErrorHandler","formData","sanitizeConfigForForm","values","error","apiError","handleApiError","formattedMessage","formatConfigSaveError","payload","stripConfigMetadata","autoSaveFailedMessage","translateErrorCode","QUERY_KEYS","_meta","_validation","configWithoutMeta","data","errorMessages","detail","code","params","useLoadingState","initialState","loading","setLoading","loadingMessage","setLoadingMessage","progress","setProgress","messageKey","setMessageKey","startLoading","useCallback","msg","message","stopLoading","successMessage","updateProgress","updateMessage","useMemo","IMPORT_LOADING_KEY","useConfigOperations","refetchConfigFiles","useConfigFiles","handleWarning","isImporting","configExportPayload","handleExportConfig","jsonStr","blob","url","anchor","parseConfigFile","file","fileContent","resolve","reject","reader","parsed","normalized","handleImportConfig","files","successCount","failCount","failedFiles","lastImportedPath","configToImport","validationResult","configService","errorDetails","baseName","timestamp","importName","errorMessage","extractErrorInfo","handleCopyConfig","configJson","handleConfigFileSwitch","handleConfigApplied","useConfigModals","previewVisible","setPreviewVisible","jsonEditorVisible","setJsonEditorVisible","editingConfigFile","setEditingConfigFile","openPreview","closePreview","openJsonEditor","filename","closeJsonEditor","useConfigTabs","activeTab","setActiveTab","handleTabChange","tab","Title","Text","Typography","Option","Select","ConfigHeader","currentConfigPath","configFiles","onConfigFileSwitch","activeConfigFile","f","handleConfigFileChange","api","jsxs","jsx","Space","Tag","ConfigActions","onRefresh","onPreview","onExport","onImport","onCopy","onValidate","onSave","authenticated","useAuth","requiresAuth","loginTip","Button","ReloadOutlined","FileTextOutlined","DownloadOutlined","Tooltip","CopyOutlined","CheckCircleOutlined","Panel","Collapse","FormSection","title","description","children","collapsible","defaultCollapsed","card","extra","Card","BasicConfigForm","QuestionCircleOutlined","NetworkConfigForm","Divider","Switch","prevValues","currentValues","getFieldValue","Fragment","Input","OptGroup","StorageConfigForm","SchedulerConfigForm","DownloadConfigForm","Step","Steps","Paragraph","TargetModal","visible","editingTarget","onCancel","targetStep","setTargetStep","configTemplates","handleApplyTemplate","template","handleOk","handleCancel","Modal","ThunderboltOutlined","_","TargetsInfoAlert","Alert","TargetsTable","targets","onAdd","onEdit","onDelete","columns","type","mode","record","rankingLabels","index","EditOutlined","Popconfirm","DeleteOutlined","Table","TargetsConfigForm","onTargetChange","targetModalVisible","setTargetModalVisible","setEditingTarget","currentTargets","notifyTargetChange","handleAddTarget","handleEditTarget","handleDeleteTarget","nextTargets","_target","idx","handleSaveTarget","handleModalClose","targetsWithMetadata","CodeEditor","language","placeholder","minHeight","maxHeight","showCopyButton","textareaRef","copied","setCopied","handleChange","handleCopy","handlePaste","pastedText","formatted","editorStyle","CheckOutlined","ConfigJsonEditor","onClose","jsonContent","setJsonContent","jsonEditorLoading","setJsonEditorLoading","lastReadContent","setLastReadContent","hasExternalChanges","setHasExternalChanges","isEditing","setIsEditing","lastReadContentRef","jsonContentRef","isEditingRef","loadFileContent","intervalId","isPolling","pollFileContent","newContent","currentLastRead","currentEditorContent","content","errorMsg","handleRefresh","handleSave","errorCode","details","err","errObj","handleFormat","Spin","ConfigFilesManager","onJsonEditorOpen","refetch","switchFileAsync","deleteFileAsync","handleEditJson","errorObj","handleSwitchFile","handleDeleteFile","path","date","PlayCircleOutlined","ConfigHistoryManager","onConfigApplied","history","applyAsync","deleteAsync","useConfigHistory","handleApply","handleDelete","name","desc","useConfigTabItems","managementTabItems","HistoryOutlined","formTabItems","tabItems","ConfigTabs","onTabChange","Tabs","ConfigPreviewModal","configPreview","Config","handleValidate","handleTargetChange","getConfigPreview","refreshConfig","LoadingSpinner"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]}
|