public override bool CanExecute(IEntitySetExtensionContext context) { SelectionState selectionState = context.SelectionState; if (selectionState.IsEmpty()) { return(false); } if (!_transition.MultipleSelectionEnabled && selectionState.IsMultiple()) { return(false); } IList <IEntityPresenter> selection = context.GetSelectedItems(); if (selection.Count == 0 || (!_transition.MultipleSelectionEnabled && selection.Count != 1)) { return(false); } return(WorkflowService.CanExecute(_transition, selection.SelectMany(item => GetEntities(item)), context)); }
public static async Task <DataTransaction> ChangeStageAsync(EntityWorkflowTransition transition, IEnumerable <Entity> entities, IEntitySetExtensionContext context) { if (!entities.Any()) { return(null); } Dictionary <string, object> inputValues; if (transition.ShowInputForm) { if (!await Task.Run(() => transition.ValidateEntities(entities))) { return(null); } IInputForm form = InputFormFactory.Instance.CreateForm(); form.Caption = transition.CommandText; if (transition.HasConfirmation) { form.AddTextBlock(transition.GetConfimationText(entities, context)); } transition.GenerateInputForm(form, entities, context); if (transition.HasComment && !form.Controls.Any(c => c.Name == "Comment")) { form.AddStringControl("Комментарий", true).Name = "Comment"; } if (form.Controls.Any(c => c is IInputFormSelectEntityControl)) { if (!await form.Show()) { return(null); } } else { if (!form.ShowDialog()) { return(null); } } inputValues = form.Controls.ToDictionary(c => string.IsNullOrEmpty(c.Name) ? c.Label : c.Name, c => c.Value); } else { inputValues = new Dictionary <string, object>(0); if (transition.HasConfirmation) { if (MessageBox.Show(Application.Current.MainWindow, transition.GetConfimationText(entities, context), transition.CommandText, MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes) { return(null); } } } return(await ProgressFeedback.Run("Смена стадии", progress => { progress.Cancelable = false; string transitionName = transition.ToString(); string toStageName = transition.ToStage?.ToString(); if (string.IsNullOrWhiteSpace(toStageName) || transitionName == toStageName) { progress.Progress(transitionName); } else { progress.Progress($"{transitionName} — {toStageName}"); } return transition.Execute(entities, null, inputValues, context); })); }
public static bool CanExecute(EntityWorkflowTransition transition, IEnumerable <Entity> entities, IEntitySetExtensionContext context) { int count = 0; foreach (Entity entity in entities) { if (entity == null || entity.EntitySet.Scheme.Guid != transition.Workflow.EntitySet.Guid || !transition.CanChangeStage(entity, context)) { return(false); } if (entity.Transaction != null && (context?.PropertiesView == null || context.PropertiesView.InheritTransaction)) { return(false); } ++count; if (count > 1 && !transition.MultipleSelectionEnabled) { return(false); } } return(count > 0); }
public override async void Execute(IEntitySetExtensionContext context) { IList <IEntityPresenter> items = context.GetSelectedItems(); HashSet <Guid> guids = new HashSet <Guid>(); EntitySet entitySet = null; foreach (IEntityPresenter item in items) { foreach (Entity entity in GetEntities(item)) { if (entity == null) { return; } if (entitySet == null) { entitySet = entity.EntitySet; } else if (entitySet.Scheme.Guid != entity.EntitySetGuid) { return; } guids.Add(entity.Guid); } } var saveResult = await context.PropertiesView?.SaveAsync(); if (guids.Count == 0) { return; } List <Entity> entities = new List <Entity>(guids.Count); foreach (Entity entity in entitySet.Find(guids, context.EntitiesView?.EntityLoadParameters) ?? Enumerable.Empty <Entity>()) { if (guids.Remove(entity.Guid)) { entities.Add(entity); } else { throw new ApplicationException(); } } if (guids.Count > 0) { throw new ModelException(ErrorLevel.Warning, "Выбранные объекты были изменены или удалены. Обновите окно и попробуйте сменить стадию ещё раз."); } DataTransaction transaction = null; try { transaction = await WorkflowService.ChangeStageAsync(_transition, entities, saveResult?.ExtensionContext ?? context); if (transaction != null) { context.Update(transaction); } } finally { if (transaction == null) { if (context.EntitiesView == null) { context.PropertiesView?.Refresh(); } else { context.EntitiesView.Update(entities); } } } }