Advertisement
rochekaid

Custom Gravity Listfield

Feb 16th, 2025
285
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
jQuery 10.84 KB | None | 0 0
  1. jQuery(document).ready(function ($) {
  2.   //add date input to column 1
  3.   function initializeFields() {
  4.     jQuery(".gfield_list_30_cell1 input").attr("type", "date");
  5.   }
  6.   initializeFields();
  7.  
  8.   function addDuplicateButtons() {
  9.     jQuery("#field_239_30 .gfield_list_group").each(function () {
  10.       var $row = jQuery(this);
  11.  
  12.       // Check if button already exists
  13.       if ($row.find(".duplicate_row_button").length === 0) {
  14.         var $duplicateButton = jQuery(
  15.           '<button type="button" style="padding:0 15px!important;border-radius: 50%;" class="duplicate_row_button">+</button>'
  16.         );
  17.         $row.prepend($duplicateButton);
  18.       }
  19.     });
  20.   }
  21.  
  22.   addDuplicateButtons();
  23.  
  24.   function formatTimeInput(input) {
  25.     let timeValue = input.val().trim().toUpperCase();
  26.  
  27.     let match = timeValue.match(/^(\d{1,2}):?(\d{2})?\s?(AM|PM)?$/i);
  28.  
  29.     if (match) {
  30.       let hours = parseInt(match[1], 10);
  31.       let minutes = match[2] ? parseInt(match[2], 10) : 0;
  32.       let period = match[3] ? match[3].toUpperCase() : "PM";
  33.  
  34.       if (hours > 12) hours = 12;
  35.       if (hours === 0) hours = 12;
  36.       minutes = minutes < 10 ? "0" + minutes : minutes;
  37.  
  38.       input.val(hours + ":" + minutes + " " + period);
  39.     } else {
  40.       input.val("12:00 PM"); // Default invalid input to 12:00 PM
  41.       alert("Invalid time entered. Defaulted to 12:00 PM.");
  42.     }
  43.   }
  44.  
  45.   function getDayOfWeek(dateString) {
  46.     let date = new Date(dateString + "T12:00:00");
  47.     return date.toLocaleDateString("en-US", { weekday: "long" });
  48.   }
  49.  
  50.   function sortMealSchedule() {
  51.     let $listContainer = jQuery("#field_239_30 .gfield_list_groups");
  52.     let $rows = $listContainer.children(".gfield_list_group");
  53.  
  54.     if ($rows.length === 0) return;
  55.  
  56.     let rowsArray = [];
  57.  
  58.     $rows.each(function () {
  59.       let $row = jQuery(this);
  60.       let dateVal = $row.find(".gfield_list_30_cell1 input").val();
  61.       let startTime = $row.find(".gfield_list_30_cell3 input").val();
  62.       let endTime = $row.find(".gfield_list_30_cell4 input").val();
  63.  
  64.       let formattedDate = dateVal ? new Date(dateVal) : new Date();
  65.       if (isNaN(formattedDate.getTime())) {
  66.         formattedDate = new Date();
  67.       }
  68.  
  69.       function parseTime(timeString) {
  70.         let timeParts = timeString
  71.           ? timeString.match(/^(\d{1,2}):(\d{2})\s?(AM|PM)?$/i)
  72.           : null;
  73.         let hours = 12;
  74.         let minutes = 0;
  75.  
  76.         if (timeParts) {
  77.           hours = parseInt(timeParts[1], 10);
  78.           minutes = parseInt(timeParts[2], 10);
  79.           let period = timeParts[3] ? timeParts[3].toUpperCase() : "PM";
  80.  
  81.           if (period === "PM" && hours < 12) hours += 12;
  82.           if (period === "AM" && hours === 12) hours = 0;
  83.         } else {
  84.           timeString = "12:00 PM";
  85.         }
  86.  
  87.         return { timeString, timeValue: hours * 60 + minutes };
  88.       }
  89.  
  90.       let startTimeParsed = parseTime(startTime);
  91.       let endTimeParsed = parseTime(endTime);
  92.  
  93.       if (!startTime) {
  94.         $row
  95.           .find(".gfield_list_30_cell3 input")
  96.           .val(startTimeParsed.timeString);
  97.       }
  98.       if (!endTime) {
  99.         $row.find(".gfield_list_30_cell4 input").val(endTimeParsed.timeString);
  100.       }
  101.  
  102.       rowsArray.push({
  103.         row: $row,
  104.         date: formattedDate,
  105.         time: startTimeParsed.timeValue
  106.       });
  107.     });
  108.  
  109.     rowsArray.sort((a, b) => a.date - b.date || a.time - b.time);
  110.     $listContainer.empty();
  111.  
  112.     let lastDate = null;
  113.  
  114.     rowsArray.forEach(({ row, date }) => {
  115.       let dateString = date.toISOString().split("T")[0];
  116.       let dayOfWeek = getDayOfWeek(dateString);
  117.  
  118.       if (dateString !== lastDate) {
  119.         let headerDiv = jQuery(
  120.           `<div class="day-header" style="font-weight:bold; margin-top:10px;">${dayOfWeek}</div>`
  121.         );
  122.         $listContainer.append(headerDiv);
  123.         lastDate = dateString;
  124.       }
  125.  
  126.       $listContainer.append(row);
  127.     });
  128.  
  129.     jQuery(".day-header").each(function () {
  130.       let dateHeader = jQuery(this);
  131.       let dateText = dateHeader.text().trim();
  132.  
  133.       let hasRows =
  134.         jQuery(".gfield_list_group").filter(function () {
  135.           let rowDate = jQuery(this).find(".gfield_list_30_cell1 input").val();
  136.           return getDayOfWeek(rowDate) === dateText;
  137.         }).length > 0;
  138.  
  139.       if (!hasRows) dateHeader.remove();
  140.     });
  141.   }
  142.  
  143.   function duplicateLastDateOnNewRow() {
  144.     let $listContainer = jQuery("#field_239_30 .gfield_list_groups");
  145.     let $rows = $listContainer.children(".gfield_list_group");
  146.     let $newRow = $rows.last(); // Get the most recently added row
  147.  
  148.     // Find closest previous row with valid date
  149.     let $lastRowWithDate = $rows
  150.       .not($newRow)
  151.       .filter(function () {
  152.         return (
  153.           jQuery(this).find(".gfield_list_30_cell1 input").val().trim() !== ""
  154.         );
  155.       })
  156.       .last();
  157.  
  158.     if ($lastRowWithDate.length) {
  159.       let lastDateValue = $lastRowWithDate
  160.         .find(".gfield_list_30_cell1 input")
  161.         .val();
  162.       if (lastDateValue) {
  163.         $newRow.find(".gfield_list_30_cell1 input").val(lastDateValue);
  164.       }
  165.     }
  166.   }
  167.  
  168.   jQuery(document).on("gform_post_render", function () {
  169.     setTimeout(sortMealSchedule, 500);
  170.   });
  171.  
  172.   jQuery(document).on(
  173.     "change",
  174.     "#field_239_30 .gfield_list_groups input, #field_239_30 .gfield_list_groups select",
  175.     function () {
  176.       sortMealSchedule();
  177.     }
  178.   );
  179.  
  180.   jQuery(document).on(
  181.     "blur",
  182.     "#field_239_30 .gfield_list_1_cell3 input, #field_239_1 .gfield_list_1_cell4 input",
  183.     function () {
  184.       formatTimeInput($(this));
  185.     }
  186.   );
  187.  
  188.   jQuery(document).on("click", ".delete_list_item", function () {
  189.     setTimeout(sortMealSchedule, 100);
  190.   });
  191.   jQuery(document).on("click", ".delete_list_item", function () {
  192.     setTimeout(sortMealSchedule, 100); // Slight delay to allow row removal
  193.   });
  194.  
  195.   // Ensure the alert is triggered for both start and end time
  196.   jQuery(document).on(
  197.     "blur",
  198.     "#field_239_30 .gfield_list_30_cell3 input, #field_239_30 .gfield_list_30_cell4 input",
  199.     function () {
  200.       let input = jQuery(this);
  201.       let timeValue = input.val().trim();
  202.  
  203.       if (!timeValue.match(/^(\d{1,2}):?(\d{2})?\s?(AM|PM)?$/i)) {
  204.         alert("Invalid time entered. Defaulted to 12:00 PM.");
  205.         input.val("12:00 PM"); // Default to 12:00 PM
  206.       }
  207.     }
  208.   );
  209.  
  210.   function countDays() {
  211.     var start_date = new Date(jQuery("#input_239_18").val());
  212.     var end_date = new Date(jQuery("#input_239_17").val());
  213.     if (!isNaN(start_date) && !isNaN(end_date) && end_date >= start_date) {
  214.       var daysDifference =
  215.         Math.ceil((end_date - start_date) / (1000 * 60 * 60 * 24)) + 1;
  216.       jQuery("#input_239_31")
  217.         .val(daysDifference * 3)
  218.         .change();
  219.     } else {
  220.       jQuery("#input_239_31").val(3).change();
  221.     }
  222.   }
  223.  
  224.   jQuery("#input_239_18, #input_239_17").on("change", countDays);
  225.  
  226.   function setDates() {
  227.     countDays();
  228.  
  229.     var startDate = new Date(jQuery("#input_239_18").val()); // Get Start Date
  230.     var endDate = new Date(jQuery("#input_239_17").val()); // Get End Date
  231.  
  232.     // Validate the date range
  233.     if (
  234.       isNaN(startDate.getTime()) ||
  235.       isNaN(endDate.getTime()) ||
  236.       endDate < startDate
  237.     ) {
  238.       alert("Invalid date range. Please select valid start and end dates.");
  239.       return;
  240.     }
  241.  
  242.     var totalDays =
  243.       Math.ceil((endDate - startDate) / (1000 * 60 * 60 * 24)) + 1; // Calculate # of days
  244.     var totalMeals = totalDays * 3; // 3 meals per day
  245.  
  246.     var meals = ["Breakfast", "Lunch", "Dinner"];
  247.     var mealTimes = {
  248.       Breakfast: { start: "08:00 AM", end: "09:00 AM" },
  249.       Lunch: { start: "12:00 PM", end: "01:00 PM" },
  250.       Dinner: { start: "06:00 PM", end: "07:00 PM" }
  251.     };
  252.  
  253.     var $listContainer = jQuery("#field_239_30 .gfield_list_groups");
  254.     var currentRowCount = $listContainer.children(".gfield_list_group").length;
  255.  
  256.     // Add rows if needed
  257.     while (currentRowCount < totalMeals) {
  258.       jQuery(".gfield_list_icons .add_list_item").first().trigger("click");
  259.       currentRowCount++;
  260.     }
  261.  
  262.     jQuery("#field_239_30 .gfield_list_group").each(function (index) {
  263.       var $row = jQuery(this);
  264.       var dayOffset = Math.floor(index / 3); // Every 3 rows = new day
  265.       var mealIndex = index % 3; // 0 = Breakfast, 1 = Lunch, 2 = Dinner
  266.       var mealType = meals[mealIndex];
  267.  
  268.       var newDate = new Date(startDate);
  269.       newDate.setDate(startDate.getDate() + dayOffset); // Adjust date
  270.  
  271.       var dateField = $row.find(".gfield_list_30_cell1 input"); // Date field
  272.       var mealField = $row.find(".gfield_list_30_cell2 select"); // Meal Type
  273.       var startTimeField = $row.find(".gfield_list_30_cell3 input"); // Start Time
  274.       var endTimeField = $row.find(".gfield_list_30_cell4 input"); // End Time
  275.  
  276.       dateField.val(newDate.toISOString().split("T")[0]); // Set date
  277.       mealField.val(mealType); // Set meal type
  278.       startTimeField.val(mealTimes[mealType].start); // Set start time
  279.       endTimeField.val(mealTimes[mealType].end); // Set end time
  280.     });
  281.  
  282.     sortMealSchedule(); // Sort after setting values
  283.   }
  284.  
  285.   jQuery("#input_239_31").on("change", function () {
  286.     sortMealSchedule();
  287.   });
  288.  
  289.   jQuery("body").on("click", ".gfield_list_icons .add_list_item", function () {
  290.     var newDate = $(this)
  291.       .parent(".gfield_list_icons")
  292.       .prevAll(".gfield_list_30_cell1")
  293.       .find('input[type="date"]')
  294.       .val();
  295.     $('.gfield_list_group input[type="date"]').val(newDate);
  296.   });
  297.  
  298.   jQuery("body").on("change", ".gfield_list_group_item input", function () {
  299.     sortMealSchedule();
  300.   });
  301.  
  302.   jQuery("body").on("click", "#set_dates", setDates);
  303.   sortMealSchedule();
  304.  
  305.   jQuery(document)
  306.     .off("click", ".duplicate_row_button")
  307.     .on("click", ".duplicate_row_button", function () {
  308.       var $button = jQuery(this);
  309.       var $originalRow = $button.closest(".gfield_list_group");
  310.       var $newRow = $originalRow.clone(); // Clone row
  311.  
  312.       $newRow.find("input, select, textarea").each(function () {
  313.         var $input = jQuery(this);
  314.         var inputType = $input.attr("type");
  315.  
  316.         if ($input.is("select")) {
  317.           //select dropdowns
  318.           var selectedValue = $input.find("option:selected").val();
  319.           $input.find("option").each(function () {
  320.             if (jQuery(this).val() === selectedValue) {
  321.               jQuery(this).prop("selected", true);
  322.             }
  323.           });
  324.         } else if (inputType === "checkbox" || inputType === "radio") {
  325.           $input.prop("checked", $input.prop("checked"));
  326.         } else {
  327.           $input.val($input.val());
  328.         }
  329.       });
  330.  
  331.       // Append new row
  332.       $originalRow.after($newRow);
  333.       //add duplicate button
  334.       addDuplicateButtons();
  335.     });
  336.  
  337.   jQuery(document).on("gform_post_render", function () {
  338.     addDuplicateButtons();
  339.   });
  340. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement