Пример #1
0
        private void SynchronizeMacroProperties(Type typeUserControl, Macro macro)
        {
            // first delete all macro properties
            macro.Properties.ToList().ForEach(mp => mp.Delete());

            List <MacroPropertyType> allPropertyTypes = MacroPropertyType.GetAll;

            // foreach property marked with MacroParameter create an macro parameter
            foreach (PropertyInfo propInfo in typeUserControl.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
            {
                MacroParameterAttribute macroParamAttr = Util.GetAttribute <MacroParameterAttribute>(propInfo);

                if (macroParamAttr == null)
                {
                    // if property is not given attribute MacroParameterAttribute try to create default one based on property type
                    macroParamAttr = this.GetDefaultMacroParameterAttribute(propInfo);
                    if (macroParamAttr == null)
                    {
                        // if default attribute cannot be created (e.g. if property type is DateTime)
                        // skip creating this macro parameter
                        continue;
                    }
                }

                string macroParamName  = string.IsNullOrEmpty(macroParamAttr.Name) ? propInfo.Name : macroParamAttr.Name;
                string macroParamAlias = propInfo.Name;

                MacroProperty.MakeNew(macro, macroParamAttr.Show, macroParamAlias, macroParamName,
                                      allPropertyTypes.First(mpt => mpt.Alias.ToLower() == macroParamAttr.Type.ToString().ToLower()));
            }
        }
Пример #2
0
        public void Can_Add_Remove_Macro_Properties()
        {
            // Arrange
            var provider = TestObjects.GetScopeProvider(Logger);

            using (var scope = provider.CreateScope())
            {
                var repository = new MacroRepository((IScopeAccessor)provider, AppCaches.Disabled, Mock.Of <ILogger>());

                var macro = new Macro("newmacro", "A new macro", "~/views/macropartials/test1.cshtml", MacroTypes.PartialView);
                var prop1 = new MacroProperty("blah1", "New1", 4, "test.editor");
                var prop2 = new MacroProperty("blah2", "New2", 3, "test.editor");

                //add/remove a few to test the collection observable
                macro.Properties.Add(prop1);
                macro.Properties.Add(prop2);
                macro.Properties.Remove(prop1);
                macro.Properties.Remove("blah2");
                macro.Properties.Add(prop2);

                repository.Save(macro);

                // Assert
                var result = repository.Get(macro.Id);

                Assert.AreEqual(1, result.Properties.Values.Count());
                Assert.AreEqual("blah2", result.Properties.Values.Single().Alias);
            }
        }
Пример #3
0
        public void macroPropertyCreate(object sender, EventArgs e)
        {
            TextBox      macroPropertyAliasNew = (TextBox)((Control)sender).Parent.FindControl("macroPropertyAliasNew");
            TextBox      macroPropertyNameNew  = (TextBox)((Control)sender).Parent.FindControl("macroPropertyNameNew");
            DropDownList macroPropertyTypeNew  = (DropDownList)((Control)sender).Parent.FindControl("macroPropertyTypeNew");
            bool         _goAhead = true;

            if (macroPropertyAliasNew.Text !=
                ui.Text("general", "new", this.getUser()) + " " + ui.Text("general", "alias", this.getUser()))
            {
                foreach (cms.businesslogic.macro.MacroProperty mp in m_macro.Properties)
                {
                    if (mp.Alias == macroPropertyAliasNew.Text)
                    {
                        _goAhead = false;
                        break;
                    }
                }

                if (_goAhead)
                {
                    MacroProperty mp = new MacroProperty();
                    mp.Macro  = m_macro;
                    mp.Public = true;
                    mp.Type   = new MacroPropertyType(int.Parse(macroPropertyTypeNew.SelectedValue));
                    mp.Alias  = macroPropertyAliasNew.Text;
                    mp.Name   = macroPropertyNameNew.Text;
                    mp.Save();

                    m_macro.RefreshProperties();
                    macroPropertyBind();
                }
            }
        }
Пример #4
0
        public void Can_Add_Remove_Macro_Properties()
        {
            // Arrange
            IScopeProvider provider = ScopeProvider;

            using (provider.CreateScope())
            {
                var repository = new MacroRepository((IScopeAccessor)provider, AppCaches.Disabled, _logger, ShortStringHelper);

                var macro = new Macro(ShortStringHelper, "newmacro", "A new macro", "~/views/macropartials/test1.cshtml");
                var prop1 = new MacroProperty("blah1", "New1", 4, "test.editor");
                var prop2 = new MacroProperty("blah2", "New2", 3, "test.editor");

                // add/remove a few to test the collection observable
                macro.Properties.Add(prop1);
                macro.Properties.Add(prop2);
                macro.Properties.Remove(prop1);
                macro.Properties.Remove("blah2");
                macro.Properties.Add(prop2);

                repository.Save(macro);

                // Assert
                IMacro result = repository.Get(macro.Id);

                Assert.AreEqual(1, result.Properties.Values.Count());
                Assert.AreEqual("blah2", result.Properties.Values.Single().Alias);
            }
        }
        public void Can_Add_Remove_Macro_Properties()
        {
            // Arrange
            var provider   = new PetaPocoUnitOfWorkProvider(Logger);
            var unitOfWork = provider.GetUnitOfWork();

            using (var repository = new MacroRepository(unitOfWork, CacheHelper.CreateDisabledCacheHelper(), Mock.Of <ILogger>(), SqlSyntax))
            {
                var macro = new Macro("newmacro", "A new macro", "~/usercontrol/test1.ascx", "MyAssembly1", "test1.xslt", "~/views/macropartials/test1.cshtml");
                var prop1 = new MacroProperty("blah1", "New1", 4, "test.editor");
                var prop2 = new MacroProperty("blah2", "New2", 3, "test.editor");

                //add/remove a few to test the collection observable
                macro.Properties.Add(prop1);
                macro.Properties.Add(prop2);
                macro.Properties.Remove(prop1);
                macro.Properties.Remove("blah2");
                macro.Properties.Add(prop2);

                repository.AddOrUpdate(macro);
                unitOfWork.Commit();

                // Assert
                var result = repository.Get(macro.Id);

                Assert.AreEqual(1, result.Properties.Count());
                Assert.AreEqual("blah2", result.Properties.Single().Alias);
            }
        }
Пример #6
0
        protected void Button1_Click(object sender, System.EventArgs e)
        {
            string result = "";

            // Get the macro object
            umbraco.cms.businesslogic.macro.Macro macroObject =
                new umbraco.cms.businesslogic.macro.Macro(Convert.ToInt32(Request.QueryString["macroID"]));

            // Load all macroPropertyTypes
            Hashtable macroPropertyTypes = new Hashtable();
            Hashtable macroPropertyIds   = new Hashtable();

            //            SqlDataReader dr = SqlHelper.ExecuteReader(_ConnString, CommandType.Text, "select id, macroPropertyTypeBaseType, macroPropertyTypeAlias from cmsMacroPropertyType");
            List <MacroPropertyType> macroPropTypes = MacroPropertyType.GetAll;

            foreach (MacroPropertyType mpt in macroPropTypes)
            {
                macroPropertyIds.Add(mpt.Alias, mpt.Id.ToString());

                macroPropertyTypes.Add(mpt.Alias, mpt.BaseType);
            }
            //            dr.Close();

            foreach (ListItem li in MacroProperties.Items)
            {
                if (li.Selected && !macrohasProperty(macroObject, li.Text.Substring(0, li.Text.IndexOf(" ")).ToLower()))
                {
                    result += "<li>Added: " + spaceCamelCasing(li.Text) + "</li>";
                    string _macroPropertyTypeAlias = findMacroType(macroPropertyTypes, li.Value);
                    if (_macroPropertyTypeAlias == "")
                    {
                        _macroPropertyTypeAlias = "text";
                    }
                    object propertyId = macroPropertyIds[_macroPropertyTypeAlias];
                    if (propertyId != null)
                    {
                        int macroPropertyTypeId = 0;
                        if (int.TryParse(string.Format("{0}", propertyId), out macroPropertyTypeId))
                        {
                            MacroProperty.MakeNew(macroObject,
                                                  true,
                                                  li.Text.Substring(0, li.Text.IndexOf(" ")),
                                                  spaceCamelCasing(li.Text),
                                                  macroPropTypes.Find(delegate(MacroPropertyType mpt) { return(mpt.Id == macroPropertyTypeId); }));
                        }
                    }
                }
                else if (li.Selected)
                {
                    result += "<li>Skipped: " + spaceCamelCasing(li.Text) + " (already exists as a parameter)</li>";
                }
            }
            ChooseProperties.Visible = false;
            ConfigProperties.Visible = true;
            resultLiteral.Text       = result;
        }
Пример #7
0
        protected void Button1_Click(object sender, EventArgs e)
        {
            var result = "";

            // Get the macro object
            var macroObject = new Macro(Convert.ToInt32(Request.QueryString["macroID"]));

            // Load all macroPropertyTypes
            var macroPropertyTypes = new Hashtable();
            var macroPropertyIds   = new Hashtable();

            var macroPropTypes = MacroPropertyType.GetAll;

            foreach (var mpt in macroPropTypes)
            {
                macroPropertyIds.Add(mpt.Alias, mpt.Id.ToString());

                macroPropertyTypes.Add(mpt.Alias, mpt.BaseType);
            }

            foreach (ListItem li in MacroProperties.Items)
            {
                if (li.Selected && !MacroHasProperty(macroObject, li.Text.Substring(0, li.Text.IndexOf(" ")).ToLower()))
                {
                    result += "<li>Added: " + SpaceCamelCasing(li.Text) + "</li>";
                    var macroPropertyTypeAlias = FindMacroType(macroPropertyTypes, li.Value);
                    if (macroPropertyTypeAlias == "")
                    {
                        macroPropertyTypeAlias = "text";
                    }
                    var propertyId = macroPropertyIds[macroPropertyTypeAlias];
                    if (propertyId != null)
                    {
                        var macroPropertyTypeId = 0;
                        if (int.TryParse(string.Format("{0}", propertyId), out macroPropertyTypeId))
                        {
                            MacroProperty.MakeNew(macroObject,
                                                  true,
                                                  li.Text.Substring(0, li.Text.IndexOf(" ")),
                                                  SpaceCamelCasing(li.Text),
                                                  macroPropTypes.Find(mpt => mpt.Id == macroPropertyTypeId));
                        }
                    }
                }
                else if (li.Selected)
                {
                    result += "<li>Skipped: " + SpaceCamelCasing(li.Text) + " (already exists as a parameter)</li>";
                }
            }
            ChooseProperties.Visible = false;
            ConfigProperties.Visible = true;
            resultLiteral.Text       = result;
        }
Пример #8
0
        public void Macro_Make_New_Add_Property()
        {
            var m = Macro.MakeNew(Guid.NewGuid().ToString("N"));

            Assert.IsTrue(m.Id > 0);
            Assert.IsInstanceOfType(m, typeof(Macro));

            //now, add a property...

            //get the first macro property type we can find
            var mpt = MacroPropertyType.GetAll.First();
            var mp  = MacroProperty.MakeNew(m, false, Guid.NewGuid().ToString("N"), Guid.NewGuid().ToString("N"), mpt);

            Assert.IsTrue(mp.Id > 0);
            Assert.IsInstanceOfType(mp, typeof(MacroProperty));

            m.Delete();

            //make sure the property is gone
            var props = MacroProperty.GetProperties(m.Id);

            Assert.IsFalse(props.Select(x => x.Id).Contains(mp.Id));

            var isfound = false;

            try
            {
                var asdf = new Macro(m.Id);
                isfound = true;
            }
            catch (ArgumentException)
            {
                isfound = false;
            }

            Assert.IsFalse(isfound);
        }
Пример #9
0
        protected void Page_Load(object sender, EventArgs e)
        {
            m_macro = new Macro(Convert.ToInt32(Request.QueryString["macroID"]));

            if (!IsPostBack)
            {
                ClientTools
                .SetActiveTreeType(TreeDefinitionCollection.Instance.FindTree <loadMacros>().Tree.Alias)
                .SyncTree("-1,init," + m_macro.Id.ToString(), false);

                macroName.Text  = m_macro.Name;
                macroAlias.Text = m_macro.Alias;
                string tempMacroAssembly = m_macro.Assembly == null ? "" : m_macro.Assembly;
                string tempMacroType     = m_macro.Type == null ? "" : m_macro.Type;
                macroXslt.Text   = m_macro.Xslt;
                macroPython.Text = m_macro.ScriptingFile;
                cachePeriod.Text = m_macro.RefreshRate.ToString();

                macroRenderContent.Checked = m_macro.RenderContent;
                macroEditor.Checked        = m_macro.UseInEditor;
                cacheByPage.Checked        = m_macro.CacheByPage;
                cachePersonalized.Checked  = m_macro.CachePersonalized;

                // Populate either user control or custom control
                if (tempMacroType != string.Empty && tempMacroAssembly != string.Empty)
                {
                    macroAssembly.Text = tempMacroAssembly;
                    macroType.Text     = tempMacroType;
                }
                else
                {
                    macroUserControl.Text = tempMacroType;
                }

                // Check for assemblyBrowser
                if (tempMacroType.IndexOf(".ascx") > 0)
                {
                    assemblyBrowserUserControl.Controls.Add(
                        new LiteralControl("<br/><button onClick=\"UmbClientMgr.openModalWindow('" + umbraco.IO.IOHelper.ResolveUrl(umbraco.IO.SystemDirectories.Umbraco) + "/developer/macros/assemblyBrowser.aspx?fileName=" + macroUserControl.Text +
                                           "&macroID=" + m_macro.Id.ToString() +
                                           "', 'Browse Properties', true, 475,500); return false;\" class=\"guiInputButton\"><img src=\"../../images/editor/propertiesNew.gif\" align=\"absmiddle\" style=\"width: 18px; height: 17px; padding-right: 5px;\"/> Browse properties</button>"));
                }
                else if (tempMacroType != string.Empty && tempMacroAssembly != string.Empty)
                {
                    assemblyBrowser.Controls.Add(
                        new LiteralControl("<br/><button onClick=\"UmbClientMgr.openModalWindow('" + umbraco.IO.IOHelper.ResolveUrl(umbraco.IO.SystemDirectories.Umbraco) + "/developer/macros/assemblyBrowser.aspx?fileName=" + macroAssembly.Text +
                                           "&macroID=" + m_macro.Id.ToString() + "&type=" + macroType.Text +
                                           "', 'Browse Properties', true, 475,500); return false\" class=\"guiInputButton\"><img src=\"../../images/editor/propertiesNew.gif\" align=\"absmiddle\" style=\"width: 18px; height: 17px; padding-right: 5px;\"/> Browse properties</button>"));
                }

                // Load elements from macro
                macroPropertyBind();

                // Load xslt files from default dir
                populateXsltFiles();

                // Load python files from default dir
                populatePythonFiles();

                // Load usercontrols
                populateUserControls(IOHelper.MapPath(SystemDirectories.Usercontrols));
                userControlList.Items.Insert(0, new ListItem("Browse usercontrols on server...", string.Empty));
                userControlList.Attributes.Add("onChange",
                                               "document.getElementById('" + macroUserControl.ClientID + "').value = this[this.selectedIndex].value;");
            }
            else
            {
                int    macroID           = Convert.ToInt32(Request.QueryString["macroID"]);
                string tempMacroAssembly = macroAssembly.Text;
                string tempMacroType     = macroType.Text;
                string tempCachePeriod   = cachePeriod.Text;

                if (tempCachePeriod == string.Empty)
                {
                    tempCachePeriod = "0";
                }

                if (tempMacroAssembly == string.Empty && macroUserControl.Text != string.Empty)
                {
                    tempMacroType = macroUserControl.Text;
                }

                // Save macro
                m_macro.UseInEditor       = macroEditor.Checked;
                m_macro.RenderContent     = macroRenderContent.Checked;
                m_macro.CacheByPage       = cacheByPage.Checked;
                m_macro.CachePersonalized = cachePersonalized.Checked;
                m_macro.RefreshRate       = Convert.ToInt32(tempCachePeriod);
                m_macro.Alias             = macroAlias.Text;
                m_macro.Name          = macroName.Text;
                m_macro.Assembly      = tempMacroAssembly;
                m_macro.Type          = tempMacroType;
                m_macro.Xslt          = macroXslt.Text;
                m_macro.ScriptingFile = macroPython.Text;
                m_macro.Save();

                // Save elements
                foreach (RepeaterItem item in macroProperties.Items)
                {
                    HtmlInputHidden macroPropertyID   = (HtmlInputHidden)item.FindControl("macroPropertyID");
                    TextBox         macroElementName  = (TextBox)item.FindControl("macroPropertyName");
                    TextBox         macroElementAlias = (TextBox)item.FindControl("macroPropertyAlias");
                    CheckBox        macroElementShow  = (CheckBox)item.FindControl("macroPropertyHidden");
                    DropDownList    macroElementType  = (DropDownList)item.FindControl("macroPropertyType");

                    MacroProperty mp = new MacroProperty(int.Parse(macroPropertyID.Value));
                    mp.Type  = new MacroPropertyType(int.Parse(macroElementType.SelectedValue));
                    mp.Alias = macroElementAlias.Text;
                    mp.Name  = macroElementName.Text;
                    mp.Save();
                }
                // Flush macro from cache!
                if (UmbracoSettings.UseDistributedCalls)
                {
                    dispatcher.Refresh(
                        new Guid("7B1E683C-5F34-43dd-803D-9699EA1E98CA"),
                        macroID);
                }
                else
                {
                    macro.GetMacro(macroID).removeFromCache();
                }

                base.speechBubble(speechBubbleIcon.save, "Macro saved", "");


                // Check for assemblyBrowser
                if (tempMacroType.IndexOf(".ascx") > 0)
                {
                    assemblyBrowserUserControl.Controls.Add(
                        new LiteralControl("<br/><button onClick=\"UmbClientMgr.openModalWindow('developer/macros/assemblyBrowser.aspx?fileName=" + macroUserControl.Text +
                                           "&macroID=" + Request.QueryString["macroID"] +
                                           "', 'Browse Properties', true, 500, 475); return false\" class=\"guiInputButton\"><img src=\"../../images/editor/propertiesNew.gif\" align=\"absmiddle\" style=\"width: 18px; height: 17px; padding-right: 5px;\"/> Browse properties</button>"));
                }
                else if (tempMacroType != string.Empty && tempMacroAssembly != string.Empty)
                {
                    assemblyBrowser.Controls.Add(
                        new LiteralControl("<br/><button onClick=\"UmbClientMgr.openModalWindow('developer/macros/assemblyBrowser.aspx?fileName=" + macroAssembly.Text +
                                           "&macroID=" + Request.QueryString["macroID"] + "&type=" + macroType.Text +
                                           "', 'Browse Properties', true, 500, 475); return false\" class=\"guiInputButton\"><img src=\"../../images/editor/propertiesNew.gif\" align=\"absmiddle\" style=\"width: 18px; height: 17px; padding-right: 5px;\"/> Browse properties</button>"));
                }
            }
        }
Пример #10
0
 public void MacroProperty_Not_Found_Constructor()
 {
     MacroProperty u = new MacroProperty(-1111);
 }
Пример #11
0
        protected void Page_Load(object sender, EventArgs e)
        {
            m_macro = new Macro(Convert.ToInt32(Request.QueryString["macroID"]));

            if (!IsPostBack)
            {
                ClientTools
                .SetActiveTreeType(TreeDefinitionCollection.Instance.FindTree <loadMacros>().Tree.Alias)
                .SyncTree("-1,init," + m_macro.Id.ToString(), false);

                string tempMacroAssembly = m_macro.Assembly ?? "";
                string tempMacroType     = m_macro.Type ?? "";

                PopulateFieldsOnLoad(m_macro, tempMacroAssembly, tempMacroType);

                // Check for assemblyBrowser
                if (tempMacroType.IndexOf(".ascx") > 0)
                {
                    assemblyBrowserUserControl.Controls.Add(
                        new LiteralControl("<br/><button onClick=\"UmbClientMgr.openModalWindow('" + IOHelper.ResolveUrl(SystemDirectories.Umbraco) + "/developer/macros/assemblyBrowser.aspx?fileName=" + macroUserControl.Text +
                                           "&macroID=" + m_macro.Id.ToString() +
                                           "', 'Browse Properties', true, 475,500); return false;\" class=\"guiInputButton\"><img src=\"../../images/editor/propertiesNew.gif\" align=\"absmiddle\" style=\"width: 18px; height: 17px; padding-right: 5px;\"/> Browse properties</button>"));
                }
                else if (tempMacroType != string.Empty && tempMacroAssembly != string.Empty)
                {
                    assemblyBrowser.Controls.Add(
                        new LiteralControl("<br/><button onClick=\"UmbClientMgr.openModalWindow('" + IOHelper.ResolveUrl(SystemDirectories.Umbraco) + "/developer/macros/assemblyBrowser.aspx?fileName=" + macroAssembly.Text +
                                           "&macroID=" + m_macro.Id.ToString() + "&type=" + macroType.Text +
                                           "', 'Browse Properties', true, 475,500); return false\" class=\"guiInputButton\"><img src=\"../../images/editor/propertiesNew.gif\" align=\"absmiddle\" style=\"width: 18px; height: 17px; padding-right: 5px;\"/> Browse properties</button>"));
                }

                // Load elements from macro
                macroPropertyBind();

                // Load xslt files from default dir
                PopulateXsltFiles();

                // Load python files from default dir
                PopulatePythonFiles();

                // Load usercontrols
                PopulateUserControls(IOHelper.MapPath(SystemDirectories.UserControls));
                userControlList.Items.Insert(0, new ListItem("Browse usercontrols on server...", string.Empty));
            }
            else
            {
                int macroID = Convert.ToInt32(Request.QueryString["macroID"]);

                ClientTools
                .SetActiveTreeType(TreeDefinitionCollection.Instance.FindTree <loadMacros>().Tree.Alias)
                .SyncTree("-1,init," + m_macro.Id.ToString(), true);     //true forces the reload

                string tempMacroAssembly = macroAssembly.Text;
                string tempMacroType     = macroType.Text;
                string tempCachePeriod   = cachePeriod.Text;
                if (tempCachePeriod == string.Empty)
                {
                    tempCachePeriod = "0";
                }
                if (tempMacroAssembly == string.Empty && macroUserControl.Text != string.Empty)
                {
                    tempMacroType = macroUserControl.Text;
                }

                SetMacroValuesFromPostBack(m_macro, Convert.ToInt32(tempCachePeriod), tempMacroAssembly, tempMacroType);

                m_macro.Save();

                // Save elements
                foreach (RepeaterItem item in macroProperties.Items)
                {
                    HtmlInputHidden macroPropertyID   = (HtmlInputHidden)item.FindControl("macroPropertyID");
                    TextBox         macroElementName  = (TextBox)item.FindControl("macroPropertyName");
                    TextBox         macroElementAlias = (TextBox)item.FindControl("macroPropertyAlias");
                    CheckBox        macroElementShow  = (CheckBox)item.FindControl("macroPropertyHidden");
                    DropDownList    macroElementType  = (DropDownList)item.FindControl("macroPropertyType");

                    MacroProperty mp = new MacroProperty(int.Parse(macroPropertyID.Value));
                    mp.Type  = new MacroPropertyType(int.Parse(macroElementType.SelectedValue));
                    mp.Alias = macroElementAlias.Text;
                    mp.Name  = macroElementName.Text;
                    mp.Save();
                }

                ClientTools.ShowSpeechBubble(speechBubbleIcon.save, "Macro saved", "");


                // Check for assemblyBrowser
                if (tempMacroType.IndexOf(".ascx") > 0)
                {
                    assemblyBrowserUserControl.Controls.Add(
                        new LiteralControl("<br/><button onClick=\"UmbClientMgr.openModalWindow('developer/macros/assemblyBrowser.aspx?fileName=" + macroUserControl.Text +
                                           "&macroID=" + Request.QueryString["macroID"] +
                                           "', 'Browse Properties', true, 500, 475); return false\" class=\"guiInputButton\"><img src=\"../../images/editor/propertiesNew.gif\" align=\"absmiddle\" style=\"width: 18px; height: 17px; padding-right: 5px;\"/> Browse properties</button>"));
                }
                else if (tempMacroType != string.Empty && tempMacroAssembly != string.Empty)
                {
                    assemblyBrowser.Controls.Add(
                        new LiteralControl("<br/><button onClick=\"UmbClientMgr.openModalWindow('developer/macros/assemblyBrowser.aspx?fileName=" + macroAssembly.Text +
                                           "&macroID=" + Request.QueryString["macroID"] + "&type=" + macroType.Text +
                                           "', 'Browse Properties', true, 500, 475); return false\" class=\"guiInputButton\"><img src=\"../../images/editor/propertiesNew.gif\" align=\"absmiddle\" style=\"width: 18px; height: 17px; padding-right: 5px;\"/> Browse properties</button>"));
                }
            }
        }