formily 0.0.5.5.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (162) hide show
  1. checksums.yaml +7 -0
  2. data/CODE_OF_CONDUCT.md +13 -0
  3. data/Gemfile +4 -0
  4. data/Gemfile.lock +156 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +84 -0
  7. data/Rakefile +1 -0
  8. data/app/assets/fonts/formily-icon.eot +0 -0
  9. data/app/assets/fonts/formily-icon.svg +26 -0
  10. data/app/assets/fonts/formily-icon.ttf +0 -0
  11. data/app/assets/fonts/formily-icon.woff +0 -0
  12. data/app/assets/fonts/formily-icon.woff2 +0 -0
  13. data/app/assets/images/blank_file.png +0 -0
  14. data/app/assets/images/formily_spin.gif +0 -0
  15. data/app/assets/javascripts/formily.js +5 -0
  16. data/app/assets/javascripts/formily/base/ajax_reloader.js +24 -0
  17. data/app/assets/javascripts/formily/base/buttons.js +160 -0
  18. data/app/assets/javascripts/formily/base/form_response.js +28 -0
  19. data/app/assets/javascripts/formily/base/local_time.js +9 -0
  20. data/app/assets/javascripts/formily/editor.js +46 -0
  21. data/app/assets/javascripts/formily/editor/editor_buttons.js +186 -0
  22. data/app/assets/javascripts/formily/editor/form_preview.js +53 -0
  23. data/app/assets/javascripts/formily/editor/input_model.js +76 -0
  24. data/app/assets/javascripts/formily/editor/input_on_change.js +83 -0
  25. data/app/assets/javascripts/formily/editor/related_fields.js +76 -0
  26. data/app/assets/javascripts/formily/form.js +22 -0
  27. data/app/assets/javascripts/formily/formily_editor.js +329 -0
  28. data/app/assets/javascripts/formily/formily_modal.js +104 -0
  29. data/app/assets/javascripts/formily/formily_url.js.erb +26 -0
  30. data/app/assets/javascripts/formily/inputs/conditioned.js +4 -0
  31. data/app/assets/javascripts/formily/inputs/conditioned/checkbox.js +73 -0
  32. data/app/assets/javascripts/formily/inputs/conditioned/option.js +82 -0
  33. data/app/assets/javascripts/formily/inputs/conditioned/radio.js +160 -0
  34. data/app/assets/javascripts/formily/inputs/date_time.js +25 -0
  35. data/app/assets/javascripts/formily/inputs/input_tab.js +18 -0
  36. data/app/assets/javascripts/formily/inputs/location.js +39 -0
  37. data/app/assets/javascripts/formily/inputs/multi_file.js +228 -0
  38. data/app/assets/javascripts/formily/lib/jquery.datetimepicker.full.min.js +2 -0
  39. data/app/assets/javascripts/formily/lib/modernizr.js +8 -0
  40. data/app/assets/javascripts/formily/lib/strftime.min.js +12 -0
  41. data/app/assets/javascripts/formily/lib/tag-it.min.js +17 -0
  42. data/app/assets/javascripts/formily/mobile.js +10 -0
  43. data/app/assets/javascripts/formily_app.js +15 -0
  44. data/app/assets/javascripts/formily_iframe.js +11 -0
  45. data/app/assets/stylesheets/formily.scss +14 -0
  46. data/app/assets/stylesheets/formily/base/fonts.scss +65 -0
  47. data/app/assets/stylesheets/formily/base/layout.scss +66 -0
  48. data/app/assets/stylesheets/formily/base/links.css +7 -0
  49. data/app/assets/stylesheets/formily/base/ui-dialog.scss +129 -0
  50. data/app/assets/stylesheets/formily/editor.scss +25 -0
  51. data/app/assets/stylesheets/formily/editor/inputs_group_list.css +14 -0
  52. data/app/assets/stylesheets/formily/editor/inputs_list.css +97 -0
  53. data/app/assets/stylesheets/formily/editor/related_modal.scss +49 -0
  54. data/app/assets/stylesheets/formily/formily_editor.scss +53 -0
  55. data/app/assets/stylesheets/formily/formily_modal.scss +2 -0
  56. data/app/assets/stylesheets/formily/foundation_fix.scss +140 -0
  57. data/app/assets/stylesheets/formily/inputs/date_time.scss +8 -0
  58. data/app/assets/stylesheets/formily/inputs/multi_file.scss +111 -0
  59. data/app/assets/stylesheets/formily/jquery.datetimepicker.min.css +1 -0
  60. data/app/assets/stylesheets/formily/lib/jquery.tagit.css +69 -0
  61. data/app/assets/stylesheets/formily/modal/content.scss +36 -0
  62. data/app/assets/stylesheets/formily/modal/iframe.scss +29 -0
  63. data/app/assets/stylesheets/formily_iframe.scss +64 -0
  64. data/app/assets/stylesheets/foundation_formily.scss +20 -0
  65. data/app/controllers/formily/file_controller.rb +17 -0
  66. data/app/controllers/formily/form_types_controller.rb +46 -0
  67. data/app/controllers/formily/formilyable_controller.rb +98 -0
  68. data/app/controllers/formily/forms_controller.rb +133 -0
  69. data/app/controllers/formily/iframe/forms_controller.rb +28 -0
  70. data/app/controllers/formily/inputs_controller.rb +113 -0
  71. data/app/controllers/formily/submit_data_controller.rb +151 -0
  72. data/app/controllers/formily_controller.rb +22 -0
  73. data/app/helpers/formily_helper.rb +17 -0
  74. data/app/models/formily/checkbox_input.rb +8 -0
  75. data/app/models/formily/checkbox_input_group.rb +14 -0
  76. data/app/models/formily/date_time_input.rb +19 -0
  77. data/app/models/formily/file.rb +14 -0
  78. data/app/models/formily/form.rb +41 -0
  79. data/app/models/formily/form_type.rb +10 -0
  80. data/app/models/formily/formilyable_form.rb +18 -0
  81. data/app/models/formily/input.rb +124 -0
  82. data/app/models/formily/input_value.rb +23 -0
  83. data/app/models/formily/multiple_file_input.rb +18 -0
  84. data/app/models/formily/option_input.rb +8 -0
  85. data/app/models/formily/options_input_group.rb +14 -0
  86. data/app/models/formily/radio_input.rb +12 -0
  87. data/app/models/formily/radio_input_group.rb +14 -0
  88. data/app/models/formily/static_text.rb +8 -0
  89. data/app/models/formily/submit.rb +47 -0
  90. data/app/models/formily/text_input.rb +8 -0
  91. data/app/models/formily/textarea_input.rb +8 -0
  92. data/app/views/formily/data/_forms_table.html.haml +19 -0
  93. data/app/views/formily/data/_many_tables.html.erb +3 -0
  94. data/app/views/formily/data/_table.html.erb +33 -0
  95. data/app/views/formily/data/submit_data_table.html.haml +32 -0
  96. data/app/views/formily/editor/_default_value.haml +18 -0
  97. data/app/views/formily/editor/_editor.haml +18 -0
  98. data/app/views/formily/editor/_modal.haml +197 -0
  99. data/app/views/formily/editor/partial/_group.haml +41 -0
  100. data/app/views/formily/editor/partial/_group_input.haml +36 -0
  101. data/app/views/formily/editor/partial/_input.haml +35 -0
  102. data/app/views/formily/editor/partial/_input_fieldset.haml +12 -0
  103. data/app/views/formily/form_types/_form.haml +9 -0
  104. data/app/views/formily/form_types/edit.haml +6 -0
  105. data/app/views/formily/form_types/index.haml +24 -0
  106. data/app/views/formily/form_types/new.haml +6 -0
  107. data/app/views/formily/formilyable/index.haml +67 -0
  108. data/app/views/formily/formilyable/new.haml +37 -0
  109. data/app/views/formily/forms/_form.haml +34 -0
  110. data/app/views/formily/forms/_preview.haml +16 -0
  111. data/app/views/formily/forms/edit.haml +5 -0
  112. data/app/views/formily/forms/index.haml +40 -0
  113. data/app/views/formily/forms/new.haml +5 -0
  114. data/app/views/formily/forms/reload_formily_table.haml +4 -0
  115. data/app/views/formily/forms/show.haml +1 -0
  116. data/app/views/formily/helpers/_iframe_formily_modal.html.haml +3 -0
  117. data/app/views/formily/helpers/_related_forms.html.haml +12 -0
  118. data/app/views/formily/helpers/_related_forms_tr.html.haml +28 -0
  119. data/app/views/formily/iframe/forms/show.haml +1 -0
  120. data/app/views/formily/inputs/_group.haml +40 -0
  121. data/app/views/formily/inputs/_group_input.haml +36 -0
  122. data/app/views/formily/inputs/_input.haml +35 -0
  123. data/app/views/formily/inputs/_input_fieldset.haml +12 -0
  124. data/app/views/formily/inputs/render_input_html.haml +7 -0
  125. data/app/views/formily/partial/_form.haml +37 -0
  126. data/app/views/formily/partial/inputs/_checkbox_input.haml +18 -0
  127. data/app/views/formily/partial/inputs/_checkbox_input_group.haml +36 -0
  128. data/app/views/formily/partial/inputs/_conditioned_fields.haml +36 -0
  129. data/app/views/formily/partial/inputs/_date_time_input.haml +15 -0
  130. data/app/views/formily/partial/inputs/_file_input.haml +20 -0
  131. data/app/views/formily/partial/inputs/_file_preview.haml +14 -0
  132. data/app/views/formily/partial/inputs/_input.haml +1 -0
  133. data/app/views/formily/partial/inputs/_multiple_file_input.haml +25 -0
  134. data/app/views/formily/partial/inputs/_options_input_group.haml +77 -0
  135. data/app/views/formily/partial/inputs/_radio_input_group.haml +41 -0
  136. data/app/views/formily/partial/inputs/_static_text.haml +11 -0
  137. data/app/views/formily/partial/inputs/_text_input.haml +19 -0
  138. data/app/views/formily/partial/inputs/_textarea_input.haml +19 -0
  139. data/app/views/formily/submit_data/submit.html.erb +5 -0
  140. data/app/views/formily/submit_data/submit.json.jbuilder +5 -0
  141. data/app/views/layouts/formily_iframe.haml +16 -0
  142. data/config/routes.rb +41 -0
  143. data/formily.gemspec +41 -0
  144. data/lib/formily.rb +37 -0
  145. data/lib/formily/config.rb +72 -0
  146. data/lib/formily/engine.rb +12 -0
  147. data/lib/formily/helpers/view_helper.rb +114 -0
  148. data/lib/formily/relation.rb +26 -0
  149. data/lib/formily/relation/formily_methods.rb +30 -0
  150. data/lib/formily/relation/has_many_methods.rb +16 -0
  151. data/lib/formily/submitted_data_table.rb +74 -0
  152. data/lib/formily/version.rb +4 -0
  153. data/lib/generators/formily/install/install_generator.rb +43 -0
  154. data/lib/generators/formily/install/templates/create_formily_data.rb +28 -0
  155. data/lib/generators/formily/install/templates/create_formily_files.rb +13 -0
  156. data/lib/generators/formily/install/templates/create_formily_form_types.rb +12 -0
  157. data/lib/generators/formily/install/templates/create_formily_forms.rb +16 -0
  158. data/lib/generators/formily/install/templates/create_formily_inputs.rb +24 -0
  159. data/lib/generators/formily/install/templates/create_formilyable_forms.rb +17 -0
  160. data/lib/generators/formily/install/templates/formily.rb +21 -0
  161. data/lib/generators/formily/views/views_generator.rb +11 -0
  162. metadata +350 -0
@@ -0,0 +1,26 @@
1
+ // Routes JS
2
+ <% url = Rails.application.routes.url_helpers %>
3
+ window.FormilyRoutes = {
4
+ input_create_path: function(){
5
+ // POST
6
+ return "<%= url.formily_inputs_path %>";
7
+ },
8
+ input_update_path: function(id){
9
+ // PUT
10
+ return "<%= url.formily_input_path(0).to_s[0...-1] %>" + id.toString();
11
+ },
12
+ input_delete_path: function(id){
13
+ // DELETE
14
+ return "<%= url.formily_input_path(0).to_s[0...-1] %>" + id.toString();
15
+ },
16
+ form_preview_path: function(){
17
+ //POST
18
+ return "<%= url.preview_form_formily_forms_path %>";
19
+ },
20
+ form_file_path: function(id) {
21
+ return "<%= url.formily_file_path(0).to_s[0...-1] %>" + id.toString();
22
+ },
23
+ form_upload_file_path: function () {
24
+ return "<%= url.upload_file_formily_submit_data_path %>";
25
+ }
26
+ };
@@ -0,0 +1,4 @@
1
+ // Conditioned field
2
+ //= require formily/inputs/conditioned/checkbox
3
+ //= require formily/inputs/conditioned/radio
4
+ //= require formily/inputs/conditioned/option
@@ -0,0 +1,73 @@
1
+ // Checkbox conditioned fields
2
+
3
+ $(document).ready(function(){
4
+
5
+ $(document).on('change', 'input[type=checkbox][data-formily-conditioned]', function(){
6
+ var conditionedField, self = $(this);
7
+ conditionedField = self.parent(0).find('input, textarea').not(self);
8
+
9
+ if (self.get(0).checked) {
10
+ // Show conditioned field
11
+ if(conditionedField.attr('type') == 'file') {
12
+ conditionedField.parent(0).show(0);
13
+ } else {
14
+ conditionedField.show(0);
15
+ }
16
+ if(conditionedField.attr('multiple')) {
17
+ conditionedField.attr('name', self.data('cName') + '[]');
18
+ conditionedField.parents('.formily-input:first').show(0);
19
+ } else {
20
+ conditionedField.attr('name', self.data('cName'));
21
+ }
22
+ self.get(0).removeAttribute('name');
23
+ conditionedField.focus();
24
+ } else {
25
+ // Hide conditioned field
26
+ if(conditionedField.attr('type') == 'file') {
27
+ if(confirm('Delete all files ?')){
28
+ if(conditionedField.attr('multiple')) {
29
+ conditionedField.parents('.formily-input:first').hide(0);
30
+ } else {
31
+ conditionedField.parent(0).hide(0);
32
+ }
33
+
34
+ var input_id = conditionedField.attr('name').match(/\[(\d+)\](\[\])?$/)[1];
35
+
36
+ var form = conditionedField.parents('form');
37
+
38
+ var data = {
39
+ user_id: form.find('input[name=user_id]').val(),
40
+ authenticity_token: form.find('input[name=authenticity_token]').val(),
41
+ form_id: form.find('input[name=form_id]').val(),
42
+ resource_id: form.find('input[name=resource_id]').val(),
43
+ resource_type: form.find('input[name=resource_type]').val(),
44
+ input_id: input_id
45
+ };
46
+
47
+ $.ajax({
48
+ url: '/formily/file/delete_by_input_id',
49
+ data: data,
50
+ type: 'DELETE'
51
+ });
52
+
53
+ conditionedField.parents('.formily-input:first').find('.file_upload').remove();
54
+
55
+ conditionedField.get(0).removeAttribute('name');
56
+ self.attr('name', self.data('cName'));
57
+ self.focus();
58
+ } else {
59
+ self.get(0).checked = true;
60
+ }
61
+ } else {
62
+ conditionedField.hide(0);
63
+ conditionedField.get(0).removeAttribute('name');
64
+ //conditionedField.get(0).removeAttribute('value');
65
+ self.attr('name', self.data('cName'));
66
+ self.focus();
67
+ }
68
+
69
+ }
70
+
71
+ });
72
+
73
+ });
@@ -0,0 +1,82 @@
1
+ // Select options conditioned fields
2
+
3
+ $(document).ready(function(){
4
+
5
+ var prevOption;
6
+
7
+ $(document).on('focus click', 'select[data-formily-name]', function(e){
8
+ var self = $(this);
9
+ prevOption = self.find('option[value=' + self.val() + ']');
10
+ });
11
+
12
+ $(document).on('change', 'select[data-formily-name]', function(e){
13
+
14
+ var self = $(this);
15
+ var option = self.find('option[value=' + self.val() + ']');
16
+ var conditioned_field = option.data('formilyConditioned');
17
+
18
+ if(prevOption && prevOption.length > 0 && prevOption.data('formilyConditioned')) {
19
+ var prevConditionedField = self.parent().find('[data-formily-conditioned-field="' + prevOption.data('formilyConditioned') + '"]');
20
+
21
+ if(prevOption.data('formilyConditioned').match(/file/i)) {
22
+
23
+ var input_id = prevConditionedField.attr('name').match(/\[(\d+)\](\[\])?$/)[1];
24
+
25
+ var form = self.parents('form');
26
+
27
+ var data = {
28
+ user_id: form.find('input[name=user_id]').val(),
29
+ authenticity_token: form.find('input[name=authenticity_token]').val(),
30
+ form_id: form.find('input[name=form_id]').val(),
31
+ resource_id: form.find('input[name=resource_id]').val(),
32
+ resource_type: form.find('input[name=resource_type]').val(),
33
+ input_id: input_id
34
+ };
35
+
36
+ $.ajax({
37
+ url: '/formily/file/delete_by_input_id',
38
+ data: data,
39
+ type: 'DELETE'
40
+ });
41
+
42
+ prevConditionedField.get(0).removeAttribute('name');
43
+ prevConditionedField.parent().find('.file_upload').remove();
44
+
45
+ if(prevConditionedField.attr('multiple')) {
46
+ prevConditionedField.parent().parent().hide(0);
47
+ } else {
48
+ prevConditionedField.parent().hide(0);
49
+ }
50
+
51
+ } else {
52
+ prevConditionedField.get(0).removeAttribute('name');
53
+ prevConditionedField.hide(0);
54
+ }
55
+
56
+ }
57
+
58
+ self.attr('name', self.data('formilyName'));
59
+
60
+ if(conditioned_field) {
61
+
62
+ var i = self.parent().find('[data-formily-conditioned-field="' + conditioned_field + '"]');
63
+
64
+ self.get(0).removeAttribute('name');
65
+
66
+ if(i.attr('type') == 'file') {
67
+
68
+ if(i.attr('multiple')) {
69
+ i.parent().parent().show(0);
70
+ } else {
71
+ i.parent().show(0);
72
+ }
73
+
74
+ } else {
75
+ i.show(0);
76
+ }
77
+
78
+ i.attr('name', option.data('cName'));
79
+ }
80
+ });
81
+
82
+ });
@@ -0,0 +1,160 @@
1
+ // Radio conditioned fields
2
+
3
+ $(document).on('ready formily_loaded', function(){
4
+
5
+ var showConditionedField = function(field){
6
+
7
+ var cField = field.parent(0).find('input, textarea').not(field);
8
+
9
+ if(field.data('formilyConditioned')) {
10
+ field.get(0).removeAttribute('name');
11
+ cField.attr('name', field.data('c2Name'));
12
+ }
13
+
14
+ if(cField.attr('type') == 'file') {
15
+
16
+ if(cField.attr('multiple')) {
17
+ cField.parents('.formily-input:first').show(0);
18
+ } else {
19
+ cField.parent().show(0);
20
+ cField.show(0);
21
+ }
22
+
23
+ } else {
24
+ cField.show(0);
25
+ }
26
+
27
+ };
28
+
29
+ var hideConditionedField = function(field){
30
+
31
+ var cField = field.parent(0).find('input, textarea').not(field);
32
+
33
+ if(field.data('formilyConditioned')) {
34
+ field.attr('name', field.data('cName'));
35
+ cField.get(0).removeAttribute('name');
36
+ }
37
+
38
+ if(cField.attr('multiple')) {
39
+ cField.parents('.formily-input:first').hide(0);
40
+ field.parent().find('.formily-files-container').html('');
41
+ } else {
42
+ cField.hide(0);
43
+ field.parent().find('.formily-files-container').html('');
44
+ }
45
+
46
+ if(cField.attr('type') == 'file') {
47
+ // Remove all files
48
+ var input_id = field.attr('data-c2-name').match(/\[(\d+)\](\[\])?$/)[1];
49
+ var form = field.parents('form');
50
+
51
+ var data = {
52
+ user_id: form.find('input[name=user_id]').val(),
53
+ authenticity_token: form.find('input[name=authenticity_token]').val(),
54
+ form_id: form.find('input[name=form_id]').val(),
55
+ resource_id: form.find('input[name=resource_id]').val(),
56
+ resource_type: form.find('input[name=resource_type]').val(),
57
+ input_id: input_id
58
+ };
59
+
60
+ $.ajax({
61
+ url: '/formily/file/delete_by_input_id',
62
+ data: data,
63
+ type: 'DELETE'
64
+ });
65
+ }
66
+
67
+ };
68
+
69
+ // Initialize radio groups
70
+ $('fieldset.formily-radio-group').each(function(_, elem){
71
+ var self = $(elem);
72
+ var radio = self.find('input[type=radio][checked]');
73
+
74
+ if(radio.length > 0) {
75
+ self.data('prevRadio', radio);
76
+ } else {
77
+ self.data('prevRadio', 0);
78
+ }
79
+ });
80
+
81
+ $(document).on('change', 'input[type=radio][data-formily-conditioned]', function(e){
82
+
83
+ var self = $(this);
84
+ var fieldset = self.parents('fieldset');
85
+
86
+ if(fieldset.data('prevRadio') == 0){
87
+ fieldset.data('prevRadio', self);
88
+ }
89
+
90
+ var prevRadio = fieldset.data('prevRadio');
91
+
92
+ if(prevRadio.not(self).length == 0) {
93
+ // First init
94
+ showConditionedField(self);
95
+
96
+ self.prop('checked', true);
97
+ self.attr('checked', 'checked');
98
+
99
+ } else {
100
+
101
+ if(prevRadio.data('formilyConditioned')) {
102
+ // Hide conditioned field
103
+ var i = prevRadio.parent(0).find('input, textarea').not(prevRadio);
104
+
105
+ if(i.attr('type') == 'file') {
106
+
107
+ if (confirm('Delete all files ?')) {
108
+
109
+ if(self.data('formilyConditioned')) {
110
+ showConditionedField(self);
111
+ }
112
+
113
+ hideConditionedField(prevRadio);
114
+
115
+ prevRadio.prop('checked', false);
116
+ prevRadio.get(0).removeAttribute('checked');
117
+
118
+ self.prop('checked', true);
119
+ self.attr('checked', 'checked');
120
+
121
+ fieldset.data('prevRadio', self);
122
+ } else {
123
+
124
+ if(self.data('formilyConditioned')) {
125
+ hideConditionedField(self);
126
+ }
127
+
128
+ prevRadio.prop('checked', true);
129
+ prevRadio.attr('checked', 'checked');
130
+ self.prop('checked', false);
131
+ self.get(0).removeAttribute('checked');
132
+ fieldset.data('prevRadio', prevRadio);
133
+ }
134
+ } else {
135
+
136
+ hideConditionedField(prevRadio);
137
+ showConditionedField(self);
138
+
139
+ self.prop('checked', true);
140
+ self.attr('checked', 'checked');
141
+
142
+ prevRadio.prop('checked', false);
143
+ prevRadio.get(0).removeAttribute('checked');
144
+
145
+ fieldset.data('prevRadio', self);
146
+ }
147
+
148
+ } else {
149
+ showConditionedField(self);
150
+ self.prop('checked', true);
151
+ self.attr('checked', 'checked');
152
+ fieldset.data('prevRadio', self);
153
+ }
154
+ }
155
+
156
+ e.preventDefault();
157
+
158
+ });
159
+
160
+ });
@@ -0,0 +1,25 @@
1
+ // DateTime input
2
+ //= require formily/lib/jquery.datetimepicker.full.min
3
+ //= require formily/lib/strftime.min
4
+
5
+ $(document).on('ready formily_loaded', function(){
6
+
7
+ $('.formily_date_time_picker').each(function(_, el){
8
+ var dt_field = $(el);
9
+ var cur_date = new Date();
10
+
11
+ dt_field.datetimepicker({
12
+ formatDate:'Y/m/d',
13
+ scrollMonth: false,
14
+ yearStart: cur_date.getFullYear(),
15
+ yearEnd: cur_date.getFullYear() + 1,
16
+ formatTime:'H:i',
17
+ minDate:'-1970/01/02'
18
+ });
19
+
20
+ if(dt_field.val().match(/current/i)) {
21
+ var dt_str = strftime('%Y/%m/%d %H:%M', cur_date);
22
+ dt_field.val(dt_str);
23
+ }
24
+ });
25
+ });
@@ -0,0 +1,18 @@
1
+ // IPad GO button & Enter on PC
2
+ $(document).on('ready formily_loaded', function(){
3
+
4
+ $(document).on('keydown', 'input', function(e){
5
+
6
+ if(e.keyCode == 13) {
7
+ try{
8
+ $(e.target).parents('.formily-input').next().find('input:first, textarea, button, select').focus()
9
+ } catch(ex) {
10
+ console.error(ex);
11
+ }
12
+
13
+ return false;
14
+ }
15
+
16
+ });
17
+
18
+ });
@@ -0,0 +1,39 @@
1
+ $(document).on('ready formily_loaded', function() {
2
+
3
+ var locationInputs = $('input[data-location], p.static-text[data-location], textarea[data-location]');
4
+
5
+ if(locationInputs.length > 0) {
6
+ if(navigator.geolocation){
7
+
8
+ var geolocationSuccess = function(position){
9
+ var latitude = position.coords.latitude;
10
+ var longitude = position.coords.longitude;
11
+
12
+ var url = window.location.protocol + '//maps.googleapis.com/maps/api/geocode/json?language=en&latlng=';
13
+
14
+ url += latitude + ',';
15
+ url += longitude;
16
+
17
+ $.get(url, function(data) {
18
+ locationInputs.each(function(_, el){
19
+ var self = $(el);
20
+ if(self.data('location') == 'address') {
21
+ self.val(data.results[0].formatted_address);
22
+ } else {
23
+ self.val(latitude + ', ' + longitude);
24
+ }
25
+ });
26
+
27
+ });
28
+ };
29
+
30
+ var geolocationError = function(){
31
+ self.val('');
32
+ console.error('Unable to retrieve your location');
33
+ };
34
+
35
+ navigator.geolocation.getCurrentPosition(geolocationSuccess, geolocationError);
36
+ }
37
+ }
38
+
39
+ });
@@ -0,0 +1,228 @@
1
+ function isFormilyFileUploaded(){
2
+ var msg = "Files haven't been uploaded yet!\nDo you want to cancel file upload?";
3
+
4
+ for(var i = 0; i < Object.keys(window.formilyFiles).length; i++){
5
+ if(window.formilyFiles[i]){
6
+ if(confirm(msg)){
7
+ return true;
8
+ } else {
9
+ return false;
10
+ }
11
+ }
12
+ }
13
+ return true;
14
+ }
15
+
16
+
17
+ function filePreview(index){
18
+
19
+ var i = index;
20
+
21
+ if(window.formilyFiles[index] != undefined) {
22
+ var obj = window.formilyFiles[index];
23
+ var file = obj.file;
24
+ var s, img;
25
+ var reader = new FileReader();
26
+
27
+ reader.onload = function(e) {
28
+ if($('.file_upload[data-ff-id="' + i + '"]').length == 0){
29
+
30
+ var b = $('input[type="file"][multiple][name="' + window.formilyFiles[i].input_name + '"]');
31
+ var button = document.querySelector('input[type="file"][multiple][name="' + window.formilyFiles[i].input_name + '"]');
32
+ var bText = b.parent(0).find('span');
33
+
34
+ window.formilyFilesIndex--;
35
+ bText.text('[' + window.formilyFilesIndex + ' files left]');
36
+
37
+ if(file.type.indexOf('image') >= 0) {
38
+ var div = document.createElement("DIV");
39
+ div.setAttribute('class', 'file_upload new_img');
40
+ div.setAttribute('data-ff-id', i);
41
+
42
+ img = document.createElement("IMG");
43
+ img.src = e.target.result;
44
+
45
+ var node = document.createElement("SPAN");
46
+ var node2 = document.createElement("SPAN");
47
+ node.innerHTML = '&#xe802;';
48
+ node2.innerHTML = '0%';
49
+ node.setAttribute('class', 'delete_button');
50
+ node.setAttribute('style', 'display: none');
51
+ node2.setAttribute('class', 'formily-progress-bar');
52
+ div.appendChild(img);
53
+ div.appendChild(node);
54
+ div.appendChild(node2);
55
+
56
+ button.parentElement.parentElement.appendChild(div);
57
+ } else {
58
+ var ftype = window.formilyFiles[i].file.name.match(/.*\.([^.]+)/)[1];
59
+ img = $('<div class="file_upload file new_img" data-ff-id="' + i + '" ><span class="ext_label">' + ftype + '</span><span class="delete_button">&#xe802;</span><span class="formily-progress-bar">0%</span></div>');
60
+ s = b.parent(0).parent(0);
61
+ s.append(img);
62
+ }
63
+
64
+ if(window.formilyFilesIndex == 0) {
65
+ bText.text('');
66
+
67
+ var index2 = 0;
68
+ formilyFileUpload(index2);
69
+ }
70
+ }
71
+
72
+ filePreview(++i);
73
+ };
74
+
75
+ reader.readAsDataURL(file);
76
+ } else {
77
+ if(i < Object.keys(window.formilyFiles).length) {
78
+ filePreview(++i);
79
+ }
80
+ }
81
+ }
82
+
83
+ function formilyFileUpload(index) {
84
+ var i = index;
85
+
86
+ if(window.formilyFiles[index] != undefined) {
87
+ var obj = window.formilyFiles[index];
88
+ var file = obj.file;
89
+
90
+ var image = $('.file_upload[data-ff-id="' + i + '"]');
91
+
92
+ var data = new FormData();
93
+ data.append('file', file);
94
+ data.append('user_id', obj.data.user_id);
95
+ data.append('form_id', obj.data.form_id);
96
+ data.append('resource_id', obj.data.resource_id);
97
+ data.append('resource_type', obj.data.resource_type);
98
+ data.append('authenticity_token', obj.data.authenticity_token);
99
+ data.append('input_id', obj.data.input_id);
100
+ data.append('submit_id', obj.data.submit_id);
101
+
102
+ var progress = function(e){
103
+ if(e.lengthComputable){
104
+ var max = e.total;
105
+ var current = e.loaded;
106
+ var percentage = (Math.round((current * 100)/max * 10) / 10);
107
+
108
+ image.find('span.formily-progress-bar').text(percentage + '%');
109
+
110
+ if(percentage >= 100) {
111
+ window.formilyFiles[i] = null;
112
+ formilyFileUpload(++i);
113
+ }
114
+ }
115
+ };
116
+
117
+ $.ajax({
118
+ url: FormilyRoutes.form_upload_file_path(),
119
+ type: 'POST',
120
+ data: data,
121
+ success: function (data) {
122
+ image.find('span.formily-progress-bar').hide(0);
123
+ image.find('span.delete_button').show(0);
124
+ image.find('span.delete_button').attr('data-formily-delete-file', '/formily/file/' + data.file_id);
125
+ image.removeClass('new_img');
126
+ },
127
+ error: function(data) {
128
+ image.find('span.formily-progress-bar').hide(0);
129
+ },
130
+ xhr: function(){
131
+ var myXhr = $.ajaxSettings.xhr();
132
+ if(myXhr.upload){
133
+ myXhr.upload.addEventListener('progress', progress, false);
134
+ }
135
+ return myXhr;
136
+ },
137
+ dataType: 'json',
138
+ cache: false,
139
+ contentType: false,
140
+ processData: false
141
+ });
142
+
143
+ } else {
144
+ if(i < Object.keys(window.formilyFiles).length) {
145
+ formilyFileUpload(++i);
146
+ }
147
+ }
148
+ }
149
+
150
+ $(document).ready(function() {
151
+
152
+ window.formilyFiles = {};
153
+ window.formilyFilesIndex = 0;
154
+
155
+ $(document).on('click', 'div.file_upload .delete_button', function(e){
156
+ var self = $(this);
157
+ var fileId = self.data('fileId');
158
+ var parent = self.parents('div.file_upload');
159
+ var csrf = self.parents('form').find('input[type=hidden][name=authenticity_token]').val();
160
+
161
+ if(confirm('Delete image ?')){
162
+ if(fileId){
163
+ $.ajax({
164
+ url: FormilyRoutes.form_file_path(fileId),
165
+ type: 'DELETE',
166
+ data: {authenticity_token: csrf},
167
+ success: function (data) {
168
+ parent.remove();
169
+ }
170
+ });
171
+ }else{
172
+ var id = parent.data('ffId');
173
+ window.formilyFiles[id] = undefined;
174
+ parent.remove();
175
+ }
176
+ }
177
+
178
+ return false;
179
+ });
180
+
181
+ $(document).on('click', 'button[type=button][data-f-multiple]', function(e){
182
+ var self = $(this);
183
+
184
+ if(e.originalEvent){
185
+ var btn = self.find('input[type="file"][multiple][name^="formily"]');
186
+
187
+ if(btn.length > 0) {
188
+ btn.click();
189
+ }
190
+
191
+ }
192
+ });
193
+
194
+ $(document).on('change', 'input[type="file"][multiple][name^="formily"]', function(){
195
+ var self = $(this);
196
+ var files = this.files;
197
+
198
+ window.formilyFilesIndex = files.length;
199
+
200
+ var form = self.parents('form');
201
+
202
+ var data = {
203
+ user_id: form.find('input[type=hidden][name=user_id]').val(),
204
+ form_id: form.find('input[type=hidden][name=form_id]').val(),
205
+ resource_id: form.find('input[type=hidden][name=resource_id]').val(),
206
+ resource_type: form.find('input[type=hidden][name=resource_type]').val(),
207
+ authenticity_token: form.find('input[type=hidden][name=authenticity_token]').val(),
208
+ submit_id: form.find('input[type=hidden][name=submit_id]').val(),
209
+ input_id: self.attr('name').match(/\[(\d+)\](\[\])?$/)[1]
210
+ };
211
+
212
+ for (var i = 0; i < files.length; i++) {
213
+ // Detect large file
214
+ if(files[i].size/1048576 > 9.5) {
215
+ alert('File: ' + files[i].name + ' is to large !');
216
+ window.formilyFilesIndex--;
217
+ } else {
218
+ window.formilyFiles[Object.keys(window.formilyFiles).length] = {file: files[i], input_name: self.attr('name'), data: data};
219
+ }
220
+ }
221
+
222
+ var index = 0;
223
+ filePreview(index);
224
+
225
+ self.val('');
226
+ });
227
+
228
+ });