public Worker AddWorker() { var TSettings = new ScheduleController.ToggleButtonSettings { States = this.WorkerStates, }; var row = new tr(); this.Body.insertBefore(row, this.ActualPercentageRow); var NameColumn = row.AddColumn(); NameColumn.style.padding = "2px"; var w = new ScheduleController.Worker { Row = row, NameInput = new input(HTMLInputTypeEnum.text).AttachTo(NameColumn), SettingsForDays = TSettings }.AddTo(this.Workers); // disable planning on a nameless worker TSettings.IsEnabled = () => !w.Name.IsNullOrEmpty(); w.Disposing += () => this.Workers.Remove(w); w.Days = this.days.AsRange().Select( i => { var c5 = row.AddColumn(); this.ApplyStyle(c5, this.date.GetDayWithinMonth(i + 1)); return new ScheduleController.ToggleButton { Settings = TSettings, Control = c5, Changed = () => this.UpdateActualPercentage(i) }.Attach(); } ).ToArray(); w.CountColumn = row.AddColumn(); w.CountColumn.style.padding = "2px"; TSettings.Changed = delegate { if (w.Name.IsNullOrEmpty()) { w.CountColumn.innerText = ""; return; } var total = w.Days.Sum(i => i.Value.Hours);//.GetFractString(); // compiler bug: cannot chain this call? var total_str = total.GetFractString(); w.CountColumn.innerText = total_str; }; TSettings.Changed(); w.NameInput.onchange += delegate { if (WorkersChanged != null) WorkersChanged(); }; w.NameInput.WhenNoLongerEmpty( delegate { AddWorker(); this.UpdateActualPercentages(); w.SettingsForDays.Changed(); }); // compiler bug: cannot take implicit delegate from a type with Script(HasNoPrototype=true) // compiler bug: will loose parameters if statement is complex - workaround: use locals Func<ScheduleController.Worker, bool> IsNamelessWorker = i => i.NameInput.value.IsNullOrEmpty(); w.NameInput.WhenNoLongerNeeded(() => this.Workers.Count(IsNamelessWorker) > 1, delegate { w.Dispose(); this.UpdateActualPercentages(); }); return w; }
private void BuildBottom() { #region bottom this.ActualPercentageRow = this.Body.AddRow(); this.ActualPercentageRow.AddColumn(); this.ActualPercentageColumns = this.days.AsRange().Select( i => { var c5 = this.ActualPercentageRow.AddColumn(); c5.innerHTML = " "; this.ApplyStyle(c5, this.date.GetDayWithinMonth(i + 1)); return c5; } ).ToArray(); this.TotalPercentageRow = this.Body.AddRow(); this.TotalPercentageRow.AddColumn(); this.TotalPercentageButtons = this.days.AsRange().Select( i => { var c5 = this.TotalPercentageRow.AddColumn(); var x = this.date.GetDayWithinMonth(i + 1); this.ApplyStyle(c5, x); var settings = new ScheduleController.ToggleButtonSettings { States = this.TotalPersentageStates, }; var btn = new ScheduleController.ToggleButton { Settings = settings, Control = c5, Changed = () => this.UpdateActualPercentage(i), }.Attach(); if (x.IsWeekend()) btn.SetValueSilently(this.TotalPersentageStates[1]); return btn; } ).ToArray(); #endregion }