whj 1 year ago
parent
commit
4e4a7b2761

+ 397 - 23
package-lock.json

@@ -1455,6 +1455,29 @@
         }
       }
     },
+    "@sven0706/websocket": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/@sven0706/websocket/-/websocket-1.0.1.tgz",
+      "integrity": "sha512-oJs67dSqudxuzoaAeHdETVjRq/z6cgxl0uRL9VYXnadMMmTCHNGHFBXSD5HTL0KGrdgAU3udmgCz0ut5DLwezg=="
+    },
+    "@toast-ui/calendar": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmmirror.com/@toast-ui/calendar/-/calendar-2.1.3.tgz",
+      "integrity": "sha512-QxEf6MhcpqQ3dLSv6pxww1i6Ks/Ejp6mqy8GG7INvNYezmoXeo1IUBN4Cy9zLZeIgQHs02GEfusN5UzB+FyPhg==",
+      "requires": {
+        "immer": "^9.0.15",
+        "isomorphic-dompurify": "^0.20.0",
+        "preact": "^10.10.0",
+        "preact-render-to-string": "^5.2.1",
+        "tui-date-picker": "^4.0.1",
+        "tui-time-picker": "^2.0.1"
+      }
+    },
+    "@tootallnate/once": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/@tootallnate/once/-/once-2.0.0.tgz",
+      "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A=="
+    },
     "@types/anymatch": {
       "version": "1.3.1",
       "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz",
@@ -1477,6 +1500,14 @@
       "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-1.0.9.tgz",
       "integrity": "sha512-WvfJ3LFxBbWjqRGz9n7GJt08RrTHPJDVsIwwoCMROlqF+iDacYiAFjf9oqnq0mXpb2juA2N/qjKP+MKdal3YNQ=="
     },
+    "@types/dompurify": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmmirror.com/@types/dompurify/-/dompurify-2.4.0.tgz",
+      "integrity": "sha512-IDBwO5IZhrKvHFUl+clZxgf3hn2b/lU6H1KaBShPkQyGJUQ0xwebezIPSuiyGwfz1UzJWQl4M7BDxtHtCCPlTg==",
+      "requires": {
+        "@types/trusted-types": "*"
+      }
+    },
     "@types/glob": {
       "version": "7.1.3",
       "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
@@ -1583,6 +1614,11 @@
       "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==",
       "dev": true
     },
+    "@types/trusted-types": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.3.tgz",
+      "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g=="
+    },
     "@types/uglify-js": {
       "version": "3.9.3",
       "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.9.3.tgz",
@@ -2460,6 +2496,14 @@
       "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==",
       "dev": true
     },
+    "agent-base": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz",
+      "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+      "requires": {
+        "debug": "4"
+      }
+    },
     "aggregate-error": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz",
@@ -2899,8 +2943,7 @@
     "asynckit": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
-      "dev": true
+      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
     },
     "atob": {
       "version": "2.1.2",
@@ -4515,7 +4558,6 @@
       "version": "1.0.8",
       "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
       "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-      "dev": true,
       "requires": {
         "delayed-stream": "~1.0.0"
       }
@@ -5702,7 +5744,6 @@
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
       "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
-      "dev": true,
       "requires": {
         "ms": "^2.1.1"
       },
@@ -5710,8 +5751,7 @@
         "ms": {
           "version": "2.1.2",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
         }
       }
     },
@@ -5720,6 +5760,11 @@
       "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
       "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
     },
+    "decimal.js": {
+      "version": "10.4.3",
+      "resolved": "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.4.3.tgz",
+      "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA=="
+    },
     "decode-uri-component": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
@@ -5999,8 +6044,7 @@
     "delayed-stream": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
-      "dev": true
+      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
     },
     "delegate": {
       "version": "3.2.0",
@@ -6210,6 +6254,11 @@
         "domelementtype": "1"
       }
     },
+    "dompurify": {
+      "version": "2.4.7",
+      "resolved": "https://registry.npmmirror.com/dompurify/-/dompurify-2.4.7.tgz",
+      "integrity": "sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ=="
+    },
     "domutils": {
       "version": "1.7.0",
       "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
@@ -7130,8 +7179,7 @@
     "esprima": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
-      "dev": true
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
     },
     "esquery": {
       "version": "1.3.1",
@@ -7168,8 +7216,7 @@
     "esutils": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
-      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
-      "dev": true
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
     },
     "etag": {
       "version": "1.8.1",
@@ -8663,6 +8710,16 @@
         }
       }
     },
+    "http-proxy-agent": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
+      "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
+      "requires": {
+        "@tootallnate/once": "2",
+        "agent-base": "6",
+        "debug": "4"
+      }
+    },
     "http-proxy-middleware": {
       "version": "0.19.1",
       "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz",
@@ -8692,6 +8749,15 @@
       "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
       "dev": true
     },
+    "https-proxy-agent": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+      "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+      "requires": {
+        "agent-base": "6",
+        "debug": "4"
+      }
+    },
     "human-signals": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
@@ -8765,6 +8831,11 @@
       "dev": true,
       "optional": true
     },
+    "immer": {
+      "version": "9.0.21",
+      "resolved": "https://registry.npmmirror.com/immer/-/immer-9.0.21.tgz",
+      "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA=="
+    },
     "immutable": {
       "version": "3.7.6",
       "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz",
@@ -9228,6 +9299,11 @@
       "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
       "dev": true
     },
+    "is-potential-custom-element-name": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+      "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="
+    },
     "is-primitive": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
@@ -9329,6 +9405,249 @@
       "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
       "dev": true
     },
+    "isomorphic-dompurify": {
+      "version": "0.20.0",
+      "resolved": "https://registry.npmmirror.com/isomorphic-dompurify/-/isomorphic-dompurify-0.20.0.tgz",
+      "integrity": "sha512-ha3GBgVb9faPfGknAkwokYxqvdnh6c+R33LtgoXj4Lttg3b5DN5YH1P3zX1AHFFvTCOL7TER5zwGnUbJcQ85Cw==",
+      "requires": {
+        "@types/dompurify": "^2.3.3",
+        "dompurify": "^2.3.8",
+        "jsdom": "^20.0.0"
+      },
+      "dependencies": {
+        "abab": {
+          "version": "2.0.6",
+          "resolved": "https://registry.npmmirror.com/abab/-/abab-2.0.6.tgz",
+          "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA=="
+        },
+        "acorn": {
+          "version": "8.10.0",
+          "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.10.0.tgz",
+          "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw=="
+        },
+        "acorn-globals": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmmirror.com/acorn-globals/-/acorn-globals-7.0.1.tgz",
+          "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==",
+          "requires": {
+            "acorn": "^8.1.0",
+            "acorn-walk": "^8.0.2"
+          }
+        },
+        "acorn-walk": {
+          "version": "8.2.0",
+          "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz",
+          "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA=="
+        },
+        "cssom": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npmmirror.com/cssom/-/cssom-0.5.0.tgz",
+          "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw=="
+        },
+        "cssstyle": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmmirror.com/cssstyle/-/cssstyle-2.3.0.tgz",
+          "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+          "requires": {
+            "cssom": "~0.3.6"
+          },
+          "dependencies": {
+            "cssom": {
+              "version": "0.3.8",
+              "resolved": "https://registry.npmmirror.com/cssom/-/cssom-0.3.8.tgz",
+              "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
+            }
+          }
+        },
+        "data-urls": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmmirror.com/data-urls/-/data-urls-3.0.2.tgz",
+          "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==",
+          "requires": {
+            "abab": "^2.0.6",
+            "whatwg-mimetype": "^3.0.0",
+            "whatwg-url": "^11.0.0"
+          }
+        },
+        "domexception": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmmirror.com/domexception/-/domexception-4.0.0.tgz",
+          "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==",
+          "requires": {
+            "webidl-conversions": "^7.0.0"
+          }
+        },
+        "entities": {
+          "version": "4.5.0",
+          "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
+          "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="
+        },
+        "escodegen": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmmirror.com/escodegen/-/escodegen-2.1.0.tgz",
+          "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
+          "requires": {
+            "esprima": "^4.0.1",
+            "estraverse": "^5.2.0",
+            "esutils": "^2.0.2",
+            "source-map": "~0.6.1"
+          }
+        },
+        "estraverse": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz",
+          "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="
+        },
+        "form-data": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz",
+          "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+          "requires": {
+            "asynckit": "^0.4.0",
+            "combined-stream": "^1.0.8",
+            "mime-types": "^2.1.12"
+          }
+        },
+        "html-encoding-sniffer": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmmirror.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
+          "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
+          "requires": {
+            "whatwg-encoding": "^2.0.0"
+          }
+        },
+        "iconv-lite": {
+          "version": "0.6.3",
+          "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz",
+          "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3.0.0"
+          }
+        },
+        "jsdom": {
+          "version": "20.0.3",
+          "resolved": "https://registry.npmmirror.com/jsdom/-/jsdom-20.0.3.tgz",
+          "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==",
+          "requires": {
+            "abab": "^2.0.6",
+            "acorn": "^8.8.1",
+            "acorn-globals": "^7.0.0",
+            "cssom": "^0.5.0",
+            "cssstyle": "^2.3.0",
+            "data-urls": "^3.0.2",
+            "decimal.js": "^10.4.2",
+            "domexception": "^4.0.0",
+            "escodegen": "^2.0.0",
+            "form-data": "^4.0.0",
+            "html-encoding-sniffer": "^3.0.0",
+            "http-proxy-agent": "^5.0.0",
+            "https-proxy-agent": "^5.0.1",
+            "is-potential-custom-element-name": "^1.0.1",
+            "nwsapi": "^2.2.2",
+            "parse5": "^7.1.1",
+            "saxes": "^6.0.0",
+            "symbol-tree": "^3.2.4",
+            "tough-cookie": "^4.1.2",
+            "w3c-xmlserializer": "^4.0.0",
+            "webidl-conversions": "^7.0.0",
+            "whatwg-encoding": "^2.0.0",
+            "whatwg-mimetype": "^3.0.0",
+            "whatwg-url": "^11.0.0",
+            "ws": "^8.11.0",
+            "xml-name-validator": "^4.0.0"
+          }
+        },
+        "nwsapi": {
+          "version": "2.2.7",
+          "resolved": "https://registry.npmmirror.com/nwsapi/-/nwsapi-2.2.7.tgz",
+          "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ=="
+        },
+        "parse5": {
+          "version": "7.1.2",
+          "resolved": "https://registry.npmmirror.com/parse5/-/parse5-7.1.2.tgz",
+          "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
+          "requires": {
+            "entities": "^4.4.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "optional": true
+        },
+        "tough-cookie": {
+          "version": "4.1.3",
+          "resolved": "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-4.1.3.tgz",
+          "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==",
+          "requires": {
+            "psl": "^1.1.33",
+            "punycode": "^2.1.1",
+            "universalify": "^0.2.0",
+            "url-parse": "^1.5.3"
+          }
+        },
+        "tr46": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmmirror.com/tr46/-/tr46-3.0.0.tgz",
+          "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
+          "requires": {
+            "punycode": "^2.1.1"
+          }
+        },
+        "universalify": {
+          "version": "0.2.0",
+          "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.2.0.tgz",
+          "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg=="
+        },
+        "url-parse": {
+          "version": "1.5.10",
+          "resolved": "https://registry.npmmirror.com/url-parse/-/url-parse-1.5.10.tgz",
+          "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+          "requires": {
+            "querystringify": "^2.1.1",
+            "requires-port": "^1.0.0"
+          }
+        },
+        "webidl-conversions": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+          "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="
+        },
+        "whatwg-encoding": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
+          "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
+          "requires": {
+            "iconv-lite": "0.6.3"
+          }
+        },
+        "whatwg-mimetype": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
+          "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q=="
+        },
+        "whatwg-url": {
+          "version": "11.0.0",
+          "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-11.0.0.tgz",
+          "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
+          "requires": {
+            "tr46": "^3.0.0",
+            "webidl-conversions": "^7.0.0"
+          }
+        },
+        "ws": {
+          "version": "8.13.0",
+          "resolved": "https://registry.npmmirror.com/ws/-/ws-8.13.0.tgz",
+          "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA=="
+        },
+        "xml-name-validator": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
+          "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw=="
+        }
+      }
+    },
     "isomorphic-fetch": {
       "version": "2.2.1",
       "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
@@ -11248,14 +11567,12 @@
     "mime-db": {
       "version": "1.44.0",
       "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
-      "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==",
-      "dev": true
+      "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
     },
     "mime-types": {
       "version": "2.1.27",
       "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
       "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
-      "dev": true,
       "requires": {
         "mime-db": "1.44.0"
       }
@@ -13247,6 +13564,26 @@
       "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
       "dev": true
     },
+    "preact": {
+      "version": "10.16.0",
+      "resolved": "https://registry.npmmirror.com/preact/-/preact-10.16.0.tgz",
+      "integrity": "sha512-XTSj3dJ4roKIC93pald6rWuB2qQJO9gO2iLLyTe87MrjQN+HklueLsmskbywEWqCHlclgz3/M4YLL2iBr9UmMA=="
+    },
+    "preact-render-to-string": {
+      "version": "5.2.6",
+      "resolved": "https://registry.npmmirror.com/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz",
+      "integrity": "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==",
+      "requires": {
+        "pretty-format": "^3.8.0"
+      },
+      "dependencies": {
+        "pretty-format": {
+          "version": "3.8.0",
+          "resolved": "https://registry.npmmirror.com/pretty-format/-/pretty-format-3.8.0.tgz",
+          "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew=="
+        }
+      }
+    },
     "prelude-ls": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
@@ -13411,8 +13748,7 @@
     "psl": {
       "version": "1.8.0",
       "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
-      "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
-      "dev": true
+      "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
     },
     "public-encrypt": {
       "version": "4.0.3",
@@ -13516,8 +13852,7 @@
     "querystringify": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz",
-      "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==",
-      "dev": true
+      "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA=="
     },
     "quill": {
       "version": "1.3.7",
@@ -14566,8 +14901,7 @@
     "requires-port": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
-      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
-      "dev": true
+      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
     },
     "reselect": {
       "version": "3.0.1",
@@ -14946,6 +15280,14 @@
       "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
       "dev": true
     },
+    "saxes": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmmirror.com/saxes/-/saxes-6.0.0.tgz",
+      "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
+      "requires": {
+        "xmlchars": "^2.2.0"
+      }
+    },
     "schema-utils": {
       "version": "2.7.0",
       "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
@@ -15906,8 +16248,7 @@
     "symbol-tree": {
       "version": "3.2.4",
       "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
-      "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
-      "dev": true
+      "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
     },
     "table": {
       "version": "4.0.2",
@@ -16462,6 +16803,19 @@
       "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
       "dev": true
     },
+    "tui-date-picker": {
+      "version": "4.3.3",
+      "resolved": "https://registry.npmmirror.com/tui-date-picker/-/tui-date-picker-4.3.3.tgz",
+      "integrity": "sha512-/2YoLnj5c1e+Ag1ZZYOgzEs2o0v7Ol7c5UAnBj438zGlkwkMxyH0HwP2pVqqIYX05WE7K0+6nTWVMybS8otBgw==",
+      "requires": {
+        "tui-time-picker": "^2.1.6"
+      }
+    },
+    "tui-time-picker": {
+      "version": "2.1.6",
+      "resolved": "https://registry.npmmirror.com/tui-time-picker/-/tui-time-picker-2.1.6.tgz",
+      "integrity": "sha512-4Jmo3wjGS+Ii4/qQgt5DaFEohHpB3U6BzWeTODVVFHD9sx3NOsbomY9K0xMobSLODi+tQEH7wfOtNU0IJmcQ6Q=="
+    },
     "tunnel-agent": {
       "version": "0.6.0",
       "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
@@ -17263,6 +17617,21 @@
         "browser-process-hrtime": "^1.0.0"
       }
     },
+    "w3c-xmlserializer": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz",
+      "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==",
+      "requires": {
+        "xml-name-validator": "^4.0.0"
+      },
+      "dependencies": {
+        "xml-name-validator": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
+          "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw=="
+        }
+      }
+    },
     "walker": {
       "version": "1.0.7",
       "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz",
@@ -18154,6 +18523,11 @@
       "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
       "dev": true
     },
+    "xmlchars": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz",
+      "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="
+    },
     "xtend": {
       "version": "4.0.2",
       "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",

+ 3 - 0
package.json

@@ -15,6 +15,7 @@
     "@antv/data-set": "^0.10.2",
     "@antv/g2": "^4.0.11",
     "@sven0706/websocket": "^1.0.1",
+    "@toast-ui/calendar": "^2.1.3",
     "ant-design-vue": "^1.4.5",
     "antd": "^3.23.6",
     "axios": "^0.19.0",
@@ -31,6 +32,8 @@
     "nprogress": "^0.2.0",
     "qrcodejs2": "0.0.2",
     "sass-loader": "^10.0.3",
+    "tui-date-picker": "^4.3.3",
+    "tui-time-picker": "^2.1.6",
     "v-viewer": "^1.5.1",
     "viser-vue": "^2.4.6",
     "vue": "^2.6.10",

+ 28 - 0
src/api/repair/application-form.js

@@ -318,6 +318,34 @@ export function examineOk (result, parameter) {
     data: parameter
   })
 }
+/**
+ * examine func 加入日历图
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function pushCalendar (parameter) {
+  return axios({
+    url: '/repair/application-forms/addCalendar/' + parameter.id,
+    method: 'PUT',
+    data: parameter
+  })
+}
+/**
+ * examine func 查看日历图
+ * parameter: { }
+ * @param parameter
+ * @returns {*}
+ */
+export function getCalendar (parameter) {
+  return axios({
+    url: '/repair/application-forms/tuiCalendar?' + stringify(parameter),
+    method: 'get',
+    headers: {
+      'Content-Type': 'application/json;charset=UTF-8'
+    }
+  })
+}
 /**
  * examine func 审核同意
  * parameter: { }

+ 123 - 0
src/components/Calendar/index.js

@@ -0,0 +1,123 @@
+/* eslint-disable no-undefined */
+import Calendar from '@toast-ui/calendar'
+
+export default {
+  name: 'ToastUICalendar',
+  props: {
+    view: String,
+    useFormPopup: {
+      type: Boolean,
+      default: () => undefined
+    },
+    useDetailPopup: {
+      type: Boolean,
+      default: () => undefined
+    },
+    isReadOnly: {
+      type: Boolean,
+      default: () => undefined
+    },
+    usageStatistics: {
+      type: Boolean,
+      default: () => undefined
+    },
+    eventFilter: Function,
+    week: Object,
+    month: Object,
+    gridSelection: {
+      type: [Object, Boolean],
+      default: () => undefined
+    },
+    timezone: Object,
+    theme: Object,
+    template: Object,
+    calendars: Array,
+    events: Array
+  },
+  data () {
+    return {
+      calendarInstance: null
+    }
+  },
+  watch: {
+    view (value) {
+      this.calendarInstance.changeView(value)
+    },
+    useFormPopup (value) {
+      this.calendarInstance.setOptions({ useFormPopup: value })
+    },
+    useDetailPopup (value) {
+      this.calendarInstance.setOptions({ useDetailPopup: value })
+    },
+    isReadOnly (value) {
+      this.calendarInstance.setOptions({ isReadOnly: value })
+    },
+    eventFilter (value) {
+      this.calendarInstance.setOptions({ eventFilter: value })
+    },
+    week (value) {
+      this.calendarInstance.setOptions({ week: value })
+    },
+    month (value) {
+      this.calendarInstance.setOptions({ month: value })
+    },
+    gridSelection (value) {
+      this.calendarInstance.setOptions({ gridSelection: value })
+    },
+    timezone (value) {
+      this.calendarInstance.setOptions({ timezone: value })
+    },
+    theme (value) {
+      this.calendarInstance.setTheme(value)
+    },
+    template (value) {
+      this.calendarInstance.setOptions({ template: value })
+    },
+    calendars (value) {
+      this.calendarInstance.setCalendars(value)
+    },
+    events (value) {
+      this.calendarInstance.clear()
+      this.calendarInstance.createEvents(value)
+    }
+  },
+  mounted () {
+    this.calendarInstance = new Calendar(this.$refs.container, {
+      defaultView: this.view,
+      useFormPopup: this.useFormPopup,
+      useDetailPopup: this.useDetailPopup,
+      isReadOnly: this.isReadOnly,
+      usageStatistics: this.usageStatistics,
+      eventFilter: this.eventFilter,
+      week: this.week,
+      month: this.month,
+      gridSelection: this.gridSelection,
+      timezone: this.timezone,
+      theme: this.theme,
+      template: this.template,
+      calendars: this.calendars
+    })
+    this.addEventListeners()
+    this.calendarInstance.createEvents(this.events)
+  },
+  beforeDestroy () {
+    this.calendarInstance.off()
+    this.calendarInstance.destroy()
+  },
+  methods: {
+    addEventListeners () {
+      Object.keys(this.$listeners).forEach((eventName) => {
+        this.calendarInstance.on(eventName, (...args) => this.$emit(eventName, ...args))
+      })
+    },
+    getRootElement () {
+      return this.$refs.container
+    },
+    getInstance () {
+      return this.calendarInstance
+    }
+  },
+  render () {
+    return <div ref="container" class="toastui-vue-calendar" />
+  }
+}

+ 1 - 0
src/router/generator-platform-routers.js

@@ -204,6 +204,7 @@ const constantRouterComponents = {
   'RepairCheckForm': () => import('@/views/repair/application-form/RepairCheckForm'),
   // 维修单
   'RepairForm': () => import('@/views/repair/application-form/RepairForm'),
+  'Calendars': () => import('@/views/repair/calendar/Calendar'),
   'AgainRepairForm': () => import('@/views/repair/application-form/AgainRepairForm'),
   'RepairCloseForm': () => import('@/views/repair/application-form/RepairCloseForm'),
   'MRepairForm': () => import('@/views/repair/application-form/MyRepairForm'),

+ 10 - 0
src/views/repair/application-form/RepairFormPool.vue

@@ -72,6 +72,7 @@
       <div class="table-operator" style="margin-bottom: 8px;">
         <a-button v-if="$auth('repair-application-forms-add')" type="primary" icon="plus" @click="$refs.baseModal.base({},{filter: -1})">新增</a-button>
         <a-button style="margin-left: 8px" v-if="$auth('repair-application-forms-export')" type="primary" icon="download" @click="doExport">导出</a-button>
+        <a-button style="margin-left: 8px" v-if="$auth('repair-application-forms-export')" type="primary" icon="download" @click="doExport">日历图</a-button>
         <a-dropdown v-action:edit v-if="selectedRowKeys.length > 0 && $auth('repair-application-forms-del')">
           <a-menu slot="overlay">
             <a-popconfirm title="是否要删除所选数据?" @confirm="batchDelete()">
@@ -98,6 +99,8 @@
         <span slot="action" slot-scope="record">
           <template>
             <a @click="handleView(record)">工单主页</a>
+            <operation-button
+              @click="handlePushCalendar(record)" >加入日历图</operation-button>
             <!-- <operation-button
               v-show="allocatedFlag"
               v-if="(DictCache.VALUE.REPAIR_APPLICATION_FORM_STATUS.NOT_ALLOCATED === record.status)"
@@ -156,6 +159,7 @@
     <dispatch-base-form ref="dispatchBaseForm" @ok="handleOk" />
     <refused-form ref="refusedForm" @ok="handleOk"/>
     <check-form ref="checkForm" @ok="handleOk" />
+    <PushCalendar ref="pushCalendar" @ok="handleOk" />
   </div>
 </template>
 
@@ -167,6 +171,7 @@ import AssignForm from './modules/AssignForm'
 import Detail from './modules/DetailRepair'
 import DetailOut from './modules/DetailRepairOut'
 import RefusedForm from './modules/RefusedForm'
+import PushCalendar from './modules/PushCalendar'
 import {
   getRepairApplicationFormPoolPage,
   deleteRepairApplicationForms,
@@ -183,6 +188,7 @@ export default {
   components: {
     CheckForm,
     STable,
+    PushCalendar,
     Ellipsis,
     BaseForm,
     BaseOutForm,
@@ -507,6 +513,10 @@ export default {
     handleDispatching (record) {
       const modal = this.$refs.dispatchBaseForm
       modal.base(record)
+    },
+    handlePushCalendar (record) {
+      const modal = this.$refs.pushCalendar
+      modal.base(record)
     }
   }
 }

+ 107 - 0
src/views/repair/application-form/modules/PushCalendar.vue

@@ -0,0 +1,107 @@
+<template>
+  <a-modal
+    :title="modalTitle"
+    :width="800"
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    class="ant-modal2"
+    @cancel="handleCancel"
+  >
+    <a-form :form="form">
+      <a-form-item v-show="false" >
+        <a-input v-decorator="['id']" type="hidden"/>
+      </a-form-item>
+      <row-list :col="1">
+        <row-item>
+          <a-form-item
+            label="加入时间"
+            :labelCol="BaseTool.Constant.labelCol2"
+            :wrapperCol="BaseTool.Constant.wrapperCol2"
+          >
+            <a-date-picker
+              style="width: 100%"
+              :format="BaseTool.Date.PICKER_NORM_DATE_PATTERN"
+              v-decorator="['calendarDate']" />
+          </a-form-item>
+        </row-item>
+      </row-list>
+    </a-form>
+    <template slot="footer">
+      <a-button :loading="confirmLoading" type="primary" @click="save()">保存</a-button>
+    </template>
+  </a-modal>
+</template>
+
+<script>
+import pick from 'lodash.pick'
+import { pushCalendar } from '@/api/repair/application-form'
+
+export default {
+  name: 'BaseRepairApplicationForm',
+  data () {
+    return {
+      confirmLoading: false,
+      modalTitle: null,
+      form: this.$form.createForm(this),
+      visible: false,
+      // 下拉框map
+      sourceMap: {},
+      levelMap: {},
+      needStopMap: {},
+      descripitionMap: {},
+      statusMap: {},
+      model: null,
+      userList: []
+    }
+  },
+  components: {
+  },
+  props: {
+  },
+  created () {
+    // 下拉框map
+  },
+  methods: {
+    base (record) {
+      this.visible = true
+      this.model = record
+      // 如果是空标识添加
+      this.modalTitle = '添加'
+      const { form: { setFieldsValue } } = this
+      // 日期处理
+      this.$nextTick(() => {
+        setFieldsValue(Object.assign(pick(record, [
+          'id'
+        ])))
+      })
+    },
+    save () {
+      const { form: { validateFieldsAndScroll } } = this
+      this.confirmLoading = true
+      validateFieldsAndScroll((errors, values) => {
+        if (errors) {
+          this.confirmLoading = false
+          return
+        }
+        // 日期处理
+        values.calendarDate = this.BaseTool.Date.formatter(values.calendarDate, this.BaseTool.Date.PICKER_NORM_DATE_PATTERN)
+        pushCalendar(values)
+          .then(() => {
+            this.handleCancel(values)
+          }).catch(() => {
+            this.confirmLoading = false
+          })
+      })
+    },
+    handleCancel (values) {
+      this.visible = false
+      this.confirmLoading = false
+      this.form.resetFields()
+      if (this.BaseTool.Object.isNotBlank(values)) {
+        this.$emit('ok')
+      }
+    }
+
+  }
+}
+</script>

+ 406 - 0
src/views/repair/calendar/Calendar copy.vue

@@ -0,0 +1,406 @@
+<template>
+  <div>
+    <div v-show="true">
+      <div>
+        <a-col :span="4" >
+          <a-card style="height: 850px">
+            <div style="color:#000;font-weight:700;font-size:30px;">
+              {{ dateRangeText }}
+              <a-button shape="circle" icon="left" size="small" @click="onClickMoveButton(-1)" />
+              <a-button shape="circle" icon="right" size="small" @click="onClickMoveButton(1)" />
+            </div>
+            <br>
+            <a-select style="width:200px" v-model="selectedView" placeholder="请选择">
+              <a-select-option
+                style="color:#ccc"
+                v-for="item in options"
+                :key="item.value"
+                :value="item.value">{{ item.title }}
+              </a-select-option>
+            </a-select>
+            <br>
+            <br>
+            <a-button
+              type="primary"
+              shape="round"
+              block
+              @click="onClickTodayButton"
+            >
+              今日
+            </a-button>
+            <br>
+            <a-tree
+              v-model="checkedKeys"
+              style="width: 100%"
+              checkable
+              defaultExpandAll
+              :tree-data="treeData"
+              @check="onSelect"
+            />
+          </a-card>
+        </a-col>
+        <a-col :span="20">
+          <a-card>
+            <ToastUICalendar
+              ref="calendar"
+              style="height: 800px"
+              :use-detail-popup="true"
+              :use-form-popup="true"
+              :view="selectedView"
+              :week="{
+                showTimezoneCollapseButton: true,
+                timezonesCollapsed: false,
+                eventView: ['time'],
+                taskView: false,
+                dayNames:dayNames
+              }"
+              :month="{ startDayOfWeek: 0,dayNames:dayNames }"
+              :timezone="{ zones }"
+              :theme="theme"
+              :template="{
+                milestone: getTemplateForMilestone,
+                allday: getTemplateForAllday,
+              }"
+              :grid-selection="false"
+              :calendars="calendars"
+              :events="events"
+              @beforeCreateEvent="onBeforeCreateEvent"
+              @beforeUpdateEvent="onBeforeUpdateEvent"
+              @beforeDeleteEvent="onBeforeDeleteEvent"
+              @afterRenderEvent="onAfterRenderEvent"
+              @clickEvent="onClickEvent"
+              @selectDateTime="selectDateTime"
+            />
+          </a-card>
+        </a-col>
+        </a-row>
+      </div>
+    </div>
+  </div></template>
+
+<script>
+/* eslint-disable no-console */
+import ToastUICalendar from '@/components/Calendar'
+import '@toast-ui/calendar/dist/toastui-calendar.min.css'
+import 'tui-date-picker/dist/tui-date-picker.min.css'
+import 'tui-time-picker/dist/tui-time-picker.min.css'
+import { TZDate } from '@toast-ui/calendar'
+
+export default {
+  components: {
+    ToastUICalendar
+  },
+  data () {
+    return {
+      checkedKeys: [0, 1],
+      dayNames: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
+      calendars: [
+        {
+          id: 0,
+          name: 'Private',
+          backgroundColor: '#9e5fff',
+          borderColor: '#9e5fff',
+          dragBackgroundColor: '#9e5fff'
+        },
+        {
+          id: 1,
+          name: 'Company',
+          backgroundColor: '#00a9ff',
+          borderColor: '#00a9ff',
+          dragBackgroundColor: '#00a9ff'
+        }
+      ],
+      selectedView: 'month',
+      options: [
+        {
+          title: '月',
+          value: 'month'
+        },
+        {
+          title: '周',
+          value: 'week'
+        },
+        {
+          title: '日',
+          value: 'day'
+        }
+      ],
+      dateRangeText: '',
+
+      zones: [
+        {
+          timezoneName: 'Asia/Shanghai',
+          displayLabel: 'Shanghai',
+          tooltip: 'GMT+08:00'
+        }
+      ],
+      theme: {
+        common: {
+          border: '1px solid #ddd',
+          backgroundColor: 'white',
+          holiday: { color: '#f54f3d' },
+          saturday: { color: '#135de6' },
+          dayName: { color: '#333' },
+          today: { color: '#009688' },
+          gridSelection: {
+            backgroundColor: 'rgba(19, 93, 230, 0.1)',
+            border: '1px solid #135de6'
+          }
+        },
+        month: {
+          dayName: {
+            borderLeft: 'none',
+            backgroundColor: 'inherit'
+          },
+          holidayExceptThisMonth: { color: '#f3acac' },
+          dayExceptThisMonth: { color: '#bbb' },
+          weekend: { backgroundColor: '#fafafa' },
+          moreView: { boxShadow: 'none' },
+          moreViewTitle: { backgroundColor: '#f4f4f4' }
+        },
+        week: {
+          dayName: {
+            borderTop: '1px solid #ddd',
+            borderBottom: '1px solid #ddd',
+            borderLeft: '1px solid #ddd',
+            backgroundColor: 'inherit'
+          },
+          today: {
+            color: '#009688',
+            backgroundColor: 'inherit'
+          },
+          pastDay: { color: '#999' },
+          panelResizer: { border: '1px solid #ddd' },
+          dayGrid: { borderRight: '1px solid #ddd' },
+          dayGridLeft: {
+            width: '100px',
+            backgroundColor: '',
+            borderRight: '1px solid #ddd'
+          },
+          weekend: { backgroundColor: 'inherit' },
+          timeGridLeft: {
+            width: '100px',
+            backgroundColor: '#fafafa',
+            borderRight: '1px solid #ddd'
+          },
+          timeGridLeftAdditionalTimezone: { backgroundColor: '#fdfdfd' },
+          timeGridHourLine: { borderBottom: '1px solid #eee' },
+          timeGridHalfHourLine: { borderBottom: '1px dotted #f9f9f9' },
+          timeGrid: { borderRight: '1px solid #ddd' },
+          nowIndicatorLabel: { color: '#135de6' },
+          nowIndicatorPast: { border: '1px solid rgba(19, 93, 230, 0.3)' },
+          nowIndicatorBullet: { backgroundColor: '#135de6' },
+          nowIndicatorToday: { border: '1px solid #135de6' },
+          nowIndicatorFuture: { border: '1px solid #135de6' },
+          pastTime: { color: '#999' },
+          futureTime: { color: '#333' },
+          gridSelection: { color: '#135de6' }
+        }
+      },
+      today: new TZDate(),
+      events: []
+
+    }
+  },
+  computed: {
+    calendarInstance () {
+      return this.$refs.calendar.getInstance()
+    },
+    treeData () {
+      return [
+        { title: '全部',
+          key: -1,
+          children: this.calendars.map(item => {
+            return {
+              title: item.name,
+              key: item.id,
+              style: {
+                color: item.backgroundColor
+              }
+            }
+          }) }
+      ]
+    }
+  },
+  watch: {
+    selectedView (newView) {
+      this.calendarInstance.changeView(newView)
+      this.setDateRangeText()
+    }
+  },
+  created () {
+    this.events = [
+      {
+        id: '1',
+        calendarId: 1,
+        title: '11',
+        category: 'milestone',
+        start: this.today,
+        end: this.addHours(this.today, 3)
+      },
+      {
+        id: '2',
+        calendarId: 0,
+        title: '22',
+        category: 'milestone',
+        start: this.addDate(this.today, 1),
+        end: this.addDate(this.today, 1)
+      },
+      {
+        id: '3',
+        calendarId: 0,
+        title: 'FE 33',
+        category: 'milestone',
+        start: this.subtractDate(this.today, 2),
+        end: this.subtractDate(this.today, 1)
+      },
+      {
+        id: '4',
+        calendarId: 0,
+        title: '44',
+        category: 'milestone',
+        start: this.today,
+        end: this.addHours(this.today, 1)
+      }
+    ]
+  },
+  mounted () {
+    this.setDateRangeText()
+  },
+  methods: {
+    getTemplateForMilestone (event) {
+      return `<span style="color: #fff; background-color: ${event.backgroundColor};">${event.title}</span>`
+    },
+    getTemplateForAllday (event) {
+      return `[All day] ${event.title}`
+    },
+    onSelectDateTime ({ start, end }) {
+      console.group('onSelectDateTime')
+      console.log(`Date : ${start} ~ ${end}`)
+      console.groupEnd()
+    },
+    onBeforeCreateEvent (eventData) {
+      const event = {
+        calendarId: eventData.calendarId || '',
+        id: String(Math.random()),
+        title: eventData.title,
+        isAllday: eventData.isAllday,
+        start: eventData.start,
+        end: eventData.end,
+        category: eventData.isAllday ? 'allday' : 'time',
+        dueDateClass: '',
+        location: eventData.location,
+        state: eventData.state,
+        isPrivate: eventData.isPrivate
+      }
+
+      this.calendarInstance.createEvents([event])
+    },
+    onBeforeUpdateEvent (updateData) {
+      const targetEvent = updateData.event
+      const changes = { ...updateData.changes }
+      this.calendarInstance.updateEvent(targetEvent.id, targetEvent.calendarId, changes)
+    },
+
+    onBeforeDeleteEvent ({ title, id, calendarId }) {
+      this.calendarInstance.deleteEvent(id, calendarId)
+    },
+    onAfterRenderEvent ({ title }) {
+      console.group('onAfterRenderEvent')
+      console.log('Event Info : ', title)
+      console.groupEnd()
+    },
+    onClickDayName ({ date }) {
+      console.group('onClickDayName')
+      console.log('Date : ', date)
+      console.groupEnd()
+    },
+    onClickEvent ({ nativeEvent, event }) {
+      console.group('onClickEvent')
+      console.log('MouseEvent : ', nativeEvent)
+      console.log('Event Info : ', event)
+      console.groupEnd()
+    },
+    onClickTodayButton () {
+      this.calendarInstance.today()
+      this.setDateRangeText()
+    },
+    onClickMoveButton (offset) {
+      this.calendarInstance.move(offset)
+      this.setDateRangeText()
+    },
+    setDateRangeText () {
+      const date = this.calendarInstance.getDate()
+      const start = this.calendarInstance.getDateRangeStart()
+      const end = this.calendarInstance.getDateRangeEnd()
+
+      const startYear = start.getFullYear()
+      const endYear = end.getFullYear()
+
+      switch (this.selectedView) {
+        case 'month':
+          this.dateRangeText = `${date.getFullYear()}.${date.getMonth() + 1}`
+
+          return
+        case 'day':
+          this.dateRangeText = `${date.getFullYear()}.${date.getMonth() + 1}.${date.getDate()}`
+
+          return
+        default:
+          this.dateRangeText = `${startYear}.${start.getMonth() + 1}.${start.getDate()} - ${
+            startYear !== endYear ? `${endYear}.` : ''
+          }${end.getMonth() + 1}.${end.getDate()}`
+      }
+    },
+    selectDateTime (e) {
+      this.calendarInstance.clearGridSelections()
+    },
+    clone (date) {
+      return new TZDate(date)
+    },
+    addHours (d, step) {
+      console.log(d, 88989)
+      const date = this.clone(d)
+      date.setHours(d.getHours() + step)
+
+      return date
+    },
+    addDate (d, step) {
+      const date = this.clone(d)
+      date.setDate(d.getDate() + step)
+
+      return date
+    },
+    subtractDate (d, steps) {
+      const date = this.clone(d)
+      date.setDate(d.getDate() - steps)
+
+      return date
+    },
+    onSelect (keys, e) {
+      console.log(keys)
+    }
+  }
+}
+</script>
+<style scoped>
+.buttons {
+  display: inline-block;
+  margin-left: 10px;
+}
+
+.buttons > button {
+  margin-right: 5px;
+}
+
+.buttons > button:last-child {
+  margin-right: 0;
+}
+
+.date-range {
+  margin-left: 10px;
+}
+/deep/.ant-tree li .ant-tree-node-content-wrapper{
+  color:inherit;
+}
+</style>

+ 426 - 0
src/views/repair/calendar/Calendar.vue

@@ -0,0 +1,426 @@
+<template>
+  <div>
+    <div v-show="true" style="display:flex">
+      <a-card style="height: 850px;flex:1">
+        <div style="color:#000;font-weight:700;font-size:30px;">
+          {{ dateRangeText }}
+          <a-button shape="circle" icon="left" size="small" @click="onClickMoveButton(-1)" />
+          <a-button shape="circle" icon="right" size="small" @click="onClickMoveButton(1)" />
+        </div>
+        <br>
+        <a-select style="width:200px" v-model="selectedView" placeholder="请选择">
+          <a-select-option
+            style="color:#ccc"
+            v-for="item in options"
+            :key="item.value"
+            :value="item.value">{{ item.title }}
+          </a-select-option>
+        </a-select>
+        <br>
+        <br>
+        <a-button
+          type="primary"
+          shape="round"
+          block
+          @click="onClickTodayButton"
+        >
+          今日
+        </a-button>
+        <br>
+        <a-tree
+          v-model="checkedKeys"
+          style="width: 100%"
+          checkable
+          defaultExpandAll
+          :tree-data="treeData"
+          @check="onSelect"
+        />
+      </a-card>
+      <div style="flex:5;padding:20px;background:#fff;margin-left:20px;">
+        <ToastUICalendar
+          ref="calendar"
+          style="height: 800px;"
+          :use-detail-popup="true"
+          :view="selectedView"
+          :week="{
+            showTimezoneCollapseButton: true,
+            timezonesCollapsed: false,
+            eventView: false,
+            taskView: true,
+            dayNames:dayNames
+          }"
+          :month="{ startDayOfWeek: 0,dayNames:dayNames }"
+          :timezone="{ zones }"
+          :theme="theme"
+          :template="{
+            milestone: getTemplateForMilestone,
+            allday: getTemplateForAllday,
+          }"
+          :grid-selection="false"
+          :calendars="calendars"
+          :events="events"
+          @beforeCreateEvent="onBeforeCreateEvent"
+          @beforeUpdateEvent="onBeforeUpdateEvent"
+          @beforeDeleteEvent="onBeforeDeleteEvent"
+          @afterRenderEvent="onAfterRenderEvent"
+          @clickEvent="onClickEvent"
+          @selectDateTime="selectDateTime"
+        />
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+/* eslint-disable no-console */
+import ToastUICalendar from '@/components/Calendar'
+import '@toast-ui/calendar/dist/toastui-calendar.min.css'
+import 'tui-date-picker/dist/tui-date-picker.min.css'
+import 'tui-time-picker/dist/tui-time-picker.min.css'
+import { TZDate } from '@toast-ui/calendar'
+import { getCalendar } from '@/api/repair/application-form'
+
+export default {
+  components: {
+    ToastUICalendar
+  },
+  data () {
+    return {
+      checkedKeys: [2, 1, 3],
+      dayNames: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
+      calendars: [
+        {
+          id: 1,
+          name: '维修中',
+          backgroundColor: 'rgb(0, 169, 255)',
+          borderColor: 'rgb(0, 169, 255)',
+          dragBackgroundColor: 'rgb(0, 169, 255)'
+        },
+        {
+          id: 2,
+          name: '待审批',
+          backgroundColor: '#f50',
+          borderColor: '#f50',
+          dragBackgroundColor: '#f50'
+        },
+        {
+          id: 3,
+          name: '已完成',
+          backgroundColor: '#87d068',
+          borderColor: '#87d068',
+          dragBackgroundColor: '#87d068'
+        }
+      ],
+      selectedView: 'month',
+      options: [
+        {
+          title: '月',
+          value: 'month'
+        },
+        {
+          title: '周',
+          value: 'week'
+        },
+        {
+          title: '日',
+          value: 'day'
+        }
+      ],
+      dateRangeText: '',
+
+      zones: [
+        {
+          timezoneName: 'Asia/Shanghai',
+          displayLabel: 'Shanghai',
+          tooltip: 'GMT+08:00'
+        }
+      ],
+      theme: {
+        common: {
+          border: '1px solid #ddd',
+          backgroundColor: 'white',
+          holiday: { color: '#f54f3d' },
+          saturday: { color: '#135de6' },
+          dayName: { color: '#333' },
+          today: { color: '#009688' },
+          gridSelection: {
+            backgroundColor: 'rgba(19, 93, 230, 0.1)',
+            border: '1px solid #135de6'
+          }
+        },
+        month: {
+          dayName: {
+            borderLeft: 'none',
+            backgroundColor: 'inherit'
+          },
+          holidayExceptThisMonth: { color: '#f3acac' },
+          dayExceptThisMonth: { color: '#bbb' },
+          weekend: { backgroundColor: '#fafafa' },
+          moreView: { boxShadow: 'none' },
+          moreViewTitle: { backgroundColor: '#f4f4f4' }
+        },
+        week: {
+          dayName: {
+            borderTop: '1px solid #ddd',
+            borderBottom: '1px solid #ddd',
+            borderLeft: '1px solid #ddd',
+            backgroundColor: 'inherit'
+          },
+          today: {
+            color: '#009688',
+            backgroundColor: 'inherit'
+          },
+          pastDay: { color: '#999' },
+          panelResizer: { border: '1px solid #ddd' },
+          dayGrid: { borderRight: '1px solid #ddd' },
+          dayGridLeft: {
+            width: '100px',
+            backgroundColor: '',
+            borderRight: '1px solid #ddd'
+          },
+          weekend: { backgroundColor: 'inherit' },
+          timeGridLeft: {
+            width: '100px',
+            backgroundColor: '#fafafa',
+            borderRight: '1px solid #ddd'
+          },
+          timeGridLeftAdditionalTimezone: { backgroundColor: '#fdfdfd' },
+          timeGridHourLine: { borderBottom: '1px solid #eee' },
+          timeGridHalfHourLine: { borderBottom: '1px dotted #f9f9f9' },
+          timeGrid: { borderRight: '1px solid #ddd' },
+          nowIndicatorLabel: { color: '#135de6' },
+          nowIndicatorPast: { border: '1px solid rgba(19, 93, 230, 0.3)' },
+          nowIndicatorBullet: { backgroundColor: '#135de6' },
+          nowIndicatorToday: { border: '1px solid #135de6' },
+          nowIndicatorFuture: { border: '1px solid #135de6' },
+          pastTime: { color: '#999' },
+          futureTime: { color: '#333' },
+          gridSelection: { color: '#135de6' }
+        }
+      },
+      today: new TZDate(),
+      events: []
+
+    }
+  },
+  computed: {
+    calendarInstance () {
+      return this.$refs.calendar.getInstance()
+    },
+    treeData () {
+      return [
+        { title: '全部状态',
+          key: -1,
+          children: this.calendars.map(item => {
+            return {
+              title: item.name,
+              key: item.id,
+              style: {
+                color: item.backgroundColor
+              }
+            }
+          }) }
+      ]
+    }
+  },
+  watch: {
+    selectedView (newView) {
+      this.calendarInstance.changeView(newView)
+      this.setDateRangeText()
+    }
+  },
+  created () {
+    this.getInfo()
+    this.events = [
+      {
+        id: '1',
+        calendarId: '1',
+        title: '11',
+        category: 'milestone',
+        start: this.today,
+        end: this.addHours(this.today, 3)
+      },
+      {
+        id: '2',
+        calendarId: '2',
+        title: '22',
+        category: 'milestone',
+        start: this.addDate(this.today, 1),
+        end: this.addDate(this.today, 1)
+      },
+      {
+        id: '3',
+        calendarId: '2',
+        title: 'FE 33',
+        category: 'milestone',
+        start: this.subtractDate(this.today, 2),
+        end: this.subtractDate(this.today, 1)
+      },
+      {
+        id: '4',
+        calendarId: '3',
+        title: '44',
+        category: 'milestone',
+        start: this.today,
+        end: this.addHours(this.today, 1)
+      }
+    ]
+  },
+  mounted () {
+    this.setDateRangeText()
+  },
+  methods: {
+    getInfo () {
+      getCalendar().then(res => {
+        this.calendars = res.data.calendarList.map(item => {
+          return {
+            id: item.id,
+            name: item.name,
+            backgroundColor: item.bgColor,
+            borderColor: item.borderColor,
+            dragBackgroundColor: item.dragBgColor
+          }
+        })
+        this.checkedKeys = res.data.calendarList.map(item => {
+          if (item.checked) {
+            return item.id
+          }
+        })
+      })
+    },
+    getTemplateForMilestone (event) {
+      return `<span style="color: #fff; background-color: ${event.backgroundColor};">${event.title}</span>`
+    },
+    getTemplateForAllday (event) {
+      return `[All day] ${event.title}`
+    },
+    onSelectDateTime ({ start, end }) {
+      console.group('onSelectDateTime')
+      console.log(`Date : ${start} ~ ${end}`)
+      console.groupEnd()
+    },
+    onBeforeCreateEvent (eventData) {
+      const event = {
+        calendarId: eventData.calendarId || '',
+        id: String(Math.random()),
+        title: eventData.title,
+        isAllday: eventData.isAllday,
+        start: eventData.start,
+        end: eventData.end,
+        category: eventData.isAllday ? 'allday' : 'time',
+        dueDateClass: '',
+        location: eventData.location,
+        state: eventData.state,
+        isPrivate: eventData.isPrivate
+      }
+
+      this.calendarInstance.createEvents([event])
+    },
+    onBeforeUpdateEvent (updateData) {
+      const targetEvent = updateData.event
+      const changes = { ...updateData.changes }
+      this.calendarInstance.updateEvent(targetEvent.id, targetEvent.calendarId, changes)
+    },
+
+    onBeforeDeleteEvent ({ title, id, calendarId }) {
+      this.calendarInstance.deleteEvent(id, calendarId)
+    },
+    onAfterRenderEvent ({ title }) {
+      console.group('onAfterRenderEvent')
+      console.log('Event Info : ', title)
+      console.groupEnd()
+    },
+    onClickDayName ({ date }) {
+      console.group('onClickDayName')
+      console.log('Date : ', date)
+      console.groupEnd()
+    },
+    onClickEvent ({ nativeEvent, event }) {
+      console.group('onClickEvent')
+      console.log('MouseEvent : ', nativeEvent)
+      console.log('Event Info : ', event)
+      console.groupEnd()
+    },
+    onClickTodayButton () {
+      this.calendarInstance.today()
+      this.setDateRangeText()
+    },
+    onClickMoveButton (offset) {
+      this.calendarInstance.move(offset)
+      this.setDateRangeText()
+    },
+    setDateRangeText () {
+      const date = this.calendarInstance.getDate()
+      const start = this.calendarInstance.getDateRangeStart()
+      const end = this.calendarInstance.getDateRangeEnd()
+
+      const startYear = start.getFullYear()
+      const endYear = end.getFullYear()
+
+      switch (this.selectedView) {
+        case 'month':
+          this.dateRangeText = `${date.getFullYear()}.${date.getMonth() + 1}`
+
+          return
+        case 'day':
+          this.dateRangeText = `${date.getFullYear()}.${date.getMonth() + 1}.${date.getDate()}`
+
+          return
+        default:
+          this.dateRangeText = `${startYear}.${start.getMonth() + 1}.${start.getDate()} - ${
+            startYear !== endYear ? `${endYear}.` : ''
+          }${end.getMonth() + 1}.${end.getDate()}`
+      }
+    },
+    selectDateTime (e) {
+      this.calendarInstance.clearGridSelections()
+    },
+    clone (date) {
+      return new TZDate(date)
+    },
+    addHours (d, step) {
+      console.log(d, 88989)
+      const date = this.clone(d)
+      date.setHours(d.getHours() + step)
+
+      return date
+    },
+    addDate (d, step) {
+      const date = this.clone(d)
+      date.setDate(d.getDate() + step)
+
+      return date
+    },
+    subtractDate (d, steps) {
+      const date = this.clone(d)
+      date.setDate(d.getDate() - steps)
+
+      return date
+    },
+    onSelect (keys, e) {
+      console.log(keys)
+    }
+  }
+}
+</script>
+<style scoped>
+.buttons {
+  display: inline-block;
+  margin-left: 10px;
+}
+
+.buttons > button {
+  margin-right: 5px;
+}
+
+.buttons > button:last-child {
+  margin-right: 0;
+}
+
+.date-range {
+  margin-left: 10px;
+}
+/deep/.ant-tree li .ant-tree-node-content-wrapper{
+  color:inherit;
+}
+</style>