<!DOCTYPE html>
<html lang="en">
  <head>
    <meta
      charset="UTF-8"
      name="viewport"
      content="width=device-width, initial-scale=1.0"
    />
    <title>Insightwin</title>
    <script src="/dhtmlx-gantt/dhtmlxgantt.js"></script>
    <link
      rel="stylesheet"
      href="https://docs.dhtmlx.com/gantt/codebase/dhtmlxgantt.css?v=6.0.0"
    />
    <!-- <link rel="stylesheet" href="./app.css" /> -->
    <link
      href="https://fonts.googleapis.com/icon?family=Material+Icons"
      rel="stylesheet"
    />
    <link
      rel="stylesheet"
      href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap"
    />
    <link
      href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100;300;400;500;700;900&display=swap"
      rel="stylesheet"
    />
    <link
      rel="stylesheet"
      href="https://fonts.googleapis.com/icon?family=Material+Icons"
    />
    <script src="https://cdnjs.cloudflare.com/ajax/libs/split.js/1.6.5/split.min.js"></script>
    <link
      href="https://unpkg.com/tabulator-tables/dist/css/tabulator.min.css"
      rel="stylesheet"
    />
    <script
      type="text/javascript"
      src="https://unpkg.com/tabulator-tables/dist/js/tabulator.min.js"
    ></script>
    <script
      type="text/javascript"
      src="https://cdn.jsdelivr.net/npm/luxon@2.3.1/build/global/luxon.min.js"
    ></script>
    <style>
      body,
      html {
        margin: 0;
        padding: 0;
        height: 100%;
        line-height: 1.467;
        display: flex;
        font-family: "Noto Sans KR", sans-serif !important;
        overflow: hidden;
      }
      .gantt_mch_icon {
        background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjEiIHdpZHRoPSIyMSIgdmlld0JveD0iMCAwIDQ4IDQ4Ij48dGl0bGU+cm9ib3RpYyBhcm08L3RpdGxlPjxnIGZpbGw9IiMyMTIxMjEiIGNsYXNzPSJuYy1pY29uLXdyYXBwZXIiPjxwYXRoIGQ9Ik00Mi44LDE3LjAybC05LjI1MSwxLjg0OUwzMC4xMTgsMTJsMy40MzUtNi44NjlMNDIuOCw2Ljk4QTEsMSwwLDEsMCw0My4yLDUuMDJsLTEwLTJhMSwxLDAsMCwwLTEuMDkxLjUzM0wyOC4zODIsMTFIMTIuOTFhNS42LDUuNiwwLDAsMSwwLDJIMjguMzgyTDMyLjEsMjAuNDQ3QTEsMSwwLDAsMCwzMywyMWEuOTM4LjkzOCwwLDAsMCwuMi0uMDJsMTAtMmExLDEsMCwwLDAtLjM5Mi0xLjk2WiIgZmlsbD0iIzIxMjEyMSI+PC9wYXRoPjxwYXRoIGQ9Ik0zNCwzOEgyNWE1LDUsMCwwLDAtMTAsMEg2YTMsMywwLDAsMC0zLDN2M2ExLDEsMCwwLDAsMSwxSDM2YTEsMSwwLDAsMCwxLTFWNDFBMywzLDAsMCwwLDM0LDM4Wk0yMCw0MGEyLDIsMCwxLDEsMi0yQTIsMiwwLDAsMSwyMCw0MFoiIGZpbGw9IiMyMTIxMjEiPjwvcGF0aD48cGF0aCBkPSJNMTAuMzM2LDE0LjJhNCw0LDAsMSwwLTMuNTg1LDEuNzc1bDguNDcsMTYuOTRhNi45NzEsNi45NzEsMCwwLDEsMy41Ny0xLjgwN1oiIGZpbGw9IiMyMTIxMjEiPjwvcGF0aD48L2c+PC9zdmc+");
        width: 21px;
        height: 21px;
      }
      .gantt_ord_icon {
        background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjEiIHdpZHRoPSIyMSIgdmlld0JveD0iMCAwIDQ4IDQ4Ij48dGl0bGU+aW5kdXN0cnk8L3RpdGxlPjxnIGZpbGw9IiMyMTIxMjEiIGNsYXNzPSJuYy1pY29uLXdyYXBwZXIiPiA8cGF0aCBkPSJNMjIuMDQ1NSA2LjM0MTI1QzIzLjM2ODUgNS4zNjI1IDI1LjA5MiA0Ljc1IDI3IDQuNzVDMzEuMTQxNSA0Ljc1IDM0LjUgNy41NDg3NSAzNC41IDExSDZDNiA2Ljg1NzUgMTAuMDI5IDMuNSAxNSAzLjVDMTcuODU2IDMuNSAyMC4zOTcgNC42MTI1IDIyLjA0NTUgNi4zNDEyNVoiIGZpbGw9IiMyMTIxMjEiPjwvcGF0aD4gPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MCA4SDQ0VjExSDQwVjhaIiBmaWxsPSIjMjEyMTIxIj48L3BhdGg+IDxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNNDQgMjAuMzgyTDMyIDI2LjM4MlYyMC41MjNMMTggMjYuMTIzVjQ0SDQ0VjIwLjM4MlpNMzkgMzhWMzQuNUMzOSAzMy4xMTkzIDM3Ljg4MDcgMzIgMzYuNSAzMkMzNS4xMTkzIDMyIDM0IDMzLjExOTMgMzQgMzQuNVYzOEgzOVpNMjggMzQuNVYzOEgyM1YzNC41QzIzIDMzLjExOTMgMjQuMTE5MyAzMiAyNS41IDMyQzI2Ljg4MDcgMzIgMjggMzMuMTE5MyAyOCAzNC41WiIgZmlsbD0iIzIxMjEyMSIgZGF0YS1jb2xvcj0iY29sb3ItMiI+PC9wYXRoPiA8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTYuMTAxNDMgMTRMMi44ODcxNSA0NEgxNUwxNSAxNEg2LjEwMTQzWk03LjM2Mjg4IDIxSDEzVjI0SDcuMDQxNDVMNy4zNjI4OCAyMVoiIGZpbGw9IiMyMTIxMjEiPjwvcGF0aD4gPC9nPjwvc3ZnPg==");
        width: 21px;
        height: 21px;
      }
      .gantt_proc_icon {
        background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjEiIHdpZHRoPSIyMSIgdmlld0JveD0iMCAwIDQ4IDQ4Ij48dGl0bGU+YXV0b21hdGVkIGxvZ2lzdGljczwvdGl0bGU+PGcgc3Ryb2tlLWxpbmVjYXA9InNxdWFyZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBmaWxsPSIjMjEyMTIxIiBzdHJva2UtbGluZWpvaW49Im1pdGVyIiBjbGFzcz0ibmMtaWNvbi13cmFwcGVyIj48bGluZSB4MT0iMzYiIHkxPSIyIiB4Mj0iMzYiIHkyPSI5IiBmaWxsPSJub25lIiBzdHJva2U9IiMyMTIxMjEiIHN0cm9rZS13aWR0aD0iMiIgZGF0YS1jb2xvcj0iY29sb3ItMiI+PC9saW5lPjxwb2x5bGluZSBwb2ludHM9IjQzIDIwIDQzIDE1IDM2IDkgMjkgMTUgMjkgMjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzIxMjEyMSIgc3Ryb2tlLXdpZHRoPSIyIiBkYXRhLWNvbG9yPSJjb2xvci0yIj48L3BvbHlsaW5lPjxwb2x5bGluZSBwb2ludHM9IjI5IDQwIDI5IDI4IDQzIDI4IDQzIDQwIiBmaWxsPSJub25lIiBzdHJva2U9IiMyMTIxMjEiIHN0cm9rZS13aWR0aD0iMiI+PC9wb2x5bGluZT48cG9seWxpbmUgcG9pbnRzPSI1IDQwIDUgMjIgMjMgMjIgMjMgNDAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzIxMjEyMSIgc3Ryb2tlLXdpZHRoPSIyIj48L3BvbHlsaW5lPjxsaW5lIHgxPSIxMSIgeTE9IjI4IiB4Mj0iMTciIHkyPSIyOCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMjEyMTIxIiBzdHJva2Utd2lkdGg9IjIiPjwvbGluZT48cmVjdCB4PSIyIiB5PSI0MCIgd2lkdGg9IjQ0IiBoZWlnaHQ9IjYiIHJ4PSIzIiBmaWxsPSJub25lIiBzdHJva2U9IiMyMTIxMjEiIHN0cm9rZS13aWR0aD0iMiI+PC9yZWN0PjwvZz48L3N2Zz4=");
        width: 21px;
        height: 21px;
      }
      .gantt_modal_box.gantt-confirm {
        z-index: 99999;
      }
      .zoom_in_icon {
        background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMSIgaGVpZ2h0PSIyMSIgdmlld0JveD0iMCAwIDIxIDIxIj48dGl0bGU+bWFnbmlmaWVyIHBsdXM8L3RpdGxlPjxnIGZpbGw9IiMwMDAwMDAiIGNsYXNzPSJuYy1pY29uLXdyYXBwZXIiPjxwYXRoIGQ9Ik0xMi42NCAxMi42NGE1LjI1IDUuMjUgMCAxIDEtNC44MS04Ljg1IiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIj48L3BhdGg+PHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTE3LjMyIDE3LjMybC00LjY4LTQuNjgiPjwvcGF0aD48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBkPSJNMTMuNjUgOS40NXYtNi4zIj48L3BhdGg+PHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgNi4zaDYuMyI+PC9wYXRoPjwvZz48L3N2Zz4=");
        width: 30px;
        height: 30px;
        background-repeat: no-repeat;
        cursor: pointer;
        background-size: 30px 30px;
      }
      .zoom_out_icon {
        background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMSIgaGVpZ2h0PSIyMSIgdmlld0JveD0iMCAwIDIxIDIxIj48dGl0bGU+bWFnbmlmaWVyIG1pbnVzPC90aXRsZT48ZyBmaWxsPSIjMDAwMDAwIiBjbGFzcz0ibmMtaWNvbi13cmFwcGVyIj48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBkPSJNMTcuMzIgMTcuMzJsLTQuNjgtNC42OCI+PC9wYXRoPjxwYXRoIGQ9Ik03LjgyIDMuNzlhNS4yNSA1LjI1IDAgMSAwIDYuMjUgNi4xOSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiI+PC9wYXRoPjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjIiIGQ9Ik0xMC41IDYuM2g2LjMiPjwvcGF0aD48L2c+PC9zdmc+");
        width: 30px;
        height: 30px;
        background-repeat: no-repeat;
        cursor: pointer;
        background-size: 30px 30px;
      }
      .window_mode_icon {
        background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMSIgaGVpZ2h0PSIyMSIgdmlld0JveD0iMCAwIDIxIDIxIj48dGl0bGU+c3F1YXJlIGFycm93cyBleHBhbmQ8L3RpdGxlPjxnIGZpbGw9IiMwMDAwMDAiIGNsYXNzPSJuYy1pY29uLXdyYXBwZXIiPjxwYXRoIGQ9Ik0yLjY0IDE2Ljcydi0xMi4zMmExLjc2IDEuNzYgMCAwIDEgMS43Ni0xLjc2aDEyLjMyYTEuNzYgMS43NiAwIDAgMSAxLjc2IDEuNzZ2MTIuMzJhMS43NiAxLjc2IDAgMCAxLTEuNzYgMS43NmgtMTIuMzJhMS43NiAxLjc2IDAgMCAxLTEuNzYtMS43NnoiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHN0cm9rZS1saW5lY2FwPSJzcXVhcmUiIGZpbGw9Im5vbmUiPjwvcGF0aD48cGF0aCBkPSJNMTIuMzIgMTIuMzJsMi42NCAyLjY0LTAuMTQtMC4xNCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWxpbmVjYXA9InNxdWFyZSIgZmlsbD0ibm9uZSI+PC9wYXRoPjxwYXRoIGQ9Ik04LjggMTIuMzJsLTIuNjQgMi42NCAwLjE0LTAuMTQiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHN0cm9rZS1saW5lY2FwPSJzcXVhcmUiIGZpbGw9Im5vbmUiPjwvcGF0aD48cGF0aCBkPSJNMTIuMzIgMTQuOTZoMi42NHYtMi42NCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWxpbmVjYXA9InNxdWFyZSIgZmlsbD0ibm9uZSI+PC9wYXRoPjxwYXRoIGQ9Ik02LjE2IDEyLjMydjIuNjRoMi42NCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWxpbmVjYXA9InNxdWFyZSIgZmlsbD0ibm9uZSI+PC9wYXRoPjxwYXRoIGQ9Ik0xMi4zMiA4LjhsMi42NC0yLjY0LTAuMTQgMC4xNCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWxpbmVjYXA9InNxdWFyZSIgZmlsbD0ibm9uZSI+PC9wYXRoPjxwYXRoIGQ9Ik04LjggOC44bC0yLjY0LTIuNjQgMC4xNCAwLjE0IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIiBmaWxsPSJub25lIj48L3BhdGg+PHBhdGggZD0iTTEyLjMyIDYuMTZoMi42NHYyLjY0IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIiBmaWxsPSJub25lIj48L3BhdGg+PHBhdGggZD0iTTYuMTYgOC44di0yLjY0aDIuNjQiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHN0cm9rZS1saW5lY2FwPSJzcXVhcmUiIGZpbGw9Im5vbmUiPjwvcGF0aD48L2c+PC9zdmc+");
        width: 30px;
        height: 30px;
        background-repeat: no-repeat;
        cursor: pointer;
        background-size: 26px 26px;
      }
      .window_full_screen {
        background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMzAiIHdpZHRoPSIzMCIgdmlld0JveD0iMCAwIDMwIDMwIj48ZyBzdHJva2UtbGluZWpvaW49Im1pdGVyIiBmaWxsPSIjRkZGRkZGIiBzdHJva2UtbGluZWNhcD0iYnV0dCIgY2xhc3M9Im5jLWljb24td3JhcHBlciI+PHBhdGggZD0iTTE5LjM4IDEwLjYzbDYuODctNi44OC0wLjM0IDAuMzQiIHN0cm9rZT0iI0ZGRkZGRiIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHN0cm9rZS1saW5lY2FwPSJzcXVhcmUiIGRhdGEtY29sb3I9ImNvbG9yLTIiIGZpbGw9Im5vbmUiPjwvcGF0aD48cGF0aCBkPSJNMTkuMzggMTkuMzhsNi44NyA2Ljg3LTAuMjYtMC4yNiIgc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWxpbmVjYXA9InNxdWFyZSIgZmlsbD0ibm9uZSI+PC9wYXRoPjxwYXRoIGQ9Ik0xMC42MyAxMC42M2wtNi44OC02Ljg4IDAuMjQgMC4yNCIgc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWxpbmVjYXA9InNxdWFyZSIgZmlsbD0ibm9uZSI+PC9wYXRoPjxwYXRoIGQ9Ik0xMC42MyAxOS4zOGwtNi44OCA2Ljg3IDAuMTctMC4xNyIgc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWxpbmVjYXA9InNxdWFyZSIgZGF0YS1jb2xvcj0iY29sb3ItMiIgZmlsbD0ibm9uZSI+PC9wYXRoPjxwYXRoIGQ9Ik0yMC42MyAzLjc1aDUuNjJ2NS42MyIgc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWxpbmVjYXA9InNxdWFyZSIgZGF0YS1jb2xvcj0iY29sb3ItMiIgZmlsbD0ibm9uZSI+PC9wYXRoPjxwYXRoIGQ9Ik0yMC42MyAyNi4yNWg1LjYydi01LjYzIiBzdHJva2U9IiNGRkZGRkYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIiBmaWxsPSJub25lIj48L3BhdGg+PHBhdGggZD0iTTMuNzUgOS4zOHYtNS42M2g1LjYzIiBzdHJva2U9IiNGRkZGRkYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIiBmaWxsPSJub25lIj48L3BhdGg+PHBhdGggZD0iTTMuNzUgMjAuNjN2NS42Mmg1LjYzIiBzdHJva2U9IiNGRkZGRkYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIiBkYXRhLWNvbG9yPSJjb2xvci0yIiBmaWxsPSJub25lIj48L3BhdGg+PC9nPjwvc3ZnPg==");
        width: 30px;
        height: 30px;
        background-repeat: no-repeat;
        cursor: pointer;
        background-size: 30px 30px;
      }
      .warning_tooltip {
        visibility: hidden;
        position: absolute;
        bottom: 0px;
        left: 50%;
        transform: translateX(-50%) translateY(100%);
        width: 450px;
        max-height: 600px;
        z-index: 1000;
        transition: visibility 0.2s;
        overflow-y: auto;
        cursor: initial;
      }

      .warning_tooltip_container {
        background-color: #f3f4f6;
        border-left: 4px solid #9ca3af;
        padding: 16px;
        border-radius: 8px;
        box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
      }

      .warning_header {
        display: flex;
        align-items: flex-end;
        margin-bottom: 16px;
      }

      .warning_title {
        font-size: 18px;
        font-weight: 600;
        color: #1f2937;
        margin-left: 8px;
      }

      /* Alert Triangle 아이콘 스타일 */
      .alert_triangle {
        width: 20px;
        height: 20px;
        color: #4b5563;
      }

      .warning_content {
        display: flex;
        flex-direction: column;
        gap: 16px;
      }

      .warning_icon:hover > .warning_tooltip {
        visibility: visible;
      }

      .warning-item {
        background-color: white;
        padding: 0px 1rem;
        border-radius: 6px;
        box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
      }

      .warning-item h3 {
        font-size: 14px;
        font-weight: 600;
        color: #1f2937;
      }

      .warning-list {
        display: flex;
        flex-direction: column;
        gap: 8px;
      }

      .warning-list-item {
        display: flex;
        align-items: flex-end;
        gap: 8px;
        padding: 1rem 0 1rem 1rem;
      }

      .circle_check_icon {
        background-image: url("data:image/svg+xml;base64, PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE2IDE2Ij48dGl0bGU+Y2lyY2xlIGNoZWNrIDI8L3RpdGxlPjxnIGZpbGw9IiMwMDAwMDAiIGNsYXNzPSJuYy1pY29uLXdyYXBwZXIiPjxwYXRoIGQ9Ik0xMC4xMSAyLjgxYTUuNiA1LjYgMCAxIDAgMy40NiA0LjY0IiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIj48L3BhdGg+PHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTUuNiA2LjkzbDIuNjcgMi42NyA1LjMzLTYuNjciPjwvcGF0aD48L2c+PC9zdmc+");
        width: 25px;
        height: 25px;
        flex-shrink: 0;
        background-repeat: no-repeat;
        background-size: 25px 25px;
      }
      .bell_fill_icon {
        background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE2IDE2Ij48dGl0bGU+YmVsbCBmaWxsZWQ8L3RpdGxlPjxnIGZpbGw9IiMwMDAwMDAiIGNsYXNzPSJuYy1pY29uLXdyYXBwZXIiPjxwYXRoIGQ9Ik0xMy42NSAxMC44NGExLjYxIDEuNjEgMCAwIDEtMS42MS0xLjYxdi0yLjgxYTQuMDEgNC4wMSAwIDAgMC04LjAzIDB2Mi44MWExLjYxIDEuNjEgMCAwIDEtMS42IDEuNjFoMTEuMjR6IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBmaWxsPSIjMDAwMDAwIj48L3BhdGg+PHBhdGggZD0iTTYuMDYgMTIuODVhMi4wMSAyLjAxIDAgMCAwIDMuOTMgMGgtMy45M3oiIGZpbGw9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMCI+PC9wYXRoPjwvZz48L3N2Zz4=");
        width: 16px;
        height: 16px;
        flex-shrink: 0;
        background-repeat: no-repeat;
        background-size: 16px 16px;
      }
      .warning-text {
        font-size: 12px;
        color: #4b5563;
      }
      .warning_icon {
        background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMCIgaGVpZ2h0PSIzMCIgdmlld0JveD0iMCAwIDMwIDMwIj48dGl0bGU+dHJpYW5nbGUgd2FybmluZzwvdGl0bGU+PGcgZmlsbD0iI2ZmMDAwMCIgY2xhc3M9Im5jLWljb24td3JhcHBlciI+PHBhdGggZD0iTTEzLjUgMTJhMS41IDEuNSAwIDEgMSAzIDB2Ni43NWExLjUgMS41IDAgMSAxLTMgMHYtNi43NXoiIGZpbGw9IiNmZjAwMDAiIHN0cm9rZS13aWR0aD0iMCI+PC9wYXRoPjxwYXRoIGZpbGw9IiNmZjAwMDAiIHN0cm9rZS13aWR0aD0iMCIgZD0iTTE1IDIxLjc1YTEuODggMS44OCAwIDEgMCAwIDMuNzUgMS44OCAxLjg4IDAgMSAwIDAtMy43NXoiPjwvcGF0aD48cGF0aCBkPSJNMjAuNTkgMjRoMi4yYzIuMzEgMCAzLjc1LTIuNSAyLjYtNC41bC03Ljc5LTEzLjVjLTEuMTYtMi00LjA0LTItNS4yIDBsLTcuNzkgMTMuNWMtMS4xNiAyIDAuMjkgNC41IDIuNiA0LjVoMi4yIiBmaWxsPSJub25lIiBzdHJva2U9IiNmZjAwMDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIj48L3BhdGg+PC9nPjwvc3ZnPg==");
        width: 25px;
        height: 25px;
        background-repeat: no-repeat;
        cursor: pointer;
        background-size: 25px 25px;
        display: none;
        position: relative;
      }
      .reset_icon {
        background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMCIgaGVpZ2h0PSIzMCIgdmlld0JveD0iMCAwIDMwIDMwIj48dGl0bGU+Y2xlYXIgZGF0YTwvdGl0bGU+PGcgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIgZmlsbD0iIzAwMDAwMCIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIGNsYXNzPSJuYy1pY29uLXdyYXBwZXIiPjxwYXRoIGQ9Ik0yNS4yIDIuNTJsLTkuNiAxMS45IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIiBmaWxsPSJub25lIj48L3BhdGg+PHBhdGggZD0iTTE0LjEgMTMuODZhMi4zMSAyLjMxIDAgMCAxIDIuMzEgMi4zMSA0LjIxIDQuMjEgMCAwIDEtMC4yNCAxLjAzIDExLjUgMTEuNSAwIDAgMCAwLjU0IDEwLjUyaC0xNC4xNmMwLTcuNjUgMy45LTEzLjg2IDExLjU1LTEzLjg2eiIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWxpbmVjYXA9InNxdWFyZSIgZmlsbD0ibm9uZSI+PC9wYXRoPjxwYXRoIGQ9Ik0yMC4xNiAxNy4wMWg3LjU2IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIiBmaWxsPSJub25lIj48L3BhdGg+PHBhdGggZD0iTTE5LjUzIDIyLjA1aDguMTkiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHN0cm9rZS1saW5lY2FwPSJzcXVhcmUiIGZpbGw9Im5vbmUiPjwvcGF0aD48cGF0aCBkPSJNMjEuNDIgMjcuMDloNi4zIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIiBmaWxsPSJub25lIj48L3BhdGg+PHBhdGggZD0iTTEwLjcgMTQuMzRhNC41IDQuNSAwIDAgMC0wLjA3IDAuNjggNC42MiA0LjYyIDAgMCAwIDQuNjIgNC42MmMwLjA1IDAgMC4wOS0wLjAxIDAuMTQtMC4wMiIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgZmlsbD0ibm9uZSIgZGF0YS1jYXA9ImJ1dHQiPjwvcGF0aD48cGF0aCBkPSJNNy4yNyAyNy43MmExNi43NyAxNi43NyAwIDAgMSAwLjE2LTQuNjIiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIGZpbGw9Im5vbmUiIGRhdGEtY2FwPSJidXR0Ij48L3BhdGg+PHBhdGggZD0iTTExLjU1IDIzLjFjLTAuMTEgMS41NSAwLjA0IDMuMTIgMC40NCA0LjYyIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBmaWxsPSJub25lIiBkYXRhLWNhcD0iYnV0dCI+PC9wYXRoPjwvZz48L3N2Zz4=");
        width: 30px;
        height: 30px;
        background-repeat: no-repeat;
        cursor: pointer;
        background-size: 30px 30px;
      }
      .gantt_cell.gantt_last_cell.gantt_cell_tree {
        display: flex;
        align-items: center;
        align-items: center;
        justify-content: flex-start;
        gap: 5px;
      }
      .gantt_task_content {
        color: black;
        border: 0.5px solid #e5e5e5;
      }
      .wrapper {
        background: #e1e3ea;
        width: 100%;
        line-height: 10px;
      }
      .gantt_task_progress_drag {
        display: none !important;
      }
      .gantt_tooltip {
        background: #212529;
        color: #f8f9fa;
        border-radius: 12px;
        font-size: 13px;
        z-index: 9999999999999999999;
      }
      .gantt_task_content {
        font-size: 12px !important;
      }
      .gantt_scale_cell {
        color: black !important;
        font-weight: bold;
        font-size: 12px;
      }
      .gantt_grid_head_cell {
        color: black !important;
        font-weight: 500;
        font-size: 14px;
      }
      .gantt_tree_content {
        font-size: 13px;
      }
      .gantt_error_box {
        display: flex;
        align-items: center;
        justify-content: center;
        width: 100%;
        height: 100%;
        font-size: 1.5rem;
        color: red;
        background: #e5e5e5;
      }
      .gantt_empty_ui_box {
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        width: 100%;
        height: 100%;
        display: flex;
        align-items: center;
        justify-content: center;
        backdrop-filter: blur(2px);
      }
      .gatntt_empty_ui_text {
        font-size: 1.6rem;
        color: #636096;
        text-decoration: underline;
      }
      .selected_task {
        /* border: 10px solid black !important; */
        box-sizing: border-box !important;
        /* background: #e03131 !important; */
        box-shadow: 0px 0px 5px 3px rgba(0, 0, 0, 0.75) !important;
        /* background: repeating-linear-gradient(
            -45deg,
            hsl(178, 96%, 72%) 5%,
            hsla(59, 100%, 66%, 0.641) 15%
          ) !important; */
        z-index: 1100;
      }
      .related_task {
        border: none !important;
        box-sizing: border-box !important;
        /* background: #e03131 !important; */
        box-shadow: 0px 0px 5px 1px rgba(0, 0, 0, 0.75) !important;
        /* background: repeating-linear-gradient(
            -45deg,
            hsl(178, 96%, 72%) 5%,
            hsla(59, 100%, 66%, 0.641) 15%
          ) !important; */
        z-index: 1000;
      }
      .toast {
        position: fixed;
        top: 20px;
        right: 20px;
        background: #222;
        color: #fff;
        padding: 15px 30px;
        border-radius: 5px;
        z-index: 1000;
        opacity: 0;
        visibility: hidden;
        transition: all 0.3s ease-in-out;
        font-size: 12px;
      }
      .toast.show {
        opacity: 1;
        visibility: visible;
      }
      .sidebar-container {
        padding: 0px 3rem;
        display: flex;
        justify-content: space-between;
        align-items: center;
        height: 60px;
      }

      .logo-details {
        margin-right: 3.75rem;
        display: flex;
        align-items: center;
      }
      .logo-icon {
        font-size: 30px;
        color: #fff;
        height: 50px;
        min-width: 78px;
        text-align: center;
        line-height: 50px;
      }
      .logo-detail-icon {
        font-size: 18px;
        color: #fff;
        height: 35px;
        min-width: 78px;
        text-align: center;
        line-height: 60px;
      }
      .logo-name {
        font-size: 22px;
        color: #fff;
        font-weight: 600;
        transition: 0.3s ease;
        transition-delay: 0.1s;
      }
      .nav-links {
        display: flex;
        flex-direction: row;
        padding: 0;
        margin: 0;
        list-style: none;
        font-weight: 500;
        font-size: 1.15rem;
        gap: 1.3rem;
      }
      .nav-link {
        cursor: pointer;
        transition: all 0.3s ease;
        display: flex;
        align-items: center;
        padding: 0.6rem 1rem;
      }
      .nav-link:hover {
        background: #636096;
        color: white;
        border-radius: 8px;
      }
      .nav-link.active {
        background: #636096;
        color: white;
        border-radius: 8px;
      }
      .icon-link {
        display: flex;
        align-items: center;
        color: #3f4254;
        font-size: 1.05rem;
        letter-spacing: -0.02em;
        flex-grow: 1;
      }
      .icon-link:hover {
        background: #636096;
        color: white;
        border-radius: 8px;
      }
      .icon-link.active {
        background: #636096;
        color: white;
        border-radius: 8px;
      }
      .link-name {
        font-size: 15px;
        font-weight: 400;
        color: #fff;
        transition: all 0.4s ease;
      }
      .div-link {
        display: flex;
        justify-content: center;
        align-items: center;
      }
      .img-container {
        display: flex;
        justify-content: center;
        align-items: center;
        transition: all 0.3s ease;
      }
      .logo-img {
        width: 110px;
        height: 45px;
      }
      .toggle-btn {
        position: absolute;
        top: 8px;
        right: -17.5px;
        width: 35px;
        height: 35px;
        color: #000428;
        cursor: pointer;
        background: #e5e5e5;
        border-radius: 50%;
        display: flex;
        justify-content: center;
        align-items: center;
        font-size: 24px;
      }
      .icon-svg {
        width: 78px;
        height: 35px;
        fill: currentColor;
        color: white;
      }
      .side-selected {
        background: #636096;
        border-radius: 8px;
        color: white;
        box-shadow: 3px 3px 4px 0px rgba(0, 0, 0, 0.75);
      }
      .side-selected-text {
        background: #636096;
        border-radius: 8px;
        color: white;
      }
      .gantt_resizer_x.gantt_resizer_x {
        display: none;
      }
      .low_overlap {
        background: #fe908d !important;
        background-color: transparent !important;
        background-image: repeating-linear-gradient(
          45deg,
          transparent 0 5px,
          #eebefa 5px 10px
        ) !important;
        border: 2px solid #f3d9fa !important;
      }
      .middle_overlap {
        background: #ff4438 !important;
        background-color: transparent !important;
        background-image: repeating-linear-gradient(
          45deg,
          #cc5de8 0px 5px,
          transparent 5px 10px
        ) !important;
        border: 2px solid #da77f2 !important;
      }
      .high_overlap {
        background-image: repeating-linear-gradient(
          45deg,
          #862e9c 0 5px,
          #9c36b5 5px 10px
        ) !important;
        border: 2px solid #ae3ec9 !important;
      }
      .opacity_30 {
        opacity: 0.3 !important;
      }
      .opacity_full {
        opacity: 1 !important;
      }
      .z-index_front_1 {
        z-index: 100;
      }
      .z-index_front_2 {
        z-index: 50;
      }
      .z-index_front_3 {
        z-index: 10;
      }
      .z-index_front_4 {
        z-index: 5;
      }
      .z-index_back {
        z-index: 1;
      }
      .side-container {
        z-index: 100;
        position: fixed;
        left: 0;
        right: 0;
        top: 0;
        height: 60px;
        box-sizing: border-box;
      }
      .impossible_date {
        background-color: #eebefa;
        color: black !important;
        font-weight: bold !important;
      }
      .gantt_link_point {
        display: none !important;
      }
      .gantt_tree_icon {
        display: none;
      }
      .gantt_link_arrow.gantt_link_arrow_right {
        line-height: 0.5;
      }
      .current_develop {
        z-index: 9999999999999;
        width: 100vw;
        height: 100vh;
        background: rgba(0, 0, 0, 0.6);
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        color: white;
        font-size: 3rem;
        display: flex;
        align-items: center;
        justify-content: center;
        text-align: center;
      }
      .gantt_line_wrapper {
        z-index: 99999;
      }
      .gantt_link_arrow {
        z-index: 999999;
      }
      .gantt_layout_cell.gantt_layout_root {
        border-radius: 8px !important;
      }
      .complete_gantt {
        opacity: 0.35 !important;
        border: 1px solid black !important;
      }
      .title_box {
        position: fixed;
        top: 105px;
        padding: 5px 0px;
        width: 100%;
        display: flex;
        z-index: 99;
        background-color: #636096;
        box-shadow: 2.5px 2.5px 1.5px 0px rgba(0, 0, 0, 0.3);
        align-items: center;
        justify-content: center;
      }
      .title_text {
        font-size: 2rem;
        color: white;
        font-weight: 500;
        padding-left: 7.5%;
      }
      .title_btn_box {
        margin-left: auto;
        padding-right: 7.5%;
        display: flex;
        gap: 0.3rem;
        align-items: center;
        justify-content: center;
      }
      #gantt_1 {
        position: relative;
      }
      .gantt_message_area {
        z-index: 10000 !important;
      }
      .split-wrapper {
        margin-top: 60px;
        height: calc(100vh - 60px);
        width: 100vw;
        border-top: 3px solid rgb(206, 204, 204);
      }
      .split-horizontal {
        display: flex;
        flex-direction: row;
        height: calc(100vh - 60px);
      }
      .split-vertical {
        display: flex;
        flex-direction: column;
      }
      #split-0 {
        background-color: rgb(206, 204, 204);
        display: flex;
        align-items: center;
        justify-content: center;
        transition: all 0.5s;
      }
      #split-1 {
        background-color: rgb(206, 204, 204);
        transition: all 0.5s;
      }
      #split-1-1 {
        transition: all 0.5s;
      }
      #split-1-2 {
        transition: all 0.5s;
      }
      .gutter {
        background-color: rgb(206, 204, 204);
        background-repeat: no-repeat;
        background-position: 50%;
      }
      .gutter.gutter-horizontal {
        cursor: col-resize;
      }
      .gutter.gutter-vertical {
        cursor: row-resize;
        z-index: 999;
      }
      .left_section {
        display: flex;
        flex-direction: column;
        width: 98%;
        height: 100%;
        box-sizing: border-box;
        background-color: white;
        color: black;
        border-top-right-radius: 8px;
        border-bottom-right-radius: 8px;
      }
      .split_box {
        width: inherit;
        height: 100%;
        padding: 10px;
        box-sizing: border-box;
        display: flex;
        flex-direction: column;
        background: white;
        border-top-left-radius: 8px;
        border-bottom-left-radius: 8px;
      }
      .section_box {
        display: flex;
        align-items: center;
        justify-content: center;
        width: 100%;
      }
      .section_title {
        font-weight: 600;
        font-size: 1.2rem;
        color: #636096;
        margin-left: 1rem;
        padding: 12px 0px;
        display: flex;
        gap: 1rem;
        align-items: flex-end;
      }
      .left_section_title {
        font-weight: 600;
        font-size: 1.2rem;
        color: #636096;
        padding: 3px 0px;
        text-align: center;
      }
      .section_icon_area {
        display: flex;
        gap: 1rem;
        margin-left: auto;
        margin-right: 1rem;
      }
      .card_container {
        max-width: 24rem;
        min-width: 12rem;
        margin-left: auto;
        margin-right: auto;
        padding: 1rem;
        overflow-y: auto;
      }
      .card_container::-webkit-scrollbar {
        width: 10px;
      }
      .card_container::-webkit-scrollbar-thumb {
        background-color: rgba(99, 96, 150, 0.7);
        border-radius: 5px;
      }
      .card_container::-webkit-scrollbar-track {
        background-color: transparent;
      }
      .card_button_box {
        padding: 5px;
        display: flex;
        gap: 1rem;
        align-items: center;
        justify-content: center;
      }
      .custom-button {
        padding: 0.5rem 1.3rem;
        background-color: white;
        color: black;
        border: 1px solid #3490dc;
        border-radius: 0.25rem;
        font-size: 0.8rem;
        cursor: pointer;
        transition: background-color 0.3s ease;
      }
      .custom-button:hover {
        background-color: #2779bd;
        color: white;
      }
      .card-list {
        display: flex;
        flex-direction: column;
        gap: 1rem;
      }
      .card {
        background-color: #f5f5f5;
        box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
        transition: box-shadow 0.4s ease;
        position: relative;
        border-radius: 8px;
        border: 2px solid #e5e5e5;
      }
      .card.active {
        box-shadow: 0 0 0 2px #000, 0 0 0 4px #f9fafb,
          inset 0 2px 4px 0 rgba(0, 0, 0, 0.1);
        transform: scale(0.96);
      }
      .card-content {
        padding: 0.8rem;
        display: flex;
        flex-direction: column;
        gap: 0.3rem;
        justify-content: center;
      }
      .card-inner-content {
        display: flex;
        flex-direction: column;
        width: 100%;
        border: 1.5px solid #e5e5e5;
        border-radius: 8px;
      }
      .card-title {
        font-size: 1.125rem;
        font-weight: 600;
        color: #1f2937;
        text-align: center;
        padding-top: 0.5rem;
      }
      .card-inner-inner-box {
        display: flex;
        gap: 0.6rem;
        flex-wrap: wrap;
        align-items: center;
        padding: 0.5rem;
      }
      .card-text {
        font-size: 0.875rem;
        color: #4b5563;
        padding: 0.5rem 0;
      }
      .card-text-small {
        font-size: 0.7rem;
        color: white;
        background: #636096;
        border-radius: 12px;
        display: inline;
        cursor: pointer;
        padding: 4px 0.6rem;
      }
      #scheduled_orders {
        height: 80%;
        border: none;
      }
      .tabulator {
        background: white !important;
        border: none !important;
      }
      .tabulator-header {
        border-bottom: 1.5px solid #868e96 !important;
        background: white !important;
      }
      .tabulator-headers {
        background: white !important;
        color: #868e96;
        border: none;
      }
      .tabulator-header-contents {
        border: none;
      }
      .tabulator-header.tabulator-col {
        border: none;
      }
      .tabulator-col.tabulator-sortable.tabulator-col-sorter-element {
        border: none;
      }
      .tabulator-col {
        background-color: white !important;
        border: none !important;
      }
      .tabulator-cell {
        border: none !important;
      }
      .tabulator-header.tabulator-col.tabulator-col-content {
        background: white !important;
        color: #868e96;
      }
      .tabulator-footer {
        border: none !important;
        background: white !important;
      }
      .tabulator .tabulator-tableholder {
        overflow-x: hidden;
      }
      .tab_box {
        display: flex;
        align-items: center;
        justify-content: space-evenly;
        height: 10%;
        z-index: 999;
        box-shadow: 0px -1px 2px -2px rgba(0, 0, 0, 0.75);
      }
      .left_tab_box {
        display: flex;
        align-items: center;
        justify-content: space-evenly;
        height: 8%;
        z-index: 999;
        box-shadow: 0px -1px 2px -2px rgba(0, 0, 0, 0.75);
        margin-top: auto;
      }
      .left_tab_inner {
        text-align: left;
        font-size: 0.7rem;
        border-right: 0.5px solid #cecccc;
        width: 50%;
        height: 100%;
        font-weight: 300;
        opacity: 0.8;
        box-sizing: border-box;
        padding-left: 0.7rem;
        cursor: pointer;
        background: #e6e6e6;
        display: flex;
        align-items: center;
      }
      .left_tab_inner.active {
        background-color: #fff;
        border-color: #cecccc;
        font-weight: bold;
      }
      .tab_inner {
        text-align: left;
        font-size: 0.7rem;
        border-right: 0.5px solid #cecccc;
        width: 25%;
        height: 100%;
        font-weight: 300;
        opacity: 0.8;
        box-sizing: border-box;
        padding-left: 0.7rem;
        cursor: pointer;
        background: #e6e6e6;
        display: flex;
        align-items: center;
      }
      .tab_inner:last-child {
        border-right: none !important;
      }
      .tab_inner.active {
        background-color: #fff;
        border-color: #cecccc;
        font-weight: bold;
      }
    </style>
    <style>
      .gantt_container ::-webkit-scrollbar {
        width: 10px;
        height: 10px;
      }
      .gantt_container ::-webkit-scrollbar-thumb {
        background-color: rgba(99, 96, 150, 0.7);
        border-radius: 5px;
      }
      .tabulator .tabulator-tableholder::-webkit-scrollbar {
        width: 10px;
        height: 10px;
      }
      .tabulator .tabulator-tableholder::-webkit-scrollbar-thumb {
        background-color: rgba(99, 96, 150, 0.7);
        border-radius: 5px;
      }
    </style>
    <style>
      .dropdown {
        position: relative;
      }

      .dropdown-content {
        display: none;
        position: absolute;
        top: 100%;
        left: 0;
        background-color: white;
        min-width: 200px;
        box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1);
        border-radius: 8px;
        padding: 10px;
        z-index: 1000;
      }

      .dropdown:hover .dropdown-content {
        display: block;
      }

      .checkbox-item {
        display: flex;
        align-items: center;
        padding: 8px 12px;
        cursor: pointer;
        transition: background-color 0.3s;
      }

      .checkbox-item:hover {
        background-color: #f5f5f5;
      }

      .checkbox-item input[type="checkbox"] {
        margin-right: 10px;
      }

      .checkbox-item span {
        color: #333;
        font-size: 14px;
      }

      /* 체크박스 스타일링 */
      .checkbox-item input[type="checkbox"] {
        width: 16px;
        height: 16px;
        accent-color: #636096;
      }

      /* 드롭다운이 표시될 때 부모 요소의 스타일 */
      .dropdown:hover {
        background: #636096;
        border-radius: 8px;
      }

      .dropdown:hover .icon-link {
        color: white;
      }
    </style>
    <style>
      /* result plan modal */
      .res-modal {
        display: none;
        position: fixed;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
        background-color: rgba(0, 0, 0, 0.5);
        z-index: 100000;
      }

      .res-modal-content {
        position: relative;
        width: 55vw;
        height: 80vh;
        margin: 10vh auto;
        background: white;
        border-radius: 8px;
        overflow: hidden;
        display: flex;
        flex-direction: column;
      }
      .res-top-header {
        padding-left: 1.5rem;
        background: #f8f9fa;
        border-bottom: 1px solid #e2e8f0;
      }

      .res-top-title {
        font-size: 1.4rem;
        font-weight: bold;
        color: #2d3748;
        margin-bottom: 0.5rem;
      }
      .res-content-wrapper {
        display: flex;
        flex: 1;
        overflow: hidden;
        height: 100%;
      }

      .res-sidebar {
        display: flex;
        flex-direction: column;
        width: 300px;
        height: 100%;
        border-right: 1px solid #ddd;
      }

      .res-main-content {
        width: 75%;
        flex: 1;
        height: 100%;
        display: flex;
        flex-direction: column;
      }

      .res-header {
        border-bottom: 1px solid #e2e8f0;
        display: flex;
        align-items: center;
        justify-content: space-between;
        padding: 0 1.3rem;
      }

      .res-header-title {
        font-size: 1.1rem;
        font-weight: bold;
      }

      .res-header-description {
        color: #6b7280;
        font-size: 0.875rem;
      }

      .res-scroll-area {
        flex: 1;
        overflow-y: auto;
        overflow-x: hidden;
        padding: 1.1rem;
      }
      .res-scroll-area.left {
        height: calc(100% - 60px);
      }
      .res-scroll-area::-webkit-scrollbar {
        width: 10px;
      }

      .res-scroll-area::-webkit-scrollbar-thumb {
        background-color: rgba(99, 96, 150, 0.7);
        border-radius: 5px;
      }

      .res-scroll-area::-webkit-scrollbar-track {
        background-color: transparent;
      }

      .res-card {
        padding: 1rem;
        margin-bottom: 1rem;
        border: 1px solid #e2e8f0;
        border-radius: 6px;
        cursor: pointer;
        transition: background-color 0.2s;
      }

      .res-card:hover {
        background-color: #f3f4f6;
      }

      .res-card.res-selected {
        background-color: #2563eb;
        color: white;
      }

      .res-card.res-selected .res-card-description-key {
        color: rgba(255, 255, 255, 0.8);
      }

      .res-card.res-selected .res-card-description-value {
        color: rgba(255, 255, 255, 0.8);
      }

      .res-card-title {
        font-weight: bold;
        margin-bottom: 0.25rem;
      }
      .res-card-description-box {
        display: flex;
        gap: 1rem;
        align-items: center;
      }
      .res-card-description-key {
        color: #6b7280;
        font-size: 0.875rem;
        text-align: right;
      }
      .res-card-description-value {
        color: #6b7280;
        font-size: 0.875rem;
        text-align: left;
      }
      .res-form-group {
        margin-bottom: 1rem;
      }
      .res-label {
        display: block;
        margin-bottom: 0.5rem;
        font-size: 0.875rem;
        font-weight: 500;
      }
      .res-input,
      .res-textarea {
        width: 100%;
        padding: 0.5rem;
        border: 1px solid #e2e8f0;
        border-radius: 4px;
        font-size: 0.875rem;
      }
      .res-textarea {
        min-height: 100px;
        resize: vertical;
      }
      #batchBtn {
        margin-left: auto;
      }
      .res-footer {
        padding: 10px 20px;
        border-top: 1px solid #ddd;
        display: flex;
        justify-content: flex-end;
        gap: 10px;
      }
      .res-btn {
        padding: 0.5rem 1rem;
        border-radius: 4px;
        font-weight: 500;
        cursor: pointer;
      }
      .res-btn-outline {
        border: 1px solid #e2e8f0;
        background: white;
      }
      .res-btn-primary {
        background: #2563eb;
        color: white;
        border: none;
      }
      .res-btn-primary:disabled {
        opacity: 0.5;
        cursor: not-allowed;
      }
      .res-placeholder {
        text-align: center;
        color: #6b7280;
        padding-top: 2rem;
      }
      .res-loading {
        text-align: center;
        padding: 2rem;
        color: #6b7280;
        font-size: 1rem;
      }
      .res-error {
        text-align: center;
        padding: 2rem;
        color: #dc2626;
        font-size: 1rem;
        background-color: #fee2e2;
        border-radius: 0.5rem;
        margin: 1rem;
      }
      @keyframes res-spin {
        to {
          transform: rotate(360deg);
        }
      }

      .res-loading:before {
        content: "";
        display: block;
        width: 30px;
        height: 30px;
        border-radius: 50%;
        border: 3px solid #6b7280;
        border-top-color: transparent;
        animation: res-spin 1s linear infinite;
        margin: 0 auto 1rem;
      }
      .res-performance-container {
        display: flex;
        flex-direction: column;
        gap: 1.5rem;
        padding: 1rem;
      }

      .res-proc-cards {
        display: flex;
        gap: 1rem;
        overflow-x: auto;
        padding: 0.5rem 0.25rem;
      }
      .res-proc-cards::-webkit-scrollbar {
        height: 8px;
      }

      .res-proc-cards::-webkit-scrollbar-thumb {
        background-color: rgba(99, 96, 150, 0.7);
        border-radius: 4px;
      }

      .res-proc-cards::-webkit-scrollbar-track {
        background-color: transparent;
      }

      .res-proc-card {
        min-width: 200px;
        background: white;
        border: 1px solid #e2e8f0;
        border-radius: 8px;
        padding: 1rem;
        cursor: pointer;
        transition: all 0.2s ease;
        position: relative;
        overflow: hidden;
      }

      .res-proc-card:hover {
        transform: translateY(-2px);
        box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1),
          0 2px 4px -1px rgba(0, 0, 0, 0.06);
      }

      .res-proc-card-content {
        display: flex;
        flex-direction: column;
        gap: 0.5rem;
      }

      .res-proc-card-title {
        font-size: 1.1rem;
        font-weight: 600;
        color: #2d3748;
      }

      .res-proc-card-count {
        font-size: 0.875rem;
        color: #6b7280;
      }

      .res-proc-card-indicator {
        position: absolute;
        bottom: 0;
        left: 0;
        width: 100%;
        height: 3px;
        background: transparent;
        transition: background-color 0.2s ease;
      }

      .res-proc-card-active {
        border-color: #6366f1;
        background: #f8fafc;
      }

      .res-proc-card-active .res-proc-card-indicator {
        background: #6366f1;
      }

      /* loading indicator */
      .loading-container {
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        text-align: center;
      }

      .loading-spinner {
        width: 50px;
        height: 50px;
        border: 5px solid #f3f3f3;
        border-top: 5px solid #3498db;
        border-radius: 50%;
        animation: spin 1s linear infinite;
        margin: 0 auto 20px;
      }

      .loading-text {
        color: #666;
        font-size: 16px;
        font-weight: 500;
      }

      @keyframes spin {
        0% {
          transform: rotate(0deg);
        }
        100% {
          transform: rotate(360deg);
        }
      }
    </style>
    <style>
      #performanceModal {
        width: 100vw;
        height: calc(100vh - 60px);
        position: absolute;
        top: 60px;
        background: #fff;
        display: none;
        z-index: 1000;
        border: 1px solid #ddd;
      }
      #result_plan.active {
        background-color: #636096;
        color: white;
        border-radius: 8px;
      }

      .res-header {
        display: flex;
        align-items: center;
        justify-content: space-between;
        padding: 20px;
      }

      .btn {
        padding: 8px 16px;
        border-radius: 4px;
        font-weight: 500;
        cursor: pointer;
      }

      .btn-primary {
        background-color: #2563eb;
        color: white;
        border: none;
      }

      .btn-primary:hover {
        background-color: #3730a3;
      }
      .btn-primary:disabled {
        opacity: 0.5;
        cursor: not-allowed;
      }
      .btn-secondary {
        background-color: #fff;
        color: #374151;
        border: 1px solid #d1d5db;
      }

      .btn-secondary:hover {
        background-color: #f3f4f6;
      }
      .display_none {
        display: none !important;
      }
      .display_block {
        display: block !important;
      }
    </style>
  </head>
  <body>
    <div class="side-container">
      <aside class="sidebar-container">
        <div class="logo-details">
          <div class="img-container">
            <img
              class="logo-img"
              alt="logo"
              src="data:image/png;base64,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"
            />
          </div>
        </div>
        <ul class="nav-links">
          <li class="nav-link" id="result_plan">
            <div class="icon-link">
              &#xc2e4;&#xc801;&#xacc4;&#xd68d;&#x20;&#xc785;&#xb825;
            </div>
          </li>
          <li class="nav-link dropdown display_none">
            <div class="icon-link">화면 레이아웃</div>
            <div class="dropdown-content">
              <label class="checkbox-item">
                <input type="checkbox" id="header" checked />
                <span>사이드 영역</span>
              </label>
              <label class="checkbox-item">
                <input type="checkbox" id="sidebar" checked />
                <span>간트 영역</span>
              </label>
              <label class="checkbox-item">
                <input type="checkbox" id="main" checked />
                <span>하단 영역</span>
              </label>
            </div>
          </li>
          <li class="nav-link" id="add_plan">
            <div class="icon-link">
              &#xc0dd;&#xc0b0;&#xacc4;&#xd68d;&#x20;&#xad00;&#xb9ac;
            </div>
          </li>
          <li class="nav-link" id="machine_management">
            <div class="icon-link">&#xc7a5;&#xbe44;&#x20;&#xc815;&#xbcf4;</div>
          </li>
          <li class="nav-link" id="master_data_management">
            <div class="icon-link">
              &#xae30;&#xc900;&#x20;&#xb370;&#xc774;&#xd130;&#x20;&#xad00;&#xb9ac;
            </div>
          </li>
          <li class="nav-link" id="main_btn">
            <div class="icon-link">&#xc885;&#xd569;&#x20;&#xd604;&#xd669;</div>
          </li>
        </ul>
      </aside>
    </div>
    <!-- split -->
    <div class="split-wrapper">
      <div class="split-horizontal">
        <div id="split-0">
          <div class="left_section">
            <div id="left_section_title" class="left_section_title">
              &#xae30;&#xc900;&#xc815;&#xbcf4;&#x20;&#xd655;&#xc778;
            </div>
            <!-- <div class="card_button_box">
              <button class="custom-button">버튼1</button>
              <button class="custom-button">버튼2</button>
            </div> -->
            <div class="card_container">
              <div class="card-list" id="cardList"></div>
            </div>
            <!-- <div class="left_tab_box">
              <div class="left_tab_inner active" onclick="clickLeftTabOne()">
                기준정보 확인
              </div>
              <div class="left_tab_inner" onclick="clickLeftTabTwo()">
                전체 가용장비
              </div>
            </div> -->
          </div>
        </div>
        <div id="split-1" class="split-vertical">
          <div id="split-1-1">
            <div class="split_box">
              <div class="section_box">
                <div class="section_title">
                  GANTT CHART
                  <div
                    class="warning_icon"
                    title="&#xae30;&#xc900;&#xc815;&#xbcf4;&#x20;&#xbcc0;&#xacbd;&#x20;&#xc54c;&#xb9bc;"
                    id="warningIcon"
                  >
                    <div class="warning_tooltip" id="warningTooltip">
                      <div class="warning_tooltip_container">
                        <div class="warning_header">
                          <div class="circle_check_icon"></div>
                          <div class="warning_title">
                            &#xae30;&#xc900;&#xc815;&#xbcf4;&#x20;&#xbcc0;&#xacbd;&#x20;&#xc54c;&#xb9bc;
                          </div>
                        </div>
                        <div class="warning_content"></div>
                      </div>
                    </div>
                  </div>
                </div>
                <div class="section_icon_area">
                  <div
                    class="reset_icon"
                    title="&#xd655;&#xb300;&sol;&#xcd95;&#xc18c;&#x20;&#xcd08;&#xae30;&#xd654;"
                    onclick="resetGanttConfig()"
                  ></div>
                  <div
                    class="zoom_in_icon"
                    title="&#xc2dc;&#xac04;&#x20;&#xb2e8;&#xc704;&#x20;&#xcd95;&#xc18c;"
                    onclick="zoomInBoth()"
                  ></div>
                  <div
                    class="zoom_out_icon"
                    title="&#xc2dc;&#xac04;&#x20;&#xb2e8;&#xc704;&#x20;&#xd655;&#xb300;"
                    onclick="zoomOutBoth()"
                  ></div>
                  <div
                    class="window_mode_icon"
                    title="&#xc804;&#xccb4;&#x20;&#xd654;&#xba74;"
                    onclick="screenToggleFunction()"
                  ></div>
                </div>
              </div>
              <div id="gantt_1" style="height: 92%; width: 100%"></div>
            </div>
          </div>
          <div id="split-1-2">
            <div class="split_box">
              <div class="section_title">Scheduled Orders</div>
              <div id="scheduled_orders"></div>
              <!-- <div class="tab_box">
                <div class="tab_inner active" onclick="showTable()">
                  Tab Number1
                </div>
                <div class="tab_inner" onclick="clickTab2()">Tab Number2</div>
                <div class="tab_inner" onclick="clickTab3()">Tab Number3</div>
                <div class="tab_inner" onclick="clickTab4()">Tab Number4</div>
              </div> -->
            </div>
          </div>
        </div>
      </div>
    </div>

    <!-- result modal -->
    <div id="performanceModal">
      <div class="res-content-wrapper">
        <!-- 왼쪽 사이드바 -->
        <div class="res-sidebar">
          <div class="res-header">
            <h2 class="res-header-title">&#xc8fc;&#xbb38;</h2>
          </div>
          <div id="ordersList" class="res-scroll-area left">
            <!-- 주문 목록이 여기에 동적으로 추가됨 -->
          </div>
        </div>

        <!-- 메인 컨텐츠 영역 -->
        <div class="res-main-content">
          <div class="res-header">
            <h2 class="res-header-title">
              &#xc8fc;&#xbb38;&#x20;&#xc0c1;&#xc138;
            </h2>
            <button id="batchBtn" class="res-btn res-btn-primary">
              &#xc120;&#xd0dd;&#x20;&#xc8fc;&#xbb38;&#x20;&#xc2e4;&#xc801;&#x20;&#xc77c;&#xad04;&#xcc98;&#xb9ac;
            </button>
          </div>
          <div class="res-scroll-area">
            <div id="formContainer">
              <!-- 폼 내용 -->
            </div>
          </div>
          <div class="res-footer">
            <button
              id="result_cancel_button"
              class="btn btn-secondary"
              onclick="togglePerformanceView()"
            >
              &#x20;&#xcde8;&#xc18c;
            </button>
            <button class="btn btn-primary" id="submitBtn">
              &#xc785;&#xb825;
            </button>
          </div>
        </div>
      </div>
    </div>
    <script>
      // 전역 변수 및 함수
      function createLoadingIndicator() {
        return (
          '<div class="loading-container">' +
          '<div class="loading-spinner"></div>' +
          '<div class="loading-text">&#xb85c;&#xb529;&#xc911;...</div>' +
          "</div>"
        );
      }
      let arr = [];
      let scrollLocation = { x: 0, y: 0 };
      let selectedOrder = null;
      let activeCard = null;
      let selectedResultData = null;
    </script>
    <script>
      let previousContent = null;
      function togglePerformanceView() {
        const performanceModal = document.getElementById("performanceModal");
        const resultPlanButton = document.getElementById("result_plan");
        const mainLayoutButton = document.getElementById("main_btn");
        const buttonInnerTextEl = resultPlanButton.querySelector(".icon-link");
        const splitWrapper = document.querySelector(".split-wrapper");
        const currentIframe = document.querySelector("iframe");
        performanceModal.classList.remove("display_block");
        performanceModal.classList.add("display_none");
        // 상단 버튼 모음 (실적빼고)
        const masterDataBtn = document.getElementById("master_data_management");
        const mchBtn = document.getElementById("machine_management");
        const planBtn = document.getElementById("add_plan");
        const buttons = [masterDataBtn, mchBtn, planBtn];
        buttons.forEach((button) => {
          button.classList.remove("active");
          button.querySelector(".icon-link").classList.remove("active");
          button.setAttribute("data-active", "false");
        });
        if (resultPlanButton.classList.contains("active")) {
          // 실적계획 화면을 닫고 메인 화면으로 돌아가기
          resultPlanButton.classList.remove("active");
          buttonInnerTextEl.classList.remove("active");
          mainLayoutButton.classList.add("active");
          mainLayoutButton.querySelector(".icon-link").classList.add("active");
          const iframeContainer = document.querySelector("iframe");
          iframeContainer?.classList.remove("display_block");
          iframeContainer?.classList.add("display_none");
          splitWrapper.classList.remove("display_none");
          splitWrapper.classList.add("display_block");
          selectedOrder = null;
          fetchData();
          fetchMultipleData();
          fetchTableData();
        } else {
          mainLayoutButton.classList.remove("active");
          mainLayoutButton
            .querySelector(".icon-link")
            .classList.remove("active");
          performanceModal.classList.remove("display_none");
          performanceModal.classList.add("display_block");
          resultPlanButton.classList.add("active");
          buttonInnerTextEl.classList.add("active");
          renderForm([]);
        }
      }
      // 실적계획 버튼 클릭 이벤트 리스너
      document
        .getElementById("result_plan")
        .addEventListener("click", togglePerformanceView);
    </script>
    <script>
      const tabulatorResultModalColumns = [
        {
          formatter: "rowSelection",
          titleFormatter: "rowSelection",
          headerSort: false,
          width: 50,
          headerHozAlign: "center",
          hozAlign: "center",
        },
        {
          title: "&#xc81c;&#xd488;&#xba85;",
          field: "item_name",
          hozAlign: "center",
          headerHozAlign: "center",
        },
        {
          title: "&#xc7a5;&#xbe44;&#xba85;",
          field: "mch_name",
          hozAlign: "center",
          headerHozAlign: "center",
        },
        {
          title: "&#xacf5;&#xc815;&#xba85;",
          field: "proc_name",
          hozAlign: "center",
          headerHozAlign: "center",
        },
        {
          title: "&#xc2dc;&#xc791;&#xc77c;",
          field: "start_date",
          hozAlign: "center",
          editor: "datetime",
          formatter: function (cell, formatterParams, onRendered) {
            const dateInfo = String(cell.getValue()).replace("T", "");
            const datePart = dateInfo.slice(5, 10);
            const timePart = dateInfo.slice(10, 16).endsWith(":")
              ? dateInfo.slice(10, 15)
              : dateInfo.slice(10, 16);

            return datePart + " " + timePart;
          },
          headerHozAlign: "center",
          cellEdited: function (cell) {
            const field = cell.getField();
            const row = cell.getRow();
            const rowData = row.getData();
            rowData.start_date_edit = true;
            row.update(rowData);
          },
        },
        {
          title: "&#xc885;&#xb8cc;&#xc77c;",
          field: "end_date",
          hozAlign: "center",
          editor: "datetime",
          formatter: function (cell, formatterParams, onRendered) {
            const dateInfo = String(cell.getValue()).replace("T", "");
            const datePart = dateInfo.slice(5, 10);
            const timePart = dateInfo.slice(10, 16).endsWith(":")
              ? dateInfo.slice(10, 15)
              : dateInfo.slice(10, 16);
            return datePart + " " + timePart;
          },
          headerHozAlign: "center",
          cellEdited: function (cell) {
            const field = cell.getField();
            const row = cell.getRow();
            const rowData = row.getData();
            rowData.end_date_edit = true;
            row.update(rowData);
          },
        },
      ];
      const resModal = document.getElementById("performanceModal");
      const openModalBtn = document.getElementById("result_plan");
      const cancelBtn = document.getElementById("result_cancel_button");
      const submitBtn = document.getElementById("submitBtn");
      const ordersList = document.getElementById("ordersList");
      const formContainer = document.getElementById("formContainer");
      const batchButton = document.getElementById("batchBtn");
      const closeModalResetFunction = () => {
        resModal.classList.remove("display_block");
        resModal.classList.add("display_none");
        selectedOrder = null;
        submitBtn.disabled = true;
        batchButton.disabled = true;
        formContainer.innerHTML =
          '<div class="res-placeholder">' +
          "&#xc67c;&#xcabd;&#x20;&#xc601;&#xc5ed;&#xc5d0;&#xc11c;&#x20;&#xc2e4;&#xc801;&#xc744;&#x20;&#xc785;&#xb825;&#xd560;&#x20;&#xc8fc;&#xbb38;&#xc744;&#x20;&#xd074;&#xb9ad;&#xd574;&#x20;&#xc8fc;&#xc138;&#xc694;." +
          "</div>";
        activeCard = null;
      };
      openModalBtn.onclick = async function () {
        try {
          // 로딩 상태 표시
          ordersList.innerHTML =
            '<div class="res-loading">Loading orders...</div>';
          const response = await fetch(
            "http://plan.s-factview.com/getInsightwinOrderListForStatus?data=1"
          );
          const response2 = await fetch(
            "http://plan.s-factview.com/getInsightwinItemList"
          );
          const data = await response.json();
          const itemData = await response2.json();
          const orders = data.map(function (item) {
            const { item_name, proc_time, proc_qty } = itemData[0].filter(
              (c) => c.item_id === item.item_id
            )[0];
            return {
              id: item.order_id.toString(),
              name: item.order_name,
              item_name,
              proc_time,
              proc_qty,
              start_date: item.start_date,
              // due_date 수정해야됨. end_date는 임시임.
              due_date: item.end_date,
              description: item.description || "Order description",
            };
          });
          renderOrders(orders);
        } catch (error) {
          console.error("Error fetching orders:", error);
          ordersList.innerHTML =
            '<div class="res-error">' +
            "Failed to load orders. Please try again." +
            "</div>";
        }
      };
      cancelBtn.onclick = () => {
        closeModalResetFunction();
      };
      window.onclick = (e) => {
        if (e.target === resModal) {
          closeModalResetFunction();
        }
      };

      function renderOrders(ordersData) {
        ordersList.innerHTML = ordersData
          .map(function (order) {
            return (
              '<div class="res-card ' +
              (order.id === selectedOrder ? "res-selected" : "") +
              '"' +
              ' data-id="' +
              order.id +
              '">' +
              '<div class="res-card-title">' +
              order.name +
              "</div>" +
              '<div class="res-card-description-box">' +
              '<div class="res-card-description-key">' +
              "&#xc81c;&#xd488;&#xba85; : " +
              "</div>" +
              '<div class="res-card-description-value">' +
              order.item_name +
              "</div>" +
              "</div>" +
              '<div class="res-card-description-box">' +
              '<div class="res-card-description-key">' +
              "&#xc18c;&#xc694;&#xc2dc;&#xac04; : " +
              "</div>" +
              '<div class="res-card-description-value">' +
              Number(order.proc_time) / 60 +
              "&#xc2dc;&#xac04;" +
              "</div>" +
              "</div>" +
              '<div class="res-card-description-box">' +
              '<div class="res-card-description-key">' +
              "&#xacf5;&#xc815;&#x20;&#xc218; : " +
              "</div>" +
              '<div class="res-card-description-value">' +
              order.proc_qty +
              "&#xacf5;&#xc815;" +
              "</div>" +
              "</div>" +
              "</div>"
            );
          })
          .join("");

        document.querySelectorAll(".res-card").forEach(function (card) {
          card.onclick = async function () {
            try {
              const response = await fetch(
                "http://plan.s-factview.com/getAiResultDevDataForQuery?data=" +
                  String(card.dataset.id)
              );
              const data = await response.json();
              selectedOrder = card.dataset.id;
              submitBtn.disabled = false;
              batchButton.disabled = false;
              renderOrders(ordersData);
              renderForm(data);
            } catch (e) {
              throw new Error(e);
            }
          };
        });
      }

      function renderForm(data) {
        batchButton.disabled = true;
        submitBtn.disabled = true;
        if (!selectedOrder) {
          formContainer.innerHTML =
            '<div class="res-placeholder">' +
            "&#xc67c;&#xcabd;&#x20;&#xc601;&#xc5ed;&#xc5d0;&#xc11c;&#x20;&#xc2e4;&#xc801;&#xc744;&#x20;&#xc785;&#xb825;&#xd560;&#x20;&#xc8fc;&#xbb38;&#xc744;&#x20;&#xd074;&#xb9ad;&#xd574;&#x20;&#xc8fc;&#xc138;&#xc694;&period;" +
            "</div>";
          return;
        }
        if (!data.length) {
          formContainer.innerHTML =
            '<div class="res-placeholder">' +
            "&#xc120;&#xd0dd;&#xd55c;&#x20;&#xc8fc;&#xbb38;&#xc5d0;&#x20;&#xc2e4;&#xc801;&#xc744;&#x20;&#xcc98;&#xb9ac;&#xd560;&#x20;&#xd56d;&#xbaa9;&#xc774;&#x20;&#xc5c6;&#xc2b5;&#xb2c8;&#xb2e4;&period;" +
            "</div>";
          submitBtn.disabled = true;
          batchButton.disabled = true;
          return;
        }
        const sortedData = data.sort(
          (a, b) => a.proc_sequence_no - b.proc_sequence_no
        );
        const procNameSet = [...new Set(sortedData.map((i) => i.proc_name))];
        formContainer.innerHTML =
          '<div class="res-performance-container">' +
          '<div id="performance-proc-card" class="res-proc-cards"></div>' +
          '<div id="performance-table"></div>' +
          "</div>";
        const procCardContainer = document.getElementById(
          "performance-proc-card"
        );
        procCardContainer.innerHTML = procNameSet
          .map(function (procName) {
            return (
              '<div class="res-proc-card" data-proc-name="' +
              procName +
              '">' +
              '<div class="res-proc-card-content">' +
              '<div class="res-proc-card-title">' +
              "&#xacf5;&#xc815;&#xba85; : " +
              procName +
              "</div>" +
              '<div class="res-proc-card-count">' +
              data.filter(function (item) {
                return item.proc_name === procName;
              }).length +
              " &#xc791;&#xc5c5;" +
              "</div>" +
              "</div>" +
              '<div class="res-proc-card-indicator"></div>' +
              "</div>"
            );
          })
          .join("");
        const modalInnerTable = new Tabulator("#performance-table", {
          data: data,
          layout: "fitColumns",
          height: "100%",
          columns: tabulatorResultModalColumns,
          tooltips: true,
          addRowPos: "top",
          history: true,
          pagination: "local",
          paginationSize: 15,
          movableColumns: true,
          resizableRows: true,
          initialSort: [{ column: "order_name", dir: "asc" }],
        });
        modalInnerTable.on("rowSelectionChanged", function (data, rows) {
          selectedResultData = data;
          if (selectedResultData.length) {
            batchButton.disabled = false;
            submitBtn.disabled = false;
          } else {
            batchButton.disabled = true;
            submitBtn.disabled = true;
          }
        });
        document.querySelectorAll(".res-proc-card").forEach(function (card) {
          card.addEventListener("click", function () {
            const procName = this.dataset.procName;
            if (activeCard === this) {
              this.classList.remove("res-proc-card-active");
              modalInnerTable.setData(data);
              activeCard = null;
            } else {
              document.querySelectorAll(".res-proc-card").forEach(function (c) {
                c.classList.remove("res-proc-card-active");
              });
              this.classList.add("res-proc-card-active");
              const filteredData = data.filter(function (item) {
                return item.proc_name === procName;
              });
              modalInnerTable.setData(filteredData);
              activeCard = this;
            }
          });
        });
      }
      // renderForm();
      submitBtn.onclick = async (e) => {
        e.preventDefault();
        try {
          const formattedData = selectedResultData.map((content, index) => {
            return {
              proc_id: content.id,
              start_date: content.start_date_edit ? content.start_date : null,
              end_date: content.end_date_edit ? content.end_date : null,
            };
          });
          const response = await fetch("/postProductionResultData", {
            method: "POST",
            headers: {
              "Content-Type": "application/json",
            },
            body: JSON.stringify(formattedData),
          });

          if (!response.ok) {
            throw new Error("Network response was not ok");
          }
          const data = await response.json();
          window.alert(
            "&#xc2e4;&#xc801;&#x20;&#xc785;&#xb825;&#xc774;&#x20;&#xc644;&#xb8cc;&#xb418;&#xc5c8;&#xc2b5;&#xb2c8;&#xb2e4;."
          );
        } catch (error) {
          console.error("Error:", error);
        }
      };
      batchButton.onclick = (e) => {
        window.alert(
          "&#xac1c;&#xbc1c;&#xc911;&#xc778;&#x20;&#xae30;&#xb2a5;&#xc785;&#xb2c8;&#xb2e4;."
        );
        e.preventDefault();
      };
    </script>
    <script>
      function fetchTableData() {
        fetch("getInsightwinOrderListForStatus?data=2")
          .then((response) => response.json())
          .then((data) => {
            const tabledata = data;
            initTable(tabledata);
          })
          .catch((error) => {
            console.error("Error fetching data:", error);
          });
      }

      function initTable(tabledata) {
        table = new Tabulator("#scheduled_orders", {
          layout: "fitColumns",
          tooltips: true,
          addRowPos: "top",
          history: true,
          pagination: "local",
          paginationSize: 7,
          movableColumns: true,
          resizableRows: true,
          data: tabledata,
          initialSort: [{ column: "name", dir: "asc" }],
          columns: [
            {
              title: "주문명",
              field: "order_name",
              editor: false,
              width: "20%",

              vertAlign: "middle",
            },
            {
              title: "아이템명",
              field: "item_name",
              align: "left",
              width: "15%",
              editor: false,
              vertAlign: "middle",
            },
            {
              title: "수량",
              field: "qty",
              width: "13%",
              editor: false,
              vertAlign: "middle",
            },
            {
              title: "시작 시간",
              field: "start_date",
              align: "center",
              width: "20%",
              editor: false,
              vertAlign: "middle",
            },
            {
              title: "종료 시간",
              field: "end_date",
              align: "center",
              width: "20%",
              editor: false,
              vertAlign: "middle",
            },
            {
              title: "Color",
              field: "color",
              width: "12%",
              formatter: function (cell, formatterParams, onRendered) {
                let value = cell.getValue();
                return (
                  "<div style='width:35px; height:35px; background-color:" +
                  value +
                  "; border:none;'></div>"
                );
              },
              editor: false,
              vertAlign: "middle",
            },
          ],
        });
        table.on("rowClick", (e, row) => {
          arr = arr.map((c) => {
            if (c.orderId === row.getData().order_id && !c.isCompleted) {
              return {
                ...c,
                isSelected: true,
                isRelated: false,
              };
            } else {
              return {
                ...c,
                isSelected: false,
                isRelated: false,
              };
            }
          });
          const scrollX = scrollLocation.x;
          const scrollY = scrollLocation.y;
          const task = arr
            .filter(
              (c) => c.orderId === row.getData().order_id && !c.isCompleted
            )
            .sort((a, b) => a.start_date - b.start_date)[0];
          const sizes = gantt1.getTaskPosition(
            task,
            task.start_date,
            task.end_date
          );
          gantt1.clearAll();
          gantt1.refreshData();
          gantt1.parse({ data: arr });
          gantt1.scrollTo(sizes?.left, sizes?.top);
        });
      }

      // function showTable() {
      //   const scheduledOrders = document.getElementById("scheduled_orders");
      //   scheduledOrders.innerHTML = "";
      //   fetchTableData();
      //   // setActiveTab(0);
      // }
      // function clickTab2() {
      //   const scheduledOrders = document.getElementById("scheduled_orders");
      //   scheduledOrders.innerHTML = "tanb no 2";
      //   setActiveTab(1);
      // }
      // function clickTab3() {
      //   const scheduledOrders = document.getElementById("scheduled_orders");
      //   scheduledOrders.innerHTML = "tanb no 3";
      //   setActiveTab(2);
      // }
      // function clickTab4() {
      //   const scheduledOrders = document.getElementById("scheduled_orders");
      //   scheduledOrders.innerHTML = "tanb no 4";
      //   setActiveTab(3);
      // }
    </script>
    <script>
      window.onload = function () {
        fetchMultipleData();
        fetchTableData();
      };

      async function fetchMultipleData() {
        try {
          const [itemResponse, processResponse, machineResponse] =
            await Promise.all([
              fetch("getInsightwinItemList"),
              fetch("getInsightwinProcessList"),
              fetch("getInsightwinMachineList"),
            ]);

          const itemData = await itemResponse.json();
          const processData = await processResponse.json();
          const machineData = await machineResponse.json();
          renderCards(itemData[0], processData[0], machineData[0]);
        } catch (error) {
          console.error("Error fetching data:", error);
        }
      }

      function renderCards(itemData, processData, machineData) {
        const titleElement = document.getElementById("left_section_title");
        titleElement.innerText = "기준정보 확인";
        const cardList = document.getElementById("cardList");
        cardList.innerHTML = "";
        for (let i = 0; i < itemData.length; i++) {
          const cardElement = document.createElement("div");
          cardElement.className = "card";
          const cardContent = document.createElement("div");
          cardContent.className = "card-content";
          const title = document.createElement("div");
          title.className = "card-title";
          title.textContent = "제품 : " + itemData[i].item_name;
          cardElement.appendChild(title);
          const filteredProcessData = processData
            .filter((c) => c.item_id === itemData[i].item_id)
            .sort((a, b) => a.proc_sequence_no - b.proc_sequence_no);
          for (let ii = 0; ii < filteredProcessData.length; ii++) {
            const innerContent = document.createElement("div");
            const innerTitle = document.createElement("div");
            innerTitle.className = "card-text";
            innerContent.className = "card-inner-content";
            const procTime = Math.round(
              Number(filteredProcessData[ii].proc_time / 60)
            );
            innerTitle.textContent =
              filteredProcessData[ii].proc_name + " (" + procTime + "분)";
            const filteredMchData = machineData.filter(
              (c) =>
                c.proc_id === filteredProcessData[ii].proc_id &&
                c.item_id === itemData[i].item_id
            );
            cardContent.appendChild(innerTitle);
            cardContent.appendChild(innerContent);
            const innerInnerContent = document.createElement("div");
            innerInnerContent.className = "card-inner-inner-box";
            for (let iii = 0; iii < filteredMchData.length; iii++) {
              const innerInnerText = document.createElement("div");
              innerInnerText.className = "card-text-small";
              innerInnerText.textContent = filteredMchData[iii].machine_name;
              innerInnerContent.appendChild(innerInnerText);
              innerContent.appendChild(innerInnerContent);
            }
          }
          cardElement.appendChild(cardContent);
          cardList.appendChild(cardElement);
        }
      }
    </script>
    <script>
      //dropeown +
      let horizontalSplit, verticalSplit;
      function initializeSplits() {
        horizontalSplit = new Split(["#split-0", "#split-1"], {
          sizes: [15, 85],
          gutterSize: 8,
          // minSize: 230,
        });
        verticalSplit = new Split(["#split-1-1", "#split-1-2"], {
          sizes: [65, 35],
          direction: "vertical",
          gutterSize: 8,
          // minSize: 250,
        });
      }

      function initializeLayoutControls() {
        const splitWrapper = document.querySelector(".split-wrapper");
        const headerCheck = document.getElementById("header");
        const sidebarCheck = document.getElementById("sidebar");
        const mainCheck = document.getElementById("main");
        const addPlanButton = document.getElementById("add_plan");
        const resultPlanButton = document.getElementById("result_plan");
        const fullPlanContainer = document.createElement("div");
        const mainLayoutButton = document.getElementById("main_btn");
        const masterDataManagementButton = document.getElementById(
          "master_data_management"
        );
        const machineButton = document.getElementById("machine_management");
        fullPlanContainer.id = "full-plan-container";
        fullPlanContainer.className = ("full-plan-container", "display_none");
        splitWrapper.parentNode.insertBefore(fullPlanContainer, splitWrapper);
        mainLayoutButton.classList.add("active");
        mainLayoutButton.querySelector(".icon-link").classList.add("active");
        function removeActiveFromOtherButtons(exceptButton) {
          [
            addPlanButton,
            resultPlanButton,
            masterDataManagementButton,
            mainLayoutButton,
            machineButton,
          ]
            .filter((button) => button !== exceptButton)
            .forEach((button) => {
              button.classList.remove("active");
              button.querySelector(".icon-link").classList.remove("active");
            });
        }
        function handleButtonClick(button, iframeUrl) {
          const isActive = button.getAttribute("data-active") === "true";
          const iconLink = button.querySelector(".icon-link");
          selectedOrder = null;
          if (!iframeUrl) {
            // result modal 안보이게.
            const performanceModal =
              document.getElementById("performanceModal");
            performanceModal.classList.remove("display_block");
            performanceModal.classList.add("display_none");
            splitWrapper.classList.remove("display_none");
            splitWrapper.classList.add("display_block");
            const checkboxes = document.querySelectorAll(
              ".dropdown-content input[type='checkbox']"
            );
            checkboxes[0].checked = true;
            checkboxes[1].checked = true;
            checkboxes[2].checked = true;
            fullPlanContainer.classList.remove("display_block");
            fullPlanContainer.classList.add("display_none");
            fetchData();
            fetchTableData();
            fetchMultipleData();
            return;
          }
          if (!isActive) {
            button.setAttribute("data-active", "true");
            button.classList.add("active");
            iconLink.classList.add("active");
            headerCheck.checked = false;
            sidebarCheck.checked = false;
            mainCheck.checked = false;
            splitWrapper.classList.remove("display_block");
            splitWrapper.classList.add("display_none");
            fullPlanContainer.classList.remove("display_none");
            fullPlanContainer.classList.add("display_block");
            fullPlanContainer.innerHTML = createLoadingIndicator();

            // 다른 버튼 active 상태 제거
            if (button === machineButton) {
              addPlanButton.setAttribute("data-active", "false");
              addPlanButton.classList.remove("active");
              addPlanButton
                .querySelector(".icon-link")
                .classList.remove("active");
              masterDataManagementButton.setAttribute("data-active", "false");
              masterDataManagementButton.classList.remove("active");
              masterDataManagementButton
                .querySelector(".icon-link")
                .classList.remove("active");
            } else if (button === addPlanButton) {
              masterDataManagementButton.setAttribute("data-active", "false");
              masterDataManagementButton.classList.remove("active");
              masterDataManagementButton
                .querySelector(".icon-link")
                .classList.remove("active");
              machineButton.setAttribute("data-active", "false");
              machineButton.classList.remove("active");
              machineButton
                .querySelector(".icon-link")
                .classList.remove("active");
            } else {
              machineButton.setAttribute("data-active", "false");
              machineButton.classList.remove("active");
              machineButton
                .querySelector(".icon-link")
                .classList.remove("active");
              addPlanButton.setAttribute("data-active", "false");
              addPlanButton.classList.remove("active");
              addPlanButton
                .querySelector(".icon-link")
                .classList.remove("active");
            }
            const iframe = document.createElement("iframe");
            iframe.style.width = "100vw";
            iframe.style.height = "100vh";
            iframe.classList.add("display_none");
            iframe.src = iframeUrl;
            iframe.onload = function () {
              fullPlanContainer.querySelector(".loading-container").remove();
              iframe.classList.remove("display_none");
              iframe.classList.add("display_block");
            };

            fullPlanContainer.appendChild(iframe);
          } else {
            button.setAttribute("data-active", "false");
            button.classList.remove("active");
            iconLink.classList.remove("active");
            headerCheck.checked = true;
            sidebarCheck.checked = true;
            mainCheck.checked = true;
            fullPlanContainer.classList.remove("display_block");
            fullPlanContainer.classList.add("display_none");
            splitWrapper.classList.remove("display_none");
            splitWrapper.classList.add("display_block");
            mainLayoutButton.classList.add("active");
            mainLayoutButton
              .querySelector(".icon-link")
              .classList.add("active");
            updateLayout();
            fetchData();
            fetchMultipleData();
            fetchTableData();
          }
        }
        mainLayoutButton.addEventListener("click", () => {
          removeActiveFromOtherButtons(mainLayoutButton);
          if (mainLayoutButton.classList.contains("active")) return;
          mainLayoutButton.classList.add("active");
          mainLayoutButton.querySelector(".icon-link").classList.add("active");
          handleButtonClick(mainLayoutButton, null);
        });
        addPlanButton.addEventListener("click", () => {
          removeActiveFromOtherButtons(addPlanButton);
          addPlanButton.classList.add("active");
          handleButtonClick(addPlanButton, "http://plan.s-factview.com/frame");
          const performanceModal = document.getElementById("performanceModal");
          performanceModal.classList.remove("display_block");
          performanceModal.classList.add("display_none");
        });
        machineButton.addEventListener("click", () => {
          removeActiveFromOtherButtons(machineButton);
          machineButton.classList.add("active");
          machineButton.querySelector(".icon-link").classList.add("active");
          handleButtonClick(
            machineButton,
            "http://plan.s-factview.com/machineViewer"
          );
          const performanceModal = document.getElementById("performanceModal");
          performanceModal.classList.remove("display_block");
          performanceModal.classList.add("display_none");
        });
        masterDataManagementButton.addEventListener("click", () => {
          removeActiveFromOtherButtons(masterDataManagementButton);
          masterDataManagementButton.classList.add("active");
          handleButtonClick(
            masterDataManagementButton,
            "http://plan.s-factview.com/infoviewer"
          );
          const performanceModal = document.getElementById("performanceModal");
          performanceModal.classList.remove("display_block");
          performanceModal.classList.add("display_none");
        });
        // [(headerCheck, sidebarCheck, mainCheck)].forEach((checkbox) => {
        //   checkbox.addEventListener("change", updateLayout);
        // });
      }
      function updateLayout() {
        const split0 = document.getElementById("split-0");
        const split1 = document.getElementById("split-1");
        const split11 = document.getElementById("split-1-1");
        const split12 = document.getElementById("split-1-2");
        const checkboxes = document.querySelectorAll(
          ".dropdown-content input[type='checkbox']"
        );
        const sideChecked = checkboxes[0].checked;
        const ganttChecked = checkboxes[1].checked;
        const bottomChecked = checkboxes[2].checked;
        // 사이드 영역 (split-0) 처리
        if (!sideChecked) {
          split0.style.width = "0";
          split0.style.padding = "0";
          split0.style.overflow = "hidden";
          split1.style.width = "100%";
        } else {
          split0.style.width = "calc(15% - 4px)";
          split0.style.padding = "";
          split0.style.overflow = "";
          split1.style.width = "calc(85% - 4px)";
        }
        // 간트 차트 영역 (split-1-1) 처리
        if (!ganttChecked) {
          split11.style.height = "0";
          split11.style.padding = "0";
          split11.style.overflow = "hidden";
          if (bottomChecked) {
            split12.style.height = "100%";
          }
        } else {
          split11.style.height = "calc(65% - 4px)";
          split11.style.padding = "";
          split11.style.overflow = "";
          split12.style.height = "calc(35% - 4px)";
        }
        // 하단 영역 (split-1-2) 처리
        if (!bottomChecked) {
          split12.style.height = "0";
          split12.style.padding = "0";
          split12.style.overflow = "hidden";
          if (ganttChecked) {
            split11.style.height = "100%";
          }
        } else if (bottomChecked && ganttChecked) {
          split12.style.height = "calc(35% - 4px)";
          split12.style.padding = "";
          split12.style.overflow = "";
          split11.style.height = "calc(65% - 4px)";
        }
      }
      async function initializeWarnings() {
        const warningIcon = document.getElementById("warningIcon");
        const warningContent = document.querySelector(".warning_content");

        try {
          const response = await fetch("/getInsightwinOrderWarning");
          const fetchArray = await response.json();

          const warningArray = fetchArray.filter(
            (c) => new Date(c.status_update_date) < new Date(c.update_date)
          );

          const isWarningIconVisible = warningArray.length;

          if (isWarningIconVisible) {
            warningIcon.style.display = "block";
            const groupedWarnings = warningArray.reduce((acc, curr) => {
              if (!acc[curr.item_id]) {
                acc[curr.item_id] = {
                  item_name: curr.item_name,
                  orders: [],
                };
              }
              acc[curr.item_id].orders.push({
                order_name: curr.order_name,
                status_update_date: curr.status_update_date,
                update_date: curr.update_date,
              });
              return acc;
            }, {});

            Object.entries(groupedWarnings).forEach(([itemId, data]) => {
              const warningItem = document.createElement("div");
              warningItem.className = "warning-item";

              const title = document.createElement("h3");
              title.textContent = data.item_name;
              warningItem.appendChild(title);

              const warningList = document.createElement("div");
              warningList.className = "warning-list";

              const listItem = document.createElement("div");
              listItem.className = "warning-list-item";

              const icon = document.createElement("div");
              icon.className = "bell_fill_icon";

              const textSpan = document.createElement("span");
              textSpan.className = "warning-text";
              const orderNames = data.orders
                .map((order) => order.order_name)
                .join(", ");
              textSpan.textContent = orderNames + " 주문을 확인해 주세요.";

              listItem.appendChild(icon);
              listItem.appendChild(textSpan);
              warningList.appendChild(listItem);

              warningItem.appendChild(warningList);
              warningContent.appendChild(warningItem);
            });
          }
        } catch (error) {
          console.error("Failed to fetch warnings:", error);
        }
      }

      document.addEventListener("DOMContentLoaded", function () {
        initializeSplits();
        initializeLayoutControls();
        initializeWarnings();
      });
    </script>
    <script>
      var gantt1 = Gantt.getGanttInstance();
      function screenToggleFunction() {
        const checkboxes = document.querySelectorAll(
          ".dropdown-content input[type='checkbox']"
        );
        if (checkboxes[0].checked && checkboxes[2].checked) {
          checkboxes[0].checked = false;
          checkboxes[2].checked = false;
        } else if (!checkboxes[0].checked && !checkboxes[2].checked) {
          checkboxes[0].checked = true;
          checkboxes[2].checked = true;
        } else {
          checkboxes[0].checked = false;
          checkboxes[2].checked = false;
        }
        updateLayout();
      }
      // function zoomOutBoth() {
      //   const currentConfig = zoomConfig.levels.find(
      //     (level) => level.level === currentLevel
      //   );
      //   if (currentLevel === 2) {
      //     if (zoomOutCount[2] < 3) {
      //       // 10, 20, 40, 80 순서로 축소
      //       const reduction = Math.pow(2, zoomOutCount[2]) * 10;
      //       minWidthHistory[2] -= reduction;
      //       currentConfig.min_column_width = minWidthHistory[2];
      //       zoomOutCount[2]++;
      //       gantt1.ext.zoom.setLevel(currentLevel);
      //     } else {
      //       // 다음 레벨로 전환
      //       gantt1.ext.zoom.zoomOut();
      //       currentLevel = 3;
      //       gantt1.ext.zoom.setLevel(currentLevel);
      //     }
      //   } else if (currentLevel === 3) {
      //     if (zoomOutCount[3] < 5) {
      //       // 40, 80, 160, 320, 640 순서로 축소
      //       const reduction =
      //         zoomOutCount[3] !== 4 ? Math.pow(2, zoomOutCount[3]) * 40 : 40;
      //       minWidthHistory[3] -= reduction;
      //       currentConfig.min_column_width = minWidthHistory[3];
      //       zoomOutCount[3]++;
      //       gantt1.ext.zoom.setLevel(currentLevel);
      //     } else {
      //       gantt1.ext.zoom.zoomOut();
      //       currentLevel = 4;
      //       gantt1.ext.zoom.setLevel(currentLevel);
      //     }
      //   } else if (currentLevel === 4) {
      //     if (zoomOutCount[4] < 4) {
      //       // 640, 1280, 640 순서로 축소
      //       const reduction =
      //         zoomOutCount[4] === 1 ? 1280 : zoomOutCount[4] === 3 ? 200 : 640;
      //       minWidthHistory[4] -= reduction;
      //       currentConfig.min_column_width = minWidthHistory[4];
      //       zoomOutCount[4]++;
      //       gantt1.ext.zoom.setLevel(currentLevel);
      //     }
      //     // else {
      //     //   gantt1.ext.zoom.zoomOut();
      //     //   currentLevel = 5;
      //     //   zoomOutCount[4] = 0;
      //     //   gantt1.ext.zoom.setLevel(currentLevel);
      //     // }
      //   }
      //   console.log("zoomOutCount : ", zoomOutCount);
      // }

      // function zoomInBoth() {
      //   const currentConfig = zoomConfig.levels.find(
      //     (level) => level.level === currentLevel
      //   );
      //   if (currentLevel === 4) {
      //     if (zoomOutCount[4] > 0) {
      //       const addition = zoomOutCount[4] === 2 ? 1280 : 640;
      //       minWidthHistory[4] += addition;
      //       currentConfig.min_column_width = minWidthHistory[4];
      //       zoomOutCount[4]--;
      //       gantt1.ext.zoom.setLevel(currentLevel);
      //     } else {
      //       gantt1.ext.zoom.zoomIn();
      //       currentLevel = 3;
      //       zoomOutCount[4] = 0;
      //       gantt1.ext.zoom.setLevel(currentLevel);
      //     }
      //   } else if (currentLevel === 3) {
      //     if (zoomOutCount[3] > 0) {
      //       const addition = Math.pow(2, zoomOutCount[3] - 1) * 40;
      //       minWidthHistory[3] += addition;
      //       currentConfig.min_column_width = minWidthHistory[3];
      //       zoomOutCount[3]--;
      //       gantt1.ext.zoom.setLevel(currentLevel);
      //     } else {
      //       gantt1.ext.zoom.zoomIn();
      //       currentLevel = 2;
      //       zoomOutCount[3] = 0;
      //       gantt1.ext.zoom.setLevel(currentLevel);
      //     }
      //   } else if (currentLevel === 2) {
      //     if (zoomOutCount[2] > 0) {
      //       const addition = Math.pow(2, zoomOutCount[2] - 1) * 10;
      //       minWidthHistory[2] += addition;
      //       currentConfig.min_column_width = minWidthHistory[2];
      //       zoomOutCount[2]--;
      //       gantt1.ext.zoom.setLevel(currentLevel);
      //     }
      //   }
      //   console.log("currentLevel : ", currentLevel);
      //   console.log("zoomOutCount : ", zoomOutCount);
      // }
      function zoomInBoth() {
        gantt1.ext.zoom.zoomIn();
        gantt1.scrollTo(scrollLocation.x, scrollLocation.y);
      }
      function zoomOutBoth() {
        gantt1.ext.zoom.zoomOut();
        gantt1.scrollTo(scrollLocation.x, scrollLocation.y);
      }
      // function increaseColumnWidth() {
      //   const currentLevel = gantt1.ext.zoom.getCurrentLevel();
      //   const levelConfig = zoomConfig.levels.find(
      //     (level) => level.level === currentLevel
      //   );
      //   if (levelConfig) {
      //     levelConfig.min_column_width += 10;
      //     gantt1.ext.zoom.setLevel(currentLevel);
      //   }
      // }

      // function decreaseColumnWidth() {
      //   const currentLevel = gantt1.ext.zoom.getCurrentLevel();
      //   const levelConfig = zoomConfig.levels.find(
      //     (level) => level.level === currentLevel
      //   );
      //   if (levelConfig) {
      //     if (levelConfig.min_column_width > 30) {
      //       levelConfig.min_column_width -= 10;
      //       gantt1.ext.zoom.setLevel(currentLevel);
      //     }
      //   }
      // }
      function resetGanttConfig() {
        gantt1.ext.zoom.setLevel(3);
        gantt1.scrollTo(0, 0);
        const checkboxes = document.querySelectorAll(
          ".dropdown-content input[type='checkbox']"
        );
        checkboxes[0].checked = true;
        checkboxes[2].checked = true;
      }
      gantt1.date.minute_custom_start = function (date) {
        var minutes = date.getMinutes();
        minutes = Math.floor(minutes / 30) * 30;
        var newDate = new Date(date);
        newDate.setMinutes(minutes);
        newDate.setSeconds(0);
        newDate.setMilliseconds(0);
        return newDate;
      };
      gantt1.date.add_minute_custom = function (date, inc) {
        const nextDate = new Date(date);
        if (nextDate.getMinutes() % 30 != 0) {
          const diff = Math.abs(30 - (nextDate.getMinutes() % 30));
          return gantt1.date.add(nextDate, diff * inc, "minute");
        }
        return gantt1.date.add(date, 30 * inc, "minute");
      };
      gantt1.date.micro_minute_start = function (date) {
        var minutes = date.getMinutes();
        minutes = Math.floor(minutes / 10) * 10;
        var newDate = new Date(date);
        newDate.setMinutes(minutes);
        newDate.setSeconds(0);
        newDate.setMilliseconds(0);
        return newDate;
      };
      gantt1.date.six_hour_start = function (date) {
        const hours = date.getHours();
        const sixHourBlock = Math.floor(hours / 6) * 6;
        const d = new Date(date);
        d.setHours(sixHourBlock);
        d.setMinutes(0);
        d.setSeconds(0);
        return d;
      };

      gantt1.date.add_six_hour = function (date, inc) {
        const d = new Date(date);
        if (d.getHours() % 6 !== 0) {
          const nextBlock = Math.ceil(d.getHours() / 6) * 6;
          const diff = nextBlock - d.getHours();
          return gantt1.date.add(d, diff * inc, "hour");
        }
        return gantt1.date.add(date, 6 * inc, "hour");
      };

      gantt1.date.add_micro_minute = function (date, inc) {
        const nextDate = new Date(date);
        if (nextDate.getMinutes() % 10 != 0) {
          const diff = Math.abs(10 - (nextDate.getMinutes() % 10));
          return gantt1.date.add(nextDate, diff * inc, "minute");
        }
        return gantt1.date.add(date, 10 * inc, "minute");
      };

      gantt1.config.date_grid = "%Y-%m-%d %H:%i";
      var zoomConfig = {
        levels: [
          {
            name: "micro_minute",
            level: 0,
            scale_height: 80,
            min_column_width: 76,
            scales: [
              { unit: "micro_minute", step: 1, date: "%i" },
              {
                unit: "hour",
                step: 1,
                format: function (date) {
                  return date.getHours() + "&#xc2dc;";
                },
              },
              {
                unit: "day",
                format: "%j&#xc77c;",
                step: 1,
              },
            ],
          },
          {
            name: "minute",
            scale_height: 80,
            min_column_width: 117,
            level: 1,
            scales: [
              {
                unit: "minute_custom",
                step: 1,
                format: function (date) {
                  return date.getMinutes();
                },
              },
              {
                unit: "hour",
                step: 1,
                format: function (date) {
                  return date.getHours() + "&#xc2dc;";
                },
                scale_height: 50,
                min_column_width: 50,
              },
              {
                unit: "day",
                format: "%j&#xc77c;",
                step: 1,
                scale_height: 50,
                min_column_width: 50,
              },
            ],
          },
          {
            name: "hour_2",
            scale_height: 80,
            level: 2,
            min_column_width: 100,
            scales: [
              {
                unit: "hour",
                step: 1,
                format: function (date) {
                  return date.getHours() + "&#xc2dc;";
                },
              },
              {
                unit: "day",
                format: "%j&#xc77c;",
                step: 1,
              },
            ],
          },
          {
            name: "hour_3",
            scale_height: 80,
            level: 3,
            min_column_width: 58,
            scales: [
              {
                unit: "hour",
                step: 1,
                format: function (date) {
                  return date.getHours() + "&#xc2dc;";
                },
              },
              {
                unit: "day",
                format: "%j&#xc77c;",
                step: 1,
              },
            ],
          },
          {
            name: "hour_4",
            scale_height: 80,
            level: 4,
            min_column_width: 175,
            scales: [
              {
                unit: "six_hour",
                step: 1,
                format: function (date) {
                  const hours = date.getHours();
                  return hours === 0 ? "24" : hours;
                },
              },
              {
                unit: "day",
                format: "%j&#xc77c;",
                step: 1,
              },
            ],
          },
          {
            name: "day_5",
            scale_height: 80,
            level: 5,
            min_column_width: 280,
            scales: [
              {
                unit: "month",
                format: "%n&#xc6d4;",
                step: 1,
              },
              {
                unit: "day",
                format: "%j&#xc77c;",
                step: 1,
              },
            ],
          },
          {
            name: "day_6",
            scale_height: 80,
            level: 6,
            min_column_width: 200,
            scales: [
              {
                unit: "month",
                format: "%n&#xc6d4;",
                step: 1,
              },
              {
                unit: "day",
                format: "%j&#xc77c;",
                step: 1,
              },
            ],
          },
          {
            name: "day_7",
            scale_height: 80,
            level: 7,
            min_column_width: 100,
            scales: [
              {
                unit: "month",
                format: "%n&#xc6d4;",
                step: 1,
              },
              {
                unit: "day",
                format: "%j&#xc77c;",
                step: 1,
              },
            ],
          },
          {
            name: "day_8",
            scale_height: 80,
            level: 8,
            min_column_width: 50,
            scales: [
              {
                unit: "month",
                format: "%n&#xc6d4;",
                step: 1,
              },
              {
                unit: "day",
                format: "%j&#xc77c;",
                step: 1,
              },
            ],
          },
        ],
      };
    </script>
    <script>
      const findOverlap = (arr) => {
        const [start1, end1] = arr[0];
        const [start2, end2] = arr[1];
        const overlapStart = Math.max(start1, start2);
        const overlapEnd = Math.min(end1, end2);
        if (overlapStart >= overlapEnd) {
          return null;
        }
        return [new Date(overlapStart), new Date(overlapEnd)];
      };
      const filterParentsByCount = (arr, countThreshold) => {
        const parentCountMap = arr.reduce((map, item) => {
          map[item.parent] = (map[item.parent] || 0) + 1;
          return map;
        }, {});
        return Object.keys(parentCountMap)
          .filter((parent) => parentCountMap[parent] >= countThreshold)
          .map(Number);
      };
      const calculate4TimeOverlap = (arr, parentId) => {
        const overlappingPeriods = [];
        for (let i = 0; i < arr.length; i++) {
          for (let j = i + 1; j < arr.length; j++) {
            const obj1 = arr[i];
            const obj2 = arr[j];
            const start =
              obj1.start_date < obj2.start_date
                ? obj2.start_date
                : obj1.start_date;
            const end =
              obj1.end_date < obj2.end_date ? obj1.end_date : obj2.end_date;
            if (start <= end) {
              overlappingPeriods.push({ start_date: start, end_date: end });
            }
          }
        }
        function getGenerateRandomId() {
          return Math.floor(Math.random() * (1000000000 - 1000000)) + 1000000;
        }
        const calculatedOverlap = Object.values(
          overlappingPeriods.reduce((acc, obj) => {
            const key = obj.start_date + "-" + obj.end_date;
            acc[key] = acc[key] || {
              start_date: obj.start_date,
              end_date: obj.end_date,
              countedNumber: 0,
            };
            acc[key].countedNumber++;
            return acc;
          }, {})
        )
          .map((item) => {
            return {
              ...item,
              id: getGenerateRandomId(),
              parent: parentId,
              text: "",
              color: "red",
              type: "task",
              level: 1,
              case: "overlap",
            };
          })
          .filter(
            (item) => item.start_date.getTime() !== item.end_date.getTime()
          );
        return calculatedOverlap;
      };
      const handleTaskClick = (id, e, gantt2, educationMchData) => {
        const task = gantt2.getTask(id);
        if (!task.case) {
          const updatedMchData = educationMchData.map((item) => {
            if (item.id === task.id && !item.isCompleted) {
              return { ...item, isSelected: true, isRelated: false };
            }
            if (
              task.orderId === item.orderId &&
              item.prodIndex === task.prodIndex &&
              !item.isCompleted
            ) {
              return { ...item, isRelated: true, isSelected: false };
            }
            return { ...item, isSelected: false, isRelated: false };
          });
          return updatedMchData;
        } else {
          const taskParentParent = educationMchData.filter(
            (item) => item.id === task.parent
          )[0].id;
          let obj;
          const notOverlapSelected = educationMchData
            .filter(
              (item) =>
                item.parent === taskParentParent &&
                !item.case &&
                item.type === "task"
            )
            .filter(
              (content) =>
                content.start_date.getTime() <= task.start_date.getTime() &&
                content.end_date.getTime() >= task.end_date.getTime()
            );
          const overlappingElement = notOverlapSelected.filter((item) => {
            return (
              item.start_date.getTime() === task.start_date.getTime() &&
              item.end_date.getTime() === task.end_date.getTime()
            );
          });
          if (overlappingElement.length > 0) {
            obj = overlappingElement[0];
          } else {
            obj = notOverlapSelected.sort((a, b) => {
              if (a.start_date < b.start_date) return -1;
              if (a.start_date > b.start_date) return 1;
              return b.id - a.id;
            })[0];
          }
          const updatedMchData = educationMchData.map((item) => {
            if (item.id === obj.id && !item.isCompleted) {
              return { ...item, isSelected: true, isRelated: false };
            }
            if (
              obj.orderId === item.orderId &&
              item.prodIndex === obj.prodIndex &&
              !item.isCompleted
            ) {
              return { ...item, isRelated: true, isSelected: false };
            }
            return { ...item, isSelected: false, isRelated: false };
          });
          return updatedMchData;
        }
      };
      let originalArray = [];
      const fetchData = async () => {
        try {
          arr = [];
          const aiResultGanttRes = await fetch(
            "http://plan.s-factview.com/getAiResultDevData"
          );
          gantt1.plugins({
            tooltip: true,
            drag_timeline: true,
            zoom: true,
          });
          const res1 = await aiResultGanttRes.json();
          originalArray = res1;
          let ganttId = 1;
          let linkArr = [];
          const dataManipulating = (data) => {
            const originalDate = new Date(data);
            const year = originalDate.getFullYear();
            const month = String(originalDate.getMonth() + 1).padStart(2, "0");
            const day = String(originalDate.getDate()).padStart(2, "0");
            const hours = String(originalDate.getHours()).padStart(2, "0");
            const minutes = String(originalDate.getMinutes()).padStart(2, "0");
            return year + "-" + month + "-" + day + "T" + hours + ":" + minutes;
          };
          const dataManipulating2 = (data) => {
            const originalDate = new Date(data);
            const year = originalDate.getFullYear();
            const month = String(originalDate.getMonth() + 1).padStart(2, "0");
            const day = String(originalDate.getDate()).padStart(2, "0");
            const hours = String(originalDate.getHours()).padStart(2, "0");
            const minutes = String(originalDate.getMinutes()).padStart(2, "0");
            return year + "-" + month + "-" + day + " " + hours + ":" + minutes;
          };
          const transformDateForGantt = (date) => {
            const dateParts = date.split("T")[0].split("-");
            const day = parseInt(dateParts[2]);
            const month = parseInt(dateParts[1]);
            const year = parseInt(dateParts[0]);
            const formattedDate = day + "-" + month + "-" + year;
            const inputTime = date.split("T")[1];
            const formattedTime = inputTime;
            return formattedDate + " " + formattedTime;
          };
          const createSubArr = (subArr, startId, parentId) => {
            return subArr.map((item) => ({
              ...item,
              id: startId++,
              parent: parentId,
              text:
                item.procIndex +
                1 +
                "&#xbc88;&#xc9f8;&#x20;&#xacf5;&#xc815; / " +
                (item.qty_idx + 1),
              level: 1,
            }));
          };
          const reverseFormatDateString = (dateStr) => {
            const [datePart, timePart] = dateStr.split(" ");
            const [day, month, year] = datePart.split("-");
            const paddedMonth = month.padStart(2, "0");
            const paddedDay = day.padStart(2, "0");
            return new Date(
              year +
                "-" +
                paddedMonth +
                "-" +
                paddedDay +
                " " +
                timePart +
                ":00"
            );
          };
          const mchSet = [...new Set(originalArray.map((c) => c.mch_id))];
          for (let i = 0; i < mchSet.length; i++) {
            const matchedContents = originalArray.filter(
              (c) => c.mch_id === mchSet[i]
            );
            const parentObj = {
              id: ganttId,
              start_date: new Date(),
              end_date: new Date(),
              parent: 0,
              mch_name: matchedContents[0].mch_name,
              mch_id: mchSet[i],
              type: "project",
              render: "split",
              open: false,
              text: matchedContents[0].mch_name,
              level: 0,
            };
            let parentId = ganttId;
            ganttId++;
            arr.push(parentObj);
            for (let ii = 0; ii < matchedContents.length; ii++) {
              const childObj = {
                id: ganttId,
                parent: parentId,
                type: "task",
                color: matchedContents[ii].color,
                proc_name: matchedContents[ii].proc_name,
                ordName: matchedContents[ii].order_name,
                itemQty: matchedContents[ii].item_qty,
                text: matchedContents[ii].item_name,
                prodIndex: matchedContents[ii].item_qty_index,
                mch_id: mchSet[i],
                orderId: matchedContents[ii].order_id,
                itemId: matchedContents[ii].item_id,
                procSequenceNo: matchedContents[ii].proc_sequence_no,
                start_date: transformDateForGantt(
                  dataManipulating(matchedContents[ii].start_date)
                ),
                end_date: transformDateForGantt(
                  dataManipulating(matchedContents[ii].end_date)
                ),
                level: 1,
                isCompleted: matchedContents[ii].isCompleted,
              };
              arr.push(childObj);
              ganttId++;
            }
          }
          let storageArr = [];
          for (const i of mchSet) {
            const filteredLevel1 = arr.filter(
              (c) => c.level === 1 && c.mch_id === i
            );
            const parentObj = arr.filter((c) => !c.level && c.mch_id === i)[0];
            for (let ii = 0; ii < filteredLevel1.length; ii++) {
              for (let iii = ii + 1; iii < filteredLevel1.length; iii++) {
                const paramArr = [
                  [
                    reverseFormatDateString(filteredLevel1[ii].start_date),
                    reverseFormatDateString(filteredLevel1[ii].end_date),
                  ],
                  [
                    reverseFormatDateString(filteredLevel1[iii].start_date),
                    reverseFormatDateString(filteredLevel1[iii].end_date),
                  ],
                ];
                const isOverlap = findOverlap(paramArr);
                if (isOverlap) {
                  const overlapObj = {
                    id: ganttId,
                    parent: parentObj.id,
                    start_date: isOverlap[0],
                    end_date: isOverlap[1],
                    text: "",
                    type: "task",
                    level: 1,
                    case: "overlap",
                    mch_id: i,
                    countedNumber: 2,
                  };
                  storageArr.push(overlapObj);
                  arr.push(overlapObj);
                  ganttId++;
                }
              }
            }
          }
          const overlapFilteredSetParent = filterParentsByCount(storageArr, 2);
          let overlapFilteredSetParentLength = overlapFilteredSetParent.length;
          while (overlapFilteredSetParentLength) {
            for (const parentId of overlapFilteredSetParent) {
              const aa = storageArr.filter((item) => item.parent === parentId);
              const overlap4TimeArray = calculate4TimeOverlap(aa, parentId);
              if (overlap4TimeArray?.length) {
                arr.push(...overlap4TimeArray);
              }
            }
            overlapFilteredSetParentLength--;
          }
          gantt1.templates.tooltip_text = function (start, end, task) {
            if (task.type === "project") return null;
            if (task.case) return null;
            if (task.isCompleted) return null;
            const hourDuration = Math.floor(task.duration / 60);
            const minuteDuration = task.duration % 60;
            const hours = hourDuration ? String(hourDuration + "시간") : "";
            const minutes = minuteDuration ? String(minuteDuration + "분") : "";
            return (
              "<b>· 주문명 : <b/>" +
              task.ordName +
              "<br /> <b>· 공정명 : </b>" +
              task.proc_name +
              "<br /> <b>· 생산수량 : </b>" +
              task.itemQty +
              "<br /> <b>· 아이템명 : </b>" +
              task.text +
              "<br /> <b>· 공정 순서 : </b>" +
              task.procSequenceNo +
              "<br /> <b>· 생산 인덱스 : </b>" +
              task.prodIndex +
              "<br /> <b>· 시작 : </b>" +
              dataManipulating2(task.start_date) +
              "<br /> <b>· 종료 : </b>" +
              dataManipulating2(task.end_date) +
              "<br /> <b>· 소요시간 : </b>" +
              hours +
              minutes
            );
          };
          gantt1.attachEvent("onBeforeTaskDrag", function (id) {
            return false;
          });
          gantt1.attachEvent("onTaskSelected", function (id, e) {
            let clickedTask = gantt1.getTask(id);
            if (clickedTask.type === "project") return false;
            if (clickedTask.isCompleted) return false;
            let updatedArray = handleTaskClick(id, e, gantt1, arr);
            if (clickedTask.case) {
              const taskParentParent = arr.filter(
                (c) => c.id === clickedTask.parent
              )[0].id;
              const notOverlapSelected = arr
                .filter(
                  (item) =>
                    item.parent === taskParentParent &&
                    !item.case &&
                    item.type === "task"
                )
                .filter(
                  (content) =>
                    content.start_date.getTime() <=
                      clickedTask.start_date.getTime() &&
                    content.end_date.getTime() >= clickedTask.end_date.getTime()
                );
              const overlappingElement = notOverlapSelected.filter((item) => {
                return (
                  item.start_date.getTime() ===
                    clickedTask.start_date.getTime() &&
                  item.end_date.getTime() === clickedTask.end_date.getTime()
                );
              });
              if (overlappingElement.length > 0) {
                clickedTask = overlappingElement[0];
              } else {
                clickedTask = notOverlapSelected.sort((a, b) => {
                  if (a.start_date < b.start_date) return -1;
                  if (a.start_date > b.start_date) return 1;
                  return b.id - a.id;
                })[0];
              }
            }
            let linkId = 1;
            linkArr = [];
            const relatedTaskArray = arr
              .filter(
                (content) =>
                  content.orderId === clickedTask.orderId &&
                  content.prodIndex === clickedTask.prodIndex &&
                  !content.isCompleted
              )
              .sort((a, b) => a.procSequenceNo - b.procSequenceNo);
            for (let i = 1; i < relatedTaskArray.length; i++) {
              const sourceEnd = new Date(
                relatedTaskArray[i - 1].end_date
              ).getTime();
              const targetStart = new Date(
                relatedTaskArray[i].start_date
              ).getTime();
              const sourceProcSequenceNo =
                relatedTaskArray[i - 1].procSequenceNo;
              const targetProcSequenceNo = relatedTaskArray[i].procSequenceNo;
              const notCorrectRelation =
                sourceEnd > targetStart ||
                sourceProcSequenceNo + 1 !== targetProcSequenceNo;
              const linkObj = {
                id: linkId,
                source: relatedTaskArray[i - 1].id,
                target: relatedTaskArray[i].id,
                type: "0",
                color: notCorrectRelation ? "red" : "blue",
                error: notCorrectRelation,
                errorText:
                  sourceEnd > targetStart &&
                  sourceProcSequenceNo + 1 !== targetProcSequenceNo
                    ? "이전 공정의 종료 시간이 다음 공정의 시작 시간보다 뒤에 있으며, 공정 순서 또한 연속하지 않습니다. 중간에 누락된 공정이 있는지 확인하여 주세요."
                    : sourceEnd > targetStart
                    ? "이전 공정의 종료 시간이 다음 공정의 시작 시간보다 뒤에 있습니다."
                    : sourceProcSequenceNo + 1 !== targetProcSequenceNo
                    ? "공정 순서가 연속하지 않습니다. 중간에 누락된 공정이 있을 수 있습니다."
                    : null,
              };
              // link Arrow 컬러 설정
              const styleId = "arrow-style-" + linkId;
              const existingStyle = document.getElementById(styleId);
              if (existingStyle) {
                existingStyle.remove();
              }
              const style = document.createElement("style");
              style.id = styleId;
              style.textContent =
                'div[link_id="' +
                linkId +
                '"] .gantt_link_arrow::before { color: ' +
                (notCorrectRelation ? "red" : "blue") +
                " !important; }";
              document.head.appendChild(style);
              linkId++;
              linkArr.push(linkObj);
            }
            const scrollX = scrollLocation.x;
            const scrollY = scrollLocation.y;
            gantt1.clearAll();
            arr = updatedArray;
            gantt1.config.show_links = true;
            gantt1.parse({ data: arr, links: linkArr });
            gantt1.refreshData();
            gantt1.scrollTo(scrollX, scrollY);
            updatedArray = null;
            return true;
          });
          gantt1.config.drag_timeline = {
            ignore: ".gantt_task_line, .gantt_task_link",
            useKey: false,
          };
          gantt1.attachEvent("onLinkClick", function (id, e) {
            const link = gantt1.getLink(id);
            gantt1.config.show_links = true;
            if (link.error) {
              gantt1.alert(link.errorText);
            }
          });
          // const ganttStartDate = transformDateForGantt(
          //   dataManipulating(
          //     new Date(
          //       Math.min(
          //         ...arr
          //           .filter((c) => c.level === 1)
          //           .map((c) => new Date(c.start_date).valueOf())
          //           .filter(Boolean)
          //       )
          //     )
          //   )
          // );
          // const ganttEndDate = transformDateForGantt(
          //   dataManipulating(
          //     new Date(
          //       Math.max(
          //         ...arr
          //           .filter((c) => c.level === 1)
          //           .map((c) => new Date(c.end_date).valueOf())
          //           .filter(Boolean)
          //       )
          //     )
          //   )
          // );
          // gantt1.config.start_date = ganttStartDate;
          // gantt1.config.end_date = ganttEndDate;
          gantt1.attachEvent("onEmptyClick", function (e) {
            if (
              e.target.classList.contains("gantt_line_wrapper") ||
              e.target.classList.contains("gantt_link_line_right") ||
              e.target.classList.contains("gantt_link_line_down") ||
              e.target.classList.contains("gantt_link_line_up") ||
              e.target.classList.contains("gantt_link_line_left")
            ) {
              return;
            } else {
              arr = arr.map((item) => {
                return {
                  ...item,
                  isSelected: false,
                  isRelated: false,
                };
              });
              linkArr = [];
              const scrollX = scrollLocation.x;
              const scrollY = scrollLocation.y;
              gantt1.config.show_links = false;
              gantt1.parse({ data: arr, links: linkArr });
              gantt1.refreshData();
              gantt1.scrollTo(scrollX, scrollY);
            }
          });
          gantt1.ext.zoom.init(zoomConfig);
          gantt1.ext.zoom.setLevel(3);
          gantt1.config.scale_height = 80;
          gantt1.config.link_line_width = 6;
          gantt1.config.link_radius = 8;
          gantt1.config.columns = [
            {
              name: "mch_name",
              label: "장비명",
              tree: true,
              width: 200,
              align: "center",
            },
          ];
          gantt1.attachEvent("onGanttScroll", function (left, top) {
            var scrollState = gantt1.getScrollState();
            scrollLocation.x = scrollState.x;
            scrollLocation.y = scrollState.y;
          });
          gantt1.templates.task_class = function (start, end, task) {
            if (!task.case) {
              if (task.isSelected === true) {
                return "selected_task";
              }
              if (task.isRelated === true) {
                return "related_task";
              }
            }
            if (task.countedNumber <= 2)
              return "low_overlap z-index_front_3 opacity_full";
            if (task.countedNumber === 3)
              return "middle_overlap z-index_front_2 opacity_full";
            if (task.countedNumber > 3)
              return "high_overlap z-index_front_1 opacity_full";
            if (task.isCompleted) return "complete_gantt";
          };
          gantt1.attachEvent("onLinkDblClick", function (id, e) {
            return false;
          });
          gantt1.attachEvent("onTaskDblClick", function (id, e) {
            return false;
          });
          gantt1.config.duration_unit = "minute";
          gantt1.config.row_height = 35;
          gantt1.config.min_column_width = 58;
          gantt1.init("gantt_1");
          gantt1.parse({ data: arr, links: linkArr });
          if (!res1.length) {
            const ganttContainer = document.getElementById("gantt_1");
            const emptyUiBox = document.createElement("div");
            const emptyUiText = document.createElement("div");
            emptyUiBox.className = "gantt_empty_ui_box";
            emptyUiBox.appendChild(emptyUiText);
            emptyUiText.className = "gatntt_empty_ui_text";
            emptyUiText.innerHTML = "데이터가 없습니다.";
            ganttContainer.appendChild(emptyUiBox);
          }
        } catch (e) {
          console.log(e);
          const ganttContainer = document.getElementById("gantt_1");
          ganttContainer.innerHTML =
            "<div class='gantt_error_box'>" +
            "에러가 발생했습니다. 관리자에게 문의 바랍니다." +
            "</div>";
        }
      };
      document.addEventListener("DOMContentLoaded", (event) => {
        fetchData();
      });
    </script>
    <script>
      // 개발예정
      // const element = document.getElementById("split-1-1");
      // let resizeTimeout;
      // const resizeObserver = new ResizeObserver((entries) => {
      //   if (resizeTimeout) {
      //     window.cancelAnimationFrame(resizeTimeout);
      //   }
      //   resizeTimeout = window.requestAnimationFrame(() => {
      //     const viewportWidth = window.innerWidth;
      //     entries.forEach((entry) => {
      //       if (entry.target.id === "split-1-1") {
      //         const elementWidth = entry.contentRect.width;
      //         console.log("split-1-1 width: ", elementWidth);
      //         console.log("viewport width: ", viewportWidth);
      //       }
      //     });
      //   });
      // });
      // if (element) {
      //   resizeObserver.observe(element);
      // } else {
      //   console.error('Element with id "split-1-1" not found.');
      // }
    </script>
  </body>
</html>
