Skip to content

Commit 5ffced3

Browse files
Add button folder and text document creation
1 parent 82cc482 commit 5ffced3

4 files changed

Lines changed: 38 additions & 133 deletions

File tree

apps/files/js/filelist.js

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1935,7 +1935,7 @@
19351935
}
19361936

19371937
if (options.scrollTo) {
1938-
this.scrollTo(fileData.name);
1938+
this.scrollTo(fileData.name, options.showDetailsView !== undefined ? options.showDetailsView : true);
19391939
}
19401940

19411941
// defaults to true if not defined
@@ -3072,7 +3072,7 @@
30723072
*
30733073
* @since 8.2
30743074
*/
3075-
createDirectory: function(name) {
3075+
createDirectory: function(name, options) {
30763076
var self = this;
30773077
var deferred = $.Deferred();
30783078
var promise = deferred.promise();
@@ -3088,7 +3088,8 @@
30883088

30893089
this.filesClient.createDirectory(targetPath)
30903090
.done(function() {
3091-
self.addAndFetchFileInfo(targetPath, '', {scrollTo:true}).then(function(status, data) {
3091+
options = _.extend({scrollTo: true}, options || {});
3092+
self.addAndFetchFileInfo(targetPath, '', options).then(function(status, data) {
30923093
deferred.resolve(status, data);
30933094
}, function() {
30943095
OC.Notification.show(t('files', 'Could not create folder "{dir}"',
@@ -3099,8 +3100,9 @@
30993100
.fail(function(createStatus) {
31003101
// method not allowed, folder might exist already
31013102
if (createStatus === 405) {
3103+
options = _.extend({scrollTo: true}, options || {});
31023104
// add it to the list, for completeness
3103-
self.addAndFetchFileInfo(targetPath, '', {scrollTo:true})
3105+
self.addAndFetchFileInfo(targetPath, '', options)
31043106
.done(function(status, data) {
31053107
OC.Notification.show(t('files', 'Could not create folder "{dir}" because it already exists',
31063108
{dir: name}), {type: 'error'}
@@ -3338,11 +3340,11 @@
33383340
this.$el.find('.mask').remove();
33393341
this.$table.removeClass('hidden');
33403342
},
3341-
scrollTo:function(file) {
3343+
scrollTo:function(file, showDetailsView = true) {
33423344
if (!_.isArray(file)) {
33433345
file = [file];
33443346
}
3345-
if (file.length === 1) {
3347+
if (file.length === 1 && showDetailsView) {
33463348
_.defer(function() {
33473349
if (document.documentElement.clientWidth > 1024) {
33483350
this.showDetailsView(file[0]);
@@ -3560,7 +3562,11 @@
35603562
},
35613563

35623564
getUniqueName: function(name) {
3563-
if (this.findFileEl(name).exists()) {
3565+
var fileNamesOld = this.files.findIndex(function(el)
3566+
{
3567+
return el.name==name;
3568+
});
3569+
if (fileNamesOld!=-1) {
35643570
var numMatch;
35653571
var parts=name.split('.');
35663572
var extension = "";

apps/files/js/newfilemenu.js

Lines changed: 11 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,11 @@
5353
fileType: 'folder',
5454
actionLabel: t('files', 'Create new folder'),
5555
actionHandler: function(name) {
56-
self.fileList.createDirectory(name);
56+
const uniqueName = self.fileList.getUniqueName(name)
57+
let tempPromise = self.fileList.createDirectory(uniqueName, { showDetailsView: false })
58+
Promise.all([tempPromise]).then(() => {
59+
self.fileList.rename(uniqueName)
60+
})
5761
}
5862
}];
5963

@@ -99,100 +103,12 @@
99103

100104
_promptFileName: function($target) {
101105
var self = this;
102-
103-
if ($target.find('form').length) {
104-
$target.find('input[type=\'text\']').focus();
105-
return;
106-
}
107-
108-
// discard other forms
109-
this.$el.find('form').remove();
110-
this.$el.find('.displayname').removeClass('hidden');
111-
112-
$target.find('.displayname').addClass('hidden');
113-
114-
var newName = $target.attr('data-templatename');
115-
var fileType = $target.attr('data-filetype');
116-
var actionLabel = $target.attr('data-action-label');
117-
var $form = $(OCA.Files.Templates['newfilemenu_filename_form']({
118-
fileName: newName,
119-
cid: this.cid,
120-
fileType: fileType,
121-
actionLabel,
122-
}));
123-
124-
//this.trigger('actionPerformed', action);
125-
$target.append($form);
126-
127-
// here comes the OLD code
128-
var $input = $form.find('input[type=\'text\']');
129-
var $submit = $form.find('input[type=\'submit\']');
130-
131-
var lastPos;
132-
var checkInput = function () {
133-
// Special handling for the setup template directory
134-
if ($target.attr('data-action') === 'template-init') {
135-
return true;
136-
}
137-
138-
var filename = $input.val();
139-
try {
140-
if (!Files.isFileNameValid(filename)) {
141-
// Files.isFileNameValid(filename) throws an exception itself
142-
} else if (self.fileList.inList(filename)) {
143-
throw t('files', '{newName} already exists', {newName: filename}, undefined, {
144-
escape: false
145-
});
146-
} else {
147-
return true;
148-
}
149-
} catch (error) {
150-
$input.attr('title', error);
151-
$input.addClass('error');
152-
}
153-
return false;
154-
};
155-
156-
// verify filename on typing
157-
$input.keyup(function() {
158-
if (checkInput()) {
159-
$input.removeClass('error');
160-
}
161-
});
162-
163-
$submit.click(function(event) {
164-
event.stopPropagation();
165-
event.preventDefault();
166-
$form.submit();
167-
});
168-
169-
$input.focus();
170-
// pre select name up to the extension
171-
lastPos = newName.lastIndexOf('.');
172-
if (lastPos === -1) {
173-
lastPos = newName.length;
174-
}
175-
$input.selectRange(0, lastPos);
176-
177-
$form.submit(function(event) {
178-
event.stopPropagation();
179-
event.preventDefault();
180-
181-
if (checkInput()) {
182-
var newname = $input.val().trim();
183-
184-
/* Find the right actionHandler that should be called.
185-
* Actions is retrieved by using `actionSpec.id` */
186-
var action = _.filter(self._menuItems, function(item) {
187-
return item.id == $target.attr('data-action');
188-
}).pop();
189-
action.actionHandler(newname);
190-
191-
$form.remove();
192-
$target.find('.displayname').removeClass('hidden');
193-
OC.hideMenus();
194-
}
195-
});
106+
var newname = $target.attr('data-templatename');
107+
var action = _.filter(self._menuItems, function(item) {
108+
return item.id == $target.attr('data-action');
109+
}).pop();
110+
action.actionHandler(newname);
111+
OC.hideMenus();
196112
},
197113

198114
/**

apps/files/src/templates.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,8 @@ templates.forEach((provider, index) => {
112112
fileType: 'file',
113113
actionLabel: provider.actionLabel,
114114
actionHandler(name) {
115-
TemplatePicker.open(name, provider)
115+
const fileName = FileList.getUniqueName(name)
116+
TemplatePicker.open(fileName, provider)
116117
},
117118
})
118119
},

apps/files/src/views/TemplatePicker.vue

Lines changed: 12 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,14 @@
6161
</template>
6262

6363
<script>
64-
import { normalize } from 'path'
6564
import { showError } from '@nextcloud/dialogs'
65+
import { generateOcsUrl } from '@nextcloud/router'
66+
import axios from '@nextcloud/axios'
6667
import NcEmptyContent from '@nextcloud/vue/dist/Components/NcEmptyContent.js'
6768
import NcModal from '@nextcloud/vue/dist/Components/NcModal.js'
6869
6970
import { getCurrentDirectory } from '../utils/davUtils.js'
70-
import { createFromTemplate, getTemplates } from '../services/Templates.js'
71+
import { getTemplates } from '../services/Templates.js'
7172
import TemplatePreview from '../components/TemplatePreview.vue'
7273
7374
const border = 2
@@ -202,37 +203,18 @@ export default {
202203
const currentDirectory = getCurrentDirectory()
203204
const fileList = OCA?.Files?.App?.currentFileList
204205
205-
// If the file doesn't have an extension, add the default one
206-
if (this.nameWithoutExt === this.name) {
207-
this.logger.debug('Fixed invalid filename', { name: this.name, extension: this.provider?.extension })
208-
this.name = this.name + this.provider?.extension
209-
}
210-
211206
try {
212-
const fileInfo = await createFromTemplate(
213-
normalize(`${currentDirectory}/${this.name}`),
214-
this.selectedTemplate?.filename,
215-
this.selectedTemplate?.templateType,
216-
)
217-
this.logger.debug('Created new file', fileInfo)
218-
219-
// Fetch FileInfo and model
220-
const data = await fileList?.addAndFetchFileInfo(this.name).then((status, data) => data)
221-
const model = new OCA.Files.FileInfoModel(data, {
222-
filesClient: fileList?.filesClient,
207+
const response = await axios.post(generateOcsUrl('apps/files/api/v1/templates/create'), {
208+
filePath: `${currentDirectory}/${this.name}`,
209+
templatePath: this.selectedTemplate?.filename,
210+
templateType: this.selectedTemplate?.templateType,
223211
})
224212
225-
// Run default action
226-
const fileAction = OCA.Files.fileActions.getDefaultFileAction(fileInfo.mime, 'file', OC.PERMISSION_ALL)
227-
if (fileAction) {
228-
fileAction.action(fileInfo.basename, {
229-
$file: fileList?.findFileEl(this.name),
230-
dir: currentDirectory,
231-
fileList,
232-
fileActions: fileList?.fileActions,
233-
fileInfoModel: model,
234-
})
235-
}
213+
const fileInfo = response.data.ocs.data
214+
this.logger.debug('Created new file', fileInfo)
215+
const options = _.extend({ scrollTo: true }, { showDetailsView: false } || {})
216+
await fileList?.addAndFetchFileInfo(this.name, undefined, options)
217+
fileList.rename(this.name)
236218
237219
this.close()
238220
} catch (error) {

0 commit comments

Comments
 (0)