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.
Files changed (2) hide show
  1. package/dist/index.js +38 -16
  2. 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 keys have been touched for validation
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 key input should show error state
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 */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "myoperator-ui",
3
- "version": "0.0.116",
3
+ "version": "0.0.118",
4
4
  "description": "CLI for adding myOperator UI components to your project",
5
5
  "type": "module",
6
6
  "exports": "./dist/index.js",