protected void Run(ClientPipelineArgs args)
        {
            Assert.ArgumentNotNull(args, "args");

            if (!args.IsPostBack)
            {
                SheerResponse.Input("Name: ", "New Prefab", "New Prefab");
                args.WaitForPostBack();
            }
            else if (args.HasResult)
            {
                var name = args.Result;

                var pageId      = args.Parameters["id"];
                var uniqueId    = args.Parameters["referenceId"];
                var renderingId = args.Parameters["renderingId"];

                var db = Client.ContentDatabase;

                LayoutDefinition layoutDefinition = GetCurrentLayoutDefinition();
                var deviceId = WebEditUtil.GetClientDeviceId();

                if (layoutDefinition == null || ID.IsNullOrEmpty(deviceId))
                {
                    SheerResponse.Alert("Action failed. Unable to find presentation details.");
                    return;
                }

                var deviceRenderings = layoutDefinition?.GetDevice(deviceId.ToString());
                if (deviceRenderings?.Renderings == null)
                {
                    SheerResponse.Alert("Action failed. Unable to find current device.");
                    return;
                }

                var index = GetIndex(deviceRenderings, uniqueId);
                if (index == -1)
                {
                    SheerResponse.Alert("Action failed. Unable to find selected rendering");
                    return;
                }

                var item = UIUtil.GetItemFromQueryString(db);

                // Create prefab
                var prefab = _prefabService.CreatePrefab(name, deviceRenderings, index, item);

                SheerResponse.Alert("Prefab Created");

                if (Config.Sxa.IsEnabled) // reload so toolbox shows new prefab
                {
                    SheerResponse.Eval("window.parent.location.reload();");
                }

                // TODO: Go Edit Prefab?
                return;
            }
        }
        private Item GetDatasourceItem(string referenceId, Item item)
        {
            Assert.ArgumentNotNull(referenceId, "referenceId");
            Assert.ArgumentNotNull(item, "item");
            string str2 = WebEditUtil.ConvertJSONLayoutToXML(WebUtil.GetFormValue("scLayout"));

            Assert.IsNotNull(str2, "xmlLayout");
            LayoutDefinition definition = LayoutDefinition.Parse(str2);
            ID clientDeviceId           = WebEditUtil.GetClientDeviceId();

            Assert.IsNotNull(clientDeviceId, "deviceId");
            RenderingDefinition renderingByUniqueId = definition.GetDevice(clientDeviceId.ToString()).GetRenderingByUniqueId(referenceId);

            Assert.IsNotNull(renderingByUniqueId, "rendering");
            RenderingReference reference = new RenderingReference(renderingByUniqueId, item.Language, item.Database);

            if (!string.IsNullOrEmpty(reference.Settings.DataSource))
            {
                return(item.Database.GetItem(reference.Settings.DataSource));
            }
            return(null);
        }