Source code for ipywidgets.widgets.widget_tagsinput
# Copyright(c) Jupyter Development Team.
# Distributed under the terms of the Modified BSD License.
"""TagsInput class.
Represents a list of tags.
"""
from traitlets import (
CaselessStrEnum, CInt, CFloat, Bool, Unicode, List, TraitError, validate
)
from .widget_description import DescriptionWidget
from .valuewidget import ValueWidget
from .widget_core import CoreWidget
from .widget import register
from .trait_types import Color, NumberFormat
[docs]class TagsInputBase(DescriptionWidget, ValueWidget, CoreWidget):
_model_name = Unicode('TagsInputBaseModel').tag(sync=True)
value = List().tag(sync=True)
placeholder = Unicode('\u200b').tag(sync=True)
allowed_tags = List().tag(sync=True)
allow_duplicates = Bool(True).tag(sync=True)
@validate('value')
def _validate_value(self, proposal):
if ('' in proposal['value']):
raise TraitError('The value of a TagsInput widget cannot contain blank strings')
if len(self.allowed_tags) == 0:
return proposal['value']
for tag_value in proposal['value']:
if tag_value not in self.allowed_tags:
raise TraitError('Tag value {} is not allowed, allowed tags are {}'.format(tag_value, self.allowed_tags))
return proposal['value']
[docs]@register
class TagsInput(TagsInputBase):
"""
List of string tags
"""
_model_name = Unicode('TagsInputModel').tag(sync=True)
_view_name = Unicode('TagsInputView').tag(sync=True)
value = List(Unicode(), help='List of string tags').tag(sync=True)
tag_style = CaselessStrEnum(
values=['primary', 'success', 'info', 'warning', 'danger', ''], default_value='',
help="""Use a predefined styling for the tags.""").tag(sync=True)
[docs]@register
class ColorsInput(TagsInputBase):
"""
List of color tags
"""
_model_name = Unicode('ColorsInputModel').tag(sync=True)
_view_name = Unicode('ColorsInputView').tag(sync=True)
value = List(Color(), help='List of string tags').tag(sync=True)
[docs]class NumbersInputBase(TagsInput):
_model_name = Unicode('NumbersInputBaseModel').tag(sync=True)
min = CFloat(default_value=None, allow_none=True).tag(sync=True)
max = CFloat(default_value=None, allow_none=True).tag(sync=True)
@validate('value')
def _validate_numbers(self, proposal):
for tag_value in proposal['value']:
if self.min is not None and tag_value < self.min:
raise TraitError('Tag value {} should be >= {}'.format(tag_value, self.min))
if self.max is not None and tag_value > self.max:
raise TraitError('Tag value {} should be <= {}'.format(tag_value, self.max))
return proposal['value']
[docs]@register
class FloatsInput(NumbersInputBase):
"""
List of float tags
"""
_model_name = Unicode('FloatsInputModel').tag(sync=True)
_view_name = Unicode('FloatsInputView').tag(sync=True)
value = List(CFloat(), help='List of float tags').tag(sync=True)
format = NumberFormat('.1f').tag(sync=True)
[docs]@register
class IntsInput(NumbersInputBase):
"""
List of int tags
"""
_model_name = Unicode('IntsInputModel').tag(sync=True)
_view_name = Unicode('IntsInputView').tag(sync=True)
value = List(CInt(), help='List of int tags').tag(sync=True)
format = NumberFormat('d').tag(sync=True)
min = CInt(default_value=None, allow_none=True).tag(sync=True)
max = CInt(default_value=None, allow_none=True).tag(sync=True)