Skip to content

Commit

Permalink
Extended RequireJsOptions
Browse files Browse the repository at this point in the history
- RequireJsOptions can be modified from views
- Options serialization moved to _RequireSetup.cshtml
  • Loading branch information
stefanprodan committed Aug 29, 2013
1 parent 0301208 commit 62d3416
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 11 deletions.
6 changes: 5 additions & 1 deletion RequireJsNet.Docs/Views/Home/Index.cshtml
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
@{
@using System.Activities.Expressions
@{
ViewBag.Title = "RequireJS for .NET";

//Add RequireJS Page options directly from view via ViewBag
ViewBag.PageOptions.Add("newViewOpt", "test");
}

@section featured {
Expand Down
6 changes: 4 additions & 2 deletions RequireJsNet.Docs/Views/Shared/_RequireSetup.cshtml
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
@using RequireJS
@{
var entryPointPath = Html.RequireJsEntryPoint();
var pageOptions = new MvcHtmlString(RequireJsOptions.ConvertToJsObject(ViewBag.PageOptions));
var websiteOptions = new MvcHtmlString(RequireJsOptions.ConvertToJsObject(ViewBag.GlobalOptions));
}

@if(entryPointPath != null)
{
<script type="text/javascript">
var requireConfig = {
pageOptions: @ViewBag.PageOptions,
globalOptions: @ViewBag.WebsiteOptions
pageOptions: @pageOptions,
websiteOptions: @websiteOptions
};
var require = {
Expand Down
67 changes: 59 additions & 8 deletions RequireJsNet/RequireJsOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,18 +42,56 @@ public void Add(string key, object value, RequireJsOptionsScope scope = RequireJ
{
pageOptions.Remove(key);
}
pageOptions.Add(key, JsonConvert.SerializeObject(value));
pageOptions.Add(key, value);
break;
case RequireJsOptionsScope.Global:
if (globalOptions.Keys.Contains(key))
{
globalOptions.Remove(key);
}
globalOptions.Add(key, JsonConvert.SerializeObject(value));
globalOptions.Add(key, value);
break;
}
}

public void Add(string key, Dictionary<string, object> value, RequireJsOptionsScope scope = RequireJsOptionsScope.Page, bool clearExisting = false)
{
var dictToModify = new Dictionary<string, object>();
switch (scope)
{
case RequireJsOptionsScope.Page:
dictToModify = pageOptions;
break;
case RequireJsOptionsScope.Global:
dictToModify = globalOptions;
break;
}

var existing = dictToModify.FirstOrDefault(r => r.Key == key).Value;
if (existing != null)
{
if (!clearExisting && existing is Dictionary<string, object>)
{
AppendItems(existing as Dictionary<string, object>, value);
}
else
{
dictToModify.Remove(key);
dictToModify.Add(key, value);
}
}
else
{
dictToModify.Add(key, value);
}
}

public object GetByKey(string key, RequireJsOptionsScope scope)
{
return scope == RequireJsOptionsScope.Page ? pageOptions.FirstOrDefault(r => r.Key == key)
: globalOptions.FirstOrDefault(r => r.Key == key);
}

public void Clear(RequireJsOptionsScope scope)
{
switch (scope)
Expand All @@ -79,33 +117,46 @@ public void Save(RequireJsOptionsScope scope)
switch (scope)
{
case RequireJsOptionsScope.Page:
controller.ViewBag.PageOptions = new MvcHtmlString(ConvertToJsObject(pageOptions));
controller.ViewBag.PageOptions = pageOptions;
break;
case RequireJsOptionsScope.Global:
controller.ViewBag.WebsiteOptions = new MvcHtmlString(ConvertToJsObject(globalOptions));
controller.ViewBag.GlobalOptions = globalOptions;
break;
}
}

public void SaveAll()
{
controller.ViewBag.PageOptions = new MvcHtmlString(ConvertToJsObject(pageOptions));
controller.ViewBag.WebsiteOptions = new MvcHtmlString(ConvertToJsObject(globalOptions));
Save(RequireJsOptionsScope.Global);
Save(RequireJsOptionsScope.Page);
}

private static string ConvertToJsObject(Dictionary<string, object> options)
public static string ConvertToJsObject(Dictionary<string, object> options)
{
var config = new StringBuilder();

config.Append("{");
foreach (var item in options)
{
config.AppendFormat(" {0}: {1}{2} ", item.Key, item.Value, options.Last().Equals(item) ? "" : ",");
config.AppendFormat(" {0}: {1}{2} ", item.Key, JsonConvert.SerializeObject(item.Value), options.Last().Equals(item) ? "" : ",");
}
config.Append("}");
return config.ToString();
}

private void AppendItems(Dictionary<string, object> to, Dictionary<string, object> from)
{
foreach (var item in from)
{
var existing = to.FirstOrDefault(r => item.Key == r.Key).Value;
if (existing != null)
{
to.Remove(item.Key);
}
to.Add(item.Key, item.Value);
}
}

}

public enum RequireJsOptionsScope
Expand Down

0 comments on commit 62d3416

Please sign in to comment.