changes
This commit is contained in:
97
components/parameter/Apps.vue
Normal file
97
components/parameter/Apps.vue
Normal file
@@ -0,0 +1,97 @@
|
||||
<template>
|
||||
<div>
|
||||
<Caption v-bind="{title: 'Tham số'}"></Caption>
|
||||
<div class="field is-horizontal mt-5">
|
||||
<div class="field-body">
|
||||
<div class="field is-narrow">
|
||||
<label class="label">Mã <span class="has-text-danger"> * </span> </label>
|
||||
<p class="control">
|
||||
<input class="input" type="text" placeholder="" v-model="record.code">
|
||||
</p>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label class="label">Tên <span class="has-text-danger"> * </span> </label>
|
||||
<p class="control">
|
||||
<input class="input" type="text" placeholder="" v-model="record.name">
|
||||
</p>
|
||||
</div>
|
||||
<div class="field is-narrow">
|
||||
<label class="label">Thứ tự <span class="has-text-danger"> * </span> </label>
|
||||
<p class="control">
|
||||
<input class="input" type="text" placeholder="" v-model="record.index">
|
||||
</p>
|
||||
<p class="help is-danger" v-if="errors.index">{{ errors.index }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field is-horizontal mt-5">
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<label class="label">Logo<span class="has-text-danger"> * </span> </label>
|
||||
<p class="control is-expanded">
|
||||
<input class="input" type="text" placeholder="" v-model="record.logo">
|
||||
</p>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label class="label">Link<span class="has-text-danger"> * </span> </label>
|
||||
<p class="control is-expanded">
|
||||
<input class="input" type="text" placeholder="" v-model="record.link">
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="field pl-5">
|
||||
<label class="label">Trạng thái<span class="has-text-danger"> * </span> </label>
|
||||
<span class="mr-4" v-for="(v,i) in option">
|
||||
<a class="icon-text" @click="radio=v">
|
||||
<SvgIcon v-bind="{name: `radio-${radio.code===v.code? '' : 'un'}checked.svg`, type: 'gray', size: 22}"></SvgIcon>
|
||||
<span :class="v.code===1? 'has-text-primary' : 'has-text-danger'">{{ v.name }}</span>
|
||||
</a>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field mt-5">
|
||||
<label class="label">Mô tả<span class="has-text-danger"> * </span> </label>
|
||||
<div class="control">
|
||||
<input class="input" type="text" placeholder="" v-model="record.detail">
|
||||
</div>
|
||||
<div class="mt-5 pt-2">
|
||||
<button class="button is-primary has-text-white" @click="update()">Cập nhật</button>
|
||||
<a class="button is-dark has-text-white ml-5" @click="update(true)" v-if="record.id">Tạo mới</a>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
export default {
|
||||
props: ['api', 'pagename', 'row'],
|
||||
data () {
|
||||
return {
|
||||
record: this.$copy(this.row || {}),
|
||||
errors: {},
|
||||
option: [{code: 0, name: 'Not Active'}, {code: 1, name: 'Active'}],
|
||||
radio: null
|
||||
}
|
||||
},
|
||||
created() {
|
||||
if(!this.row) return
|
||||
this.radio = this.row.active? this.option[1] : this.option[0]
|
||||
},
|
||||
computed: {
|
||||
pagedata: {
|
||||
get: function() {return this.$store.state[this.pagename]},
|
||||
set: function(val) {this.$store.commit('updateStore', {name: this.pagename, data: val})}
|
||||
}
|
||||
},
|
||||
methods :{
|
||||
async update(isNew) {
|
||||
let data = this.$resetNull(this.record)
|
||||
if(isNew) delete data.id
|
||||
data.active = this.radio.code
|
||||
if(data.id) await this.$updaterow(this.api, data, undefined, this.pagename)
|
||||
else await this.$insertrow(this.api, data, undefined, this.pagename)
|
||||
this.$emit('close')
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
59
components/parameter/CodeName.vue
Normal file
59
components/parameter/CodeName.vue
Normal file
@@ -0,0 +1,59 @@
|
||||
<template>
|
||||
<div>
|
||||
<Caption v-bind="{title: 'Parameter', type: 'has-text-warning'}"></Caption>
|
||||
<div class="field is-horizontal mt-5">
|
||||
<div class="field-body">
|
||||
<div class="field is-narrow">
|
||||
<label class="label">Code <span class="has-text-danger"> * </span> </label>
|
||||
<p class="control">
|
||||
<input class="input" type="text" placeholder="" v-model="record.code" id="code">
|
||||
</p>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label class="label">Name (VI) <span class="has-text-danger"> * </span> </label>
|
||||
<p class="control">
|
||||
<input class="input" type="text" placeholder="" v-model="record.name">
|
||||
</p>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label class="label">EN <span class="has-text-danger"> * </span> </label>
|
||||
<p class="control">
|
||||
<input class="input" type="text" placeholder="" v-model="record.en">
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field mt-5">
|
||||
<label class="label">Thứ tự <span class="has-text-danger"> * </span> </label>
|
||||
<p class="control">
|
||||
<input class="input" type="text" placeholder="" v-model="record.index">
|
||||
</p>
|
||||
</div>
|
||||
<div class="mt-5">
|
||||
<button class="button is-primary has-text-white" @click="update()">Update</button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script setup>
|
||||
import { onMounted } from 'vue'
|
||||
const { $copy, $resetNull, $insertrow, $updaterow, $snackbar} = useNuxtApp()
|
||||
var props = defineProps({
|
||||
api: String,
|
||||
pagename: String,
|
||||
row: Object,
|
||||
prefix: String
|
||||
})
|
||||
const emit = defineEmits(['close', 'modalevent'])
|
||||
var record = $copy( props.row || {})
|
||||
async function update() {
|
||||
let data = $resetNull(record)
|
||||
let rs = data.id? await $updaterow(props.api, data, undefined, props.pagename)
|
||||
: await $insertrow(props.api, data, undefined, props.pagename)
|
||||
if(rs==='error') return $snackbar(rs)
|
||||
emit('modalevent', {name: 'dataevent', data: rs})
|
||||
emit('close')
|
||||
}
|
||||
onMounted(()=> {
|
||||
document.getElementById('code').focus()
|
||||
})
|
||||
</script>
|
||||
188
components/parameter/Common.vue
Executable file
188
components/parameter/Common.vue
Executable file
@@ -0,0 +1,188 @@
|
||||
<template>
|
||||
<div class="columns is-multiline is-mobile mx-0">
|
||||
<div class="column is-1">
|
||||
<div class="field">
|
||||
<label class="label has-text-left">ID<span class="has-text-danger ml-1">*</span></label>
|
||||
<div class="control">
|
||||
<input class="input" type="text" v-model="record.id" disabled>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-3">
|
||||
<div class="field">
|
||||
<label class="label has-text-left">Phân loại<span class="has-text-danger ml-1">*</span></label>
|
||||
<div class="control">
|
||||
<input class="input" type="text" v-model="record.category">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-3">
|
||||
<div class="field">
|
||||
<label class="label has-text-left">Phân lớp<span class="has-text-danger ml-1">*</span></label>
|
||||
<div class="control">
|
||||
<input class="input" type="text" v-model="record.classify">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-3">
|
||||
<div class="field">
|
||||
<label class="label has-text-left">Mã<span class="has-text-danger ml-1">*</span></label>
|
||||
<div class="control">
|
||||
<input class="input" type="text" v-model="record.code">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-2">
|
||||
<div class="field">
|
||||
<label class="label has-text-left">Thứ tự</label>
|
||||
<div class="control">
|
||||
<input class="input" type="text" v-model="record.index">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-12">
|
||||
<label class="label has-text-left">VI<span class="has-text-danger ml-1">*</span></label>
|
||||
<div class="field has-addons">
|
||||
<div class="control is-expanded">
|
||||
<textarea class="textarea" placeholder="" rows="3" v-model="record.vi"></textarea>
|
||||
</div>
|
||||
<div class="control ml-5">
|
||||
<a @click="openEditor()">
|
||||
<SvgIcon v-bind="{name: 'pen1.svg', type: 'gray', size: 22}"></SvgIcon>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-12">
|
||||
<label class="label has-text-left">EN<span class="has-text-danger ml-1">*</span></label>
|
||||
<div class="field has-addons">
|
||||
<div class="control is-expanded">
|
||||
<textarea class="textarea" placeholder="" rows="3" v-model="record.en"></textarea>
|
||||
</div>
|
||||
<div class="control ml-5">
|
||||
<a @click="openEditor()">
|
||||
<SvgIcon v-bind="{name: 'pen1.svg', type: 'gray', size: 22}"></SvgIcon>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-6">
|
||||
<div class="field">
|
||||
<label class="label has-text-left">Image</label>
|
||||
<div class="control">
|
||||
<input class="input" type="text" v-model="record.image">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-6">
|
||||
<div class="field">
|
||||
<label class="label has-text-left">Link</label>
|
||||
<div class="control">
|
||||
<input class="input" type="text" v-model="record.link">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-6">
|
||||
<label class="label has-text-left">Detail</label>
|
||||
<div class="field has-addons">
|
||||
<div class="control is-expanded">
|
||||
<input class="input" type="text" placeholder="" v-model="record.detail">
|
||||
</div>
|
||||
<div class="control">
|
||||
<button class="button" @click="editDetail('detail')">
|
||||
<span>
|
||||
<SvgIcon v-bind="{name: 'pen1.svg', type: 'gray', size: 17}"></SvgIcon>
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="control">
|
||||
<button class="button" @click="copyDetail('detail')">
|
||||
Copy
|
||||
</button>
|
||||
</div>
|
||||
<div class="control">
|
||||
<button class="button" @click="pasteDetail('detail')">
|
||||
Paste
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-6">
|
||||
<label class="label has-text-left">Detail EN</label>
|
||||
<div class="field has-addons">
|
||||
<div class="control is-expanded">
|
||||
<input class="input" type="text" placeholder="" v-model="record.detail_en">
|
||||
</div>
|
||||
<div class="control">
|
||||
<button class="button" @click="editDetail('detail_en')">
|
||||
<span>
|
||||
<SvgIcon v-bind="{name: 'pen1.svg', type: 'gray', size: 17}"></SvgIcon>
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="control">
|
||||
<button class="button" @click="copyDetail('detail_en')">
|
||||
Copy
|
||||
</button>
|
||||
</div>
|
||||
<div class="control">
|
||||
<button class="button" @click="pasteDetail('detail_en')">
|
||||
Paste
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-12 pt-5">
|
||||
<a class="button is-primary has-text-white" @click="updateData()">Lưu lại</a>
|
||||
<a class="button is-dark has-text-white ml-5" @click="updateData(true)" v-if="record.id">Tạo mới</a>
|
||||
</div>
|
||||
</div>
|
||||
<Modal @close="showmodal=undefined" v-bind="showmodal" @texteditor="updateText" @update="updateAttr" v-if="showmodal"></Modal>
|
||||
</template>
|
||||
<script setup>
|
||||
const emit = defineEmits([])
|
||||
var props = defineProps({
|
||||
pagename: String,
|
||||
row: Object,
|
||||
api: String
|
||||
})
|
||||
const { $copy, $resetNull, $insertrow, $updaterow, $copyToClipboard, $empty } = useNuxtApp()
|
||||
var record = ref(props.row? $copy(props.row) : {})
|
||||
var showmodal = ref()
|
||||
var vapi = props.api
|
||||
var current
|
||||
var updateText = function(content) {
|
||||
record.value.vi = content
|
||||
}
|
||||
var openEditor = function() {
|
||||
showmodal.value = {component: 'common/TextEditor', vbind: {content: record.value.vi}, title: 'Text editor', width: '40%', height: '150px'}
|
||||
}
|
||||
var editDetail = function(attr) {
|
||||
current = attr
|
||||
let detail = record.value[attr]? record.value[attr] : {}
|
||||
showmodal.value = {component: 'datatable/FieldAttribute', vbind: {field: detail, close: true},
|
||||
title: 'Change attributes', width: '40%', height: '150px'}
|
||||
}
|
||||
var updateAttr = function(detail) {
|
||||
record.value[current] = detail
|
||||
}
|
||||
function copyDetail(attr) {
|
||||
if($empty(record.value[attr])) return
|
||||
let val = typeof record.value[attr]=='string'? record.value[attr] : JSON.stringify(record.value[attr])
|
||||
$copyToClipboard(val)
|
||||
}
|
||||
async function pasteDetail(attr) {
|
||||
let text = await navigator.clipboard.readText()
|
||||
if($empty(text)) return
|
||||
record.value[attr] = JSON.parse(text)
|
||||
}
|
||||
var updateData = async function(isNew) {
|
||||
let ele = record.value
|
||||
if(ele.create_time===null) ele.create_time = new Date()
|
||||
ele = $resetNull(ele)
|
||||
if(isNew) delete ele.id
|
||||
let result = ele.id? await $updaterow(vapi, ele, undefined, props.pagename)
|
||||
: await $insertrow(vapi, ele, undefined, props.pagename)
|
||||
if(isNew) emit('close')
|
||||
}
|
||||
</script>
|
||||
82
components/parameter/DataSetting.vue
Executable file
82
components/parameter/DataSetting.vue
Executable file
@@ -0,0 +1,82 @@
|
||||
<template>
|
||||
<DataTable v-bind="{pagename: pagename}" @updatesetting="updateSetting" v-if="docid" />
|
||||
<div class="mt-6">
|
||||
<Caption v-bind="{title: 'Nhập tên trong trường hợp tạo mới'}"></Caption>
|
||||
<div>
|
||||
<input class="input" type="text" v-model="name">
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-6">
|
||||
<button class="button is-primary" @click="save()">Cập nhật</button>
|
||||
<button class="button is-dark ml-4" @click="save(true)">Tạo mới</button>
|
||||
<button class="button is-dark ml-4" @click="copy()">Copy fields</button>
|
||||
<button class="button is-dark ml-4" @click="paste()">Paste fields</button>
|
||||
<button class="button is-danger ml-6" @click="remove()">Xóa</button>
|
||||
</div>
|
||||
</template>
|
||||
<script setup>
|
||||
import DataTable from '~/components/datatable/DataTable'
|
||||
import { ref } from 'vue'
|
||||
import { useStore } from '~/stores/index'
|
||||
const store = useStore()
|
||||
const { $id, $copy, $updaterow, $insertrow, $findpage, $getpage, $getdata, $setpage } = useNuxtApp()
|
||||
var props = defineProps({
|
||||
setting: Object,
|
||||
masterpage: String
|
||||
})
|
||||
var api = 'usersetting'
|
||||
var pagename = $findpage()
|
||||
var name = undefined
|
||||
var vsetting = undefined
|
||||
var pagedata = undefined
|
||||
var docid = ref(null)
|
||||
async function initData() {
|
||||
pagedata = $getpage()
|
||||
store.commit(pagename, pagedata)
|
||||
vsetting = await $getdata(api, undefined, {filter: JSON.stringify({id: props.setting.id})}, true)
|
||||
pagedata = $setpage(pagename, vsetting)
|
||||
docid.value = $id()
|
||||
console.log(pagename, pagedata)
|
||||
}
|
||||
async function paste() {
|
||||
const text = await navigator.clipboard.readText()
|
||||
try {
|
||||
const json = JSON.parse(text)
|
||||
//$store.commit("updateState", {name: pagename, key: "update", data: {fields: json}})
|
||||
}
|
||||
catch(err) {
|
||||
$snackbar('Đã xảy lỗi. Hãy thử lại.')
|
||||
}
|
||||
}
|
||||
function copy() {
|
||||
$copyToClipboard(JSON.stringify(pagedata.fields))
|
||||
$snackbar('Copy thành công')
|
||||
}
|
||||
function updateSetting(data) {
|
||||
let rows = store[masterpage].data
|
||||
let idx = $findIndex(rows, {id: data.id})
|
||||
rows[idx] = data
|
||||
//$store.commit("updateState", {name: masterpage, key: "update", data: {data: rows}})
|
||||
}
|
||||
async function save(isNew) {
|
||||
let detail = pagename? {fields: pagedata.fields} : {}
|
||||
let element = pagedata.tablesetting || tablesetting
|
||||
detail.tablesetting = element
|
||||
if (pagedata.filters? pagedata.filters.length > 0 : false) {
|
||||
detail.filters = pagedata.filters;
|
||||
}
|
||||
let copy = await $getdata(api, undefined, {filter: {id: setting.id}}, true)
|
||||
copy.detail = detail
|
||||
copy.update_time = new Date()
|
||||
if(isNew) {
|
||||
copy.id = undefined
|
||||
copy.name = name
|
||||
}
|
||||
isNew? await $insertrow(api, copy, undefined, pagename) : await $updaterow(api, copy, undefined, pagename)
|
||||
}
|
||||
async function remove() {
|
||||
await $deleterow(api, props.setting.id, undefined, pagename)
|
||||
}
|
||||
// main
|
||||
initData()
|
||||
</script>
|
||||
89
components/parameter/EmailSetup.vue
Normal file
89
components/parameter/EmailSetup.vue
Normal file
@@ -0,0 +1,89 @@
|
||||
<template>
|
||||
<div>
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label">Email <span class="has-text-danger">*</span></label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<p class="control is-expanded">
|
||||
<input class="input" type="text" placeholder="" v-model="record.email">
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field is-horizontal mt15">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label">Password <span class="has-text-danger">*</span></label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<p class="control is-expanded">
|
||||
<input class="input" type="text" placeholder="" v-model="record.password">
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field is-horizontal mt15">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label">Smtp <span class="has-text-danger">*</span></label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<p class="control is-expanded">
|
||||
<input class="input" type="text" placeholder="" v-model="record.smtp">
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field is-horizontal mt-5">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label">Port <span class="has-text-danger">*</span></label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<p class="control is-expanded">
|
||||
<input class="input" type="text" placeholder="" v-model="record.port">
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field is-grouped mt-5 pt-3">
|
||||
<div class="control mr-3">
|
||||
<button class="button is-primary has-text-white" @click="update()">
|
||||
Update
|
||||
</button>
|
||||
</div>
|
||||
<div class="control">
|
||||
<button :class="`button is-dark ${loading? 'is-loading' : ''}`" @click="test()">
|
||||
Send test
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
export default {
|
||||
props: ['pagename', 'row'],
|
||||
data () {
|
||||
return {
|
||||
record: this.row? this.$copy(this.row) : {},
|
||||
loading: false
|
||||
}
|
||||
},
|
||||
methods :{
|
||||
async update() {
|
||||
let data = this.$resetNull(this.record)
|
||||
if(data.id) await this.$updaterow('emailsetup', data, undefined, this.pagename)
|
||||
else await this.$insertrow('emailsetup', data, undefined, this.pagename)
|
||||
this.$emit('close')
|
||||
},
|
||||
async test() {
|
||||
this.loading = true
|
||||
let data = {subject: 'hello', to: 'loitx@outlook.com', sender: 1, content: 'Test'}
|
||||
let rs = await this.$insertapi('sendemail', data)
|
||||
this.loading = false
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
62
components/parameter/NameDetail.vue
Normal file
62
components/parameter/NameDetail.vue
Normal file
@@ -0,0 +1,62 @@
|
||||
<template>
|
||||
<div>
|
||||
<Caption v-bind="{title: 'Tham số'}"></Caption>
|
||||
<div class="field is-horizontal mt-5">
|
||||
<div class="field-body">
|
||||
<div class="field is-narrow">
|
||||
<label class="label">Mã <span class="has-text-danger"> * </span> </label>
|
||||
<p class="control">
|
||||
<input class="input" type="text" placeholder="" v-model="record.code">
|
||||
</p>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label class="label">Tên <span class="has-text-danger"> * </span> </label>
|
||||
<p class="control">
|
||||
<input class="input" type="text" placeholder="" v-model="record.name">
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field mt-5">
|
||||
<label class="label">Chi tiết<span class="has-text-danger"> * </span> </label>
|
||||
<p class="control is-expanded">
|
||||
<input class="input" type="text" placeholder="" v-model="record.detail">
|
||||
</p>
|
||||
</div>
|
||||
<div class="field mt-5">
|
||||
<label class="label">Thứ tự <span class="has-text-danger"> * </span> </label>
|
||||
<p class="control">
|
||||
<input class="input" type="text" placeholder="" v-model="record.index">
|
||||
</p>
|
||||
<p class="help is-danger" v-if="errors.index">{{ errors.index }}</p>
|
||||
</div>
|
||||
<div class="mt-5">
|
||||
<button class="button is-primary" @click="update()">Cập nhật</button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
export default {
|
||||
props: ['api', 'pagename', 'row'],
|
||||
data () {
|
||||
return {
|
||||
record: this.$copy(this.row || {}),
|
||||
errors: {}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
pagedata: {
|
||||
get: function() {return this.$store.state[this.pagename]},
|
||||
set: function(val) {this.$store.commit('updateStore', {name: this.pagename, data: val})}
|
||||
}
|
||||
},
|
||||
methods :{
|
||||
async update() {
|
||||
let data = this.$resetNull(this.record)
|
||||
if(data.id) await this.$updaterow(this.api, data, undefined, this.pagename)
|
||||
else await this.$insertrow(this.api, data, undefined, this.pagename)
|
||||
this.$emit('close')
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
82
components/parameter/SettingFields.vue
Normal file
82
components/parameter/SettingFields.vue
Normal file
@@ -0,0 +1,82 @@
|
||||
<template>
|
||||
<DataTable v-bind="{pagename: pagename}" @updatesetting="updateSetting" v-if="docid" />
|
||||
<div class="mt-6">
|
||||
<Caption v-bind="{title: 'Nhập tên trong trường hợp tạo mới'}"></Caption>
|
||||
<div>
|
||||
<input class="input" type="text" v-model="name">
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-6">
|
||||
<button class="button is-primary has-text-white" @click="save()">Cập nhật</button>
|
||||
<button class="button is-dark ml-4" @click="save(true)">Tạo mới</button>
|
||||
<button class="button is-dark ml-4" @click="copy()">Copy fields</button>
|
||||
<button class="button is-dark ml-4" @click="paste()">Paste fields</button>
|
||||
<button class="button is-danger has-text-white ml-4" @click="remove()">Xóa</button>
|
||||
</div>
|
||||
</template>
|
||||
<script setup>
|
||||
import DataTable from '~/components/datatable/DataTable'
|
||||
import { useStore } from '~/stores/index'
|
||||
const store = useStore()
|
||||
const { $id, $clone, $updateapi, $insertapi, $findpage, $getpage, $getdata, $setpage, $deleterow, $snackbar, $copyToClipboard } = useNuxtApp()
|
||||
var props = defineProps({
|
||||
setting: Object,
|
||||
masterpage: String
|
||||
})
|
||||
var api = 'usersetting'
|
||||
var pagename = $findpage()
|
||||
var name = undefined
|
||||
var vsetting = undefined
|
||||
var pagedata = undefined
|
||||
var docid = ref(null)
|
||||
async function initData() {
|
||||
pagedata = $getpage()
|
||||
store.commit(pagename, pagedata)
|
||||
vsetting = await $getdata(api, {id: props.setting.id}, null, true)
|
||||
pagedata = $setpage(pagename, vsetting)
|
||||
docid.value = $id()
|
||||
}
|
||||
async function paste() {
|
||||
const text = await navigator.clipboard.readText()
|
||||
try {
|
||||
let copy = $clone(pagedata)
|
||||
copy.fields = JSON.parse(text)
|
||||
copy.update = {fields: JSON.parse(text)}
|
||||
store.commit(pagename, copy)
|
||||
}
|
||||
catch(err) {
|
||||
$snackbar('Đã xảy lỗi. Hãy thử lại.')
|
||||
}
|
||||
}
|
||||
function copy() {
|
||||
$copyToClipboard(JSON.stringify(pagedata.fields))
|
||||
$snackbar('Copy thành công')
|
||||
}
|
||||
function updateSetting(data) {
|
||||
let rows = store[masterpage].data
|
||||
let idx = $findIndex(rows, {id: data.id})
|
||||
rows[idx] = data
|
||||
//$store.commit("updateState", {name: masterpage, key: "update", data: {data: rows}})
|
||||
}
|
||||
async function save(isNew) {
|
||||
let detail = pagename? {fields: store[pagename].fields} : {}
|
||||
let element = pagedata.tablesetting || tablesetting
|
||||
detail.tablesetting = element
|
||||
if (pagedata.filters? pagedata.filters.length > 0 : false) {
|
||||
detail.filters = pagedata.filters;
|
||||
}
|
||||
let copy = await $getdata(api, undefined, {filter: {id: props.setting.id}}, true)
|
||||
copy.detail = detail
|
||||
copy.update_time = new Date()
|
||||
if(isNew) {
|
||||
copy.id = undefined
|
||||
copy.name = name
|
||||
}
|
||||
isNew? await $insertapi(api, copy, undefined, true) : await $updateapi(api, copy, undefined, true)
|
||||
}
|
||||
async function remove() {
|
||||
await $deleterow(api, props.setting.id, undefined, pagename)
|
||||
}
|
||||
// main
|
||||
initData()
|
||||
</script>
|
||||
Reference in New Issue
Block a user