alchemy-solidus 7.2.1 → 7.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -1
- data/app/assets/config/alchemy_solidus/manifest.js +1 -0
- data/app/assets/javascripts/alchemy/solidus/admin/variant_select.js +50 -27
- data/app/components/alchemy/admin/link_dialog/product_tab.rb +57 -0
- data/app/components/alchemy/admin/product_select.rb +44 -0
- data/app/javascript/alchemy_solidus/components/product_select.js +41 -0
- data/app/javascript/alchemy_solidus.js +1 -0
- data/app/views/alchemy/ingredients/_spree_variant_editor.html.erb +21 -1
- data/config/importmap.rb +3 -0
- data/config/initializers/alchemy.rb +1 -0
- data/lib/alchemy/solidus/engine.rb +11 -0
- data/lib/alchemy/solidus/version.rb +1 -1
- metadata +12 -8
- data/app/views/alchemy/admin/pages/_product_link.html.erb +0 -30
- data/app/views/alchemy/admin/pages/_product_link_script.html.erb +0 -47
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 46d8a3b3de7124d7a00825bd35e9f96ca0fe16f13b6d3dbcda7e31cd47367c46
|
4
|
+
data.tar.gz: '09cf18eece796eb7f3439eea4dd76ce60f44d9c268631e47e72d10fa1648cd9d'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b33362b6ed914b1f180346296f4d0a5d62e47e42754bde997649737cd4d440c2a2d9cfdaea9acce67fa935c01db82eb93e0d6e5af1f1ba2afd60a30906f48bc8
|
7
|
+
data.tar.gz: db8d3049d169f31d31843199125781fd42dd72c2109168853f445fe144be62626d3d8ad9b2e1f5472a4e8b0afb378c982298076dcc7d422a4d96a6a4fb613c4a
|
data/README.md
CHANGED
@@ -30,8 +30,9 @@ This version runs with Solidus v4.0 and up.
|
|
30
30
|
|
31
31
|
### Alchemy
|
32
32
|
|
33
|
-
This version runs with Alchemy v7.
|
33
|
+
This version runs with Alchemy v7.2
|
34
34
|
|
35
|
+
- For a Alchemy 7.0/7.1 compatible version please use the `7.2-stable` branch or `7.2` gem version.
|
35
36
|
- For a Alchemy 6.x compatible version please use the `5.0-stable` branch or `5.0` gem version.
|
36
37
|
- For a Alchemy 5.x compatible version please use the `4.1-stable` branch or `4.1` gem version.
|
37
38
|
- For a Alchemy 4.x compatible version please use the `3.1-stable` branch or `3.3` gem version.
|
@@ -0,0 +1 @@
|
|
1
|
+
//= link_tree ../../../javascript .js
|
@@ -1,32 +1,55 @@
|
|
1
1
|
//= require alchemy/solidus/admin/select2_config
|
2
2
|
|
3
|
-
$.fn.alchemyVariantSelect = function(options) {
|
4
|
-
|
3
|
+
$.fn.alchemyVariantSelect = function (options) {
|
4
|
+
const config = Alchemy.Solidus.getSelect2Config(options)
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
6
|
+
function formatSelection(variant) {
|
7
|
+
return variant.options_text
|
8
|
+
? `${variant.name} - ${variant.options_text}`
|
9
|
+
: variant.name
|
10
|
+
}
|
11
|
+
|
12
|
+
function formatResult(variant, _el, query) {
|
13
|
+
const matchTerm = new RegExp(query.term, "gi")
|
14
|
+
const formatMatch = (match) => `<em>${match}</em>`
|
15
|
+
const name = variant.name.replace(matchTerm, formatMatch)
|
16
|
+
const sku = variant.sku.replace(matchTerm, formatMatch)
|
17
|
+
return `
|
18
|
+
<div class="variant-select-result">
|
19
|
+
<div>
|
20
|
+
<span>${name}</span>
|
21
|
+
</div>
|
22
|
+
<div>
|
23
|
+
<span>${variant.options_text}</span>
|
24
|
+
<span>${sku}</span>
|
25
|
+
</div>
|
26
|
+
</div>
|
27
|
+
`
|
28
|
+
}
|
29
|
+
|
30
|
+
this.select2(
|
31
|
+
$.extend(true, config, {
|
32
|
+
ajax: {
|
33
|
+
data: function (term, page) {
|
34
|
+
return {
|
35
|
+
q: $.extend(
|
36
|
+
{
|
37
|
+
product_name_or_sku_cont: term,
|
38
|
+
},
|
39
|
+
options.query_params
|
40
|
+
),
|
41
|
+
page: page,
|
42
|
+
}
|
43
|
+
},
|
44
|
+
results: function (data, page) {
|
45
|
+
return {
|
46
|
+
results: data.variants,
|
47
|
+
more: page * data.per_page < data.total_count,
|
48
|
+
}
|
49
|
+
},
|
15
50
|
},
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
id: variant.id,
|
21
|
-
text: variant.frontend_display
|
22
|
-
}
|
23
|
-
}),
|
24
|
-
more: page * data.per_page < data.total_count
|
25
|
-
}
|
26
|
-
}
|
27
|
-
},
|
28
|
-
formatSelection: function(variant) {
|
29
|
-
return variant.text || variant.frontend_display
|
30
|
-
}
|
31
|
-
}))
|
51
|
+
formatSelection,
|
52
|
+
formatResult,
|
53
|
+
})
|
54
|
+
)
|
32
55
|
}
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Alchemy
|
4
|
+
module Admin
|
5
|
+
module LinkDialog
|
6
|
+
class ProductTab < BaseTab
|
7
|
+
delegate :alchemy, :current_alchemy_user, :spree, to: :helpers
|
8
|
+
|
9
|
+
def self.product_select_class
|
10
|
+
ProductSelect
|
11
|
+
end
|
12
|
+
|
13
|
+
def title
|
14
|
+
Alchemy.t("link_overlay_tab_label.product")
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.panel_name
|
18
|
+
:product
|
19
|
+
end
|
20
|
+
|
21
|
+
def fields
|
22
|
+
[
|
23
|
+
product_select,
|
24
|
+
title_input,
|
25
|
+
target_select
|
26
|
+
]
|
27
|
+
end
|
28
|
+
|
29
|
+
def message
|
30
|
+
render_message(:info, content_tag("h3", Alchemy.t(:choose_product_to_link)))
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def product
|
36
|
+
slug = url&.match(/products\/(?<slug>[\w-]+)/)&.captures
|
37
|
+
return unless slug
|
38
|
+
|
39
|
+
@_product ||= Spree::Product.find_by(slug: slug)
|
40
|
+
end
|
41
|
+
|
42
|
+
def product_select
|
43
|
+
label = label_tag("product_link", Alchemy.t(:product), class: "control-label")
|
44
|
+
input = text_field_tag("product_link", product && url, id: "product_link",
|
45
|
+
placeholder: Alchemy.t(:search_product, scope: "solidus"),
|
46
|
+
class: "alchemy_selectbox")
|
47
|
+
select = render self.class.product_select_class.new(
|
48
|
+
current_alchemy_user.spree_api_key,
|
49
|
+
product: product,
|
50
|
+
url: spree.api_products_path
|
51
|
+
).with_content(input)
|
52
|
+
content_tag("div", label + select, class: "input select")
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Alchemy
|
2
|
+
module Admin
|
3
|
+
class ProductSelect < ViewComponent::Base
|
4
|
+
delegate :spree, to: :helpers
|
5
|
+
|
6
|
+
attr_reader :api_key, :product, :url, :query_params
|
7
|
+
|
8
|
+
def initialize(api_key, product: nil, url: nil, query_params: nil)
|
9
|
+
@api_key = api_key
|
10
|
+
@product = product
|
11
|
+
@url = url
|
12
|
+
@query_params = query_params
|
13
|
+
end
|
14
|
+
|
15
|
+
def call
|
16
|
+
content_tag("alchemy-product-select", content, attributes)
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def attributes
|
22
|
+
attrs = {
|
23
|
+
url: url || spree.api_products_path,
|
24
|
+
"api-key": api_key
|
25
|
+
}
|
26
|
+
|
27
|
+
attrs[:"query-params"] = query_params.to_json if query_params
|
28
|
+
|
29
|
+
if product
|
30
|
+
attrs[:selection] = serialized_selection
|
31
|
+
end
|
32
|
+
|
33
|
+
attrs
|
34
|
+
end
|
35
|
+
|
36
|
+
def serialized_selection
|
37
|
+
{
|
38
|
+
name: product.name,
|
39
|
+
slug: product.slug
|
40
|
+
}.to_json
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
export default class ProductSelect extends HTMLElement {
|
2
|
+
connectedCallback() {
|
3
|
+
const input = this.querySelector("#product_link")
|
4
|
+
input.classList.add("alchemy_selectbox")
|
5
|
+
|
6
|
+
$(input).alchemyProductSelect({
|
7
|
+
baseUrl: this.url,
|
8
|
+
apiToken: this.apiToken,
|
9
|
+
initSelection: this._initSelection.bind(this),
|
10
|
+
formatResultObject: this._formatResult.bind(this),
|
11
|
+
})
|
12
|
+
}
|
13
|
+
|
14
|
+
get url() {
|
15
|
+
return this.getAttribute("url")
|
16
|
+
}
|
17
|
+
|
18
|
+
get apiToken() {
|
19
|
+
return this.getAttribute("api-key")
|
20
|
+
}
|
21
|
+
|
22
|
+
_initSelection(_$el, callback) {
|
23
|
+
const selection = this.getAttribute("selection")
|
24
|
+
const product = JSON.parse(selection)
|
25
|
+
callback(this._formatResult(product))
|
26
|
+
}
|
27
|
+
|
28
|
+
_formatResult(product) {
|
29
|
+
return {
|
30
|
+
id: `${Spree.mountedAt()}products/${product.slug}`,
|
31
|
+
text: product.name,
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
_searchQuery(value) {
|
36
|
+
const slug = value.replace(`${Spree.mountedAt()}products/`, "")
|
37
|
+
return `q[slug_eq]=${slug}`
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
41
|
+
customElements.define("alchemy-product-select", ProductSelect)
|
@@ -0,0 +1 @@
|
|
1
|
+
import "alchemy_solidus/components/product_select"
|
@@ -10,6 +10,25 @@
|
|
10
10
|
<% end %>
|
11
11
|
<% end %>
|
12
12
|
|
13
|
+
<style>
|
14
|
+
.variant-select-result > * {
|
15
|
+
display: flex;
|
16
|
+
justify-content: space-between;
|
17
|
+
min-height: 16px;
|
18
|
+
|
19
|
+
> span {
|
20
|
+
display: inline-block;
|
21
|
+
overflow: hidden;
|
22
|
+
text-overflow: ellipsis;
|
23
|
+
white-space: nowrap;
|
24
|
+
}
|
25
|
+
|
26
|
+
&:last-child {
|
27
|
+
color: hsl(224, 8%, 63%);
|
28
|
+
}
|
29
|
+
}
|
30
|
+
</style>
|
31
|
+
|
13
32
|
<script>
|
14
33
|
$('#<%= spree_variant_editor.form_field_id(:variant_id) %>').alchemyVariantSelect({
|
15
34
|
placeholder: "<%= Alchemy.t(:search_variant, scope: 'solidus') %>",
|
@@ -19,7 +38,8 @@
|
|
19
38
|
<% if spree_variant_editor.variant %>
|
20
39
|
initialSelection: {
|
21
40
|
id: <%= spree_variant_editor.variant.id %>,
|
22
|
-
|
41
|
+
name: "<%= spree_variant_editor.variant.name %>",
|
42
|
+
options_text: "<%= spree_variant_editor.variant.options_text %>"
|
23
43
|
}
|
24
44
|
<% end %>
|
25
45
|
})
|
data/config/importmap.rb
ADDED
@@ -10,6 +10,17 @@ module Alchemy
|
|
10
10
|
include SolidusSupport::EngineExtensions
|
11
11
|
engine_name "alchemy_solidus"
|
12
12
|
|
13
|
+
initializer "alchemy_solidus.assets", before: "alchemy.importmap" do |app|
|
14
|
+
Alchemy.admin_importmaps.add({
|
15
|
+
importmap_path: root.join("config/importmap.rb"),
|
16
|
+
source_paths: [
|
17
|
+
root.join("app/javascript")
|
18
|
+
],
|
19
|
+
name: engine_name
|
20
|
+
})
|
21
|
+
app.config.assets.precompile << "alchemy_solidus/manifest.js"
|
22
|
+
end
|
23
|
+
|
13
24
|
config.to_prepare do
|
14
25
|
Alchemy.register_ability ::Spree::Ability
|
15
26
|
::Spree::Ability.register_ability ::Alchemy::Permissions
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: alchemy-solidus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 7.
|
4
|
+
version: 7.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas von Deyen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-05-
|
11
|
+
date: 2024-05-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: alchemy_cms
|
@@ -16,20 +16,20 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 7.0.
|
19
|
+
version: 7.2.0.rc1
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: '
|
22
|
+
version: '8'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
27
|
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 7.0.
|
29
|
+
version: 7.2.0.rc1
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
32
|
+
version: '8'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: solidus_core
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -240,17 +240,22 @@ files:
|
|
240
240
|
- LICENSE
|
241
241
|
- README.md
|
242
242
|
- Rakefile
|
243
|
+
- app/assets/config/alchemy_solidus/manifest.js
|
243
244
|
- app/assets/javascripts/alchemy/solidus/admin.js
|
244
245
|
- app/assets/javascripts/alchemy/solidus/admin/product_select.js
|
245
246
|
- app/assets/javascripts/alchemy/solidus/admin/select2_config.js
|
246
247
|
- app/assets/javascripts/alchemy/solidus/admin/taxon_select.js
|
247
248
|
- app/assets/javascripts/alchemy/solidus/admin/variant_select.js
|
249
|
+
- app/components/alchemy/admin/link_dialog/product_tab.rb
|
250
|
+
- app/components/alchemy/admin/product_select.rb
|
248
251
|
- app/components/alchemy/ingredients/spree_product_view.rb
|
249
252
|
- app/components/alchemy/ingredients/spree_taxon_view.rb
|
250
253
|
- app/components/alchemy/ingredients/spree_variant_view.rb
|
251
254
|
- app/decorators/models/spree/spree_product_decorator.rb
|
252
255
|
- app/decorators/models/spree/spree_taxon_decorator.rb
|
253
256
|
- app/decorators/models/spree/spree_variant_decorator.rb
|
257
|
+
- app/javascript/alchemy_solidus.js
|
258
|
+
- app/javascript/alchemy_solidus/components/product_select.js
|
254
259
|
- app/models/alchemy/ingredients/spree_product.rb
|
255
260
|
- app/models/alchemy/ingredients/spree_taxon.rb
|
256
261
|
- app/models/alchemy/ingredients/spree_variant.rb
|
@@ -259,8 +264,6 @@ files:
|
|
259
264
|
- app/overrides/alchemy/admin/pages/link/product_link_panel.html.erb.deface
|
260
265
|
- app/overrides/alchemy/admin/pages/link/product_link_sl_tab.html.erb.deface
|
261
266
|
- app/overrides/alchemy/admin/pages/link/product_link_tab.html.erb.deface
|
262
|
-
- app/views/alchemy/admin/pages/_product_link.html.erb
|
263
|
-
- app/views/alchemy/admin/pages/_product_link_script.html.erb
|
264
267
|
- app/views/alchemy/ingredients/_spree_product_editor.html.erb
|
265
268
|
- app/views/alchemy/ingredients/_spree_product_view.html.erb
|
266
269
|
- app/views/alchemy/ingredients/_spree_taxon_editor.html.erb
|
@@ -268,6 +271,7 @@ files:
|
|
268
271
|
- app/views/alchemy/ingredients/_spree_variant_editor.html.erb
|
269
272
|
- app/views/alchemy/ingredients/_spree_variant_view.html.erb
|
270
273
|
- app/views/spree/admin/shared/_alchemy_sub_menu.html.erb
|
274
|
+
- config/importmap.rb
|
271
275
|
- config/initializers/alchemy.rb
|
272
276
|
- config/initializers/spree.rb
|
273
277
|
- config/locales/alchemy_solidus.de.yml
|
@@ -1,30 +0,0 @@
|
|
1
|
-
<form data-link-form-type="product">
|
2
|
-
<%= render_message do %>
|
3
|
-
<h3><%= Alchemy.t(:choose_product_to_link) %></h3>
|
4
|
-
<% end %>
|
5
|
-
<div class="input select">
|
6
|
-
<label for="product_link" class="control-label">
|
7
|
-
<%= Spree::Product.model_name.human %>
|
8
|
-
</label>
|
9
|
-
<input type="text" id="product_link" class="alchemy_selectbox full_width">
|
10
|
-
</div>
|
11
|
-
<div class="input text">
|
12
|
-
<label for="product_link_title" class="control-label">
|
13
|
-
<%= Alchemy.t(:link_title) %>
|
14
|
-
</label>
|
15
|
-
<%= text_field_tag "product_link_title", '', class: 'link_title' %>
|
16
|
-
</div>
|
17
|
-
<div class="input select">
|
18
|
-
<label for="product_link_target" class="control-label">
|
19
|
-
<%= Alchemy.t("Open Link in") %>
|
20
|
-
</label>
|
21
|
-
<%= select_tag 'product_link_target',
|
22
|
-
options_for_select(Alchemy::Page.link_target_options),
|
23
|
-
class: 'alchemy_selectbox link_target' %>
|
24
|
-
</div>
|
25
|
-
<div class="submit">
|
26
|
-
<%= button_tag Alchemy.t(:apply), class: "create-link button", data: { link_type: "product" } %>
|
27
|
-
</div>
|
28
|
-
</form>
|
29
|
-
|
30
|
-
<%= render "product_link_script" %>
|
@@ -1,47 +0,0 @@
|
|
1
|
-
<script>
|
2
|
-
var $tabs = $("#overlay_tabs")
|
3
|
-
|
4
|
-
$tabs.on("SelectLinkTab.Alchemy", function(event, data) {
|
5
|
-
$("#product_link").select2("val", data.link.attr("href"))
|
6
|
-
})
|
7
|
-
$("#product_link").alchemyProductSelect({
|
8
|
-
placeholder: "<%= Alchemy.t(:search_product, scope: "solidus") %>",
|
9
|
-
apiToken: "<%= current_alchemy_user.spree_api_key %>",
|
10
|
-
baseUrl: "<%= spree.api_products_path %>",
|
11
|
-
formatResultObject(product) {
|
12
|
-
return {
|
13
|
-
id: Spree.mountedAt() + "products/"+ product.slug,
|
14
|
-
text: product.name,
|
15
|
-
}
|
16
|
-
},
|
17
|
-
initSelection($element, callback) {
|
18
|
-
var query = $element.val().replace(Spree.mountedAt() + "products/", "")
|
19
|
-
$.ajax({
|
20
|
-
url: "<%= spree.api_products_path %>",
|
21
|
-
data: {
|
22
|
-
q: { slug_eq: query },
|
23
|
-
page: 1,
|
24
|
-
per_page: 1
|
25
|
-
},
|
26
|
-
headers: {
|
27
|
-
Authorization: "Bearer <%= current_alchemy_user.spree_api_key %>"
|
28
|
-
}
|
29
|
-
}).done(function(data) {
|
30
|
-
var product = data.products[0]
|
31
|
-
if (product) {
|
32
|
-
callback({
|
33
|
-
id: Spree.mountedAt() + "products/"+ product.slug,
|
34
|
-
text: product.name
|
35
|
-
})
|
36
|
-
if (typeof $tabs.tabs === "function") {
|
37
|
-
$tabs.tabs("option", "active",
|
38
|
-
$("#overlay_tabs > div").index($("#overlay_tab_product_link"))
|
39
|
-
)
|
40
|
-
} else {
|
41
|
-
$tabs.get(0).show('overlay_tab_product_link')
|
42
|
-
}
|
43
|
-
}
|
44
|
-
})
|
45
|
-
},
|
46
|
-
})
|
47
|
-
</script>
|