private void Jump(object sender, Message message, int offset)
        {
            string control    = Context.ClientPage.ClientRequest.Control;
            string workflowID = ShortID.Decode(control.Substring(0, 0x20));
            string stateID    = ShortID.Decode(control.Substring(0x21, 0x20));

            control = control.Substring(0, 0x41);
            IWorkflowProvider workflowProvider = Context.ContentDatabase.WorkflowProvider;

            Error.Assert(workflowProvider != null, "Workflow provider for database \"" + Context.ContentDatabase.Name + "\" not found.");
            IWorkflow workflow = workflowProvider.GetWorkflow(workflowID);

            Error.Assert(workflow != null, "Workflow \"" + workflowID + "\" not found.");
            Assert.IsNotNull(workflow, "workflow");
            WorkflowState state = workflow.GetState(stateID);

            Error.Assert(state != null, "Workflow state \"" + stateID + "\" not found.");
            Border border = new Border
            {
                ID = control + "_content"
            };

            DataUri[] items = this.GetItems(state, workflow);
            this.DisplayState(workflow, state, items, border, offset, this.PageSize);
            Context.ClientPage.ClientResponse.SetOuterHtml(control + "_content", border);
        }
Beispiel #2
0
        public bool IsWorkflowEditable(Item item)
        {
            bool editable = false;
            SettingsController settings    = new SettingsController();
            List <string>      validStates = settings.GetValidWorkflowStates();

            if (item != null)
            {
                IWorkflow workflow = item.Database.WorkflowProvider.GetWorkflow(item);

                if (workflow == null)
                {
                    editable = true;
                }
                else if (validStates.Count > 0)
                {
                    WorkflowState state = workflow.GetState(item);

                    if (state != null && validStates.Any(t => t == state.StateID))
                    {
                        editable = true;
                    }
                }
            }

            return(editable);
        }
Beispiel #3
0
        public override bool Filter(object element)
        {
            Debug.ArgumentNotNull(element, "element");
            Item item = element as Item;

            if (item == null)
            {
                return(true);
            }

            IWorkflow wf = Sitecore.Context.Workflow.GetWorkflow(item);

            if (wf == null)
            {
                return(false);
            }
            WorkflowState state = wf.GetState(item);

            if (state == null || state.FinalState)
            {
                return(false);
            }

            WorkflowEvent[] wevents = wf.GetHistory(item);
            if (wevents == null || wevents.Length == 0)
            {
                return(false);
            }
            return((System.DateTime.Now - wevents[wevents.Length - 1].Date).Days > Age);
        }
        public override void Process(GetPageEditorNotificationsArgs arguments)
        {
            Assert.ArgumentNotNull((object)arguments, "arguments");
            Item              contextItem      = arguments.ContextItem;
            Database          database         = contextItem.Database;
            IWorkflowProvider workflowProvider = database.WorkflowProvider;

            if (workflowProvider == null)
            {
                return;
            }
            IWorkflow workflow = workflowProvider.GetWorkflow(contextItem);

            if (workflow == null)
            {
                return;
            }
            WorkflowState state = workflow.GetState(contextItem);

            if (state == null)
            {
                return;
            }
            var repository = new WorxboxItemsRepository(workflow);

            var worxBoxIcon = "/~/icon/worxbox/32x32/worxbox.png";
            var displayIcon =
                $"<span><img src='{worxBoxIcon}'  style='vertical-align:middle; padding-right: 1px;'/></span>";



            string description = GetDescription(workflow, state, database);
            string icon        = state.Icon;
            PageEditorNotification editorNotification = new PageEditorNotification(description, PageEditorNotificationType.Information)
            {
                Icon = icon
            };
            var commands = WorkflowFilterer.FilterVisibleCommands(workflow.GetCommands(contextItem));

            foreach (WorkflowCommand filterVisibleCommand in commands)
            {
                PageEditorNotificationOption notificationOption = new PageEditorNotificationOption(filterVisibleCommand.DisplayName, new WorkflowCommandBuilder(contextItem, workflow, filterVisibleCommand).ToString());
                editorNotification.Options.Add(notificationOption);
            }
            editorNotification.Options.Add(new PageEditorNotificationOption("|", ""));
            foreach (WorkflowCommand command in commands)
            {
                if (repository.IsWorxboxItem(state, new DataUri(contextItem.Uri)) &&
                    repository.GetWorkflowCommandIDs().Contains(ID.Parse(command.CommandID)))
                {
                    var notificationOption = new PageEditorNotificationOption(displayIcon + command.DisplayName, new WorxBoxWorkflowCommandBuilder(contextItem, workflow, command).ToString());
                    editorNotification.Options.Add(notificationOption);
                }
            }
            arguments.Notifications.Add(editorNotification);
        }
Beispiel #5
0
        void DriveWorkflow()
        {
            string st;

            do
            {
                System.Threading.Thread.Sleep(1000);
                st = _wf.GetState("TestMachine");
            } while (st != "NoMore");
            _host.OnStop();
        }
        private void SendSelected(Message message)
        {
            IWorkflowProvider workflowProvider = Context.ContentDatabase.WorkflowProvider;

            if (workflowProvider != null)
            {
                string    workflowID = message["wf"];
                string    str2       = message["ws"];
                IWorkflow workflow   = workflowProvider.GetWorkflow(workflowID);
                if (workflow != null)
                {
                    int  num  = 0;
                    bool flag = false;
                    foreach (string str3 in Context.ClientPage.ClientRequest.Form.Keys)
                    {
                        if ((str3 != null) && str3.StartsWith("check_"))
                        {
                            string   str4     = "hidden_" + str3.Substring(6);
                            string[] strArray = Context.ClientPage.ClientRequest.Form[str4].Split(new char[] { ',' });
                            Item     item     = Context.ContentDatabase.Items[strArray[0], Language.Parse(strArray[1]), Version.Parse(strArray[2])];
                            if (item != null)
                            {
                                WorkflowState state = workflow.GetState(item);
                                if (state.StateID == str2)
                                {
                                    try
                                    {
                                        workflow.Execute(message["command"], item, state.DisplayName, true, new object[0]);
                                    }
                                    catch (WorkflowStateMissingException)
                                    {
                                        flag = true;
                                    }
                                    num++;
                                }
                            }
                        }
                    }
                    if (flag)
                    {
                        SheerResponse.Alert("One or more items could not be processed because their workflow state does not specify the next step.", new string[0]);
                    }
                    if (num == 0)
                    {
                        Context.ClientPage.ClientResponse.Alert("There are no selected items.");
                    }
                    else
                    {
                        Context.ClientPage.ClientResponse.SetLocation(string.Empty);
                    }
                }
            }
        }
Beispiel #7
0
        private static bool CheckWorkflow(ClientPipelineArgs args, Item item)
        {
            Assert.ArgumentNotNull((object)args, "args");
            Assert.ArgumentNotNull((object)item, "item");
            if (args.Parameters["workflow"] == "1")
            {
                return(true);
            }
            args.Parameters["workflow"] = "1";
            if (args.IsPostBack)
            {
                if (args.Result == "yes")
                {
                    args.IsPostBack = false;
                    return(true);
                }
                args.AbortPipeline();
                return(false);
            }
            SiteContext site = Factory.GetSite("publisher");

            if (site != null && !site.EnableWorkflow)
            {
                return(true);
            }
            IWorkflowProvider workflowProvider = Context.ContentDatabase.WorkflowProvider;

            if (workflowProvider == null || workflowProvider.GetWorkflows().Length <= 0)
            {
                return(true);
            }
            IWorkflow workflow = workflowProvider.GetWorkflow(item);

            if (workflow == null)
            {
                return(true);
            }
            WorkflowState state = workflow.GetState(item);

            if (state == null || state.FinalState)
            {
                return(true);
            }
            args.Parameters["workflow"] = "0";
            if (state.PreviewPublishingTargets.Any <string>())
            {
                return(true);
            }
            SheerResponse.Confirm(Translate.Text("The current item \"{0}\" is in the workflow state \"{1}\"\nand will not be published.\n\nAre you sure you want to publish?", (object)item.DisplayName, (object)state.DisplayName));
            args.WaitForPostBack();
            return(false);
        }
Beispiel #8
0
        /// <summary>Gets the icon.</summary>
        /// <param name="item">The item.</param>
        /// <returns>The icon.</returns>
        protected override GutterIconDescriptor GetIconDescriptor(Item item)
        {
            Assert.ArgumentNotNull((object)item, nameof(item));
            string str1 = item[FieldIDs.Workflow];
            string str2 = item[FieldIDs.WorkflowState];

            if (!Settings.Workflows.Enabled || !item.Access.CanWrite())
            {
                return((GutterIconDescriptor)null);
            }
            if (string.IsNullOrEmpty(str1) || string.IsNullOrEmpty(str2))
            {
                return((GutterIconDescriptor)null);
            }
            IWorkflowProvider workflowProvider = item.Database.WorkflowProvider;

            if (workflowProvider == null)
            {
                return((GutterIconDescriptor)null);
            }
            IWorkflow workflow = workflowProvider.GetWorkflow(item);

            if (workflow == null)
            {
                return((GutterIconDescriptor)null);
            }
            Sitecore.Workflows.WorkflowState state = workflow.GetState(item);
            if (state == null)
            {
                return((GutterIconDescriptor)null);
            }
            if (state.FinalState)
            {
                return((GutterIconDescriptor)null);
            }
            GutterIconDescriptor gutterIconDescriptor = new GutterIconDescriptor();

            gutterIconDescriptor.Icon    = state.Icon;
            gutterIconDescriptor.Tooltip = state.DisplayName;
            WorkflowCommand[] workflowCommandArray = WorkflowFilterer.FilterVisibleCommands(workflow.GetCommands(item), item);
            if (workflowCommandArray != null && workflowCommandArray.Length != 0)
            {
                //Modify the event subscribed to the gutterIconDescriptor to call custom command, found at ExtendedShowWorkflowCommands.cs
                gutterIconDescriptor.Click = "ss:extendedshowworkflowcommands(id=" + (object)item.ID + ",language=" + (object)item.Language + ",version=" + (object)item.Version + ",database=" + item.Database.Name + ")";
            }
            return(gutterIconDescriptor);
        }
Beispiel #9
0
        public void Process(WorkflowPipelineArgs args)
        {
            if (args.DataItem == null)
            {
                return;
            }

            Item dataItem = args.DataItem;

            IWorkflow dataItemWorkflow = dataItem.Database.WorkflowProvider.GetWorkflow(dataItem);

            if (dataItemWorkflow != null)
            {
                WorkflowState dataItemWorkflowState = dataItemWorkflow.GetState(dataItem);

                List <Item> relatedItems = new List <Item>();
                relatedItems.AddRange(GetItemsFromRenderingDatasources(dataItem));

                //todo: get related items from personalization rules data sources
                //todo: get related items from tests

                List <ID> processedItems = new List <ID>();

                foreach (Item relatedItem in relatedItems)
                {
                    IWorkflow relatedItemWorkflow = relatedItem.Database.WorkflowProvider.GetWorkflow(relatedItem);

                    if (relatedItemWorkflow == null)
                    {
                        // start the same workflow for the related item as the main item
                        dataItemWorkflow.Start(relatedItem);
                        relatedItemWorkflow = dataItemWorkflow;
                    }

                    if (relatedItemWorkflow.WorkflowID == dataItemWorkflow.WorkflowID &&
                        !processedItems.Contains(relatedItem.ID))
                    {
                        // only process related items in the same workflow as the main item
                        // if the related item already belongs to a different workflow, we'll ignore it
                        AdvanceWorkflow(args, dataItemWorkflowState, relatedItem, dataItemWorkflow);
                        processedItems.Add(relatedItem.ID);
                    }
                }
            }
        }
 public ItemWorkflowModel(Item i)
 {
     if (i != null)
     {
         _contextItem = i;
         _database = i.Database;
         if (_database != null)
         {
             _workflowProvider = _database.WorkflowProvider;
             if (_workflowProvider != null)
             {
                 _workflow = _workflowProvider.GetWorkflow(ContextItem);
                 if (_workflow != null)
                 {
                     _workflowState = _workflow.GetState(ContextItem);
                 }
             }
         }
     }
 }
