Migrating from ghl-ui InputNumber to HighRise InputNumber
This guide will help you migrate from the ghl-ui InputNumber component to the new HighRise InputNumber component.
Component Implementation Changes
Import Changes
diff
- import { UIInputNumber } from '@gohighlevel/ghl-ui'
+ import { HLInputNumber } from '@platform-ui/highrise'
Basic Usage Changes
diff
- <UIInputNumber
- id="basic-number"
- v-model="value"
- placeholder="Enter a number"
- @update:modelValue="handleValueChange"
- size="medium"
- />
+ <HLInputNumber
+ id="basic-number"
+ v-model:value="value"
+ placeholder="Enter a number"
+ @update:value="handleValueChange"
+ size="md"
+ :show-button="true"
+ />
Form Integration Changes
diff
- <UIForm :model="formModel">
- <UIFormItem label="Quantity">
- <UIInputNumber
- id="quantity"
- v-model="formModel.quantity"
- :min="1"
- :max="100"
- />
- </UIFormItem>
- </UIForm>
+ <HLForm :model="formModel" :rules="rules">
+ <HLFormItem
+ label="Quantity"
+ path="quantity"
+ required
+ >
+ <HLInputNumber
+ id="quantity"
+ v-model:value="formModel.quantity"
+ :min="1"
+ :max="100"
+ />
+ </HLFormItem>
+ </HLForm>
Props Changes
Required Changes
ghl-ui Prop | HighRise Prop | Notes |
---|---|---|
id | id | Required in HighRise |
modelValue | value | Use v-model:value instead of v-model |
size | size | Values changed (see below) |
- | step | No change, default is 1 |
- | textAlign | New prop for text alignment |
- | parse | New prop for custom parsing function |
- | format | New prop for custom formatting function |
Size Mapping
diff
- size="small"
+ size="sm"
- size="medium"
+ size="md"
- size="large"
+ size="lg"
// New sizes available in HighRise
+ size="xs"
+ size="2xs"
+ size="3xs"
New Features in HighRise
Text Alignment
vue
<template>
<HLInputNumber v-model:value="value" text-align="start" />
<HLInputNumber v-model:value="value" text-align="center" />
<HLInputNumber v-model:value="value" text-align="end" />
</template>
Custom Formatting
vue
<template>
<HLInputNumber v-model:value="value" :format="formatNumber" :parse="parseNumber" />
</template>
<script setup>
const formatNumber = value => {
if (value === null) return ''
return `$ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')
}
const parseNumber = input => {
const parsed = Number(input.replace(/[^\d.-]/g, ''))
return isNaN(parsed) ? null : parsed
}
</script>
Percentage Input Example
vue
<template>
<HLInputNumber
v-model:value="percentageValue"
:parse="parsePercentage"
:format="formatPercentage"
:min="0"
:max="100"
placeholder="Enter percentage"
:show-button="true"
/>
</template>
<script setup>
const percentageValue = ref(50)
const parsePercentage = input => {
const cleaned = input.replace(/%|\s/g, '')
const parsed = Number(cleaned)
if (isNaN(parsed) || parsed < 0 || parsed > 100) return null
return parsed
}
const formatPercentage = value => {
if (value === null) return ''
return `${value}%`
}
</script>
Examples
Basic Usage
diff
- <UIInputNumber
- id="basic-number"
- v-model="value"
- placeholder="Enter a number"
- />
+ <HLInputNumber
+ id="basic-number"
+ v-model:value="value"
+ placeholder="Enter a number"
+ :show-button="true"
+ />
With Min and Max Constraints
diff
- <UIInputNumber
- id="constrained-number"
- v-model="temperature"
- :min="0"
- :max="100"
- placeholder="Enter temperature"
- />
+ <HLInputNumber
+ id="constrained-number"
+ v-model:value="temperature"
+ :min="0"
+ :max="100"
+ placeholder="Enter temperature"
+ :show-button="true"
+ />
With Precision
diff
- <UIInputNumber
- id="precise-number"
- v-model="price"
- :precision="2"
- placeholder="Enter price"
- />
+ <HLInputNumber
+ id="precise-number"
+ v-model:value="price"
+ :precision="2"
+ placeholder="Enter price"
+ :show-button="true"
+ />
With Custom Step
diff
- <UIInputNumber
- id="step-number"
- v-model="value"
- :step="10"
- />
+ <HLInputNumber
+ id="step-number"
+ v-model:value="value"
+ :step="10"
+ :show-button="true"
+ />
With Form Validation
diff
- <UIFormItem label="Quantity" path="quantity">
- <UIInputNumber
- id="form-quantity"
- v-model="formData.quantity"
- :min="1"
- :max="100"
- />
- </UIFormItem>
+ <HLFormItem
+ label="Quantity"
+ validation-status="error"
+ validation-message="Please enter a valid quantity"
+ >
+ <HLInputNumber
+ id="form-quantity"
+ v-model:value="formData.quantity"
+ :min="1"
+ :max="100"
+ :show-button="true"
+ />
+ </HLFormItem>
Best Practices
- Always provide an
id
prop for accessibility - Use
v-model:value
for two-way binding - Implement proper form validation when needed
- Use appropriate size variants for different contexts
- Consider mobile responsiveness
- Add proper ARIA labels for accessibility
- Handle loading and error states appropriately
- Use descriptive placeholders
- Consider using custom formatting for currency and percentage inputs
- Maintain consistent styling with other form components
- Use appropriate min/max constraints based on the context
- Consider using precision for decimal values
- Implement proper error handling and feedback
- Use text alignment for better UX
Additional Notes
- The component automatically handles focus states
- Error states are managed through form validation
- Supports keyboard navigation
- Maintains consistent styling with other form components
- Handles disabled states consistently
- Integrates seamlessly with form validation
- Maintains accessibility standards
- Supports custom styling through CSS variables
- Provides flexible formatting and parsing options
- Works well on both desktop and mobile devices
- Supports both controlled and uncontrolled modes
- Includes built-in validation support