コード例 #1
0
ファイル: Site.cs プロジェクト: Azsaturndx/arhmexicoadm
 public virtual string ReplaceStaticPlaceholder(string name, AttributeDictionary attributes, string defaultContent)
 {
     return(null);
 }
コード例 #2
0
ファイル: Site.cs プロジェクト: Azsaturndx/arhmexicoadm
        protected virtual void InitializeSiteMaster()
        {
            _isTouchUI = ApplicationServices.IsTouchClient;
            var html           = string.Empty;
            var siteMasterPath = "~/site.desktop.html";

            if (_isTouchUI)
            {
                siteMasterPath = "~/site.touch.html";
            }
            siteMasterPath = Server.MapPath(siteMasterPath);
            if (!(File.Exists(siteMasterPath)))
            {
                siteMasterPath = Server.MapPath("~/site.html");
            }
            if (File.Exists(siteMasterPath))
            {
                html = File.ReadAllText(siteMasterPath);
            }
            else
            {
                throw new Exception("File site.html has not been found.");
            }
            var htmlMatch = Regex.Match(html, "<html(?\'HtmlAttr\'[\\S\\s]*?)>\\s*<head(?\'HeadAttr\'[\\S\\s]*?)>\\s*(?\'Head\'[\\S\\s]*?)\\s*<" +
                                        "/head>\\s*<body(?\'BodyAttr\'[\\S\\s]*?)>\\s*(?\'Body\'[\\S\\s]*?)\\s*</body>\\s*</html>\\s*");

            if (!htmlMatch.Success)
            {
                throw new Exception("File site.html must contain \'head\' and \'body\' elements.");
            }
            // instructions
            Controls.Add(new LiteralControl(html.Substring(0, htmlMatch.Index)));
            // html
            Controls.Add(new LiteralControl(string.Format("<html{0} xml:lang={1} lang=\"{1}\">\r\n", htmlMatch.Groups["HtmlAttr"].Value, CultureInfo.CurrentUICulture.IetfLanguageTag)));
            // head
            Controls.Add(new HtmlHead());
            if (_isTouchUI)
            {
                Header.Controls.Add(new LiteralControl("<meta charset=\"utf-8\">\r\n"));
            }
            else
            {
                Header.Controls.Add(new LiteralControl("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\r\n"));
            }
            var headHtml = Regex.Replace(htmlMatch.Groups["Head"].Value, "\\s*<title([\\s\\S+]*?title>)\\s*", string.Empty);

            Header.Controls.Add(new LiteralControl(headHtml));
            _headContent = new LiteralContainer();
            Header.Controls.Add(_headContent);
            // body
            _bodyTag        = new LiteralControl();
            _bodyAttributes = new AttributeDictionary(htmlMatch.Groups["BodyAttr"].Value);
            Controls.Add(_bodyTag);
            var themePath = Server.MapPath("~/App_Themes/arhmexico");

            if (Directory.Exists(themePath))
            {
                foreach (var stylesheetFileName in Directory.GetFiles(themePath, "*.css"))
                {
                    var fileName = Path.GetFileName(stylesheetFileName);
                    if (!(fileName.Equals("_Theme_DarkKnight.css")))
                    {
                        var link = new HtmlLink();
                        link.Href = ("~/App_Themes/arhmexico/" + fileName);
                        link.Attributes["type"] = "text/css";
                        link.Attributes["rel"]  = "stylesheet";
                        Header.Controls.Add(link);
                    }
                }
            }
            // form
            Controls.Add(new HtmlForm());
            Form.ID = "aspnetForm";
            // ScriptManager
            var sm = new ScriptManager();

            sm.ID = "sm";
            sm.AjaxFrameworkMode = AjaxFrameworkMode.Disabled;
            if (AquariumExtenderBase.EnableCombinedScript)
            {
                sm.EnableScriptLocalization = false;
            }
            sm.ScriptMode = ScriptMode.Release;
            Form.Controls.Add(sm);
            // SiteMapDataSource
            var siteMapDataSource1 = new SiteMapDataSource();

            siteMapDataSource1.ID = "SiteMapDataSource1";
            siteMapDataSource1.ShowStartingNode = false;
            Form.Controls.Add(siteMapDataSource1);
            // parse and initialize placeholders
            var body             = htmlMatch.Groups["Body"].Value;
            var placeholderMatch = Regex.Match(body, "<div\\s+data-role\\s*=\\s*\"placeholder\"(?\'Attributes\'[\\s\\S]+?)>\\s*(?\'DefaultContent\'" +
                                               "[\\s\\S]*?)\\s*</div>");
            var startPos = 0;

            while (placeholderMatch.Success)
            {
                var attributes = new AttributeDictionary(placeholderMatch.Groups["Attributes"].Value);
                // create placeholder content
                Form.Controls.Add(new LiteralControl(body.Substring(startPos, (placeholderMatch.Index - startPos))));
                var placeholder    = attributes["data-placeholder"];
                var defaultContent = placeholderMatch.Groups["DefaultContent"].Value;
                if (!(CreatePlaceholder(Form.Controls, placeholder, defaultContent, attributes)))
                {
                    var placeholderControl = new LiteralContainer();
                    placeholderControl.Text = defaultContent;
                    Form.Controls.Add(placeholderControl);
                    if (placeholder == "page-header")
                    {
                        _pageHeaderContent = placeholderControl;
                    }
                    if (placeholder == "page-title")
                    {
                        _pageTitleContent = placeholderControl;
                    }
                    if (placeholder == "page-side-bar")
                    {
                        _pageSideBarContent = placeholderControl;
                    }
                    if (placeholder == "page-content")
                    {
                        _pageContent = placeholderControl;
                    }
                    if (placeholder == "page-footer")
                    {
                        _pageFooterContent = placeholderControl;
                    }
                }
                startPos         = (placeholderMatch.Index + placeholderMatch.Length);
                placeholderMatch = placeholderMatch.NextMatch();
            }
            if (startPos < body.Length)
            {
                Form.Controls.Add(new LiteralControl(body.Substring(startPos)));
            }
            // end body
            Controls.Add(new LiteralControl("\r\n</body>\r\n"));
            // end html
            Controls.Add(new LiteralControl("\r\n</html>\r\n"));
        }
