public static ValueChangedRich <DomainT> BindRead <WidgetT, ViewT, DomainT>(this IReadOnlyValueView <WidgetT, ViewT> view, IReadOnlyValue <DomainT> domain, Func <DomainT, ViewT> convertFromDomain) { ValueChangedRich <DomainT> handler = (sender, oldValue, newValue, rawErrors, isUserAction) => { var errors = rawErrors.ToList(); var allErrors = new HashSet <string>(errors); var value = RunConvertingExceptionToFailure(convertFromDomain, newValue); var selfInvalidation = sender == view && errors.Any(); if (!value.Success) { allErrors.Add(value.ErrorMessage); } Logger.Debug(typeof(ValueViewExtensions), "BindRead handler called with value after conversion={0} errors={1} senderIsSelf={2} selfInvalidation={3}", value, sender == view, allErrors.PrettyToString(), selfInvalidation); if (!selfInvalidation) { //don't overwrite errorneus entry if entry origins from self so that user sees wrong value view.Value = value.Result; } view.SetErrors(allErrors, isUserAction); }; domain.Changed += handler; return(handler); }
public void Add <T>(IReadOnlyValueView <HTMLElement, T> observed, HTMLElement view) { var err = observed.Errors; Logger.Debug(GetType(), "Add for itm {0} has initial result={1}", observed.Widget.Id, err.Count); observed.ErrorsChanged += (sender, errors) => _updateObserver(sender, errors); _updateObserver(observed, err); //initialization _widgets.Add(view); }
public static LocalValue <int> BuildInt <WidgetT>( IReadOnlyValueView <WidgetT, string> view, params Validate <int>[] validators) { var result = new LocalValue <int>(0); view.BindReadOnlyAndInitialize(result, x => I18n.Localize(x)); validators.ForEach(y => result.AddValidatorAndRevalidate(y)); return(result); }
public static LocalValue <DataT> Build <WidgetT, DataT>( IReadOnlyValueView <WidgetT, DataT> view, params Validate <DataT>[] validators) { var result = new LocalValue <DataT>(default(DataT)); view.BindReadOnlyAndInitialize(result, x => x); validators.ForEach(y => result.AddValidatorAndRevalidate(y)); return(result); }
public static LocalValue <decimal> BuildDecimal <WidgetT>( IReadOnlyValueView <WidgetT, string> view, DecimalFormat format, params Validate <decimal>[] validators) { var result = new LocalValue <decimal>(0); view.BindReadOnlyAndInitialize(result, x => I18n.Localize(x, format)); validators.ForEach(y => result.AddValidatorAndRevalidate(y)); return(result); }
public static LocalValue <ModelT> Build <WidgetT, ModelT, ViewT>( IReadOnlyValueView <WidgetT, ViewT> view, Func <ModelT, ViewT> convertFromDomain, params Validate <ModelT>[] validators) { var result = new LocalValue <ModelT>(default(ModelT)); view.BindReadOnlyAndInitialize(result, convertFromDomain); validators.ForEach(y => result.AddValidatorAndRevalidate(y)); return(result); }
public static ValueChangedRich <DomainT> BindReadOnlyAndInitialize <WidgetT, ViewT, DomainT>( this IReadOnlyValueView <WidgetT, ViewT> view, IReadOnlyValue <DomainT> domain, Func <DomainT, ViewT> convertFromDomain) { var handler = view.BindRead(domain, convertFromDomain); handler(domain, domain.Value, domain.Value, domain.Errors, false); return(handler); }
public static LocalValue <decimal> BuildDecimalWithPrecision <WidgetT>( IReadOnlyValueView <WidgetT, string> view, decimal defaultValue, Func <int> getPrecision, params Validate <decimal>[] validators) { var result = new LocalValue <decimal>(defaultValue); view.BindReadOnlyAndInitialize(result, x => I18n.Localize(x, DecimalFormatExtensions.GetWithPrecision(getPrecision()))); validators.ForEach(y => result.AddValidatorAndRevalidate(y)); return(result); }
public ClassFieldRemoteMutator <ModelT, ModelT, ContT> Build <WidgetT, ModelT, ViewT>( Expression <Func <ContT, ModelT> > getField, IReadOnlyValueView <WidgetT, ViewT> view, Func <ModelT, ViewT> convertFromDomain) { return(new ClassFieldRemoteMutator <ModelT, ModelT, ContT>( getField, x => x, x => x, x => _caller.SaveField(ExpressionUtil.ExtractFieldName(getField), x), x => view.BindReadOnlyAndInitialize(x, convertFromDomain), postOperationConsumerOrNull: _postOperationConsumerOrNull, postOperationInvokeBeforeChanged: _postOperationInvokeBeforeChanged)); }
public ClassFieldRemoteMutator <ModelT, ModelT, ContT> Build <WidgetT, ModelT>( Expression <Func <ContT, ModelT> > getField, IReadOnlyValueView <WidgetT, ModelT> view, params Validate <ModelT>[] validators) { return(new ClassFieldRemoteMutator <ModelT, ModelT, ContT>( getField, x => x, x => x, x => _caller.SaveField(ExpressionUtil.ExtractFieldName(getField), x), x => { validators.ForEach(y => x.AddValidatorAndRevalidate(y)); view.BindReadOnlyAndInitialize(x); }, postOperationConsumerOrNull: _postOperationConsumerOrNull, postOperationInvokeBeforeChanged: _postOperationInvokeBeforeChanged)); }
public static ValueChangedRich <T> BindReadOnlyAndInitialize <WidgetT, T>(this IReadOnlyValueView <WidgetT, T> view, IReadOnlyValue <T> domain) { return(view.BindReadOnlyAndInitialize(domain, x => x)); }
public ClassFieldRemoteMutator <int, int, ContT> BuildInt <WidgetT>( Expression <Func <ContT, int> > getField, IReadOnlyValueView <WidgetT, string> view) { return(Build(getField, view, x => I18n.Localize(x))); }
public ClassFieldRemoteMutator <DateTime?, DateTime?, ContT> BuildDateTimeNullable <WidgetT>( Expression <Func <ContT, DateTime?> > getField, IReadOnlyValueView <WidgetT, string> view, DateTimeFormat format) { return(Build(getField, view, x => !x.HasValue ? "" : I18n.Localize(x.Value, format))); }