Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
daf0592d
Commit
daf0592d
authored
Apr 19, 2017
by
Luke "Jared" Bennett
Committed by
Clement Ho
Apr 19, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added and updated droplab docs
parent
40a97205
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
408 additions
and
0 deletions
+408
-0
doc/development/fe_guide/droplab/droplab.md
doc/development/fe_guide/droplab/droplab.md
+256
-0
doc/development/fe_guide/droplab/plugins/ajax.md
doc/development/fe_guide/droplab/plugins/ajax.md
+37
-0
doc/development/fe_guide/droplab/plugins/filter.md
doc/development/fe_guide/droplab/plugins/filter.md
+45
-0
doc/development/fe_guide/droplab/plugins/input_setter.md
doc/development/fe_guide/droplab/plugins/input_setter.md
+60
-0
doc/development/fe_guide/index.md
doc/development/fe_guide/index.md
+10
-0
No files found.
doc/development/fe_guide/droplab/droplab.md
0 → 100644
View file @
daf0592d
# DropLab
A generic dropdown for all of your custom dropdown needs.
## Usage
DropLab can be used by simply adding a
`data-dropdown-trigger`
HTML attribute.
This attribute allows us to find the "trigger" _(toggle)_ for the dropdown,
whether that is a button, link or input.
The value of the
`data-dropdown-trigger`
should be a CSS selector that
DropLab can use to find the trigger's dropdown list.
You should also add the
`data-dropdown`
attribute to declare the dropdown list.
The value is irrelevant.
The DropLab class has no side effects, so you must always call
`.init`
when
the DOM is ready.
`DropLab.prototype.init`
takes the same arguments as
`DropLab.prototype.addHook`
.
If you do not provide any arguments, it will globally query and instantiate all droplab compatible dropdowns.
```
html
<a
href=
"#"
data-dropdown-trigger=
"#list"
>
Toggle
</a>
<ul
id=
"list"
data-dropdown
>
<!-- ... -->
<ul>
```
```
js
const
droplab
=
new
DropLab
();
droplab
.
init
();
```
As you can see, we have a "Toggle" link, that is declared as a trigger.
It provides a selector to find the dropdown list it should control.
### Static data
You can add static list items.
```
html
<a
href=
"#"
data-dropdown-trigger=
"#list"
>
Toggle
</a>
<ul
id=
"list"
data-dropdown
>
<li>
Static value 1
</li>
<li>
Static value 2
</li>
<ul>
```
```
js
const
droplab
=
new
DropLab
();
droplab
.
init
();
```
### Explicit instantiation
You can pass the trigger and list elements as constructor arguments to return
a non-global instance of DropLab using the
`DropLab.prototype.init`
method.
```
html
<a
href=
"#"
id=
"trigger"
data-dropdown-trigger=
"#list"
>
Toggle
</a>
<ul
id=
"list"
data-dropdown
>
<!-- ... -->
<ul>
```
```
js
const
trigger
=
document
.
getElementById
(
'
trigger
'
);
const
list
=
document
.
getElementById
(
'
list
'
);
const
droplab
=
new
DropLab
();
droplab
.
init
(
trigger
,
list
);
```
You can also add hooks to an existing DropLab instance using
`DropLab.prototype.addHook`
.
```
html
<a
href=
"#"
data-dropdown-trigger=
"#auto-dropdown"
>
Toggle
</a>
<ul
id=
"auto-dropdown"
data-dropdown
>
<!-- ... -->
<ul>
<a
href=
"#"
id=
"trigger"
data-dropdown-trigger=
"#list"
>
Toggle
</a>
<ul
id=
"list"
data-dropdown
>
<!-- ... -->
<ul>
```
```
js
const
droplab
=
new
DropLab
();
droplab
.
init
();
const
trigger
=
document
.
getElementById
(
'
trigger
'
);
const
list
=
document
.
getElementById
(
'
list
'
);
droplab
.
addHook
(
trigger
,
list
);
```
### Dynamic data
Adding
`data-dynamic`
to your dropdown element will enable dynamic list rendering.
You can template a list item using the keys of the data object provided.
Use the handlebars syntax
`{{ value }}`
to HTML escape the value.
Use the
`<%= value %>`
syntax to simply interpolate the value.
Use the
`<%= value %>`
syntax to evaluate the value.
Passing an array of objects to
`DropLab.prototype.addData`
will render that data
for all
`data-dynamic`
dropdown lists tracked by that DropLab instance.
```
html
<a
href=
"#"
data-dropdown-trigger=
"#list"
>
Toggle
</a>
<ul
id=
"list"
data-dropdown
data-dynamic
>
<li><a
href=
"#"
data-id=
"{{id}}"
>
{{text}}
</a></li>
</ul>
```
```
js
const
droplab
=
new
DropLab
();
droplab
.
init
().
addData
([{
id
:
0
,
text
:
'
Jacob
'
,
},
{
id
:
1
,
text
:
'
Jeff
'
,
}]);
```
Alternatively, you can specify a specific dropdown to add this data to but passing
the data as the second argument and and the
`id`
of the trigger element as the first argument.
```
html
<a
href=
"#"
data-dropdown-trigger=
"#list"
id=
"trigger"
>
Toggle
</a>
<ul
id=
"list"
data-dropdown
data-dynamic
>
<li><a
href=
"#"
data-id=
"{{id}}"
>
{{text}}
</a></li>
</ul>
```
```
js
const
droplab
=
new
DropLab
();
droplab
.
init
().
addData
(
'
trigger
'
,
[{
id
:
0
,
text
:
'
Jacob
'
,
},
{
id
:
1
,
text
:
'
Jeff
'
,
}]);
```
This allows you to mix static and dynamic content with ease, even with one trigger.
Note the use of scoping regarding the
`data-dropdown`
attribute to capture both
dropdown lists, one of which is dynamic.
```
html
<input
id=
"trigger"
data-dropdown-trigger=
"#list"
>
<div
id=
"list"
data-dropdown
>
<ul>
<li><a
href=
"#"
>
Static item 1
</a></li>
<li><a
href=
"#"
>
Static item 2
</a></li>
</ul>
<ul
data-dynamic
>
<li><a
href=
"#"
data-id=
"{{id}}"
>
{{text}}
</a></li>
</ul>
</div>
```
```
js
const
droplab
=
new
DropLab
();
droplab
.
init
().
addData
(
'
trigger
'
,
[{
id
:
0
,
text
:
'
Jacob
'
,
},
{
id
:
1
,
text
:
'
Jeff
'
,
}]);
```
## Internal selectors
DropLab adds some CSS classes to help lower the barrier to integration.
For example,
*
The
`droplab-item-selected`
css class is added to items that have been selected
either by a mouse click or by enter key selection.
*
The
`droplab-item-active`
css class is added to items that have been selected
using arrow key navigation.
## Internal events
DropLab uses some custom events to help lower the barrier to integration.
For example,
*
The
`click.dl`
event is fired when an
`li`
list item has been clicked. It is also
fired when a list item has been selected with the keyboard. It is also fired when a
`HookButton`
button is clicked (a registered
`button`
tag or
`a`
tag trigger).
*
The
`input.dl`
event is fired when a
`HookInput`
(a registered
`input`
tag trigger) triggers an
`input`
event.
*
The
`mousedown.dl`
event is fired when a
`HookInput`
triggers a
`mousedown`
event.
*
The
`keyup.dl`
event is fired when a
`HookInput`
triggers a
`keyup`
event.
*
The
`keydown.dl`
event is fired when a
`HookInput`
triggers a
`keydown`
event.
These custom events add a
`detail`
object to the vanilla
`Event`
object that provides some potentially useful data.
## Plugins
Plugins are objects that are registered to be executed when a hook is added (when a droplab trigger and dropdown are instantiated).
If no modules API is detected, the library will fall back as it does with
`window.DropLab`
and will add
`window.DropLab.plugins.PluginName`
.
### Usage
To use plugins, you can pass them in an array as the third argument of
`DropLab.prototype.init`
or
`DropLab.prototype.addHook`
.
Some plugins require configuration values, the config object can be passed as the fourth argument.
```
html
<a
href=
"#"
id=
"trigger"
data-dropdown-trigger=
"#list"
>
Toggle
</a>
<ul
id=
"list"
data-dropdown
>
<!-- ... -->
<ul>
```
```
js
const
droplab
=
new
DropLab
();
const
trigger
=
document
.
getElementById
(
'
trigger
'
);
const
list
=
document
.
getElementById
(
'
list
'
);
droplab
.
init
(
trigger
,
list
,
[
droplabAjax
],
{
droplabAjax
:
{
endpoint
:
'
/some-endpoint
'
,
method
:
'
setData
'
,
},
});
```
### Documentation
*
[
Ajax plugin
](
plugins/ajax.md
)
*
[
Filter plugin
](
plugins/filter.md
)
*
[
InputSetter plugin
](
plugins/input_setter.md
)
### Development
When plugins are initialised for a droplab trigger+dropdown, DropLab will
call the plugins
`init`
function, so this must be implemented in the plugin.
```
js
class
MyPlugin
{
static
init
()
{
this
.
someProp
=
'
someProp
'
;
this
.
someMethod
();
}
static
someMethod
()
{
this
.
otherProp
=
'
otherProp
'
;
}
}
export
default
MyPlugin
;
```
doc/development/fe_guide/droplab/plugins/ajax.md
0 → 100644
View file @
daf0592d
# Ajax
`Ajax`
is a droplab plugin that allows for retrieving and rendering list data from a server.
## Usage
Add the
`Ajax`
object to the plugins array of a
`DropLab.prototype.init`
or
`DropLab.prototype.addHook`
call.
`Ajax`
requires 2 config values, the
`endpoint`
and
`method`
.
*
`endpoint`
should be a URL to the request endpoint.
*
`method`
should be
`setData`
or
`addData`
.
*
`setData`
completely replaces the dropdown with the response data.
*
`addData`
appends the response data to the current dropdown list.
```
html
<a
href=
"#"
id=
"trigger"
data-dropdown-trigger=
"#list"
>
Toggle
</a>
<ul
id=
"list"
data-dropdown
>
<!-- ... -->
<ul>
```
```
js
const
droplab
=
new
DropLab
();
const
trigger
=
document
.
getElementById
(
'
trigger
'
);
const
list
=
document
.
getElementById
(
'
list
'
);
droplab
.
addHook
(
trigger
,
list
,
[
Ajax
],
{
Ajax
:
{
endpoint
:
'
/some-endpoint
'
,
method
:
'
setData
'
,
},
});
```
Optionally you can set
`loadingTemplate`
to a HTML string. This HTML string will
replace the dropdown list whilst the request is pending.
Additionally, you can set
`onError`
to a function to catch any XHR errors.
doc/development/fe_guide/droplab/plugins/filter.md
0 → 100644
View file @
daf0592d
# Filter
`Filter`
is a plugin that allows for filtering data that has been added
to the dropdown using a simple fuzzy string search of an input value.
## Usage
Add the
`Filter`
object to the plugins array of a
`DropLab.prototype.init`
or
`DropLab.prototype.addHook`
call.
*
`Filter`
requires a config value for
`template`
.
*
`template`
should be the key of the objects within your data array that you want to compare
to the user input string, for filtering.
```
html
<input
href=
"#"
id=
"trigger"
data-dropdown-trigger=
"#list"
>
<ul
id=
"list"
data-dropdown
data-dynamic
>
<li><a
href=
"#"
data-id=
"{{id}}"
>
{{text}}
</a></li>
<ul>
```
```
js
const
droplab
=
new
DropLab
();
const
trigger
=
document
.
getElementById
(
'
trigger
'
);
const
list
=
document
.
getElementById
(
'
list
'
);
droplab
.
init
(
trigger
,
list
,
[
Filter
],
{
Filter
:
{
template
:
'
text
'
,
},
});
droplab
.
addData
(
'
trigger
'
,
[{
id
:
0
,
text
:
'
Jacob
'
,
},
{
id
:
1
,
text
:
'
Jeff
'
,
}]);
```
Above, the input string will be compared against the
`test`
key of the passed data objects.
Optionally you can set
`filterFunction`
to a function. This function will be used instead
of
`Filter`
's built in string search.
`filterFunction`
is passed 2 arguments, the first
is one of the data objects, the second is the current input value.
doc/development/fe_guide/droplab/plugins/input_setter.md
0 → 100644
View file @
daf0592d
# InputSetter
`InputSetter`
is a plugin that allows for udating DOM out of the scope of droplab when a list item is clicked.
## Usage
Add the
`InputSetter`
object to the plugins array of a
`DropLab.prototype.init`
or
`DropLab.prototype.addHook`
call.
*
`InputSetter`
requires a config value for
`input`
and
`valueAttribute`
.
*
`input`
should be the DOM element that you want to manipulate.
*
`valueAttribute`
should be a string that is the name of an attribute on your list items that is used to get the value
to update the
`input`
element with.
You can also set the
`InputSetter`
config to an array of objects, which will allow you to update multiple elements.
```
html
<input
id=
"input"
value=
""
>
<div
id=
"div"
data-selected-id=
""
></div>
<input
href=
"#"
id=
"trigger"
data-dropdown-trigger=
"#list"
>
<ul
id=
"list"
data-dropdown
data-dynamic
>
<li><a
href=
"#"
data-id=
"{{id}}"
>
{{text}}
</a></li>
<ul>
```
```
js
const
droplab
=
new
DropLab
();
const
trigger
=
document
.
getElementById
(
'
trigger
'
);
const
list
=
document
.
getElementById
(
'
list
'
);
const
input
=
document
.
getElementById
(
'
input
'
);
const
div
=
document
.
getElementById
(
'
div
'
);
droplab
.
init
(
trigger
,
list
,
[
InputSetter
],
{
InputSetter
:
[{
input
:
input
,
valueAttribute
:
'
data-id
'
,
}
{
input
:
div
,
valueAttribute
:
'
data-id
'
,
inputAttribute
:
'
data-selected-id
'
,
}],
});
droplab
.
addData
(
'
trigger
'
,
[{
id
:
0
,
text
:
'
Jacob
'
,
},
{
id
:
1
,
text
:
'
Jeff
'
,
}]);
```
Above, if the second list item was clicked, it would update the
`#input`
element
to have a
`value`
of
`1`
, it would also update the
`#div`
element's
`data-selected-id`
to
`1`
.
Optionally you can set
`inputAttribute`
to a string that is the name of an attribute on your
`input`
element that you want to update.
If you do not provide an
`inputAttribute`
,
`InputSetter`
will update the
`value`
of the
`input`
element if it is an
`INPUT`
element,
or the
`textContent`
of the
`input`
element if it is not an
`INPUT`
element.
doc/development/fe_guide/index.md
View file @
daf0592d
...
@@ -90,3 +90,13 @@ Our accessibility standards and resources.
...
@@ -90,3 +90,13 @@ Our accessibility standards and resources.
[
scss-lint
]:
https://github.com/brigade/scss-lint
[
scss-lint
]:
https://github.com/brigade/scss-lint
[
install
]:
../../install/installation.md#4-node
[
install
]:
../../install/installation.md#4-node
[
requirements
]:
../../install/requirements.md#supported-web-browsers
[
requirements
]:
../../install/requirements.md#supported-web-browsers
---
## [DropLab](droplab/droplab.md)
Our internal
`DropLab`
dropdown library.
*
[
DropLab
](
droplab/droplab.md
)
*
[
Ajax plugin
](
droplab/plugins/ajax.md
)
*
[
Filter plugin
](
droplab/plugins/filter.md
)
*
[
InputSetter plugin
](
droplab/plugins/input_setter.md
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment