@canvas-components/react-components 0.3.17 → 0.3.19
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/index.cjs +282 -172
- package/dist/index.d.cts +76 -57
- package/dist/index.d.ts +76 -57
- package/dist/index.js +283 -174
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -738,7 +738,7 @@ var ReactVirtualList = React.forwardRef(function ReactVirtualListInner(props, re
|
|
|
738
738
|
});
|
|
739
739
|
|
|
740
740
|
// src/components/select/style.css
|
|
741
|
-
styleInject('@import "../../styles/variables.css";\n.canvas-react-select-wrap {\n position: relative;\n display: inline-flex;\n width: 100%;\n height: 100%;\n}\n.canvas-react-select {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n width: 100%;\n min-width: 0;\n height: var(--canvas-react-control-height);\n padding: var(--canvas-react-control-padding-block, 0px) var(--canvas-react-control-padding-inline, 11px);\n border: 1px solid var(--canvas-react-color-border);\n border-radius: var(--canvas-react-radius-sm);\n background: var(--canvas-react-color-bg);\n color: var(--canvas-react-color-text);\n font-size: var(--canvas-react-font-size);\n outline: none;\n cursor: pointer;\n transition:\n border-color 0.2s ease,\n box-shadow 0.2s ease,\n background-color 0.2s ease;\n}\n.canvas-react-select-input-wrap {\n flex: 1 1 auto;\n width: 100%;\n height: 100%;\n border: none;\n background: transparent;\n box-shadow: none;\n}\n.canvas-react-select .canvas-react-input-affix-wrapper {\n height: 100%;\n min-height: 0;\n}\n.canvas-react-select-input-wrap:hover,\n.canvas-react-select-input-wrap:focus-within {\n border-color: transparent;\n box-shadow: none;\n}\n.canvas-react-select-input {\n width: 100%;\n min-width: 0;\n height: 100%;\n padding: 0;\n line-height: normal;\n}\n.canvas-react-select-input::placeholder {\n color: #9ca3af;\n}\n.canvas-react-select:hover {\n border-color: var(--canvas-react-color-primary-hover);\n}\n.canvas-react-select:focus,\n.canvas-react-select:focus-within {\n border-color: var(--canvas-react-color-primary);\n box-shadow: var(--canvas-react-shadow-focus);\n}\n.canvas-react-select-open {\n border-color: var(--canvas-react-color-primary);\n box-shadow: var(--canvas-react-shadow-focus);\n}\n.canvas-react-select-disabled {\n color: #9ca3af;\n background: #fafafa;\n cursor: not-allowed;\n}\n.canvas-react-select-actions {\n position: relative;\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: 1em;\n min-width: 12px;\n height: 1em;\n min-height: 12px;\n margin-left: max(6px, calc(var(--canvas-react-control-padding-inline, 11px) * 0.5));\n}\n.canvas-react-select-arrow {\n pointer-events: none;\n position: absolute;\n top: 50%;\n left: 50%;\n width: 0.5em;\n height: 0.5em;\n min-width: 6px;\n min-height: 6px;\n border-right: 1.5px solid var(--canvas-react-color-text-muted);\n border-bottom: 1.5px solid var(--canvas-react-color-text-muted);\n transform: translate(-50%, -58%) rotate(45deg);\n opacity: 1;\n transition:\n opacity 0.18s ease,\n transform 0.18s ease,\n border-color 0.18s ease;\n}\n.canvas-react-select:hover .canvas-react-select-arrow,\n.canvas-react-select-open .canvas-react-select-arrow {\n border-color: #6b7280;\n}\n.canvas-react-select-arrow-open {\n border-color: #6b7280;\n transform: translate(-50%, -42%) rotate(225deg);\n}\n.canvas-react-select-clear {\n position: absolute;\n top: 50%;\n left: 50%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 12px;\n height: 12px;\n padding: 0;\n border: none;\n background: transparent;\n color: #9ca3af;\n opacity: 0;\n pointer-events: none;\n cursor: pointer;\n transform: translate(-50%, -50%) rotate(0deg);\n transition:\n color 0.2s ease,\n opacity 0.2s ease,\n transform 0.18s ease;\n}\n.canvas-react-select-clear:hover {\n color: #6b7280;\n transform: translate(-50%, -50%) rotate(90deg);\n}\n.canvas-react-select:hover .canvas-react-select-clear,\n.canvas-react-select-open .canvas-react-select-clear,\n.canvas-react-select:focus-within .canvas-react-select-clear,\n.canvas-react-cascader:hover .canvas-react-select-clear,\n.canvas-react-cascader-open .canvas-react-select-clear,\n.canvas-react-cascader:focus-within .canvas-react-select-clear {\n opacity: 1;\n pointer-events: auto;\n}\n.canvas-react-select:hover .canvas-react-select-actions-clearable .canvas-react-select-arrow,\n.canvas-react-select-open .canvas-react-select-actions-clearable .canvas-react-select-arrow,\n.canvas-react-select:focus-within .canvas-react-select-actions-clearable .canvas-react-select-arrow,\n.canvas-react-cascader:hover .canvas-react-select-actions-clearable .canvas-react-select-arrow,\n.canvas-react-cascader-open .canvas-react-select-actions-clearable .canvas-react-select-arrow,\n.canvas-react-cascader:focus-within .canvas-react-select-actions-clearable .canvas-react-select-arrow {\n opacity: 0;\n}\n.canvas-react-select-clear-icon,\n.canvas-react-select-clear-icon::before {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 8px;\n height: 1.25px;\n margin-top: -0.625px;\n margin-left: -4px;\n border-radius: 999px;\n background: currentColor;\n content: "";\n}\n.canvas-react-select-clear-icon {\n transform: rotate(45deg);\n}\n.canvas-react-select-clear-icon::before {\n transform: rotate(90deg);\n}\n.canvas-react-select-dropdown {\n padding: 4px;\n}\n.canvas-react-select-list {\n position: relative;\n overflow-y: auto;\n}\n.canvas-react-select-list-inner {\n position: relative;\n}\n.canvas-react-select-option {\n display: flex;\n align-items: center;\n box-sizing: border-box;\n width: 100%;\n padding: 0 11px;\n border-radius: var(--canvas-react-radius-sm);\n color: var(--canvas-react-color-text);\n font-size: var(--canvas-react-font-size);\n cursor: pointer;\n}\n.canvas-react-select-option:hover,\n.canvas-react-select-option-active {\n background: var(--canvas-react-color-bg-hover);\n}\n.canvas-react-select-option-selected {\n background: var(--canvas-react-color-bg-active);\n}\n.canvas-react-select-option-searching {\n color: var(--canvas-react-color-text);\n}\n.canvas-react-select-option-searching:hover,\n.canvas-react-select-option-searching.canvas-react-select-option-active {\n background: var(--canvas-react-color-bg-active);\n}\n.canvas-react-select-option-disabled {\n color: #9ca3af;\n cursor: not-allowed;\n}\n.canvas-react-select-option-highlight {\n color: var(--canvas-react-color-primary);\n font-weight: 600;\n}\n.canvas-react-select-option-disabled .canvas-react-select-option-highlight {\n color: inherit;\n}\n.canvas-react-select-empty {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 0 11px;\n color: #9ca3af;\n font-size: var(--canvas-react-font-size);\n}\n');
|
|
741
|
+
styleInject('@import "../../styles/variables.css";\n.canvas-react-select-wrap {\n position: relative;\n display: inline-flex;\n width: 100%;\n height: 100%;\n}\n.canvas-react-select {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n width: 100%;\n min-width: 0;\n height: var(--canvas-react-control-height);\n padding: var(--canvas-react-control-padding-block, 0px) var(--canvas-react-control-padding-inline, 11px);\n border: 1px solid var(--canvas-react-color-border);\n border-radius: var(--canvas-react-radius-sm);\n background: var(--canvas-react-color-bg);\n color: var(--canvas-react-color-text);\n font-size: var(--canvas-react-font-size);\n outline: none;\n cursor: pointer;\n transition:\n border-color 0.2s ease,\n box-shadow 0.2s ease,\n background-color 0.2s ease;\n}\n.canvas-react-select-input-wrap {\n flex: 1 1 auto;\n width: 100%;\n height: 100%;\n border: none;\n background: transparent;\n box-shadow: none;\n}\n.canvas-react-select .canvas-react-input-affix-wrapper {\n height: 100%;\n min-height: 0;\n}\n.canvas-react-select-input-wrap:hover,\n.canvas-react-select-input-wrap:focus-within {\n border-color: transparent;\n box-shadow: none;\n}\n.canvas-react-select-input {\n width: 100%;\n min-width: 0;\n height: 100%;\n padding: 0;\n line-height: normal;\n}\n.canvas-react-select-input::placeholder {\n color: #9ca3af;\n}\n.canvas-react-select:hover {\n border-color: var(--canvas-react-color-primary-hover);\n}\n.canvas-react-select:focus,\n.canvas-react-select:focus-within {\n border-color: var(--canvas-react-color-primary);\n box-shadow: var(--canvas-react-shadow-focus);\n}\n.canvas-react-select-open {\n border-color: var(--canvas-react-color-primary);\n box-shadow: var(--canvas-react-shadow-focus);\n}\n.canvas-react-select-disabled {\n color: #9ca3af;\n background: #fafafa;\n cursor: not-allowed;\n}\n.canvas-react-select-actions {\n position: relative;\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: 1em;\n min-width: 12px;\n height: 1em;\n min-height: 12px;\n margin-left: max(6px, calc(var(--canvas-react-control-padding-inline, 11px) * 0.5));\n}\n.canvas-react-select-arrow {\n pointer-events: none;\n position: absolute;\n top: 50%;\n left: 50%;\n width: 0.5em;\n height: 0.5em;\n min-width: 6px;\n min-height: 6px;\n border-right: 1.5px solid var(--canvas-react-color-text-muted);\n border-bottom: 1.5px solid var(--canvas-react-color-text-muted);\n transform: translate(-50%, -58%) rotate(45deg);\n opacity: 1;\n transition:\n opacity 0.18s ease,\n transform 0.18s ease,\n border-color 0.18s ease;\n}\n.canvas-react-select:hover .canvas-react-select-arrow,\n.canvas-react-select-open .canvas-react-select-arrow {\n border-color: #6b7280;\n}\n.canvas-react-select-arrow-open {\n border-color: #6b7280;\n transform: translate(-50%, -42%) rotate(225deg);\n}\n.canvas-react-select-clear {\n position: absolute;\n top: 50%;\n left: 50%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 12px;\n height: 12px;\n padding: 0;\n border: none;\n background: transparent;\n color: #9ca3af;\n opacity: 0;\n pointer-events: none;\n cursor: pointer;\n transform: translate(-50%, -50%) rotate(0deg);\n transition:\n color 0.2s ease,\n opacity 0.2s ease,\n transform 0.18s ease;\n}\n.canvas-react-select-clear:hover {\n color: #6b7280;\n transform: translate(-50%, -50%) rotate(90deg);\n}\n.canvas-react-select:hover .canvas-react-select-clear,\n.canvas-react-select-open .canvas-react-select-clear,\n.canvas-react-select:focus-within .canvas-react-select-clear,\n.canvas-react-cascader:hover .canvas-react-select-clear,\n.canvas-react-cascader-open .canvas-react-select-clear,\n.canvas-react-cascader:focus-within .canvas-react-select-clear {\n opacity: 1;\n pointer-events: auto;\n}\n.canvas-react-select:hover .canvas-react-select-actions-clearable .canvas-react-select-arrow,\n.canvas-react-select-open .canvas-react-select-actions-clearable .canvas-react-select-arrow,\n.canvas-react-select:focus-within .canvas-react-select-actions-clearable .canvas-react-select-arrow,\n.canvas-react-cascader:hover .canvas-react-select-actions-clearable .canvas-react-select-arrow,\n.canvas-react-cascader-open .canvas-react-select-actions-clearable .canvas-react-select-arrow,\n.canvas-react-cascader:focus-within .canvas-react-select-actions-clearable .canvas-react-select-arrow {\n opacity: 0;\n}\n.canvas-react-select-clear-icon,\n.canvas-react-select-clear-icon::before {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 8px;\n height: 1.25px;\n margin-top: -0.625px;\n margin-left: -4px;\n border-radius: 999px;\n background: currentColor;\n content: "";\n}\n.canvas-react-select-clear-icon {\n transform: rotate(45deg);\n}\n.canvas-react-select-clear-icon::before {\n transform: rotate(90deg);\n}\n.canvas-react-select-dropdown {\n padding: 4px;\n}\n.canvas-react-select-list {\n position: relative;\n overflow-y: auto;\n}\n.canvas-react-select-list-inner {\n position: relative;\n}\n.canvas-react-select-option {\n display: flex;\n align-items: center;\n box-sizing: border-box;\n width: 100%;\n padding: 0 11px;\n border-radius: var(--canvas-react-radius-sm);\n color: var(--canvas-react-color-text);\n font-size: var(--canvas-react-font-size);\n cursor: pointer;\n}\n.canvas-react-select-option:hover,\n.canvas-react-select-option-active {\n background: var(--canvas-react-color-bg-hover);\n}\n.canvas-react-select-option-label {\n display: block;\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.canvas-react-select-option-selected {\n background: var(--canvas-react-color-bg-active);\n}\n.canvas-react-select-option-searching {\n color: var(--canvas-react-color-text);\n}\n.canvas-react-select-option-searching:hover,\n.canvas-react-select-option-searching.canvas-react-select-option-active {\n background: var(--canvas-react-color-bg-active);\n}\n.canvas-react-select-option-disabled {\n color: #9ca3af;\n cursor: not-allowed;\n}\n.canvas-react-select-option-highlight {\n color: var(--canvas-react-color-primary);\n font-weight: 600;\n}\n.canvas-react-select-option-disabled .canvas-react-select-option-highlight {\n color: inherit;\n}\n.canvas-react-select-empty {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 0 11px;\n color: #9ca3af;\n font-size: var(--canvas-react-font-size);\n}\n');
|
|
742
742
|
var ReactSelect = React.forwardRef(
|
|
743
743
|
function ReactSelect2(props, ref) {
|
|
744
744
|
const {
|
|
@@ -1062,9 +1062,16 @@ var ReactSelect = React.forwardRef(
|
|
|
1062
1062
|
}
|
|
1063
1063
|
selectOption(option, "mouse");
|
|
1064
1064
|
},
|
|
1065
|
-
children:
|
|
1066
|
-
|
|
1067
|
-
|
|
1065
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1066
|
+
"span",
|
|
1067
|
+
{
|
|
1068
|
+
className: `${REACT_COMPONENT_PREFIX}-select-option-label`,
|
|
1069
|
+
title: option.label,
|
|
1070
|
+
children: renderSelectOptionLabel(
|
|
1071
|
+
option.label,
|
|
1072
|
+
showSearch ? searchKeyword : ""
|
|
1073
|
+
)
|
|
1074
|
+
}
|
|
1068
1075
|
)
|
|
1069
1076
|
},
|
|
1070
1077
|
String(option.value)
|
|
@@ -1511,6 +1518,275 @@ function actionStyle(primary) {
|
|
|
1511
1518
|
return { minWidth: 72, height: 32, padding: "0 12px", borderRadius: 6, border: primary ? "1px solid #1677ff" : "1px solid #d9d9d9", background: primary ? "#1677ff" : "#fff", color: primary ? "#fff" : "#374151", cursor: "pointer" };
|
|
1512
1519
|
}
|
|
1513
1520
|
|
|
1521
|
+
// src/components/form/style.css
|
|
1522
|
+
styleInject(".canvas-react-form {\n min-width: 0;\n}\n.canvas-react-form-vertical {\n display: grid;\n gap: 16px;\n}\n.canvas-react-form-horizontal {\n display: grid;\n gap: 12px;\n}\n.canvas-react-form-inline {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n gap: 12px 16px;\n}\n.canvas-react-form-item {\n box-sizing: border-box;\n min-width: 0;\n}\n.canvas-react-form-item-vertical {\n display: grid;\n gap: 6px;\n}\n.canvas-react-form-item-horizontal {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr);\n align-items: center;\n column-gap: 10px;\n row-gap: 4px;\n}\n.canvas-react-form-item-inline {\n display: inline-grid;\n grid-template-columns: auto minmax(0, 1fr);\n align-items: center;\n column-gap: 8px;\n}\n.canvas-react-form-item-no-wrap {\n flex-wrap: nowrap;\n}\n.canvas-react-form-item-horizontal.canvas-react-form-item-no-wrap {\n display: grid;\n grid-template-columns: max-content minmax(0, 1fr);\n}\n.canvas-react-form-horizontal > .canvas-react-form-item {\n margin-bottom: var(--canvas-react-form-item-spacing, 16px);\n}\n.canvas-react-form-item-inline.canvas-react-form-item-no-wrap {\n display: inline-grid;\n grid-template-columns: max-content minmax(0, 1fr);\n}\n.canvas-react-form-item-no-wrap > .canvas-react-form-label {\n white-space: nowrap;\n}\n.canvas-react-form-label {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n min-width: 0;\n color: #475569;\n font-size: 13px;\n line-height: 1.4;\n}\n.canvas-react-form-horizontal > .canvas-react-form-item > .canvas-react-form-label {\n min-height: 32px;\n}\n.canvas-react-form-required {\n color: #dc2626;\n}\n.canvas-react-form-control {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n.canvas-react-form-error {\n color: #dc2626;\n font-size: 12px;\n}\n.canvas-react-form-help,\n.canvas-react-form-extra {\n color: #64748b;\n font-size: 12px;\n}\n.canvas-react-form-item-error .canvas-react-form-control > input,\n.canvas-react-form-item-error .canvas-react-form-control > textarea {\n border-color: #dc2626;\n}\n");
|
|
1523
|
+
function createFormInstance() {
|
|
1524
|
+
const store = {
|
|
1525
|
+
values: {},
|
|
1526
|
+
initialValues: {},
|
|
1527
|
+
errors: {},
|
|
1528
|
+
rules: /* @__PURE__ */ new Map(),
|
|
1529
|
+
listeners: /* @__PURE__ */ new Set(),
|
|
1530
|
+
revision: 0,
|
|
1531
|
+
notify() {
|
|
1532
|
+
store.revision += 1;
|
|
1533
|
+
store.listeners.forEach((listener) => listener());
|
|
1534
|
+
}
|
|
1535
|
+
};
|
|
1536
|
+
return {
|
|
1537
|
+
__store: store,
|
|
1538
|
+
getFieldValue: (name) => store.values[name],
|
|
1539
|
+
setFieldsValue(values) {
|
|
1540
|
+
store.values = { ...store.values, ...values };
|
|
1541
|
+
Object.keys(values).forEach((name) => {
|
|
1542
|
+
delete store.errors[name];
|
|
1543
|
+
});
|
|
1544
|
+
store.notify();
|
|
1545
|
+
},
|
|
1546
|
+
resetFields() {
|
|
1547
|
+
store.values = { ...store.initialValues };
|
|
1548
|
+
store.errors = {};
|
|
1549
|
+
store.notify();
|
|
1550
|
+
},
|
|
1551
|
+
async validateFields() {
|
|
1552
|
+
const errors = {};
|
|
1553
|
+
for (const [name, rules] of store.rules) {
|
|
1554
|
+
const value = store.values[name];
|
|
1555
|
+
for (const rawRule of rules) {
|
|
1556
|
+
const rule = typeof rawRule === "function" ? rawRule({ getFieldValue: (field) => store.values[field] }) : rawRule;
|
|
1557
|
+
if (rule.required && (value === void 0 || value === null || value === "")) {
|
|
1558
|
+
errors[name] = rule.message ?? "\u6B64\u9879\u4E3A\u5FC5\u586B\u9879";
|
|
1559
|
+
break;
|
|
1560
|
+
}
|
|
1561
|
+
if ((rule.type === "number" || rule.type === "integer") && typeof value === "number" && rule.min !== void 0 && value < rule.min) {
|
|
1562
|
+
errors[name] = rule.message ?? `\u4E0D\u80FD\u5C0F\u4E8E ${rule.min}`;
|
|
1563
|
+
break;
|
|
1564
|
+
}
|
|
1565
|
+
if ((rule.type === "number" || rule.type === "integer") && typeof value === "number" && rule.max !== void 0 && value > rule.max) {
|
|
1566
|
+
errors[name] = rule.message ?? `\u4E0D\u80FD\u5927\u4E8E ${rule.max}`;
|
|
1567
|
+
break;
|
|
1568
|
+
}
|
|
1569
|
+
if (rule.type === "integer" && typeof value === "number" && !Number.isInteger(value)) {
|
|
1570
|
+
errors[name] = rule.message ?? "\u8BF7\u8F93\u5165\u6574\u6570";
|
|
1571
|
+
break;
|
|
1572
|
+
}
|
|
1573
|
+
if (rule.validator) {
|
|
1574
|
+
try {
|
|
1575
|
+
await rule.validator(rule, value);
|
|
1576
|
+
} catch (error) {
|
|
1577
|
+
errors[name] = error instanceof Error ? error.message : "\u6821\u9A8C\u5931\u8D25";
|
|
1578
|
+
break;
|
|
1579
|
+
}
|
|
1580
|
+
}
|
|
1581
|
+
}
|
|
1582
|
+
}
|
|
1583
|
+
store.errors = errors;
|
|
1584
|
+
store.notify();
|
|
1585
|
+
if (Object.keys(errors).length > 0) {
|
|
1586
|
+
return Promise.reject({
|
|
1587
|
+
errorFields: errors,
|
|
1588
|
+
values: { ...store.values }
|
|
1589
|
+
});
|
|
1590
|
+
}
|
|
1591
|
+
return { ...store.values };
|
|
1592
|
+
}
|
|
1593
|
+
};
|
|
1594
|
+
}
|
|
1595
|
+
function useReactForm() {
|
|
1596
|
+
const formRef = React.useRef(null);
|
|
1597
|
+
if (!formRef.current) formRef.current = createFormInstance();
|
|
1598
|
+
return [formRef.current];
|
|
1599
|
+
}
|
|
1600
|
+
function useReactFormWatch(name, form) {
|
|
1601
|
+
React.useSyncExternalStore(
|
|
1602
|
+
(listener) => {
|
|
1603
|
+
form.__store.listeners.add(listener);
|
|
1604
|
+
return () => form.__store.listeners.delete(listener);
|
|
1605
|
+
},
|
|
1606
|
+
() => form.__store.revision,
|
|
1607
|
+
() => 0
|
|
1608
|
+
);
|
|
1609
|
+
return form.getFieldValue(name);
|
|
1610
|
+
}
|
|
1611
|
+
var FormContext = React.createContext(null);
|
|
1612
|
+
var emptySubscribe = () => () => {
|
|
1613
|
+
};
|
|
1614
|
+
var emptySnapshot = () => 0;
|
|
1615
|
+
function ReactFormRoot({
|
|
1616
|
+
form: formProp,
|
|
1617
|
+
initialValues,
|
|
1618
|
+
layout = "vertical",
|
|
1619
|
+
noWrap = false,
|
|
1620
|
+
itemSpacing,
|
|
1621
|
+
labelWidth,
|
|
1622
|
+
labelAlign = "right",
|
|
1623
|
+
colon = false,
|
|
1624
|
+
requiredMark = true,
|
|
1625
|
+
className,
|
|
1626
|
+
children,
|
|
1627
|
+
...props
|
|
1628
|
+
}) {
|
|
1629
|
+
const internalForm = React.useRef(null);
|
|
1630
|
+
if (!internalForm.current) internalForm.current = createFormInstance();
|
|
1631
|
+
const form = formProp ?? internalForm.current;
|
|
1632
|
+
const initialKey = React.useMemo(
|
|
1633
|
+
() => JSON.stringify(initialValues ?? {}),
|
|
1634
|
+
[initialValues]
|
|
1635
|
+
);
|
|
1636
|
+
React.useEffect(() => {
|
|
1637
|
+
form.__store.initialValues = { ...initialValues };
|
|
1638
|
+
form.__store.values = { ...initialValues, ...form.__store.values };
|
|
1639
|
+
form.__store.notify();
|
|
1640
|
+
}, [form, initialKey]);
|
|
1641
|
+
const contextValue = React.useMemo(
|
|
1642
|
+
() => ({
|
|
1643
|
+
form,
|
|
1644
|
+
layout,
|
|
1645
|
+
noWrap,
|
|
1646
|
+
labelWidth,
|
|
1647
|
+
labelAlign,
|
|
1648
|
+
colon,
|
|
1649
|
+
requiredMark
|
|
1650
|
+
}),
|
|
1651
|
+
[colon, form, labelAlign, labelWidth, layout, noWrap, requiredMark]
|
|
1652
|
+
);
|
|
1653
|
+
return /* @__PURE__ */ jsxRuntime.jsx(FormContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1654
|
+
"form",
|
|
1655
|
+
{
|
|
1656
|
+
...props,
|
|
1657
|
+
style: itemSpacing === void 0 ? props.style : {
|
|
1658
|
+
...props.style,
|
|
1659
|
+
"--canvas-react-form-item-spacing": itemSpacing
|
|
1660
|
+
},
|
|
1661
|
+
className: joinClassNames(
|
|
1662
|
+
`${REACT_COMPONENT_PREFIX}-form`,
|
|
1663
|
+
`${REACT_COMPONENT_PREFIX}-form-${layout}`,
|
|
1664
|
+
className
|
|
1665
|
+
),
|
|
1666
|
+
onSubmit: (event) => event.preventDefault(),
|
|
1667
|
+
children
|
|
1668
|
+
}
|
|
1669
|
+
) });
|
|
1670
|
+
}
|
|
1671
|
+
function ReactFormItem({
|
|
1672
|
+
label,
|
|
1673
|
+
name,
|
|
1674
|
+
children,
|
|
1675
|
+
rules = [],
|
|
1676
|
+
initialValue,
|
|
1677
|
+
required,
|
|
1678
|
+
colon,
|
|
1679
|
+
labelWidth,
|
|
1680
|
+
labelAlign,
|
|
1681
|
+
labelStyle,
|
|
1682
|
+
controlStyle,
|
|
1683
|
+
help,
|
|
1684
|
+
extra,
|
|
1685
|
+
className,
|
|
1686
|
+
style,
|
|
1687
|
+
noWrap
|
|
1688
|
+
}) {
|
|
1689
|
+
const context = React.useContext(FormContext);
|
|
1690
|
+
const form = context?.form ?? null;
|
|
1691
|
+
if (name && !form) throw new Error("ReactForm.Item \u5FC5\u987B\u5728 ReactForm \u5185\u4F7F\u7528");
|
|
1692
|
+
React.useSyncExternalStore(
|
|
1693
|
+
form ? (listener) => {
|
|
1694
|
+
form.__store.listeners.add(listener);
|
|
1695
|
+
return () => form.__store.listeners.delete(listener);
|
|
1696
|
+
} : emptySubscribe,
|
|
1697
|
+
form ? () => form.__store.revision : emptySnapshot,
|
|
1698
|
+
emptySnapshot
|
|
1699
|
+
);
|
|
1700
|
+
React.useEffect(() => {
|
|
1701
|
+
if (!form || !name) return;
|
|
1702
|
+
form.__store.rules.set(name, rules);
|
|
1703
|
+
if (form.getFieldValue(name) === void 0 && initialValue !== void 0) {
|
|
1704
|
+
form.setFieldsValue({ [name]: initialValue });
|
|
1705
|
+
}
|
|
1706
|
+
return () => {
|
|
1707
|
+
form.__store.rules.delete(name);
|
|
1708
|
+
};
|
|
1709
|
+
}, [form, initialValue, name, rules]);
|
|
1710
|
+
const childProps = React.isValidElement(children) ? children.props : {};
|
|
1711
|
+
const value = form && name ? form.getFieldValue(name) : void 0;
|
|
1712
|
+
const child = form && name && React.isValidElement(children) ? React.cloneElement(children, {
|
|
1713
|
+
value: value ?? "",
|
|
1714
|
+
onChange: (...args) => {
|
|
1715
|
+
const first = args[0];
|
|
1716
|
+
const nextValue = typeof first === "object" && first !== null && "target" in first ? first.target?.value : first;
|
|
1717
|
+
form.setFieldsValue({ [name]: nextValue });
|
|
1718
|
+
const childOnChange = childProps.onChange;
|
|
1719
|
+
if (typeof childOnChange === "function") childOnChange(...args);
|
|
1720
|
+
}
|
|
1721
|
+
}) : children;
|
|
1722
|
+
const error = form && name ? form.__store.errors[name] : void 0;
|
|
1723
|
+
const isRequired = required ?? rules.some((rule) => typeof rule !== "function" && rule.required === true);
|
|
1724
|
+
const resolvedLabelWidth = labelWidth ?? context?.labelWidth;
|
|
1725
|
+
const resolvedLabelAlign = labelAlign ?? context?.labelAlign ?? "right";
|
|
1726
|
+
const showColon = colon ?? context?.colon ?? false;
|
|
1727
|
+
const shouldMarkRequired = context?.requiredMark ?? true;
|
|
1728
|
+
const resolvedLayout = context?.layout ?? "vertical";
|
|
1729
|
+
const resolvedNoWrap = noWrap ?? context?.noWrap ?? false;
|
|
1730
|
+
const labelElementId = typeof childProps.id === "string" ? childProps.id : void 0;
|
|
1731
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1732
|
+
"div",
|
|
1733
|
+
{
|
|
1734
|
+
className: joinClassNames(
|
|
1735
|
+
`${REACT_COMPONENT_PREFIX}-form-item`,
|
|
1736
|
+
`${REACT_COMPONENT_PREFIX}-form-item-${resolvedLayout}`,
|
|
1737
|
+
resolvedNoWrap && `${REACT_COMPONENT_PREFIX}-form-item-no-wrap`,
|
|
1738
|
+
className,
|
|
1739
|
+
error && `${REACT_COMPONENT_PREFIX}-form-item-error`
|
|
1740
|
+
),
|
|
1741
|
+
style,
|
|
1742
|
+
children: [
|
|
1743
|
+
label ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1744
|
+
"label",
|
|
1745
|
+
{
|
|
1746
|
+
className: `${REACT_COMPONENT_PREFIX}-form-label`,
|
|
1747
|
+
htmlFor: labelElementId,
|
|
1748
|
+
style: {
|
|
1749
|
+
width: resolvedLabelWidth,
|
|
1750
|
+
flexBasis: resolvedLabelWidth,
|
|
1751
|
+
textAlign: resolvedLabelAlign,
|
|
1752
|
+
...labelStyle
|
|
1753
|
+
},
|
|
1754
|
+
children: [
|
|
1755
|
+
shouldMarkRequired && isRequired ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
1756
|
+
"span",
|
|
1757
|
+
{
|
|
1758
|
+
"aria-hidden": "true",
|
|
1759
|
+
className: `${REACT_COMPONENT_PREFIX}-form-required`,
|
|
1760
|
+
children: "*"
|
|
1761
|
+
}
|
|
1762
|
+
) : null,
|
|
1763
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: label }),
|
|
1764
|
+
showColon ? /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", children: ":" }) : null
|
|
1765
|
+
]
|
|
1766
|
+
}
|
|
1767
|
+
) : null,
|
|
1768
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
1769
|
+
"div",
|
|
1770
|
+
{
|
|
1771
|
+
className: `${REACT_COMPONENT_PREFIX}-form-control`,
|
|
1772
|
+
style: controlStyle,
|
|
1773
|
+
children: [
|
|
1774
|
+
child,
|
|
1775
|
+
error ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${REACT_COMPONENT_PREFIX}-form-error`, children: error }) : help ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${REACT_COMPONENT_PREFIX}-form-help`, children: help }) : null,
|
|
1776
|
+
extra ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${REACT_COMPONENT_PREFIX}-form-extra`, children: extra }) : null
|
|
1777
|
+
]
|
|
1778
|
+
}
|
|
1779
|
+
)
|
|
1780
|
+
]
|
|
1781
|
+
}
|
|
1782
|
+
);
|
|
1783
|
+
}
|
|
1784
|
+
var ReactForm = Object.assign(ReactFormRoot, {
|
|
1785
|
+
Item: ReactFormItem,
|
|
1786
|
+
useForm: useReactForm,
|
|
1787
|
+
useWatch: useReactFormWatch
|
|
1788
|
+
});
|
|
1789
|
+
|
|
1514
1790
|
// src/components/color/style.css
|
|
1515
1791
|
styleInject(".canvas-react-color-wrap {\n display: inline-flex;\n width: 100%;\n height: 100%;\n min-height: 0;\n box-sizing: border-box;\n}\n.canvas-react-color {\n display: flex;\n align-items: center;\n width: 100%;\n min-width: 0;\n height: var(--canvas-react-control-height);\n min-height: 0;\n box-sizing: border-box;\n border: 1px solid var(--canvas-react-color-border);\n border-radius: var(--canvas-react-radius-sm);\n background: var(--canvas-react-color-bg);\n color: var(--canvas-react-color-text);\n font-size: var(--canvas-react-font-size);\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\n cursor: pointer;\n}\n.canvas-react-color:hover {\n border-color: var(--canvas-react-color-primary-hover);\n}\n.canvas-react-color-open,\n.canvas-react-color:focus-within {\n border-color: var(--canvas-react-color-primary);\n box-shadow: var(--canvas-react-shadow-focus);\n}\n.canvas-react-color-disabled {\n color: #9ca3af;\n background: var(--canvas-react-color-bg-soft);\n cursor: not-allowed;\n}\n.canvas-react-color-preview {\n flex: 0 0 auto;\n width: calc(24px * var(--canvas-react-content-zoom, 1));\n height: calc(24px * var(--canvas-react-content-zoom, 1));\n margin-left: 3px;\n box-sizing: border-box;\n border: 1px solid rgba(0, 0, 0, 0.12);\n border-radius: 4px;\n}\n.canvas-react-color-input-wrap {\n flex: 1;\n min-width: 0;\n height: 100%;\n min-height: 0;\n border: 0;\n box-shadow: none;\n}\n.canvas-react-color .canvas-react-input-affix-wrapper {\n height: 100%;\n min-height: 0;\n}\n.canvas-react-color-input-wrap:hover,\n.canvas-react-color-input-wrap:focus-within {\n border-color: transparent;\n box-shadow: none;\n}\n.canvas-react-color-input {\n cursor: pointer;\n text-transform: uppercase;\n}\n.canvas-react-color-arrow {\n flex: 0 0 auto;\n width: 0.5em;\n height: 0.5em;\n min-width: 6px;\n min-height: 6px;\n margin-right: var(--canvas-react-control-padding-inline, 11px);\n border-right: 1.5px solid var(--canvas-react-color-text-muted);\n border-bottom: 1.5px solid var(--canvas-react-color-text-muted);\n transform: rotate(45deg) translateY(-2px);\n transition: transform 0.18s ease;\n}\n.canvas-react-color-arrow-open {\n transform: rotate(225deg) translate(-1px, -1px);\n}\n.canvas-react-color-dropdown {\n overflow: hidden;\n}\n.canvas-react-color-panel {\n padding: 12px;\n box-sizing: border-box;\n}\n.canvas-react-color-saturation {\n position: relative;\n height: 150px;\n overflow: hidden;\n border-radius: 6px;\n cursor: crosshair;\n background-image:\n linear-gradient(\n to top,\n #000,\n transparent),\n linear-gradient(\n to right,\n #fff,\n transparent);\n touch-action: none;\n}\n.canvas-react-color-saturation-thumb {\n position: absolute;\n width: 12px;\n height: 12px;\n border: 2px solid #fff;\n border-radius: 50%;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.28), 0 1px 3px rgba(0, 0, 0, 0.28);\n transform: translate(-50%, -50%);\n pointer-events: none;\n}\n.canvas-react-color-controls {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-top: 12px;\n}\n.canvas-react-color-current {\n flex: 0 0 28px;\n height: 28px;\n box-sizing: border-box;\n border: 1px solid rgba(0, 0, 0, 0.12);\n border-radius: 50%;\n}\n.canvas-react-color-hue {\n width: 100%;\n height: 12px;\n margin: 0;\n appearance: none;\n border-radius: 999px;\n background:\n linear-gradient(\n to right,\n #f00,\n #ff0,\n #0f0,\n #0ff,\n #00f,\n #f0f,\n #f00);\n cursor: pointer;\n}\n.canvas-react-color-hue::-webkit-slider-thumb {\n width: 14px;\n height: 14px;\n appearance: none;\n border: 2px solid #fff;\n border-radius: 50%;\n background: transparent;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.28);\n}\n.canvas-react-color-value-row {\n display: grid;\n grid-template-columns: 36px 1fr;\n align-items: center;\n gap: 8px;\n margin-top: 12px;\n color: var(--canvas-react-color-text-muted);\n font-size: 12px;\n}\n.canvas-react-color-value-row .canvas-react-input-affix-wrapper {\n height: 28px;\n}\n.canvas-react-color-presets {\n display: grid;\n grid-template-columns: repeat(8, 20px);\n gap: 7px;\n margin-top: 12px;\n}\n.canvas-react-color-preset {\n width: 20px;\n height: 20px;\n padding: 0;\n box-sizing: border-box;\n border: 1px solid rgba(0, 0, 0, 0.12);\n border-radius: 4px;\n cursor: pointer;\n transition: transform 0.16s ease, box-shadow 0.16s ease;\n}\n.canvas-react-color-preset:hover {\n transform: scale(1.12);\n}\n.canvas-react-color-preset-selected {\n box-shadow: 0 0 0 2px #fff, 0 0 0 3px var(--canvas-react-color-primary);\n}\n");
|
|
1516
1792
|
var DEFAULT_COLOR = "#1677ff";
|
|
@@ -5907,7 +6183,7 @@ function isPromiseLike(value) {
|
|
|
5907
6183
|
}
|
|
5908
6184
|
|
|
5909
6185
|
// src/components/compat/style.css
|
|
5910
|
-
styleInject(".canvas-react-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n min-height: 32px;\n padding: 4px 14px;\n border: 1px solid var(--cc-border-color, #d9d9d9);\n border-radius: 6px;\n color: var(--cc-text-color, #1f2937);\n background: var(--cc-surface-color, #fff);\n cursor: pointer;\n}\n.canvas-react-button:hover:not(:disabled) {\n color: #1677ff;\n border-color: #1677ff;\n}\n.canvas-react-button:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n.canvas-react-button-primary {\n color: #fff;\n border-color: #1677ff;\n background: #1677ff;\n}\n.canvas-react-button-danger {\n color: #dc2626;\n border-color: #fca5a5;\n}\n.canvas-react-button-small {\n min-height: 24px;\n padding: 2px 8px;\n}\n.canvas-react-button-large {\n min-height: 40px;\n padding: 6px 18px;\n}\n.canvas-react-button-icon {\n display: inline-flex;\n}\n.canvas-react-row {\n display: flex;\n flex-flow: row wrap;\n}\n.canvas-react-col {\n min-width: 0;\n padding-inline: 8px;\n}\n.canvas-react-radio-group {\n display: flex;\n gap: 16px;\n}\n.canvas-react-radio {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n cursor: pointer;\n}\n.canvas-react-radio input {\n position: absolute;\n opacity: 0;\n pointer-events: none;\n}\n.canvas-react-radio-mark {\n width: 14px;\n height: 14px;\n border: 1px solid #94a3b8;\n border-radius: 50%;\n box-sizing: border-box;\n}\n.canvas-react-radio input:checked + .canvas-react-radio-mark {\n border: 4px solid #1677ff;\n}\n.canvas-react-form-item {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-bottom: 16px;\n}\n.canvas-react-form-label {\n color: #334155;\n font-size: 14px;\n}\n.canvas-react-form-error {\n color: #dc2626;\n font-size: 12px;\n}\n.canvas-react-textarea {\n width: 100%;\n min-height: 72px;\n padding: 8px 10px;\n border: 1px solid #d9d9d9;\n border-radius: 6px;\n box-sizing: border-box;\n font: inherit;\n resize: vertical;\n}\n.canvas-react-message-host {\n position: fixed;\n z-index: 3000;\n top: 24px;\n left: 50%;\n display: flex;\n flex-direction: column;\n gap: 8px;\n transform: translateX(-50%);\n pointer-events: none;\n}\n.canvas-react-message {\n padding: 9px 14px;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n color: #334155;\n background: #fff;\n box-shadow: 0 8px 24px rgba(15, 23, 42, 0.14);\n}\n.canvas-react-message-error {\n color: #b91c1c;\n border-color: #fecaca;\n}\n");
|
|
6186
|
+
styleInject(".canvas-react-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n min-height: 32px;\n padding: 4px 14px;\n border: 1px solid var(--cc-border-color, #d9d9d9);\n border-radius: 6px;\n color: var(--cc-text-color, #1f2937);\n background: var(--cc-surface-color, #fff);\n cursor: pointer;\n}\n.canvas-react-button:hover:not(:disabled) {\n color: #1677ff;\n border-color: #1677ff;\n}\n.canvas-react-button:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n.canvas-react-button-primary {\n color: #fff;\n border-color: #1677ff;\n background: #1677ff;\n}\n.canvas-react-button-primary:hover:not(:disabled) {\n color: #fff;\n border-color: #4096ff;\n background: #4096ff;\n}\n.canvas-react-button-danger {\n color: #dc2626;\n border-color: #fca5a5;\n}\n.canvas-react-button-small {\n min-height: 24px;\n padding: 2px 8px;\n}\n.canvas-react-button-large {\n min-height: 40px;\n padding: 6px 18px;\n}\n.canvas-react-button-icon {\n display: inline-flex;\n}\n.canvas-react-row {\n display: flex;\n flex-flow: row wrap;\n}\n.canvas-react-col {\n min-width: 0;\n padding-inline: 8px;\n}\n.canvas-react-radio-group {\n display: flex;\n gap: 16px;\n}\n.canvas-react-radio {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n cursor: pointer;\n}\n.canvas-react-radio input {\n position: absolute;\n opacity: 0;\n pointer-events: none;\n}\n.canvas-react-radio-mark {\n width: 14px;\n height: 14px;\n border: 1px solid #94a3b8;\n border-radius: 50%;\n box-sizing: border-box;\n}\n.canvas-react-radio input:checked + .canvas-react-radio-mark {\n border: 4px solid #1677ff;\n}\n.canvas-react-form-item {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-bottom: 16px;\n}\n.canvas-react-form-label {\n color: #334155;\n font-size: 14px;\n}\n.canvas-react-form-error {\n color: #dc2626;\n font-size: 12px;\n}\n.canvas-react-textarea {\n width: 100%;\n min-height: 72px;\n padding: 8px 10px;\n border: 1px solid #d9d9d9;\n border-radius: 6px;\n box-sizing: border-box;\n font: inherit;\n resize: vertical;\n}\n.canvas-react-message-host {\n position: fixed;\n z-index: 3000;\n top: 24px;\n left: 50%;\n display: flex;\n flex-direction: column;\n gap: 8px;\n transform: translateX(-50%);\n pointer-events: none;\n}\n.canvas-react-message {\n padding: 9px 14px;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n color: #334155;\n background: #fff;\n box-shadow: 0 8px 24px rgba(15, 23, 42, 0.14);\n}\n.canvas-react-message-error {\n color: #b91c1c;\n border-color: #fecaca;\n}\n");
|
|
5911
6187
|
function ReactButton({
|
|
5912
6188
|
children,
|
|
5913
6189
|
className,
|
|
@@ -6069,173 +6345,6 @@ function ReactTextArea({ className, ...props }) {
|
|
|
6069
6345
|
}
|
|
6070
6346
|
);
|
|
6071
6347
|
}
|
|
6072
|
-
function createFormInstance() {
|
|
6073
|
-
const store = {
|
|
6074
|
-
values: {},
|
|
6075
|
-
initialValues: {},
|
|
6076
|
-
errors: {},
|
|
6077
|
-
rules: /* @__PURE__ */ new Map(),
|
|
6078
|
-
listeners: /* @__PURE__ */ new Set(),
|
|
6079
|
-
revision: 0,
|
|
6080
|
-
notify() {
|
|
6081
|
-
store.revision += 1;
|
|
6082
|
-
store.listeners.forEach((listener) => listener());
|
|
6083
|
-
}
|
|
6084
|
-
};
|
|
6085
|
-
return {
|
|
6086
|
-
__store: store,
|
|
6087
|
-
getFieldValue: (name) => store.values[name],
|
|
6088
|
-
setFieldsValue(values) {
|
|
6089
|
-
store.values = { ...store.values, ...values };
|
|
6090
|
-
Object.keys(values).forEach((name) => {
|
|
6091
|
-
delete store.errors[name];
|
|
6092
|
-
});
|
|
6093
|
-
store.notify();
|
|
6094
|
-
},
|
|
6095
|
-
resetFields() {
|
|
6096
|
-
store.values = { ...store.initialValues };
|
|
6097
|
-
store.errors = {};
|
|
6098
|
-
store.notify();
|
|
6099
|
-
},
|
|
6100
|
-
async validateFields() {
|
|
6101
|
-
const errors = {};
|
|
6102
|
-
for (const [name, rules] of store.rules) {
|
|
6103
|
-
const value = store.values[name];
|
|
6104
|
-
for (const rawRule of rules) {
|
|
6105
|
-
const rule = typeof rawRule === "function" ? rawRule({ getFieldValue: (field) => store.values[field] }) : rawRule;
|
|
6106
|
-
if (rule.required && (value === void 0 || value === null || value === "")) {
|
|
6107
|
-
errors[name] = rule.message ?? "\u6B64\u9879\u4E3A\u5FC5\u586B\u9879";
|
|
6108
|
-
break;
|
|
6109
|
-
}
|
|
6110
|
-
if ((rule.type === "number" || rule.type === "integer") && typeof value === "number" && rule.min !== void 0 && value < rule.min) {
|
|
6111
|
-
errors[name] = rule.message ?? `\u4E0D\u80FD\u5C0F\u4E8E ${rule.min}`;
|
|
6112
|
-
break;
|
|
6113
|
-
}
|
|
6114
|
-
if ((rule.type === "number" || rule.type === "integer") && typeof value === "number" && rule.max !== void 0 && value > rule.max) {
|
|
6115
|
-
errors[name] = rule.message ?? `\u4E0D\u80FD\u5927\u4E8E ${rule.max}`;
|
|
6116
|
-
break;
|
|
6117
|
-
}
|
|
6118
|
-
if (rule.type === "integer" && typeof value === "number" && !Number.isInteger(value)) {
|
|
6119
|
-
errors[name] = rule.message ?? "\u8BF7\u8F93\u5165\u6574\u6570";
|
|
6120
|
-
break;
|
|
6121
|
-
}
|
|
6122
|
-
if (rule.validator) {
|
|
6123
|
-
try {
|
|
6124
|
-
await rule.validator(rule, value);
|
|
6125
|
-
} catch (error) {
|
|
6126
|
-
errors[name] = error instanceof Error ? error.message : "\u6821\u9A8C\u5931\u8D25";
|
|
6127
|
-
break;
|
|
6128
|
-
}
|
|
6129
|
-
}
|
|
6130
|
-
}
|
|
6131
|
-
}
|
|
6132
|
-
store.errors = errors;
|
|
6133
|
-
store.notify();
|
|
6134
|
-
if (Object.keys(errors).length > 0) {
|
|
6135
|
-
return Promise.reject({
|
|
6136
|
-
errorFields: errors,
|
|
6137
|
-
values: { ...store.values }
|
|
6138
|
-
});
|
|
6139
|
-
}
|
|
6140
|
-
return { ...store.values };
|
|
6141
|
-
}
|
|
6142
|
-
};
|
|
6143
|
-
}
|
|
6144
|
-
function useReactForm() {
|
|
6145
|
-
const formRef = React.useRef();
|
|
6146
|
-
if (!formRef.current) formRef.current = createFormInstance();
|
|
6147
|
-
return [formRef.current];
|
|
6148
|
-
}
|
|
6149
|
-
function useReactFormWatch(name, form) {
|
|
6150
|
-
return React.useSyncExternalStore(
|
|
6151
|
-
(listener) => {
|
|
6152
|
-
form.__store.listeners.add(listener);
|
|
6153
|
-
return () => form.__store.listeners.delete(listener);
|
|
6154
|
-
},
|
|
6155
|
-
() => form.__store.revision,
|
|
6156
|
-
() => 0
|
|
6157
|
-
) >= 0 ? form.getFieldValue(name) : void 0;
|
|
6158
|
-
}
|
|
6159
|
-
var FormContext = React.createContext(null);
|
|
6160
|
-
function ReactFormRoot({
|
|
6161
|
-
form,
|
|
6162
|
-
initialValues,
|
|
6163
|
-
layout = "vertical",
|
|
6164
|
-
className,
|
|
6165
|
-
children,
|
|
6166
|
-
...props
|
|
6167
|
-
}) {
|
|
6168
|
-
const initialKey = React.useMemo(
|
|
6169
|
-
() => JSON.stringify(initialValues ?? {}),
|
|
6170
|
-
[initialValues]
|
|
6171
|
-
);
|
|
6172
|
-
React.useEffect(() => {
|
|
6173
|
-
form.__store.initialValues = { ...initialValues };
|
|
6174
|
-
form.__store.values = { ...initialValues, ...form.__store.values };
|
|
6175
|
-
form.__store.notify();
|
|
6176
|
-
}, [form, initialKey]);
|
|
6177
|
-
return /* @__PURE__ */ jsxRuntime.jsx(FormContext.Provider, { value: form, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
6178
|
-
"form",
|
|
6179
|
-
{
|
|
6180
|
-
...props,
|
|
6181
|
-
className: joinClassNames(
|
|
6182
|
-
`${REACT_COMPONENT_PREFIX}-form`,
|
|
6183
|
-
`${REACT_COMPONENT_PREFIX}-form-${layout}`,
|
|
6184
|
-
className
|
|
6185
|
-
),
|
|
6186
|
-
onSubmit: (event) => event.preventDefault(),
|
|
6187
|
-
children
|
|
6188
|
-
}
|
|
6189
|
-
) });
|
|
6190
|
-
}
|
|
6191
|
-
function ReactFormItem({
|
|
6192
|
-
label,
|
|
6193
|
-
name,
|
|
6194
|
-
children,
|
|
6195
|
-
rules = [],
|
|
6196
|
-
initialValue
|
|
6197
|
-
}) {
|
|
6198
|
-
const form = React.useContext(FormContext);
|
|
6199
|
-
if (!form) throw new Error("ReactForm.Item \u5FC5\u987B\u5728 ReactForm \u5185\u4F7F\u7528");
|
|
6200
|
-
React.useSyncExternalStore(
|
|
6201
|
-
(listener) => {
|
|
6202
|
-
form.__store.listeners.add(listener);
|
|
6203
|
-
return () => form.__store.listeners.delete(listener);
|
|
6204
|
-
},
|
|
6205
|
-
() => form.__store.revision,
|
|
6206
|
-
() => 0
|
|
6207
|
-
);
|
|
6208
|
-
React.useEffect(() => {
|
|
6209
|
-
form.__store.rules.set(name, rules);
|
|
6210
|
-
if (form.getFieldValue(name) === void 0 && initialValue !== void 0) {
|
|
6211
|
-
form.setFieldsValue({ [name]: initialValue });
|
|
6212
|
-
}
|
|
6213
|
-
return () => {
|
|
6214
|
-
form.__store.rules.delete(name);
|
|
6215
|
-
};
|
|
6216
|
-
}, [form, initialValue, name, rules]);
|
|
6217
|
-
const childProps = children.props;
|
|
6218
|
-
const value = form.getFieldValue(name);
|
|
6219
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("label", { className: `${REACT_COMPONENT_PREFIX}-form-item`, children: [
|
|
6220
|
-
label ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${REACT_COMPONENT_PREFIX}-form-label`, children: label }) : null,
|
|
6221
|
-
React.cloneElement(children, {
|
|
6222
|
-
value: value ?? "",
|
|
6223
|
-
onChange: (...args) => {
|
|
6224
|
-
const first = args[0];
|
|
6225
|
-
const nextValue = typeof first === "object" && first !== null && "target" in first ? first.target?.value : first;
|
|
6226
|
-
form.setFieldsValue({ [name]: nextValue });
|
|
6227
|
-
const childOnChange = childProps.onChange;
|
|
6228
|
-
if (typeof childOnChange === "function") childOnChange(...args);
|
|
6229
|
-
}
|
|
6230
|
-
}),
|
|
6231
|
-
form.__store.errors[name] ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${REACT_COMPONENT_PREFIX}-form-error`, children: form.__store.errors[name] }) : null
|
|
6232
|
-
] });
|
|
6233
|
-
}
|
|
6234
|
-
var ReactForm = Object.assign(ReactFormRoot, {
|
|
6235
|
-
Item: ReactFormItem,
|
|
6236
|
-
useForm: useReactForm,
|
|
6237
|
-
useWatch: useReactFormWatch
|
|
6238
|
-
});
|
|
6239
6348
|
function showMessage(type, content) {
|
|
6240
6349
|
if (typeof document === "undefined") return;
|
|
6241
6350
|
const hostId = `${REACT_COMPONENT_PREFIX}-message-host`;
|
|
@@ -9834,6 +9943,7 @@ exports.ReactDateTimeRangePicker = ReactDateTimeRangePicker;
|
|
|
9834
9943
|
exports.ReactFilterPanel = ReactFilterPanel;
|
|
9835
9944
|
exports.ReactFlex = ReactFlex;
|
|
9836
9945
|
exports.ReactForm = ReactForm;
|
|
9946
|
+
exports.ReactFormItem = ReactFormItem;
|
|
9837
9947
|
exports.ReactImagePreview = ReactImagePreview;
|
|
9838
9948
|
exports.ReactInput = ReactInput;
|
|
9839
9949
|
exports.ReactInputNumber = ReactInputNumber;
|