Testo 191 T3, HACCP temp. datalogger, med lang bøjelig føler
Datalogger med lang, bøjelig føler.
Fleksibel måling, hvor pladsen er trang. Testo 191-T3 med bøjelig føler gør HACCP-overvågning nem og præcis – også i udfordrende miljøer.
Error executing template "Designs/Swift/Paragraph/Swift_ProductAddToCart.cshtml" System.InvalidOperationException: Collection was modified; enumeration operation may not execute. at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource) at System.Collections.Generic.List`1.Enumerator.MoveNextRare() at Dynamicweb.Ecommerce.Frontend.ImagePatternManager.GetProductImages(ImagePatternProductInfo product) at Dynamicweb.Ecommerce.ProductCatalog.ViewEngine.<>c__DisplayClass3_1.<BulkCreateView>b__61() at System.Lazy`1.CreateValue() at System.Lazy`1.LazyInitValue() at Dynamicweb.Ecommerce.ProductCatalog.ViewEngine.GetDefaultImage(MediaViewModelSettings settings, String productId, String languageId, String variantId, Lazy`1 productImages, Lazy`1 details) at Dynamicweb.Ecommerce.ProductCatalog.ViewEngine.GetDefaultImage(MediaViewModelSettings settings, Product product, Lazy`1 productImages, Lazy`1 details) at Dynamicweb.Ecommerce.ProductCatalog.ViewEngine.<>c__DisplayClass3_2.<BulkCreateView>b__62() at System.Lazy`1.CreateValue() at System.Lazy`1.LazyInitValue() at CompiledRazorTemplates.Dynamic.RazorEngine_e605a36a66c94ecfa7d194c519a14171.<>c__DisplayClass0_0.<RenderAddons>b__0(TextWriter __razor_helper_writer) in D:\Dynamicweb.net\Solutions\Consit\Buhl-Prod\Files\Templates\Designs\Swift\Paragraph\Swift_ProductAddToCart.cshtml:line 543 at CompiledRazorTemplates.Dynamic.RazorEngine_e605a36a66c94ecfa7d194c519a14171.Execute() in D:\Dynamicweb.net\Solutions\Consit\Buhl-Prod\Files\Templates\Designs\Swift\Paragraph\Swift_ProductAddToCart.cshtml:line 495 at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader) at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag) at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.<RunCompile>b__0(TextWriter writer) at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter) at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template) at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template) at Dynamicweb.Rendering.Template.RenderRazorTemplate()
1 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.ParagraphViewModel> 2 @using Dynamicweb.Ecommerce.ProductCatalog 3 @using Dynamicweb.Core.Encoders 4 5 @{ 6 ProductViewModel product = null; 7 if (Dynamicweb.Context.Current.Items.Contains("ProductDetails")) 8 { 9 product = (ProductViewModel)Dynamicweb.Context.Current.Items["ProductDetails"]; 10 } 11 else if (Pageview.Page.Item["DummyProduct"] != null && Pageview.IsVisualEditorMode) 12 { 13 var pageViewModel = Dynamicweb.Frontend.ContentViewModelFactory.CreatePageInfoViewModel(Pageview.Page); 14 ProductListViewModel productList = pageViewModel.Item.GetValue("DummyProduct") != null ? pageViewModel.Item.GetValue("DummyProduct") as ProductListViewModel : new ProductListViewModel(); 15 16 if (productList?.Products is object) 17 { 18 product = productList.Products[0]; 19 } 20 } 21 22 string anonymousUsersLimitations = Pageview.AreaSettings.GetRawValueString("AnonymousUsers", ""); 23 bool anonymousUser = Pageview.User == null; 24 bool isErpConnectionDown = !Dynamicweb.Core.Converter.ToBoolean(Dynamicweb.Context.Current.Items["IsWebServiceConnectionAvailable"]); 25 bool hideAddToCart = anonymousUsersLimitations.Contains("cart") && anonymousUser || Pageview.AreaSettings.GetBoolean("ErpDownHideAddToCart") && isErpConnectionDown; 26 hideAddToCart = Pageview.IsVisualEditorMode ? false : hideAddToCart; 27 28 string noPrice = ""; 29 string customProductRelationGroup = ""; 30 Dictionary<string, FieldValueViewModel> fields = product.ProductFields; 31 32 foreach (var field in fields) 33 { 34 if (field.Value.SystemName == "NoPrice") 35 { 36 noPrice = field.Value?.Value != null ? field.Value.Value.ToString() : ""; 37 } 38 if (field.Value.SystemName == "CustomProductRelationGroup") 39 { 40 customProductRelationGroup = field.Value?.Value != null ? field.Value.Value.ToString() : ""; 41 } 42 } 43 44 if (noPrice == "True") 45 { 46 hideAddToCart = true; 47 } 48 49 } 50 51 @if (product is object && !hideAddToCart) 52 { 53 string horizontalAlign = Model.Item.GetRawValueString("HorizontalAlignment", ""); 54 horizontalAlign = horizontalAlign == "center" ? "justify-content-center" : horizontalAlign; 55 horizontalAlign = horizontalAlign == "end" ? "justify-content-end" : horizontalAlign; 56 horizontalAlign = horizontalAlign == "full" ? "" : horizontalAlign; 57 58 bool favoritesSelector = !string.IsNullOrEmpty(Model.Item.GetString("ShowAddToFavorites")) ? Model.Item.GetBoolean("ShowAddToFavorites") : false; 59 bool quantitySelector = !string.IsNullOrEmpty(Model.Item.GetString("ShowQuantitySelector")) ? Model.Item.GetBoolean("ShowQuantitySelector") : false; 60 bool unitsSelector = !string.IsNullOrEmpty(Model.Item.GetString("ShowUnitsSelector")) ? Model.Item.GetBoolean("ShowUnitsSelector") : false; 61 bool hideInventory = !string.IsNullOrEmpty(Model.Item.GetString("HideInventory")) ? Model.Item.GetBoolean("HideInventory") : false; 62 bool hideStockState = !string.IsNullOrEmpty(Model.Item.GetString("HideStockState")) ? Model.Item.GetBoolean("HideStockState") : false; 63 64 string buttonSize = Model.Item.GetRawValueString("ButtonSize", "regular"); 65 string inputSize = string.Empty; 66 67 68 switch (buttonSize) 69 { 70 case "small": 71 inputSize = " input-group-sm"; 72 buttonSize = " btn-sm"; 73 break; 74 case "regular": 75 buttonSize = string.Empty; 76 break; 77 case "large": 78 inputSize = " input-group-lg"; 79 buttonSize = " btn-lg"; 80 break; 81 } 82 83 string iconPath = "/Files/icons/"; 84 string url = "/Default.aspx?ID=" + (GetPageIdByNavigationTag("CartService")); 85 if (!url.Contains("LayoutTemplate")) 86 { 87 url += url.Contains("?") ? "&LayoutTemplate=Swift_MiniCart.cshtml" : "?LayoutTemplate=Swift_MiniCart.cshtml"; 88 } 89 90 string whenVariantsExist = Model.Item.GetRawValueString("WhenVariantsExist", "hide"); 91 string flexFill = Model.Item.GetRawValueString("HorizontalAlignment", "") == "full" ? "flex-fill" : ""; 92 string fullWidth = Model.Item.GetRawValueString("HorizontalAlignment", "") == "full" ? "w-100" : ""; 93 string addToCartIcon = Model.Item.GetRawValueString("Icon", iconPath + "shopping-cart.svg"); 94 string addToCartLabel = !addToCartIcon.Contains("_none") ? $"<span class=\"icon-2\">{ReadFile(addToCartIcon)}</span>" : ""; 95 addToCartLabel += !addToCartIcon.Contains("_none") && !Model.Item.GetBoolean("HideButtonText") ? " " : ""; 96 addToCartLabel += !Model.Item.GetBoolean("HideButtonText") ? $"<span class=\"d-none d-md-inline\">{Translate("Add to cart")}</span><span class=\"d-inline d-md-none\">{Translate("Add")}</span>" : ""; 97 bool isLazyLoadingForProductInfoEnabled = Dynamicweb.Core.Converter.ToBoolean(Dynamicweb.Context.Current.Items["IsLazyLoadingForProductInfoEnabled"]); 98 99 bool userHasPendingQuote = Dynamicweb.Ecommerce.Common.Context.Cart != null && Dynamicweb.Ecommerce.Common.Context.Cart.IsQuote; 100 101 if (product.VariantInfo.VariantInfo == null || whenVariantsExist == "disable") 102 { 103 string unitId = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("UnitId")) ? Dynamicweb.Context.Current.Request.Form.Get("UnitId") : product.DefaultUnitId; 104 if (string.IsNullOrEmpty(unitId) && product?.UnitOptions != null) 105 { 106 if (product.UnitOptions.FirstOrDefault<UnitOptionViewModel>() != null) 107 { 108 unitId = product.UnitOptions.FirstOrDefault<UnitOptionViewModel>().Id; 109 } 110 } 111 112 double? stepQty = product.PurchaseQuantityStep > 0 ? product.PurchaseQuantityStep : 1; 113 double? minQty = product.PurchaseMinimumQuantity > 0 ? product.PurchaseMinimumQuantity : 1; 114 double? valueQty = minQty > stepQty ? minQty : stepQty; 115 string disableAddToCart = null; 116 double? maxQty = null; 117 118 product.NeverOutOfstock = true; // Always in stock 119 120 if (product.ProductType == Dynamicweb.Ecommerce.Products.ProductType.Stock && !product.NeverOutOfstock) 121 { 122 disableAddToCart = (product.StockLevel <= 0) || (!product.NeverOutOfstock && isLazyLoadingForProductInfoEnabled) ? "disabled" : disableAddToCart; 123 maxQty = product.StockLevel; 124 } 125 126 disableAddToCart = whenVariantsExist == "disable" && product.VariantInfo.VariantInfo != null && string.IsNullOrEmpty(product.VariantId) ? "disabled" : disableAddToCart; 127 128 disableAddToCart = "";// Always posible to add to cart 129 string imagePathHidden = product?.DefaultImage.Value.ToString() ?? ""; 130 imagePathHidden = "/Admin/Public/GetImage.ashx?image=" + imagePathHidden + "&width=" + 350 + "&Format=WebP&Quality=70"; 131 132 if (unitsSelector && product.UnitOptions.Count > 0) 133 { 134 <form method="post" action="/Default.aspx?ID=@(Pageview.Page.ID)&ProductId=@product.Id" id="UnitSelectorForm_@(product.Id)_@(product.VariantId.Replace(".", "_"))_@Model.ID"> 135 <input type="hidden" name="redirect" value="false"> 136 <input type="hidden" name="VariantID" value="@product.VariantId"> 137 <input type="hidden" name="UnitID" class="js-unit-id" value="@unitId"> 138 </form> 139 } 140 141 <div class="d-flex @horizontalAlign @fullWidth js-input-group item_@Model.Item.SystemName.ToLower()"> 142 <form method="post" action="@url" class="@fullWidth" style="z-index: 1"> 143 <input type="hidden" name="redirect" value="false"> 144 <input type="hidden" name="ProductId" value="@product.Id"> 145 <input type="hidden" name="ProductName" value="@HtmlEncoder.HtmlEncode(product.Name)"> 146 <input type="hidden" name="ProductVariantName" value="@product.VariantName"> 147 <input type="hidden" name="ProductCurrency" value="@Dynamicweb.Ecommerce.Common.Context.Currency.Code"> 148 <input type="hidden" name="ProductPrice" value="@product.Price.PriceFormatted"> 149 <input type="hidden" name="ProductImage" value="@imagePathHidden"> 150 <input type="hidden" name="ProductReferer" value="component_ProductAddToCart"> 151 <input type="hidden" name="cartcmd" value="add"> 152 <input type="submit" class="d-none" onclick="event.preventDefault(); swift.Cart.Update(event);"> @* Fix for enterKey should not redirect to minicart page *@ 153 @{ 154 string cartUrl = "/Default.aspx?ID=" + (GetPageIdByNavigationTag("EasyFlowCart")); 155 double totalAddedPrice = 0; 156 } 157 <input type="hidden" name="cartpage" value="@cartUrl"> 158 <input type="hidden" name="ProductUnit" value="@Translate("stk.", "stk.")"> 159 160 @if (!string.IsNullOrEmpty(product.VariantId)) 161 { 162 <input type="hidden" name="VariantId" value="@product.VariantId"> 163 } 164 165 <template class="js-step-quantity-warning"> 166 <div class="modal-header"> 167 <h1 class="modal-title fs-5">@Translate("The quantity is not valid")</h1> 168 <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> 169 </div> 170 <div class="modal-body"> 171 @Translate("Please select a quantity that is dividable by") @stepQty 172 </div> 173 </template> 174 175 176 <template class="js-min-quantity-warning"> 177 <div class="modal-header"> 178 <h1 class="modal-title fs-5">@Translate("The product could not be added to the cart")</h1> 179 <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> 180 </div> 181 <div class="modal-body"> 182 @Translate("The quantity is not valid. You must buy at least") @product.PurchaseMinimumQuantity 183 </div> 184 </template> 185 186 187 @if (userHasPendingQuote) 188 { 189 <input type="hidden" name="PendingQuote" value="true"> 190 191 <template class="js-pending-quote-notice"> 192 <div class="modal-header"> 193 <h1 class="modal-title fs-5">@Translate("Pending Quote")</h1> 194 <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="@Translate("Close")"></button> 195 </div> 196 <div class="modal-body"> 197 @Translate("You need to complete your current quote or empty the cart before adding this product to cart.") 198 </div> 199 </template> 200 } 201 202 @if (quantitySelector || (!anonymousUser && product.VariantInfo.VariantInfo != null) || (!anonymousUser && favoritesSelector)) 203 { 204 <input type="hidden" id="Unit_@(product.Id.Replace(" ", "_"))_@product.VariantId.Replace(".", "_")" name="UnitID" value="@unitId" /> 205 } 206 207 <div class="d-flex flex-row w-100"> 208 @if (!quantitySelector) 209 { 210 <input id="Quantity_@(product.Id.Replace(" ", "_"))_@product.VariantId.Replace(".", "_")" class="swift_quantity_field" name="Quantity" value="@valueQty" type="hidden" @disableAddToCart> 211 } 212 213 @if (unitsSelector && product.UnitOptions.Count > 0) 214 { 215 string selectedUnitName = !string.IsNullOrEmpty(unitId) && product?.UnitOptions != null ? unitId : product.UnitOptions.FirstOrDefault<UnitOptionViewModel>().Name; 216 217 foreach (var unitOption in product.UnitOptions) 218 { 219 if (unitOption.Id == unitId) 220 { 221 selectedUnitName = unitOption.Name; 222 } 223 } 224 225 <div class="d-flex flex-column gap-2 w-100"> 226 <div class="input-group input-primary-button-group flex-nowrap@(inputSize)"> 227 @if (!anonymousUser && favoritesSelector) 228 { 229 @RenderPartial("Components/ToggleFavorite.cshtml", product) 230 } 231 232 @if (quantitySelector) 233 { 234 <input id="Quantity_@(product.Id.Replace(" ", "_"))_@product.VariantId.Replace(".", "_")" name="Quantity" value="@valueQty" step="@stepQty" min="@minQty" max="@maxQty" class="form-control swift_quantity-field" style="min-width: 80px; max-width: 100px; z-index: 1" type="number" @disableAddToCart> 235 } 236 237 <button class="btn btn-secondary @flexFill dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false"> 238 @selectedUnitName 239 </button> 240 241 <ul class="dropdown-menu swift_unit-field"> 242 @foreach (var unitOption in product.UnitOptions) 243 { 244 var selectedUnit = unitOption.Id == unitId ? "selected" : ""; 245 246 <li> 247 <button type="button" class="btn dropdown-item" data-value="@unitOption.Id" onclick="document.querySelector('#UnitSelectorForm_@(product.Id)_@(product.VariantId.Replace(".", "_"))_@Model.ID').querySelector('.js-unit-id').value = this.getAttribute('data-value'); 248 document.querySelector('#Unit_@(product.Id)_@product.VariantId.Replace(".", "_")').value = this.getAttribute('data-value'); 249 swift.PageUpdater.Update(document.querySelector('#UnitSelectorForm_@(product.Id)_@(product.VariantId.Replace(".", "_"))_@Model.ID'));"> 250 <span>@unitOption.Name</span> 251 <span> 252 @if (unitOption.StockLevel > 0 || unitOption.NeverOutOfStock) 253 { 254 if (!Model.Item.GetBoolean("HideInventory") && !unitOption.NeverOutOfStock) 255 { 256 <span class="small text-success">@unitOption.StockLevel @Translate("In stock")</span> 257 } 258 else 259 { 260 <span class="small text-success">@Translate("In stock")</span> 261 } 262 } 263 else 264 { 265 <span class="small text-danger">@Translate("Out of Stock")</span> 266 } 267 </span> 268 </button> 269 </li> 270 } 271 </ul> 272 </div> 273 <button type="button" onclick="swift.Cart.Update(event)" data-container="product" class="btn btn-primary @(buttonSize) js-add-to-cart-button addToCart" style="white-space: nowrap" @disableAddToCart title="@Translate("Add to cart")" id="AddToCartButton@(product.Id)_@Pageview.CurrentParagraph.ID"> 274 @if (!Model.Item.GetBoolean("HideButtonText")) 275 { 276 <span class="text-nowrap d-flex align-items-center justify-content-center gap-2"> 277 @addToCartLabel 278 </span> 279 } 280 else 281 { 282 @addToCartLabel 283 } 284 </button> 285 </div> 286 } 287 else 288 { 289 if (!anonymousUser && favoritesSelector) 290 { 291 @RenderPartial("Components/ToggleFavorite.cshtml", product) 292 } 293 294 <div class="input-group input-primary-button-group flex-nowrap@(inputSize)"> 295 @if (quantitySelector) 296 { 297 <input id="Quantity_@(product.Id.Replace(" ", "_"))_@product.VariantId.Replace(".", "_")" name="Quantity" value="@valueQty" step="@stepQty" min="@minQty" max="@maxQty" class="form-control swift_quantity-field" style="min-width: 60px; max-width: 100px; z-index: 1" type="number" @disableAddToCart> 298 } 299 300 <button type="button" onclick="swift.Cart.Update(event)" data-container="product" class="btn btn-primary @(buttonSize) @flexFill js-add-to-cart-button addToCart" style="white-space: nowrap" @disableAddToCart title="@Translate("Add to cart")" id="AddToCartButton@(product.Id)_@Pageview.CurrentParagraph.ID"> 301 @if (!Model.Item.GetBoolean("HideButtonText")) 302 { 303 <span class="text-nowrap d-flex align-items-center justify-content-center gap-2"> 304 @addToCartLabel 305 </span> 306 } 307 else 308 { 309 @addToCartLabel 310 } 311 </button> 312 </div> 313 } 314 </div> 315 </form> 316 </div> 317 } 318 else if (whenVariantsExist == "modal") 319 { 320 string ButtonShape = Model.Item.GetRawValueString("VariantButtonShape", "square"); 321 string buttonAspectRatio = Model.Item.GetRawValueString("VariantImageAspectRatio", "56%"); 322 323 string buttonText = Translate("Select"); 324 string variantId = !string.IsNullOrWhiteSpace(product.VariantId) ? product.VariantId : product.DefaultVariantId; 325 326 string variantSelectorServicePageId = !string.IsNullOrEmpty(Model.Item.GetString("VariantSelectorServicePageId")) ? Model.Item.GetLink("VariantSelectorServicePageId").PageId.ToString() : ""; 327 variantSelectorServicePageId = variantSelectorServicePageId != "" ? variantSelectorServicePageId : GetPageIdByNavigationTag("VariantSelectorService").ToString(); 328 329 <div class="d-flex @horizontalAlign w-100 item_@Model.Item.SystemName.ToLower()"> 330 @if (!anonymousUser && favoritesSelector) 331 { 332 @RenderPartial("Components/ToggleFavorite.cshtml", product) 333 } 334 <form action="/Default.aspx?ID=@variantSelectorServicePageId" data-response-target-element="DynamicModalContent" data-preloader="inline" style="z-index: 1" class="@fullWidth"> 335 <input type="hidden" name="ProductID" value="@product.Id"> 336 <input type="hidden" name="VariantID" value="@variantId"> 337 <input type="hidden" name="QuantitySelector" value="@quantitySelector.ToString()"> 338 <input type="hidden" name="HideInventory" value="@hideInventory.ToString()"> 339 <input type="hidden" name="HideStockState" value="@hideStockState.ToString()"> 340 <input type="hidden" name="ButtonLayout" value="@ButtonShape"> 341 <input type="hidden" name="ButtonAspectRatio" value="@buttonAspectRatio"> 342 <input type="hidden" name="VariantSelectorServicePage" value="@variantSelectorServicePageId"> 343 <input type="hidden" name="ViewType" value="ModalContent"> 344 @if (isLazyLoadingForProductInfoEnabled) 345 { 346 @* If lazy loading is enabled, bypass it because we're loading a modal window, so render everything as if it was server-side *@ 347 <input type="hidden" name="getproductinfo" value="true"> 348 } 349 <button type="button" onclick="swift.PageUpdater.Update(event)" class="btn btn-primary@(buttonSize) @fullWidth" title="@Translate("Select")" data-bs-toggle="modal" data-bs-target="#DynamicModal" id="OpenVariantSelectorModal@(product.Id)_@Pageview.CurrentParagraph.ID">@buttonText</button> 350 </form> 351 </div> 352 } 353 } 354 else if (noPrice == "True") 355 { 356 357 string contactPageUrl = "/Default.aspx?ID=" + (GetPageIdByNavigationTag("contact-page")); 358 359 <a href="@(contactPageUrl)" type="button" class="w-100 btn btn-secondary flex-fill view-contact-page-button" title="@Translate("Kontakt os for pris")">@Translate("Kontakt os for pris")</a> 360 } 361 362 else if (Pageview.IsVisualEditorMode) 363 { 364 <div class="alert alert-dark m-0">@Translate("No products available")</div> 365 } 366 367 @if (!Dynamicweb.Context.Current.Items.Contains("ProductList")) 368 { 369 <div id="p_cartNotificationModalProduct" class="modal" tabindex="-1" aria-labelledby="p_cartNotificationModalProductTitel" aria-hidden="true"> 370 @{ 371 string modelId = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("ModelID")) ? Dynamicweb.Context.Current.Request.Form.Get("ModelID") : product.Id; 372 373 string scrollBarForceMobile = Dynamicweb.Context.Current.Request.Form.Get("NavigationShowScrollbar") != string.Empty ? "--swiffy-slider-track-height:0.5rem !important;" : string.Empty; 374 bool hideSliderNavigation = false; 375 376 int itemsShown = 3; 377 378 string imageTheme = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("ImageTheme")) ? Dynamicweb.Context.Current.Request.Form.Get("ImageTheme") : ""; 379 string imageOutlineStyle = imageTheme == string.Empty ? "border: 1px solid transparent;" : string.Empty; 380 string imageThemePadding = imageTheme != string.Empty ? "p-3" : string.Empty; 381 382 string imagePath = product?.DefaultImage.Value.ToString() ?? ""; 383 imagePath = "/Admin/Public/GetImage.ashx?image=" + imagePath + "&width=" + 350 + "&Format=WebP&Quality=70"; 384 385 string ratio = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("ImageAspectRatio")) ? Dynamicweb.Context.Current.Request.Form.Get("ImageAspectRatio") : ""; 386 string ratioCssClass = ratio != "" ? "ratio" : ""; 387 string ratioVariable = ratio != "" ? "--bs-aspect-ratio: " + ratio : ""; 388 389 string saleBadgeType = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("SaleBadgeType")) ? Dynamicweb.Context.Current.Request.Form.Get("SaleBadgeType") : ""; 390 string saleBadgeCssClassName = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("SaleBadgeCssClassName")) ? Dynamicweb.Context.Current.Request.Form.Get("SaleBadgeCssClassName") : ""; 391 string newBadgeCssClassName = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("NewBadgeCssClassName")) ? Dynamicweb.Context.Current.Request.Form.Get("NewBadgeCssClassName") : ""; 392 int newPublicationDays = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("NewPublicationDays")) ? Convert.ToInt32(Dynamicweb.Context.Current.Request.Form.Get("NewPublicationDays")) : 0; 393 string campaignBadgesValues = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("CampaignBadgesValues")) ? Dynamicweb.Context.Current.Request.Form.Get("CampaignBadgesValues") : ""; 394 395 var badgeParms = new Dictionary<string, object>(); 396 badgeParms.Add("saleBadgeType", saleBadgeType); 397 badgeParms.Add("saleBadgeCssClassName", saleBadgeCssClassName); 398 badgeParms.Add("newBadgeCssClassName", newBadgeCssClassName); 399 badgeParms.Add("campaignBadgesValues", campaignBadgesValues); 400 badgeParms.Add("newPublicationDays", newPublicationDays); 401 402 bool saleBadgeEnabled = !string.IsNullOrWhiteSpace(saleBadgeCssClassName) && saleBadgeCssClassName != "none" ? true : false; 403 bool newBadgeEnabled = !string.IsNullOrWhiteSpace(newBadgeCssClassName) && newBadgeCssClassName != "none" ? true : false; 404 DateTime createdDate = product.Created.Value; 405 406 bool showBadges = saleBadgeEnabled && product.Discount.Price != 0 ? true : false; 407 showBadges = (newBadgeEnabled && newPublicationDays == 0) || (newBadgeEnabled && (createdDate.AddDays(newPublicationDays) > DateTime.Now)) ? true : showBadges; 408 showBadges = !string.IsNullOrEmpty(campaignBadgesValues) ? true : showBadges; 409 410 Dynamicweb.Frontend.LinkViewModel checkoutAnonymousPageId = Model.Item.GetLink("CheckoutAnonymousPageLink"); 411 string checkoutAnonymousPageUrl = checkoutAnonymousPageId?.Url; 412 Dynamicweb.Frontend.LinkViewModel checkoutUserPageId = Model.Item.GetLink("CheckoutUserPageLink"); 413 string checkoutUserPageUrl = checkoutUserPageId?.Url; 414 string checkoutUrl = Pageview.User == null ? checkoutAnonymousPageUrl : checkoutUserPageUrl; 415 int quoteCheckoutPageLink = Model.Item?.GetLink("QuoteCheckoutPageLink") != null ? Model.Item.GetLink("QuoteCheckoutPageLink").PageId : 0; 416 417 string orderId = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString.Get("OrderID")) ? Dynamicweb.Context.Current.Request.QueryString.Get("OrderID") : ""; 418 string OrderUrl = !string.IsNullOrEmpty(orderId) ? $"/Default.aspx?OrderID={orderId}" : "/Default.aspx"; 419 var productCounter = 1; 420 421 bool relatedExist = false; 422 string modalProductCon = ""; 423 string modalProductSize = ""; 424 foreach (var relatedGroup in product.RelatedGroups) 425 { 426 if (relatedGroup.Name == customProductRelationGroup) 427 { 428 if (relatedGroup.Products.Count > 0) 429 { 430 relatedExist = true; 431 modalProductCon = "col-xl-7"; 432 } 433 } 434 } 435 436 modalProductSize = relatedExist ? "xl" : "lg"; 437 438 } 439 440 <div class="modal-dialog theme light modal-@modalProductSize"> 441 <div class="modal-content rounded-0 container"> 442 <div class="row"> 443 <div class="col-12 @modalProductCon p-0 border-bottom border-lg-none"> 444 <div class="modal-header w-100 text-center"> 445 <h3 class="modal-title w-100" id="p_cartNotificationModalProductTitel">@Translate("Products added to cart")</h3> 446 <button type="button" class="btn-close position-absolute m-0 end-0 me-3 d-block d-xl-none" data-bs-dismiss="modal" aria-label="Close"></button> 447 </div> 448 <div id="p_cartNotificationModalBody" class="modal-body"> 449 <div class="container-fluid"> 450 <div class="row"> 451 <div class="@(imageTheme) col-12" style="@imageOutlineStyle"> 452 <div class="@(ratioCssClass) col-4 col-xl-6 m-auto position-relative" style="@ratioVariable"> 453 @if (showBadges) 454 { 455 <div class="position-absolute top-0 left-0 p-1 p-lg-2" style="z-index: 2"> 456 @{ 457 @RenderPartial("Components/EcommerceBadge.cshtml", product, badgeParms) 458 } 459 </div> 460 } 461 <img loading="lazy" decoding="async" src="@imagePath" class="h-100 w-100 @(imageThemePadding)" style="object-fit: contain;" alt="@product.Name" id="p_cartNotificationModalProduct_Image"> 462 </div> 463 </div> 464 <div class="d-flex flex-wrap py-3 col-12 gap-md-3"> 465 <div class="col-12 col-md-auto info"> 466 <div class="fc-dark efa-mod"><strong id="p_cartNotificationModalProduct_Name"></strong></div> 467 <div class="fs-5 fw-bold fc-dark efa-mod" id="p_cartNotificationModalProduct_Price"></div> 468 <div id="p_cartNotificationModalProduct_Quantity"></div> 469 </div> 470 <div class="col-12 col-lg action align-self-end"> 471 <div class="col-12 d-flex mt-3"> 472 <a id="p_cartNotificationModalProduct_Button" class="btn btn-primary flex-fill" href="">@Translate("GoToCart", "GoToCart")</a> 473 </div> 474 </div> 475 </div> 476 </div> 477 </div> 478 </div> 479 </div> 480 @if (relatedExist) 481 { 482 <div class="col-12 col-xl-5 p-0"> 483 <div class="modal-header w-100 text-center"> 484 <h3 class="modal-title text-center w-100">@Translate("ModalProductRelation")</h3> 485 <button type="button" class="btn-close position-absolute m-0 end-0 me-3 d-none d-xl-block" data-bs-dismiss="modal" aria-label="Close"></button> 486 </div> 487 <div class="modal-body"> 488 <div id="addonsList" class="list grid gap-3 overflow-auto"> 489 @{ 490 foreach (RelatedGroupViewModel relatedGroup in product.RelatedGroups.Where(x => x.Name == customProductRelationGroup)) 491 { 492 foreach (ProductInfoViewModel relatedProduct in relatedGroup.Products) 493 { 494 <div class="elements g-col-12 g-col-xl-12 py-4 align-self-end"> 495 @RenderAddons(relatedProduct, productCounter) 496 </div> 497 productCounter += 1; 498 } 499 } 500 } 501 502 </div> 503 </div> 504 </div> 505 } 506 </div> 507 </div> 508 </div> 509 </div> 510 } 511 512 @helper RenderAddons(ProductInfoViewModel relatedProduct, int productCounter) 513 { 514 var relProduct = relatedProduct.GetProduct(); 515 string anonymousUsersLimitations = Pageview.AreaSettings.GetRawValueString("AnonymousUsers", ""); 516 bool anonymousUser = Pageview.User == null; 517 bool hidePrice = anonymousUsersLimitations.Contains("price") && anonymousUser || Pageview.AreaSettings.GetBoolean("ErpDownHidePrices") && !Dynamicweb.Ecommerce.DynamicwebLiveIntegration.TemplatesHelper.IsWebServiceConnectionAvailable(); 518 bool showFavoritesSelectorMasterProduct = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("ShowFavoritesSelectorMasterProduct")) ? Convert.ToBoolean(Dynamicweb.Context.Current.Request.Form.Get("ShowFavoritesSelectorMasterProduct")) : false; 519 string ratio = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("ImageAspectRatio")) ? Dynamicweb.Context.Current.Request.Form.Get("ImageAspectRatio") : ""; 520 string ratioCssClass = ratio != "" ? "ratio" : ""; 521 string ratioVariable = ratio != "" ? "--bs-aspect-ratio: " + ratio : ""; 522 bool relProductQuantitySelector = !string.IsNullOrEmpty(Model.Item.GetString("ShowQuantitySelector")) ? Model.Item.GetBoolean("ShowQuantitySelector") : false; 523 524 string theme = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("Theme")) ? Dynamicweb.Context.Current.Request.Form.Get("Theme") : ""; 525 string themePadding = theme != string.Empty ? "p-3" : string.Empty; 526 string imageTheme = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("ImageTheme")) ? Dynamicweb.Context.Current.Request.Form.Get("ImageTheme") : ""; 527 string imageOutlineStyle = imageTheme == string.Empty ? "border: 1px solid transparent;" : string.Empty; 528 string imageThemePadding = imageTheme != string.Empty ? "p-3" : string.Empty; 529 string ContentPadding = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("ContentPadding")) ? Dynamicweb.Context.Current.Request.Form.Get("ContentPadding") : ""; 530 531 string showPricesWithVat = Pageview.Area.EcomPricesWithVat.ToLower(); 532 bool neverShowVat = string.IsNullOrEmpty(showPricesWithVat); 533 534 string variantIdForLink = !string.IsNullOrEmpty(relProduct.VariantId) ? $"&VariantID={relProduct.VariantId}" : ""; 535 variantIdForLink = string.IsNullOrEmpty(variantIdForLink) && !string.IsNullOrEmpty(relProduct.DefaultVariantId) ? $"&VariantID={relProduct.DefaultVariantId}" : variantIdForLink; 536 537 string link = "Default.aspx?ID=" + GetPageIdByNavigationTag("Shop"); 538 link += $"&GroupID={relProduct.PrimaryOrDefaultGroup.Id}"; 539 link += $"&ProductID={relProduct.Id}"; 540 link += variantIdForLink; 541 link = Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(link); 542 543 string imagePath = relProduct?.DefaultImage.Value.ToString() ?? ""; 544 imagePath = "/Admin/Public/GetImage.ashx?image=" + imagePath + "&width=" + 350 + "&Format=WebP&Quality=70"; 545 546 string saleBadgeType = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("SaleBadgeType")) ? Dynamicweb.Context.Current.Request.Form.Get("SaleBadgeType") : ""; 547 string saleBadgeCssClassName = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("SaleBadgeCssClassName")) ? Dynamicweb.Context.Current.Request.Form.Get("SaleBadgeCssClassName") : ""; 548 string newBadgeCssClassName = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("NewBadgeCssClassName")) ? Dynamicweb.Context.Current.Request.Form.Get("NewBadgeCssClassName") : ""; 549 int newPublicationDays = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("NewPublicationDays")) ? Convert.ToInt32(Dynamicweb.Context.Current.Request.Form.Get("NewPublicationDays")) : 0; 550 string campaignBadgesValues = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("CampaignBadgesValues")) ? Dynamicweb.Context.Current.Request.Form.Get("CampaignBadgesValues") : ""; 551 552 var badgeParms = new Dictionary<string, object>(); 553 badgeParms.Add("saleBadgeType", saleBadgeType); 554 badgeParms.Add("saleBadgeCssClassName", saleBadgeCssClassName); 555 badgeParms.Add("newBadgeCssClassName", newBadgeCssClassName); 556 badgeParms.Add("campaignBadgesValues", campaignBadgesValues); 557 badgeParms.Add("newPublicationDays", newPublicationDays); 558 559 bool saleBadgeEnabled = !string.IsNullOrWhiteSpace(saleBadgeCssClassName) && saleBadgeCssClassName != "none" ? true : false; 560 bool newBadgeEnabled = !string.IsNullOrWhiteSpace(newBadgeCssClassName) && newBadgeCssClassName != "none" ? true : false; 561 DateTime createdDate = relProduct.Created.Value; 562 bool showBadges = saleBadgeEnabled && relProduct.Discount.Price != 0 ? true : false; 563 showBadges = (newBadgeEnabled && newPublicationDays == 0) || (newBadgeEnabled && (createdDate.AddDays(newPublicationDays) > DateTime.Now)) ? true : showBadges; 564 showBadges = !string.IsNullOrEmpty(campaignBadgesValues) ? true : showBadges; 565 566 string iconPath = "/Files/icons/"; 567 string addToCartIcon = Model.Item.GetRawValueString("Icon", iconPath + "shopping-cart.svg"); 568 string addToCartLabel = !addToCartIcon.Contains("_none") ? "<span class=\"icon-2\">" + ReadFile(addToCartIcon) + "</span>" : ""; 569 addToCartLabel += !addToCartIcon.Contains("_none") && !Model.Item.GetBoolean("HideButtonText") ? " " : ""; 570 addToCartLabel += !Model.Item.GetBoolean("HideButtonText") ? Translate("Add to cart") : ""; 571 string flexFill = Model.Item.GetRawValueString("HorizontalAlignment", "") == "full" ? "flex-fill" : ""; 572 string buttonSize = Model.Item.GetRawValueString("ButtonSize", "regular"); 573 string inputSize = string.Empty; 574 575 string url = "/Default.aspx?ID=" + (GetPageIdByNavigationTag("EasyFlowCart")); 576 if (!url.Contains("LayoutTemplate")) 577 { 578 url += url.Contains("?") ? "&LayoutTemplate=Swift_MiniCart.cshtml" : "?LayoutTemplate=Swift_MiniCart.cshtml"; 579 } 580 string cartUrl = "/Default.aspx?ID=" + (GetPageIdByNavigationTag("EasyFlowCart")); 581 string imagePathHidden = relProduct?.DefaultImage.Value.ToString() ?? ""; 582 imagePathHidden = "/Admin/Public/GetImage.ashx?image=" + imagePathHidden + "&width=" + 350 + "&Format=WebP&Quality=70"; 583 584 switch (buttonSize) 585 { 586 case "small": 587 inputSize = " input-group-sm"; 588 buttonSize = " btn-sm"; 589 break; 590 case "regular": 591 buttonSize = string.Empty; 592 break; 593 case "large": 594 inputSize = " input-group-lg"; 595 buttonSize = " btn-lg"; 596 break; 597 } 598 599 var currency = Dynamicweb.Ecommerce.Common.Context.Currency.Code; 600 601 double? stepQty = relProduct.PurchaseQuantityStep > 0 ? relProduct.PurchaseQuantityStep : 1; 602 double? minQty = relProduct.PurchaseMinimumQuantity > 0 ? relProduct.PurchaseMinimumQuantity : 1; 603 double? valueQty = minQty > stepQty ? minQty : stepQty; 604 605 <div class="element w-100 d-flex"> 606 607 <div class="w-100 row m-0 align-items-end"> 608 <div class="product-info col ps-lg-0"> 609 <div class="col-6 col-xl-12 m-auto m-xl-0 pe-2"> 610 <img class="h-100 w-100" src="@imagePath" alt="" style="object-fit: cover;" /> 611 </div> 612 <div> 613 <div class="related-name-wrap"><strong>@relProduct.Name</strong></div> 614 @if (!hidePrice) 615 { 616 <div> 617 <p class="h6 m-0"> 618 @if (showPricesWithVat == "false" && !neverShowVat) 619 { 620 if (relProduct.Price.Price != relProduct.PriceBeforeDiscount.Price) 621 { 622 <span class="text-decoration-line-through opacity-75 me-1"> 623 @relProduct.PriceBeforeDiscount.PriceWithoutVatFormatted 624 </span> 625 } 626 } 627 else 628 { 629 if (relProduct.Price.Price != relProduct.PriceBeforeDiscount.Price) 630 { 631 <span class="text-decoration-line-through opacity-75 me-1"> 632 @relProduct.PriceBeforeDiscount.PriceFormatted 633 </span> 634 } 635 } 636 637 @if (showPricesWithVat == "false" && !neverShowVat) 638 { 639 <span class="text-price fw-bold">@relProduct.Price.PriceWithoutVatFormatted</span> 640 } 641 else 642 { 643 <span class="text-price fw-bold">@relProduct.Price.PriceFormatted</span> 644 } 645 </p> 646 647 @*<div class="fs-8 mt-1"> 648 @if (!string.IsNullOrWhiteSpace(relProduct.StockStatus)) 649 { 650 <p class="m-0">@relProduct.StockStatus</p> 651 } 652 @if (!string.IsNullOrWhiteSpace(relProduct.StockDeliveryText)) 653 { 654 <p class="m-0">@relProduct.StockDeliveryText</p> 655 } 656 </div>*@ 657 658 @if (showPricesWithVat == "false" && !neverShowVat) 659 { 660 <small class="opacity-85 fst-normal">@relProduct.Price.PriceWithVatFormatted @Translate("Incl. VAT")</small> 661 } 662 663 </div> 664 } 665 </div> 666 </div> 667 <div class="action col-auto px-3 ps-lg-0 w-100 w-lg-auto"> 668 <form method="post" action="@url"> 669 <input type="hidden" name="redirect" value="false"> 670 <input type="hidden" name="ProductId" value="@relProduct.Id"> 671 <input type="hidden" name="ProductName" value="@relProduct.Name"> 672 <input type="hidden" name="ProductCurrency" value="@Dynamicweb.Ecommerce.Common.Context.Currency.Code"> 673 <input type="hidden" name="ProductReferer" value="product_list_listview"> 674 <input type="hidden" name="ProductPrice" value="@relProduct.Price.PriceFormatted"> 675 <input type="hidden" name="cartcmd" value="add"> 676 <input type="hidden" name="ProductPriceFormatted" value="@relProduct.Price.PriceFormatted"> 677 <input type="hidden" name="ProductUnit" value="@Translate("stk.", "stk.")"> 678 <input type="hidden" name="ProductTotalText" value="@Translate("I alt", "I alt")"> 679 <input type="hidden" name="ProductImage" value="@imagePathHidden"> 680 <input type="hidden" name="cartpage" value="@cartUrl"> 681 682 <div class="input-group input-primary-button-group flex-nowrap"> 683 @if (relProductQuantitySelector) 684 { 685 <input id="Quantity_@(relProduct.Id.Replace(" ", "_"))_@relProduct.VariantId.Replace(".", "_")" name="Quantity" value="@valueQty" step="@stepQty" min="@minQty" class="form-control swift_quantity-field" style="min-width: 80px; max-width: 100px; z-index: 1" type="number"> 686 } 687 688 <a onclick="swift.Cart.Update(event)" data-container="productRel" class="btn btn-primary @(buttonSize) @flexFill w-100 w-lg-auto flex-fill js-add-to-cart-button addToCart" style="white-space: nowrap" title="@Translate("Add to cart")" id="AddToCartButton@(relProduct.Id)_@Pageview.CurrentParagraph.ID"> 689 @if (!Model.Item.GetBoolean("HideButtonText")) 690 { 691 <span class="text-nowrap d-flex align-items-center justify-content-center gap-2"> 692 @addToCartLabel 693 </span> 694 } 695 else 696 { 697 @addToCartLabel 698 } 699 </a> 700 </div> 701 </form> 702 </div> 703 </div> 704 </div> 705 } 706 707 <script type="text/javascript"> 708 document.addEventListener("update.swift.cart", function (event) { 709 var e = event; 710 var button = "addToCart"; 711 var target = e.detail.parentEvent.target; 712 while (!target.classList.contains(button)) { 713 target = target.parentElement; 714 } 715 if (target.getAttribute("data-container") == "product") { 716 var cartNotificationProduct = document.querySelector("#p_cartNotificationModalProduct"); 717 var modalProduct = new bootstrap.Modal(cartNotificationProduct); 718 719 var data = Object.fromEntries(event.detail.formData.entries()); 720 721 document.querySelector("#p_cartNotificationModalProduct_Button").href = data.cartpage; 722 document.querySelector("#p_cartNotificationModalProduct_Quantity").innerHTML = data.Quantity + " " + data.ProductUnit; 723 document.querySelector("#p_cartNotificationModalProduct_Name").innerHTML = data.ProductName; 724 document.querySelector("#p_cartNotificationModalProduct_Price").innerHTML = data.ProductPrice; 725 document.querySelector("#p_cartNotificationModalProduct_Image").src = data.ProductImage; 726 document.querySelector("#p_cartNotificationModalProduct_Image").alt = data.ProductName; 727 if (document.querySelector("#p_cartNotificationModal_Related")) { 728 if (!document.querySelector("#p_cartNotificationModal_Related").classList.contains('d-md-block', 'd-lg-block', 'd-xl-block')) { 729 document.querySelector("#p_cartNotificationModal_Related").classList.add('d-md-block', 'd-lg-block', 'd-xl-block'); 730 } 731 } 732 modalProduct.show(); 733 } 734 735 let addonsListHeight = 0; 736 let addonList = document.querySelector("#addonsList"); 737 let addonListElems = addonList.children; 738 console.log(addonListElems); 739 if (addonListElems.length > 3) { 740 for (var i = 0; 3 > i; i++) { 741 console.log(addonListElems[i].clientHeight); 742 addonsListHeight = addonsListHeight + addonListElems[i].clientHeight + 16; 743 } 744 addonList.style.maxHeight = addonsListHeight + "px"; 745 } 746 }); 747 </script>
Levering
Bestil inden kl. 14:00, og vi sender samme dag, såfremt varen er på lager.
Kontakt os
-
Testo 191 T3, HACCP temp. datalogger, med lang bøjelig føler
- Præcis temperaturmåling i væsker og på overflader ved at bruge en lang, bøjelig føler
- Holdbar, robust, pålidelig tæt, selv efter udskiftning af batteriet
- Udskiftning af batteriet tager kun få sekunder, hvilket sparer tid og øger effektiviteten
- Samtidig programmering og aflæsning af flere HACCP-dataloggere via multifunktionskufferten
Certificeret af HACCP International, testo 191-T3 temperatur datalogger er ideel til effektiv temperaturovervågning i væsker eller på overflader som f.eks. på plader af frysetørringssystemer. Brug dataloggeren designet til fødevareproduktion til overvågning af pasteurisation-, sterilisation- og frysetørringsprocesser.
Læs mere om testo 191 autoklave dataloggere her
Produktbeskrivelse
Pasteurisering, sterilisering og frysetørring er nøgleprocesser i fødevareproduktion, når det gælder om at øge levetiden for fødevarer. Disse processer stiller ekstremt høje krav til den anvendte måleteknologi.
Vores pålidelige og robuste HACCP-temperatur datalogger understøtter dig i at overvåge disse processer effektivt.
Dette er hvad testo 191-T3 HACCP temperatur datalogger tilbyder
- Høj-præcision: Præcis HACCP-datalogger med lang, bøjelig temperaturføler (længde 775 mm, Ø 1.5 mm), læsehukommelse til 60.000 målinger
- Smalt design: med en diameter på 20 mm, loggerne er ideelle til brug i smalle genstande eller under trange forhold
- Robust og holdbart: materialer af høj kvalitet og nyskabende konstruktion gør HACCP-dataloggeren særdeles robust og holdbar. Takket være hermetisk forseglet måleteknologi i et separat rustfrit stålhus imponerer HACCP-dataloggeren med sin pålidelighed og maksimal robusthed
- Batteriskift på få sekunder: Det praktiske gevind gør det muligt at skrue batteriet på HACCP-dataloggeren, nemt og sikkert uden brug af værktøj
- Pålidelig tæt: HACCP-dataloggeren forbliver 100 % tæt, selv efter at batterierne er skiftet. Batterihuset er belagt med stærkt temperaturbestandigt polyetheretherketon (PEEK)
- Fleksibel højde: HACCP-dataloggerens størrelse kan variere med to forskellige typer batterier. Det lille batteri gør loggerens dimensioner særligt kompakte. Det større batteri (inkluderet i leveringen) er egnet til måling ved lave temperaturer, f.eks. i frysesystemer
- Lang, fleksibel føler: Ideel til sterilisering i væsker eller på overflader af frysetørringssystemer. I kombination med frysetørrefølerholderen (bestil separat) kan overfladetemperaturen af frysetørringssystemer måles nøjagtigt
Programmering, aflæsning og analyse af dataloggeren
Meget praktisk at bruge: Ud over at blive brugt til opbevaring kan kufferten med flere funktioner (fås i to forskellige størrelser) også bruges til programmering og aflæsning af op til 8 dataloggere samtidigt. Det betyder, at du ikke har brug for nogen ekstra aflæsningsenhed, og du sparer også tid.
Med den specielt udviklede testo 191 professionelle software (bestil separat) kan du programmere og læse dataloggeren samt analysere måledataene på pc'en. Den enkle softwarestruktur leder dig intuitivt gennem processen trin for trin. Under indtastning, afgiver den advarsler. Softwaren gør det således let for uerfarne brugere nemt at udføre måleprocessen.
Alt dette er inkluderet
1 x testo 191-T3 HACCP-datalogger, inklusiv stort batteri, fjernadapter til testo 191 programmerings- og aflæsningsenhed, kalibreringsprotokol og instruktionsmanual.
| Datablad | Download | Fil type | |
|---|---|---|---|
|
|
0572 1913.pdf | 1547 KB |
| Brochure | Download | Fil type | |
|---|---|---|---|
|
|
0572 1913.pdf | 977 KB |