vue_crud 0.1.10.8.4 → 0.1.10.8.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.DS_Store +0 -0
- data/lib/.DS_Store +0 -0
- data/lib/generators/.DS_Store +0 -0
- data/lib/generators/vue_crud/.DS_Store +0 -0
- data/lib/generators/vue_crud/templates/.DS_Store +0 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/.DS_Store +0 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/vue.js +4327 -3638
- data/lib/generators/vue_crud/templates/vue_crud.html +78 -40
- data/lib/vue_crud/version.rb +1 -1
- data/vendor/assets/javascripts/vue_crud.js +97 -110
- metadata +3 -2
@@ -1,32 +1,38 @@
|
|
1
1
|
<script type="text/javascript">
|
2
2
|
if(column_type === undefined) var column_type = 'card';
|
3
|
-
if(suffix === undefined) var suffix = '.json';
|
4
3
|
if(countOfPage === undefined) var countOfPage = 9;
|
5
4
|
if(sortable === undefined) var sortable = false;
|
6
5
|
if(info_url === undefined) var info_url = "http://localhost:3000/service_prototypes/info";
|
7
6
|
$(document).ready(function() {
|
8
7
|
var modal = $($('#modal').html());
|
9
8
|
var models = $($('#models-' + column_type).html());
|
10
|
-
|
11
|
-
$('#vue_form').html()
|
12
|
-
);
|
9
|
+
|
13
10
|
models.find('.custom_models').html(
|
14
11
|
$('#custom_models').html()
|
15
12
|
);
|
16
13
|
models.find('.custom_action').html(
|
17
14
|
$('#custom_action').html()
|
18
15
|
);
|
16
|
+
modal.find('.modal_body_prepend').html(
|
17
|
+
$('#modal_body_prepend').html()
|
18
|
+
);
|
19
|
+
modal.find('.modal_body_append').html(
|
20
|
+
$('#modal_body_append').html()
|
21
|
+
);
|
19
22
|
modal.find('.custom_modal_body').html(
|
20
23
|
$('#custom_modal_body').html()
|
21
24
|
);
|
22
25
|
modal.find('.custom_modal_action').html(
|
23
26
|
$('#custom_modal_action').html()
|
24
27
|
);
|
28
|
+
|
25
29
|
$('#modal').html(modal);
|
26
30
|
$('#models-' + column_type).html(models);
|
31
|
+
$('.vue_form').html(
|
32
|
+
$('#vue_form').html()
|
33
|
+
);
|
27
34
|
vueCRUD_init({
|
28
35
|
column_type: column_type,
|
29
|
-
suffix: suffix,
|
30
36
|
countOfPage: countOfPage,
|
31
37
|
sortable: sortable,
|
32
38
|
info_url: info_url
|
@@ -80,7 +86,7 @@ $(document).ready(function() {
|
|
80
86
|
<div class="ui divider" v-if="column_type == 'card'"></div>
|
81
87
|
<!-- NOTE: models -->
|
82
88
|
<div v-sortable class="ui three column grid" v-if="column_type == 'card'">
|
83
|
-
<models v-for="model in filteredModels" :
|
89
|
+
<models v-for="model in filteredModels" :original_model="model" :info="info" :selected_attribute="selected_attribute"></models>
|
84
90
|
</div>
|
85
91
|
|
86
92
|
<table class="ui celled selectable table" v-if="column_type == 'table'">
|
@@ -96,7 +102,7 @@ $(document).ready(function() {
|
|
96
102
|
</tr>
|
97
103
|
</thead>
|
98
104
|
<tbody v-sortable>
|
99
|
-
<tr is="models" v-for="model in filteredModels" :
|
105
|
+
<tr is="models" v-for="model in filteredModels" :original_model="model" :info="info" :selected_attribute="selected_attribute">
|
100
106
|
</tr>
|
101
107
|
</tbody>
|
102
108
|
<tfoot>
|
@@ -126,18 +132,24 @@ $(document).ready(function() {
|
|
126
132
|
<div class="ui inverted dimmer">
|
127
133
|
<div class="ui indeterminate text loader">處理中...</div>
|
128
134
|
</div>
|
129
|
-
<div class="header">{{ action_name }}
|
135
|
+
<div class="header">{{ action_name }}</div>
|
130
136
|
<div class="content">
|
137
|
+
<!-- NOTE: Modal body prepend -->
|
138
|
+
<div v-show="defaultMode" class="modal_body_prepend"></div>
|
131
139
|
<!-- NOTE: Not customMode -->
|
132
|
-
<div v-show="
|
133
|
-
<!-- NOTE:
|
140
|
+
<div v-show="defaultMode" class="vue_form"></div>
|
141
|
+
<!-- NOTE: Modal body prepend -->
|
142
|
+
<div v-show="defaultMode" class="modal_body_append"></div>
|
143
|
+
|
134
144
|
<!-- NOTE: Custom modal body -->
|
135
|
-
<div v-show="
|
145
|
+
<div v-show="!defaultMode">
|
146
|
+
<div class="custom_modal_body"></div>
|
147
|
+
</div>
|
136
148
|
</div>
|
137
149
|
<div class="actions">
|
138
150
|
<button class="ui basic gray cancel button">取消</button>
|
139
|
-
<button @click="
|
140
|
-
<button @click="toggleCreate" class="ui button blue" v-show="
|
151
|
+
<button @click="modalSubmit" class="ui button blue">{{ action_name }}</button>
|
152
|
+
<!-- <button @click="toggleCreate" class="ui button blue" v-show="newAction">{{ action_name }}</button> -->
|
141
153
|
<!-- NOTE: Custom modal action -->
|
142
154
|
<div class="inline-block custom_modal_action"></div>
|
143
155
|
</div>
|
@@ -173,7 +185,7 @@ $(document).ready(function() {
|
|
173
185
|
|
174
186
|
<!-- NOTE: Custom action -->
|
175
187
|
<div class="inline-block custom_action"></div>
|
176
|
-
<div class="ui animated fade blue button" @click="
|
188
|
+
<div class="ui animated fade blue button" @click="editModel('編輯')" tabindex="0">
|
177
189
|
<div class="visible content">編輯</div>
|
178
190
|
<div class="hidden content">
|
179
191
|
<i class="right edit icon"></i>
|
@@ -196,29 +208,37 @@ $(document).ready(function() {
|
|
196
208
|
<div class="column">
|
197
209
|
<div class="ui fluid card sort-here">
|
198
210
|
<div class="content">
|
211
|
+
<div class="ui top attached label gray">{{ info.titles.display_name }}</div>
|
199
212
|
<div class="header">{{ model[info.titles.title_attribute] }}</div>
|
200
|
-
<div class="meta"
|
201
|
-
<div class="ui divider"></div>
|
202
|
-
<div class="description">
|
203
|
-
<div class="
|
204
|
-
<div
|
205
|
-
<
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
</div>
|
216
|
-
</div>
|
213
|
+
<div class="meta">創建於 {{ model[info.titles.created_at_attribute] | datetime }}</div>
|
214
|
+
<div class="ui horizontal divider" v-toggle><h3><i class="bar chart icon"></i>欄位資料</h3></div>
|
215
|
+
<div class="description attribute">
|
216
|
+
<div class="item" v-for="attribute in info.model_attributes" v-if="attribute.visible" :class="{highlight: attribute.name == selected_attribute}">
|
217
|
+
<div v-if="attribute.input_type == 'token'">
|
218
|
+
<span class="display_name">{{ attribute.display_name }}:</span>
|
219
|
+
<pre>{{ model[attribute.name] }}</pre>
|
220
|
+
</div>
|
221
|
+
<div v-else-if="attribute.input_type == 'checkbox'">
|
222
|
+
<span class="display_name">{{ attribute.display_name }}:</span>
|
223
|
+
{{ model[attribute.name] | boolean }}
|
224
|
+
</div>
|
225
|
+
<div v-else-if="attribute.input_type == 'email'">
|
226
|
+
<span class="display_name">{{ attribute.display_name }}:</span>
|
227
|
+
<a :href="'mailto:' + model[attribute.name]" target="new">{{ model[attribute.name] }}</a>
|
217
228
|
</div>
|
229
|
+
<div v-else-if="attribute.input_type == 'img'">
|
230
|
+
<span class="display_name">{{ attribute.display_name }}:</span>
|
231
|
+
<img :src="model[attribute.name]" />
|
232
|
+
</div>
|
233
|
+
<div v-else>
|
234
|
+
<span class="display_name">{{ attribute.display_name }}:</span>
|
235
|
+
{{ model[attribute.name] }}
|
236
|
+
</div>
|
237
|
+
<div class="ui divider"></div>
|
218
238
|
</div>
|
219
239
|
<!-- NOTE: Custom models -->
|
220
|
-
<div class="custom_models"></div>
|
221
240
|
</div>
|
241
|
+
<div class="custom_models"></div>
|
222
242
|
</div>
|
223
243
|
<div class="extra content">
|
224
244
|
<div class="ui red right ribbon label" v-show="is_deleted">您已刪除,點擊<a href="#" @click="restoreModel" onclick="return false" class="save_now">復原</a></div>
|
@@ -228,7 +248,7 @@ $(document).ready(function() {
|
|
228
248
|
<div class="ui divider"></div>
|
229
249
|
<!-- NOTE: Custom action -->
|
230
250
|
<div class="inline-block custom_action"></div>
|
231
|
-
<div class="ui animated fade blue button" @click="
|
251
|
+
<div class="ui animated fade blue button" @click="editModel('編輯')" tabindex="0">
|
232
252
|
<div class="visible content">編輯</div>
|
233
253
|
<div class="hidden content">
|
234
254
|
<i class="right edit icon"></i>
|
@@ -249,8 +269,8 @@ $(document).ready(function() {
|
|
249
269
|
</div>
|
250
270
|
</script>
|
251
271
|
<script type="text/x-template" id="vue_form">
|
252
|
-
<form class="ui form"
|
253
|
-
<div v-for="attribute in
|
272
|
+
<form class="ui form">
|
273
|
+
<div v-for="attribute in model_attributes" v-if="attribute.editable">
|
254
274
|
<div class="field" v-if="attribute.input_type == 'select'">
|
255
275
|
<label :for="'model_' + attribute.display_name">{{ attribute.display_name }}</label>
|
256
276
|
<select :id="'model_' + attribute.display_name" v-model="model[attribute.name]" class="ui fluid dropdown" :class="attribute.input_class">
|
@@ -262,7 +282,7 @@ $(document).ready(function() {
|
|
262
282
|
</span>
|
263
283
|
</div>
|
264
284
|
</div>
|
265
|
-
<div class="field" v-if="attribute.input_type == 'multiSelect'">
|
285
|
+
<div class="field" v-else-if="attribute.input_type == 'multiSelect'">
|
266
286
|
<label :for="'model_' + attribute.display_name">{{ attribute.display_name }}</label>
|
267
287
|
<select :id="'model_' + attribute.display_name" multiple v-model="model[attribute.name]" class="ui fluid dropdown" :class="attribute.input_class">
|
268
288
|
<option v-for="option in attribute.options" :value="option.value" v-text="option.text"></option>
|
@@ -273,7 +293,25 @@ $(document).ready(function() {
|
|
273
293
|
</span>
|
274
294
|
</div>
|
275
295
|
</div>
|
276
|
-
<div class="field" v-if="attribute.input_type == '
|
296
|
+
<div class="field" v-else-if="attribute.input_type == 'selectInput'">
|
297
|
+
<label :for="'model_' + attribute.display_name">{{ attribute.display_name }}</label>
|
298
|
+
<div class="ui grid">
|
299
|
+
<div class="ten wide column">
|
300
|
+
<input type="text" :id="'model_' + attribute.display_name" v-model="model[attribute.name]" :class="attribute.input_class">
|
301
|
+
</div>
|
302
|
+
<div class="six wide column">
|
303
|
+
<select v-model="model[attribute.name]" class="ui dropdown" :class="attribute.input_class" onchange="$(this).parent().prev().find('input').val(this.value)">
|
304
|
+
<option v-for="option in attribute.options" :value="option.value" v-text="option.text"></option>
|
305
|
+
</select>
|
306
|
+
</div>
|
307
|
+
</div>
|
308
|
+
<div class="ui pointing red basic label" v-show="errors[attribute.name]">
|
309
|
+
<span style="color: red" v-for="(error, index) in errors[attribute.name]">
|
310
|
+
<span v-if="index > 0">,</span> {{ error }}
|
311
|
+
</span>
|
312
|
+
</div>
|
313
|
+
</div>
|
314
|
+
<div class="field" v-else-if="attribute.input_type == 'textarea'">
|
277
315
|
<label :for="'model_' + attribute.display_name">{{ attribute.display_name }}</label>
|
278
316
|
<textarea v-froala :attribute="attribute.name" :id="'model_' + attribute.display_name" v-model="model[attribute.name]" :class="attribute.input_class"></textarea>
|
279
317
|
<div class="ui pointing red basic label" v-show="errors[attribute.name]">
|
@@ -282,7 +320,7 @@ $(document).ready(function() {
|
|
282
320
|
</span>
|
283
321
|
</div>
|
284
322
|
</div>
|
285
|
-
<div class="field" v-if="attribute.input_type == 'checkbox'">
|
323
|
+
<div class="field" v-else-if="attribute.input_type == 'checkbox'">
|
286
324
|
<div class="ui toggle checkbox">
|
287
325
|
<input type="checkbox" tabindex="0" class="hidden" :id="'model_' + attribute.display_name" v-model="model[attribute.name]" :class="attribute.input_class">
|
288
326
|
<label>{{ attribute.display_name }}</label>
|
@@ -293,7 +331,7 @@ $(document).ready(function() {
|
|
293
331
|
</span>
|
294
332
|
</div>
|
295
333
|
</div>
|
296
|
-
<div class="field" v-if="attribute.input_type == 'number'">
|
334
|
+
<div class="field" v-else-if="attribute.input_type == 'number'">
|
297
335
|
<label :for="'model_' + attribute.display_name">{{ attribute.display_name }}</label>
|
298
336
|
<input type="number" :id="'model_' + attribute.display_name" v-model="model[attribute.name]" :class="attribute.input_class" number>
|
299
337
|
<div class="ui pointing red basic label" v-show="errors[attribute.name]">
|
@@ -302,7 +340,7 @@ $(document).ready(function() {
|
|
302
340
|
</span>
|
303
341
|
</div>
|
304
342
|
</div>
|
305
|
-
<div class="field" v-
|
343
|
+
<div class="field" v-else>
|
306
344
|
<label :for="'model_' + attribute.display_name">{{ attribute.display_name }}</label>
|
307
345
|
<input :type="attribute.input_type" :id="'model_' + attribute.display_name" v-model="model[attribute.name]" :class="attribute.input_class">
|
308
346
|
<div class="ui pointing red basic label" v-show="errors[attribute.name]">
|
data/lib/vue_crud/version.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
-
$.FE
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
if($.FE !== undefined) {
|
2
|
+
$.FE.prototype.reset = function () {
|
3
|
+
this.$el.html('');
|
4
|
+
}
|
5
|
+
$.FE.prototype.refresh = function () {
|
6
|
+
this.$el.html(this.$oel.val());
|
7
|
+
}
|
6
8
|
}
|
7
9
|
$(document).ajaxStart(function() { Pace.restart(); });
|
8
10
|
Vue.config.devtools = true;
|
@@ -10,16 +12,39 @@ Pace.on('done', function() {
|
|
10
12
|
$('#form-progress').val('0');
|
11
13
|
});
|
12
14
|
var event_hub = new Vue();
|
15
|
+
var modal_mixin = {};
|
16
|
+
var models_mixin = {};
|
17
|
+
var root_mixin = {};
|
13
18
|
function sleep(time) {
|
14
19
|
return new Promise((resolve) => setTimeout(resolve, time));
|
15
20
|
}
|
16
21
|
function obj_to_json(obj) {
|
17
22
|
return JSON.parse(JSON.stringify(obj));
|
18
23
|
}
|
19
|
-
|
20
|
-
var
|
21
|
-
var
|
22
|
-
|
24
|
+
// Array.prototype.find_and_replace = function(id, new_obj){
|
25
|
+
// for(var n = 0; n < this.length; n++) {
|
26
|
+
// var current_id = this[n].id || this[n].ID;
|
27
|
+
// if(current_id == id){
|
28
|
+
// console.log(this[n]);
|
29
|
+
// this[n] = new_obj;
|
30
|
+
// return true;
|
31
|
+
// }
|
32
|
+
// }
|
33
|
+
// return false;
|
34
|
+
// };
|
35
|
+
function urlParser(url, obj) {
|
36
|
+
var parser = document.createElement('a');
|
37
|
+
parser.href = url;
|
38
|
+
parser.parameters = parser.pathname.split('/').filter(function (str) {
|
39
|
+
return str.match(':');
|
40
|
+
});
|
41
|
+
var url = parser.protocol + "//" + parser.host;
|
42
|
+
$.each(parser.parameters, function(i, key){
|
43
|
+
parser.pathname = parser.pathname.replace(key, obj[key.replace(":", "")]);
|
44
|
+
});
|
45
|
+
url += parser.pathname + location.search;
|
46
|
+
return url;
|
47
|
+
}
|
23
48
|
function removeParam(key, sourceURL) {
|
24
49
|
var rtn = sourceURL.split("?")[0],
|
25
50
|
param,
|
@@ -68,8 +93,10 @@ function vueCRUD_init(params = {}) {
|
|
68
93
|
Vue.filter('datetime', function (value) {
|
69
94
|
return new Date(value).toLocaleString();
|
70
95
|
})
|
96
|
+
Vue.filter('boolean', function (value) {
|
97
|
+
return value? '是':'否';
|
98
|
+
})
|
71
99
|
var default_options = {
|
72
|
-
suffix: '.json',
|
73
100
|
column_type: 'card',
|
74
101
|
countOfPage: 9,
|
75
102
|
sortable: false,
|
@@ -99,49 +126,44 @@ function vueCRUD_init(params = {}) {
|
|
99
126
|
}
|
100
127
|
}
|
101
128
|
})
|
129
|
+
Vue.directive('toggle', {
|
130
|
+
inserted: function (el) {
|
131
|
+
$(el).css('cursor', 'pointer').click(function(){
|
132
|
+
$(this).next().toggle();
|
133
|
+
});
|
134
|
+
}
|
135
|
+
})
|
102
136
|
var modalComponent = Vue.component('modal', {
|
103
137
|
mixins: [modal_mixin],
|
104
138
|
template: '#modal',
|
105
|
-
props: {
|
106
|
-
info: Object
|
107
|
-
},
|
108
139
|
data: function() {
|
109
140
|
return {
|
141
|
+
model_attributes: [],
|
110
142
|
errors: {},
|
111
143
|
model: {},
|
112
144
|
action_name: '',
|
113
|
-
|
114
|
-
editMode: false,
|
115
|
-
newMode: false
|
145
|
+
defaultMode: true
|
116
146
|
}
|
117
147
|
},
|
118
148
|
mounted: function() {
|
149
|
+
// Sync errors and model from modelsComponent
|
119
150
|
event_hub.$on('update_error', function(errors) {
|
120
151
|
this.errors = errors;
|
121
152
|
}.bind(this));
|
122
|
-
event_hub.$on('
|
123
|
-
this.
|
153
|
+
event_hub.$on('update_model_attributes', function(model_attributes) {
|
154
|
+
this.model_attributes = model_attributes;
|
124
155
|
}.bind(this));
|
125
156
|
event_hub.$on('update_model', function(model) {
|
126
157
|
this.model = model;
|
127
158
|
}.bind(this));
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
else if(mode == 'edit') {
|
135
|
-
this.newMode = false;
|
136
|
-
this.editMode = true;
|
137
|
-
this.customMode = false;
|
138
|
-
}
|
139
|
-
else if(mode == 'custom') {
|
140
|
-
this.customMode = true;
|
141
|
-
this.newMode = false;
|
142
|
-
this.editMode = false;
|
143
|
-
}
|
159
|
+
// Modes and Actions
|
160
|
+
event_hub.$on('change_mode', function(mode, boolean) {
|
161
|
+
this[mode] = boolean;
|
162
|
+
}.bind(this));
|
163
|
+
event_hub.$on('update_action_name', function(action_name) {
|
164
|
+
this.action_name = action_name;
|
144
165
|
}.bind(this));
|
166
|
+
// Modal actions
|
145
167
|
event_hub.$on('openModal', function() {
|
146
168
|
this.openModal();
|
147
169
|
}.bind(this));
|
@@ -154,16 +176,14 @@ function vueCRUD_init(params = {}) {
|
|
154
176
|
event_hub.$on('dimmerOff', function() {
|
155
177
|
this.dimmerOff();
|
156
178
|
}.bind(this));
|
179
|
+
// For froalaEditor
|
157
180
|
event_hub.$on('changeValue', function(el) {
|
158
181
|
this.model[$(el).attr('attribute')] = $(el).val();
|
159
182
|
}.bind(this));
|
160
183
|
},
|
161
184
|
methods: {
|
162
|
-
|
163
|
-
event_hub.$emit('
|
164
|
-
},
|
165
|
-
toggleUpdate: function() {
|
166
|
-
event_hub.$emit('toggleUpdate');
|
185
|
+
modalSubmit: function() {
|
186
|
+
event_hub.$emit('modalSubmit');
|
167
187
|
},
|
168
188
|
dimmerOn: function() {
|
169
189
|
$(this.$el).find('.dimmer').addClass('active');
|
@@ -172,6 +192,7 @@ function vueCRUD_init(params = {}) {
|
|
172
192
|
$(this.$el).find('.dimmer').removeClass('active');
|
173
193
|
},
|
174
194
|
openModal: function() {
|
195
|
+
event_hub.$off('modalSubmit');
|
175
196
|
var that = this;
|
176
197
|
$(this.$el).modal({
|
177
198
|
observeChanges: true,
|
@@ -187,9 +208,7 @@ function vueCRUD_init(params = {}) {
|
|
187
208
|
$('.needRefresh').froalaEditor('refresh');
|
188
209
|
},
|
189
210
|
onHide: function() {
|
190
|
-
event_hub.$emit('
|
191
|
-
event_hub.$off('toggleCreate');
|
192
|
-
event_hub.$off('toggleUpdate');
|
211
|
+
event_hub.$emit('modalClose');
|
193
212
|
that.dimmerOff();
|
194
213
|
if(typeof modalClose !== "undefined") modalClose(this);
|
195
214
|
}
|
@@ -207,12 +226,13 @@ function vueCRUD_init(params = {}) {
|
|
207
226
|
mixins: [models_mixin],
|
208
227
|
template: '#models-' + options.column_type,
|
209
228
|
props: {
|
210
|
-
|
229
|
+
original_model: Object,
|
211
230
|
selected_attribute: String,
|
212
231
|
info: Object
|
213
232
|
},
|
214
233
|
data: function() {
|
215
234
|
return {
|
235
|
+
model: {},
|
216
236
|
progress: '0',
|
217
237
|
errors: {},
|
218
238
|
modified: false,
|
@@ -237,12 +257,10 @@ function vueCRUD_init(params = {}) {
|
|
237
257
|
}
|
238
258
|
},
|
239
259
|
mounted: function() {
|
260
|
+
this.model = this.original_model;
|
240
261
|
event_hub.$on('update_progress', function(progress) {
|
241
262
|
this.progress = progress;
|
242
263
|
}.bind(this));
|
243
|
-
event_hub.$on('cancel_customMode', function() {
|
244
|
-
this.customMode = false;
|
245
|
-
}.bind(this));
|
246
264
|
event_hub.$on('updateSort', function(progress) {
|
247
265
|
if($(this.$el).is(":visible")) {
|
248
266
|
var sort = ($(this.$el).index() + 1);
|
@@ -255,21 +273,25 @@ function vueCRUD_init(params = {}) {
|
|
255
273
|
}.bind(this));
|
256
274
|
},
|
257
275
|
methods: {
|
258
|
-
|
259
|
-
|
276
|
+
editModel: function(action_name) {
|
277
|
+
var url = this.info.actions.delete.url;
|
278
|
+
event_hub.$emit('openModal');
|
279
|
+
event_hub.$emit('update_model_attributes', this.info.model_attributes);
|
260
280
|
event_hub.$emit('update_model', this.model);
|
261
|
-
event_hub.$emit('
|
262
|
-
|
281
|
+
event_hub.$emit('update_action_name', action_name + this.info.titles.display_name);
|
282
|
+
|
283
|
+
// Bind modalSubmit when modalComponent submit
|
284
|
+
// It will be off when modal close
|
285
|
+
event_hub.$on('modalSubmit', function() {
|
263
286
|
this.updateModel();
|
264
287
|
}.bind(this));
|
265
|
-
event_hub.$emit('openModal');
|
266
288
|
},
|
267
289
|
restoreModel: function() {
|
268
290
|
var that = this;
|
269
291
|
$.ajax({
|
270
|
-
method:
|
292
|
+
method: that.info.actions.create.method,
|
271
293
|
data: obj_to_json(that.model),
|
272
|
-
url: that.info.
|
294
|
+
url: urlParser(that.info.actions.create.url, that.model),
|
273
295
|
success: function(res) {
|
274
296
|
that.model = res;
|
275
297
|
that.deleteMode = false;
|
@@ -286,37 +308,15 @@ function vueCRUD_init(params = {}) {
|
|
286
308
|
}
|
287
309
|
});
|
288
310
|
},
|
289
|
-
// restoreModel: function() {
|
290
|
-
// if(confirm("Are you sure?") == true) {
|
291
|
-
// event_hub.$emit('restoreCreate', this.model);
|
292
|
-
// }
|
293
|
-
// else {
|
294
|
-
//
|
295
|
-
// }
|
296
|
-
// },
|
297
311
|
deleteModel: function () {
|
298
312
|
var that = this;
|
299
|
-
that.deleteMode = true;
|
300
|
-
var id = that.model.ID || that.model.id;
|
301
313
|
if(confirm("Are you sure?") == true) {
|
314
|
+
that.deleteMode = true;
|
302
315
|
$.ajax({
|
303
|
-
method:
|
304
|
-
url: that.info.
|
316
|
+
method: that.info.actions.delete.method,
|
317
|
+
url: urlParser(that.info.actions.delete.url, that.model),
|
305
318
|
success: function(res) {
|
306
319
|
that.is_deleted = true;
|
307
|
-
// event_hub.$on('toggleRestoreSuccess', function() {
|
308
|
-
// that.deleteMode = false;
|
309
|
-
// that.is_deleted = false;
|
310
|
-
// that.is_success = true;
|
311
|
-
// sleep(1500).then(() => {
|
312
|
-
// that.is_success = false;
|
313
|
-
// });
|
314
|
-
// }.bind(this));
|
315
|
-
// event_hub.$on('toggleRestoreFail', function() {
|
316
|
-
// that.is_deleted = false;
|
317
|
-
// that.is_restore_failed = true;
|
318
|
-
// alert('復原失敗,請記錄資料並重新建立');
|
319
|
-
// }.bind(this));
|
320
320
|
},
|
321
321
|
error: function(res) {
|
322
322
|
that.deleteMode = false;
|
@@ -329,12 +329,13 @@ function vueCRUD_init(params = {}) {
|
|
329
329
|
},
|
330
330
|
updateModel: function() {
|
331
331
|
var that = this;
|
332
|
-
var id = that.model.ID || that.model.id;
|
333
332
|
$.ajax({
|
334
|
-
method:
|
333
|
+
method: that.info.actions.update.method,
|
335
334
|
data: obj_to_json(that.model),
|
336
|
-
url: that.info.
|
335
|
+
url: urlParser(that.info.actions.update.url, that.model),
|
337
336
|
beforeSend: function() {
|
337
|
+
console.log(obj_to_json(that.model));
|
338
|
+
|
338
339
|
event_hub.$emit('dimmerOn');
|
339
340
|
$('.progress-bar').css('width', '0');
|
340
341
|
},
|
@@ -389,7 +390,7 @@ function vueCRUD_init(params = {}) {
|
|
389
390
|
success: function(res) {
|
390
391
|
that.info = res;
|
391
392
|
that.model = {};
|
392
|
-
var default_url = that.info.
|
393
|
+
var default_url = that.info.actions.index.url + location.search;
|
393
394
|
default_url = removeParam("p", default_url);
|
394
395
|
default_url = removeParam("q", default_url);
|
395
396
|
default_url = removeParam("mp", default_url);
|
@@ -397,7 +398,7 @@ function vueCRUD_init(params = {}) {
|
|
397
398
|
default_url = removeParam("st", default_url);
|
398
399
|
that.default_url = default_url;
|
399
400
|
$.ajax({
|
400
|
-
url: that.info.
|
401
|
+
url: urlParser(that.info.actions.index.url, that.model),
|
401
402
|
success: function(res) {
|
402
403
|
that.models = res;
|
403
404
|
}
|
@@ -451,9 +452,9 @@ function vueCRUD_init(params = {}) {
|
|
451
452
|
return String(model[that.selected_attribute]).indexOf(that.searchQuery) !== -1;
|
452
453
|
});
|
453
454
|
|
454
|
-
that.filteredModelCount = result.length
|
455
|
+
that.filteredModelCount = result.length;
|
455
456
|
setTimeout(function () {
|
456
|
-
that.is_calculating = false
|
457
|
+
that.is_calculating = false;
|
457
458
|
}, 500)
|
458
459
|
return result.slice(
|
459
460
|
that.pageStart,
|
@@ -462,21 +463,21 @@ function vueCRUD_init(params = {}) {
|
|
462
463
|
}
|
463
464
|
},
|
464
465
|
watch: {
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
466
|
+
searchQuery: function () {
|
467
|
+
this.currentPage = 1;
|
468
|
+
updateQueryStringParam('q', this.searchQuery);
|
469
|
+
updateQueryStringParam('p', 1);
|
470
|
+
}
|
470
471
|
},
|
471
472
|
methods: {
|
472
473
|
addModel: function(action_name) {
|
473
|
-
event_hub.$emit('
|
474
|
+
event_hub.$emit('openModal');
|
475
|
+
event_hub.$emit('update_model_attributes', this.info.model_attributes);
|
474
476
|
event_hub.$emit('update_model', this.model);
|
475
|
-
event_hub.$emit('
|
476
|
-
event_hub.$on('
|
477
|
+
event_hub.$emit('update_action_name', action_name + this.info.titles.display_name);
|
478
|
+
event_hub.$on('modalSubmit', function() {
|
477
479
|
this.createModel();
|
478
480
|
}.bind(this));
|
479
|
-
event_hub.$emit('openModal');
|
480
481
|
},
|
481
482
|
setPage: function(idx){
|
482
483
|
if( idx <= 0 || idx > this.totalPage ){
|
@@ -485,26 +486,12 @@ function vueCRUD_init(params = {}) {
|
|
485
486
|
this.currentPage = idx;
|
486
487
|
updateQueryStringParam('p', this.currentPage);
|
487
488
|
},
|
488
|
-
// restoreModel: function () {
|
489
|
-
// var that = this;
|
490
|
-
// $.ajax({
|
491
|
-
// method: 'POST',
|
492
|
-
// data: obj_to_json(that.model),
|
493
|
-
// url: that.info.url_prefix + options.suffix + location.search,
|
494
|
-
// success: function(res) {
|
495
|
-
// event_hub.$emit('toggleRestoreSuccess');
|
496
|
-
// },
|
497
|
-
// error: function(res) {
|
498
|
-
// event_hub.$emit('toggleRestoreFail');
|
499
|
-
// }
|
500
|
-
// });
|
501
|
-
// },
|
502
489
|
createModel: function () {
|
503
490
|
var that = this;
|
504
491
|
$.ajax({
|
505
|
-
method:
|
492
|
+
method: that.info.actions.create.method,
|
506
493
|
data: obj_to_json(that.model),
|
507
|
-
url: that.info.
|
494
|
+
url: urlParser(that.info.actions.create.url, that.model),
|
508
495
|
beforeSend: function() {
|
509
496
|
console.log(obj_to_json(that.model));
|
510
497
|
event_hub.$emit('dimmerOn');
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vue_crud
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.10.8.
|
4
|
+
version: 0.1.10.8.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Donald Chiang
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-12-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -89,6 +89,7 @@ files:
|
|
89
89
|
- lib/generators/vue_crud/templates/assets/fonts/fa/fontawesome-webfont.woff2
|
90
90
|
- lib/generators/vue_crud/templates/assets/images/froala_editor/color_picker.png
|
91
91
|
- lib/generators/vue_crud/templates/assets/images/semantic-ui/flags.png
|
92
|
+
- lib/generators/vue_crud/templates/assets/javascripts/.DS_Store
|
92
93
|
- lib/generators/vue_crud/templates/assets/javascripts/codemirror.js
|
93
94
|
- lib/generators/vue_crud/templates/assets/javascripts/froala_editor/froala_editor.js
|
94
95
|
- lib/generators/vue_crud/templates/assets/javascripts/froala_editor/languages/en_gb.js
|