コード例 #3
0
ファイル: Site.cs プロジェクト: Azsaturndx/arhmexicoadm
 protected virtual bool CreatePlaceholder(ControlCollection container, string placeholder, string defaultContent, AttributeDictionary attributes)
 {
     if (placeholder == "membership-bar")
     {
         var mb = new MembershipBar();
         mb.ID = "mb";
         if (attributes["data-display-remember-me"] == "false")
         {
             mb.DisplayRememberMe = false;
         }
         if (attributes["data-remember-me-set"] == "true")
         {
             mb.RememberMeSet = true;
         }
         if (attributes["data-display-password-recovery"] == "false")
         {
             mb.DisplayPasswordRecovery = false;
         }
         if (attributes["data-display-sign-up"] == "false")
         {
             mb.DisplaySignUp = false;
         }
         if (attributes["data-display-my-account"] == "false")
         {
             mb.DisplayMyAccount = false;
         }
         if (attributes["data-display-help"] == "false")
         {
             mb.DisplayHelp = false;
         }
         if (attributes["data-display-login"] == "false")
         {
             mb.DisplayLogin = false;
         }
         if (!(string.IsNullOrEmpty(attributes["data-idle-user-timeout"])))
         {
             mb.IdleUserTimeout = Convert.ToInt32(attributes["data-idle-user-timeout"]);
         }
         if (attributes["data-enable-history"] == "true")
         {
             mb.EnableHistory = true;
         }
         if (attributes["data-enable-permalinks"] == "true")
         {
             mb.EnablePermalinks = true;
         }
         container.Add(mb);
         return(true);
     }
     if (placeholder == "menu-bar")
     {
         var menuDiv = new HtmlGenericControl();
         menuDiv.TagName             = "div";
         menuDiv.ID                  = "PageMenuBar";
         menuDiv.Attributes["class"] = "PageMenuBar";
         container.Add(menuDiv);
         var menu = new MenuExtender();
         menu.ID                = "Menu1";
         menu.DataSourceID      = "SiteMapDataSource1";
         menu.TargetControlID   = menuDiv.ID;
         menu.HoverStyle        = ((MenuHoverStyle)(TypeDescriptor.GetConverter(typeof(MenuHoverStyle)).ConvertFromString(attributes.ValueOf("data-hover-style", "Auto"))));
         menu.PopupPosition     = ((MenuPopupPosition)(TypeDescriptor.GetConverter(typeof(MenuPopupPosition)).ConvertFromString(attributes.ValueOf("data-popup-position", "Left"))));
         menu.ShowSiteActions   = (attributes["data-show-site-actions"] == "true");
         menu.PresentationStyle = ((MenuPresentationStyle)(TypeDescriptor.GetConverter(typeof(MenuPresentationStyle)).ConvertFromString(attributes.ValueOf("data-presentation-style", "MultiLevel"))));
         container.Add(menu);
         return(true);
     }
     if (placeholder == "site-map-path")
     {
         var siteMapPath1 = new SiteMapPath();
         siteMapPath1.ID       = "SiteMapPath1";
         siteMapPath1.CssClass = "SiteMapPath";
         siteMapPath1.PathSeparatorStyle.CssClass = "PathSeparator";
         siteMapPath1.CurrentNodeStyle.CssClass   = "CurrentNode";
         siteMapPath1.NodeStyle.CssClass          = "Node";
         siteMapPath1.RootNodeStyle.CssClass      = "RootNode";
         container.Add(siteMapPath1);
         return(true);
     }
     return(false);
 }
コード例 #4
0
ファイル: Site.cs プロジェクト: Azsaturndx/arhmexicoadm
        protected string PreparePrefetch(string content)
        {
            string output = null;

            if (!(string.IsNullOrEmpty(Request.Url.Query)) || (Request.Headers["X-Cot-Manifest-Request"] == "true"))
            {
                return(output);
            }
            var token = ApplicationServices.TryGetJsonProperty(ApplicationServices.Current.DefaultSettings, "ui.history.dataView");
            var supportGridPrefetch = ((token != null) && !(Regex.IsMatch(((string)(token)), "\\b(search|sort|group|filter)\\b")));
            var prefetches          = new List <string>();
            var prefetch            = false;
            var dataViews           = new List <Tuple <string, AttributeDictionary> >();

            foreach (Match m in Regex.Matches(content, "<div\\s+(id=\"(?\'Id\'\\w+)\")\\s+(?\'Props\'data-controller.*?)>"))
            {
                dataViews.Add(new Tuple <string, AttributeDictionary>(m.Groups["Id"].Value, new AttributeDictionary(m.Groups["Props"].Value)));
            }
            if (dataViews.Count == 1)
            {
                prefetch = true;
            }
            else
            {
                // LEGACY MASTER DETAIL PAGE SUPPORT
                //
                //
                // 1. convert text of containers into single container with single dataview referring to virtual dashboard controller
                //
                // <div data-flow="row">
                //   <div id="view1" data-controller="Dashboards" data-view="form1" data-show-action-buttons="none"></div>
                //
                // </div>
                //
                // 2. produce response for this controller.
                // a. standalone data views become data view fields of the virtual controller
                // b. the layout of the page is optionally converted into form1 layout of the virtual controller
                // c. render json response of virtual controller with layout in it
                //
            }
            if (prefetch)
            {
                for (var i = 0; (i < dataViews.Count); i++)
                {
                    var dataView   = dataViews[i];
                    var dataViewId = dataView.Item1;
                    var attrs      = dataView.Item2;
                    foreach (var p in UnsupportedDataViewProperties)
                    {
                        if (attrs.ContainsKey(p))
                        {
                            return(output);
                        }
                    }
                    var    controllerName = attrs["data-controller"];
                    string viewId         = null;
                    string tags           = null;
                    attrs.TryGetValue("data-tags", out tags);
                    var c = Controller.CreateConfigurationInstance(GetType(), controllerName);
                    if (!(attrs.TryGetValue("data-view", out viewId)))
                    {
                        viewId = ((string)(c.Evaluate("string(/c:dataController/c:views/c:view[1]/@id)")));
                    }
                    var viewNav = c.SelectSingleNode("/c:dataController/c:views/c:view[@id=\'{0}\']", viewId);
                    if (!Context.User.Identity.IsAuthenticated && !((viewNav.GetAttribute("access", string.Empty) == "Public")))
                    {
                        return(output);
                    }
                    string roles = null;
                    if (attrs.TryGetValue("data-roles", out roles) && !(new ControllerUtilities().UserIsInRole(roles.Split(','))))
                    {
                        return(output);
                    }
                    tags = (tags
                            + (" " + viewNav.GetAttribute("tags", string.Empty)));
                    var isForm = (viewNav.GetAttribute("type", string.Empty) == "Form");
                    if (isForm)
                    {
                        _summaryDisabled = true;
                    }
                    if (!(Regex.IsMatch(tags, "\\bprefetch-data-none\\b")) && (supportGridPrefetch || isForm))
                    {
                        var request = new PageRequest(-1, 30, null, null);
                        request.Controller      = controllerName;
                        request.View            = viewId;
                        request.Tag             = tags;
                        request.ContextKey      = dataViewId;
                        request.SupportsCaching = true;
                        if (attrs.ContainsKey("data-search-on-start"))
                        {
                            request.DoesNotRequireData = true;
                        }
                        var response = ControllerFactory.CreateDataController().GetPage(request.Controller, request.View, request);
                        var result   = string.Format("{{ \"d\": {0} }}", ApplicationServices.CompressViewPageJsonOutput(JsonConvert.SerializeObject(response)));
                        prefetches.Add(string.Format("<script type=\"application/json\" id=\"_{0}_prefetch\">{1}</script>", dataViewId, Regex.Replace(result, "(<(/?\\s*script)(\\s|>))", "]_[$2$3]^[", RegexOptions.IgnoreCase)));
                        if (isForm)
                        {
                            foreach (var field in response.Fields)
                            {
                                if (string.IsNullOrEmpty(field.DataViewFilterFields) && (field.Type == "DataView"))
                                {
                                    var fieldAttr = new AttributeDictionary(string.Empty);
                                    fieldAttr.Add("data-controller", field.DataViewController);
                                    fieldAttr.Add("data-view", field.DataViewId);
                                    fieldAttr.Add("data-tags", field.Tag);
                                    if (field.DataViewSearchOnStart)
                                    {
                                        fieldAttr.Add("data-search-on-start", "true");
                                    }
                                    dataViews.Add(new Tuple <string, AttributeDictionary>(string.Format("{0}_{1}", dataViewId, field.Name), fieldAttr));
                                }
                            }
                        }
                    }
                }
            }
            if (prefetches.Count > 0)
            {
                output = string.Join(string.Empty, prefetches);
            }
            return(output);
        }