vue_crud 0.1.9.6 → 0.1.9.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/generators/vue_crud/froala_generator.rb +12 -0
- data/lib/generators/vue_crud/sortable.rb +10 -0
- data/lib/generators/vue_crud/templates/assets/images/froala_editor/color_picker.png +0 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/froala_editor.js +11089 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/languages/en_gb.js +178 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/languages/zh_cn.js +234 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/languages/zh_tw.js +234 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/align.js +119 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/char_counter.js +150 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/code_beautifier.js +3271 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/code_view.js +311 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/colors.js +350 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/draggable.js +379 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/emoticons.js +347 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/entities.js +113 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/file.js +609 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/font_family.js +178 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/font_size.js +116 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/forms.js +415 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/fullscreen.js +209 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/image.js +2401 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/image_manager.js +921 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/inline_style.js +86 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/line_breaker.js +435 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/link.js +997 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/lists.js +382 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/paragraph_format.js +293 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/paragraph_style.js +139 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/quick_insert.js +342 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/quote.js +138 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/save.js +176 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/table.js +3123 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/url.js +113 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/video.js +1135 -0
- data/lib/generators/vue_crud/templates/assets/javascripts/sortable.js +1249 -0
- data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/froala_editor.scss +1008 -0
- data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/froala_style.scss +273 -0
- data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/plugins/char_counter.scss +46 -0
- data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/plugins/code_view.scss +102 -0
- data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/plugins/colors.scss +129 -0
- data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/plugins/draggable.scss +32 -0
- data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/plugins/emoticons.scss +27 -0
- data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/plugins/file.scss +135 -0
- data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/plugins/fullscreen.scss +28 -0
- data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/plugins/image.scss +233 -0
- data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/plugins/image_manager.scss +370 -0
- data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/plugins/line_breaker.scss +26 -0
- data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/plugins/quick_insert.scss +56 -0
- data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/plugins/table.scss +156 -0
- data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/plugins/video.scss +136 -0
- data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/themes/dark.scss +1087 -0
- data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/themes/gray.scss +1087 -0
- data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/themes/red.scss +1087 -0
- data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/themes/royal.scss +1087 -0
- data/lib/generators/vue_crud/templates/vue_crud.html +54 -71
- data/lib/vue_crud/version.rb +1 -1
- data/vendor/assets/javascripts/vue_crud.js +212 -59
- metadata +56 -2
@@ -2,29 +2,36 @@
|
|
2
2
|
if(column_type === undefined) var column_type = 'card';
|
3
3
|
if(suffix === undefined) var suffix = '.json';
|
4
4
|
if(countOfPage === undefined) var countOfPage = 9;
|
5
|
+
if(sortable === undefined) var sortable = false;
|
5
6
|
$(document).ready(function() {
|
6
|
-
$('.vue_form_for_new').html($('#vue_form').html());
|
7
|
+
// $('.vue_form_for_new').html($('#vue_form').html());
|
8
|
+
var modal = $($('#modal').html());
|
7
9
|
var models = $($('#models-' + column_type).html());
|
10
|
+
modal.find('.vue_form').html(
|
11
|
+
$('#vue_form').html()
|
12
|
+
);
|
8
13
|
models.find('.custom_models').html(
|
9
14
|
$('#custom_models').html()
|
10
15
|
);
|
11
16
|
models.find('.custom_action').html(
|
12
17
|
$('#custom_action').html()
|
13
18
|
);
|
14
|
-
models.find('.vue_form_for_edit').html(
|
15
|
-
|
16
|
-
);
|
17
|
-
|
19
|
+
// models.find('.vue_form_for_edit').html(
|
20
|
+
// $('#vue_form').html()
|
21
|
+
// );
|
22
|
+
modal.find('.custom_modal_body').html(
|
18
23
|
$('#custom_modal_body').html()
|
19
24
|
);
|
20
|
-
|
25
|
+
modal.find('.custom_modal_action').html(
|
21
26
|
$('#custom_modal_action').html()
|
22
27
|
);
|
28
|
+
$('#modal').html(modal);
|
23
29
|
$('#models-' + column_type).html(models);
|
24
|
-
|
30
|
+
vueCRUD_init({
|
25
31
|
column_type: column_type,
|
26
32
|
suffix: suffix,
|
27
|
-
countOfPage: countOfPage
|
33
|
+
countOfPage: countOfPage,
|
34
|
+
sortable: sortable
|
28
35
|
});
|
29
36
|
$('.filter .ui.dropdown').dropdown();
|
30
37
|
$('.ui.checkbox').checkbox();
|
@@ -38,7 +45,8 @@ $(document).ready(function() {
|
|
38
45
|
{{ info.titles.title }}
|
39
46
|
<div class="sub header"><small>{{ info.titles.subtitle }}</small></div>
|
40
47
|
</h1>
|
41
|
-
<div class="ui animated fade green button" data-modal="#modelModal" tabindex="0">
|
48
|
+
<!-- <div class="ui animated fade green button" data-modal="#modelModal" tabindex="0"> -->
|
49
|
+
<div class="ui animated fade green button" @click="addModel('創建')" tabindex="0">
|
42
50
|
<div class="visible content">新增 {{ info.titles.display_name }}</div>
|
43
51
|
<div class="hidden content">
|
44
52
|
<i class="right plus icon"></i>
|
@@ -47,7 +55,7 @@ $(document).ready(function() {
|
|
47
55
|
<div class="ui divider"></div>
|
48
56
|
<!-- NOTE: Filter -->
|
49
57
|
<div class="ui left action right icon labeled input filter" :class="{loading: is_calculating}">
|
50
|
-
<a :href="default_url" class="ui button red" v-show="selected_attribute"
|
58
|
+
<a :href="default_url" class="ui button red" v-show="selected_attribute">重置</a>
|
51
59
|
<div class="ui basic floating dropdown button">
|
52
60
|
<div class="text">{{ selected_text || '請選擇欄位' }}</div>
|
53
61
|
<i class="dropdown icon"></i>
|
@@ -73,7 +81,7 @@ $(document).ready(function() {
|
|
73
81
|
</div>
|
74
82
|
<div class="ui divider" v-if="column_type == 'card'"></div>
|
75
83
|
<!-- NOTE: models -->
|
76
|
-
<div class="row ui cards" v-if="column_type == 'card'">
|
84
|
+
<div v-sortable class="row ui cards" v-if="column_type == 'card'">
|
77
85
|
<models v-for="model in filteredModels" :model="model" :info="info" :selected_attribute="model_prefix + '.' + selected_attribute"></models>
|
78
86
|
</div>
|
79
87
|
|
@@ -89,7 +97,7 @@ $(document).ready(function() {
|
|
89
97
|
<th></th>
|
90
98
|
</tr>
|
91
99
|
</thead>
|
92
|
-
<tbody>
|
100
|
+
<tbody v-sortable>
|
93
101
|
<tr is="models" v-for="model in filteredModels" :model="model" :info="info" :selected_attribute="model_prefix + '.' + selected_attribute">
|
94
102
|
</tr>
|
95
103
|
</tbody>
|
@@ -112,25 +120,34 @@ $(document).ready(function() {
|
|
112
120
|
</tfoot>
|
113
121
|
</table>
|
114
122
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
<div class="
|
120
|
-
|
121
|
-
<div class="ui basic gray cancel button">取消</div>
|
122
|
-
<div @click="createModel" class="ui primary button">創建</div>
|
123
|
+
<modal :info="info"></modal>
|
124
|
+
</div>
|
125
|
+
<script type="text/x-template" id="modal">
|
126
|
+
<div class="ui modal" id="vueModal">
|
127
|
+
<div class="ui inverted dimmer">
|
128
|
+
<div class="ui indeterminate text loader">處理中...</div>
|
123
129
|
</div>
|
124
|
-
<div class="
|
125
|
-
|
130
|
+
<div class="header">{{ action_name }} {{ info.titles.display_name }}</div>
|
131
|
+
<div class="content">
|
132
|
+
<!-- NOTE: Not customMode -->
|
133
|
+
<div v-show="!customMode" class="vue_form"></div>
|
134
|
+
<!-- NOTE: Is customMode -->
|
135
|
+
<!-- NOTE: Custom modal body -->
|
136
|
+
<div v-show="customMode"><div class="custom_modal_body"></div></div>
|
137
|
+
</div>
|
138
|
+
<div class="actions">
|
139
|
+
<button class="ui basic gray cancel button">取消</button>
|
140
|
+
<button @click="toggleUpdate" class="ui button blue" v-show="!customMode && editMode">更新</button>
|
141
|
+
<button @click="toggleCreate" class="ui button blue" v-show="!customMode && newMode">創建</button>
|
142
|
+
<!-- NOTE: Custom modal action -->
|
143
|
+
<div class="inline-block custom_modal_action"></div>
|
126
144
|
</div>
|
127
145
|
</div>
|
128
|
-
</
|
129
|
-
|
146
|
+
</script>
|
130
147
|
<!-- NOTE: Templates -->
|
131
148
|
<script type="text/x-template" id="models-table">
|
132
149
|
<tr>
|
133
|
-
<td v-for="attribute in info.model_attributes" v-if="attribute.visible"
|
150
|
+
<td v-for="(attribute, i) in info.model_attributes" v-if="attribute.visible" :class="{'sort-here': i == 0, highlight: attribute.model_prefix + '.' + attribute.name == selected_attribute}">
|
134
151
|
<p v-if="attribute.model_prefix">
|
135
152
|
<span v-if="attribute.type != 'img'">
|
136
153
|
{{ model[attribute.model_prefix][attribute.name] }}
|
@@ -141,7 +158,11 @@ $(document).ready(function() {
|
|
141
158
|
</p>
|
142
159
|
<p v-else>
|
143
160
|
<span v-if="attribute.type != 'img'">
|
144
|
-
|
161
|
+
<span v-if="attribute.type == 'textarea'" v-html="model[attribute.name]">
|
162
|
+
</span>
|
163
|
+
<span v-else>
|
164
|
+
{{ model[attribute.name] }}
|
165
|
+
</span>
|
145
166
|
</span>
|
146
167
|
<span v-else>
|
147
168
|
<img :src="model[attribute.name]" />
|
@@ -149,25 +170,6 @@ $(document).ready(function() {
|
|
149
170
|
</p>
|
150
171
|
</td>
|
151
172
|
<td style="position: relative;">
|
152
|
-
<div class="ui modal" :id="'editModal_' + model.id">
|
153
|
-
<div class="ui inverted dimmer">
|
154
|
-
<div class="ui indeterminate text loader">處理中...</div>
|
155
|
-
</div>
|
156
|
-
<div class="header">更新 {{ info.titles.display_name }}</div>
|
157
|
-
<div class="content">
|
158
|
-
<!-- NOTE: Not customMode -->
|
159
|
-
<div v-show="!customMode" class="vue_form_for_edit"></div>
|
160
|
-
<!-- NOTE: Is customMode -->
|
161
|
-
<!-- NOTE: Custom modal body -->
|
162
|
-
<div v-show="customMode"><div class="custom_modal_body"></div></div>
|
163
|
-
</div>
|
164
|
-
<div class="actions">
|
165
|
-
<button class="ui basic gray cancel button">取消</button>
|
166
|
-
<button @click="updateModel" class="ui button blue" v-show="!customMode">更新</button>
|
167
|
-
<!-- NOTE: Custom modal action -->
|
168
|
-
<div class="inline-block custom_modal_action"></div>
|
169
|
-
</div>
|
170
|
-
</div>
|
171
173
|
<a @click="updateModel(false)" onclick="return false" class="ui orange right corner label" v-show="modified" title="您有尚未儲存的變更">
|
172
174
|
<i class="save icon"></i>
|
173
175
|
</a>
|
@@ -176,7 +178,7 @@ $(document).ready(function() {
|
|
176
178
|
</a>
|
177
179
|
<!-- NOTE: Custom action -->
|
178
180
|
<div class="inline-block custom_action"></div>
|
179
|
-
<div class="ui animated fade blue button"
|
181
|
+
<div class="ui animated fade blue button" @click="openModal('編輯')" tabindex="0">
|
180
182
|
<div class="visible content">編輯</div>
|
181
183
|
<div class="hidden content">
|
182
184
|
<i class="right edit icon"></i>
|
@@ -196,7 +198,7 @@ $(document).ready(function() {
|
|
196
198
|
</tr>
|
197
199
|
</script>
|
198
200
|
<script type="text/x-template" id="models-card">
|
199
|
-
<div class="col-md-4">
|
201
|
+
<div class="col-md-4 sort-here">
|
200
202
|
<div class="card">
|
201
203
|
<div class="content">
|
202
204
|
<div class="header" v-if="info.titles.title_attribute_model_prefix">{{ model[info.titles.title_attribute_model_prefix][info.titles.title_attribute] }}</div>
|
@@ -240,7 +242,7 @@ $(document).ready(function() {
|
|
240
242
|
<div class="ui divider"></div>
|
241
243
|
<!-- NOTE: Custom action -->
|
242
244
|
<div class="inline-block custom_action"></div>
|
243
|
-
<div class="ui animated fade blue button"
|
245
|
+
<div class="ui animated fade blue button" @click="openModal('編輯')" tabindex="0">
|
244
246
|
<div class="visible content">編輯</div>
|
245
247
|
<div class="hidden content">
|
246
248
|
<i class="right edit icon"></i>
|
@@ -253,34 +255,15 @@ $(document).ready(function() {
|
|
253
255
|
</div>
|
254
256
|
</div>
|
255
257
|
</div>
|
256
|
-
|
257
|
-
<div class="ui inverted dimmer">
|
258
|
-
<div class="ui indeterminate text loader">處理中...</div>
|
259
|
-
</div>
|
260
|
-
<div class="header">更新 {{ info.titles.display_name }}</div>
|
261
|
-
<div class="content">
|
262
|
-
<!-- NOTE: Not customMode -->
|
263
|
-
<div v-show="!customMode" class="vue_form_for_edit"></div>
|
264
|
-
<!-- NOTE: Is customMode -->
|
265
|
-
<!-- NOTE: Custom modal body -->
|
266
|
-
<div v-show="customMode"><div class="custom_modal_body"></div></div>
|
267
|
-
</div>
|
268
|
-
<div class="actions">
|
269
|
-
<button class="ui basic gray cancel button">取消</button>
|
270
|
-
<button @click="updateModel" class="ui button blue" v-show="!customMode">更新</button>
|
271
|
-
<!-- NOTE: Custom modal action -->
|
272
|
-
<div class="inline-block custom_modal_action"></div>
|
273
|
-
</div>
|
274
|
-
</div>
|
258
|
+
|
275
259
|
<div class="ui blue bottom attached progress">
|
276
260
|
<div class="bar" :style="{width: progress + '%'}"></div>
|
277
261
|
</div>
|
278
262
|
</div>
|
279
263
|
</div>
|
280
264
|
</script>
|
281
|
-
|
282
265
|
<script type="text/x-template" id="vue_form">
|
283
|
-
<form class="ui form">
|
266
|
+
<form class="ui form" v-if="newMode || editMode">
|
284
267
|
<div v-for="attribute in info.model_attributes" v-if="attribute.editable">
|
285
268
|
<div class="field" v-if="attribute.type == 'select'">
|
286
269
|
<label :for="'model_' + attribute.display_name">{{ attribute.display_name }}</label>
|
@@ -312,8 +295,8 @@ $(document).ready(function() {
|
|
312
295
|
</div>
|
313
296
|
<div class="field" v-if="attribute.type == 'textarea'">
|
314
297
|
<label :for="'model_' + attribute.display_name">{{ attribute.display_name }}</label>
|
315
|
-
<textarea :id="'model_' + attribute.display_name" v-if="attribute.model_prefix" v-model="model[attribute.model_prefix][attribute.name]" :class="attribute.input_class"></textarea>
|
316
|
-
<textarea :id="'model_' + attribute.display_name" v-else v-model="model[attribute.name]" :class="attribute.input_class"></textarea>
|
298
|
+
<textarea v-froala :attribute="attribute.name" :id="'model_' + attribute.display_name" v-if="attribute.model_prefix" v-model="model[attribute.model_prefix][attribute.name]" :class="attribute.input_class"></textarea>
|
299
|
+
<textarea v-froala :attribute="attribute.name" :id="'model_' + attribute.display_name" v-else v-model="model[attribute.name]" :class="attribute.input_class"></textarea>
|
317
300
|
<div class="ui pointing red basic label" v-show="errors[attribute.name]">
|
318
301
|
<span style="color: red" v-for="(error, index) in errors[attribute.name]">
|
319
302
|
<span v-if="index > 0">,</span> {{ error }}
|
data/lib/vue_crud/version.rb
CHANGED
@@ -10,8 +10,10 @@ function sleep(time) {
|
|
10
10
|
function obj_to_json(obj) {
|
11
11
|
return JSON.parse(JSON.stringify(obj));
|
12
12
|
}
|
13
|
+
var modal_mixin = {}
|
13
14
|
var models_mixin = {}
|
14
15
|
var root_mixin = {}
|
16
|
+
|
15
17
|
function removeParam(key, sourceURL) {
|
16
18
|
var rtn = sourceURL.split("?")[0],
|
17
19
|
param,
|
@@ -56,15 +58,138 @@ function getParameterByName(name) {
|
|
56
58
|
if (!results[2]) return '';
|
57
59
|
return decodeURIComponent(results[2].replace(/\+/g, " "));
|
58
60
|
}
|
59
|
-
function
|
61
|
+
function vueCRUD_init(params = {}) {
|
62
|
+
Vue.filter('datetime', function (value) {
|
63
|
+
return new Date(value).toLocaleString();
|
64
|
+
})
|
60
65
|
var default_options = {
|
61
66
|
suffix: '.json',
|
62
67
|
column_type: 'card',
|
63
|
-
countOfPage: 9
|
68
|
+
countOfPage: 9,
|
69
|
+
sortable: false
|
64
70
|
}
|
65
71
|
var options = $.extend(true, {}, default_options, params)
|
66
|
-
Vue.
|
67
|
-
|
72
|
+
Vue.directive('froala', {
|
73
|
+
inserted: function (el) {
|
74
|
+
$(el).froalaEditor({
|
75
|
+
charCounterCount: false,
|
76
|
+
placeholderText: "",
|
77
|
+
language: 'zh_tw'
|
78
|
+
}).on('froalaEditor.contentChanged', function (e, editor) {
|
79
|
+
event_hub.$emit('changeValue', el);
|
80
|
+
}).addClass('needRefresh');
|
81
|
+
}
|
82
|
+
})
|
83
|
+
Vue.directive('sortable', {
|
84
|
+
inserted: function (el) {
|
85
|
+
if(options.sortable) {
|
86
|
+
var sortable = new Sortable(el, {
|
87
|
+
handle: ".sort-here",
|
88
|
+
onUpdate: function (evt) {
|
89
|
+
event_hub.$emit('updateSort');
|
90
|
+
}
|
91
|
+
});
|
92
|
+
}
|
93
|
+
}
|
94
|
+
})
|
95
|
+
var modalComponent = Vue.component('modal', {
|
96
|
+
mixins: [modal_mixin],
|
97
|
+
template: '#modal',
|
98
|
+
props: {
|
99
|
+
info: Object
|
100
|
+
},
|
101
|
+
data: function() {
|
102
|
+
return {
|
103
|
+
errors: {},
|
104
|
+
model: {},
|
105
|
+
action_name: '',
|
106
|
+
customMode: false,
|
107
|
+
editMode: false,
|
108
|
+
newMode: false
|
109
|
+
}
|
110
|
+
},
|
111
|
+
mounted: function() {
|
112
|
+
event_hub.$on('update_action_name', function(action_name) {
|
113
|
+
this.action_name = action_name;
|
114
|
+
}.bind(this));
|
115
|
+
event_hub.$on('update_model', function(model) {
|
116
|
+
this.model = model;
|
117
|
+
}.bind(this));
|
118
|
+
event_hub.$on('toggle_mode', function(mode) {
|
119
|
+
if(mode == 'new') {
|
120
|
+
this.newMode = true;
|
121
|
+
this.editMode = false;
|
122
|
+
this.customMode = false;
|
123
|
+
}
|
124
|
+
else if(mode == 'edit') {
|
125
|
+
this.newMode = false;
|
126
|
+
this.editMode = true;
|
127
|
+
this.customMode = false;
|
128
|
+
}
|
129
|
+
else if(mode == 'custom') {
|
130
|
+
this.customMode = true;
|
131
|
+
this.newMode = false;
|
132
|
+
this.editMode = false;
|
133
|
+
}
|
134
|
+
}.bind(this));
|
135
|
+
event_hub.$on('openModal', function() {
|
136
|
+
this.openModal();
|
137
|
+
}.bind(this));
|
138
|
+
event_hub.$on('closeModal', function() {
|
139
|
+
this.closeModal();
|
140
|
+
}.bind(this));
|
141
|
+
event_hub.$on('dimmerOn', function() {
|
142
|
+
this.dimmerOn();
|
143
|
+
}.bind(this));
|
144
|
+
event_hub.$on('dimmerOff', function() {
|
145
|
+
this.dimmerOff();
|
146
|
+
}.bind(this));
|
147
|
+
event_hub.$on('changeValue', function(el) {
|
148
|
+
this.model[$(el).attr('attribute')] = $(el).val();
|
149
|
+
}.bind(this));
|
150
|
+
},
|
151
|
+
methods: {
|
152
|
+
toggleCreate: function() {
|
153
|
+
event_hub.$emit('toggleCreate');
|
154
|
+
},
|
155
|
+
toggleUpdate: function() {
|
156
|
+
event_hub.$emit('toggleUpdate');
|
157
|
+
},
|
158
|
+
dimmerOn: function() {
|
159
|
+
$(this.$el).find('.dimmer').addClass('active');
|
160
|
+
},
|
161
|
+
dimmerOff: function() {
|
162
|
+
$(this.$el).find('.dimmer').removeClass('active');
|
163
|
+
},
|
164
|
+
openModal: function() {
|
165
|
+
var that = this;
|
166
|
+
$(this.$el).modal({
|
167
|
+
observeChanges: true,
|
168
|
+
transition: 'fade down',
|
169
|
+
onShow: function() {
|
170
|
+
$('.needRefresh').froalaEditor('refresh');
|
171
|
+
$(this).find('select.ui.dropdown').dropdown();
|
172
|
+
$(this).find('.ui.checkbox').checkbox();
|
173
|
+
if(typeof modalOpen !== "undefined") modalOpen(this);
|
174
|
+
},
|
175
|
+
onVisible: function() {
|
176
|
+
$('.needRefresh').froalaEditor('refresh');
|
177
|
+
},
|
178
|
+
onHide: function() {
|
179
|
+
event_hub.$emit('cancel_customMode');
|
180
|
+
event_hub.$off('toggleCreate');
|
181
|
+
event_hub.$off('toggleUpdate');
|
182
|
+
that.dimmerOff();
|
183
|
+
if(typeof modalClose !== "undefined") modalClose(this);
|
184
|
+
}
|
185
|
+
}).modal('show');
|
186
|
+
},
|
187
|
+
closeModal: function() {
|
188
|
+
sleep(500).then(() => {
|
189
|
+
$(this.$el).modal('hide');
|
190
|
+
});
|
191
|
+
}
|
192
|
+
}
|
68
193
|
})
|
69
194
|
|
70
195
|
var modelsComponent = Vue.component('models', {
|
@@ -80,7 +205,6 @@ function vue_init(params = {}) {
|
|
80
205
|
progress: '0',
|
81
206
|
errors: {},
|
82
207
|
modified: false,
|
83
|
-
customMode: false,
|
84
208
|
deleteMode: false,
|
85
209
|
is_success: false
|
86
210
|
}
|
@@ -106,8 +230,28 @@ function vue_init(params = {}) {
|
|
106
230
|
event_hub.$on('cancel_customMode', function() {
|
107
231
|
this.customMode = false;
|
108
232
|
}.bind(this));
|
233
|
+
event_hub.$on('updateSort', function(progress) {
|
234
|
+
if($(this.$el).is(":visible")) {
|
235
|
+
var sort = ($(this.$el).index() + 1);
|
236
|
+
if(getParameterByName("p") > 1) {
|
237
|
+
sort = sort + ((getParameterByName("p") - 1) * options.countOfPage);
|
238
|
+
}
|
239
|
+
console.log(this.model.id + ":" + sort);
|
240
|
+
this.model.sort = sort;
|
241
|
+
this.updateModel();
|
242
|
+
}
|
243
|
+
}.bind(this));
|
109
244
|
},
|
110
245
|
methods: {
|
246
|
+
openModal: function(action_name) {
|
247
|
+
event_hub.$emit('update_action_name', action_name);
|
248
|
+
event_hub.$emit('update_model', this.model);
|
249
|
+
event_hub.$emit('toggle_mode', 'edit');
|
250
|
+
event_hub.$on('toggleUpdate', function() {
|
251
|
+
this.updateModel();
|
252
|
+
}.bind(this));
|
253
|
+
event_hub.$emit('openModal');
|
254
|
+
},
|
111
255
|
deleteModel: function () {
|
112
256
|
var that = this;
|
113
257
|
that.deleteMode = true;
|
@@ -129,7 +273,6 @@ function vue_init(params = {}) {
|
|
129
273
|
},
|
130
274
|
updateModel: function() {
|
131
275
|
var that = this;
|
132
|
-
var modal = $('#editModal_' + that.model.id);
|
133
276
|
$.ajax({
|
134
277
|
method: 'PATCH',
|
135
278
|
data: {
|
@@ -137,24 +280,22 @@ function vue_init(params = {}) {
|
|
137
280
|
},
|
138
281
|
url: that.info.url_prefix + '/' + that.model.id + options.suffix + location.search,
|
139
282
|
beforeSend: function() {
|
140
|
-
|
283
|
+
event_hub.$emit('dimmerOn');
|
141
284
|
$('.progress-bar').css('width', '0');
|
142
285
|
},
|
143
286
|
success: function(res) {
|
144
287
|
that.errors = {};
|
145
288
|
that.modified = false;
|
146
289
|
that.is_success = true;
|
147
|
-
|
148
|
-
|
149
|
-
modal.modal('hide');
|
150
|
-
});
|
290
|
+
event_hub.$emit('closeModal');
|
291
|
+
event_hub.$emit('dimmerOff');
|
151
292
|
sleep(1500).then(() => {
|
152
293
|
that.is_success = false;
|
153
294
|
});
|
154
295
|
},
|
155
296
|
error: function(res) {
|
156
297
|
that.errors = res.responseJSON.errors;
|
157
|
-
|
298
|
+
event_hub.$emit('dimmerOff');
|
158
299
|
}
|
159
300
|
});
|
160
301
|
}
|
@@ -164,27 +305,29 @@ function vue_init(params = {}) {
|
|
164
305
|
var rootVue = new Vue({
|
165
306
|
mixins: [root_mixin],
|
166
307
|
el: '#vue_crud',
|
167
|
-
data: {
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
308
|
+
data: function() {
|
309
|
+
return {
|
310
|
+
default_url: '',
|
311
|
+
column_type: options.column_type || 'card',
|
312
|
+
models: [],
|
313
|
+
model: {},
|
314
|
+
info: {
|
315
|
+
url_prefix: '',
|
316
|
+
titles: {},
|
317
|
+
structure: {},
|
318
|
+
model_attributes: []
|
319
|
+
},
|
320
|
+
errors: {},
|
321
|
+
progress: '0',
|
322
|
+
countOfPage: options.countOfPage || 9,
|
323
|
+
currentPage: getParameterByName("p") || 1,
|
324
|
+
searchQuery: getParameterByName("q"),
|
325
|
+
filteredModelCount: null,
|
326
|
+
is_calculating: false,
|
327
|
+
model_prefix: getParameterByName("mp"),
|
328
|
+
selected_attribute: getParameterByName("sa"),
|
329
|
+
selected_text: getParameterByName("st")
|
330
|
+
}
|
188
331
|
},
|
189
332
|
mounted: function() {
|
190
333
|
var that = this;
|
@@ -258,10 +401,14 @@ function vue_init(params = {}) {
|
|
258
401
|
return String(model[that.selected_attribute]).indexOf(that.searchQuery) !== -1;
|
259
402
|
}
|
260
403
|
});
|
404
|
+
|
261
405
|
that.filteredModelCount = result.length
|
262
406
|
setTimeout(function () {
|
263
407
|
that.is_calculating = false
|
264
408
|
}, 500)
|
409
|
+
// TODO: Order by sort after refresh, now computed will not wait for
|
410
|
+
// TODO: the component to finish done the update ajax
|
411
|
+
//.sort((a, b) => a.sort > b.sort ? 1 : -1)
|
265
412
|
return result.slice(
|
266
413
|
that.pageStart,
|
267
414
|
that.countOfPage + that.pageStart
|
@@ -276,6 +423,15 @@ function vue_init(params = {}) {
|
|
276
423
|
}
|
277
424
|
},
|
278
425
|
methods: {
|
426
|
+
addModel: function(action_name) {
|
427
|
+
event_hub.$emit('update_action_name', action_name);
|
428
|
+
event_hub.$emit('update_model', this.model);
|
429
|
+
event_hub.$emit('toggle_mode', 'new');
|
430
|
+
event_hub.$on('toggleCreate', function() {
|
431
|
+
this.createModel();
|
432
|
+
}.bind(this));
|
433
|
+
event_hub.$emit('openModal');
|
434
|
+
},
|
279
435
|
setPage: function(idx){
|
280
436
|
if( idx <= 0 || idx > this.totalPage ){
|
281
437
|
return;
|
@@ -291,44 +447,41 @@ function vue_init(params = {}) {
|
|
291
447
|
model: that.model,
|
292
448
|
},
|
293
449
|
url: that.info.url_prefix + options.suffix + location.search,
|
294
|
-
|
295
|
-
|
450
|
+
beforeSend: function() {
|
451
|
+
event_hub.$emit('dimmerOn');
|
296
452
|
$('.progress-bar').css('width', '0');
|
297
453
|
},
|
298
454
|
success: function(res) {
|
299
|
-
|
455
|
+
event_hub.$emit('closeModal');
|
456
|
+
event_hub.$emit('dimmerOff');
|
300
457
|
that.errors = {};
|
301
458
|
that.model = obj_to_json(that.info.structure);
|
302
459
|
that.models.push(res);
|
303
|
-
sleep(500).then(() => {
|
304
|
-
$('.new_modal').find('.dimmer').toggleClass('active');
|
305
|
-
$('.new_modal').modal('hide');
|
306
|
-
});
|
307
460
|
},
|
308
461
|
error: function(res) {
|
309
462
|
that.errors = res.responseJSON.errors;
|
310
|
-
|
463
|
+
event_hub.$emit('dimmerOff');
|
311
464
|
}
|
312
465
|
});
|
313
466
|
}
|
314
467
|
}
|
315
468
|
})
|
316
469
|
}
|
317
|
-
$(document).ready(function() {
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
});
|
470
|
+
// $(document).ready(function() {
|
471
|
+
// // $(document).delegate('[data-modal]', 'click', function(event) {
|
472
|
+
// // var target = $(this).data('modal');
|
473
|
+
// // $(target).modal({
|
474
|
+
// // observeChanges: true,
|
475
|
+
// // transition: 'fade down',
|
476
|
+
// // onShow: function() {
|
477
|
+
// // $(this).find('select.ui.dropdown').dropdown();
|
478
|
+
// // $(this).find('.ui.checkbox').checkbox();
|
479
|
+
// // if(typeof modalOpen !== "undefined") modalOpen(this);
|
480
|
+
// // },
|
481
|
+
// // onHide: function() {
|
482
|
+
// // event_hub.$emit('cancel_customMode');
|
483
|
+
// // if(typeof modalClose !== "undefined") modalClose(this);
|
484
|
+
// // }
|
485
|
+
// // }).modal('show');
|
486
|
+
// // });
|
487
|
+
// });
|