|
1 | 1 | <script>
|
2 | 2 | Vue.component('apijson-table', {
|
3 | 3 | delimiters: ['{', '}'],
|
4 |
| - props: ["table_name"], |
| 4 | + props: ["table_name","config"], |
5 | 5 | template: `<div>
|
6 | 6 | <i-table stripe border :columns="tcolumns" :data="tlist" @on-sort-change="table_on_sort_change"></i-table>
|
7 | 7 | <page :total="total" :page-size="query_count" :current.sync="current_page" :page-size-opts="[10, 20, 50, 100]" show-sizer @on-change="page_on_change" @on-page-size-change="page_on_page_size_change"></page>
|
8 |
| - <modal v-model="modal_view" title="View"> |
| 8 | + <modal v-model="modal_view" :title="viewedit_label"> |
9 | 9 | <i-form @submit.native.prevent :label-width="80">
|
10 |
| - <form-item v-for="item in view_items" :key="item.key" :label="item.key"> |
11 |
| - <i-input v-if="typeof item.value !=='boolean'" v-model="item.value" :readonly=true></i-input> |
12 |
| - <checkbox v-if="typeof item.value ==='boolean'" v-model="item.value" disabled></checkbox> |
| 10 | + <form-item v-for="item in viewedit_items" :key="item.key" :label="item.title"> |
| 11 | + <i-input v-if="item.type=='input'" v-model="item.value" :readonly="!editable(item)"></i-input> |
| 12 | + <checkbox v-if="item.type=='checkbox'" v-model="item.value" :disabled="!editable(item)"></checkbox> |
| 13 | + <i-input v-if="item.type=='textarea'" v-model="item.value" type="textarea" :autosize="{minRows: 2,maxRows: 5}"></i-input> |
| 14 | + </form-item> |
| 15 | + <form-item v-if="config_editable" label="action"> |
| 16 | + <i-button type="info" icon="ios-download" @click="save">Save</i-button> |
13 | 17 | </form-item>
|
14 | 18 | </i-form>
|
15 | 19 | </modal>
|
|
21 | 25 | var thisp = this
|
22 | 26 | return {
|
23 | 27 | modal_view: false,
|
24 |
| - view_items: [], |
| 28 | + viewedit_items: [], |
| 29 | + |
| 30 | + edit_params: {}, |
| 31 | + |
25 | 32 | modal_delete: false,
|
26 |
| - delete_params:{}, |
27 |
| - tcolumns: [ |
28 |
| - {title:'#',key:'id',width:80}, |
29 |
| - { |
| 33 | + delete_params: {}, |
| 34 | + |
| 35 | + tcolumns: [], |
| 36 | + tcolumns_preset: { |
| 37 | + "id": {title:'#',key:'id',width:80}, |
| 38 | + "action": { |
30 | 39 | title: 'Action',
|
31 | 40 | width: 140,
|
32 | 41 | render: (h, params) => {
|
|
44 | 53 | thisp.show(params)
|
45 | 54 | }
|
46 | 55 | }
|
47 |
| - }, 'View'), |
| 56 | + }, this.viewedit_label), |
48 | 57 | h('Button', {
|
49 | 58 | props: {
|
50 | 59 | type: 'error',
|
|
59 | 68 | ]);
|
60 | 69 | }
|
61 | 70 | }
|
62 |
| - ], |
| 71 | + }, |
63 | 72 | tcolumns_init: false,
|
64 | 73 | tlist:[],
|
65 | 74 | query_count: 10,
|
66 | 75 | current_page: 1,
|
67 | 76 | total: 0,
|
68 | 77 | sort_key: "id",
|
69 |
| - sort_order: "-" |
| 78 | + sort_order: "-", |
| 79 | + |
| 80 | + config_editable: false, |
| 81 | + config_table_fields: null, |
| 82 | + config_viewedit_fields: null |
70 | 83 | }
|
71 | 84 | },
|
| 85 | + computed: { |
| 86 | + viewedit_label: function(){return this.config_editable?'Edit':'View'} |
| 87 | + }, |
72 | 88 | methods: {
|
73 | 89 | update_list: function(){
|
74 | 90 | var thisp = this
|
|
94 | 110 | if (data.code==200) {
|
95 | 111 | var arr = data["[]"]
|
96 | 112 | if (!thisp.tcolumns_init) {
|
97 |
| - if (arr.length>0) { |
98 |
| - var item = arr[0] |
99 |
| - for (var k in item){ |
100 |
| - if (k!="id") { |
101 |
| - var col = {title:k,key:k} |
102 |
| - if (typeof item[k] ==="boolean") { |
103 |
| - col["width"] = 80 |
104 |
| - } |
105 |
| - else if (typeof item[k] ==="number") { |
106 |
| - col["width"] = 100 |
| 113 | + if (thisp.config_table_fields!=null){ |
| 114 | + thisp.tcolumns = thisp.config_table_fields |
| 115 | + thisp.tcolumns.push(thisp.tcolumns_preset["action"]) |
| 116 | + thisp.tcolumns_init = true |
| 117 | + } |
| 118 | + else { |
| 119 | + thisp.tcolumns.push(thisp.tcolumns_preset["id"]) |
| 120 | + if (arr.length>0) { |
| 121 | + var item = arr[0] |
| 122 | + for (var k in item){ |
| 123 | + if (k!="id") { |
| 124 | + var col = {title:k,key:k} |
| 125 | + if (typeof item[k] ==="boolean") { |
| 126 | + col["width"] = 80 |
| 127 | + } |
| 128 | + else if (typeof item[k] ==="number") { |
| 129 | + col["width"] = 100 |
| 130 | + } |
| 131 | + thisp.tcolumns.push(col) |
107 | 132 | }
|
108 |
| - thisp.tcolumns.push(col) |
109 | 133 | }
|
| 134 | + thisp.tcolumns.push(thisp.tcolumns_preset["action"]) |
| 135 | + thisp.tcolumns_init = true |
110 | 136 | }
|
111 |
| - thisp.tcolumns_init = true |
112 | 137 | }
|
113 | 138 | }
|
114 | 139 | thisp.tlist = arr
|
|
119 | 144 | },
|
120 | 145 | show: function(params){
|
121 | 146 | var row = params.row
|
122 |
| - this.view_items = [] |
123 |
| - this.view_items.push({key:"id",value:row.id}) |
124 |
| - for (var k in row){ |
125 |
| - if (k!="id" && k[0]!="_") { |
126 |
| - value = row[k] |
127 |
| - this.view_items.push({key:k,value:value}) |
| 147 | + this.viewedit_items = [] |
| 148 | + if (this.config_viewedit_fields!=null) { |
| 149 | + for (var i in this.config_viewedit_fields) { |
| 150 | + var d = this.config_viewedit_fields[i] |
| 151 | + d.value = row[d.key] |
| 152 | + d.type = d.type || "input" |
| 153 | + this.viewedit_items.push(d) |
128 | 154 | }
|
129 | 155 | }
|
| 156 | + else { |
| 157 | + this.viewedit_items.push({title:"id",value:row.id,"type":"input"}) |
| 158 | + var type2type = { |
| 159 | + "boolean":"checkbox" |
| 160 | + } |
| 161 | + for (var k in row){ |
| 162 | + if (k!="id" && k[0]!="_") { |
| 163 | + var value = row[k] |
| 164 | + var type = type2type[typeof value] || "input" |
| 165 | + this.viewedit_items.push({title:k,value:value,type:type}) |
| 166 | + } |
| 167 | + } |
| 168 | + } |
| 169 | + if (this.config_editable){ |
| 170 | + this.edit_params = params |
| 171 | + } |
| 172 | + else { |
| 173 | + this.edit_params = null |
| 174 | + } |
130 | 175 | this.modal_view = true
|
131 | 176 | },
|
| 177 | + editable: function(item){ |
| 178 | + var editable = true |
| 179 | + if (item.editable!=null) {editable=item.editable} |
| 180 | + return this.config_editable && editable && (item.key!="id") |
| 181 | + }, |
132 | 182 | remove: function(params){
|
133 | 183 | this.delete_params = params
|
134 | 184 | this.modal_delete = true
|
135 | 185 | },
|
| 186 | + save: function(){ |
| 187 | + var thisp = this |
| 188 | + var params = { |
| 189 | + "@tag": thisp.table_name |
| 190 | + } |
| 191 | + var record_params = {} |
| 192 | + var row = thisp.edit_params.row |
| 193 | + |
| 194 | + for (var k in thisp.viewedit_items) { |
| 195 | + var d = thisp.viewedit_items[k] |
| 196 | + if (d.key=="id"|| d.value!=row[d.key]) { |
| 197 | + record_params[d.key] = d.value |
| 198 | + } |
| 199 | + } |
| 200 | + params[thisp.table_name] = record_params |
| 201 | + $.ajax({ |
| 202 | + type: "POST", |
| 203 | + url: "{{=url_for('uliweb_apijson.apijson.views.ApiJson.put')}}", |
| 204 | + contentType: 'application/json', |
| 205 | + data: JSON.stringify(params), |
| 206 | + success: function (data) { |
| 207 | + if (data.code==200){ |
| 208 | + thisp.$Notice.success({ |
| 209 | + title: 'success update #'+row.id+' in table '+thisp.table_name, |
| 210 | + desc: data.msg |
| 211 | + }) |
| 212 | + thisp.update_list() |
| 213 | + } |
| 214 | + else { |
| 215 | + thisp.$Notice.error({ |
| 216 | + title: 'error when update #'+row.id+' in table '+thisp.table_name, |
| 217 | + desc: data.msg |
| 218 | + }) |
| 219 | + } |
| 220 | + } |
| 221 | + }) |
| 222 | + }, |
136 | 223 | real_remove: function(){
|
137 | 224 | var thisp = this
|
138 | 225 | var params = {
|
|
183 | 270 | }
|
184 | 271 | },
|
185 | 272 | mounted: function(){
|
| 273 | + if (this.config!=null){ |
| 274 | + this.config_editable = this.config.editable || false |
| 275 | + this.config_table_fields = this.config.table_fields || null |
| 276 | + this.config_viewedit_fields = this.config.viewedit_fields || null |
| 277 | + } |
186 | 278 | this.update_list()
|
187 | 279 | }
|
188 | 280 | })
|
|
0 commit comments