/// <summary> /// Creates a drop-down list. /// </summary> /// <param name="setup">The setup object for the drop-down.</param> /// <param name="selectedItemId">The ID of the selected item. This must either match a list item or be the default value of the type, unless an unlisted /// selected item label getter is passed.</param> /// <param name="defaultValueItemLabel">The label of the default-value item, which will appear first, and only if none of the list items have an ID with the /// default value. Do not pass null. If you pass the empty string, no default-value item will appear.</param> /// <param name="placeholderIsValid">Pass true if you would like the list to include a default-value placeholder that is considered a valid selection. /// This will only be included if none of the list items have an ID with the default value and the default-value item label is the empty string. If you pass /// false, the list will still include a default-value placeholder if the selected item ID has the default value and none of the list items do, but in this /// case the placeholder will not be considered a valid selection.</param> /// <param name="validationMethod">The validation method. Pass null if you’re only using this control for page modification.</param> public static SelectList <ItemIdType> CreateDropDown <ItemIdType>( DropDownSetup <ItemIdType> setup, ItemIdType selectedItemId, string defaultValueItemLabel = "", bool placeholderIsValid = false, Action <ItemIdType, Validator> validationMethod = null) => new SelectList <ItemIdType>( setup.DisplaySetup, null, setup.UseNativeControl, setup.Width, setup.IsReadOnly, setup.Classes, setup.UnlistedSelectedItemLabelGetter, defaultValueItemLabel, placeholderIsValid, setup.PlaceholderText, setup.Items, null, selectedItemId, setup.AutoFillTokens, setup.Action, setup.SelectionChangedAction, setup.ItemIdPageModificationValue, setup.ItemMatchPageModificationSetups, setup.ValidationPredicate, setup.ValidationErrorNotifier, validationMethod);
/// <summary> /// Creates a time control. /// </summary> /// <param name="value"></param> /// <param name="allowEmpty"></param> /// <param name="setup">The setup object for the time control.</param> /// <param name="minValue">The earliest allowed time.</param> /// <param name="maxValue">The latest allowed time. This can be earlier than <paramref name="minValue"/> to create a range spanning midnight.</param> /// <param name="minuteInterval">Allows the user to select values only in the given increments. Be aware that other values can still be sent from the /// browser via a crafted request.</param> /// <param name="validationMethod">The validation method. Pass null if you’re only using this control for page modification.</param> public TimeControl( LocalTime?value, bool allowEmpty, TimeControlSetup setup = null, LocalTime?minValue = null, LocalTime?maxValue = null, int minuteInterval = 15, Action <LocalTime?, Validator> validationMethod = null) { setup = setup ?? TimeControlSetup.Create(); minValue = minValue ?? LocalTime.Midnight; if (minuteInterval < 30) { var textControl = new TextControl( value.HasValue ? new TimeSpan(value.Value.TickOfDay).ToTimeOfDayHourAndMinuteString() : "", allowEmpty, setup: setup.IsReadOnly ? TextControlSetup.CreateReadOnly(validationPredicate: setup.ValidationPredicate, validationErrorNotifier: setup.ValidationErrorNotifier) : TextControlSetup.Create( autoFillTokens: setup.AutoFillTokens, action: new SpecifiedValue <FormAction>(setup.Action), valueChangedAction: setup.ValueChangedAction, pageModificationValue: setup.PageModificationValue, validationPredicate: setup.ValidationPredicate, validationErrorNotifier: setup.ValidationErrorNotifier), validationMethod: validationMethod == null ? (Action <string, Validator>)null : (postBackValue, validator) => { var errorHandler = new ValidationErrorHandler("time"); var validatedValue = validator.GetNullableTimeOfDayTimeSpan( errorHandler, postBackValue.ToUpper(), TewlContrib.DateTimeTools.HourAndMinuteFormat.ToCollection().ToArray(), allowEmpty) .ToNewUnderlyingValue(v => LocalTime.FromTicksSinceMidnight(v.Ticks)); if (errorHandler.LastResult != ErrorCondition.NoError) { setup.ValidationErrorNotifier?.Invoke(); return; } var wrap = maxValue < minValue.Value; if (!wrap ? validatedValue < minValue.Value || validatedValue > maxValue : validatedValue < minValue.Value && validatedValue > maxValue) { validator.NoteErrorAndAddMessage("The time is too early or too late."); setup.ValidationErrorNotifier?.Invoke(); return; } validationMethod(validatedValue, validator); }); Labeler = textControl.Labeler; PageComponent = new DisplayableElement( context => new DisplayableElementData( setup.DisplaySetup, () => new DisplayableElementLocalData( "div", focusDependentData: new DisplayableElementFocusDependentData( includeIdAttribute: true, jsInitStatements: "{0}.timepicker( {{ {1} }} );".FormatWith( getTextControlExpression(context.Id), StringTools.ConcatenateWithDelimiter( ", ", "timeFormat: 'h:mmt'", "stepMinute: {0}".FormatWith(minuteInterval), "showButtonPanel: false")))), classes: elementClass.Add(setup.Classes ?? ElementClassSet.Empty), children: textControl.PageComponent.ToCollection() .Concat( setup.IsReadOnly ? Enumerable.Empty <PhrasingComponent>() : new EwfButton( new CustomButtonStyle(children: new FontAwesomeIcon("fa-clock-o").ToCollection()), behavior: new CustomButtonBehavior(() => "{0}.timepicker( 'show' );".FormatWith(getTextControlExpression(context.Id))), classes: new ElementClass("icon")).ToCollection()) .Materialize())); Validation = textControl.Validation; } else { var items = from time in getTimes(minValue.Value, maxValue, minuteInterval) let timeSpan = new TimeSpan(time.TickOfDay) select SelectListItem.Create <LocalTime?>(time, timeSpan.ToTimeOfDayHourAndMinuteString()); var selectList = SelectList.CreateDropDown( setup.IsReadOnly ? DropDownSetup.CreateReadOnly( items, placeholderText: "", validationPredicate: setup.ValidationPredicate, validationErrorNotifier: setup.ValidationErrorNotifier) : DropDownSetup.Create( items, placeholderText: "", autoFillTokens: setup.AutoFillTokens, action: new SpecifiedValue <FormAction>(setup.Action), selectionChangedAction: setup.ValueChangedAction, validationPredicate: setup.ValidationPredicate, validationErrorNotifier: setup.ValidationErrorNotifier), value, placeholderIsValid: allowEmpty, validationMethod: validationMethod); Labeler = selectList.Labeler; PageComponent = new GenericFlowContainer( selectList.PageComponent.ToCollection(), displaySetup: setup.DisplaySetup, classes: elementClass.Add(setup.Classes ?? ElementClassSet.Empty)); Validation = selectList.Validation; } }