Skip to content

Commit a2086c2

Browse files
[MIG] website_sale_address_format: Migration to 18.0
1 parent a89ea1a commit a2086c2

File tree

3 files changed

+96
-84
lines changed

3 files changed

+96
-84
lines changed

website_sale_address_format/__manifest__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
33
{
44
"name": "Website Sale Address Format",
5-
"version": "17.0.1.0.0",
5+
"version": "18.0.1.0.0",
66
"author": "Quartile, Odoo Community Association (OCA)",
77
"website": "https://github.com/OCA/e-commerce",
88
"category": "Website/Website",

website_sale_address_format/controllers/main.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88

99
class WebsiteSale(WebsiteSale):
1010
@http.route()
11-
def country_infos(self, country, mode, **kw):
12-
res = super().country_infos(country, mode, **kw)
11+
def shop_country_info(self, country, address_type, **kw):
12+
res = super().shop_country_info(country, address_type, **kw)
1313
if country.online_address_format:
1414
res["fields"] = country.get_online_address_fields()
1515
return res

website_sale_address_format/static/src/js/website_sale_address_format.esm.js

Lines changed: 93 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1,92 +1,104 @@
1+
/* global Option */
12
/** @odoo-module **/
23

34
import publicWidget from "@web/legacy/js/public/public_widget";
5+
import {rpc} from "@web/core/network/rpc";
46

5-
publicWidget.registry.WebsiteSale.prototype._changeCountry = function () {
6-
if (!$("#country_id").val()) {
7-
return;
8-
}
9-
return this.rpc("/shop/country_infos/" + $("#country_id").val(), {
10-
mode: $("#country_id").attr("mode"),
11-
}).then(function (data) {
12-
// Placeholder phone_code
13-
$("input[name='phone']").attr(
14-
"placeholder",
15-
data.phone_code !== 0 ? "+" + data.phone_code : ""
16-
);
7+
publicWidget.registry.websiteSaleAddress =
8+
publicWidget.registry.websiteSaleAddress.extend({
9+
/**
10+
* @private
11+
*/
12+
async _changeCountry(init = false) {
13+
const countryId = parseInt(this.addressForm.country_id.value);
14+
if (!countryId) {
15+
return;
16+
}
1717

18-
// Populate states and display
19-
var selectStates = $("select[name='state_id']");
20-
// Dont reload state at first loading (done in qweb)
21-
if (
22-
selectStates.data("init") === 0 ||
23-
selectStates.find("option").length === 1
24-
) {
25-
if (data.states.length || data.state_required) {
26-
selectStates.html("");
27-
data.states.forEach((x) => {
28-
var opt = $("<option>")
29-
.text(x[1])
30-
.attr("value", x[0])
31-
.attr("data-code", x[2]);
32-
selectStates.append(opt);
33-
});
34-
selectStates.parent("div").show();
18+
const data = await rpc(`/shop/country_info/${parseInt(countryId)}`, {
19+
address_type: this.addressType,
20+
});
21+
22+
if (data.phone_code !== 0) {
23+
this.addressForm.phone.placeholder = "+" + data.phone_code;
3524
} else {
36-
selectStates.val("").parent("div").hide();
25+
this.addressForm.phone.placeholder = "";
3726
}
38-
selectStates.data("init", 0);
39-
} else {
40-
selectStates.data("init", 0);
41-
}
4227

43-
// Manage fields order / visibility
44-
if (data.fields) {
45-
// [CUSTOM][DEL] Following 5 lines
46-
// if ($.inArray('zip', data.fields) > $.inArray('city', data.fields)){
47-
// $(".div_zip").before($(".div_city"));
48-
// } else {
49-
// $(".div_zip").after($(".div_city"));
50-
// }
51-
// [CUSTOM][ADD] Following 5 lines: sort fields according to
52-
// online_address_format of the country
53-
var previous_field = $(".div_street");
54-
data.fields.forEach((field) => {
55-
previous_field.after($(".div_" + field.split("_")[0]));
56-
previous_field = $(".div_" + field.split("_")[0]);
28+
// Populate states and display
29+
var selectStates = this.addressForm.state_id;
30+
if (!init || selectStates.options.length === 1) {
31+
// Dont reload state at first loading (done in qweb)
32+
if (data.states.length || data.state_required) {
33+
// Empty existing options, only keep the placeholder.
34+
selectStates.options.length = 1;
35+
36+
// Create new options and append them to the select element
37+
data.states.forEach((state) => {
38+
const option = new Option(state[1], state[0]);
39+
// Used by localizations
40+
option.setAttribute("data-code", state[2]);
41+
selectStates.appendChild(option);
42+
});
43+
this._showInput("state_id");
44+
} else {
45+
this._hideInput("state_id");
46+
}
47+
}
48+
49+
// Manage fields order / visibility
50+
if (data.fields) {
51+
// [CUSTOM][DEL] Following 5 lines
52+
// if (data.zip_before_city) {
53+
// this._getInputDiv('zip').after(this._getInputDiv('city'));
54+
// } else {
55+
// this._getInputDiv('zip').before(this._getInputDiv('city'));
56+
// }
57+
// [CUSTOM][ADD] Following 11 lines: sort fields according to
58+
// online_address_format of the country
59+
let prev = this._getInputDiv("street");
60+
for (const fname of data.fields) {
61+
let key = fname.split("_")[0];
62+
if (key === "state") key = "state_id";
63+
if (key === "country") key = "country_id";
64+
const el = this._getInputDiv(key);
65+
if (el) {
66+
prev.after(el);
67+
prev = el;
68+
}
69+
}
70+
// [CUSTOM][DEL] Following line
71+
// var all_fields = ['street', 'zip', 'city'];
72+
// [CUSTOM][ADD] street2 and state_code
73+
var all_fields = ["street", "street2", "zip", "city", "state_code"];
74+
// [EDIT] Following 13 lines
75+
const toInputName = (fname) => {
76+
const key = fname.split("_")[0];
77+
if (key === "state") return "state_id";
78+
return key;
79+
};
80+
all_fields.forEach((fname) => {
81+
const input = toInputName(fname);
82+
if (data.fields.includes(fname)) {
83+
this._showInput(input);
84+
} else {
85+
this._hideInput(input);
86+
}
87+
});
88+
}
89+
90+
const required_fields = this.addressForm.querySelectorAll(":required");
91+
required_fields.forEach((element) => {
92+
// Remove requirement on previously required fields
93+
if (
94+
!data.required_fields.includes(element.name) &&
95+
!this.requiredFields.includes(element.name)
96+
) {
97+
this._markRequired(element.name, false);
98+
}
5799
});
58-
// [CUSTOM][DEL] Following line
59-
// var all_fields = ["street", "zip", "city", "country_name"]; // "state_code"];
60-
// [CUSTOM][ADD] Following line: add street2 and state_code
61-
var all_fields = [
62-
"street",
63-
"street2",
64-
"zip",
65-
"city",
66-
"country_name",
67-
"state_code",
68-
];
69-
all_fields.forEach((field) => {
70-
$(".checkout_autoformat .div_" + field.split("_")[0]).toggle(
71-
$.inArray(field, data.fields) >= 0
72-
);
100+
data.required_fields.forEach((fieldName) => {
101+
this._markRequired(fieldName, true);
73102
});
74-
}
75-
76-
if ($("label[for='zip']").length) {
77-
$("label[for='zip']").toggleClass("label-optional", !data.zip_required);
78-
$("label[for='zip']")
79-
.get(0)
80-
.toggleAttribute("required", Boolean(data.zip_required));
81-
}
82-
if ($("label[for='zip']").length) {
83-
$("label[for='state_id']").toggleClass(
84-
"label-optional",
85-
!data.state_required
86-
);
87-
$("label[for='state_id']")
88-
.get(0)
89-
.toggleAttribute("required", Boolean(data.state_required));
90-
}
103+
},
91104
});
92-
};

0 commit comments

Comments
 (0)