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.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/vue_crud/froala_generator.rb +12 -0
  3. data/lib/generators/vue_crud/sortable.rb +10 -0
  4. data/lib/generators/vue_crud/templates/assets/images/froala_editor/color_picker.png +0 -0
  5. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/froala_editor.js +11089 -0
  6. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/languages/en_gb.js +178 -0
  7. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/languages/zh_cn.js +234 -0
  8. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/languages/zh_tw.js +234 -0
  9. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/align.js +119 -0
  10. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/char_counter.js +150 -0
  11. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/code_beautifier.js +3271 -0
  12. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/code_view.js +311 -0
  13. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/colors.js +350 -0
  14. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/draggable.js +379 -0
  15. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/emoticons.js +347 -0
  16. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/entities.js +113 -0
  17. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/file.js +609 -0
  18. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/font_family.js +178 -0
  19. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/font_size.js +116 -0
  20. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/forms.js +415 -0
  21. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/fullscreen.js +209 -0
  22. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/image.js +2401 -0
  23. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/image_manager.js +921 -0
  24. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/inline_style.js +86 -0
  25. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/line_breaker.js +435 -0
  26. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/link.js +997 -0
  27. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/lists.js +382 -0
  28. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/paragraph_format.js +293 -0
  29. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/paragraph_style.js +139 -0
  30. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/quick_insert.js +342 -0
  31. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/quote.js +138 -0
  32. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/save.js +176 -0
  33. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/table.js +3123 -0
  34. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/url.js +113 -0
  35. data/lib/generators/vue_crud/templates/assets/javascripts/froala_editor/plugins/video.js +1135 -0
  36. data/lib/generators/vue_crud/templates/assets/javascripts/sortable.js +1249 -0
  37. data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/froala_editor.scss +1008 -0
  38. data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/froala_style.scss +273 -0
  39. data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/plugins/char_counter.scss +46 -0
  40. data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/plugins/code_view.scss +102 -0
  41. data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/plugins/colors.scss +129 -0
  42. data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/plugins/draggable.scss +32 -0
  43. data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/plugins/emoticons.scss +27 -0
  44. data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/plugins/file.scss +135 -0
  45. data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/plugins/fullscreen.scss +28 -0
  46. data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/plugins/image.scss +233 -0
  47. data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/plugins/image_manager.scss +370 -0
  48. data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/plugins/line_breaker.scss +26 -0
  49. data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/plugins/quick_insert.scss +56 -0
  50. data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/plugins/table.scss +156 -0
  51. data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/plugins/video.scss +136 -0
  52. data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/themes/dark.scss +1087 -0
  53. data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/themes/gray.scss +1087 -0
  54. data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/themes/red.scss +1087 -0
  55. data/lib/generators/vue_crud/templates/assets/stylesheets/froala_editor/themes/royal.scss +1087 -0
  56. data/lib/generators/vue_crud/templates/vue_crud.html +54 -71
  57. data/lib/vue_crud/version.rb +1 -1
  58. data/vendor/assets/javascripts/vue_crud.js +212 -59
  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
- $('#vue_form').html()
16
- );
17
- models.find('.custom_modal_body').html(
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
- models.find('.custom_modal_action').html(
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
- vue_init({
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">Reset</a>
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
- <!-- NOTE: modal for new action -->
116
- <div class="ui modal new_modal" id="modelModal">
117
- <div class="header">創建 {{ info.titles.display_name }}</div>
118
- <!-- NOTE: Vue form -->
119
- <div class="content vue_form_for_new"></div>
120
- <div class="actions">
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="ui blue bottom attached progress">
125
- <div class="bar" :style="{width: progress + '%'}"></div>
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
- </div>
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" :class="{highlight: attribute.model_prefix + '.' + attribute.name == selected_attribute}">
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
- {{ model[attribute.name] }}
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" :data-modal="'#editModal_' + model.id" tabindex="0">
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" :data-modal="'#editModal_' + model.id" tabindex="0">
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
- <div class="ui modal" :id="'editModal_' + model.id">
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 }}
@@ -1,3 +1,3 @@
1
1
  module VueCrud
2
- VERSION = "0.1.9.6"
2
+ VERSION = "0.1.9.7"
3
3
  end
@@ -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 vue_init(params = {}) {
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.filter('datetime', function (value) {
67
- return new Date(value).toLocaleString();
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
- modal.find('.dimmer').toggleClass('active');
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
- sleep(500).then(() => {
148
- modal.find('.dimmer').toggleClass('active');
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
- modal.find('.dimmer').toggleClass('active');
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
- default_url: '',
169
- column_type: options.column_type || 'card',
170
- models: [],
171
- info: {
172
- url_prefix: '',
173
- titles: {},
174
- structure: {},
175
- model_attributes: []
176
- },
177
- model: {},
178
- errors: {},
179
- progress: '0',
180
- countOfPage: options.countOfPage || 9,
181
- currentPage: getParameterByName("p") || 1,
182
- searchQuery: getParameterByName("q"),
183
- filteredModelCount: null,
184
- is_calculating: false,
185
- model_prefix: getParameterByName("mp"),
186
- selected_attribute: getParameterByName("sa"),
187
- selected_text: getParameterByName("st")
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
- before: function() {
295
- $('.new_modal').find('.dimmer').toggleClass('active');
450
+ beforeSend: function() {
451
+ event_hub.$emit('dimmerOn');
296
452
  $('.progress-bar').css('width', '0');
297
453
  },
298
454
  success: function(res) {
299
- var modal = $(that.$el).parents('.modal');
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
- $('.new_modal').find('.dimmer').toggleClass('active');
463
+ event_hub.$emit('dimmerOff');
311
464
  }
312
465
  });
313
466
  }
314
467
  }
315
468
  })
316
469
  }
317
- $(document).ready(function() {
318
- $(document).delegate('[data-modal]', 'click', function(event) {
319
- var target = $(this).data('modal');
320
- $(target).modal({
321
- observeChanges: true,
322
- transition: 'fade down',
323
- onShow: function() {
324
- $(this).find('select.ui.dropdown').dropdown();
325
- $(this).find('.ui.checkbox').checkbox();
326
- if(typeof modalOpen !== "undefined") modalOpen(this);
327
- },
328
- onHide: function() {
329
- event_hub.$emit('cancel_customMode');
330
- if(typeof modalClose !== "undefined") modalClose(this);
331
- }
332
- }).modal('show');
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
+ // });