Skip to content

Commit 608bade

Browse files
authored
[ENG-3917] Create folder/rename file bugs (#1578)
- Ticket: [ENG-3917] - Feature flag: n/a ## Purpose - Fix bugs with rename file and create folder modals when users hit "Enter" key to submit - Add missing translation key ## Summary of Changes - Only submit name change/new folder when users hit "Enter" for these modals - Add missing translation key
1 parent 6ca66e1 commit 608bade

File tree

6 files changed

+80
-8
lines changed

6 files changed

+80
-8
lines changed

lib/osf-components/addon/components/file-browser/add-new/create-folder-modal/template.hbs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@
1010
<label>
1111
<p>{{t 'osf-components.file-browser.create_folder.new_folder_name'}}</p>
1212
<Input
13-
@enter={{queue
13+
@enter={{unless this.isInvalid (queue
1414
(perform @manager.createNewFolder this.newFolderName)
1515
(action (mut @isOpen) false)
1616
(action (mut this.newFolderName) '')
17-
}}
17+
)}}
1818
@value={{this.newFolderName}}
1919
local-class='RenameInput'
2020
/>

lib/osf-components/addon/components/file-browser/file-rename-modal/component.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,12 @@ export default class FileRenameModal extends Component<Args> {
6868
async updateFileName() {
6969
const newName = this.newFileName;
7070
const successMessage = this.intl.t('osf-components.file-browser.file_rename_modal.success_message');
71-
if (!newName) {
71+
if (!this.isValid) {
7272
return;
7373
}
7474

7575
try {
76-
const trimmedName = newName.trim();
76+
const trimmedName = newName!.trim();
7777
await this.args.item.rename(trimmedName, '');
7878
this.toast.success(successMessage);
7979
this.args.manager.reload();

lib/osf-components/addon/components/file-browser/file-rename-modal/template.hbs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@
1515
aria-label={{t 'osf-components.file-browser.file_rename_modal.input_aria'}}
1616
@value={{this.newFileName}}
1717
@type='text'
18-
@enter={{queue
18+
@enter={{if this.isValid (queue
1919
(perform this.updateFileName)
2020
dialog.close
21-
}}
21+
)}}
2222
/>
2323
{{#unless this.isValid}}
2424
<p local-class='ErrorText'>

tests/integration/components/file-browser/component-test.ts

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { fillIn, render } from '@ember/test-helpers';
1+
import { fillIn, render, triggerKeyEvent } from '@ember/test-helpers';
22
import { hbs } from 'ember-cli-htmlbars';
33
import { ModelInstance } from 'ember-cli-mirage';
44
import { TestContext, t } from 'ember-intl/test-support';
@@ -245,4 +245,41 @@ module('Integration | Component | file-browser', hooks => {
245245
assert.dom(`[data-test-file-list-link][aria-label="${newFolderAria}"]`)
246246
.exists('Shiny new folder exists');
247247
});
248+
249+
test('it creates new folder using enter key',
250+
async function(this: FileBrowserTestContext, assert) {
251+
const node = await this.store.findRecord('node', this.mirageNode.id);
252+
const storageProviders = await node.files;
253+
this.osfStorageProvider = storageProviders.toArray()[0];
254+
await render(hbs`
255+
<StorageProviderManager::StorageManager @provider={{this.osfStorageProvider}} as |manager|>
256+
<FileBrowser @manager={{manager}} @enableUpload={{true}} @selectable={{true}} />
257+
</StorageProviderManager::StorageManager>
258+
`);
259+
await click('[data-test-add-new-trigger]');
260+
await click('[data-test-create-folder]');
261+
assert.dom('[data-test-create-folder-heading]').exists('Create folder modal shown');
262+
assert.dom('[data-test-new-folder-error]').containsText(
263+
t('osf-components.file-browser.create_folder.error_message'), 'Message shown to enter folder name',
264+
);
265+
assert.dom('[data-test-create-folder-button]').isDisabled('Create folder button is disabled');
266+
await triggerKeyEvent('[data-test-create-folder-main] input', 'keyup', 'Enter');
267+
assert.dom('[data-test-create-folder-heading]')
268+
.exists('Create folder modal still visible after enter when folder name is empty');
269+
270+
await fillIn('[data-test-create-folder-main] input', ' ');
271+
assert.dom('[data-test-new-folder-error]').containsText(
272+
t('osf-components.file-browser.create_folder.error_message'), 'Folder cannot be empty',
273+
);
274+
await triggerKeyEvent('[data-test-create-folder-main] input', 'keyup', 'Enter');
275+
assert.dom('[data-test-create-folder-heading]')
276+
.exists('Create folder modal still visible after enter when folder name is just spaces');
277+
278+
await fillIn('[data-test-create-folder-main] input', 'Shiny New Folder');
279+
assert.dom('[data-test-new-folder-error]').doesNotExist('No error message shown');
280+
assert.dom('[data-test-create-folder-button]').isEnabled('Create folder button is enabled');
281+
await triggerKeyEvent('[data-test-create-folder-main] input', 'keyup', 'Enter');
282+
assert.dom('[data-test-create-folder-heading]')
283+
.doesNotExist('Create folder modal closes after enter when folder name is valid');
284+
});
248285
});

tests/integration/components/file-browser/file-rename-modal/component-test.ts

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { render } from '@ember/test-helpers';
1+
import { render, triggerKeyEvent } from '@ember/test-helpers';
22
import fillIn from '@ember/test-helpers/dom/fill-in';
33
import { hbs } from 'ember-cli-htmlbars';
44
import { t, TestContext } from 'ember-intl/test-support';
@@ -16,15 +16,18 @@ interface FileItem {
1616
links: Links;
1717
dateModified: string;
1818
id: string;
19+
rename: () => void;
1920
}
2021

2122
interface Manager {
2223
parentFolder: any;
24+
reload: () => void;
2325
}
2426

2527
interface FileRenameModalTestContext extends TestContext {
2628
manager: Manager;
2729
item: FileItem;
30+
isOpen: boolean;
2831
}
2932

3033
module('Integration | Component | file-browser :: file-rename-modal', hooks => {
@@ -38,10 +41,13 @@ module('Integration | Component | file-browser :: file-rename-modal', hooks => {
3841
download: 'thisisafakedownloadlink',
3942
},
4043
dateModified: Date(),
44+
rename: () => {/* noop */},
4145
};
4246
this.manager = {
4347
parentFolder: null,
48+
reload: () => {/* noop */},
4449
};
50+
this.isOpen = true;
4551
});
4652

4753
test('it renders with a disabled button when name is the same, button enabled whem name is different',
@@ -86,4 +92,32 @@ module('Integration | Component | file-browser :: file-rename-modal', hooks => {
8692
await fillIn('[data-test-user-input]', 'Save this file');
8793
assert.dom('[data-test-disabled-rename]').isEnabled('Save button is enabled');
8894
});
95+
96+
test('enter key triggers rename',
97+
async function(this: FileRenameModalTestContext, assert): Promise<void> {
98+
// check toast in lieu of modal closing
99+
await render(
100+
hbs`<FileBrowser::FileRenameModal @manager={{this.manager}} @item={{this.item}} @isOpen={{true}}/>`,
101+
);
102+
assert.dom('[data-test-file-rename-modal]').exists('File rename modal exists');
103+
assert.dom('[data-test-user-input]').hasValue(this.item.name, 'File name pre-populated');
104+
assert.dom('[data-test-disabled-rename]').isDisabled('Save button is disabled');
105+
assert.dom('[data-test-rename-main]').containsText(
106+
t('osf-components.file-browser.file_rename_modal.error_message'),
107+
);
108+
await triggerKeyEvent('[data-test-user-input]', 'keydown', 'Enter');
109+
assert.dom('#toast-container', document as any).doesNotExist('Rename not triggered when no name change');
110+
111+
await fillIn('[data-test-user-input]', '');
112+
assert.dom('[data-test-rename-main]').containsText(
113+
t('osf-components.file-browser.file_rename_modal.error_empty_name'),
114+
);
115+
await triggerKeyEvent('[data-test-user-input]', 'keydown', 'Enter');
116+
assert.dom('#toast-container', document as any).doesNotExist('Rename not triggered when name is empty');
117+
118+
await fillIn('[data-test-user-input]', 'New File Name');
119+
assert.dom('[data-test-disabled-rename]').isEnabled('Save button is now enabled');
120+
await triggerKeyEvent('[data-test-user-input]', 'keydown', 'Enter');
121+
assert.dom('#toast-container', document as any).doesNotExist('Rename is fired');
122+
});
89123
});

translations/en-us.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1975,6 +1975,7 @@ osf-components:
19751975
clear_aria: 'Clear input field'
19761976
success_message: 'File successfully renamed.'
19771977
error_message: 'Please rename the file.'
1978+
error_empty_name: 'Please enter a file name.'
19781979
error_ends_with_dot: 'File name cannot end with a period.'
19791980
error_forbidden_chars: 'Please remove special characters from the file name.'
19801981
retry_message: 'Rename failed.'

0 commit comments

Comments
 (0)