Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- jQuery(document).ready(function ($) {
- //add date input to column 1
- function initializeFields() {
- jQuery(".gfield_list_30_cell1 input").attr("type", "date");
- }
- initializeFields();
- function addDuplicateButtons() {
- jQuery("#field_239_30 .gfield_list_group").each(function () {
- var $row = jQuery(this);
- // Check if button already exists
- if ($row.find(".duplicate_row_button").length === 0) {
- var $duplicateButton = jQuery(
- '<button type="button" style="padding:0 15px!important;border-radius: 50%;" class="duplicate_row_button">+</button>'
- );
- $row.prepend($duplicateButton);
- }
- });
- }
- addDuplicateButtons();
- function formatTimeInput(input) {
- let timeValue = input.val().trim().toUpperCase();
- let match = timeValue.match(/^(\d{1,2}):?(\d{2})?\s?(AM|PM)?$/i);
- if (match) {
- let hours = parseInt(match[1], 10);
- let minutes = match[2] ? parseInt(match[2], 10) : 0;
- let period = match[3] ? match[3].toUpperCase() : "PM";
- if (hours > 12) hours = 12;
- if (hours === 0) hours = 12;
- minutes = minutes < 10 ? "0" + minutes : minutes;
- input.val(hours + ":" + minutes + " " + period);
- } else {
- input.val("12:00 PM"); // Default invalid input to 12:00 PM
- alert("Invalid time entered. Defaulted to 12:00 PM.");
- }
- }
- function getDayOfWeek(dateString) {
- let date = new Date(dateString + "T12:00:00");
- return date.toLocaleDateString("en-US", { weekday: "long" });
- }
- function sortMealSchedule() {
- let $listContainer = jQuery("#field_239_30 .gfield_list_groups");
- let $rows = $listContainer.children(".gfield_list_group");
- if ($rows.length === 0) return;
- let rowsArray = [];
- $rows.each(function () {
- let $row = jQuery(this);
- let dateVal = $row.find(".gfield_list_30_cell1 input").val();
- let startTime = $row.find(".gfield_list_30_cell3 input").val();
- let endTime = $row.find(".gfield_list_30_cell4 input").val();
- let formattedDate = dateVal ? new Date(dateVal) : new Date();
- if (isNaN(formattedDate.getTime())) {
- formattedDate = new Date();
- }
- function parseTime(timeString) {
- let timeParts = timeString
- ? timeString.match(/^(\d{1,2}):(\d{2})\s?(AM|PM)?$/i)
- : null;
- let hours = 12;
- let minutes = 0;
- if (timeParts) {
- hours = parseInt(timeParts[1], 10);
- minutes = parseInt(timeParts[2], 10);
- let period = timeParts[3] ? timeParts[3].toUpperCase() : "PM";
- if (period === "PM" && hours < 12) hours += 12;
- if (period === "AM" && hours === 12) hours = 0;
- } else {
- timeString = "12:00 PM";
- }
- return { timeString, timeValue: hours * 60 + minutes };
- }
- let startTimeParsed = parseTime(startTime);
- let endTimeParsed = parseTime(endTime);
- if (!startTime) {
- $row
- .find(".gfield_list_30_cell3 input")
- .val(startTimeParsed.timeString);
- }
- if (!endTime) {
- $row.find(".gfield_list_30_cell4 input").val(endTimeParsed.timeString);
- }
- rowsArray.push({
- row: $row,
- date: formattedDate,
- time: startTimeParsed.timeValue
- });
- });
- rowsArray.sort((a, b) => a.date - b.date || a.time - b.time);
- $listContainer.empty();
- let lastDate = null;
- rowsArray.forEach(({ row, date }) => {
- let dateString = date.toISOString().split("T")[0];
- let dayOfWeek = getDayOfWeek(dateString);
- if (dateString !== lastDate) {
- let headerDiv = jQuery(
- `<div class="day-header" style="font-weight:bold; margin-top:10px;">${dayOfWeek}</div>`
- );
- $listContainer.append(headerDiv);
- lastDate = dateString;
- }
- $listContainer.append(row);
- });
- jQuery(".day-header").each(function () {
- let dateHeader = jQuery(this);
- let dateText = dateHeader.text().trim();
- let hasRows =
- jQuery(".gfield_list_group").filter(function () {
- let rowDate = jQuery(this).find(".gfield_list_30_cell1 input").val();
- return getDayOfWeek(rowDate) === dateText;
- }).length > 0;
- if (!hasRows) dateHeader.remove();
- });
- }
- function duplicateLastDateOnNewRow() {
- let $listContainer = jQuery("#field_239_30 .gfield_list_groups");
- let $rows = $listContainer.children(".gfield_list_group");
- let $newRow = $rows.last(); // Get the most recently added row
- // Find closest previous row with valid date
- let $lastRowWithDate = $rows
- .not($newRow)
- .filter(function () {
- return (
- jQuery(this).find(".gfield_list_30_cell1 input").val().trim() !== ""
- );
- })
- .last();
- if ($lastRowWithDate.length) {
- let lastDateValue = $lastRowWithDate
- .find(".gfield_list_30_cell1 input")
- .val();
- if (lastDateValue) {
- $newRow.find(".gfield_list_30_cell1 input").val(lastDateValue);
- }
- }
- }
- jQuery(document).on("gform_post_render", function () {
- setTimeout(sortMealSchedule, 500);
- });
- jQuery(document).on(
- "change",
- "#field_239_30 .gfield_list_groups input, #field_239_30 .gfield_list_groups select",
- function () {
- sortMealSchedule();
- }
- );
- jQuery(document).on(
- "blur",
- "#field_239_30 .gfield_list_1_cell3 input, #field_239_1 .gfield_list_1_cell4 input",
- function () {
- formatTimeInput($(this));
- }
- );
- jQuery(document).on("click", ".delete_list_item", function () {
- setTimeout(sortMealSchedule, 100);
- });
- jQuery(document).on("click", ".delete_list_item", function () {
- setTimeout(sortMealSchedule, 100); // Slight delay to allow row removal
- });
- // Ensure the alert is triggered for both start and end time
- jQuery(document).on(
- "blur",
- "#field_239_30 .gfield_list_30_cell3 input, #field_239_30 .gfield_list_30_cell4 input",
- function () {
- let input = jQuery(this);
- let timeValue = input.val().trim();
- if (!timeValue.match(/^(\d{1,2}):?(\d{2})?\s?(AM|PM)?$/i)) {
- alert("Invalid time entered. Defaulted to 12:00 PM.");
- input.val("12:00 PM"); // Default to 12:00 PM
- }
- }
- );
- function countDays() {
- var start_date = new Date(jQuery("#input_239_18").val());
- var end_date = new Date(jQuery("#input_239_17").val());
- if (!isNaN(start_date) && !isNaN(end_date) && end_date >= start_date) {
- var daysDifference =
- Math.ceil((end_date - start_date) / (1000 * 60 * 60 * 24)) + 1;
- jQuery("#input_239_31")
- .val(daysDifference * 3)
- .change();
- } else {
- jQuery("#input_239_31").val(3).change();
- }
- }
- jQuery("#input_239_18, #input_239_17").on("change", countDays);
- function setDates() {
- countDays();
- var startDate = new Date(jQuery("#input_239_18").val()); // Get Start Date
- var endDate = new Date(jQuery("#input_239_17").val()); // Get End Date
- // Validate the date range
- if (
- isNaN(startDate.getTime()) ||
- isNaN(endDate.getTime()) ||
- endDate < startDate
- ) {
- alert("Invalid date range. Please select valid start and end dates.");
- return;
- }
- var totalDays =
- Math.ceil((endDate - startDate) / (1000 * 60 * 60 * 24)) + 1; // Calculate # of days
- var totalMeals = totalDays * 3; // 3 meals per day
- var meals = ["Breakfast", "Lunch", "Dinner"];
- var mealTimes = {
- Breakfast: { start: "08:00 AM", end: "09:00 AM" },
- Lunch: { start: "12:00 PM", end: "01:00 PM" },
- Dinner: { start: "06:00 PM", end: "07:00 PM" }
- };
- var $listContainer = jQuery("#field_239_30 .gfield_list_groups");
- var currentRowCount = $listContainer.children(".gfield_list_group").length;
- // Add rows if needed
- while (currentRowCount < totalMeals) {
- jQuery(".gfield_list_icons .add_list_item").first().trigger("click");
- currentRowCount++;
- }
- jQuery("#field_239_30 .gfield_list_group").each(function (index) {
- var $row = jQuery(this);
- var dayOffset = Math.floor(index / 3); // Every 3 rows = new day
- var mealIndex = index % 3; // 0 = Breakfast, 1 = Lunch, 2 = Dinner
- var mealType = meals[mealIndex];
- var newDate = new Date(startDate);
- newDate.setDate(startDate.getDate() + dayOffset); // Adjust date
- var dateField = $row.find(".gfield_list_30_cell1 input"); // Date field
- var mealField = $row.find(".gfield_list_30_cell2 select"); // Meal Type
- var startTimeField = $row.find(".gfield_list_30_cell3 input"); // Start Time
- var endTimeField = $row.find(".gfield_list_30_cell4 input"); // End Time
- dateField.val(newDate.toISOString().split("T")[0]); // Set date
- mealField.val(mealType); // Set meal type
- startTimeField.val(mealTimes[mealType].start); // Set start time
- endTimeField.val(mealTimes[mealType].end); // Set end time
- });
- sortMealSchedule(); // Sort after setting values
- }
- jQuery("#input_239_31").on("change", function () {
- sortMealSchedule();
- });
- jQuery("body").on("click", ".gfield_list_icons .add_list_item", function () {
- var newDate = $(this)
- .parent(".gfield_list_icons")
- .prevAll(".gfield_list_30_cell1")
- .find('input[type="date"]')
- .val();
- $('.gfield_list_group input[type="date"]').val(newDate);
- });
- jQuery("body").on("change", ".gfield_list_group_item input", function () {
- sortMealSchedule();
- });
- jQuery("body").on("click", "#set_dates", setDates);
- sortMealSchedule();
- jQuery(document)
- .off("click", ".duplicate_row_button")
- .on("click", ".duplicate_row_button", function () {
- var $button = jQuery(this);
- var $originalRow = $button.closest(".gfield_list_group");
- var $newRow = $originalRow.clone(); // Clone row
- $newRow.find("input, select, textarea").each(function () {
- var $input = jQuery(this);
- var inputType = $input.attr("type");
- if ($input.is("select")) {
- //select dropdowns
- var selectedValue = $input.find("option:selected").val();
- $input.find("option").each(function () {
- if (jQuery(this).val() === selectedValue) {
- jQuery(this).prop("selected", true);
- }
- });
- } else if (inputType === "checkbox" || inputType === "radio") {
- $input.prop("checked", $input.prop("checked"));
- } else {
- $input.val($input.val());
- }
- });
- // Append new row
- $originalRow.after($newRow);
- //add duplicate button
- addDuplicateButtons();
- });
- jQuery(document).on("gform_post_render", function () {
- addDuplicateButtons();
- });
- });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement