diff --git a/packages/oui-angular/src/index.js b/packages/oui-angular/src/index.js
index 2b5f6d77..c32f6756 100644
--- a/packages/oui-angular/src/index.js
+++ b/packages/oui-angular/src/index.js
@@ -14,6 +14,7 @@ import Field from "@ovh-ui/oui-field";
import FormActions from "@ovh-ui/oui-form-actions";
import GuideMenu from "@ovh-ui/oui-guide-menu";
import HeaderTabs from "@ovh-ui/oui-header-tabs";
+import InlineAdder from "@ovh-ui/oui-inline-adder";
import Message from "@ovh-ui/oui-message";
import Modal from "@ovh-ui/oui-modal";
import Navbar from "@ovh-ui/oui-navbar";
@@ -53,6 +54,7 @@ export default angular
FormActions,
GuideMenu,
HeaderTabs,
+ InlineAdder,
Message,
Modal,
Navbar,
diff --git a/packages/oui-angular/src/index.spec.js b/packages/oui-angular/src/index.spec.js
index ed8ea126..67b46a72 100644
--- a/packages/oui-angular/src/index.spec.js
+++ b/packages/oui-angular/src/index.spec.js
@@ -16,6 +16,7 @@ loadTests(require.context("../../oui-field/src/", true, /.*((\.spec)|(index))$/)
loadTests(require.context("../../oui-form-actions/src/", true, /.*((\.spec)|(index))$/));
loadTests(require.context("../../oui-guide-menu/src/", true, /.*((\.spec)|(index))$/));
loadTests(require.context("../../oui-header-tabs/src/", true, /.*((\.spec)|(index))$/));
+loadTests(require.context("../../oui-inline-adder/src/", true, /.*((\.spec)|(index))$/));
loadTests(require.context("../../oui-message/src/", true, /.*((\.spec)|(index))$/));
loadTests(require.context("../../oui-modal/src/", true, /.*((\.spec)|(index))$/));
loadTests(require.context("../../oui-navbar/src/", true, /.*((\.spec)|(index))$/));
diff --git a/packages/oui-calendar/README.md b/packages/oui-calendar/README.md
index c223aac9..0d54e3cd 100644
--- a/packages/oui-calendar/README.md
+++ b/packages/oui-calendar/README.md
@@ -61,6 +61,17 @@
```
+### Enabling time
+
+Use `enable-time` to show time selection after a date is selected.
+
+```html:preview
+
+
+```
+
+**Note**: See [Flatpickr documentation](https://flatpickr.js.org/examples/#time-picker) for more information.
+
### Disabling dates
Use `disable-date` to make certain dates unavailable for selection.
@@ -168,7 +179,7 @@ Use `mode` to set a different selection mode for the calendar
| `min-date` | object | | yes | See [Supplying Dates](https://flatpickr.js.org/examples/#supplying-dates-for-flatpickr) | n/a | specifies the minimum/earliest date (inclusively) allowed for selection
| `disable-date` | array | | yes | See [Supplying Dates](https://flatpickr.js.org/examples/#supplying-dates-for-flatpickr) | n/a | make certain dates unavailable for selection
| `enable-date` | array | | yes | See [Supplying Dates](https://flatpickr.js.org/examples/#supplying-dates-for-flatpickr) | n/a | make certain dates only available for selection
-| `enable-time` | boolean | | yes | See [Options](https://flatpickr.js.org/options/) | n/a | enables time picker
+| `enable-time` | boolean | | yes | `true`, `false` | `false` | enables time selection
| `week-numbers` | boolean | | yes | `true`, `false` | `false` | week numbers flag
| `disabled` | boolean | | no | `true`, `false` | `false` | disabled flag
| `required` | boolean | | no | `true`, `false` | `false` | required flag
diff --git a/packages/oui-calendar/src/calendar.controller.js b/packages/oui-calendar/src/calendar.controller.js
index 773c6adc..794485bb 100644
--- a/packages/oui-calendar/src/calendar.controller.js
+++ b/packages/oui-calendar/src/calendar.controller.js
@@ -82,8 +82,10 @@ export default class {
$onInit () {
addBooleanParameter(this, "appendToBody");
addBooleanParameter(this, "disabled");
+ addBooleanParameter(this, "enableTime");
addBooleanParameter(this, "inline");
addBooleanParameter(this, "required");
+ addBooleanParameter(this, "static");
addBooleanParameter(this, "weekNumbers");
this.initCalendarInstance();
diff --git a/packages/oui-datagrid/README.md b/packages/oui-datagrid/README.md
index 8c605725..a7640633 100644
--- a/packages/oui-datagrid/README.md
+++ b/packages/oui-datagrid/README.md
@@ -294,6 +294,26 @@ Or you can use the `page-size` property. It takes precedence over value configur
```
+### Access row index
+
+```html:preview
+
+
+ {{$rowIndex}}
+
+
+ {{$row.firstName}} {{$row.lastName}}
+
+
+ {{$value}}
+
+
+
+ {{$value | date:shortDate}}
+
+
+```
+
### Remote data
```html
diff --git a/packages/oui-datagrid/src/cell/cell.controller.js b/packages/oui-datagrid/src/cell/cell.controller.js
index d17d3cdd..ca62b284 100644
--- a/packages/oui-datagrid/src/cell/cell.controller.js
+++ b/packages/oui-datagrid/src/cell/cell.controller.js
@@ -40,6 +40,7 @@ export default class {
this.cellScope.$row = this.row;
this.cellScope.$column = this.column;
this.cellScope.$value = this.row[this.column.name];
+ this.cellScope.$rowIndex = this.index;
if (this.column.compiledTemplate) {
this.column.compiledTemplate(this.cellScope, clone => {
diff --git a/packages/oui-datagrid/src/index.spec.js b/packages/oui-datagrid/src/index.spec.js
index 0af9c61f..1871e269 100644
--- a/packages/oui-datagrid/src/index.spec.js
+++ b/packages/oui-datagrid/src/index.spec.js
@@ -1076,6 +1076,38 @@ describe("ouiDatagrid", () => {
expect(actualCellHtml).toBe(`test: ${fakeData[0].lastName}`);
});
+ it("should support row index data binding inside cell", () => {
+ const element = TestUtils.compileTemplate(`
+
+
+
+ test: {{ $rowIndex }}
+
+
+ `, {
+ rows: fakeData.slice(0, 5)
+ }
+ );
+
+ const $firstRow = getRow(element, 0);
+ expect(
+ getCell($firstRow, 1).children().children().html()
+ .trim())
+ .toBe("test: 0");
+
+ const $middleRow = getRow(element, 2);
+ expect(
+ getCell($middleRow, 1).children().children().html()
+ .trim())
+ .toBe("test: 2");
+
+ const $lastRow = getRow(element, 4);
+ expect(
+ getCell($lastRow, 1).children().children().html()
+ .trim())
+ .toBe("test: 4");
+ });
+
it("should support parent binding inside cell", () => {
const element = TestUtils.compileTemplate(`
diff --git a/packages/oui-dropdown/src/index.spec.js b/packages/oui-dropdown/src/index.spec.js
index f2fa14d1..0be80e1c 100644
--- a/packages/oui-dropdown/src/index.spec.js
+++ b/packages/oui-dropdown/src/index.spec.js
@@ -212,6 +212,32 @@ describe("ouiDropdown", () => {
expect(link.attr("target")).toBe("_blank");
expect(link.attr("rel")).toBe("noopener");
});
+
+ it("should call click callback", () => {
+ const onLinkClickSpy = jasmine.createSpy("onLinkClickSpy");
+ const onButtonClickSpy = jasmine.createSpy("onButtonClickSpy");
+ const element = TestUtils.compileTemplate(`
+
+
+
+
+
+
+
+
+ `, {
+ onLinkClick: onLinkClickSpy,
+ onButtonClick: onButtonClickSpy
+ });
+
+ $timeout.flush();
+ const items = angular.element(element[0].querySelectorAll("oui-dropdown-item")).children();
+ angular.element(items[0]).triggerHandler("click");
+ angular.element(items[1]).triggerHandler("click");
+
+ expect(onLinkClickSpy).toHaveBeenCalled();
+ expect(onButtonClickSpy).toHaveBeenCalled();
+ });
});
describe("Group", () => {
diff --git a/packages/oui-dropdown/src/item/dropdown-item.html b/packages/oui-dropdown/src/item/dropdown-item.html
index a7996605..4741b3df 100644
--- a/packages/oui-dropdown/src/item/dropdown-item.html
+++ b/packages/oui-dropdown/src/item/dropdown-item.html
@@ -12,7 +12,8 @@
ng-if="::!!$ctrl.href"
ng-href="{{::$ctrl.href}}"
ng-attr-target="{{::$ctrl.linkTarget}}"
- ng-attr-rel="{{::$ctrl.linkRel}}">
+ ng-attr-rel="{{::$ctrl.linkRel}}"
+ ng-click="$ctrl.onClick()">
{{::$ctrl.text}}
{{::$ctrl.text}}
diff --git a/packages/oui-inline-adder/README.md b/packages/oui-inline-adder/README.md
new file mode 100644
index 00000000..76292d0f
--- /dev/null
+++ b/packages/oui-inline-adder/README.md
@@ -0,0 +1,168 @@
+# Inline adder
+
+
+
+## Usage
+
+### Basic
+
+```html:preview
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+### Multiple rows
+
+```html:preview
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+### Adaptive fields
+
+**Note**: Fields with `adaptive` attribute will adapt their size to their content.
+
+```html:preview
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+### Events
+
+#### `on-add`
+
+**Note**: If you want to access the form inside `on-add` callback, you need to use the `form` variable as below.
+
+```html:preview
+
+
+
+
+
+
+
+
+
+
+
On Add
+
{{$ctrl.addedForm | json}}
+
+```
+
+#### `on-remove`
+
+**Note**: If you want to access the form inside `on-remove` callback, you need to use the `form` variable as below.
+
+```html:preview
+
+
+
+
+
+
+
+
+
+
+
On Remove
+
{{$ctrl.removedForm | json}}
+
+```
+
+#### `on-change`
+
+**Note**: If you want to access the forms array inside `on-change` callback, you need to use the `forms` variable as below.
+
+```html:preview
+
+
+
+
+
+
+
+
+
+