cortex-plugins-core 0.11.3 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7068de434d9fee6b2ef6ad1f2f6c2244007e08fc
4
- data.tar.gz: 6966a314dc316278d1dddbf3e436e18b483f0618
3
+ metadata.gz: c35c1578cd56442b0736e815a553c629af9f2dbe
4
+ data.tar.gz: 31e2be2b8f198d8a78087358b60eda6c415f896c
5
5
  SHA512:
6
- metadata.gz: 1ab447acdba67319925c3fea71f7cf49f2ad8bd66f4883931ead8038aeb861e9117c9d1ec2c606a68afbce00750710241037f592e98f2da5010111851295ec6b
7
- data.tar.gz: 70874600f36ea72dd864570c0be38536e2eb80ad3f934e468e631fc91d7eee5bee034587ea5d0990a58887bb4e94470b198c0deb5952db42e33402a71f053ec1
6
+ metadata.gz: 9e25db2a2bee5e1d941b584caa8348d83f6e62928de4d756b52bf882708d4ad3df00c4ff5be28353b07d83657f547dccaea201886ff45c71136cd6680a20360a
7
+ data.tar.gz: 7ea0cf777de1062eea373f744393dccde7e9b05db7e1733383981d4bd5419a3d572f4b58f42d4e76962f2fd2cc297bc9fe273afe0342c0ba130464296539991b
@@ -0,0 +1,5 @@
1
+ // TODO: These two files should be removed once we abstract Cortex styles to a cortex-style-base lib
2
+ @import 'variables/colors';
3
+ @import 'variables/typography';
4
+
5
+ @import 'components/thumbnail-placeholder';
@@ -0,0 +1,13 @@
1
+ .thumbnail-placeholder {
2
+ background-color: $color-grey-evenlighter;
3
+ display: flex;
4
+ height: 50px;
5
+ width: 50px;
6
+
7
+ .h4 {
8
+ text-transform: uppercase;
9
+ align-self: center;
10
+ text-align: center;
11
+ width: 100%;
12
+ }
13
+ }
@@ -0,0 +1,47 @@
1
+ // Color Definitions
2
+
3
+ $color-teal: #63C0B9;
4
+ $color-teal-dark: #54A1A1;
5
+ $color-teal-light: #A1D9D5;
6
+
7
+ $color-orange: #F79C25;
8
+ $color-orange-dark: #E78523;
9
+ $color-orange-light: #FED473;
10
+
11
+ $color-anchor-blue-light: #747D8E;
12
+
13
+ $color-green: #009b74;
14
+
15
+ $color-slate-grey: #6E788F;
16
+ $color-grey: #BBB; // Type
17
+ $color-grey-dark: #333; // Type, Sidebar background, Login page background
18
+ $color-grey-light: #D4D4D4; // Content background color
19
+ $color-grey-lightest: #DDD; // Disabled and flat button background color
20
+ $color-grey-evenlighter: #E4E4E4;
21
+ $color-grey-reallylight: #F2F2F2;
22
+ $color-grey-extralight: #F4F4F4; // Wizard Instruction Panel background color
23
+
24
+ $color-red: #d85252;
25
+
26
+ $color-white: white; // Header
27
+ $color-black: #000000;
28
+
29
+
30
+ // Color Semantics
31
+
32
+ $employer-color: $color-teal;
33
+ $employer-color-dark: $color-teal-dark;
34
+ $employer-color-light: $color-teal-light;
35
+
36
+ $flash-error-background: $color-red;
37
+ $flash-success-background: $color-green;
38
+
39
+ $ar-color: $color-orange;
40
+ $ar-color-dark: $color-orange-dark;
41
+ $ar-color-light: $color-orange-light;
42
+
43
+ $notes-text: #6E788F;
44
+
45
+ $jumbo-button-text: #6E788F;
46
+ $jumbo-button-hover-background: $color-grey-evenlighter;
47
+ $jumbo-button-active-background: $color-grey-reallylight;
@@ -0,0 +1,114 @@
1
+ @font-face {
2
+ font-family: Montserrat;
3
+ font-style: normal;
4
+ font-weight: normal;
5
+ src: url(asset_path('Montserrat-Regular.otf')) format("opentype");
6
+ }
7
+
8
+ @font-face {
9
+ font-family: Montserrat;
10
+ font-style: normal;
11
+ font-weight: bold;
12
+ src: url(asset_path('Montserrat-Medium.otf')) format("opentype");
13
+ }
14
+
15
+ @font-face {
16
+ font-family: Montserrat;
17
+ font-style: normal;
18
+ font-weight: bolder;
19
+ src: url(asset_path('Montserrat-SemiBold.otf')) format("opentype");
20
+ }
21
+
22
+ @font-face {
23
+ font-family: Montserrat;
24
+ font-style: normal;
25
+ font-weight: lighter;
26
+ src: url(asset_path('Montserrat-Light.otf')) format("opentype");
27
+ }
28
+
29
+ $cortex-font-stack: Montserrat, sans-serif;
30
+ $base-font-size: 1rem;
31
+
32
+ %display-text { // Cortex Logo
33
+ color: $color-grey-dark;
34
+ font-family: $cortex-font-stack;
35
+ font-weight: normal;
36
+ font-size: 2.1775rem;
37
+ }
38
+
39
+ h1, h2, h3, h4, h5, h6 {
40
+ line-height: 1.5;
41
+ }
42
+
43
+ h1,
44
+ .text-style-1 { // Bread Crumbs and Page Headers
45
+ color: $color-teal;
46
+ font-family: $cortex-font-stack;
47
+ font-weight: bold;
48
+ font-size: 1.17rem;
49
+ text-decoration: none;
50
+ }
51
+
52
+ h2,
53
+ .text-style-2 {
54
+ color: $color-grey;
55
+ font-family: $cortex-font-stack;
56
+ font-weight: lighter;
57
+ font-size: 1.17rem;
58
+ }
59
+
60
+ h3,
61
+ .text-style-3 {
62
+ color: $color-grey;
63
+ font-family: $cortex-font-stack;
64
+ font-weight: bold;
65
+ font-size: 1.17rem;
66
+ }
67
+
68
+ h4,
69
+ .text-style-4 { // Section Headers, Dropdowns, Button Text
70
+ color: $color-grey-dark;
71
+ font-family: $cortex-font-stack;
72
+ font-size: 0.83rem;
73
+ }
74
+
75
+ h5,
76
+ .text-style-5 { // Field Text
77
+ color: $color-grey;
78
+ font-family: $cortex-font-stack;
79
+ font-weight: lighter;
80
+ font-size: $base-font-size;
81
+ }
82
+
83
+ h6,
84
+ .text-style-6 { // Field Text Filled
85
+ color: $color-anchor-blue-light;
86
+ font-family: $cortex-font-stack;
87
+ font-size: $base-font-size;
88
+ }
89
+
90
+ .text-style-7 { // Help Notes
91
+ color: $color-anchor-blue-light;
92
+ font-family: $cortex-font-stack;
93
+ font-weight: lighter;
94
+ font-size: 0.67rem;
95
+ }
96
+
97
+ %sidebar-nav { // Side Nav
98
+ color: $color-grey;
99
+ font-family: $cortex-font-stack;
100
+ font-weight: lighter;
101
+ font-size: 0.875rem;
102
+ text-transform: uppercase;
103
+
104
+ &.active { // Side Nav Selected
105
+ font-weight: bold;
106
+ color: $color-teal;
107
+ }
108
+ }
109
+
110
+ p {
111
+ color: $color-anchor-blue-light;
112
+ font-family: $cortex-font-stack;
113
+ font-size: $base-font-size;
114
+ }
@@ -19,8 +19,12 @@ module Plugins
19
19
  field.validations['allowed_extensions']&.join(', ')
20
20
  end
21
21
 
22
+ def allowed_asset_extensions_for_form
23
+ '.' + field.validations['allowed_extensions']&.join(',.')
24
+ end
25
+
22
26
  def render_max_asset_size
23
- number_to_human_size(field.validations['size']&.[]('less_than'))
27
+ number_to_human_size(field.validations['max_size'])
24
28
  end
25
29
 
26
30
  def input_classes
@@ -36,7 +40,7 @@ module Plugins
36
40
  end
37
41
 
38
42
  def render_input
39
- @options[:form].file_field 'data[asset]'
43
+ @options[:form].file_field 'data[asset]', accept: allowed_asset_extensions_for_form
40
44
  end
41
45
 
42
46
  def render_tooltip
@@ -44,7 +48,8 @@ module Plugins
44
48
  end
45
49
 
46
50
  def associated_content_item_thumb_url
47
- data['asset']['style_urls']['mini']
51
+ # TODO: The thumb version needs to be configurable
52
+ data['asset']['versions']['mini']['url']
48
53
  end
49
54
 
50
55
  def render_associated_content_item_thumb
@@ -1,2 +1,6 @@
1
- - if asset
2
- = image_tag(asset['style_urls'][config[:thumbnail_style]], height: '50px')
1
+ - if asset && asset['versions'][config[:thumbnail_style]]
2
+ = image_tag(asset['versions'][config[:thumbnail_style]]['url'], height: '50px')
3
+ - else
4
+ .thumbnail-placeholder
5
+ .h4
6
+ = asset['versions']['original']['extension']
@@ -4,24 +4,26 @@
4
4
  new Clipboard('#copy-asset-url');
5
5
  });
6
6
 
7
- .asset-info.mdl-card.mdl-shadow--2dp
8
- .mdl-card__title
9
- %h2.mdl-card__title-text
10
- = image_tag(asset['url'], style: 'max-height: 200px;')
7
+ .asset-info.mdl-card
8
+ - if asset_is_image?
9
+ .mdl-card__title
10
+ %h2.mdl-card__title-text
11
+ = image_tag(asset['versions']['original']['url'], style: 'max-height: 200px;')
11
12
  .mdl-card__supporting-text
12
13
  %dl
13
14
  %dt Original Filename
14
15
  %dd
15
- = asset['file_name']
16
- %dt File Type
16
+ = asset['original_filename']
17
+ %dt Original File Type
17
18
  %dd
18
- = asset['content_type']
19
- %dt File Size
19
+ = asset['versions']['original']['mime_type']
20
+ %dt Original File Size
20
21
  %dd
21
- = number_to_human_size(asset['file_size'])
22
- %dt Dimensions
23
- %dd
24
- = dimensions
22
+ = number_to_human_size(asset['versions']['original']['file_size'])
23
+ - if asset_is_image?
24
+ %dt Original Dimensions
25
+ %dd
26
+ = dimensions
25
27
  %dt Creator
26
28
  %dd
27
29
  = creator.fullname
@@ -35,7 +37,7 @@
35
37
  %dd
36
38
  = link_to_asset
37
39
  .mdl-card__menu
38
- .mdl-button.mdl-button--icon.mdl-js-button.mdl-js-ripple-effect#copy-asset-url{data: {'clipboard-text': asset['url']}}
40
+ .mdl-button.mdl-button--icon.mdl-js-button.mdl-js-ripple-effect#copy-asset-url{data: {'clipboard-text': asset['versions']['original']['url']}}
39
41
  %i.material-icons content_copy
40
42
  .mdl-tooltip{for: 'copy-asset-url'}
41
43
  Copy Asset URL
@@ -25,7 +25,7 @@ module Plugins
25
25
  end
26
26
 
27
27
  def dimensions
28
- "#{asset['dimensions']['width']} x #{asset['dimensions']['width']}"
28
+ "#{asset['versions']['original']['dimensions']['width']} x #{asset['versions']['original']['dimensions']['width']}"
29
29
  end
30
30
 
31
31
  def creator
@@ -37,11 +37,19 @@ module Plugins
37
37
  end
38
38
 
39
39
  def updated_at
40
- DateTime.parse(asset['updated_at']).to_formatted_s(:long_ordinal)
40
+ content_item.updated_at.to_formatted_s(:long_ordinal)
41
41
  end
42
42
 
43
43
  def link_to_asset
44
- link_to asset['url'], asset['url'], target: '_blank'
44
+ link_to asset['versions']['original']['url'], asset['versions']['original']['url'], target: '_blank'
45
+ end
46
+
47
+ def asset_type
48
+ MimeMagic.new(asset['versions']['original']['mime_type']).mediatype
49
+ end
50
+
51
+ def asset_is_image?
52
+ asset_type == 'image'
45
53
  end
46
54
  end
47
55
  end
@@ -1,139 +1,124 @@
1
+ require 'shrine/storage/s3'
2
+
1
3
  class AssetFieldType < FieldType
2
- attr_accessor :asset_file_name,
3
- :asset_content_type,
4
- :asset_file_size,
5
- :asset_updated_at,
6
- :asset
7
-
8
- attr_reader :dimensions,
9
- :existing_data
10
-
11
- before_save :extract_dimensions
12
-
13
- do_not_validate_attachment_file_type :asset
14
- validates :asset, attachment_presence: true, if: :validate_presence?
15
- validate :validate_asset_size, if: :validate_size?
16
- validate :validate_asset_content_type, if: :validate_content_type?
17
-
18
- def metadata=(metadata_hash)
19
- @metadata = metadata_hash.deep_symbolize_keys
20
- @existing_data = metadata_hash[:existing_data]
21
- Paperclip::HasAttachedFile.define_on(self.class, :asset, existing_metadata)
22
- end
4
+ attr_reader :asset
5
+ attr_accessor :asset_data
6
+
7
+ before_save :promote
8
+
9
+ validate :asset_presence, if: :validate_presence?
10
+ validate :asset_errors
23
11
 
24
12
  def data=(data_hash)
25
- self.asset = data_hash.deep_symbolize_keys[:asset]
13
+ assign data_hash['asset'] if data_hash['asset']
14
+ @asset = attacher.get
26
15
  end
27
16
 
28
17
  def data
18
+ return {} if errors.any? || attacher.errors.any?
29
19
  {
30
- 'asset': {
31
- 'file_name': asset_file_name,
32
- 'url': asset.url,
33
- 'style_urls': style_urls,
34
- 'dimensions': dimensions,
35
- 'content_type': asset_content_type,
36
- 'file_size': asset_file_size,
37
- 'updated_at': asset_updated_at
20
+ asset: {
21
+ original_filename: @original_filename,
22
+ # TODO: updated_at: asset.updated_at, -- Does Shrine give this to us? Potentially distinct from record's updated_at
23
+ versions: versions_data
38
24
  },
39
- 'media_title': media_title,
40
- 'asset_field_type_id': id
25
+ shrine_asset: asset.to_json
41
26
  }
42
27
  end
43
28
 
44
29
  def field_item_as_indexed_json_for_field_type(field_item, options = {})
45
30
  json = {}
46
- json[mapping_field_name] = asset_file_name
31
+ json[mapping_field_name] = field_item.data['asset']['original_filename']
47
32
  json
48
33
  end
49
34
 
50
35
  def mapping
51
- {name: mapping_field_name, type: :string, analyzer: :keyword}
36
+ { name: mapping_field_name, type: :string, analyzer: :keyword }
52
37
  end
53
38
 
54
39
  private
55
40
 
56
41
  def image?
57
- asset_content_type =~ %r{^(image|(x-)?application)/(bmp|gif|jpeg|jpg|pjpeg|png|x-png)$}
42
+ MimeMagic.new(asset.mime_type).mediatype == 'image'
58
43
  end
59
44
 
60
- def extract_dimensions
61
- return unless image?
62
- tempfile = asset.queued_for_write[:original]
63
- unless tempfile.nil?
64
- geometry = Paperclip::Geometry.from_file(tempfile)
65
- @dimensions = {
66
- width: geometry.width.to_i,
67
- height: geometry.height.to_i
68
- }
69
- end
45
+ def mapping_field_name
46
+ "#{field_name.parameterize('_')}_asset_file_name"
70
47
  end
71
48
 
72
- def allowed_content_types
73
- validations[:allowed_extensions].collect do |allowed_content_type|
74
- MimeMagic.by_extension(allowed_content_type).type
75
- end
49
+ def promote
50
+ @asset = attacher.promote action: :store unless asset.is_a?(Hash)
76
51
  end
77
52
 
78
- def media_title
79
- existing_data['media_title'] || ContentItemService.form_fields[@metadata[:naming_data][:title]][:text].parameterize.underscore
80
- end
53
+ def assign(attachment)
54
+ @original_filename = attachment.original_filename
81
55
 
82
- def mapping_field_name
83
- "#{field_name.parameterize('_')}_asset_file_name"
56
+ attachment.open
57
+ begin
58
+ attacher.assign attachment
59
+ ensure
60
+ attachment.close
61
+ end
84
62
  end
85
63
 
86
- def validate_presence?
87
- validations.key? :presence
64
+ def store
65
+ case metadata[:storage][:type]
66
+ when 's3'
67
+ Shrine::Storage::S3.new(metadata[:storage][:config]) # TODO: Encrypt credentials?
68
+ when 'file_system'
69
+ Shrine::Storage::FileSystem.new(metadata[:storage][:config])
70
+ else
71
+ AssetUploader.storages[:store]
72
+ end
88
73
  end
89
74
 
90
- def attachment_size_validator
91
- AttachmentSizeValidator.new(validations[:size].merge(attributes: :asset))
92
- end
75
+ def attacher
76
+ unless @attacher
77
+ AssetUploader.storages[:store_copy] = store # this may not be thread safe, but no other way to do this right now
78
+ AssetUploader.opts[:keep_files] = metadata[:keep_files] # this may not be thread safe, but no other way to do this right now
79
+ @attacher = AssetUploader::Attacher.new self, :asset, store: :store_copy
80
+ @attacher.context[:config] = {
81
+ original_filename: @original_filename,
82
+ metadata: metadata,
83
+ validations: validations
84
+ }
85
+ end
93
86
 
94
- def attachment_content_type_validator
95
- AttachmentContentTypeValidator.new({content_type: allowed_content_types}.merge(attributes: :asset))
87
+ @attacher
96
88
  end
97
89
 
98
- alias_method :valid_presence_validation?, :validate_presence?
99
-
100
- def validate_size?
101
- begin
102
- attachment_size_validator
103
- true
104
- rescue ArgumentError, NoMethodError
105
- false
106
- end
90
+ def host_alias
91
+ metadata[:storage][:host_alias] unless metadata[:storage][:host_alias].empty?
107
92
  end
108
93
 
109
- def validate_content_type?
110
- begin
111
- attachment_content_type_validator
112
- true
113
- rescue ArgumentError, NoMethodError
114
- false
94
+ def versions_data
95
+ asset.transform_values do |version|
96
+ {
97
+ id: version.id,
98
+ filename: version.metadata['filename'],
99
+ extension: version.extension,
100
+ mime_type: version.mime_type,
101
+ url: version.url(public: true, host: host_alias),
102
+ file_size: version.size,
103
+ dimensions: {
104
+ width: version.width,
105
+ height: version.height
106
+ }
107
+ }
115
108
  end
116
109
  end
117
110
 
118
- def validate_asset_size
119
- attachment_size_validator.validate_each(self, :asset, asset)
111
+ def validate_presence?
112
+ validations.key? :presence
120
113
  end
121
114
 
122
- def validate_asset_content_type
123
- attachment_content_type_validator.validate_each(self, :asset, asset)
115
+ def asset_presence
116
+ errors.add(:asset, 'must be present') unless asset
124
117
  end
125
118
 
126
- def style_urls
127
- if existing_data.empty?
128
- (metadata[:styles].map { |key, value| [key, asset.url(key)] }).to_h
129
- else
130
- existing_data.deep_symbolize_keys[:asset][:style_urls]
119
+ def asset_errors
120
+ attacher.errors.each do |message|
121
+ errors.add(:asset, message)
131
122
  end
132
123
  end
133
-
134
- def existing_metadata
135
- metadata.except!(:existing_data)
136
- metadata[:path].gsub!(":media_title", media_title) if metadata[:path]
137
- metadata
138
- end
139
124
  end
@@ -26,16 +26,13 @@ class TextFieldType < FieldType
26
26
  "#{field_name.parameterize('_')}_text"
27
27
  end
28
28
 
29
- def text_present
30
- errors.add(:text, 'must be present') if @text.empty?
31
- end
32
-
33
29
  def text_length
34
30
  validator = LengthValidator.new(validations[:length].merge(attributes: [:text]))
35
31
  validator.validate_each(self, :text, text)
36
32
  end
37
33
 
38
34
  def text_unique
35
+ # TODO: This breaks when you try to update existing text
39
36
  unless metadata[:existing_data][:text] == text || field.field_items.jsonb_contains(:data, text: text).empty?
40
37
  errors.add(:text, "#{field.name} Must be unique")
41
38
  end
@@ -0,0 +1,55 @@
1
+ require 'image_processing/mini_magick'
2
+
3
+ class AssetUploader < Shrine
4
+ include ImageProcessing::MiniMagick
5
+
6
+ plugin :determine_mime_type
7
+ plugin :store_dimensions
8
+ plugin :validation_helpers
9
+ plugin :cortex_validation_helpers
10
+ plugin :processing
11
+ plugin :versions
12
+ plugin :keep_files, destroyed: true, replaced: true
13
+
14
+ Attacher.validate do
15
+ validate_mime_type_inclusion allowed_content_types if validate? :allowed_extensions
16
+ validate_max_size validations[:max_size] if validate? :max_size
17
+ validate_min_size validations[:min_size] if validate? :min_size
18
+
19
+ if store.image?(get)
20
+ validate_max_width validations[:max_width] if validate? :max_width
21
+ validate_max_height validations[:max_height] if validate? :max_height
22
+ validate_min_width validations[:min_width] if validate? :min_width
23
+ validate_min_height validations[:min_height] if validate? :min_height
24
+ end
25
+ end
26
+
27
+ process(:store) do |io, context|
28
+ # TODO: Perform image optimizations (build plugin), support versions without processors or formatters
29
+ context[:generated_hex] = SecureRandom.hex(8)
30
+ versions = { original: io.download }
31
+
32
+ if image?(io)
33
+ versions.merge!(context[:config][:metadata][:versions].transform_values do |version|
34
+ processed_version = send("#{version[:process][:method]}!", io.download, *version[:process][:config].values)
35
+ convert!(processed_version, version[:format])
36
+ end)
37
+ end
38
+
39
+ versions
40
+ end
41
+
42
+ def generate_location(io, context)
43
+ attachment = :asset
44
+ style = context[:version] || :original
45
+ original_name, _dot, original_extension = context[:config][:original_filename].rpartition('.')
46
+ generated_name, _dot, extension = super.rpartition('.')
47
+ generated_hex = context[:generated_hex]
48
+
49
+ ERB.new(context[:config][:metadata][:path]).result(binding)
50
+ end
51
+
52
+ def image?(io)
53
+ MimeMagic.new(io.data['metadata']['mime_type']).mediatype == 'image'
54
+ end
55
+ end
@@ -0,0 +1,9 @@
1
+ require 'shrine'
2
+ require 'shrine/storage/file_system'
3
+
4
+ Shrine.storages = {
5
+ cache: Shrine::Storage::FileSystem.new('public', prefix: 'uploads/cache'),
6
+ store: Shrine::Storage::FileSystem.new('public', prefix: 'uploads/store')
7
+ }
8
+
9
+ Shrine.plugin :logging, logger: Rails.logger
@@ -1,7 +1,7 @@
1
1
  module Cortex
2
2
  module Plugins
3
3
  module Core
4
- VERSION = '0.11.3'
4
+ VERSION = '0.12.0'
5
5
  end
6
6
  end
7
7
  end
@@ -0,0 +1,23 @@
1
+ class Shrine
2
+ module Plugins
3
+ module CortexValidationHelpers
4
+ module AttacherMethods
5
+ def validations
6
+ context[:config][:validations]
7
+ end
8
+
9
+ def validate?(validation)
10
+ validations.key? validation
11
+ end
12
+
13
+ def allowed_content_types
14
+ validations[:allowed_extensions].collect do |allowed_content_type|
15
+ MimeMagic.by_extension(allowed_content_type).type
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ register_plugin(:cortex_validation_helpers, CortexValidationHelpers)
22
+ end
23
+ end
@@ -18,34 +18,43 @@ namespace :cortex do
18
18
  puts "Creating Fields..."
19
19
 
20
20
  allowed_asset_content_types = %w(txt css js pdf doc docx ppt pptx csv xls xlsx svg ico png jpg gif bmp)
21
- fieldTitle = media.fields.new(name: 'Title', field_type: 'text_field_type', validations: {presence: true, uniqueness: true})
21
+ fieldTitle = media.fields.new(name: 'Title', field_type: 'text_field_type', validations: { presence: true, uniqueness: true })
22
22
  fieldTitle.save
23
23
  media.fields.new(name: 'Asset', field_type: 'asset_field_type',
24
24
  validations:
25
25
  {
26
26
  presence: true,
27
27
  allowed_extensions: allowed_asset_content_types,
28
- size: {
29
- less_than: 50.megabytes
30
- }
28
+ max_size: 50.megabytes
31
29
  },
32
30
  metadata:
33
31
  {
34
32
  naming_data: {
35
33
  title: fieldTitle.id
36
34
  },
37
- styles: {
38
- large: {geometry: '1800x1800>', format: :jpg},
39
- medium: {geometry: '800x800>', format: :jpg},
40
- default: {geometry: '300x300>', format: :jpg},
41
- mini: {geometry: '100x100>', format: :jpg},
42
- micro: {geometry: '50x50>', format: :jpg},
43
- post_tile: {geometry: '1140x', format: :jpg}
35
+ versions: {
36
+ large: { process: { method: 'resize_to_limit', config: { width: '1800', height: '1800' } }, format: :jpg },
37
+ medium: { process: { method: 'resize_to_limit', config: { width: '800', height: '800' } }, format: :jpg },
38
+ default: { process: { method: 'resize_to_limit', config: { width: '300', height: '300' } }, format: :jpg },
39
+ mini: { process: { method: 'resize_to_limit', config: { width: '100', height: '100' } }, format: :jpg },
40
+ micro: { process: { method: 'resize_to_limit', config: { width: '50', height: '50' } }, format: :jpg },
44
41
  },
45
- processors: [:thumbnail, :paperclip_optimizer],
46
- preserve_files: true,
47
- path: ':class/:attachment/:media_title-:style.:extension',
48
- s3_headers: {'Cache-Control': 'public, max-age=315576000'}
42
+ keep_files: [:destroyed, :replaced],
43
+ path: '<%= attachment %>/<%= original_name %>-<%= style %>-<%= generated_hex %>.<%= extension %>',
44
+ storage: {
45
+ type: 's3',
46
+ host_alias: ENV['HOST_ALIAS'],
47
+ config: {
48
+ access_key_id: ENV['S3_ACCESS_KEY_ID'],
49
+ secret_access_key: ENV['S3_SECRET_ACCESS_KEY'],
50
+ region: ENV['S3_REGION'],
51
+ bucket: ENV['S3_BUCKET_NAME'],
52
+ upload_options: {
53
+ acl: 'public-read',
54
+ cache_control: 'public, max-age=315576000'
55
+ }
56
+ }
57
+ }
49
58
  })
50
59
  media.fields.new(name: 'Description', field_type: 'text_field_type', validations: {presence: true})
51
60
  media.fields.new(name: 'Tags', field_type: 'tag_field_type')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cortex-plugins-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.3
4
+ version: 0.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - CareerBuilder Employer Site & Content Products
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-04-25 00:00:00.000000000 Z
11
+ date: 2017-04-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '6'
33
+ version: '6.10'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '6'
40
+ version: '6.10'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: cells
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -58,56 +58,112 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 0.0.6
61
+ version: '0.0'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 0.0.6
68
+ version: '0.0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: cells-haml
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 0.0.10
75
+ version: '0.0'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 0.0.10
82
+ version: '0.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: jsonb_accessor
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 1.0.0.beta
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 1.0.0.beta
97
+ - !ruby/object:Gem::Dependency
98
+ name: shrine
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2.6'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '2.6'
83
111
  - !ruby/object:Gem::Dependency
84
112
  name: mimemagic
85
113
  requirement: !ruby/object:Gem::Requirement
86
114
  requirements:
87
115
  - - "~>"
88
116
  - !ruby/object:Gem::Version
89
- version: 0.3.2
117
+ version: '0.3'
90
118
  type: :runtime
91
119
  prerelease: false
92
120
  version_requirements: !ruby/object:Gem::Requirement
93
121
  requirements:
94
122
  - - "~>"
95
123
  - !ruby/object:Gem::Version
96
- version: 0.3.2
124
+ version: '0.3'
97
125
  - !ruby/object:Gem::Dependency
98
- name: jsonb_accessor
126
+ name: image_processing
99
127
  requirement: !ruby/object:Gem::Requirement
100
128
  requirements:
101
129
  - - "~>"
102
130
  - !ruby/object:Gem::Version
103
- version: 1.0.0.beta
131
+ version: '0.4'
104
132
  type: :runtime
105
133
  prerelease: false
106
134
  version_requirements: !ruby/object:Gem::Requirement
107
135
  requirements:
108
136
  - - "~>"
109
137
  - !ruby/object:Gem::Version
110
- version: 1.0.0.beta
138
+ version: '0.4'
139
+ - !ruby/object:Gem::Dependency
140
+ name: mini_magick
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '4.7'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '4.7'
153
+ - !ruby/object:Gem::Dependency
154
+ name: fastimage
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '2.1'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '2.1'
111
167
  description:
112
168
  email:
113
169
  - EmployerSiteContentProducts@cb.com
@@ -124,6 +180,10 @@ files:
124
180
  - app/assets/javascripts/cortex-plugins-core/application.js
125
181
  - app/assets/javascripts/cortex-plugins-core/cells/content_item.js
126
182
  - app/assets/javascripts/cortex-plugins-core/cells/text.js
183
+ - app/assets/stylesheets/cortex-plugins-core/application.scss
184
+ - app/assets/stylesheets/cortex-plugins-core/components/thumbnail-placeholder.scss
185
+ - app/assets/stylesheets/cortex-plugins-core/variables/_colors.scss
186
+ - app/assets/stylesheets/cortex-plugins-core/variables/_typography.scss
127
187
  - app/cells/plugins/core/asset/association.haml
128
188
  - app/cells/plugins/core/asset/input.haml
129
189
  - app/cells/plugins/core/asset_cell.rb
@@ -172,14 +232,15 @@ files:
172
232
  - app/models/text_field_type.rb
173
233
  - app/models/tree_field_type.rb
174
234
  - app/models/user_field_type.rb
235
+ - app/uploaders/asset_uploader.rb
175
236
  - config/initializers/react_on_rails.rb
237
+ - config/initializers/shrine.rb
176
238
  - lib/cortex/plugins/core.rb
177
239
  - lib/cortex/plugins/core/engine.rb
178
240
  - lib/cortex/plugins/core/version.rb
241
+ - lib/shrine/plugins/cortex_validation_helpers.rb
179
242
  - lib/tasks/cortex/core/db.rake
180
243
  - lib/tasks/cortex/core/media.rake
181
- - lib/tasks/cortex/test/dummy/db/development.sqlite3
182
- - lib/tasks/cortex/test/dummy/db/test.sqlite3
183
244
  homepage: https://github.com/cortex-cms/cortex-plugins-core
184
245
  licenses:
185
246
  - Apache-2.0
@@ -200,7 +261,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
200
261
  version: '0'
201
262
  requirements: []
202
263
  rubyforge_project:
203
- rubygems_version: 2.6.8
264
+ rubygems_version: 2.6.11
204
265
  signing_key:
205
266
  specification_version: 4
206
267
  summary: The combined set of Core FieldTypes for the Cortex CMS platform
File without changes
File without changes