Publishing module assets

parent 6bbcd522
<template> <template>
<button class="btn btn-danger btn-flat" @click="deleteRow"><i class="fa fa-trash"></i></button> <el-button type="danger" @click="deleteRow" size="mini"><i class="fa fa-trash"></i></el-button>
</template> </template>
<script> <script>
export default { export default {
props: { props: {
rows: {default: null}, rows: { default: null },
scope: {default: null}, scope: { default: null },
}, },
data() { data() {
return { return {
deleteMessage: '', deleteMessage: '',
deleteTitle: '', deleteTitle: '',
} };
}, },
methods: { methods: {
deleteRow(event) { deleteRow(event) {
this.$confirm(this.deleteMessage, this.deleteTitle, { this.$confirm(this.deleteMessage, this.deleteTitle, {
confirmButtonText: this.trans('core.button.delete'), confirmButtonText: this.trans('core.button.delete'),
cancelButtonText: this.trans('core.button.cancel'), cancelButtonText: this.trans('core.button.cancel'),
type: 'warning' type: 'warning',
confirmButtonClass: 'el-button--danger',
}).then(() => { }).then(() => {
let vm = this; const vm = this;
axios.delete(this.scope.row.urls.delete_url) axios.delete(this.scope.row.urls.delete_url)
.then(response => { .then((response) => {
if (response.data.errors === false) { if (response.data.errors === false) {
vm.$message({ vm.$message({
type: 'success', type: 'success',
message: response.data.message message: response.data.message,
}); });
vm.rows.splice(vm.scope.$index, 1); vm.rows.splice(vm.scope.$index, 1);
} }
}) })
.catch(error => { .catch((error) => {
vm.$message({ vm.$message({
type: 'error', type: 'error',
message: error.data.message message: error.data.message,
}); });
}); });
}).catch(() => { }).catch(() => {
this.$message({ this.$message({
type: 'info', type: 'info',
message: this.trans('core.delete cancelled') message: this.trans('core.delete cancelled'),
}); });
}); });
} },
}, },
mounted() { mounted() {
this.deleteMessage = this.trans('core.modal.confirmation-message'); this.deleteMessage = this.trans('core.modal.confirmation-message');
this.deleteTitle = this.trans('core.modal.title'); this.deleteTitle = this.trans('core.modal.title');
} },
} };
</script> </script>
<template>
<el-button
size="mini"
@click.prevent="goToEditPage()">
<i class="fa fa-pencil"></i>
</el-button>
</template>
<script>
export default {
props: {
to: { type: Object, required: true },
},
methods: {
goToEditPage() {
this.$router.push(this.to);
},
},
};
</script>
...@@ -8,7 +8,7 @@ export default { ...@@ -8,7 +8,7 @@ export default {
if (configuredEditor === 'ckeditor') { if (configuredEditor === 'ckeditor') {
return 'ckeditor'; return 'ckeditor';
} }
return 'ckeditor' return 'ckeditor';
}, },
} },
} };
...@@ -2,6 +2,6 @@ export default { ...@@ -2,6 +2,6 @@ export default {
methods: { methods: {
pushRoute(route) { pushRoute(route) {
this.$router.push(route); this.$router.push(route);
} },
} },
} };
...@@ -6,9 +6,9 @@ export default { ...@@ -6,9 +6,9 @@ export default {
value = value.toLowerCase(); value = value.toLowerCase();
// remove accents, swap ñ for n, etc // remove accents, swap ñ for n, etc
var from = "ãàáäâẽèéëêìíïîõòóöôùúüûñç·/_,:;"; const from = 'ãàáäâẽèéëêìíïîõòóöôùúüûñç·/_,:;';
var to = "aaaaaeeeeeiiiiooooouuuunc------"; const to = 'aaaaaeeeeeiiiiooooouuuunc------';
for (var i = 0, l = from.length; i < l; i++) { for (let i = 0, l = from.length; i < l; i++) {
value = value.replace(new RegExp(from.charAt(i), 'g'), to.charAt(i)); value = value.replace(new RegExp(from.charAt(i), 'g'), to.charAt(i));
} }
...@@ -17,6 +17,6 @@ export default { ...@@ -17,6 +17,6 @@ export default {
.replace(/-+/g, '-'); // collapse dashes .replace(/-+/g, '-'); // collapse dashes
return value; return value;
} },
} },
} };
<template> <template>
<div></div>
</template> </template>
<script> <script>
...@@ -8,8 +9,8 @@ ...@@ -8,8 +9,8 @@
return string[0].toUpperCase() + string.substr(1); return string[0].toUpperCase() + string.substr(1);
}, },
ucwords(string) { ucwords(string) {
return string.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();}); return string.replace(/\w\S*/g, txt => txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase());
}
}, },
} },
};
</script> </script>
...@@ -3,14 +3,14 @@ export default { ...@@ -3,14 +3,14 @@ export default {
trans(string) { trans(string) {
// Makes a string: core.button.cancel | core.button.created at // Makes a string: core.button.cancel | core.button.created at
// to: core["button.cancel"] | core["button.created at"] // to: core["button.cancel"] | core["button.created at"]
let array = string.split('.'); const array = string.split('.');
if (array.length < 2) { return this.$t(string) } if (array.length < 2) { return this.$t(string); }
let first = array.splice(0,1); const first = array.splice(0, 1);
let key = array.join('.'); const key = array.join('.');
return this.$t(`${first}['${key}']`); return this.$t(`${first}['${key}']`);
}, },
} },
} };
...@@ -12,7 +12,7 @@ export default [ ...@@ -12,7 +12,7 @@ export default [
{ {
path: '', path: '',
component: MediaList, component: MediaList,
name: 'admin.media.media.index' name: 'admin.media.media.index',
}, },
{ {
path: ':mediaId/edit', path: ':mediaId/edit',
...@@ -20,8 +20,8 @@ export default [ ...@@ -20,8 +20,8 @@ export default [
name: 'admin.media.media.edit', name: 'admin.media.media.edit',
props: { props: {
locales, locales,
}
}, },
] },
} ],
},
]; ];
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
<div class="col-md-8"> <div class="col-md-8">
<div class="box box-primary"> <div class="box box-primary">
<div class="box-body"> <div class="box-body">
<el-tabs type="card" v-model="activeTab"> <el-tabs v-model="activeTab">
<el-tab-pane :label="localeArray.name" v-for="(localeArray, locale) in locales" <el-tab-pane :label="localeArray.name" v-for="(localeArray, locale) in locales"
:key="localeArray.name" :name="locale"> :key="localeArray.name" :name="locale">
...@@ -48,7 +48,7 @@ ...@@ -48,7 +48,7 @@
<hr> <hr>
<tags-input namespace="asgardcms/media" v-model="tags" :value="tags" :current-tags="tags"></tags-input> <tags-input namespace="asgardcms/media" v-model="tags" :current-tags="tags"></tags-input>
<el-form-item> <el-form-item>
<el-button type="primary" @click="onSubmit()" :loading="loading"> <el-button type="primary" @click="onSubmit()" :loading="loading">
...@@ -64,7 +64,7 @@ ...@@ -64,7 +64,7 @@
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
<img :src="media.path" alt="" v-if="media.is_image" style="width: 100%;"/> <img :src="media.path" alt="" v-if="media.is_image" style="width: 100%;"/>
<i class="fa fa-file" style="font-size: 50px;" v-else=""></i> <i class="fa fa-file" style="font-size: 50px;" v-else></i>
</div> </div>
</div> </div>
</el-form> </el-form>
...@@ -84,12 +84,12 @@ ...@@ -84,12 +84,12 @@
</template> </template>
<script> <script>
import Form from 'form-backend-validation' import Form from 'form-backend-validation';
import axios from 'axios' import axios from 'axios';
export default { export default {
props: { props: {
locales: {default: null}, locales: { default: null },
}, },
data() { data() {
return { return {
...@@ -101,62 +101,60 @@ ...@@ -101,62 +101,60 @@
keywords: '', keywords: '',
}]) }])
.fromPairs() .fromPairs()
//.merge({template: 'default', is_home: 0, medias_single: []}) // .merge({template: 'default', is_home: 0, medias_single: []})
.value(), .value(),
form: new Form(), form: new Form(),
loading: false, loading: false,
tags: {}, tags: {},
activeTab: window.AsgardCMS.currentLocale || 'en', activeTab: window.AsgardCMS.currentLocale || 'en',
} };
}, },
methods: { methods: {
fetchMedia() { fetchMedia() {
this.loading = true; this.loading = true;
axios.get(route('api.media.media.find', {media: this.$route.params.mediaId})) axios.get(route('api.media.media.find', { media: this.$route.params.mediaId }))
.then(response => { .then((response) => {
this.loading = false; this.loading = false;
this.media = response.data.data; this.media = response.data.data;
this.tags = response.data.data.tags; this.tags = response.data.data.tags;
}) });
.catch(error => {
})
}, },
onSubmit() { onSubmit() {
this.form = new Form(_.merge(this.media, {tags: this.tags})); this.form = new Form(_.merge(this.media, { tags: this.tags }));
this.loading = true; this.loading = true;
this.form.put(route('api.media.media.update', {file: this.media.id})) this.form.put(route('api.media.media.update', { file: this.media.id }))
.then(response => { .then((response) => {
this.loading = false; this.loading = false;
this.$message({ this.$message({
type: 'success', type: 'success',
message: response.message message: response.message,
}); });
this.$router.push({name: 'admin.media.media.index', query: {folder_id: this.media.folder_id}}) this.$router.push({ name: 'admin.media.media.index', query: { folder_id: this.media.folder_id } });
}) })
.catch(error => { .catch((error) => {
console.log(error); console.log(error);
this.loading = false; this.loading = false;
this.$notify.error({ this.$notify.error({
title: 'Error', title: 'Error',
message: 'There are some errors in the form.' message: 'There are some errors in the form.',
}); });
}); });
}, },
onCancel() { onCancel() {
if (this.media.folder_id == 0) { if (this.media.folder_id == 0) {
this.$router.push({name: 'admin.media.media.index', query: {}}); this.$router.push({ name: 'admin.media.media.index', query: {} });
return; return;
} }
this.$router.push({name: 'admin.media.media.index', query: {folder_id: this.media.folder_id}}) this.$router.push({ name: 'admin.media.media.index', query: { folder_id: this.media.folder_id } });
}, },
}, },
mounted() { mounted() {
if (this.$route.params.mediaId !== undefined) { if (this.$route.params.mediaId !== undefined) {
this.fetchMedia(); this.fetchMedia();
} }
} },
} };
</script> </script>
<style> <style>
.el-select{ .el-select{
......
...@@ -7,9 +7,9 @@ ...@@ -7,9 +7,9 @@
<script> <script>
export default { export default {
data() { data() {
return {} return {};
}, },
methods: {}, methods: {},
mounted() {} mounted() {},
} };
</script> </script>
<template>
<div>
<el-dialog title="Move Media" :visible.sync="dialogFormVisible" width="30%" class="move-media-dialog" @open="fetchFolders">
<el-form v-loading.body="loading" @submit.native.prevent="onSubmit()">
<el-form-item label="To" :class="{'el-form-item is-error': form.errors.has('destinationFolder') }">
<el-select v-model="destinationFolder" placeholder="Select">
<el-option
v-for="(item, id) in options"
:key="id"
:label="item"
:value="id"
:loading="selectIsLoading">
<span v-html="item"></span>
</el-option>
</el-select>
<div class="el-form-item__error" v-if="form.errors.has('destinationFolder')"
v-text="form.errors.first('destinationFolder')"></div>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="closeDialog">{{ trans('core.button.cancel') }}</el-button>
<el-button type="warning" @click="onSubmit()">{{ trans('core.move') }}</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import axios from 'axios';
import Form from 'form-backend-validation';
export default {
props: {
},
data() {
return {
selectedMedia: [],
dialogFormVisible: false,
form: new Form(),
loading: false,
selectIsLoading: false,
options: [],
destinationFolder: '',
};
},
methods: {
onSubmit() {
this.loading = true;
this.form = new Form({
files: this.selectedMedia,
destinationFolder: this.destinationFolder,
});
this.form.post(route('api.media.media.move'))
.then((response) => {
this.loading = false;
const type = response.errors === true ? 'warning' : 'success';
this.$message({
type,
message: response.message,
});
this.dialogFormVisible = false;
this.$events.emit('mediaWasMoved', response);
})
.catch(() => {
this.loading = false;
this.$notify.error({
title: 'Error',
message: 'There are some errors in the form.',
});
});
},
closeDialog() {
this.form.clear();
this.dialogFormVisible = false;
},
fetchFolders() {
this.selectIsLoading = true;
axios.get(route('api.media.folders.all-nestable'))
.then((response) => {
this.options = _.merge(response.data, { 0: 'Root' });
this.selectIsLoading = false;
});
},
},
mounted() {
this.$events.listen('moveMediaWasClicked', (eventData) => {
this.selectedMedia = eventData;
this.dialogFormVisible = true;
});
},
};
</script>
<style>
.move-media-dialog .el-select {
width: 100%;
}
</style>
<template> <template>
<div> <div>
<el-button type="success" class="new-folder" @click="dialogFormVisible = true"> <el-button type="success" class="new-folder" @click="dialogFormVisible = true">
<i class="el-icon-fa-plus"></i> New Folder <i class="fa fa-plus"></i> {{ trans('folders.create resource') }}
</el-button> </el-button>
<el-dialog title="New Folder" :visible.sync="dialogFormVisible" size="tiny"> <el-dialog :title="trans('folders.create resource')" :visible.sync="dialogFormVisible" width="30%">
<el-form :model="folder" v-loading.body="loading" @submit.native.prevent="onSubmit()"> <el-form :model="folder" v-loading.body="loading" @submit.native.prevent="onSubmit()">
<el-form-item label="Folder name" :class="{'el-form-item is-error': form.errors.has('name') }"> <el-form-item :label="trans('folders.folder name')" :class="{'el-form-item is-error': form.errors.has('name') }">
<el-input v-model="folder.name" auto-complete="off" autofocus></el-input> <el-input v-model="folder.name" auto-complete="off" autofocus></el-input>
<div class="el-form-item__error" v-if="form.errors.has('name')" <div class="el-form-item__error" v-if="form.errors.has('name')"
v-text="form.errors.first('name')"></div> v-text="form.errors.first('name')"></div>
</el-form-item> </el-form-item>
</el-form> </el-form>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<el-button @click="closeDialog">Cancel</el-button> <el-button @click="closeDialog">{{ trans('core.button.cancel') }}</el-button>
<el-button type="primary" @click="onSubmit()">Confirm</el-button> <el-button type="primary" @click="onSubmit()">{{ trans('core.confirm') }}</el-button>
</span> </span>
</el-dialog> </el-dialog>
...@@ -22,11 +22,11 @@ ...@@ -22,11 +22,11 @@
</template> </template>
<script> <script>
import Form from 'form-backend-validation' import Form from 'form-backend-validation';
export default { export default {
props: { props: {
parentId: {type: Number} parentId: { type: Number },
}, },
data() { data() {
return { return {
...@@ -36,29 +36,29 @@ ...@@ -36,29 +36,29 @@
}, },
form: new Form(), form: new Form(),
loading: false, loading: false,
} };
}, },
methods: { methods: {
onSubmit() { onSubmit() {
this.form = new Form(_.merge(this.folder, {parent_id: this.parentId})); this.form = new Form(_.merge(this.folder, { parent_id: this.parentId }));
this.loading = true; this.loading = true;
this.form.post(route('api.media.folders.store')) this.form.post(route('api.media.folders.store'))
.then(response => { .then((response) => {
this.loading = false; this.loading = false;
this.$message({ this.$message({
type: 'success', type: 'success',
message: response.message message: response.message,
}); });
this.dialogFormVisible = false; this.dialogFormVisible = false;
this.folder.name = ''; this.folder.name = '';
this.$events.emit('folderWasCreated', response); this.$events.emit('folderWasCreated', response);
}) })
.catch(error => { .catch((error) => {
console.log(error); console.log(error);
this.loading = false; this.loading = false;
this.$notify.error({ this.$notify.error({
title: 'Error', title: 'Error',
message: 'There are some errors in the form.' message: 'There are some errors in the form.',
}); });
}); });
}, },
...@@ -68,8 +68,8 @@ ...@@ -68,8 +68,8 @@
}, },
}, },
mounted() { mounted() {
} },
} };
</script> </script>
<style> <style>
.new-folder { .new-folder {
......
<template> <template>
<div> <div>
<el-dialog title="Rename Folder" :visible.sync="dialogFormVisible" size="tiny"> <el-dialog title="Rename Folder" :visible.sync="dialogFormVisible" width="30%">
<el-form :model="folder" v-loading.body="loading" @submit.native.prevent="onSubmit()"> <el-form :model="folder" v-loading.body="loading" @submit.native.prevent="onSubmit()">
<el-form-item label="Folder name" :class="{'el-form-item is-error': form.errors.has('name') }"> <el-form-item label="Folder name" :class="{'el-form-item is-error': form.errors.has('name') }">
<el-input v-model="folder.name" auto-complete="off" autofocus></el-input> <el-input v-model="folder.name" auto-complete="off" autofocus></el-input>
...@@ -9,15 +9,15 @@ ...@@ -9,15 +9,15 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<el-button @click="closeDialog">Cancel</el-button> <el-button @click="closeDialog">{{ trans('core.button.cancel') }}</el-button>
<el-button type="primary" @click="onSubmit()">Confirm</el-button> <el-button type="primary" @click="onSubmit()">{{ trans('core.confirm') }}</el-button>
</span> </span>
</el-dialog> </el-dialog>
</div> </div>
</template> </template>
<script> <script>
import Form from 'form-backend-validation' import Form from 'form-backend-validation';
export default { export default {
// props: { // props: {
...@@ -33,28 +33,28 @@ ...@@ -33,28 +33,28 @@
}, },
form: new Form(), form: new Form(),
loading: false, loading: false,
} };
}, },
methods: { methods: {
onSubmit() { onSubmit() {
this.form = new Form(this.folder); this.form = new Form(this.folder);
this.loading = true; this.loading = true;
this.form.post(route('api.media.folders.update', {folder: this.folder.id})) this.form.post(route('api.media.folders.update', { folder: this.folder.id }))
.then(response => { .then((response) => {
this.loading = false; this.loading = false;
this.$message({ this.$message({
type: 'success', type: 'success',
message: response.message message: response.message,
}); });
this.dialogFormVisible = false; this.dialogFormVisible = false;
this.$events.emit('folderWasUpdated', response); this.$events.emit('folderWasUpdated', response);
}) })
.catch(error => { .catch((error) => {
console.log(error); console.log(error);
this.loading = false; this.loading = false;
this.$notify.error({ this.$notify.error({
title: 'Error', title: 'Error',
message: 'There are some errors in the form.' message: 'There are some errors in the form.',
}); });
}); });
}, },
...@@ -64,12 +64,12 @@ ...@@ -64,12 +64,12 @@
}, },
}, },
mounted() { mounted() {
this.$events.listen('editFolderWasClicked', eventData => { this.$events.listen('editFolderWasClicked', (eventData) => {
this.folder.name = eventData.filename; this.folder.name = eventData.filename;
this.folder.id = eventData.id; this.folder.id = eventData.id;
this.folder.parent_id = eventData.folder_id; this.folder.parent_id = eventData.folder_id;
this.dialogFormVisible = true; this.dialogFormVisible = true;
}); });
} },
} };
</script> </script>
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
<el-dialog <el-dialog
:visible.sync="dialogVisible" :visible.sync="dialogVisible"
size="full" fullscreen
:before-close="handleClose"> :before-close="handleClose">
<media-list single-modal :event-name="this.eventName"></media-list> <media-list single-modal :event-name="this.eventName"></media-list>
...@@ -29,18 +29,18 @@ ...@@ -29,18 +29,18 @@
</template> </template>
<script> <script>
import axios from 'axios';
import UploadZone from './UploadZone.vue'; import UploadZone from './UploadZone.vue';
import MediaList from './MediaList.vue'; import MediaList from './MediaList.vue';
import StringHelpers from '../../../../Core/Assets/js/mixins/StringHelpers' import StringHelpers from '../../../../Core/Assets/js/mixins/StringHelpers.vue';
import axios from 'axios'
export default { export default {
mixins: [StringHelpers], mixins: [StringHelpers],
props: { props: {
zone: {type: String, required: true}, zone: { type: String, required: true },
entity: {type: String, required: true}, entity: { type: String, required: true },
entityId: {type: Number}, entityId: { default: null },
label: {type: String}, label: { type: String },
}, },
components: { components: {
'upload-zone': UploadZone, 'upload-zone': UploadZone,
...@@ -58,11 +58,11 @@ ...@@ -58,11 +58,11 @@
dialogVisible: false, dialogVisible: false,
selectedMedia: {}, selectedMedia: {},
eventName: '', eventName: '',
} };
}, },
computed: { computed: {
hasSelectedMedia() { hasSelectedMedia() {
return ! _.isEmpty(this.selectedMedia); return !_.isEmpty(this.selectedMedia);
}, },
}, },
methods: { methods: {
...@@ -71,7 +71,7 @@ ...@@ -71,7 +71,7 @@
}, },
unSelectMedia() { unSelectMedia() {
this.selectedMedia = {}; this.selectedMedia = {};
this.$emit('singleFileSelected', _.merge({id: null}, {zone: this.zone})); this.$emit('singleFileSelected', _.merge({ id: null }, { zone: this.zone }));
}, },
fetchMedia() { fetchMedia() {
axios.get(route('api.media.find-first-by-zone-and-entity', { axios.get(route('api.media.find-first-by-zone-and-entity', {
...@@ -79,32 +79,34 @@ ...@@ -79,32 +79,34 @@
entity: this.entity, entity: this.entity,
entity_id: this.entityId, entity_id: this.entityId,
})) }))
.then(response => { .then((response) => {
this.$emit('singleFileSelected', _.merge(response.data.data, {zone: this.zone})); this.$emit('singleFileSelected', _.merge(response.data.data, { zone: this.zone }));
this.selectedMedia = response.data.data; this.selectedMedia = response.data.data;
}) });
}, },
getFieldLabel() { getFieldLabel() {
return this.label || this.ucwords(this.zone.replace('_', ' ')); return this.label || this.ucwords(this.zone.replace('_', ' '));
}, },
makeId() { makeId() {
let text = ""; let text = '';
let possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
for (let i = 0; i < 5; i++) for (let i = 0; i < 5; i++) { text += possible.charAt(Math.floor(Math.random() * possible.length)); }
text += possible.charAt(Math.floor(Math.random() * possible.length));
return text; return text;
}, },
}, },
mounted() { mounted() {
this.eventName = 'fileWasSelected' + this.makeId() + Math.floor(Math.random() * 999999); if (this.entityId) {
this.fetchMedia();
}
this.eventName = `fileWasSelected${this.makeId()}${Math.floor(Math.random() * 999999)}`;
this.$events.listen(this.eventName, mediaData => { this.$events.listen(this.eventName, (mediaData) => {
this.dialogVisible = false; this.dialogVisible = false;
this.selectedMedia = mediaData; this.selectedMedia = mediaData;
this.$emit('singleFileSelected', _.merge(mediaData, {zone: this.zone})); this.$emit('singleFileSelected', _.merge(mediaData, { zone: this.zone }));
}); });
} },
} };
</script> </script>
...@@ -8,61 +8,61 @@ ...@@ -8,61 +8,61 @@
:http-request="uploadFile" :http-request="uploadFile"
:multiple="true" :multiple="true"
style="display: inline-block; margin-right: 10px;"> style="display: inline-block; margin-right: 10px;">
<el-button size="small" type="primary" style="padding: 11px 9px;" :loading="fileIsUploading">{{ trans('media.upload file') }}</el-button> <el-button size="small" type="primary" style="padding: 13px 9px;" :loading="fileIsUploading">{{ trans('media.upload file') }}</el-button>
</el-upload> </el-upload>
</template> </template>
<script> <script>
import axios from 'axios' import axios from 'axios';
export default { export default {
props: { props: {
parentId: {type: Number} parentId: { type: Number },
}, },
data() { data() {
return { return {
fileIsUploading: false, fileIsUploading: false,
} };
}, },
computed: { computed: {
uploadUrl() { uploadUrl() {
return route('api.media.store').domain + route('api.media.store').url; return route('api.media.store').domain + route('api.media.store').url;
}, },
requestHeaders() { requestHeaders() {
let userApiToken = document.head.querySelector('meta[name="user-api-token"]'); const userApiToken = document.head.querySelector('meta[name="user-api-token"]');
return { return {
'Authorization': 'Bearer ' + userApiToken.content Authorization: `Bearer ${userApiToken.content}`,
}; };
}, },
}, },
methods: { methods: {
handleSuccess(response, file, fileList) { handleSuccess(response) {
this.$events.emit('fileWasUploaded', response); this.$events.emit('fileWasUploaded', response);
}, },
uploadFile(event) { uploadFile(event) {
this.fileIsUploading = true; this.fileIsUploading = true;
let data = new FormData(); const data = new FormData();
data.append('parent_id', this.parentId); data.append('parent_id', this.parentId);
data.append('file', event.file); data.append('file', event.file);
axios.post(route('api.media.store'), data) axios.post(route('api.media.store'), data)
.then(response => { .then((response) => {
this.$events.emit('fileWasUploaded', response); this.$events.emit('fileWasUploaded', response);
this.fileIsUploading = false; this.fileIsUploading = false;
}) })
.catch(error => { .catch((error) => {
console.log(error.response.data); console.log(error.response.data);
this.fileIsUploading = false; this.fileIsUploading = false;
this.$notify.error({ this.$notify.error({
title: 'Error', title: 'Error',
message: error.response.data.errors.file[0] message: error.response.data.errors.file[0],
}); });
}); });
}, },
handleRemove() {}, handleRemove() {},
}, },
mounted() { mounted() {
} },
} };
</script> </script>
<style> <style>
.el-upload__input { .el-upload__input {
......
...@@ -23,29 +23,29 @@ ...@@ -23,29 +23,29 @@
data() { data() {
return { return {
fileList: [], fileList: [],
} };
}, },
computed: { computed: {
uploadUrl() { uploadUrl() {
return route('api.media.store').domain + route('api.media.store').url; return route('api.media.store').domain + route('api.media.store').url;
}, },
requestHeaders() { requestHeaders() {
let userApiToken = document.head.querySelector('meta[name="user-api-token"]'); const userApiToken = document.head.querySelector('meta[name="user-api-token"]');
return { return {
'Authorization': 'Bearer ' + userApiToken.content Authorization: `Bearer ${userApiToken.content}`,
}; };
}, },
}, },
methods: { methods: {
handleSuccess(response, file, fileList) { handleSuccess(response) {
this.$events.emit('fileWasUploaded', response); this.$events.emit('fileWasUploaded', response);
this.fileList = []; this.fileList = [];
}, },
handlePreview() {}, handlePreview() {},
handleRemove() {}, handleRemove() {},
}, },
mounted() {} mounted() {},
} };
</script> </script>
<style> <style>
.el-upload__input { .el-upload__input {
......
import PageTable from './components/PageTable.vue' import PageTable from './components/PageTable.vue';
import PageTableServerSide from './components/PageTableServerSide.vue' import PageTableServerSide from './components/PageTableServerSide.vue';
import PageForm from './components/PageForm.vue' import PageForm from './components/PageForm.vue';
const locales = window.AsgardCMS.locales; const locales = window.AsgardCMS.locales;
...@@ -17,7 +17,7 @@ export default [ ...@@ -17,7 +17,7 @@ export default [
props: { props: {
locales, locales,
pageTitle: 'create page', pageTitle: 'create page',
} },
}, },
{ {
path: '/page/pages/:pageId/edit', path: '/page/pages/:pageId/edit',
...@@ -26,6 +26,6 @@ export default [ ...@@ -26,6 +26,6 @@ export default [
props: { props: {
locales, locales,
pageTitle: 'edit page', pageTitle: 'edit page',
} },
}, },
]; ];
...@@ -6,14 +6,14 @@ ...@@ -6,14 +6,14 @@
<data-tables :data="data" :actions-def="actionsDef"> <data-tables :data="data" :actions-def="actionsDef">
<el-table-column prop="id" label="Id" width="100"> <el-table-column prop="id" label="Id" width="100">
</el-table-column> </el-table-column>
<el-table-column prop="title" :label="trans('page.title')"> <el-table-column prop="title" :label="trans('pages.title')">
</el-table-column> </el-table-column>
<el-table-column prop="slug" label="Slug"> <el-table-column prop="slug" label="Slug">
</el-table-column> </el-table-column>
<el-table-column prop="created_at" label="Created at"> <el-table-column prop="created_at" label="Created at">
</el-table-column> </el-table-column>
<el-table-column fixed="right" prop="actions" label="Actions"> <el-table-column fixed="right" prop="actions" label="Actions">
<template scope="scope"> <template slot-scope="scope">
<a class="btn btn-default btn-flat" @click.prevent="goToEdit(scope)"><i <a class="btn btn-default btn-flat" @click.prevent="goToEdit(scope)"><i
class="fa fa-pencil"></i></a> class="fa fa-pencil"></i></a>
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
</template> </template>
<script> <script>
import axios from 'axios' import axios from 'axios';
let data; let data;
...@@ -42,30 +42,30 @@ ...@@ -42,30 +42,30 @@
links: {}, links: {},
actionsDef: { actionsDef: {
def: [{ def: [{
name: this.trans('page.create-page'), name: this.trans('pages.create-page'),
icon: 'edit', icon: 'edit',
handler: () => { handler: () => {
this.$router.push({name: 'admin.page.page.create'}) this.$router.push({ name: 'admin.page.page.create' });
} },
}] }],
} },
} };
}, },
methods: { methods: {
fetchData() { fetchData() {
axios.get(route('api.page.page.index')) axios.get(route('api.page.page.index'))
.then(response => { .then((response) => {
this.data = response.data.data; this.data = response.data.data;
this.meta = response.data.meta; this.meta = response.data.meta;
this.links = response.data.links; this.links = response.data.links;
}); });
}, },
goToEdit(scope) { goToEdit(scope) {
this.$router.push({name: 'admin.page.page.edit', params: {pageId: scope.row.id}}) this.$router.push({ name: 'admin.page.page.edit', params: { pageId: scope.row.id } });
}, },
}, },
mounted() { mounted() {
this.fetchData(); this.fetchData();
} },
} };
</script> </script>
import RoleTable from './components/RoleTable.vue';
import RoleForm from './components/RoleForm.vue';
import UserTable from './components/UserTable.vue';
import UserForm from './components/UserForm.vue';
import UserProfile from './components/UserProfile.vue';
import ApiKeys from './components/ApiKeys.vue';
const locales = window.AsgardCMS.locales;
export default [
// Role Routes
{
path: '/user/roles',
name: 'admin.user.roles.index',
component: RoleTable,
},
{
path: '/user/roles/create',
name: 'admin.user.roles.create',
component: RoleForm,
props: {
locales,
pageTitle: 'new-role',
},
},
{
path: '/user/roles/:roleId/edit',
name: 'admin.user.roles.edit',
component: RoleForm,
props: {
locales,
pageTitle: 'title.edit',
},
},
// User Routes
{
path: '/user/users',
name: 'admin.user.users.index',
component: UserTable,
},
{
path: '/user/users/create',
name: 'admin.user.users.create',
component: UserForm,
props: {
locales,
pageTitle: 'title.new-user',
},
},
{
path: '/user/users/:userId/edit',
name: 'admin.user.users.edit',
component: UserForm,
props: {
locales,
pageTitle: 'title.edit-user',
},
},
// Account routes
{
path: '/account/profile',
name: 'admin.user.users.account',
component: UserProfile,
},
{
path: '/account/api-keys',
name: 'admin.user.users.account.api-keys',
component: ApiKeys,
},
];
<template>
<div>
<div class="content-header">
<h1>
{{ trans('users.api-keys') }}
</h1>
<el-breadcrumb separator="/">
<el-breadcrumb-item>
<a href="/backend">{{ trans('core.breadcrumb.home') }}</a>
</el-breadcrumb-item>
<el-breadcrumb-item :to="{name: 'admin.user.users.account.api-keys'}">{{ trans('users.api-keys') }}
</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="row">
<div class="col-md-12">
<div class="box box-primary">
<div class="box-header with-border">
<h3 class="box-title">{{ trans('users.your api keys') }}</h3>
<div class="box-tools pull-right">
<el-button type="primary" size="small" icon="plus" @click="generateKey">
{{ trans('users.generate new api key') }}
</el-button>
</div>
</div>
<div class="box-body">
<ul class="list-unstyled">
<li style="margin-bottom: 20px;"
v-for="key in apiKeys"
:key="key.id">
<el-input v-model="key.access_token" disabled>
<el-button slot-scope="prepend" @click="destroyApiKey(key)">
<i class="fa fa-times"></i>
</el-button>
</el-input>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import axios from 'axios';
export default {
data() {
return {
loading: false,
apiKeys: {},
};
},
methods: {
fetchApiKeys() {
this.loading = true;
axios.get(route('api.account.api.index'))
.then((response) => {
this.loading = false;
this.apiKeys = response.data.data;
});
},
generateKey() {
axios.get(route('api.account.api.create'))
.then((response) => {
this.loading = false;
this.apiKeys = response.data.data;
this.$message({
type: 'success',
message: response.data.message,
});
});
},
destroyApiKey(apiKey) {
this.$confirm(this.trans('users.delete api key confirm'), '', {
confirmButtonText: this.trans('core.button.delete'),
cancelButtonText: this.trans('core.button.cancel'),
type: 'warning',
confirmButtonClass: 'el-button--danger',
}).then(() => {
axios.delete(route('api.account.api.destroy', { userTokenId: apiKey.id }))
.then((response) => {
this.loading = false;
this.apiKeys = response.data.data;
this.$message({
type: 'success',
message: response.data.message,
});
});
})
.catch(() => {
});
},
},
mounted() {
this.fetchApiKeys();
},
};
</script>
<template>
<div>
<p class="pull-right">
<el-button type="text"
@click="changeStateForAll(1)">
{{ trans('roles.allow all') }}
</el-button>
<el-button type="text"
:disabled="isRole"
@click="changeStateForAll(0)">
{{ trans('roles.inherit all') }}
</el-button>
<el-button type="text"
@click="changeStateForAll(-1)">
{{ trans('roles.deny all') }}
</el-button>
</p>
<div v-for="(value, name) in allPermissions" :key="name">
<h3>{{ name }}</h3>
<div v-for="(permissionActions, subPermissionTitle) in value" :key="subPermissionTitle">
<div class="row">
<div class="col-md-12">
<div class="row">
<div class="col-md-3"><h4 class="pull-left">{{ ucfirst(subPermissionTitle) }}</h4></div>
<div class="col-md-9">
<p style="margin-top: 10px;">
<el-button type="text"
@click="changeState(subPermissionTitle, permissionActions, 1)">
{{ trans('roles.allow all') }}
</el-button>
<el-button type="text"
:disabled="isRole"
@click="changeState(subPermissionTitle, permissionActions, 0)">
{{ trans('roles.inherit all') }}
</el-button>
<el-button type="text"
@click="changeState(subPermissionTitle, permissionActions, -1)">
{{ trans('roles.deny all') }}
</el-button>
</p>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12" v-for="(label, permissionAction) in permissionActions" :key="permissionAction">
<div class="row">
<div class="col-md-3">
<div class="visible-sm-block visible-md-block visible-lg-block">
<label class="control-label text-right" style="display: block">{{ parseTranslation(label) }}</label>
</div>
<div class="visible-xs-block">
<label class="control-label">{{ parseTranslation(label) }}</label>
</div>
</div>
<div class="col-md-9">
<el-radio-group v-model="permissions[`${subPermissionTitle}.${permissionAction}`]">
<el-radio-button :label="1" @click="triggerEvent">{{ trans('roles.allow') }}</el-radio-button>
<el-radio-button :label="0" @click="triggerEvent" :disabled="isRole">{{ trans('roles.inherit') }}</el-radio-button>
<el-radio-button :label="-1" @click="triggerEvent">{{ trans('roles.deny') }}</el-radio-button>
</el-radio-group>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import axios from 'axios';
import StringHelpers from '../../../../Core/Assets/js/mixins/StringHelpers.vue';
export default {
mixins: [StringHelpers],
props: {
isRole: { type: Boolean },
currentPermissions: { default: null },
},
data() {
return {
permissions: {},
allPermissions: {},
};
},
methods: {
triggerEvent() {
this.$emit('input', this.permissions);
},
parseTranslation(label) {
return this.trans(label.split('::')[1]);
},
getPermissionKey(subPermissionTitle, permissionAction) {
return `${subPermissionTitle}.${permissionAction}`;
},
changeState(permissionPart, actions, state) {
_.forEach(actions, (translationKey, key) => {
this.permissions[`${permissionPart}.${key}`] = state;
});
},
changeStateForAll(state) {
_.forEach(this.permissions, (index, permission) => {
this.permissions[permission] = state;
});
},
fetchPermissions() {
axios.get(route('api.user.permissions.index'))
.then((response) => {
this.loading = false;
this.allPermissions = response.data.permissions;
});
},
},
watch: {
currentPermissions() {
if (this.currentPermissions !== null) {
this.permissions = this.currentPermissions;
}
},
},
mounted() {
this.fetchPermissions();
},
};
</script>
<template>
<div>
<div class="content-header">
<h1>
{{ trans(`roles.${pageTitle}`) }} <small>{{ role.name }}</small>
</h1>
<el-breadcrumb separator="/">
<el-breadcrumb-item>
<a href="/backend">{{ trans('core.breadcrumb.home') }}</a>
</el-breadcrumb-item>
<el-breadcrumb-item :to="{name: 'admin.user.roles.index'}">{{ trans('roles.title.roles') }}
</el-breadcrumb-item>
<el-breadcrumb-item :to="{name: 'admin.user.roles.create'}">{{ trans(`roles.${pageTitle}`) }}
</el-breadcrumb-item>
</el-breadcrumb>
</div>
<el-form ref="form"
:model="role"
label-width="120px"
label-position="top"
v-loading.body="loading"
@keydown="form.errors.clear($event.target.name);">
<div class="row">
<div class="col-md-12">
<div class="box box-primary">
<div class="box-body">
<el-tabs>
<el-tab-pane :label="trans('roles.tabs.data')">
<el-form-item :label="trans('roles.form.name')"
:class="{'el-form-item is-error': form.errors.has('name') }">
<el-input v-model="role.name"></el-input>
<div class="el-form-item__error" v-if="form.errors.has('name')"
v-text="form.errors.first('name')"></div>
</el-form-item>
<el-form-item :label="trans('roles.form.slug')"
:class="{'el-form-item is-error': form.errors.has('slug') }">
<el-input v-model="role.slug">
<el-button slot-scope="prepend" @click="generateSlug">Generate</el-button>
</el-input>
<div class="el-form-item__error" v-if="form.errors.has('slug')"
v-text="form.errors.first('slug')"></div>
</el-form-item>
</el-tab-pane>
<el-tab-pane :label="trans('roles.tabs.permissions')">
<asgard-permissions v-model="role.permissions"
is-role
:current-permissions="role.permissions"></asgard-permissions>
</el-tab-pane>
<el-tab-pane :label="trans('users.title.users')">
<h3>{{ trans('roles.title.users-with-roles') }}</h3>
<ul>
<li v-for="user in role.users" :key="user.id">{{ user.fullname }} ({{ user.email }})</li>
</ul>
</el-tab-pane>
</el-tabs>
</div>
<div class="box-footer">
<el-form-item>
<el-button type="primary" @click="onSubmit()" :loading="loading">
{{ trans('core.save') }}
</el-button>
<el-button @click="onCancel()">{{ trans('core.button.cancel') }}
</el-button>
</el-form-item>
</div>
</div>
</div>
</div>
</el-form>
<button v-shortkey="['b']" @shortkey="pushRoute({name: 'admin.user.roles.index'})" v-show="false"></button>
</div>
</template>
<script>
import axios from 'axios';
import Form from 'form-backend-validation';
import Slugify from '../../../../Core/Assets/js/mixins/Slugify';
import ShortcutHelper from '../../../../Core/Assets/js/mixins/ShortcutHelper';
import AsgardPermissions from './AsgardPermissions.vue';
export default {
mixins: [Slugify, ShortcutHelper],
components: {
'asgard-permissions': AsgardPermissions,
},
props: {
locales: { default: null },
pageTitle: { default: null, String },
},
data() {
return {
role: {
name: '',
slug: '',
permissions: {},
users: {},
},
form: new Form(),
loading: false,
};
},
methods: {
onSubmit() {
this.form = new Form(this.role);
this.loading = true;
this.form.post(this.getRoute())
.then((response) => {
this.loading = false;
this.$message({
type: 'success',
message: response.message,
});
this.$router.push({ name: 'admin.user.roles.index' });
})
.catch((error) => {
console.log(error);
this.loading = false;
this.$notify.error({
title: 'Error',
message: 'There are some errors in the form.',
});
});
},
onCancel() {
this.$router.push({ name: 'admin.user.roles.index' });
},
generateSlug() {
this.role.slug = this.slugify(this.role.name);
},
fetchRole() {
this.loading = true;
let routeUri = '';
if (this.$route.params.roleId !== undefined) {
routeUri = route('api.user.role.find', { role: this.$route.params.roleId });
} else {
routeUri = route('api.user.role.find-new');
}
axios.post(routeUri)
.then((response) => {
this.loading = false;
this.role = response.data.data;
});
},
getRoute() {
if (this.$route.params.roleId !== undefined) {
return route('api.user.role.update', { role: this.$route.params.roleId });
}
return route('api.user.role.store');
},
},
mounted() {
this.fetchRole();
},
};
</script>
<template>
<div>
<div class="content-header">
<h1>
{{ trans('roles.title.roles') }}
</h1>
<el-breadcrumb separator="/">
<el-breadcrumb-item>
<a href="/backend">{{ trans('core.breadcrumb.home') }}</a>
</el-breadcrumb-item>
<el-breadcrumb-item :to="{name: 'admin.user.roles.index'}">{{ trans('roles.title.roles') }}
</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="row">
<div class="col-xs-12">
<div class="box box-primary">
<div class="box-body">
<div class="sc-table">
<div class="tool-bar el-row" style="padding-bottom: 20px;">
<div class="actions el-col el-col-8">
<router-link :to="{name: 'admin.user.roles.create'}">
<el-button type="primary"><i class="el-icon-edit"></i>
{{ trans('roles.new-role') }}
</el-button>
</router-link>
</div>
<div class="search el-col el-col-5">
<el-input prefix-icon="el-icon-search" @keyup.native="performSearch" v-model="searchQuery">
</el-input>
</div>
</div>
<el-table
:data="data"
stripe
style="width: 100%"
ref="pageTable"
v-loading.body="tableIsLoading"
@sort-change="handleSortChange">
<el-table-column prop="id" label="Id" width="75" sortable="custom">
</el-table-column>
<el-table-column prop="name" :label="trans('roles.table.name')" sortable="custom">
<template slot-scope="scope">
<a @click.prevent="goToEdit(scope)" href="#">
{{ scope.row.name }}
</a>
</template>
</el-table-column>
<el-table-column prop="slug" :label="trans('roles.table.slug')" sortable="custom">
<template slot-scope="scope">
<a @click.prevent="goToEdit(scope)" href="#">
{{ scope.row.slug }}
</a>
</template>
</el-table-column>
<el-table-column prop="created_at" :label="trans('core.table.created at')"
sortable="custom">
</el-table-column>
<el-table-column prop="actions" :label="trans('core.table.actions')">
<template slot-scope="scope">
<el-button-group>
<edit-button
:to="{name: 'admin.user.roles.edit', params: {roleId: scope.row.id}}"></edit-button>
<delete-button :scope="scope" :rows="data"></delete-button>
</el-button-group>
</template>
</el-table-column>
</el-table>
<div class="pagination-wrap" style="text-align: center; padding-top: 20px;">
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page.sync="meta.current_page"
:page-sizes="[10, 20, 50, 100]"
:page-size="parseInt(meta.per_page)"
layout="total, sizes, prev, pager, next, jumper"
:total="meta.total">
</el-pagination>
</div>
</div>
</div>
</div>
</div>
</div>
<button v-shortkey="['c']" @shortkey="pushRoute({name: 'admin.user.roles.create'})" v-show="false"></button>
</div>
</template>
<script>
import axios from 'axios';
import _ from 'lodash';
import ShortcutHelper from '../../../../Core/Assets/js/mixins/ShortcutHelper';
export default {
mixins: [ShortcutHelper],
data() {
return {
data: [],
meta: {
current_page: 1,
per_page: 10,
},
order_meta: {
order_by: '',
order: '',
},
links: {},
searchQuery: '',
tableIsLoading: false,
};
},
methods: {
queryServer(customProperties) {
const properties = {
page: this.meta.current_page,
per_page: this.meta.per_page,
order_by: this.order_meta.order_by,
order: this.order_meta.order,
search: this.searchQuery,
};
axios.get(route('api.user.role.index', _.merge(properties, customProperties)))
.then((response) => {
this.tableIsLoading = false;
this.data = response.data.data;
this.meta = response.data.meta;
this.links = response.data.links;
this.order_meta.order_by = properties.order_by;
this.order_meta.order = properties.order;
});
},
fetchData() {
this.tableIsLoading = true;
this.queryServer();
},
handleSizeChange(event) {
console.log(`per page :${event}`);
this.tableIsLoading = true;
this.queryServer({ per_page: event });
},
handleCurrentChange(event) {
console.log(`current page :${event}`);
this.tableIsLoading = true;
this.queryServer({ page: event });
},
handleSortChange(event) {
console.log('sorting', event);
this.tableIsLoading = true;
this.queryServer({ order_by: event.prop, order: event.order });
},
performSearch: _.debounce(function (query) {
console.log(`searching:${query.target.value}`);
this.tableIsLoading = true;
this.queryServer({ search: query.target.value });
}, 300),
goToEdit(scope) {
this.$router.push({ name: 'admin.user.roles.edit', params: { roleId: scope.row.id } });
},
},
mounted() {
this.fetchData();
},
};
</script>
This diff is collapsed.
<template>
<div>
<div class="content-header">
<h1>
{{ trans('users.title.edit-profile') }}
</h1>
<el-breadcrumb separator="/">
<el-breadcrumb-item>
<a href="/backend">{{ trans('core.breadcrumb.home') }}</a>
</el-breadcrumb-item>
<el-breadcrumb-item :to="{name: 'admin.user.users.account'}">{{ trans('users.breadcrumb.edit-profile') }}
</el-breadcrumb-item>
</el-breadcrumb>
</div>
<el-form ref="form"
:model="user"
label-width="120px"
label-position="top"
v-loading.body="loading"
@keydown="form.errors.clear($event.target.name);">
<div class="row">
<div class="col-md-12">
<div class="box box-primary">
<div class="box-body">
<el-tabs>
<el-tab-pane :label="trans('users.tabs.data')">
<span slot-scope="label"
:class="{'error' : form.errors.any()}">
{{ trans('users.tabs.data') }}
</span>
<el-form-item :label="trans('users.form.first-name')"
:class="{'el-form-item is-error': form.errors.has('first_name') }">
<el-input v-model="user.first_name"></el-input>
<div class="el-form-item__error" v-if="form.errors.has('first_name')"
v-text="form.errors.first('first_name')"></div>
</el-form-item>
<el-form-item :label="trans('users.form.last-name')"
:class="{'el-form-item is-error': form.errors.has('last_name') }">
<el-input v-model="user.last_name"></el-input>
<div class="el-form-item__error" v-if="form.errors.has('last_name')"
v-text="form.errors.first('last_name')"></div>
</el-form-item>
<el-form-item :label="trans('users.form.email')"
:class="{'el-form-item is-error': form.errors.has('email') }">
<el-input v-model="user.email"></el-input>
<div class="el-form-item__error" v-if="form.errors.has('email')"
v-text="form.errors.first('email')"></div>
</el-form-item>
</el-tab-pane>
<el-tab-pane :label="trans('users.tabs.new password')" v-if="! user.is_new">
<h4>{{ trans('users.new password setup') }}</h4>
<el-form-item :label="trans('users.form.password')"
:class="{'el-form-item is-error': form.errors.has('password') }">
<el-input v-model="user.password"
type="password"></el-input>
<div class="el-form-item__error" v-if="form.errors.has('password')"
v-text="form.errors.first('password')"></div>
</el-form-item>
<el-form-item :label="trans('users.form.password-confirmation')"
:class="{'el-form-item is-error': form.errors.has('password_confirmation') }">
<el-input v-model="user.password_confirmation"
type="password"></el-input>
<div class="el-form-item__error" v-if="form.errors.has('password_confirmation')"
v-text="form.errors.first('password_confirmation')"></div>
</el-form-item>
</el-tab-pane>
</el-tabs>
</div>
<div class="box-footer">
<el-form-item>
<el-button type="primary" @click="onSubmit()" :loading="loading">
{{ trans('core.save') }}
</el-button>
</el-form-item>
</div>
</div>
</div>
</div>
</el-form>
</div>
</template>
<script>
import axios from 'axios';
import Form from 'form-backend-validation';
export default {
props: {
locales: { default: null },
},
data() {
return {
user: {
first_name: '',
last_name: '',
permissions: {},
roles: {},
is_new: false,
},
roles: {},
form: new Form(),
loading: false,
};
},
methods: {
onSubmit() {
this.form = new Form(this.user);
this.loading = true;
this.form.post(route('api.account.profile.update'))
.then((response) => {
this.loading = false;
this.$message({
type: 'success',
message: response.message,
});
})
.catch((error) => {
console.log(error);
this.loading = false;
this.$notify.error({
title: 'Error',
message: 'There are some errors in the form.',
});
});
},
fetchUser() {
this.loading = true;
axios.get(route('api.account.profile.find-current-user'))
.then((response) => {
this.loading = false;
this.user = response.data.data;
});
},
},
mounted() {
this.fetchUser();
},
};
</script>
<template>
<div>
<div class="content-header">
<h1>
{{ trans('users.title.users') }}
</h1>
<el-breadcrumb separator="/">
<el-breadcrumb-item>
<a href="/backend">{{ trans('core.breadcrumb.home') }}</a>
</el-breadcrumb-item>
<el-breadcrumb-item :to="{name: 'admin.user.users.index'}">{{ trans('users.title.users') }}
</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="row">
<div class="col-xs-12">
<div class="box box-primary">
<div class="box-body">
<div class="sc-table">
<div class="tool-bar el-row" style="padding-bottom: 20px;">
<div class="actions el-col el-col-8">
<router-link :to="{name: 'admin.user.users.create'}">
<el-button type="primary"><i class="el-icon-edit"></i>
{{ trans('users.button.new-user') }}
</el-button>
</router-link>
</div>
<div class="search el-col el-col-5">
<el-input prefix-icon="el-icon-search" @keyup.native="performSearch" v-model="searchQuery">
</el-input>
</div>
</div>
<el-table
:data="data"
stripe
style="width: 100%"
ref="pageTable"
v-loading.body="tableIsLoading"
@sort-change="handleSortChange">
<el-table-column prop="id" label="Id" width="75" sortable="custom">
</el-table-column>
<el-table-column prop="first_name" :label="trans('users.table.first-name')" sortable="custom">
<template slot-scope="scope">
<a @click.prevent="goToEdit(scope)" href="#">
{{ scope.row.first_name }}
</a>
</template>
</el-table-column>
<el-table-column prop="last_name" :label="trans('users.table.last-name')" sortable="custom">
<template slot-scope="scope">
<a @click.prevent="goToEdit(scope)" href="#">
{{ scope.row.last_name }}
</a>
</template>
</el-table-column>
<el-table-column prop="email" :label="trans('users.table.email')" sortable="custom">
<template slot-scope="scope">
<a @click.prevent="goToEdit(scope)" href="#">
{{ scope.row.email }}
</a>
</template>
</el-table-column>
<el-table-column prop="created_at" :label="trans('core.table.created at')"
sortable="custom">
</el-table-column>
<el-table-column prop="actions" :label="trans('core.table.actions')">
<template slot-scope="scope">
<el-button-group>
<edit-button
:to="{name: 'admin.user.users.edit', params: {userId: scope.row.id}}"></edit-button>
<delete-button :scope="scope" :rows="data"></delete-button>
</el-button-group>
</template>
</el-table-column>
</el-table>
<div class="pagination-wrap" style="text-align: center; padding-top: 20px;">
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page.sync="meta.current_page"
:page-sizes="[10, 20, 50, 100]"
:page-size="parseInt(meta.per_page)"
layout="total, sizes, prev, pager, next, jumper"
:total="meta.total">
</el-pagination>
</div>
</div>
</div>
</div>
</div>
</div>
<button v-shortkey="['c']" @shortkey="pushRoute({name: 'admin.user.users.create'})" v-show="false"></button>
</div>
</template>
<script>
import axios from 'axios';
import _ from 'lodash';
import ShortcutHelper from '../../../../Core/Assets/js/mixins/ShortcutHelper';
export default {
mixins: [ShortcutHelper],
data() {
return {
data: [],
meta: {
current_page: 1,
per_page: 10,
},
order_meta: {
order_by: '',
order: '',
},
links: {},
searchQuery: '',
tableIsLoading: false,
};
},
methods: {
queryServer(customProperties) {
const properties = {
page: this.meta.current_page,
per_page: this.meta.per_page,
order_by: this.order_meta.order_by,
order: this.order_meta.order,
search: this.searchQuery,
};
axios.get(route('api.user.user.index', _.merge(properties, customProperties)))
.then((response) => {
this.tableIsLoading = false;
this.data = response.data.data;
this.meta = response.data.meta;
this.links = response.data.links;
this.order_meta.order_by = properties.order_by;
this.order_meta.order = properties.order;
});
},
fetchData() {
this.tableIsLoading = true;
this.queryServer();
},
handleSizeChange(event) {
console.log(`per page :${event}`);
this.tableIsLoading = true;
this.queryServer({ per_page: event });
},
handleCurrentChange(event) {
console.log(`current page :${event}`);
this.tableIsLoading = true;
this.queryServer({ page: event });
},
handleSortChange(event) {
console.log('sorting', event);
this.tableIsLoading = true;
this.queryServer({ order_by: event.prop, order: event.order });
},
performSearch: _.debounce(function (query) {
console.log(`searching:${query.target.value}`);
this.tableIsLoading = true;
this.queryServer({ search: query.target.value });
}, 300),
goToEdit(scope) {
this.$router.push({ name: 'admin.user.users.edit', params: { userId: scope.row.id } });
},
},
mounted() {
this.fetchData();
},
};
</script>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment