Skip to content

Commit 90db7b3

Browse files
authored
feat(components.file): add an onremove callback on file input (#847)
* feat(components.file): add an onremove callback Add a way to know when an attachment is removed ref: UK-196 Signed-off-by: Maxime Bajeux <maxime.bajeux.ext@corp.ovh.com> * feat(components.file): add an onremove callback on file input Add a test when file is removed ref: UK-196 Signed-off-by: Maxime Bajeux <maxime.bajeux.ext@corp.ovh.com> * feat(components.file): add an onremove callback on file input Add a story to test onSelect and onRemove callbacks ref: UK-196 Signed-off-by: Maxime Bajeux <maxime.bajeux.ext@corp.ovh.com> * feat(components.file): add an onremove callback on file input fix an english error ref: Uk-196 Signed-off-by: Maxime Bajeux <maxime.bajeux.ext@corp.ovh.com> --------- Signed-off-by: Maxime Bajeux <maxime.bajeux.ext@corp.ovh.com> Co-authored-by: Maxime Bajeux <maxime.bajeux.ext@corp.ovh.com>
1 parent 5ed7b49 commit 90db7b3

File tree

5 files changed

+52
-1
lines changed

5 files changed

+52
-1
lines changed

packages/apps/workshop/stories/design-system/components/file/file-webcomponent.stories.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { forModule } from 'storybook-addon-angularjs';
44
import Field from '@ovh-ux/ui-kit.field';
55
import File from '@ovh-ux/ui-kit.file';
66
import FormActions from '@ovh-ux/ui-kit.form-actions';
7+
import Message from '@ovh-ux/ui-kit.message';
78

89
import readme from '@ovh-ux/ui-kit.file/README.md';
910
import { compileTemplate } from '../../../../src/utils';
@@ -16,6 +17,7 @@ angular.module(moduleName, [
1617
// For examples
1718
Field,
1819
FormActions,
20+
Message,
1921
]);
2022

2123
export default {
@@ -147,3 +149,42 @@ export const Validation = forModule(moduleName).createElement(
147149
},
148150
),
149151
);
152+
153+
export const EventHandling = forModule(moduleName).createElement(
154+
() => compileTemplate(
155+
`
156+
<oui-message
157+
type="info"
158+
ng-if="$ctrl.message">
159+
{{$ctrl.message}}
160+
</oui-message>
161+
<oui-file
162+
disabled="$ctrl.disabled"
163+
model="$ctrl.model"
164+
multiple
165+
on-select="$ctrl.onSelect(modelValue)"
166+
on-remove="$ctrl.onRemove(modelValue)"
167+
>
168+
</oui-file>
169+
`,
170+
{
171+
$ctrl: new (class {
172+
constructor() {
173+
this.message = '';
174+
}
175+
176+
onSelect(model) {
177+
const plural = model.length > 1;
178+
this.message = `You've selected a file ! Currently ${model.length} file${plural ? 's' : ''} selected`;
179+
}
180+
181+
onRemove(model) {
182+
const plural = model.length > 1;
183+
this.message = `You've removed a file ! Currently ${model.length} file${plural ? 's' : ''} selected`;
184+
}
185+
})(),
186+
},
187+
),
188+
);
189+
190+
EventHandling.storyName = 'Trigger event on selection and deletion';

packages/components/file/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,4 @@ angular.module('myModule', ['oui.file'])
5151
| `droparea` | boolean | <? | yes | `true`, `false` | `false` | enable a drop area to drag files
5252
| `preview` | boolean | <? | yes | `true`, `false` | `false` | show preview of image files (works only with `image/*` files.)
5353
| `on-select` | function | & | no | n/a | n/a | handler triggered when files are selected
54+
| `on-remove` | function | & | no | n/a | n/a | handler triggered when an attachment is removed

packages/components/file/src/js/file.component.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export default {
1818
droparea: '<?',
1919
preview: '<?',
2020
onSelect: '&',
21+
onRemove: '&',
2122
},
2223
controller,
2324
template,

packages/components/file/src/js/file.controller.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,12 +103,14 @@ export default class {
103103
removeFile(file) {
104104
if (angular.isArray(this.model)) {
105105
remove(this.model, (item) => item === file);
106+
this.onRemove({ modelValue: this.model });
106107
}
107108
}
108109

109110
resetFile() {
110111
this.model = undefined;
111112
this.fileSelector[0].value = '';
113+
this.onRemove({ modelValue: this.model });
112114

113115
if (this.form && this.form[this.name]) {
114116
this.form[this.name].$setValidity('maxsize', true);

packages/components/file/src/js/file.spec.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,15 +190,20 @@ describe('ouiFile', () => {
190190
let element;
191191
let controller;
192192
let onSelectSpy;
193+
let onRemoveSpy;
193194

194195
beforeEach(() => {
195196
onSelectSpy = jasmine.createSpy('onSelectSpy');
197+
onRemoveSpy = jasmine.createSpy('onRemoveSpy');
196198
element = TestUtils.compileTemplate(`
197199
<oui-file
198200
model="$ctrl.model"
199-
on-select="$ctrl.onSelectSpy(modelValue)">
201+
on-select="$ctrl.onSelectSpy(modelValue)"
202+
on-remove="$ctrl.onRemoveSpy(modelValue)"
203+
>
200204
</oui-file>`, {
201205
onSelectSpy,
206+
onRemoveSpy,
202207
});
203208
controller = element.controller('ouiFile');
204209

@@ -254,6 +259,7 @@ describe('ouiFile', () => {
254259
controller.addFiles(mockFiles);
255260
controller.removeFile(mockFile);
256261
expect(controller.model.length).toBe(0);
262+
expect(onRemoveSpy).toHaveBeenCalledWith(controller.model);
257263
});
258264
});
259265

0 commit comments

Comments
 (0)