Skip to content

Commit 493afe0

Browse files
committed
Merge #218 533-Add button folder and text document creation
2 parents ecd7740 + 5ffced3 commit 493afe0

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
@@ -1938,7 +1938,7 @@
19381938
}
19391939

19401940
if (options.scrollTo) {
1941-
this.scrollTo(fileData.name);
1941+
this.scrollTo(fileData.name, options.showDetailsView !== undefined ? options.showDetailsView : true);
19421942
}
19431943

19441944
// defaults to true if not defined
@@ -3075,7 +3075,7 @@
30753075
*
30763076
* @since 8.2
30773077
*/
3078-
createDirectory: function(name) {
3078+
createDirectory: function(name, options) {
30793079
var self = this;
30803080
var deferred = $.Deferred();
30813081
var promise = deferred.promise();
@@ -3091,7 +3091,8 @@
30913091

30923092
this.filesClient.createDirectory(targetPath)
30933093
.done(function() {
3094-
self.addAndFetchFileInfo(targetPath, '', {scrollTo:true}).then(function(status, data) {
3094+
options = _.extend({scrollTo: true}, options || {});
3095+
self.addAndFetchFileInfo(targetPath, '', options).then(function(status, data) {
30953096
deferred.resolve(status, data);
30963097
}, function() {
30973098
OC.Notification.show(t('files', 'Could not create folder "{dir}"',
@@ -3102,8 +3103,9 @@
31023103
.fail(function(createStatus) {
31033104
// method not allowed, folder might exist already
31043105
if (createStatus === 405) {
3106+
options = _.extend({scrollTo: true}, options || {});
31053107
// add it to the list, for completeness
3106-
self.addAndFetchFileInfo(targetPath, '', {scrollTo:true})
3108+
self.addAndFetchFileInfo(targetPath, '', options)
31073109
.done(function(status, data) {
31083110
OC.Notification.show(t('files', 'Could not create folder "{dir}" because it already exists',
31093111
{dir: name}), {type: 'error'}
@@ -3341,11 +3343,11 @@
33413343
this.$el.find('.mask').remove();
33423344
this.$table.removeClass('hidden');
33433345
},
3344-
scrollTo:function(file) {
3346+
scrollTo:function(file, showDetailsView = true) {
33453347
if (!_.isArray(file)) {
33463348
file = [file];
33473349
}
3348-
if (file.length === 1) {
3350+
if (file.length === 1 && showDetailsView) {
33493351
_.defer(function() {
33503352
if (document.documentElement.clientWidth > 1024) {
33513353
this.showDetailsView(file[0]);
@@ -3563,7 +3565,11 @@
35633565
},
35643566

35653567
getUniqueName: function(name) {
3566-
if (this.findFileEl(name).exists()) {
3568+
var fileNamesOld = this.files.findIndex(function(el)
3569+
{
3570+
return el.name==name;
3571+
});
3572+
if (fileNamesOld!=-1) {
35673573
var numMatch;
35683574
var parts=name.split('.');
35693575
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)