myoperator-ui 0.0.116 → 0.0.118
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.js +38 -16
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -5647,6 +5647,8 @@ export const KeyValueInput = React.forwardRef<
|
|
|
5647
5647
|
valuePlaceholder = "Value",
|
|
5648
5648
|
keyLabel = "Key",
|
|
5649
5649
|
valueLabel = "Value",
|
|
5650
|
+
keyRequired = true,
|
|
5651
|
+
valueRequired = true,
|
|
5650
5652
|
value: controlledValue,
|
|
5651
5653
|
onChange,
|
|
5652
5654
|
defaultValue = [],
|
|
@@ -5662,10 +5664,13 @@ export const KeyValueInput = React.forwardRef<
|
|
|
5662
5664
|
const isControlled = controlledValue !== undefined;
|
|
5663
5665
|
const pairs = isControlled ? controlledValue : internalPairs;
|
|
5664
5666
|
|
|
5665
|
-
// Track which
|
|
5667
|
+
// Track which fields have been touched for validation
|
|
5666
5668
|
const [touchedKeys, setTouchedKeys] = React.useState<Set<string>>(
|
|
5667
5669
|
new Set()
|
|
5668
5670
|
);
|
|
5671
|
+
const [touchedValues, setTouchedValues] = React.useState<Set<string>>(
|
|
5672
|
+
new Set()
|
|
5673
|
+
);
|
|
5669
5674
|
|
|
5670
5675
|
const handlePairsChange = React.useCallback(
|
|
5671
5676
|
(newPairs: KeyValuePair[]) => {
|
|
@@ -5719,6 +5724,7 @@ export const KeyValueInput = React.forwardRef<
|
|
|
5719
5724
|
handlePairsChange(
|
|
5720
5725
|
pairs.map((pair) => (pair.id === id ? { ...pair, value } : pair))
|
|
5721
5726
|
);
|
|
5727
|
+
setTouchedValues((prev) => new Set(prev).add(id));
|
|
5722
5728
|
};
|
|
5723
5729
|
|
|
5724
5730
|
// Delete row
|
|
@@ -5729,6 +5735,11 @@ export const KeyValueInput = React.forwardRef<
|
|
|
5729
5735
|
next.delete(id);
|
|
5730
5736
|
return next;
|
|
5731
5737
|
});
|
|
5738
|
+
setTouchedValues((prev) => {
|
|
5739
|
+
const next = new Set(prev);
|
|
5740
|
+
next.delete(id);
|
|
5741
|
+
return next;
|
|
5742
|
+
});
|
|
5732
5743
|
};
|
|
5733
5744
|
|
|
5734
5745
|
const isAtLimit = pairs.length >= maxItems;
|
|
@@ -5756,12 +5767,13 @@ export const KeyValueInput = React.forwardRef<
|
|
|
5756
5767
|
<div className="flex-1">
|
|
5757
5768
|
<span className="text-sm font-medium text-[#333333]">
|
|
5758
5769
|
{keyLabel}
|
|
5759
|
-
<span className="text-[#FF3B3B] ml-0.5">*</span>
|
|
5770
|
+
{keyRequired && <span className="text-[#FF3B3B] ml-0.5">*</span>}
|
|
5760
5771
|
</span>
|
|
5761
5772
|
</div>
|
|
5762
5773
|
<div className="flex-1">
|
|
5763
5774
|
<span className="text-sm font-medium text-[#333333]">
|
|
5764
5775
|
{valueLabel}
|
|
5776
|
+
{valueRequired && <span className="text-[#FF3B3B] ml-0.5">*</span>}
|
|
5765
5777
|
</span>
|
|
5766
5778
|
</div>
|
|
5767
5779
|
{/* Spacer for delete button column */}
|
|
@@ -5776,6 +5788,9 @@ export const KeyValueInput = React.forwardRef<
|
|
|
5776
5788
|
pair={pair}
|
|
5777
5789
|
isDuplicateKey={duplicateKeys.has(pair.key.toLowerCase())}
|
|
5778
5790
|
isKeyEmpty={touchedKeys.has(pair.id) && !pair.key.trim()}
|
|
5791
|
+
isValueEmpty={touchedValues.has(pair.id) && !pair.value.trim()}
|
|
5792
|
+
keyRequired={keyRequired}
|
|
5793
|
+
valueRequired={valueRequired}
|
|
5779
5794
|
keyPlaceholder={keyPlaceholder}
|
|
5780
5795
|
valuePlaceholder={valuePlaceholder}
|
|
5781
5796
|
onKeyChange={handleKeyChange}
|
|
@@ -5834,6 +5849,9 @@ export const KeyValueRow = React.forwardRef<
|
|
|
5834
5849
|
pair,
|
|
5835
5850
|
isDuplicateKey,
|
|
5836
5851
|
isKeyEmpty,
|
|
5852
|
+
isValueEmpty,
|
|
5853
|
+
keyRequired = true,
|
|
5854
|
+
valueRequired = true,
|
|
5837
5855
|
keyPlaceholder = "Key",
|
|
5838
5856
|
valuePlaceholder = "Value",
|
|
5839
5857
|
onKeyChange,
|
|
@@ -5844,15 +5862,9 @@ export const KeyValueRow = React.forwardRef<
|
|
|
5844
5862
|
},
|
|
5845
5863
|
ref
|
|
5846
5864
|
) => {
|
|
5847
|
-
// Determine if
|
|
5848
|
-
const keyHasError = isDuplicateKey || isKeyEmpty;
|
|
5849
|
-
|
|
5850
|
-
// Determine error message
|
|
5851
|
-
const errorMessage = isDuplicateKey
|
|
5852
|
-
? "Duplicate key"
|
|
5853
|
-
: isKeyEmpty
|
|
5854
|
-
? "Key is required"
|
|
5855
|
-
: null;
|
|
5865
|
+
// Determine if inputs should show error state
|
|
5866
|
+
const keyHasError = isDuplicateKey || (keyRequired && isKeyEmpty);
|
|
5867
|
+
const valueHasError = valueRequired && isValueEmpty;
|
|
5856
5868
|
|
|
5857
5869
|
return (
|
|
5858
5870
|
<div
|
|
@@ -5867,13 +5879,9 @@ export const KeyValueRow = React.forwardRef<
|
|
|
5867
5879
|
onChange={(e) => onKeyChange(pair.id, e.target.value)}
|
|
5868
5880
|
placeholder={keyPlaceholder}
|
|
5869
5881
|
state={keyHasError ? "error" : "default"}
|
|
5882
|
+
required={keyRequired}
|
|
5870
5883
|
aria-label="Key"
|
|
5871
5884
|
/>
|
|
5872
|
-
{errorMessage && (
|
|
5873
|
-
<span className="text-xs text-[#FF3B3B] mt-1 block">
|
|
5874
|
-
{errorMessage}
|
|
5875
|
-
</span>
|
|
5876
|
-
)}
|
|
5877
5885
|
</div>
|
|
5878
5886
|
|
|
5879
5887
|
{/* Value Input */}
|
|
@@ -5882,6 +5890,8 @@ export const KeyValueRow = React.forwardRef<
|
|
|
5882
5890
|
value={pair.value}
|
|
5883
5891
|
onChange={(e) => onValueChange(pair.id, e.target.value)}
|
|
5884
5892
|
placeholder={valuePlaceholder}
|
|
5893
|
+
state={valueHasError ? "error" : "default"}
|
|
5894
|
+
required={valueRequired}
|
|
5885
5895
|
aria-label="Value"
|
|
5886
5896
|
/>
|
|
5887
5897
|
</div>
|
|
@@ -5940,6 +5950,12 @@ export interface KeyValueInputProps {
|
|
|
5940
5950
|
/** Label for value column header (default: "Value") */
|
|
5941
5951
|
valueLabel?: string
|
|
5942
5952
|
|
|
5953
|
+
// Validation
|
|
5954
|
+
/** Whether key field is required (default: true) */
|
|
5955
|
+
keyRequired?: boolean
|
|
5956
|
+
/** Whether value field is required (default: true) */
|
|
5957
|
+
valueRequired?: boolean
|
|
5958
|
+
|
|
5943
5959
|
// State (controlled mode)
|
|
5944
5960
|
/** Array of key-value pairs (controlled) */
|
|
5945
5961
|
value?: KeyValuePair[]
|
|
@@ -5965,6 +5981,12 @@ export interface KeyValueRowProps {
|
|
|
5965
5981
|
isDuplicateKey: boolean
|
|
5966
5982
|
/** Whether key is empty (for validation) */
|
|
5967
5983
|
isKeyEmpty: boolean
|
|
5984
|
+
/** Whether value is empty (for validation) */
|
|
5985
|
+
isValueEmpty: boolean
|
|
5986
|
+
/** Whether key field is required */
|
|
5987
|
+
keyRequired?: boolean
|
|
5988
|
+
/** Whether value field is required */
|
|
5989
|
+
valueRequired?: boolean
|
|
5968
5990
|
/** Placeholder for key input */
|
|
5969
5991
|
keyPlaceholder?: string
|
|
5970
5992
|
/** Placeholder for value input */
|