Add more type support
have type refactory
Separate method
Support enum list
Support empty and show selected
Refactory