${(function(){
const get_random_six_digits = () => {
return Math.random().toString().slice(-6)
};
const wholesale_enabled = false;
const setting_product_image_display = "133.33%";
const product_image = data.image;
const secondary_image = data.secondImage;
const image_width = product_image.width;
let image_height = product_image.height;
if(setting_product_image_display == '100%'){
image_height = image_width
}else if(setting_product_image_display == '133.33%'){
image_height = image_width * 1.3333;
};
const product_image_hover_on = true && !!secondary_image.src;
const has_save_label = true && ((+data.compare_at_price) > (+data.price));
const is_single_variant = data.variants.length == 1;
const min_price_variant_href = (data.min_price_variant && data.min_price_variant.available) ? data.min_price_variant.withinUrl : data.withinUrl;
const retail_price_max = data.retail_price_max || data.compare_at_price_max;
const THUMBNAILS_MAX_SIZE = 3;
const thumbnails = data.thumbVariants.slice(0, THUMBNAILS_MAX_SIZE);
const image_wrap_id = 'image_wrap_' + get_random_six_digits();
const image_carousel_id = 'image_carousel_' + get_random_six_digits();
const thumbnails_selector_id = 'thumbnails_selector_' + get_random_six_digits();
const form_id = 'form_' + get_random_six_digits();
return `
${
data.price_min != data.price_max
? `من
`
: `
`
}
+${data.remainInvisibleThumbCount}
`
})()}
اشتري الآن
${function() {
let { prices } = data.data
const total_price = (prices && prices.total_price) || 0;
const subtotal_price = (prices && prices.subtotal_price) || 0;
return `
`
}()}
🥰رحبي بمظهر أنيق مع عباية الفستان الطويل المطوي الأنيقة. مصنوعة من قماش ناعم، وياقة ماندرين وأكمام منفوخة وخصر مشدود يجمع بسلاسة بين الموضة والأناقة الثقافية. مثالي لأي مناسبة، هذا الفستان ضروري لأي خزانة ملابس.
تحديد:
المواد: نسيج بوليستر عالي الجودة
طول الأكمام: كم طويل
طول الفستان: طويل
العنصر: مطوي
التفاصيل: سحاب جانبي لسهولة الارتداء ولإضافة الراحة.
طرق الطباعة: تصميم منقوش
النمط: عصري، كاجوال، أنيق
المناسبة: ارتداء يومي / مناسبات خاصة / صلاة / حفلة / كوكتيل / مساء
المقاس: عادي
جدول المقاسات
مقاس
الكتف + الأكمام
وَسَط
طول
سم
بوصة
سم
بوصة
سم
بوصة
S
71
28.0
80
31.5
138
54
M
72
28.3
84
33.1
140
55
L
73
28.7
88
34.6
142
56
XL
74
29.1
92
36.2
144
57
2XL
75
29.5
96
37.8
144
57
ملحوظة:
1. يرجى السماح باختلاف طفيف قدره 1-3 سم (0.4-1.18 بوصة) بسبب القياس اليدوي واختلاف بسيط في اللون لإعدادات العرض المختلفة.
2. المقاس لا يناسب الجميع، يرجى التحقق بعناية من جدول المقاسات واختيار المقاس بناءً على مقاسك الحقيقي
3. نظرًا لحجم الطلب الكبير، سيتم تمديد دورة إنتاج الملابس وقد يتأخر طلبك. نسعى جاهدين لتحقيق أعلى جودة في كل التفاصيل، نأمل أن تتفهم وتتحلى بالصبر. وقت إنتاج الملابس: 10-15 يومًا، وقت اللوجستيات: 10-15 يومًا.
1
حدد المنتج
محدد 0 العنصر (s)
1
حدد المنتج
محدد
${ (data && data.data && (data.data.items || data.data.line_items) || (data && data.data && data.data.data && (data.data.data.items || data.data.data.line_items)) || []).reduce((acc, cur) => acc + cur.quantity, 0) || 0 }
العنصر (s)
1
حدد المنتج
محدد 0 العنصر (s)
1
حدد المنتج
محدد
${(data && data.data && (data.data.items || data.data.line_items) || (data && data.data && data.data.data && (data.data.data.items || data.data.data.line_items || (data.data.data.order && data.data.data.order.line_items))) || []).reduce((acc, cur) => acc + cur.quantity, 0) || 0 }
العنصر (s)
class SpzCheckoutNotificationHandler extends SPZ.BaseElement {
constructor(element) {
super(element);
this.timer_ = null;
}
isLayoutSupported(layout) {
return layout == SPZCore.Layout.LOGIC;
}
sendVariantListUpdateEvent_(data) {
const messageData = { type: "theme_variant_list_update", data: { orderToken: data.order_token || data.order_id } };
clearInterval(this.timer_);
if(!window.CheckoutAPI) {
this.timer_ = setInterval(() => {
if(window.CheckoutAPI) {
clearInterval(this.timer_);
postMessage && postMessage(messageData);
}
}, 500);
} else {
postMessage && postMessage(messageData);
}
}
buildCallback() {
this.action_ = SPZServices.actionServiceForDoc(this.element);
this.registerAction('sendVariantListUpdateEvent', (param) => {
this.sendVariantListUpdateEvent_(param.args.data);
});
}
}
SPZ.defineElement('spz-custom-checkout-notification-handler', SpzCheckoutNotificationHandler);
function handleGetOrderInfo(data) {
if (data.order_id) {
let api = `/api/checkout/order/info?order_id=${data.order_id}`;
return Promise.resolve(api);
}
return Promise.reject({});
}
function addEventListenerKickItems(data) {
if (data.type === 'checkout_kick_items') {
return Promise.resolve(data);
}
return Promise.reject({});
}
exportFunction('handleGetOrderInfo', handleGetOrderInfo)
exportFunction('addEventListenerKickItems', addEventListenerKickItems)
الأحدث
الأكثر إعجابا
أعلى التصنيفات
أدنى التصنيفات
الأكثر إعجابا
أعلى التصنيفات
أدنى التصنيفات
×
${function(){
const limit = typeof data === 'number' ? data : 0;
return `
صور/فيديو (${limit || 0}/5 )
` }()}
${(function(){
const closeIcon =
'
';
if (item.type === 'image') {
return `
${closeIcon}
`
}
return `
${closeIcon}
`
})()}
إرسال التعليقات بشكل مجهول
class SpzCustomFileUpload extends SPZ.BaseElement {
constructor(element) {
super(element);
this.uploadCount_ = 0;
this.fileList_ = [];
}
buildCallback() {
this.action = SPZServices.actionServiceForDoc(this.element);
this.registerAction('upload', (data) => {
this.handleFileUpload_(data.event?.detail?.data || []);
});
this.registerAction('delete', (data) => {
this.handleFileDelete_(data?.args?.data);
});
this.registerAction('preview', (data) => {
this.handleFilePreview_(data?.args?.data);
});
this.registerAction('limit', (data) => {
this.handleFileLimit_();
});
this.registerAction('sizeLimit', (data) => {
this.handleFileSizeLimit_();
});
}
isLayoutSupported(layout) {
return layout == SPZCore.Layout.LOGIC;
}
setData_(count, file) {
this.uploadCount_ = count;
this.fileList_ = file;
}
handleFileUpload_(data) {
data.forEach(i => {
if(this.fileList_.some(j => j.url === i.url)) return;
this.fileList_.push(i);
})
this.uploadCount_++;
sessionStorage.setItem('fileList', JSON.stringify(this.fileList_));
this.triggerEvent_("handleFileUpload", { count: this.uploadCount_, files: this.fileList_});
if(this.fileList_.length >= 5){
document.querySelector('#review_upload').style.display = 'none';
}
if(this.fileList_.length > 0){
document.querySelector('.apps-reviews-write-anonymous-box').style.marginTop = '8px';
}
}
handleFileDelete_(index) {
this.fileList_.splice(index, 1);
this.uploadCount_--;
sessionStorage.setItem('fileList', JSON.stringify(this.fileList_));
this.triggerEvent_("handleFileDelete", { count: this.uploadCount_, files: this.fileList_});
document.querySelector('#review_upload').style.display = 'block';
if(this.fileList_?.length === 0){
document.querySelector('.apps-reviews-write-anonymous-box').style.marginTop = '132px';
}
}
handleFilePreview_(index) {
const finalPreviewData = this.fileList_[index];
const filePreviewModal = document.getElementById('filePreviewModal');
const fullScreenVideo = document.getElementById('fullScreenVideo');
const fullScreenImage = document.getElementById('fullScreenImage');
const previewModalClose = document.getElementById('previewModalClose');
const previewLoading = document.getElementById('previewLoading');
filePreviewModal.style.display = 'block';
previewLoading.style.display = 'flex';
if(finalPreviewData?.type === 'video'){
const media = this.mediaParse_(this.fileList_[index]?.url);
fullScreenVideo.addEventListener('canplaythrough', function() {
previewLoading.style.display = 'none';
});
fullScreenImage.src = '';
fullScreenImage.style.display = 'none';
fullScreenVideo.style.display = 'block';
fullScreenVideo.src = media.mp4 || '';
} else {
fullScreenImage.onload = function() {
previewLoading.style.display = 'none';
};
fullScreenVideo.src = '';
fullScreenVideo.style.display = 'none';
fullScreenImage.style.display = 'block';
fullScreenImage.src = finalPreviewData.url;
}
previewModalClose.addEventListener('click', function() {
filePreviewModal.style.display = 'none';
});
}
handleFileLimit_() {
alert(window.AppReviewsLocale.comment_file_limit || 'please do not upload files more than 5');
this.triggerEvent_("handleFileLimit");
}
handleFileSizeLimit_() {
alert(window.AppReviewsLocale.comment_file_size_limit || 'File size does not exceed 10M');
}
clear(){
this.fileList_ = [];
this.uploadCount_ = 0;
sessionStorage.setItem('fileList', JSON.stringify(this.fileList_));
this.triggerEvent_("handleClear", { count: this.uploadCount_, files: this.fileList_});
document.querySelector('#review_upload').style.display = 'block';
}
mediaParse_(url) {
var result = {};
try {
url.replace(/[?&]+([^=&]+)=([^&]*)/gi, function (str, key, value) {
try {
result[key] = decodeURIComponent(value);
} catch (e) {
result[key] = value;
}
});
result.preview_image = url.split('?')[0];
} catch (e) {};
return result;
}
triggerEvent_(name, data) {
const event = SPZUtils.Event.create(this.win, name, data);
this.action.trigger(this.element, name, event);
}
}
SPZ.defineElement('spz-custom-file-upload', SpzCustomFileUpload);
The review would not show in product details on storefront since it does not support to.
const TAG = 'spz-custom-painter-button-animation';
const MAX_ITERATION_COUNT = 99999999;
const SITE = (window.C_SETTINGS && window.C_SETTINGS.routes && window.C_SETTINGS.routes.root) || '';
const ADD_TO_CART_ANIMATION_SETTING =
`${SITE}/api/marketing_atmosphere_app/add_to_cart_btn_animation/setting`;
class SpzCustomPainterButtonAnimation extends SPZ.BaseElement {
/**@override */
static deferredMount() {
return false;
}
/** @param {!SpzElement} element */
constructor(element) {
super(element);
/** @private {!../../src/service/xhr-impl.Xhr} */
this.xhr_ = SPZServices.xhrFor(this.win);
/** @private {Object} */
this.data_ = null;
/** @private {Element} */
this.addToCartButton_ = null;
/** @private {boolean} */
this.productAvailable_ = true;
/** @private {number} */
this.timerId_ = null;
/** @private {number} */
this.animationExecutionCount_ = 0;
/** @private {boolean} */
this.selectedVariantAvailable_ = true;
/** @private {number} */
this.delay_ = 5000;
/** @private {number} */
this.iterationCount_ = 5;
/** @private {string} */
this.animationClass_ = '';
}
/** @override */
isLayoutSupported(layout) {
return layout == SPZCore.Layout.LOGIC;
}
/** @override */
buildCallback() {
this.productAvailable_ = this.element.hasAttribute('product-available');
this.selectedVariantAvailable_ = this.element.hasAttribute('selected-variant-available');
}
/** @override */
mountCallback() {
this.render_();
}
/** @private */
render_() {
if (!this.productAvailable_) {
return;
}
this.fetch_().then((data) => {
if (!data) {
return;
}
this.data_ = data;
this.animationClass_ = `painter-${data.animation_name}-animation`;
this.iterationCount_ =
data.animation_iteration_count === 'infinite'
? MAX_ITERATION_COUNT
: data.animation_iteration_count;
const animationDuration = 1;
const animationDelay = data.animation_delay || 5;
this.delay_ = (animationDuration + animationDelay) * 1000;
this.handleButtonEffect_();
});
}
/**
* @param {JsonObject} data
* @return {(null|Object)}
* @private
*/
parseJson_(data) {
try {
return JSON.parse(data);
} catch (e) {
return null;
}
}
/**
* @return {Promise}
* @private
*/
fetch_() {
return this.xhr_.fetchJson(ADD_TO_CART_ANIMATION_SETTING).then((data) => {
if (!data || !data.enabled) {
return null;
}
return this.parseJson_(data.detail);
});
}
/** @private */
getAddToCartButton_() {
this.addToCartButton_ = SPZCore.Dom.scopedQuerySelector(
document.body,
'[data-section-type="product"] [role="addToCart"], [data-section-type="product_detail"] [role="addToCart"], [data-section-type="product_detail"] [data-click="addToCart"], [data-section-type="product"] [data-click="addToCart"]'
);
}
/** @private */
restartAnimation_() {
this.addToCartButton_.classList.remove(this.animationClass_);
this.addToCartButton_./* OK */ offsetWidth;
this.addToCartButton_.classList.add(this.animationClass_);
this.animationExecutionCount_++;
}
/** @private */
clearTimer_() {
this.win.clearInterval(this.timerId_);
this.timerId_ = null;
}
/** @private */
setupTimer_() {
this.timerId_ = this.win.setInterval(() => {
this.restartAnimation_();
if (this.animationExecutionCount_ >= this.iterationCount_) {
this.removeAnimationClass_();
this.clearTimer_();
}
}, this.delay_);
}
/** @private */
restartTimer_() {
if (this.animationExecutionCount_ >= this.iterationCount_) {
this.removeAnimationClass_();
return;
}
this.setupTimer_();
}
/** @private */
listenVariantChange_() {
SPZUtils.Event.listen(self.document, 'dj.variantChange', (e) => {
const selectedVariant = e.detail && e.detail.selected;
if (!selectedVariant) {
return;
}
const {available} = selectedVariant;
if (this.selectedVariantAvailable_ !== available) {
this.selectedVariantAvailable_ = available;
this.clearTimer_();
if (available) {
this.restartTimer_();
}
}
});
}
/** @private */
removeAnimationClass_() {
this.win.setTimeout(() => {
this.addToCartButton_.classList.remove(this.animationClass_);
}, 1000);
}
/** @private */
handleButtonEffect_() {
this.getAddToCartButton_();
if (!this.addToCartButton_) {
return;
}
if (this.selectedVariantAvailable_) {
++this.animationExecutionCount_;
this.addToCartButton_.classList.add(this.animationClass_);
if (this.iterationCount_ === 1) {
this.removeAnimationClass_();
return;
}
this.setupTimer_();
}
this.listenVariantChange_();
}
}
SPZ.defineElement(TAG, SpzCustomPainterButtonAnimation);