File edit

This commit is contained in:
Milos Stojanovic
2020-02-20 15:04:22 +01:00
parent b8f7d000fb
commit 246874ed31
17 changed files with 117 additions and 2 deletions

View File

@@ -170,4 +170,25 @@ class FileController
return $response->json('Done');
}
public function saveContent(Request $request, Response $response)
{
$path = $request->input('dir', $this->session->get(self::SESSION_CWD, $this->separator));
$name = $request->input('name');
$content = $request->input('content');
$stream = tmpfile();
fwrite($stream, $content);
rewind($stream);
$res = $this->storage->deleteFile($path.$this->separator.$name);
$res = $this->storage->store($path, $name, $stream);
if (is_resource($stream)) {
fclose($stream);
}
return $response->json('Done');
}
}

View File

@@ -256,4 +256,15 @@ return [
'permissions' => [
],
],
[
'route' => [
'POST', '/savecontent', '\Filegator\Controllers\FileController@saveContent',
],
'roles' => [
'guest', 'user', 'admin',
],
'permissions' => [
'read', 'write',
],
],
];

View File

@@ -198,6 +198,16 @@ const api = {
.catch(error => reject(error))
})
},
saveContent (params) {
return new Promise((resolve, reject) => {
axios.post('savecontent', {
name: params.name,
content: params.content,
})
.then(res => resolve(res.data))
.catch(error => reject(error))
})
},
}
export default api

View File

@@ -70,6 +70,7 @@ const data = {
'Updated': 'Обновено',
'Deleted': 'изтрити',
'Your file is ready': 'Вашия файл е готов',
'View': 'View',
}
export default data

View File

@@ -70,6 +70,7 @@ const data = {
'Updated': '已上传',
'Deleted': '已删除',
'Your file is ready': '您的文件已备妥',
'View': 'View',
}
export default data

View File

@@ -70,6 +70,7 @@ const data = {
'Updated': 'Aangepast',
'Deleted': 'Verwijderd',
'Your file is ready': 'Uw bestand is verwerkt',
'View': 'View',
}
export default data

View File

@@ -70,6 +70,7 @@ const data = {
'Updated': 'Mis à jour',
'Deleted': 'Supprimé',
'Your file is ready': 'Votre fichier est prêt',
'View': 'View',
}
export default data

View File

@@ -70,6 +70,7 @@ const data = {
'Updated': 'Aktualisiert',
'Deleted': 'Gelöscht',
'Your file is ready': 'Deine Datei ist fertig',
'View': 'View',
}
export default data

View File

@@ -70,6 +70,7 @@ const data = {
'Updated': 'Diperbarui',
'Deleted': 'Dihapus',
'Your file is ready': 'File Anda sudah siap',
'View': 'View',
}
export default data

View File

@@ -70,6 +70,7 @@ const data = {
'Updated': 'Atnaujintas',
'Deleted': 'Ištrintas',
'Your file is ready': 'Jūsų failas paruoštas',
'View': 'View',
}
export default data

View File

@@ -70,6 +70,7 @@ const data = {
'Updated': 'Atualizado',
'Deleted': 'Excluido',
'Your file is ready': 'Seu arquivo está pronto',
'View': 'View',
}
export default data

View File

@@ -70,6 +70,7 @@ const data = {
'Updated': 'Izmenjeno',
'Deleted': 'Obrisano',
'Your file is ready': 'Vaš fajl je spreman',
'View': 'View',
}
export default data

View File

@@ -70,6 +70,7 @@ const data = {
'Updated': 'Actualizado',
'Deleted': 'Eliminado',
'Your file is ready': 'Su fichero está listo',
'View': 'View',
}
export default data

View File

@@ -70,6 +70,7 @@ const data = {
'Updated': 'Güncellendi',
'Deleted': 'Silindi',
'Your file is ready': 'Dosyanız Hazır',
'View': 'View',
}
export default data

View File

@@ -113,7 +113,7 @@
<b-dropdown-item v-if="props.row.type == 'file' && can('download')" aria-role="listitem" @click="download(props.row)">
<b-icon icon="download" size="is-small" /> {{ lang('Download') }}
</b-dropdown-item>
<b-dropdown-item v-if="props.row.type == 'file' && can('read')" aria-role="listitem" @click="preview(props.row)">
<b-dropdown-item v-if="props.row.type == 'file' && can(['read', 'download'])" aria-role="listitem" @click="preview(props.row)">
<b-icon icon="file-alt" size="is-small" /> {{ lang('View') }}
</b-dropdown-item>
<b-dropdown-item v-if="can('write')" aria-role="listitem" @click="copy($event, props.row)">
@@ -252,7 +252,7 @@ export default {
itemClick(item) {
if (item.type == 'dir' || item.type == 'back') {
this.goTo(item.path)
} else {
} else if (this.can(['read', 'download'])) {
this.preview(item)
}
},

View File

@@ -13,6 +13,9 @@
</div>
</section>
<footer class="modal-card-foot">
<button v-if="isText() && can(['write'])" class="button" type="button" @click="saveFile()">
{{ lang('Save') }}
</button>
<button class="button" type="button" @click="$parent.close()">
{{ lang('Close') }}
</button>
@@ -54,6 +57,20 @@ export default {
hasExtension(exts) {
return (new RegExp('(' + exts.join('|').replace(/\./g, '\\.') + ')$', 'i')).test(this.item.path)
},
saveFile() {
api.saveContent({
name: this.item.name,
content: this.content,
})
.then(() => {
this.$toast.open({
message: this.lang('Updated'),
type: 'is-success',
})
this.$parent.close()
})
.catch(error => this.handleError(error))
}
},
}
</script>

View File

@@ -586,4 +586,49 @@ class FilesTest extends TestCase
$this->assertOk();
}
public function testUpdateFileContent()
{
$username = 'john@example.com';
$this->signIn($username, 'john123');
mkdir(TEST_REPOSITORY.'/john');
file_put_contents(TEST_REPOSITORY.'/john/john.txt', 'lorem ipsum');
$this->sendRequest('POST', '/savecontent', [
'name' => 'john.txt',
'content' => 'lorem ipsum new'
]);
$this->assertOk();
$updated = file_get_contents(TEST_REPOSITORY.'/john/john.txt');
$this->assertEquals($updated, 'lorem ipsum new');
}
public function testUpdateFileContentInSubDir()
{
$username = 'john@example.com';
$this->signIn($username, 'john123');
mkdir(TEST_REPOSITORY.'/john');
mkdir(TEST_REPOSITORY.'/john/sub');
file_put_contents(TEST_REPOSITORY.'/john/sub/john.txt', 'lorem ipsum');
$this->sendRequest('POST', '/changedir', [
'to' => '/sub/',
]);
$this->sendRequest('POST', '/savecontent', [
'name' => 'john.txt',
'content' => 'lorem ipsum new'
]);
$this->assertOk();
$updated = file_get_contents(TEST_REPOSITORY.'/john/sub/john.txt');
$this->assertEquals($updated, 'lorem ipsum new');
}
}