Beispiel #11
0
 public ItemWorkflowModel(Item i)
 {
     if (i != null)
     {
         _contextItem = i;
         _database    = i.Database;
         if (_database != null)
         {
             _workflowProvider = _database.WorkflowProvider;
             if (_workflowProvider != null)
             {
                 _workflow = _workflowProvider.GetWorkflow(ContextItem);
                 if (_workflow != null)
                 {
                     _workflowState = _workflow.GetState(ContextItem);
                 }
             }
         }
     }
 }
Beispiel #12
0
        /// <summary>Gets the commands.</summary>
        /// <param name="items">The items to get commands for.</param>
        /// <param name="workflow">The workflow.</param>
        /// <param name="commands">The commands.</param>
        private static void GetCommands(Item[] items, out IWorkflow workflow, out WorkflowCommand[] commands)
        {
            Assert.ArgumentNotNull((object)items, "items");
            Item obj = items[0];

            if (obj != null)
            {
                IWorkflowProvider workflowProvider = Context.ContentDatabase.WorkflowProvider;
                if (workflowProvider != null && workflowProvider.GetWorkflows().Length > 0)
                {
                    workflow = workflowProvider.GetWorkflow(obj);
                    if (workflow != null && workflow.GetState(obj) != null)
                    {
                        commands = WorkflowFilterer.FilterVisibleCommands(workflow.GetCommands(obj), obj);
                        return;
                    }
                }
            }
            workflow = (IWorkflow)null;
            commands = (WorkflowCommand[])null;
        }
Beispiel #13
0
        public void Process(WorkflowPipelineArgs args)
        {
            // Item being workflowed
            Item      workflowItem = args.DataItem;
            IWorkflow wf           = this.master.WorkflowProvider.GetWorkflow(workflowItem);


            if (workflowItem.IsProjectItem())
            {
                // Move item to the project workflow
                using (new SecurityDisabler())
                {
                    workflowItem.Editing.BeginEdit();
                    workflowItem["__Workflow"]        = Data.ProjectWorkflow.ToString();
                    workflowItem["__Workflow state"]  = Data.ProjectWorkflowReadytoGoLiveState.ToString();
                    workflowItem["OrigionalWorkflow"] = wf.WorkflowID;
                    workflowItem.Editing.EndEdit();
                }

                wf = this.master.WorkflowProvider.GetWorkflow(Data.ProjectWorkflow.ToString());
                wf.Start(workflowItem);
            }
            else
            {
                // get current state
                var state = wf.GetState(workflowItem);
                var cmds  = wf.GetCommands(state.StateID);

                foreach (var cmd in cmds)
                {
                    if (cmd.SuppressComment)
                    {
                        wf.Execute(cmd.CommandID, workflowItem, "", false);
                        return;
                    }
                }
            }
            return;
        }
        private void SendAll(Message message)
        {
            IWorkflowProvider workflowProvider = Context.ContentDatabase.WorkflowProvider;

            if (workflowProvider != null)
            {
                string    workflowID = message["wf"];
                string    stateID    = message["ws"];
                IWorkflow workflow   = workflowProvider.GetWorkflow(workflowID);
                if (workflow != null)
                {
                    WorkflowState state    = workflow.GetState(stateID);
                    DataUri[]     items    = this.GetItems(state, workflow);
                    string        comments = (state != null) ? state.DisplayName : string.Empty;
                    bool          flag     = false;
                    foreach (DataUri uri in items)
                    {
                        Item item = Context.ContentDatabase.Items[uri];
                        if (item != null)
                        {
                            try
                            {
                                workflow.Execute(message["command"], item, comments, true, new object[0]);
                            }
                            catch (WorkflowStateMissingException)
                            {
                                flag = true;
                            }
                        }
                    }
                    if (flag)
                    {
                        SheerResponse.Alert("One or more items could not be processed because their workflow state does not specify the next step.", new string[0]);
                    }
                    Context.ClientPage.ClientResponse.SetLocation(string.Empty);
                }
            }
        }
