/// <summary>EnumT must be enum. It is expected that Convert.ToInt32(x) call will succeed</summary> public static RadioBasedSingleChoice BuildForEnum <EnumT, CtxT>( string labelOrNull, EnumT defaultValue, Func <EnumT, string> getLabel, Func <int, EnumT> intToEnum, Func <HTMLElement, int, CtxT> beforeAddItems, RadioBasedSingleChoiceItemAdder <CtxT, EnumT> itemAdderOrNull = null) where EnumT : struct { RadioBasedSingleChoiceItemAdder itemAdder = null; if (itemAdderOrNull != null) { itemAdder = (ctx, cntnr, rawItem, itemAsEl, labelEl, itemNo) => itemAdderOrNull( (CtxT)ctx, cntnr, intToEnum(Convert.ToInt32(rawItem.Item1)), itemAsEl, labelEl, itemNo); } var result = new RadioBasedSingleChoice(labelOrNull, itemAdder) { BeforeAddItems = (x, y) => beforeAddItems(x, y), PermittedValues = EnumExtensions .GetEnumValues <EnumT>() .Select(x => Tuple.Create(Convert.ToInt32(x) + "", getLabel(x))), Value = Tuple.Create(Convert.ToInt32(defaultValue) + "", getLabel(defaultValue)) }; return(result); }
public static RadioBasedSingleChoice Build <T, CtxT>( string labelOrNull, T defaultValue, Func <T, string> getLabel, Func <int, T> intToItem, Func <T, int> itemToInt, Func <HTMLElement, int, CtxT> beforeAddItemsOrNull = null, RadioBasedSingleChoiceItemAdder <CtxT, T> itemAdderOrNull = null) { RadioBasedSingleChoiceItemAdder itemAdder = null; if (itemAdderOrNull != null) { itemAdder = (ctx, cntnr, rawItem, itemAsEl, labelEl, itemNo) => itemAdderOrNull( (CtxT)ctx, cntnr, intToItem(Convert.ToInt32(rawItem.Item1)), itemAsEl, labelEl, itemNo); } var result = new RadioBasedSingleChoice(labelOrNull, itemAdder); if (beforeAddItemsOrNull != null) { result.BeforeAddItems = (x, y) => beforeAddItemsOrNull(x, y); } var defVal = Tuple.Create(itemToInt(defaultValue) + "", getLabel(defaultValue)); result.PermittedValues = new [] { defVal }; result.Value = defVal; return(result); }
/// <summary>EnumT must be enum. It is expected that Convert.ToInt32(x) call will succeed</summary> public static RadioBasedSingleChoice BuildForEnum <EnumT, CtxT>( EnumT defaultValue, Func <EnumT, string> getLabel, Func <int, EnumT> intToEnum, Func <HTMLElement, int, CtxT> beforeAddItems, RadioBasedSingleChoiceItemAdder <CtxT, EnumT> itemAdderOrNull = null) where EnumT : struct { return(BuildForEnum(null, defaultValue, getLabel, intToEnum, beforeAddItems, itemAdderOrNull)); }
public RadioBasedSingleChoice(string labelOrNull = null, RadioBasedSingleChoiceItemAdder customItemAdder = null) { BeforeAddItems = (element, i) => null; ItemAdder = customItemAdder ?? ((ctx, cntnr, rawItem, itemElem, lblElem, itemNo) => { cntnr.AppendChild(itemElem); cntnr.AppendChild(lblElem); }); _uniqueNumberAsName = UniqueIdGenerator.GenerateAsString(); _container = new HTMLDivElement(); _container.ClassName = GetType().FullNameWithoutGenerics(); if (labelOrNull != null) { _genericLabelOrNull = new HTMLLabelElement { TextContent = labelOrNull }; _container.AppendChild(_genericLabelOrNull); } _logic = new ControlWithValueLogic <Tuple <string, string> >( (newVal, isUser) => Changed?.Invoke(newVal, isUser), () => { var active = _valueToItem.Values.FirstOrDefault(x => x.Checked); return(active == null ? Tuple.Create("", "") : Tuple.Create(active.Value, _valueToLabel[active.Value])); }, v => { var emptying = v == null || string.IsNullOrEmpty(v.Item1); Logger.Debug(GetType(), "setPhysicalValue emptying?={0} value=({1};{2})", emptying, v?.Item1, v?.Item2); if (emptying) { foreach (var x in _valueToItem.Values) { if (x.Checked) { x.Checked = false; break; } } return; } _valueToItem[v.Item1].Checked = true; }, () => _valueToItem.Any() && !_valueToItem.First().Value.Disabled, v => _valueToItem.Values.ForEach(x => _valueToItem.First().Value.Disabled = !v), () => _container.ClassList.Contains(Magics.CssClassIsValidating), v => _container.AddOrRemoveClass(v, Magics.CssClassIsValidating) ); _logic.ValueToString = x => x == null ? "<Tuple null>" : $"<Tuple fst={x.Item1} snd={x.Item2}>"; }