vue2_frontend init..

This commit is contained in:
최준흠 2022-08-25 15:26:15 +09:00
parent 45ce9c93ea
commit b3433bcef6
4 changed files with 127 additions and 85 deletions

View File

@ -1,7 +0,0 @@
export default (await import('vue')).defineComponent({
name: 'HelloWorld',
props: {
msg: String
}
})
const __VLS_template = () => ({})

View File

@ -1,7 +0,0 @@
export default (await import('vue')).defineComponent({
name: 'HelloWorld',
props: {
msg: String
}
})
const __VLS_template = () => ({})

View File

@ -0,0 +1,3 @@
<template>
<div>ListComponent</div>
</template>

View File

@ -3,57 +3,75 @@
<div> <div>
<b-container fluid> <b-container fluid>
<b-row> <b-row>
<b-col> </b-col> <b-col class="border">
<b-col> <b-input-group>
<b-form-group> <label class="input-group-text">
<b-input-group> <b-form-checkbox @change="rowSelectAllToggle"
<label class="input-group-text">Filter</label> >All</b-form-checkbox
<b-form-input >
id="filter-input" </label>
v-model="filter" <b-form-select
type="text" v-model="selectMode"
placeholder="Type to Filter" :options="selectModes"
></b-form-input> ></b-form-select>
<b-input-group-append> </b-input-group>
<b-button :disabled="!filter" @click="filter = ''"
>Clear</b-button
>
</b-input-group-append>
</b-input-group>
</b-form-group>
</b-col> </b-col>
<b-col> <b-col cols="6" class="border">
<div class="input-group justify-content-end"> <b-input-group>
<label class="input-group-text">
<b-form-checkbox-group
class="d-flex flex-nowrap"
v-model="filterOn"
:options="filterOptions"
></b-form-checkbox-group>
</label>
<b-form-input
v-model="filter"
type="text"
placeholder="Type to Filter"
></b-form-input>
<b-button :disabled="!filter" @click="filter = ''">Clear</b-button>
</b-input-group>
</b-col>
<b-col class="border">
<b-input-group class="justify-content-end">
<label class="input-group-text">줄수</label> <label class="input-group-text">줄수</label>
<b-form-select <b-form-select
v-model="perPage" v-model="perPage"
:options="perPageOptions" :options="perPageOptions"
></b-form-select> ></b-form-select>
</div> </b-input-group>
</b-col> </b-col>
</b-row> </b-row>
<b-row class="overflow-auto"> <b-row class="overflow-auto">
<b-table <b-table-lite
ref="selectableTable"
:items="items" :items="items"
:fields="fields" :fields="fields"
:per-page="perPage" :per-page="perPage"
:current-page="currentPage" :current-page="currentPage"
:filter="filter" :filter="filter"
:filter-included-fields="filterOn" :filter-included-fields="filterOn"
@filtered="onFiltered"
:sort-by.sync="sortBy" :sort-by.sync="sortBy"
:sort-desc.sync="sortDesc" :sort-desc.sync="sortDesc"
:sort-direction="sortDirection" :sort-direction="sortDirection"
:busy="isBusy"
:striped="table_Attributes.striped"
:hover="table_Attributes.hover"
:bordered="table_Attributes.bordered"
:dark="table_Attributes.dark"
:head-variant="table_Attributes.headVariant"
label-sort-asc="" label-sort-asc=""
label-sort-desc="" label-sort-desc=""
label-sort-clear="" label-sort-clear=""
@filtered="onFiltered" :select-mode="selectMode"
selectable
@row-selected="rowSelectedToggle"
:busy="isBusy"
:sticky-header="commonTableAttributes.stickyHeader"
:no-border-collapse="commonTableAttributes.noBorderCollapse"
:striped="commonTableAttributes.striped"
:hover="commonTableAttributes.hover"
:bordered="commonTableAttributes.bordered"
:dark="commonTableAttributes.dark"
:head-variant="commonTableAttributes.headVariant"
> >
<!-- Cell/Field별 속성 추가용 -->
<template #table-colgroup="scope"> <template #table-colgroup="scope">
<col <col
v-for="field in scope.fields" v-for="field in scope.fields"
@ -61,22 +79,27 @@
:style="{ width: field.width }" :style="{ width: field.width }"
/> />
</template> </template>
<template #cell(selected)="row"> <!-- /선택 Row를 토글용 -->
<input <template #cell(rowSelect)="{ rowSelected }">
type="checkbox" <template v-if="rowSelected">
:value="row.item.id" <span aria-hidden="true"></span>
@change="checkedIdsToggle(row.item.id)" </template>
/> <template v-else>
<span aria-hidden="true">&nbsp;</span>
</template>
</template> </template>
<!-- Row의 Index를 이용한 번호 출력 -->
<template #cell(index)="row"> <template #cell(index)="row">
{{ total - (currentPage * perPage + row.index) + perPage }} {{ total - (currentPage * perPage + row.index) + perPage }}
</template> </template>
<!-- 제목부분 출력용 -->
<template #cell(title)="row"> <template #cell(title)="row">
{{ row.item.title }} {{ row.item.title }}
<b-button size="sm" @click="row.toggleDetails" class="mr-2"> <b-button size="sm" @click="row.toggleDetails" class="mr-2">
{{ row.detailsShowing ? 'Hide' : 'Show' }} Details {{ row.detailsShowing ? 'Hide' : 'Show' }} Details
</b-button> </b-button>
</template> </template>
<!-- 상세 내용 출력용 -->
<template #row-details="row"> <template #row-details="row">
<b-card> <b-card>
<b-row class="mb-2"> <b-row class="mb-2">
@ -87,13 +110,14 @@
> >
</b-card> </b-card>
</template> </template>
<!-- 데이터 로딩중 출력용 -->
<template #table-busy> <template #table-busy>
<div class="text-center text-danger my-2"> <div class="text-center text-danger my-2">
<b-spinner class="align-middle"></b-spinner> <b-spinner class="align-middle"></b-spinner>
<strong>Loading...</strong> <strong>Loading...</strong>
</div> </div>
</template> </template>
</b-table> </b-table-lite>
</b-row> </b-row>
<b-row> <b-row>
<b-col> <b-col>
@ -104,52 +128,59 @@
></b-pagination> ></b-pagination>
</b-col> </b-col>
<b-col> <b-col>
<div class="input-group"> <b-input-group>
<label class="input-group-text">DB</label> <label class="input-group-text">DB</label>
<input type="text" class="form-control" v-model="search" /> <input type="text" class="form-control" v-model="search" />
<span class="input-group-text" @click="searchClick">검색</span> <span class="input-group-text" @click="searchForDB">검색</span>
</div> </b-input-group>
</b-col> </b-col>
<b-col> <b-col>
<div class="input-group justify-content-end"> <b-input-group class="justify-content-end">
<b-button @click="busyToggle">Toggle Busy State</b-button> <b-button @click="busyToggle">Toggle Busy State</b-button>
</div> </b-input-group>
</b-col> </b-col>
</b-row> </b-row>
</b-container> </b-container>
<p>
Selected Rows:<br />
{{ selectedRows }}
</p>
</div> </div>
</template> </template>
<script> <script>
// : https://vuejsexamples.com/vuejs-tables-and-select-all-checkbox/ // : https://vuejsexamples.com/vuejs-tables-and-select-all-checkbox/
import axios from 'axios' import axios from 'axios'
// import ListComponent from '@/components/common/ListComponent.vue'
axios.defaults.baseURL = 'http://localhost:3000' axios.defaults.baseURL = 'http://localhost:3000'
axios.defaults.headers.post['Content-Type'] = 'application/json;charset=utf-8' axios.defaults.headers.post['Content-Type'] = 'application/json;charset=utf-8'
axios.defaults.headers.post['Access-Control-Allow-Origin'] = '*' axios.defaults.headers.post['Access-Control-Allow-Origin'] = '*'
export default { export default {
components: {}, components: {
data() { //ListComponent: ListComponent
},
data: function () {
return { return {
items: [], items: [],
fields: [ fields: [
{ key: 'rowSelect', label: '✓', width: '55px' },
{ {
key: 'selected', key: 'index',
label: '', label: '번호',
width: '10px' width: '55px',
variant: 'primary'
}, },
{ key: 'index', label: '번호', width: '55px' },
{ {
key: 'title', key: 'title',
label: '제목', label: '제목',
sortable: true, sortable: true,
sortDirection: 'desc', sortByFormatted: true,
filterByFormatted: true filterByFormatted: true
}, },
// { // {
// key: 'content', // key: 'content',
// label: '', // label: '',
// sortable: true, // sortable: true,
// sortDirection: 'desc', // sortByFormatted: true,
// filterByFormatted: true // filterByFormatted: true
// }, // },
{ {
@ -161,13 +192,12 @@ export default {
return value ? 'Yes' : 'No' return value ? 'Yes' : 'No'
}, },
sortable: true, sortable: true,
sortByFormatted: true,
filterByFormatted: true filterByFormatted: true
}, },
// { key: 'updateAt', label: '' }, // { key: 'updateAt', label: '' },
{ {
key: 'createdAt', key: 'createdAt',
label: '登録日時', label: '등록일',
width: '105px', width: '105px',
formatter: (value) => { formatter: (value) => {
return value.replace( return value.replace(
@ -175,7 +205,8 @@ export default {
'$1-$2-$3' '$1-$2-$3'
) )
}, },
sortable: true sortable: true,
sortByFormatted: true
// filterByFormatted: true // filterByFormatted: true
} }
], ],
@ -184,31 +215,43 @@ export default {
perPageOptions: [ perPageOptions: [
{ value: 5, text: '5줄' }, { value: 5, text: '5줄' },
{ value: 10, text: '10줄' }, { value: 10, text: '10줄' },
{ value: 15, text: '15줄' }, { value: 30, text: '30줄' },
{ value: 100, text: 'Show a lot' } { value: 60, text: '60줄' },
{ value: 100, text: '100줄' }
], ],
currentPage: 1, // currentPage: 1, //
search: null, //DB
// //
table_Attributes: { commonTableAttributes: {
stickyHeader: false,
noBorderCollapse: false,
striped: true, striped: true,
hover: true, hover: true,
bordered: true, bordered: true,
dark: false, dark: false,
headVariant: 'null' headVariant: 'light'
}, },
isBusy: false, isBusy: false,
sortBy: 'id', sortBy: 'id',
sortDesc: false, sortDesc: false,
sortDirection: 'asc', sortDirection: 'asc',
filter: null, filter: null,
filterOn: [], filterOn: ['title', 'content'],
search: null, filterOptions: [
checkedIds: [] { text: '제목', value: 'title' },
{ text: '내용', value: 'content' },
{ text: '수정일', value: 'updateAt', disabled: true },
{ text: '등록일', value: 'createdAt' }
],
selectModes: ['multi', 'single', 'range'],
selectMode: 'multi',
selectedAllToggle: false,
selectedRows: []
} }
}, },
setup() {}, setup: function () {},
created() {}, created: function () {},
mounted() { mounted: function () {
// var vm = this // var vm = this
// setTimeout(function () { // setTimeout(function () {
// vm.records = vm.getDatas() // vm.records = vm.getDatas()
@ -238,7 +281,7 @@ export default {
this.items = items.rows this.items = items.rows
this.isBusy = false this.isBusy = false
}, },
searchClick() { searchForDB() {
this.currentPage = 1 this.currentPage = 1
this.getDatas() this.getDatas()
}, },
@ -250,16 +293,26 @@ export default {
this.total = filteredItems.length this.total = filteredItems.length
this.currentPage = 1 this.currentPage = 1
}, },
checkedIdsToggle(id) { rowSelectedToggle(selectedRow) {
console.log(this) this.selectedRows = selectedRow
//console.log(this.checkedIds) },
if (!this.checkedIds.includes(id)) { rowSelectAllToggle() {
this.checkedIds.push(id) if (this.selectedAllToggle) {
this.$refs.selectableTable.clearSelected()
this.selectedAllToggle = false
} else { } else {
this.checkedIds = this.checkedIds.filter((e) => e !== id) this.$refs.selectableTable.selectAllRows()
this.selectedAllToggle = true
} }
console.log(this.checkedIds)
} }
// rowSelectSet(id) {
// // Rows are indexed from 0, so the third row is index 2
// this.$refs.selectableTable.selectRow(id)
// },
// rowSelectUnSet(id) {
// // Rows are indexed from 0, so the third row is index 2
// this.$refs.selectableTable.unselectRow(id)
// }
}, },
computed: { computed: {
sortOptions() { sortOptions() {