I want to add a date picker field into the checkout page but I have no idea where to start.
I have tried this Add date picker in checkout page but it's not working for me.
We are having the below folder structure:
app\code\siva\mymodule\view\frontend\web\template\shipping.html
In shipping.html, we have the form which needs to be shown on the frontend.
Now, can I add both the HTML input field and JS in the same file, shipping.html?
If anyone got the delivery date field works in Checkout, please help me with this.
Updated Code in shipping-mixin.js:
define([
'jquery',
'underscore',
'Magento_Ui/js/form/form',
'ko',
'Magento_Customer/js/model/customer',
'Magento_Customer/js/model/address-list',
'Magento_Checkout/js/model/address-converter',
'Magento_Checkout/js/model/quote',
'Magento_Checkout/js/action/create-shipping-address',
'Magento_Checkout/js/action/select-shipping-address',
'Magento_Checkout/js/action/create-billing-address',
'Magento_Checkout/js/action/select-billing-address',
'Magento_Checkout/js/action/set-shipping-information',
'Magento_Checkout/js/model/step-navigator',
'Magento_Checkout/js/checkout-data',
'mage/translate'
], function(
$,
_,
Component,
ko,
customer,
addressList,
addressConverter,
quote,
createShippingAddress,
selectShippingAddress,
createBillingAddress,
selectBillingAddress,
setShippingInformationAction,
stepNavigator,
checkoutData,
$t
) {
'use strict';
$('#conform-account-scola-btn').prop('disabled', false);
$('#onepage-guest-register-button').prop('disabled', false);
$('#loa').hide();
return function (target) {
return target.extend({
defaults: {
template: 'DCKAP_School/shipping'
},
setShippingInformation: function () {
var flag=false;
var count = 0;
var scrollTo = '';
if($('input[name=school-or-private-person]').val() == 'school'){
$(".school-required-entry").each(function() {
if (this.value == 0 || this.value == '') {
count++;
//$(this).next('.school_err').html("This is a required field.");
$(this).next('.school_err').html("Vänligen fyll i detta obligatoriska fält.");
$(this)[0].style.borderColor = "#ed8380";
$(this).next('.school_err').css("display", "block");
if(count==1){
scrollTo = "#"+$(this).attr('id');
}
flag=true;
}else{
$(this).next('.school_err').html('');
$(this)[0].style.borderColor = "";
if(this.value != '')
{
if($("#school-display").css('display') == 'block' ){
$("#schoolsearch").next('.school_err').html("Vänligen klicka på din skola från listan nedan");
$("#schoolsearch").next('.school_err').css("display","block");
$("#schoolsearch").css("borderColor", "#ed8380");
$("html, body").animate({ scrollTop: 180 }, "slow");
}
}
}
});
if (flag) {
if($("#school-display").css('display') == 'block' ){
$("html, body").animate({ scrollTop: 180 }, "slow");
}
else
{
$('html, body').animate({
scrollTop: $(scrollTo).offset().top
});
}
return false;
}
var firstname = $('#dc_shipping_firstname').val();
var lastname = $('#dc_shipping_lastname').val();
$('#shipping-new-address-form [name="firstname"]').val(firstname).keyup();
$('#shipping-new-address-form [name="lastname"]').val(lastname).keyup();
$('#billing-address-form [name="firstname"]').val(firstname).keyup();
$('#billing-address-form [name="lastname"]').val(lastname).keyup();
}
else if ($('input[name=school-or-private-person]').val() == 'private')
{
if ($("#customer-email").val() == 0 || $("#customer-email").val() == '') {
$("#customer-email").css("borderColor","#ed8380");
$(".input-text.mage-error").next('.school_err').css("display","none");
$("#customer-email-error").html("Vänligen fyll i detta obligatoriska fält.");
}
}
if (this.validateShippingInformation() && this.validateBillingInformation()) {
setShippingInformationAction().done(
function () {
$("#majema-school").hide();
$("#place-order-trigger-wrapper").show();
$("#custom-info").appendTo("#co-payment-form");
$('#custom-shipping-method-buttons-container').hide();
$('#custom-subtotal').hide();
$('.opc-block-summary .table-totals').show();
stepNavigator.next();
}
);
}
},
validateBillingInformation: function() {
if($('[name="billing-address-same-as-shipping"]').is(":checked")) {
if (this.isFormInline) {
var shippingAddress = quote.shippingAddress();
var addressData = addressConverter.formAddressDataToQuoteAddress(
this.source.get('shippingAddress')
);
//Copy form data to quote shipping address object
for (var field in addressData) {
if (addressData.hasOwnProperty(field) &&
shippingAddress.hasOwnProperty(field) &&
typeof addressData[field] != 'function' &&
_.isEqual(shippingAddress[field], addressData[field])
) {
shippingAddress[field] = addressData[field];
} else if (typeof addressData[field] != 'function' &&
!_.isEqual(shippingAddress[field], addressData[field])) {
shippingAddress = addressData;
break;
}
}
if (customer.isLoggedIn()) {
shippingAddress.save_in_address_book = 1;
}
var newBillingAddress = createBillingAddress(shippingAddress);
selectBillingAddress(newBillingAddress);
} else {
selectBillingAddress(quote.shippingAddress());
}
return true;
}
var selectedAddress = $('[name="billing_address_id"]').val();
if(selectedAddress) {
var res = addressList.some(function (addressFromList) {
if (selectedAddress == addressFromList.customerAddressId) {
selectBillingAddress(addressFromList);
return true;
}
return false;
});
return res;
}
this.source.set('params.invalid', false);
this.source.trigger('billingAddress.data.validate');
if (this.source.get('params.invalid')) {
return false;
}
var addressData = this.source.get('billingAddress'),
newBillingAddress;
if ($('#billing-save-in-address-book').is(":checked")) {
addressData.save_in_address_book = 1;
}
newBillingAddress = createBillingAddress(addressData);
selectBillingAddress(newBillingAddress);
return true;
}
});
initialize: function () {
this._super();
ko.bindingHandlers.datetimepicker = {
init: function (element, valueAccessor, allBindingsAccessor) {
var $el = $(element);
//initialize datetimepicker
var options = {
minDate: 0,
dateFormat: 'yy-mm-dd'
};
$el.datetimepicker(options);
var writable = valueAccessor();
if (!ko.isObservable(writable)) {
var propWriters = allBindingsAccessor()._ko_property_writers;
if (propWriters && propWriters.datetimepicker) {
writable = propWriters.datetimepicker;
} else {
return;
}
}
writable($(element).datetimepicker("getDate"));
},
update: function (element, valueAccessor) {
var widget = $(element).data("DateTimePicker");
//when the view model is updated, update the widget
if (widget) {
var date = ko.utils.unwrapObservable(valueAccessor());
widget.date(date);
}
}
};
return this;
}
}
});
Error in the console:
Best Answer
Now in shipping.html add following code:
Clear static content if your Magento mode is not developer