#1 2sxc Toolbar Customization
2sxc Toolbar Customization
Since you can do so many things customizing the toolbar, we created a bunch of small examples for you. Note that we are basically providing a list of commands how the toolbar should be modified.
Important: Normally only editors see these toolbars, so clicking on the buttons won't work, except for the ellipsis (…).
The toolbars would usually only appear on hover, but the Tutorial runs in Demo-Mode so you can see them right away. The old samples still only work on hover.
Hover over the various boxes to see the result - like this:
Basic Toolbars Without Special Configuration
⬇️ Result | Source ➡️
2dm AppCode.Tutorial.Sys
Add two buttons
@inherits Custom.Hybrid.Razor14
<h1>2dm @DynamicModel.Sys</h1>
<div class="alert alert-light"
@Kit.Toolbar.Default(Content).Edit().New()>
<h3>Add two buttons </h3>
</div>
⬇️ Result | Source ➡️
New syntax (tweak):
Add new
button with colors
(string):
Add new
button with colors
(object):
Add new
button with colors
@inherits Custom.Hybrid.Razor14
<div class="alert alert-light"
@Kit.Toolbar.Default().New(tweak: b=>b.Color("pink,black"))
.For(Content)>
<h3>New syntax (tweak):
Add <code>new</code> button with colors
</h3>
</div>
<div class="alert alert-light"
@Kit.Toolbar.Default(Content).New(ui:"color=pink,black")>
<h3>(string):
Add <code>new</code> button with colors
</h3>
</div>
<div class="alert alert-light"
@Kit.Toolbar.Default(Content).New(ui: new {
color = "blue,white"
})>
<h3>(object):
Add <code>new</code> button with colors
</h3>
</div>
⬇️ Result | Source ➡️
New tweak syntax:
Add new
at the end of button-list
Add new
at the end of button-list
@inherits Custom.Hybrid.Razor14
<div class="alert alert-light"
@Kit.Toolbar.Default().New(tweak: b=>b.Position(-1))
.For(Content)>
<h3>New <em>tweak</em> syntax:
Add <code>new</code> at the end of button-list
</h3>
</div>
<div class="alert alert-light"
@Kit.Toolbar.Default(Content).New(ui: "pos=-1")>
<h3>Add <code>new</code>
at the end of button-list
</h3>
</div>
@inherits Custom.Hybrid.Razor14
@{
var moreButtonToolbar = Kit.Toolbar.Default().Settings(autoAddMore:"never");
}
<div class="alert alert-light" @moreButtonToolbar
.For(Content)>
<h3>Remove <code>more</code> button</h3>
</div>
⬇️ Result | Source ➡️
Use empty toolbar template and add
edit
@inherits Custom.Hybrid.Razor14
<div class="alert alert-light"
@Kit.Toolbar.Empty(Content).Edit()>
<h3>Use empty toolbar template and add
<code>edit</code>
</h3>
</div>
Add Buttons with SVG Icons (v14.08+)
We've introduced a new feature to allow custom SVG icons for buttons.
⬇️ Result | Source ➡️
(tweak): Button with SVG Icon
(only): Button with SVG Icon and color
(tweak): Button with SVG Icon
(only): Button with SVG Icon and color
@inherits Custom.Hybrid.Razor14
@{
// icon from https://fonts.google.com/icons?icon.query=func
var svgIcon = "<svg xmlns='http://www.w3.org/2000/svg' height='48' width='48'><path d='M12 40v-3.15L25.75 24 12 11.15V8h24v5H19.8l11.75 11L19.8 35H36v5Z'/></svg>";
}
<div class="alert alert-light"
@Kit.Toolbar.Empty().New(tweak: b=>b.Icon(svgIcon)).For(Content)>
<h3>(tweak): Button with SVG Icon </h3>
</div>
<div class="alert alert-light"
@Kit.Toolbar.Empty().New(tweak: b=>b.Icon(svgIcon).Color("darkgreen"))
.For(Content)>
<h3>(only): Button with SVG Icon and color </h3>
</div>
@{
var uiWithSvgIcon = new {
Icon = svgIcon
};
}
<div class="alert alert-light"
@Kit.Toolbar.Empty(Content).New(ui: uiWithSvgIcon)>
<h3>(tweak): Button with SVG Icon </h3>
</div>
@{
// icon from https://fonts.google.com/icons?icon.query=func
var uiSvgIconColored = new {
Icon = svgIcon,
color = "darkgreen"
};
}
<div class="alert alert-light"
@Kit.Toolbar.Empty(Content).New(ui: uiSvgIconColored)>
<h3>(only): Button with SVG Icon and color </h3>
</div>
We've introduced a new feature to allow add notes to buttons - which we'll demo with the new info button. Mouse over it to see the effect.
⬇️ Result | Source ➡️
New syntax (tweak):
Button with SVG Icon
@inherits Custom.Hybrid.Razor14
@{
var toolbarWithInfoAndNotes = Kit.Toolbar.Empty()
.Info(link: "https://www.2sxc.org/",
tweak: b=>b.Note("This is a post-it info. Click to visit 2sxc.org",
background: "yellow"))
.New(tweak: b=>b.Note("This is a cool note"))
.For(Content);
}
<div class="alert alert-light"
@toolbarWithInfoAndNotes>
<h3>New syntax (tweak):
Button with SVG Icon
</h3>
</div>
Modify a button
When we modify a button, we don't add one, but change the look or behavior of an existing button.
⬇️ Result | Source ➡️
(tweak): Edit button is now red
Edit button is now red
@inherits Custom.Hybrid.Razor14
<div class="alert alert-light"
@Kit.Toolbar.Default().Edit("-").Edit(tweak: b=>b.Color("red"))
.For(Content)>
<h3>(tweak): Edit button is now red</h3>
</div>
<div class="alert alert-light"
@Kit.Toolbar.Default().Edit("-")
.Edit(ui:"color=red").For(Content)>
<h3>Edit button is now red</h3>
</div>
⬇️ Result | Source ➡️
(tweak): New BlogPost
is red,
Category
is green
New BlogPost
is red,
Category
is green
@inherits Custom.Hybrid.Razor14
@{
var categoryButtonsTweak = Kit.Toolbar.Default()
.New("BlogPost",
tweak: b=>b.Color("red").Tooltip("Blog-Post"))
.New("Category",
tweak: b=>b.Color("green").Tooltip("Category"));
}
<div class="alert alert-light"
@categoryButtonsTweak.For(Content)>
<h3>(tweak): New <code>BlogPost</code> is red,
<code>Category</code> is green
</h3>
</div>
@{
var categoryButtonsToolbar = Kit.Toolbar.Default()
.New("BlogPost",
ui:"color=red&title=Blog-Post")
.New("Category",
ui:"color=green&title=Category");
}
<div class="alert alert-light"
@categoryButtonsToolbar.For(Content)>
<h3>New <code>BlogPost</code> is red,
<code>Category</code> is green
</h3>
</div>
⬇️ Result | Source ➡️
Always show Delete
Note that you'll have to hit the
ellipsis a few times to see it.
@inherits Custom.Hybrid.Razor14
<div class="alert alert-light"
@Kit.Toolbar.Default().Delete().For(Content)>
<h3>Always show <code>Delete</code></h3>
<p>Note that you'll have to hit the
ellipsis a few times to see it.
</p>
</div>
Ways to provide the ui
, parameters
, prefill
Most buttons can have a ui
and a parameters
parameter. Some also have a prefill
. In simple cases you will just use a string to configure this, but in more advanced cases it's easier to use an object.
Objects and strings can also be merged with other objects and strings. A good reason to do this is to prepare a complex ui/parameters/prefill object, and then use it in a loop where you may want small differences in the buttons of each toolbar.
Note that all the following examples use the ui
parameter as it's easy to see the effect. But the behavior is the same for parameters
and prefill
.
⬇️ Result | Source ➡️
ui
as inline string
ui
as string variable for reuse
ui
as string for reuse and merge
Mouse over the buttons to see how we
use/merge to ui configurations
@inherits Custom.Hybrid.Razor14
<div class="alert alert-light"
@Kit.Toolbar.Empty(Content).New(ui: "color=orange")>
<h3><code>ui</code> as inline string </h3>
</div>
@{ var uiReuse = "color=magenta"; }
<div class="alert alert-light"
@Kit.Toolbar.Empty(Content).Edit(ui: uiReuse).New(ui: uiReuse)>
<h3><code>ui</code> as string variable for reuse</h3>
</div>
@{
var uiShared = "color=magenta&title=Default Title";
var uiMerged = new object[] {
uiShared, "title=Modified Title"
};
}
<div class="alert alert-light"
@Kit.Toolbar.Empty(Content).Edit(ui: uiShared).New(ui: uiMerged)>
<h3><code>ui</code> as string for reuse and merge</h3>
<p>Mouse over the buttons to see how we
use/merge to ui configurations
</p>
</div>
⬇️ Result | Source ➡️
ui
as inline object
ui
as prepared object
ui
as prepared object merged with other object
@inherits Custom.Hybrid.Razor14
<div class="alert alert-light"
@Kit.Toolbar.Empty(Content).New(ui: new { color = "orange"})>
<h3><code>ui</code> as inline object </h3>
</div>
@{
var uiPrepared = new {
Icon = "<svg xmlns='http://www.w3.org/2000/svg' height='24px' viewBox='0 0 24 24' width='24px' fill='#000000'><path d='M0 0h24v24H0z' fill='none'/><path d='M9 21c0 .55.45 1 1 1h4c.55 0 1-.45 1-1v-1H9v1zm3-19C8.14 2 5 5.14 5 9c0 2.38 1.19 4.47 3 5.74V17c0 .55.45 1 1 1h6c.55 0 1-.45 1-1v-2.26c1.81-1.27 3-3.36 3-5.74 0-3.86-3.14-7-7-7zm2.85 11.1l-.85.6V16h-4v-2.3l-.85-.6C7.8 12.16 7 10.63 7 9c0-2.76 2.24-5 5-5s5 2.24 5 5c0 1.63-.8 3.16-2.15 4.1z'/></svg>",
Color = "orange",
Title = "This is the prepared object"
};
}
<div class="alert alert-light"
@Kit.Toolbar.Empty(Content).New(ui: uiPrepared)>
<h3><code>ui</code> as prepared object </h3>
</div>
@{
// this uses uiPrepared from the previous example
var uiObjMerged = new object[] { uiPrepared, new { Color ="purple"}};
}
<div class="alert alert-light"
@Kit.Toolbar.Empty(Content).New(ui: uiPrepared).New(ui: uiObjMerged)>
<h3><code>ui</code> as prepared object merged with other object</h3>
</div>
Data Buttons with Filters
Data
buttons open the management view with a list of items to manage. You will often want to filter what to open - like only open items which have a certain property or have one of 3 tags.
Important: These samples show how to do it, but it won't work in anonymous mode. To see it in full action, you will need to install the tutorial and test it logged in as Admin.
⬇️ Result | Source ➡️
Data
button with string
filter
(tweak)
This will find all books with the title
Good Omens
Data
button with string
filter
This will find all books with the title
Good Omens
Data
button with object
filter
This will find all books with the title
Good Omens
@inherits Custom.Hybrid.Razor14
<div class="alert alert-light"
@Kit.Toolbar.Empty().Data("Books", tweak: b=>b.Filter("Title", "Good Omens"))>
<h3><code>Data</code> button with <em>string</em>
<code>filter</code> (tweak)
</h3>
<p>This will find all books with the title
<em>Good Omens</em>
</p>
</div>
<div class="alert alert-light"
@Kit.Toolbar.Empty().Data("Books", filter: "Title=Good Omens")>
<h3><code>Data</code> button with <em>string</em>
<code>filter</code>
</h3>
<p>This will find all books with the title
<em>Good Omens</em>
</p>
</div>
<div class="alert alert-light"
@Kit.Toolbar.Empty().Data("Books", filter: new { Title = "Good Omens" })>
<h3><code>Data</code> button with <em>object</em>
<code>filter</code>
</h3>
<p>This will find all books with the title
<em>Good Omens</em>
</p>
</div>
⬇️ Result | Source ➡️
Data
buttons returning books which has any of 3 authors
Many Data
buttons each filtering for one related author
@inherits Custom.Hybrid.Razor14
@{
var firstThreeAuthorIds = AsList(App.Data["Persons"])
.Select(author => author.EntityId)
.Take(3)
.ToArray();
var toolbarTop3 = Kit.Toolbar.Empty()
.Data("Books", filter: new
{ Authors = firstThreeAuthorIds }
);
}
<div class="alert alert-light" @toolbarTop3>
<h3><code>Data</code>
buttons returning books which has any of 3 authors
</h3>
</div>
@{
var authorsToolbar = Kit.Toolbar.Empty();
foreach (var auth in AsList(App.Data["Persons"])) {
authorsToolbar = authorsToolbar.Data("Books",
ui: new { Title = "Books by "
+ auth.FirstName
+ " "
+ auth.LastName},
filter: new { Authors = new int[]
{ auth.EntityId }
}
);
}
}
<div class="alert alert-light" @authorsToolbar>
<h3>Many <code>Data</code>
buttons each filtering for one related author
</h3>
</div>
Error Showing Content - please login as admin for details.
Error Showing Content - please login as admin for details.
Error Showing Content - please login as admin for details.
Error Showing Content - please login as admin for details.