cortex-plugins-core 0.11.3 → 0.12.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: 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