admin_it 1.2.8 → 1.3.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d0101e52edd3399fdcf4416647198117ce5083c8
4
- data.tar.gz: 77bee2f8fe7e18fb5abc519fa3d1d56a14d69b1f
3
+ metadata.gz: 117d0fbca72494a8c37ea5eb2abdd847521dd3fc
4
+ data.tar.gz: ab30fbe27aa45970be70c08c8c08f2dfdef0398f
5
5
  SHA512:
6
- metadata.gz: 33ebb8e9b2fb9e1af7e3d8d0b0d174c1a647fb634eab9bcd9ffc2a691b6d1ccabe4c2436c319c3abd3733da48c507e7645096714f5176eaf74f451977eb9706a
7
- data.tar.gz: 3deb6ba2467c316c8512b68476fd4629c071061996d48eca60140ee722b300342df8d13286be6845dc1d679f3bacff3c58b1f21f6b1c7221ca41aee634d247e0
6
+ metadata.gz: b8d5ea4ec7dbbe1a2284b19b765593ca158e8706900f2820e7eff81d66e08567a0a010b82a222e083532ecb69d3e9b735fda48b20d4a685b13327f7957f4aec1
7
+ data.tar.gz: c68d91a6fa29c710176ca48ddc2ac69a13452fe00a155a25413a0f3085adbda7c167772445051a25356df296f66c1eff8c38e0ac3dbeedcfe7a995bc8e1f96fc
@@ -72,6 +72,7 @@ var initTabs = function() {
72
72
  $('[data-tab="' + $(e.relatedTarget).attr('href') + '"]').removeClass('in');
73
73
  $('[data-tab="' + $(e.target).attr('href') + '"]').addClass('in');
74
74
  $('form input[type="hidden"][name="section"]').val($(this).attr('href').substr(1));
75
+ initTiles();
75
76
  });
76
77
  var active = $('.active > [data-toggle="tab"]');
77
78
  if (active.length > 0) {
@@ -90,33 +91,10 @@ var initLinks = function() {
90
91
  }
91
92
 
92
93
  var initImageUploads = function() {
93
- $form = $('form[data-sign-url]');
94
- $form.fileupload({
95
- url: $form.attr('action'),
96
- autoUpload: true,
97
- dataType: 'xml',
98
- add: function(evt, data) {
99
- $.ajax({
100
- url: $form.data('signUrl') + '/',
101
- type: 'GET',
102
- dataType: 'json',
103
- data: { doc: { title: data.files[0].name } },
104
- async: false,
105
- success: function(data) {
106
- // Now that we have our data, we update the form so it contains all
107
- // the needed data to sign the request
108
- $form.find('input[name=key]').val(data.key)
109
- $form.find('input[name=policy]').val(data.policy)
110
- $form.find('input[name=signature]').val(data.signature)
111
- }
112
- });
113
- data.submit();
114
- },
115
- success: function(data) {
116
- // Here we get the file url on s3 in an xml doc
117
- var url = $(data).find('Location').text()
118
- $($form.data('input')).val(url) // Update the real input in the other form
119
- },
94
+ $('[data-toggle="file-upload"]').fileUpload({
95
+ success: function(el, response) {
96
+ $(el.data('image')).attr('src', response.small_url);
97
+ }
120
98
  });
121
99
  }
122
100
 
@@ -153,12 +131,12 @@ var initControls = function() {
153
131
  initImageUploads();
154
132
  initSelects();
155
133
  initGeoPickers();
134
+ initTiles();
156
135
  }
157
136
 
158
137
  $(document).on('ready page:load', function() {
159
138
  initPartials();
160
139
  // initDialogs();
161
- initTiles();
162
140
  initTabs();
163
141
  initPopups();
164
142
  initLinks();
@@ -0,0 +1,109 @@
1
+ (function($) {
2
+ function parseOptions(element, options) {
3
+ var opts = $.extend({}, $.fn.fileUpload.defaults, element.data(), options);
4
+ opts.target = $(opts.target).first();
5
+ if (opts.target.length == 0) opts.target = null;
6
+ return opts;
7
+ };
8
+
9
+ function getCss(target) {
10
+ var pos = (target) ? target.position() : { top: 0, left: 0 };
11
+ if (target) {
12
+ pos.top -= parseInt(target.css('border-top-width'));
13
+ pos.left -= parseInt(target.css('border-left-width'));
14
+ pos.width = target.outerWidth();
15
+ pos.height = target.outerHeight();
16
+ }
17
+ return pos;
18
+ };
19
+
20
+ function completed(opts, success, response) {
21
+ // replace file input element to preven file uploading while form submitting
22
+ var input = opts.input
23
+ .clone()
24
+ .on('change', function() { addFile.apply(this, [opts]); });
25
+ opts.input.remove();
26
+ opts.input = input.appendTo(opts.wrapper);
27
+ if (!success) {
28
+ alert('Ошибка загрузки файла');
29
+ return;
30
+ }
31
+ if ($.isFunction(opts.success)) opts.success(input, response);
32
+ };
33
+
34
+ function addFile(opts) {
35
+ if (opts.started) {
36
+ alert('В данный момент загружается другой файл. ' +
37
+ 'Дождитесь окончания загрузки');
38
+ return;
39
+ }
40
+ opts.started = true;
41
+ var xhr = new XMLHttpRequest();
42
+ var uploaded = false;
43
+
44
+ if (xhr.upload) {
45
+ xhr.upload.addEventListener("load", function(e) { uploaded = true; }, false);
46
+ } else {
47
+ uploaded = true;
48
+ }
49
+
50
+ xhr.onreadystatechange = function() {
51
+ if (this.readyState == 4) {
52
+ opts.started = false;
53
+ if (this.status < 400) {
54
+ completed(
55
+ opts,
56
+ uploaded,
57
+ (uploaded) ? $.parseJSON(this.responseText) : null
58
+ );
59
+ } else {
60
+ completed(opts, false, null);
61
+ }
62
+ }
63
+ };
64
+
65
+ var el = opts.input.get(0);
66
+ var filename = el.files[0].name;
67
+ var method = (opts.method || opts.uploadMethod || 'POST').toUpperCase();
68
+ xhr.open(method, opts.url || opts.uploadUrl);
69
+ xhr.setRequestHeader('Accept', 'application/json');
70
+
71
+ // W3C (IE9, Chrome, Safari, Firefox 4+)
72
+ var formData = new FormData();
73
+ formData.append(opts.fieldName || 'file', el.files[0], filename);
74
+ if (opts.token) {
75
+ formData.append(opts.tokenName || 'token', opts.token);
76
+ }
77
+ xhr.send(formData);
78
+ };
79
+
80
+ function init(element, opts) {
81
+ if (!opts.target) return;
82
+ if (element.parent().hasClass('file-upload-wrapper')) return;
83
+ opts.wrapper = $('<div class="file-upload-wrapper"></div>').append(element);
84
+ // small timeout needed to take effect in DOM model
85
+ setTimeout(function() {
86
+ opts.css = getCss(opts.target);
87
+ opts.wrapper
88
+ .css(opts.css)
89
+ .appendTo(opts.target);
90
+ opts.input = element.on('change', function() { addFile.apply(this, [opts]); });
91
+ }, 100);
92
+ return opts;
93
+ };
94
+
95
+ $.fn.fileUpload = function(action, options) {
96
+ if ($.isPlainObject(action)) options = action;
97
+ if (typeof action !== 'string') action = 'init';
98
+ return this.each(function() {
99
+ var $this = $(this);
100
+ var opts = parseOptions($this, options);
101
+ if (action === 'init') {
102
+ init($this, opts);
103
+ }
104
+ });
105
+ };
106
+
107
+ $.fn.fileUpload.defaults = {
108
+ }
109
+ })(jQuery);
@@ -7,4 +7,5 @@
7
7
  //= require admin_it/jquery.fileupload-process
8
8
  //= require admin_it/jquery.geolocationpicker.js
9
9
  //= require select2
10
+ //= require admin_it/file_upload.js
10
11
  //= require admin_it/admin_it
@@ -27,3 +27,24 @@
27
27
  .fileupload-image img, .admin-show-image {
28
28
  max-width: 500px;
29
29
  }
30
+
31
+ [data-toggle="file-upload"] {
32
+ opacity: 0,
33
+ filter: alpha(opacity:0);
34
+ font-size: 600px;
35
+ cursor: pointer;
36
+ padding: 0;
37
+ margin: 0;
38
+ border: none;
39
+ margin-left: -450px;
40
+ }
41
+
42
+ .file-upload-wrapper {
43
+ position: absolute;
44
+ overflow: hidden;
45
+ z-index: 10000;
46
+ }
47
+
48
+ #image_image_button {
49
+ margin-top: 10px;
50
+ }
@@ -23,6 +23,7 @@ module AdminIt
23
23
  { bucket: AdminIt.config.s3[:bucket] },
24
24
  { acl: 'public-read' },
25
25
  ['starts-with', '$key', 'uploads/'],
26
+ ['starts-with', '$Content-Type', ''],
26
27
  { success_action_status: '201' }
27
28
  ]
28
29
  }.to_json
@@ -1,50 +1,34 @@
1
1
  - for_context ||= context
2
- - id ||= "#{for_context.resource.name}_#{field.name}_fileupload"
3
- /- opts = { name: name || "#{for_context.resource.name}[#{field.name}]", \
4
- / id: , \
5
- / value: value || field.read(for_context.entity) }
6
2
 
7
- form.form-horizontal(
8
- data-sign-url=AdminIt::Engine.routes.url_helpers.signed_url_index_path
9
- data-input="##{for_context.resource.name}_#{field.name}"
10
- enctype="multipart/form-data"
11
- method="POST"
12
- action="https://#{AdminIt.config.s3[:bucket]}.s3.amazonaws.com"
13
- )
14
- input type="hidden" name="key"
15
- input type="hidden" name="AWSAccessKeyId" value=AdminIt.config.s3[:access_key_id]
16
- input type="hidden" name="acl" value="public-read"
17
- input type="hidden" name="policy"
18
- input type="hidden" name="signature"
19
- input type="hidden" name="success_action_status" value="201"
20
- .form-group
21
- - control_width = 'col-sm-12'
22
- - if field.show_label?
23
- label.col-sm-2.control-label for="#{id}"
24
- = field.display_name
25
- - control_width = 'col-sm-10'
26
- div class=control_width
27
- .row.fileupload-image
28
- img src=field.read(for_context.entity)
29
- .row.fileupload-buttonbar
30
- .col-lg-9
31
- .btn-group
32
- span.btn.btn-success.fileinput-button>
33
- i.fa.fa-plus>
34
- span = t('admin_it.image.select')
35
- input type="file" name="file"
36
- /button.btn.btn-primary.start> type="submit"
37
- i.fa.fa-upload>
38
- span = t('admin_it.image.upload')
39
- /button.btn.btn-warning.cancel type="reset"
40
- i.fa.fa-ban>
41
- span = t('admin_it.image.cancel')
42
- /! The global file processing state
43
- span.fileupload-process
44
- /! The global progress state
45
- .col-lg-3.fileupload-progress.fade
46
- /! The global progress bar
47
- .progress.progress-striped.active aria-valuemax="100" aria-valuemin="0" role="progressbar"
48
- .progress-bar.progress-bar-success style="width:0%;"
49
- /! The extended global progress state
50
- .progress-extended &nbsp;
3
+ - name ||= "#{for_context.resource.name}[#{field.name}]"
4
+ - buttonId = "#{for_context.resource.name}_#{field.name}_button"
5
+ - imageId = "#{for_context.resource.name}_#{field.name}_image"
6
+ - value ||= field.read(for_context.entity)
7
+ - upload_url = field.options[:upload_url]
8
+ - unless upload_url.blank?
9
+ - upload_url.gsub!(/:[a-zA-Z][a-zA-Z_0-9]+/) { |n| for_context.entity.send(n[1..-1]) }
10
+ - opts = { name: name, value: value }
11
+ - opts[:id] = id if defined? id
12
+ - opts['data-toggle'] = 'file-upload'
13
+ - opts['data-target'] = "##{buttonId}"
14
+ - opts['data-upload-url'] = field.options[:upload_url] if field.options.key?(:upload_url)
15
+ - opts['data-token-name'] = 'authenticity_token'
16
+ - opts['data-token'] = form_authenticity_token
17
+ - opts['data-delete-url'] = field.options[:delete_url] if field.options.key?(:delete_url)
18
+ - opts['data-image'] = "##{imageId}"
19
+
20
+ - url = field.show(for_context.entity)
21
+ - collapsed = url.blank? ? {} : { class: 'in' }
22
+
23
+ div
24
+ .collapsed *collapsed
25
+ img src=url id=imageId
26
+ .btn-group
27
+ - if opts.key?('data-upload-url')
28
+ .btn.btn-success id=buttonId
29
+ i.fa.fa-upload data-toggle="file-select"
30
+ input type="file" *opts
31
+ - if opts.key?('data-delete-url') && !url.blank?
32
+ .btn.btn-danger
33
+ i.fa.fa-trash-o data-toggle="file-delete"
34
+
@@ -18,7 +18,7 @@
18
18
 
19
19
  / visible fields
20
20
  - fields.each do |field|
21
- - if field.editor == :image
21
+ /- if field.type == :image
22
22
  - locals = { field: field, for_context: for_context, id: "#{for_context.resource.name}_#{field.name}" }
23
23
  = render partial: File.join(%w(admin_it editors hidden)), locals: locals
24
24
  - next
@@ -8,11 +8,6 @@
8
8
  - elsif for_context.is_a?(AdminIt::EditContext)
9
9
  - action = resource.single_path(for_context.entity)
10
10
 
11
- / images
12
- - for_context.fields(scope: { editor: :image }).each do |field|
13
- - locals = { field: field, for_context: for_context }
14
- = render partial: File.join(%w(admin_it editors image)), locals: locals
15
-
16
11
  form.form-horizontal role="form" action=action method="POST"
17
12
  input name="authenticity_token" type="hidden" value=form_authenticity_token
18
13
  input name="section" type="hidden" value=parent.section
@@ -28,6 +28,7 @@ module AdminIt
28
28
  dsl_accessor :type, default: TYPES[0]
29
29
  dsl_accessor :placeholder
30
30
  dsl_accessor :partial
31
+ dsl_accessor :options, default: {}
31
32
  dsl_accessor :editor, default: EDITORS[0]
32
33
  dsl_boolean :readable, :writable, :visible, :sortable, :show_label
33
34
  dsl_block :read, :write, :render, :display
@@ -42,7 +43,7 @@ module AdminIt
42
43
  end
43
44
 
44
45
  class << self
45
- attr_reader :read, :write, :render, :display, :type, :partial
46
+ attr_reader :read, :write, :render, :display, :type, :partial, :options
46
47
 
47
48
  protected
48
49
 
@@ -78,12 +79,17 @@ module AdminIt
78
79
  Class.new(base) do
79
80
  @field_name, @entity_class = name, _entity_class
80
81
  import_data_module(base)
82
+ self.type = opts[:type]
81
83
  @readable = opts[:readable].nil? ? true : opts[:readable] == true
82
84
  @writable = opts[:writable].nil? ? true : opts[:writable] == true
83
85
  @visible = opts[:visible].nil? ? true : opts[:visible] == true
84
86
  @sortable = opts[:sortable].nil? ? true : opts[:sortable] == true
87
+ @options = opts[:options].is_a?(Hash) ? opts[:options] : {}
88
+ if type == :image
89
+ @options[:s3] = {} unless @options[:s3].is_a?(Hash)
90
+ @options[:s3] = {}.merge(AdminIt.config.s3, @options[:s3])
91
+ end
85
92
  @show_label = opts[:show_label].nil? ? true : opts[:show_label] == true
86
- self.type = opts[:type]
87
93
  self.editor = opts[:editor] unless opts[:editor].nil?
88
94
  end
89
95
  end
@@ -104,6 +110,10 @@ module AdminIt
104
110
  @partial ||= nil
105
111
  end
106
112
 
113
+ def self.optionis
114
+ @options ||= {}
115
+ end
116
+
107
117
  def self.hide
108
118
  @visible = false
109
119
  end
@@ -120,10 +130,12 @@ module AdminIt
120
130
  @editor = EDITORS[0]
121
131
  end
122
132
 
123
- class_attr_reader :entity_class, :display_name, :type, :partial, :editor
133
+ class_attr_reader :entity_class, :display_name, :type, :partial, :editor,
134
+ :options
124
135
  attr_writer :visible, :readable, :writable
125
136
 
126
- def initialize(readable: nil, writable: nil, visible: nil, sortable: nil, show_label: nil)
137
+ def initialize(readable: nil, writable: nil, visible: nil, sortable: nil,
138
+ show_label: nil, options: nil)
127
139
  run_callbacks :initialize do
128
140
  @readable = readable.nil? ? self.class.readable? : readable == true
129
141
  @writable = writable.nil? ? self.class.writable? : writable == true
@@ -226,7 +238,7 @@ module AdminIt
226
238
  # end
227
239
 
228
240
  def show_value(entity)
229
- value = read_value(entity)
241
+ value = read(entity)
230
242
  if type == :enum
231
243
  value.text
232
244
  elsif type == :geo_point
@@ -1,5 +1,5 @@
1
1
  #
2
2
  module AdminIt
3
3
  # Current gem version
4
- VERSION = '1.2.8'
4
+ VERSION = '1.3.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: admin_it
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.8
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexey Ovchinnikov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-04 00:00:00.000000000 Z
11
+ date: 2014-07-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -247,6 +247,7 @@ files:
247
247
  - app/assets/fonts/admin_it/glyphicons-halflings-regular.woff
248
248
  - app/assets/javascript/admin_it/admin_it.js
249
249
  - app/assets/javascript/admin_it/bootstrap.min.js
250
+ - app/assets/javascript/admin_it/file_upload.js
250
251
  - app/assets/javascript/admin_it/index.js
251
252
  - app/assets/javascript/admin_it/jquery.fileupload-main.js
252
253
  - app/assets/javascript/admin_it/jquery.fileupload-process.js