Author: bibryam
Date: Thu Aug 14 01:37:52 2008 New Revision: 685809 URL: http://svn.apache.org/viewvc?rev=685809&view=rev Log: Missed these files in my previous commit. Added: ofbiz/trunk/applications/order/webapp/ordermgr/WEB-INF/actions/entry/catalog/InlineProductDetail.groovy (with props) ofbiz/trunk/applications/order/webapp/ordermgr/entry/catalog/inlineProductDetail.ftl (with props) Added: ofbiz/trunk/applications/order/webapp/ordermgr/WEB-INF/actions/entry/catalog/InlineProductDetail.groovy URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/webapp/ordermgr/WEB-INF/actions/entry/catalog/InlineProductDetail.groovy?rev=685809&view=auto ============================================================================== --- ofbiz/trunk/applications/order/webapp/ordermgr/WEB-INF/actions/entry/catalog/InlineProductDetail.groovy (added) +++ ofbiz/trunk/applications/order/webapp/ordermgr/WEB-INF/actions/entry/catalog/InlineProductDetail.groovy Thu Aug 14 01:37:52 2008 @@ -0,0 +1,311 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.lang.*; +import java.util.*; +import java.text.NumberFormat; +import org.ofbiz.base.util.*; +import org.ofbiz.service.*; +import org.ofbiz.entity.*; +import org.ofbiz.entity.condition.*; +import org.ofbiz.entity.util.*; +import org.ofbiz.webapp.taglib.*; +import org.ofbiz.webapp.stats.VisitHandler; +import org.ofbiz.order.shoppingcart.ShoppingCartEvents; +import org.ofbiz.product.catalog.*; +import org.ofbiz.product.category.*; +import org.ofbiz.product.product.ProductWorker; +import org.ofbiz.product.product.ProductContentWrapper; +import org.ofbiz.product.product.ProductSearch; +import org.ofbiz.product.product.ProductSearchSession; +import org.ofbiz.product.store.*; + +inlineProductId = request.getAttribute("inlineProductId"); +inlineCounter = request.getAttribute("inlineCounter"); +context.inlineCounter = inlineCounter; +context.inlineProductId = inlineProductId; + +contentPathPrefix = CatalogWorker.getContentPathPrefix(request); +catalogName = CatalogWorker.getCatalogName(request); +currentCatalogId = CatalogWorker.getCurrentCatalogId(request); + +if (inlineProductId) { + inlineProduct = delegator.findByPrimaryKeyCache("Product", [productId : inlineProductId]); + if (inlineProduct) { + context.product = inlineProduct; + contentWrapper = new ProductContentWrapper(inlineProduct, request); + context.put("title", contentWrapper.get("PRODUCT_NAME")); + context.put("metaDescription", contentWrapper.get("DESCRIPTION")); + productTemplate = product.detailScreen; + if (productTemplate) { + detailScreen = productTemplate; + } + } +} + +templatePathPrefix = CatalogWorker.getTemplatePathPrefix(request); +if (templatePathPrefix) { + detailScreen = templatePathPrefix + detailScreen; +} +context.detailScreen = detailScreen; + +String buildNext(Map map, List order, String current, String prefix, Map featureTypes) { + def ct = 0; + def buf = new StringBuffer(); + buf.append("function listFT" + inlineCounter + current + prefix + "() { "); + buf.append("document.forms[\"configform\"].elements[\"FT" + inlineCounter + current + "\"].options.length = 1;"); + buf.append("document.forms[\"configform\"].elements[\"FT" + inlineCounter + current + "\"].options[0] = new Option(\"" + featureTypes[current] + "\",\"\",true,true);"); + map.each { key, value -> + def optValue = null; + + if (order.indexOf(current) == (order.size()-1)) { + optValue = value.iterator().next(); + } else { + optValue = prefix + "_" + ct; + } + + buf.append("document.forms[\"configform\"].elements[\"FT" + inlineCounter + current + "\"].options[" + (ct + 1) + "] = new Option(\"" + key + "\",\"" + optValue + "\");"); + ct++; + } + buf.append(" }"); + if (order.indexOf(current) < (order.size()-1)) { + ct = 0; + map.each { key, value -> + def nextOrder = order.get(order.indexOf(current)+1); + def newPrefix = prefix + "_" + ct; + buf.append(buildNext(value, order, nextOrder, newPrefix, featureTypes)); + ct++; + } + } + return buf.toString(); +} + +cart = ShoppingCartEvents.getCartObject(request); + +// set the content path prefix +contentPathPrefix = CatalogWorker.getContentPathPrefix(request); +context.contentPathPrefix = contentPathPrefix; + +// get the product detail information +if (inlineProduct) { + inlineProductId = inlineProduct.productId; + productTypeId = inlineProduct.productTypeId; + featureTypes = [:]; + featureOrder = []; + + // make the productContentWrapper + productContentWrapper = new ProductContentWrapper(inlineProduct, request); + context.productContentWrapper = productContentWrapper; + + // get the main detail image (virtual or single product) + mainDetailImage = productContentWrapper.get("DETAIL_IMAGE_URL"); + if (mainDetailImage) { + mainDetailImageUrl = ContentUrlTag.getContentPrefix(request) + mainDetailImage; + mainDetailImageUrl = URLEncoder.encode(Base64.base64Encode(mainDetailImage), "UTF-8"); + context.mainDetailImageUrl = mainDetailImageUrl; + } + + + // get the product price + webSiteId = CatalogWorker.getWebSiteId(request); + autoUserLogin = request.getSession().getAttribute("autoUserLogin"); + if (cart.isSalesOrder()) { + // sales order: run the "calculateProductPrice" service + priceContext = [product : inlineProduct, prodCatalogId : currentCatalogId, + currencyUomId : cart.getCurrency(), autoUserLogin : autoUserLogin]; + priceContext.webSiteId = webSiteId; + priceContext.productStoreId = productStoreId; + priceContext.checkIncludeVat = "Y"; + priceContext.agreementId = cart.getAgreementId(); + priceContext.partyId = cart.getPartyId(); // IMPORTANT: must put this in, or price will be calculated for the CSR instead of the customer + priceMap = dispatcher.runSync("calculateProductPrice", priceContext); + context.priceMap = priceMap; + } else { + // purchase order: run the "calculatePurchasePrice" service + priceContext = [product : inlineProduct, currencyUomId : cart.getCurrency(), + partyId : cart.getPartyId(), userLogin : userLogin]; + priceMap = dispatcher.runSync("calculatePurchasePrice", priceContext); + context.priceMap = priceMap; + } + + + context.variantTree = null; + context.variantTreeSize = null; + context.variantSample = null; + context.variantSampleKeys = null; + context.variantSampleSize = null; + if ("Y".equals(inlineProduct.isVirtual)) { + if ("VV_FEATURETREE".equals(ProductWorker.getProductvirtualVariantMethod(delegator, inlineProductId))) { + context.featureLists = ProductWorker.getSelectableProductFeaturesByTypesAndSeq(inlineProduct); + } else { + featureMap = dispatcher.runSync("getProductFeatureSet", [productId : inlineProductId]); + featureSet = featureMap.featureSet; + if (featureSet) { + variantTreeMap = dispatcher.runSync("getProductVariantTree", [productId : inlineProductId, featureOrder : featureSet, productStoreId : productStoreId]); + variantTree = variantTreeMap.variantTree; + imageMap = variantTreeMap.variantSample; + virtualVariant = variantTreeMap.virtualVariant; + context.virtualVariant = virtualVariant; + if (variantTree) { + context.variantTree = variantTree; + context.variantTreeSize = variantTree.size(); + } + if (imageMap) { + context.variantSample = imageMap; + context.variantSampleKeys = imageMap.keySet(); + context.variantSampleSize = imageMap.size(); + } + context.featureSet = featureSet; + + if (variantTree) { + featureOrder = new LinkedList(featureSet); + featureOrder.each { featureKey -> + featureValue = delegator.findByPrimaryKeyCache("ProductFeatureType", [productFeatureTypeId : featureKey]); + fValue = featureValue.get("description") ?: featureValue.productFeatureTypeId; + featureTypes[featureKey] = fValue; + } + } + context.featureTypes = featureTypes; + context.featureOrder = featureOrder; + if (featureOrder) { + context.featureOrderFirst = featureOrder[0]; + } + + if (variantTree && imageMap) { + jsBuf = new StringBuffer(); + jsBuf.append("<script language=\"JavaScript\">"); + jsBuf.append("var DET" + inlineCounter + "= new Array(" + variantTree.size() + ");"); + jsBuf.append("var IMG" + inlineCounter + " = new Array(" + variantTree.size() + ");"); + jsBuf.append("var OPT" + inlineCounter + " = new Array(" + featureOrder.size() + ");"); + jsBuf.append("var VIR" + inlineCounter + " = new Array(" + virtualVariant.size() + ");"); + jsBuf.append("var detailImageUrl" + inlineCounter + " = null;"); + featureOrder.eachWithIndex { feature, i -> + jsBuf.append("OPT" + inlineCounter + "[" + i + "] = \"FT" + inlineCounter + feature + "\";"); + } + virtualVariant.eachWithIndex { variant, i -> + jsBuf.append("VIR" + inlineCounter + "[" + i + "] = \"" + variant + "\";"); + } + + // build the top level + topLevelName = featureOrder[0]; + jsBuf.append("function list" + inlineCounter + topLevelName + "() {"); + jsBuf.append("document.forms[\"configform\"].elements[\"FT" + inlineCounter + topLevelName + "\"].options.length = 1;"); + jsBuf.append("document.forms[\"configform\"].elements[\"FT" + inlineCounter + topLevelName + "\"].options[0] = new Option(\"" + featureTypes[topLevelName] + "\",\"\",true,true);"); + if (variantTree) { + featureOrder.each { featureKey -> + jsBuf.append("document.forms[\"configform\"].elements[\"FT" + inlineCounter + featureKey + "\"].options.length = 1;"); + } + firstDetailImage = null; + firstLargeImage = null; + counter = 0; + variantTree.each { key, value -> + opt = null; + if (featureOrder.size() == 1) { + opt = value.iterator().next(); + } else { + opt = counter as String; + } + // create the variant content wrapper + contentWrapper = new ProductContentWrapper(imageMap[key], request); + + // initial image paths + detailImage = contentWrapper.get("DETAIL_IMAGE_URL") ?: productContentWrapper.get("DETAIL_IMAGE_URL"); + largeImage = contentWrapper.get("LARGE_IMAGE_URL") ?: productContentWrapper.get("LARGE_IMAGE_URL"); + + // full image URLs + detailImageUrl = null; + largeImageUrl = null; + + // append the content prefix + if (detailImage) { + detailImageUrl = ContentUrlTag.getContentPrefix(request) + detailImage; + // base64 encode the image url for a little protection + detailImageUrl = URLEncoder.encode(Base64.base64Encode(detailImageUrl), "UTF-8"); + } + if (largeImage) { + largeImageUrl = ContentUrlTag.getContentPrefix(request) + largeImage; + } + + jsBuf.append("document.forms[\"configform\"].elements[\"FT" + inlineCounter + topLevelName + "\"].options[" + (counter+1) + "] = new Option(\"" + key + "\",\"" + opt + "\");"); + jsBuf.append("DET" + inlineCounter + "[" + counter + "] = \"" + detailImageUrl +"\";"); + jsBuf.append("IMG" + inlineCounter + "[" + counter + "] = \"" + largeImageUrl +"\";"); + + if (!firstDetailImage) { + firstDetailImage = detailImageUrl; + } + if (!firstLargeImage) { + firstLargeImage = largeImage; + } + counter++; + } + context.firstDetailImage = firstDetailImage; + context.firstLargeImage = firstLargeImage; + } + jsBuf.append("}"); + + // build dynamic lists + if (variantTree) { + variantTree.values().eachWithIndex { varTree, topLevelKeysCt -> + cnt = "" + topLevelKeysCt; + if (varTree instanceof Map) { + jsBuf.append(buildNext(varTree, featureOrder, featureOrder[1], cnt, featureTypes)); + } + } + } + + // make a list of variant sku with requireAmount + variantsRes = dispatcher.runSync("getAssociatedProducts", [productId : inlineProductId, type : "PRODUCT_VARIANT", checkViewAllow : true, prodCatalogId : currentCatalogId]); + variants = variantsRes.assocProducts; + if (variants) { + amt = new StringBuffer(); + amt.append("function checkAmtReq" + inlineCounter + "(sku) { "); + // Create the javascript to return the price for each variant + variantPriceJS = new StringBuffer(); + variantPriceJS.append("function getVariantPrice" + inlineCounter + "(sku) { "); + // Format to apply the currency code to the variant price in the javascript + productStore = ProductStoreWorker.getProductStore(request); + localeString = productStore.defaultLocaleString; + if (localeString) { + locale = UtilMisc.parseLocale(localeString); + } + numberFormat = NumberFormat.getCurrencyInstance(locale); + variants.each { variantAssoc -> + variant = variantAssoc.getRelatedOne("AssocProduct"); + // Get the price for each variant. Reuse the priceContext already setup for virtual product above and replace the product + if (cart.isSalesOrder()) { + // sales order: run the "calculateProductPrice" service + priceContext.product = variant; + variantPriceMap = dispatcher.runSync("calculateProductPrice", priceContext); + } + amt.append(" if (sku == \"" + variant.productId + "\") return \"" + (variant.requireAmount ?: "N") + "\"; "); + variantPriceJS.append(" if (sku == \"" + variant.productId + "\") return \"" + numberFormat.format(variantPriceMap.basePrice) + "\"; "); + } + amt.append(" } "); + variantPriceJS.append(" } "); + } + jsBuf.append(amt.toString()); + jsBuf.append(variantPriceJS.toString()); + jsBuf.append("</script>"); + + context.virtualJavaScript = jsBuf.toString(); + } + } + } + } +} Propchange: ofbiz/trunk/applications/order/webapp/ordermgr/WEB-INF/actions/entry/catalog/InlineProductDetail.groovy ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/applications/order/webapp/ordermgr/WEB-INF/actions/entry/catalog/InlineProductDetail.groovy ------------------------------------------------------------------------------ svn:keywords = Date Rev Author URL Id Propchange: ofbiz/trunk/applications/order/webapp/ordermgr/WEB-INF/actions/entry/catalog/InlineProductDetail.groovy ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/applications/order/webapp/ordermgr/entry/catalog/inlineProductDetail.ftl URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/webapp/ordermgr/entry/catalog/inlineProductDetail.ftl?rev=685809&view=auto ============================================================================== --- ofbiz/trunk/applications/order/webapp/ordermgr/entry/catalog/inlineProductDetail.ftl (added) +++ ofbiz/trunk/applications/order/webapp/ordermgr/entry/catalog/inlineProductDetail.ftl Thu Aug 14 01:37:52 2008 @@ -0,0 +1,389 @@ +<#-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> + +${virtualJavaScript?if_exists} +<#assign addJavaScript = requestAttributes.addJavaScript/> +<#if (addJavaScript == 0)> +<script language="JavaScript" type="text/javascript"> + + function popupDetailInline(inlineCounter) { + var imageField = 'detailImage' + inlineCounter; + var defaultDetailImage = document.getElementById(imageField); + if (defaultDetailImage == null || defaultDetailImage == "null") { + defaultDetailImage = "_NONE_"; + } + var fieldName = 'detailImageUrl' + inlineCounter; + if (window[fieldName] == null || window[fieldName] == "null") { + window[fieldName] = defaultDetailImage; + } + + if (window[fieldName] == "_NONE_") { + alert("No detail image available to display."); + return; + } + popUp("<@ofbizUrl>detailImage?detail=" + window[fieldName] + "</@ofbizUrl>", 'detailImage', '400', '550'); + } + + function setAddProductIdInline(inlineCounter, name) { + var add_product_id = 'add_product_id' + inlineCounter; + var product_id_display = 'product_id_display' + inlineCounter; + document.configform[add_product_id].value = name; + if (name == '' || name == 'NULL' || isVirtualInline(inlineCounter, name) == true) { + //document.configform.quantity.disabled = true; + var elem = document.getElementById(product_id_display); + var txt = document.createTextNode(''); + if(elem.hasChildNodes()) { + elem.replaceChild(txt, elem.firstChild); + } else { + elem.appendChild(txt); + } + + checkOtion(inlineCounter); + } else { + //document.configform.quantity.disabled = false; + var elem = document.getElementById(product_id_display); + var txt = document.createTextNode(name); + if(elem.hasChildNodes()) { + elem.replaceChild(txt, elem.firstChild); + } else { + elem.appendChild(txt); + } + } + } + + function checkOtion(inlineCounter) { + var option = document.getElementById(inlineCounter.substring(0, inlineCounter.length - 2)); + if (option.checked) { + option.checked=false; + } + } + + function setVariantPriceInline(inlineCounter, sku) { + var variant_price_display = 'variant_price_display' + inlineCounter; + if (sku == '' || sku == 'NULL' || isVirtualInline(inlineCounter, sku) == true) { + var elem = document.getElementById(variant_price_display); + var txt = document.createTextNode(''); + if(elem.hasChildNodes()) { + elem.replaceChild(txt, elem.firstChild); + } else { + elem.appendChild(txt); + } + } + else { + var elem = document.getElementById(variant_price_display); + var functionName = 'getVariantPrice' + inlineCounter; + var price = window[functionName](sku); + var txt = document.createTextNode('+' + price); + if(elem.hasChildNodes()) { + elem.replaceChild(txt, elem.firstChild); + } else { + elem.appendChild(txt); + } + } + } + function isVirtualInline(inlineCounter, product) { + var isVirtual = false; + var fieldName = 'VIR' + inlineCounter; + <#if virtualJavaScript?exists> + for (i = 0; i < window[fieldName].length; i++) { + if (window[fieldName][i] == product) { + isVirtual = true; + } + } + </#if> + return isVirtual; + } + + function toggleAmtInline(inlineCounter, toggle) { + var fieldName = 'add_amount' + inlineCounter; + if (toggle == 'Y') { + changeObjectVisibility(fieldName, "visible"); + } + + if (toggle == 'N') { + changeObjectVisibility(fieldName, "hidden"); + } + } + + function findIndexInline(varname, name ) { + for (i = 0; i < window[varname].length; i++) { + if ( window[varname][i] == name) { + return i; + } + } + return -1; + } + + function checkOptionToggle(inlineCounter, disable) { + var index = inlineCounter.indexOf('_'); + var optionElementName = inlineCounter.substring(0,index); + var option = document.getElementById(optionElementName); + if ("true" == disable) { + option.disabled = true; + if (option.checked == true) { + option.checked == false; + } + } else { + //check all virtual product for the option + } + } + + function checkOptionVariants(optionName) { + var option = document.getElementById(optionName); + if (option.checked == false) { + return false; + } + + var fieldName = "add_product_id" + optionName + "_"; + var index = 15 + optionName.toString().length; + var cform = document.forms["configform"]; + var len = cform.elements.length; + for (var i = 0; i < len; i++) { + var element = cform.elements[i]; + if (element.name.substring(0, index) == fieldName) { + if (element.value == '' || element.value == 'NULL') { + option.checked = false; + alert('Please select all features first'); + return false; + } + } + } + } + + function getListInline(inlineCounter, name, index, src) { + currentFeatureIndex = findIndexInline('OPT'+inlineCounter, name); + + if (currentFeatureIndex == 0) { + // set the images for the first selection + if ([index] != null) { + if (document.images['mainImage'+ inlineCounter] != null) { + document.images['mainImage'+ inlineCounter].src = window['IMG'+ inlineCounter][index]; + window['detailImageUrl'+ inlineCounter] = window['DET'+ inlineCounter][index]; + } + } + + // set the drop down index for swatch selection + document.forms["configform"].elements[name].selectedIndex = (index*1)+1; + } + + if (currentFeatureIndex < (window['OPT'+ inlineCounter].length-1)) { + // eval the next list if there are more + var selectedValue = document.forms["configform"].elements[name].options[(index*1)+1].value; + if (index == -1) { + var featureOrderFirst = window['OPT'+ inlineCounter][(currentFeatureIndex)].toString(); + var length = featureOrderFirst.length; + featureOrderFirst = featureOrderFirst.substring(2, length); + var Variable1 = eval("list" + featureOrderFirst + "()"); + } else { + var Variable1 = eval("list" + window['OPT'+ inlineCounter][(currentFeatureIndex+1)] + selectedValue + "()"); + } + + // set the product ID to NULL to trigger the alerts + setAddProductIdInline(inlineCounter, 'NULL'); + + // set the variant price to NULL + setVariantPriceInline(inlineCounter, 'NULL'); + + //checkOptionToggle(inlineCounter, 'false'); + } else { + // this is the final selection -- locate the selected index of the last selection + var indexSelected = document.forms["configform"].elements[name].selectedIndex; + + // using the selected index locate the sku + var sku = document.forms["configform"].elements[name].options[indexSelected].value; + + // set the product ID + setAddProductIdInline(inlineCounter, sku); + + // set the variant price + setVariantPriceInline(inlineCounter, sku); + + // check for amount box + var functionName = 'checkAmtReq' + inlineCounter; + toggleAmtInline(inlineCounter, window[functionName](sku)); + + //checkOptionToggle(inlineCounter, 'true'); + } + } + + + </script> +</#if> + +<#assign addedFeatureTreeJavaScript = requestAttributes.addedFeatureTreeJavaScript?default("N")/> +<#if product.virtualVariantMethodEnum?if_exists == "VV_FEATURETREE" && featureLists?has_content && ("N" == addedFeatureTreeJavaScript)> + ${setRequestAttribute("addedFeatureTreeJavaScript", "Y")} + <script language="JavaScript" type="text/javascript"> + function checkRadioButtoninline(inlineCounter, productId) { + var add_product_id = 'add_product_id' + inlineCounter; + <#list featureLists as featureList> + <#list featureList as feature> + <#if feature_index == 0> + var myList = document.getElementById("FT" +inlineCounter + "${feature.productFeatureTypeId}"); + if (myList.options[0].selected == true) { + document.configform[add_product_id].value = 'NULL'; + return; + } + <#break> + </#if> + </#list> + </#list> + document.configform[add_product_id].value = productId; + } + </script> +</#if> + + +<#assign price = priceMap?if_exists/> +<div id="inlineproductdetail${inlineCounter}"> +<table border="0" cellpadding="2" cellspacing="0" width="100%"> + <tr> + <td align="left" valign="top" width="0"> + <#assign productLargeImageUrl = productContentWrapper.get("LARGE_IMAGE_URL")?if_exists> + <#if firstLargeImage?has_content> + <#assign productLargeImageUrl = firstLargeImage> + </#if> + <#if productLargeImageUrl?has_content> + <input type="hidden" name="detailImage${inlineCounter}" value="${firstDetailImage?default(mainDetailImageUrl?default("_NONE_"))}"/> + <a href="javascript:popupDetailInline('${inlineCounter}');"><img src='<@ofbizContentUrl>${contentPathPrefix?if_exists}${productLargeImageUrl?if_exists}</@ofbizContentUrl>' name='mainImage${inlineCounter}' vspace='5' hspace='5' border='0' width='100' align='left'></a> + </#if> + </td> + <td align="right" valign="top" width="100%"> + <#-- <h2>${productContentWrapper.get("PRODUCT_NAME")?if_exists}</h2> --> + <#assign inStock = true> + <#if product.isVirtual?if_exists?upper_case == "Y"> + <#if product.virtualVariantMethodEnum?if_exists == "VV_FEATURETREE" && featureLists?has_content> + <#list featureLists as featureList> + <#list featureList as feature> + <#if feature_index == 0> + <div>${feature.description}: <select id="FT${inlineCounter}${feature.productFeatureTypeId}" name="FT${inlineCounter}${feature.productFeatureTypeId}" onChange="javascript:checkRadioButtoninline('${inlineCounter}', '${product.productId}');"> + <option value="select" selected="selected"> select option </option> + <#else> + <option value="${feature.productFeatureId}">${feature.description} <#if feature.price?exists>(+ <@ofbizCurrency amount=feature.price?string isoCode=feature.currencyUomId/>)</#if></option> + </#if> + </#list> + </select> + </div> + </#list> + <input type="hidden" name="product_id${inlineCounter}" value="${product.productId}"/> + <input type="hidden" name="add_product_id${inlineCounter}" value="NULL"/> + </#if> + <#if !product.virtualVariantMethodEnum?exists || product.virtualVariantMethodEnum == "VV_VARIANTTREE"> + <#if variantTree?exists && (variantTree.size() > 0)> + <#list featureSet as currentType> + <div> + <select name="FT${inlineCounter}${currentType}" onchange="javascript:getListInline('${inlineCounter}', this.name, (this.selectedIndex-1), 1);"> + <option>${featureTypes.get(currentType)}</option> + </select> + </div> + </#list> + <input type="hidden" name="product_id${inlineCounter}" value="${product.productId}"/> + <input type="hidden" name="add_product_id${inlineCounter}" value="NULL"/> + <div> + <b><span id="product_id_display${inlineCounter}"> </span></b> + <b><div id="variant_price_display${inlineCounter}"> </div></b> + </div> + <#else> + <input type="hidden" name="product_id${inlineCounter}" value="${product.productId}"/> + <input type="hidden" name="add_product_id${inlineCounter}" value="NULL"/> + <div><b>${uiLabelMap.ProductItemOutofStock}.</b></div> + <#assign inStock = false> + </#if> + </#if> + <#else> + <input type="hidden" name="product_id${inlineCounter}" value="${product.productId}"/> + <input type="hidden" name="add_product_id${inlineCounter}" value="${product.productId}"/> + <#assign isStoreInventoryNotAvailable = !(Static["org.ofbiz.product.store.ProductStoreWorker"].isStoreInventoryAvailable(request, product, 1.0?double))> + <#assign isStoreInventoryRequired = Static["org.ofbiz.product.store.ProductStoreWorker"].isStoreInventoryRequired(request, product)> + <#if isStoreInventoryNotAvailable> + <#if isStoreInventoryRequired> + <div><b>${uiLabelMap.ProductItemOutofStock}.</b></div> + <#assign inStock = false> + <#else> + <div><b>${product.inventoryMessage?if_exists}</b></div> + </#if> + </#if> + </#if> + </td></tr> + <tr><td COLSPAN="2" align="right"> + <#-- check to see if introductionDate hasnt passed yet --> + <#if product.introductionDate?exists && nowTimestamp.before(product.introductionDate)> + <p> </p> + <div style="color: red;">${uiLabelMap.ProductProductNotYetMadeAvailable}.</div> + <#-- check to see if salesDiscontinuationDate has passed --> + <#elseif product.salesDiscontinuationDate?exists && nowTimestamp.after(product.salesDiscontinuationDate)> + <div style="color: red;">${uiLabelMap.ProductProductNoLongerAvailable}.</div> + <#-- check to see if the product requires inventory check and has inventory --> + <#elseif product.virtualVariantMethodEnum?if_exists != "VV_FEATURETREE"> + <#if inStock> + <#if product.requireAmount?default("N") == "Y"> + <#assign hiddenStyle = "visible"> + <#else> + <#assign hiddenStyle = "hidden"> + </#if> + <div id="add_amount${inlineCounter}" class="${hiddenStyle}"> + <span style="white-space: nowrap;"><b>${uiLabelMap.CommonAmount}:</b></span> + <input type="text" size="5" name="add_amount${inlineCounter}" value=""/> + </div> + </#if> + </#if> + </td></tr> + + <tr><td COLSPAN="2" align="right"> + <#if variantTree?exists && 0 < variantTree.size()> + <script language="JavaScript" type="text/javascript">eval("list"+ "${inlineCounter}" + "${featureOrderFirst}" + "()");</script> + </#if> + + <#-- Swatches (virtual products only) . For now commented out, before fixing a bug + <#if variantSample?exists && 0 < variantSample.size()> + <#assign imageKeys = variantSample.keySet()> + <#assign imageMap = variantSample> + <p> </p> + <table cellspacing="0" cellpadding="0"> + <tr> + <#assign maxIndex = 7> + <#assign indexer = 0> + <#list imageKeys as key> + <#assign swatchProduct = imageMap.get(key)> + <#if swatchProduct?has_content && indexer < maxIndex> + <#assign imageUrl = Static["org.ofbiz.product.product.ProductContentWrapper"].getProductContentAsText(swatchProduct, "SMALL_IMAGE_URL", request)?if_exists> + <#if !imageUrl?has_content> + <#assign imageUrl = productContentWrapper.get("SMALL_IMAGE_URL")?if_exists> + </#if> + <#if !imageUrl?has_content> + <#assign imageUrl = "/images/defaultImage.jpg"> + </#if> + <td align="center" valign="bottom"> + <a href="javascript:getListInline('${inlineCounter}', 'FT${inlineCounter}${featureOrderFirst}','${indexer}',1);"><img src="<@ofbizContentUrl>${contentPathPrefix?if_exists}${imageUrl}</@ofbizContentUrl>" border="0" width="60" height="60"></a> + <br/> + <a href="javascript:getListInline('${inlineCounter}', 'FT${inlineCounter}${featureOrderFirst}','${indexer}',1);" class="linktext">${key}</a> + </td> + </#if> + <#assign indexer = indexer + 1> + </#list> + <#if (indexer > maxIndex)> + <div><b>${uiLabelMap.ProductMoreOptions}</b></div> + </#if> + </tr> + </table> + </#if> --> + </td> + </tr> +</table> +</div> Propchange: ofbiz/trunk/applications/order/webapp/ordermgr/entry/catalog/inlineProductDetail.ftl ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/applications/order/webapp/ordermgr/entry/catalog/inlineProductDetail.ftl ------------------------------------------------------------------------------ svn:keywords = Date Rev Author URL Id Propchange: ofbiz/trunk/applications/order/webapp/ordermgr/entry/catalog/inlineProductDetail.ftl ------------------------------------------------------------------------------ svn:mime-type = text/plain |
Free forum by Nabble | Edit this page |