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));
        }
Exemple #2
0
        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);
            }));
        }
Exemple #3
0
        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);
                    }
                }
            }
        }