Beispiel #15
0
        protected void Run(ClientPipelineArgs args)
        {
            Assert.ArgumentNotNull((object)args, "args");
            bool flag1 = args.IsPostBack;

            if (args.Parameters["checkmodified"] == "1")
            {
                if (!flag1)
                {
                    if (Context.ClientPage.Modified)
                    {
                        SheerResponse.CheckModified(true);
                        args.WaitForPostBack();
                        return;
                    }
                }
                else if (args.Result == "cancel")
                {
                    return;
                }
                args.Parameters["checkmodified"] = (string)null;
                flag1 = false;
            }
            string comments = string.Empty;
            bool   flag2    = StringUtil.GetString(new string[1]
            {
                args.Parameters["ui"]
            }) != "1";
            bool flag3 = StringUtil.GetString(new string[1]
            {
                args.Parameters["suppresscomment"]
            }) == "1";

            if (!flag1 && flag2 && !flag3)
            {
                SheerResponse.Input("Enter a comment:", "");
                args.WaitForPostBack();
            }
            else
            {
                if (flag1)
                {
                    if (args.Result == "null")
                    {
                        return;
                    }
                    comments = args.Result;
                }
                IWorkflowProvider workflowProvider = Sitecore.Client.ContentDatabase.WorkflowProvider;
                if (workflowProvider != null)
                {
                    IWorkflow workflow = workflowProvider.GetWorkflow(args.Parameters["workflowid"]);
                    if (workflow != null)
                    {
                        Item obj = Sitecore.Client.ContentDatabase.Items[args.Parameters["id"],
                                                                         Language.Parse(args.Parameters["language"]),
                                                                         Sitecore.Data.Version.Parse(args.Parameters["version"])];
                        if (obj != null)
                        {
                            var workflowState = workflow.GetState(obj);
                            var repository    = new WorxboxItemsRepository(workflow);
                            try
                            {
                                if (repository.IsWorxboxItem(workflowState, new DataUri(obj.Uri)) && repository.GetWorkflowCommandIDs().Any(x => x == ID.Parse(args.Parameters["commandid"])))
                                {
                                    var items =
                                        repository.GetWorxboxItems(
                                            repository.GetWorxboxWorkflowStates(workflow)
                                            .First(x => x.WorkflowCommands.Any(y => y.CommandID == args.Parameters["commandid"])), obj);
                                    foreach (var compositeItem in items)
                                    {
                                        var compositeWorkflowResult = workflow.Execute(args.Parameters["commandid"], compositeItem, comments, true);
                                        if (!compositeWorkflowResult.Succeeded)
                                        {
                                            if (!string.IsNullOrEmpty(compositeWorkflowResult.Message))
                                            {
                                                SheerResponse.Alert(compositeWorkflowResult.Message);
                                            }
                                        }
                                    }
                                }

                                WorkflowResult workflowResult = workflow.Execute(args.Parameters["commandid"], obj, comments, true);
                                if (!workflowResult.Succeeded)
                                {
                                    if (!string.IsNullOrEmpty(workflowResult.Message))
                                    {
                                        SheerResponse.Alert(workflowResult.Message);
                                    }
                                }
                            }
                            catch (WorkflowStateMissingException ex)
                            {
                                SheerResponse.Alert("One or more items could not be processed because their workflow state does not specify the next step.");
                            }
                        }
                    }
                }
                Context.ClientPage.SendMessage((object)this, "item:refresh");
                SheerResponse.Eval("window.top.location.reload();");
            }
        }
Beispiel #16
0
        /// <summary>
        /// Loads data for the Incremental Publish Queue report (includes all item languages). Utilizes Sitecore.Publishing.Pipelines.Publish.GetPublishQueue(PublishOptions) method as a source of data, then augments it based on item workflow state: only returns items in a final workflow state.
        /// </summary>
        /// <param name="languageCode">Language code to load. Default is "en". Must otherwise use fully-qualified language code (example: "ja-JP").</param>
        /// <returns>Enumerable of publish candidate items.</returns>
        public IEnumerable <PublishQueueItem> IncrementalPublishQueue_GetData()
        {
            Database masterDB             = Database.GetDatabase(Sitecore.Configuration.Settings.GetSetting("SitecoreSpark.SPRK.SourceDatabase"));
            Database webDB                = Database.GetDatabase(Sitecore.Configuration.Settings.GetSetting("SitecoreSpark.SPRK.TargetDatabase"));
            List <PublishQueueItem> model = new List <PublishQueueItem>();

            // Note on language: the actual publish pipeline uses the language parameter; it doesn't matter what we pass in for this usage
            PublishOptions options = new PublishOptions(masterDB, webDB, PublishMode.Incremental, Language.Parse("en"), DateTime.Now.AddDays(1));
            IEnumerable <PublishingCandidate> candidateList = PublishQueue.GetPublishQueue(options);

            if (candidateList != null && candidateList.Count() > 0)
            {
                foreach (PublishingCandidate candidate in candidateList)
                {
                    // Get detailed item information (including workflow info for inclusion/exclusion on report)
                    Item scItem = masterDB.GetItem(itemId: candidate.ItemId);

                    // If scItem is null, it likely means an item was deleted from 'master' before a publish (and still exists in the PublishQueue table); safe to ignore
                    if (scItem == null)
                    {
                        Sitecore.Diagnostics.Log.Warn($"[SPRK] PublishQueue item not found in '{masterDB.Name}' database: {candidate.ItemId}.", this);
                        continue;
                    }

                    // Check for all language versions (Workflow is shared, but Workflow State may be unique across languages)
                    foreach (Language language in scItem.Languages)
                    {
                        Item scLanguageItem = masterDB.GetItem(itemId: scItem.ID, language: language);

                        // Alt language versions do not automatically have a version number, so it's worth a check before proceeded
                        if (scLanguageItem.Versions.Count == 0)
                        {
                            continue;
                        }

                        IWorkflow itemWorkflow = masterDB.WorkflowProvider.GetWorkflow(scLanguageItem);

                        if (itemWorkflow == null)
                        {
                            continue;
                        }

                        WorkflowState state = itemWorkflow.GetState(scLanguageItem);

                        if (state != null && state.FinalState)
                        {
                            // Map to domain model
                            model.Add(new PublishQueueItem()
                            {
                                ItemID         = candidate.ItemId.Guid,
                                ItemName       = scItem.Name,
                                Language       = language.Name,
                                Action         = candidate.PublishAction.ToString(),
                                SourceDatabase = candidate.PublishOptions.SourceDatabase.Name,
                                TargetDatabase = candidate.PublishOptions.TargetDatabase.Name
                            });
                        }
                    }
                }
            }

            return(model);
        }