From a4392885c5f259c7e84f53d02543def06dd4dd2c Mon Sep 17 00:00:00 2001 From: "MJM_2025_05\\polly" Date: Wed, 10 Sep 2025 10:55:12 +0800 Subject: [PATCH] first commit --- .env.development | 4 + .env.production | 4 + .env.staging | 3 + .gitattributes | 2 + .gitignore | 24 + README.md | 2 +- index.html | 26 + package-lock.json | 6798 +++++++++++++++++ package.json | 52 + postcss.config.js | 7 + public/build_img.jpg | Bin 0 -> 140331 bytes public/config.json | 44 + public/favicon.ico | Bin 0 -> 2834 bytes public/hotspot.svg | 21 + public/logo.svg | 23 + public/setting.html | 15 + src/App.vue | 60 + src/apis/account/api.js | 14 + src/apis/account/index.js | 158 + src/apis/alert/api.js | 27 + src/apis/alert/index.js | 238 + src/apis/asset/api.js | 37 + src/apis/asset/index.js | 337 + src/apis/building/api.js | 6 + src/apis/building/index.js | 90 + src/apis/dashboard/api.js | 13 + src/apis/dashboard/index.js | 175 + src/apis/energy/api.js | 27 + src/apis/energy/index.js | 262 + src/apis/forge/api.js | 3 + src/apis/forge/index.js | 24 + src/apis/graph/api.js | 16 + src/apis/graph/index.js | 122 + src/apis/history/api.js | 11 + src/apis/history/index.js | 177 + src/apis/login/api.js | 1 + src/apis/login/index.js | 27 + src/apis/operation/api.js | 16 + src/apis/operation/index.js | 190 + src/apis/productSetting/api.js | 4 + src/apis/productSetting/index.js | 45 + src/apis/system/api.js | 9 + src/apis/system/index.js | 67 + src/assets/base.css | 89 + src/assets/btn.css | 56 + src/assets/img/area-img-box-line-bottom.png | Bin 0 -> 524 bytes src/assets/img/area-img-box-line-top.png | Bin 0 -> 530 bytes src/assets/img/background.jpg | Bin 0 -> 95918 bytes src/assets/img/chart-data-background01.svg | 1 + src/assets/img/chart-data-background02.svg | 1 + src/assets/img/chart-data-background03.svg | 1 + src/assets/img/chart-title01.svg | 21 + src/assets/img/chart-title02.svg | 12 + src/assets/img/chart-title03.svg | 21 + src/assets/img/chart-title04.svg | 21 + src/assets/img/equipment-item-background.svg | 21 + .../img/equipment-item-background04.svg | 1 + .../img/equipment-item-background05.svg | 1 + src/assets/img/equipment/replay01.svg | 1 + src/assets/img/equipment/replay02.svg | 1 + src/assets/img/equipment/state-background.svg | 1 + src/assets/img/equipment/state-title.svg | 1 + src/assets/img/equipment/table-item-w.svg | 7 + src/assets/img/item-data-left-2.svg | 1 + src/assets/img/item-data-left.svg | 1 + src/assets/img/item-data-right-2.svg | 1 + src/assets/img/item-data-right.svg | 1 + src/assets/img/logo.png | Bin 0 -> 40610 bytes src/assets/img/logo.svg | 1 + src/assets/img/pagination/small-btn.svg | 14 + src/assets/img/pagination/small-btn02.svg | 9 + src/assets/img/state-box-bottom.png | Bin 0 -> 722 bytes src/assets/img/state-box-top.png | Bin 0 -> 713 bytes src/assets/img/state-title01.svg | 1 + src/assets/img/state-title02.svg | 1 + src/assets/img/state-ul-background01.svg | 1 + src/assets/img/state-ul-background02.svg | 1 + src/assets/img/state-ul-text.svg | 1 + src/assets/img/state-ul.svg | 49 + .../img/table/content-box-background01.svg | 44 + .../img/table/content-box-background02.svg | 43 + .../img/table/content-box-background03.svg | 43 + .../img/table/content-box-background04.svg | 38 + .../img/table/content-box-background05.svg | 44 + src/assets/img/table/large-btn.svg | 18 + src/assets/img/table/large-btn02.svg | 14 + src/assets/img/table/small-btn.svg | 14 + src/assets/img/table/small-btn02.svg | 9 + src/assets/img/text-position-line.svg | 1 + src/assets/index.css | 81 + src/assets/logo.svg | 1 + src/assets/main.css | 29 + src/assets/pagination.css | 40 + src/assets/table.css | 122 + src/components/Loading.vue | 32 + src/components/SvgIcon.vue | 44 + src/components/alarm/AlarmCards.vue | 87 + src/components/alarm/AlarmDrawer.vue | 51 + src/components/chart/BarChart.vue | 57 + src/components/chart/EffectScatter.vue | 104 + src/components/chart/GaugeChart.vue | 34 + src/components/chart/LineChart.vue | 34 + src/components/chart/SankeyChart.vue | 31 + .../customUI/ButtonConnectedGroup.vue | 52 + src/components/customUI/ButtonGroup.vue | 53 + src/components/customUI/Checkbox.vue | 65 + src/components/customUI/Collapse.vue | 72 + src/components/customUI/DateGroup.vue | 123 + src/components/customUI/DraggableTable.vue | 436 ++ src/components/customUI/Dropdown.vue | 29 + .../customUI/FileSystemCollapse.vue | 189 + src/components/customUI/Input.vue | 96 + src/components/customUI/InputNumber.vue | 92 + src/components/customUI/Menu.vue | 35 + src/components/customUI/Modal.vue | 92 + src/components/customUI/Pagination.vue | 200 + src/components/customUI/RadioGroup.vue | 56 + src/components/customUI/SearchSelect.vue | 128 + src/components/customUI/Select.vue | 85 + src/components/customUI/Table.vue | 410 + src/components/customUI/Textarea.vue | 30 + src/components/customUI/Toast.vue | 74 + src/components/customUI/Upload.vue | 307 + src/components/forge/Forge.vue | 117 + src/components/forge/ForgeForSystem.vue | 282 + src/components/forge/ForgeModal.vue | 160 + src/components/forge/ForgeModalContent.vue | 223 + src/components/forge/index.vue | 270 + src/components/navbar/Navbar.vue | 168 + src/components/navbar/NavbarBuilding.vue | 43 + src/components/navbar/NavbarItem.vue | 218 + src/components/navbar/NavbarLang.vue | 43 + src/components/navbar/NavbarUser.vue | 51 + src/config/cn.json | 422 + src/config/tw.json | 422 + src/config/us.json | 422 + src/constant/CalculateTableColumn.js | 127 + src/constant/api_app.js | 8 + src/constant/api_forge.js | 4 + src/constant/authPage.js | 70 + src/constant/calculateIcon.js | 465 ++ src/constant/colors.js | 32 + src/constant/index.js | 45 + src/directives/draggable.js | 66 + src/directives/focusPlugin.js | 9 + src/fontawsomeIconRegister.js | 136 + src/hooks/baja/useAlarmData.js | 89 + src/hooks/baja/useRefrigerantHeatMap.js | 150 + src/hooks/baja/useSystemHeatmap.js | 123 + src/hooks/baja/useSystemStatusByBaja.js | 388 + src/hooks/forge/useForgeFloor.js | 115 + src/hooks/forge/useForgeHeatmap.js | 141 + src/hooks/forge/useForgeSprite.js | 222 + src/hooks/useActiveBtn.js | 41 + src/hooks/useDashboardOption.js | 20 + src/hooks/useFormErrorMessage.js | 50 + src/hooks/useGetCookie.js | 8 + src/hooks/useGetDevice.js | 31 + src/hooks/useSearchParam.js | 29 + src/hooks/useSelectedFloor.js | 17 + src/hooks/useSystemShowData.js | 27 + src/main.js | 60 + src/router/index-84b479b.js | Bin 0 -> 7062 bytes src/router/index.js | 116 + src/stores/useAlarmStore.js | 63 + src/stores/useBuildingStore.js | 129 + src/stores/useForgeDbIdStore.js | 13 + src/stores/useHeatmapBarStore.js | 31 + src/stores/useUserInfoStore.js | 19 + src/util/apiHandler.js | 11 + src/util/clearChart.js | 13 + src/util/downloadExcel.js | 42 + src/util/getModalPosition.js | 18 + src/util/hexToRgb.js | 12 + src/util/request.js | 123 + src/util/showChartLoading.js | 9 + src/views/AssetManagement/AssetManagement.vue | 78 + .../components/AssetMainList.vue | 134 + .../components/AssetMainListAddModal.vue | 107 + .../components/AssetSubList.vue | 153 + .../components/AssetSubListAddModal.vue | 172 + .../AssetManagement/components/AssetTable.vue | 247 + .../components/AssetTableAddModal.vue | 158 + .../components/AssetTableModalLeft.vue | 20 + .../components/AssetTableModalLeftInfo.vue | 227 + .../AssetTableModalLeftInfoDept.vue | 161 + .../AssetTableModalLeftInfoGraph.vue | 173 + .../components/AssetTableModalLeftInfoIoT.vue | 290 + .../AssetTableModalLeftInfoMQTT.vue | 255 + .../components/AssetTableModalLeftModule.vue | 11 + .../components/AssetTableModalRight.vue | 22 + .../components/AssetTableModalRightInfo.vue | 181 + src/views/Test.vue | 27 + .../accountManagement/AccountManagement.vue | 58 + .../accountManagement/components/Account.vue | 222 + .../components/AccountModal.vue | 232 + .../components/AccountPasswordModal.vue | 99 + .../accountManagement/components/Role.vue | 153 + .../components/RoleAuthModal.vue | 208 + src/views/alert/AlertManagement.vue | 60 + .../components/AlertQuery/AlertQuery.vue | 144 + .../components/AlertQuery/AlertSearch.vue | 28 + .../AlertQuery/AlertSearchAckBtns.vue | 63 + .../AlertQuery/AlertSearchNormalBtns.vue | 58 + .../AlertQuery/AlertSearchTimeRange.vue | 95 + .../AlertQuery/AlertSearchTypesButton.vue | 87 + .../components/AlertQuery/AlertTable.vue | 60 + .../components/AlertQuery/AlertTableModal.vue | 326 + .../AlertSetting/AlertNoticesTable.vue | 39 + .../AlertSetting/AlertNotifyTable.vue | 124 + .../AlertSetting/AlertNotifyTableAddModal.vue | 159 + .../AlertSetting/AlertOutliersTable.vue | 257 + .../AlertOutliersTableAddModal.vue | 274 + .../components/AlertSetting/AlertSetting.vue | 51 + .../components/AlertSetting/AlertSubList.vue | 59 + .../AlertSetting/AlertTimeTable.vue | 110 + .../AlertSetting/AlertTimeTableAddModal.vue | 429 ++ src/views/dashboard/Dashboard.vue | 182 + .../dashboard/components/DashboardAlert.vue | 72 + .../components/DashboardEffectScatter.vue | 151 + .../DashboardEffectScatterModal.vue | 288 + .../DashboardEffectScatterModalChart.vue | 227 + .../components/DashboardElectricity.vue | 177 + .../components/DashboardElectricityModal.vue | 133 + .../components/DashboardEmission.vue | 165 + .../components/DashboardEmissionModal.vue | 110 + .../components/DashboardFloorBar.vue | 59 + .../components/DashboardHumidity.vue | 109 + .../dashboard/components/DashboardIndoor.vue | 227 + .../components/DashboardIndoorTemp.vue | 157 + .../dashboard/components/DashboardProduct.vue | 204 + .../components/DashboardProductComplete.vue | 141 + .../DashboardProductCompleteModal.vue | 104 + .../DashboardProductCompleteModalRecord.vue | 125 + .../DashboardProductCompleteModalTarget.vue | 74 + .../dashboard/components/DashboardRefrig.vue | 229 + .../components/DashboardRefrigTemp.vue | 160 + .../dashboard/components/DashboardSysCard.vue | 157 + .../dashboard/components/DashboardTemp.vue | 198 + .../components/ForgeInfoModalChart.vue | 219 + .../energyManagement/EnergyManagement.vue | 75 + .../components/BillingDegreeChart.vue | 114 + .../components/CurrentInformation.vue | 94 + .../components/ElectricityBillChart.vue | 101 + .../EnergyChart/BillingDegreeChart.vue | 132 + .../EnergyChart/CarbonEmissionChart.vue | 128 + .../EnergyChart/CarbonEmissionModal.vue | 110 + .../EnergyChart/ElecConsumption.vue | 141 + .../components/EnergyChart/EnergyChart.vue | 159 + .../EnergyChart/ImmediateDemandChart.vue | 186 + .../EnergyChart/ImmediateDemandModal.vue | 133 + .../EnergyChart/IntervalBillChart.vue | 166 + .../EnergyChart/MonthlyElecBillChart.vue | 131 + .../EnergyChart/UsageInformation.vue | 119 + .../EnergyHistoryTable/EnergyActionButton.vue | 136 + .../EnergyHistoryTable/EnergyDataCahrt.vue | 164 + .../EnergyHistoryTable/EnergyDataTable.vue | 170 + .../EnergyHistoryTable/EnergyHistoryTable.vue | 37 + .../EnergyHistoryTable/EnergySearch.vue | 251 + .../EnergyHistoryTable/EnergySearchTime.vue | 159 + .../EnergyHistoryTable/EnergySidebar.vue | 265 + .../components/EnergyReport/EnergyReport.vue | 23 + .../EnergyReport/EnergyReportSearch.vue | 197 + .../EnergyReport/EnergyReportTable.vue | 97 + .../EnergyReport/EnergyReportTimeRange.vue | 129 + .../components/ImmediateDemandChart.vue | 138 + .../components/UsageInformation.vue | 149 + src/views/graphManagement/GraphManagement.vue | 26 + .../graphManagement/components/GraphModal.vue | 178 + .../components/GraphSidebar.vue | 256 + .../components/GraphSidebarDropdown.vue | 63 + .../graphManagement/components/GraphTable.vue | 190 + src/views/history/History.vue | 43 + .../components/HistoryActionButton.vue | 135 + .../history/components/HistoryDataCahrt.vue | 186 + .../components/HistoryFavoriteOption.vue | 205 + .../history/components/HistorySearch.vue | 252 + .../history/components/HistorySearchTime.vue | 146 + .../history/components/HistorySidebar.vue | 295 + src/views/history/components/HistoryTable.vue | 116 + src/views/login/Login.vue | 102 + src/views/operation/Operation.vue | 140 + .../components/OperationActionButton.vue | 88 + .../operation/components/OperationSearch.vue | 127 + .../components/OperationSearchSubSys.vue | 133 + .../components/OperationSearchType.vue | 158 + .../operation/components/OperationTable.vue | 93 + .../components/OperationTableModal.vue | 452 ++ .../constant/OperationTableColumns.js | 57 + src/views/setting/SettingManagement.vue | 51 + src/views/setting/components/Building.vue | 108 + .../setting/components/BuildingModal.vue | 84 + src/views/setting/components/Demand.vue | 169 + src/views/setting/components/Dept.vue | 98 + src/views/setting/components/DeptModal.vue | 86 + .../components/ElecPriceManagement.vue | 105 + src/views/setting/components/ElecPriceRes.vue | 434 ++ src/views/setting/components/ElecPriceStd.vue | 729 ++ src/views/setting/components/ElecType.vue | 105 + .../setting/components/ElecTypeModal.vue | 84 + src/views/setting/components/Floors.vue | 127 + src/views/setting/components/FloorsModal.vue | 112 + .../setting/components/MQTTCheckboxTree.vue | 91 + src/views/setting/components/MQTTList.vue | 279 + .../setting/components/MQTTListAddModal.vue | 246 + src/views/setting/components/PointList.vue | 155 + .../setting/components/PointListAddModal.vue | 175 + src/views/setting/components/Vendor.vue | 128 + src/views/setting/components/VendorModal.vue | 153 + src/views/system/System.vue | 303 + src/views/system/SystemFloor.vue | 198 + src/views/system/SystemMain.vue | 11 + src/views/system/components/SystemCard.vue | 214 + src/views/system/components/SystemDeptBar.vue | 58 + .../system/components/SystemFloorBar.vue | 88 + .../system/components/SystemInfoModal.vue | 42 + .../components/SystemInfoModalChart.vue | 194 + .../system/components/SystemInfoModalCog.vue | 71 + .../components/SystemInfoModalContent.vue | 63 + .../components/SystemInfoModalDesktop.vue | 77 + .../components/SystemInfoModalImage.vue | 76 + src/views/system/components/SystemMode.vue | 47 + src/views/system/components/SystemSubBar.vue | 55 + stats.html | 4949 ++++++++++++ tailwind.config.js | 44 + vite.config.js | 50 + 326 files changed, 45754 insertions(+), 1 deletion(-) create mode 100644 .env.development create mode 100644 .env.production create mode 100644 .env.staging create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 public/build_img.jpg create mode 100644 public/config.json create mode 100644 public/favicon.ico create mode 100644 public/hotspot.svg create mode 100644 public/logo.svg create mode 100644 public/setting.html create mode 100644 src/App.vue create mode 100644 src/apis/account/api.js create mode 100644 src/apis/account/index.js create mode 100644 src/apis/alert/api.js create mode 100644 src/apis/alert/index.js create mode 100644 src/apis/asset/api.js create mode 100644 src/apis/asset/index.js create mode 100644 src/apis/building/api.js create mode 100644 src/apis/building/index.js create mode 100644 src/apis/dashboard/api.js create mode 100644 src/apis/dashboard/index.js create mode 100644 src/apis/energy/api.js create mode 100644 src/apis/energy/index.js create mode 100644 src/apis/forge/api.js create mode 100644 src/apis/forge/index.js create mode 100644 src/apis/graph/api.js create mode 100644 src/apis/graph/index.js create mode 100644 src/apis/history/api.js create mode 100644 src/apis/history/index.js create mode 100644 src/apis/login/api.js create mode 100644 src/apis/login/index.js create mode 100644 src/apis/operation/api.js create mode 100644 src/apis/operation/index.js create mode 100644 src/apis/productSetting/api.js create mode 100644 src/apis/productSetting/index.js create mode 100644 src/apis/system/api.js create mode 100644 src/apis/system/index.js create mode 100644 src/assets/base.css create mode 100644 src/assets/btn.css create mode 100644 src/assets/img/area-img-box-line-bottom.png create mode 100644 src/assets/img/area-img-box-line-top.png create mode 100644 src/assets/img/background.jpg create mode 100644 src/assets/img/chart-data-background01.svg create mode 100644 src/assets/img/chart-data-background02.svg create mode 100644 src/assets/img/chart-data-background03.svg create mode 100644 src/assets/img/chart-title01.svg create mode 100644 src/assets/img/chart-title02.svg create mode 100644 src/assets/img/chart-title03.svg create mode 100644 src/assets/img/chart-title04.svg create mode 100644 src/assets/img/equipment-item-background.svg create mode 100644 src/assets/img/equipment-item-background04.svg create mode 100644 src/assets/img/equipment-item-background05.svg create mode 100644 src/assets/img/equipment/replay01.svg create mode 100644 src/assets/img/equipment/replay02.svg create mode 100644 src/assets/img/equipment/state-background.svg create mode 100644 src/assets/img/equipment/state-title.svg create mode 100644 src/assets/img/equipment/table-item-w.svg create mode 100644 src/assets/img/item-data-left-2.svg create mode 100644 src/assets/img/item-data-left.svg create mode 100644 src/assets/img/item-data-right-2.svg create mode 100644 src/assets/img/item-data-right.svg create mode 100644 src/assets/img/logo.png create mode 100644 src/assets/img/logo.svg create mode 100644 src/assets/img/pagination/small-btn.svg create mode 100644 src/assets/img/pagination/small-btn02.svg create mode 100644 src/assets/img/state-box-bottom.png create mode 100644 src/assets/img/state-box-top.png create mode 100644 src/assets/img/state-title01.svg create mode 100644 src/assets/img/state-title02.svg create mode 100644 src/assets/img/state-ul-background01.svg create mode 100644 src/assets/img/state-ul-background02.svg create mode 100644 src/assets/img/state-ul-text.svg create mode 100644 src/assets/img/state-ul.svg create mode 100644 src/assets/img/table/content-box-background01.svg create mode 100644 src/assets/img/table/content-box-background02.svg create mode 100644 src/assets/img/table/content-box-background03.svg create mode 100644 src/assets/img/table/content-box-background04.svg create mode 100644 src/assets/img/table/content-box-background05.svg create mode 100644 src/assets/img/table/large-btn.svg create mode 100644 src/assets/img/table/large-btn02.svg create mode 100644 src/assets/img/table/small-btn.svg create mode 100644 src/assets/img/table/small-btn02.svg create mode 100644 src/assets/img/text-position-line.svg create mode 100644 src/assets/index.css create mode 100644 src/assets/logo.svg create mode 100644 src/assets/main.css create mode 100644 src/assets/pagination.css create mode 100644 src/assets/table.css create mode 100644 src/components/Loading.vue create mode 100644 src/components/SvgIcon.vue create mode 100644 src/components/alarm/AlarmCards.vue create mode 100644 src/components/alarm/AlarmDrawer.vue create mode 100644 src/components/chart/BarChart.vue create mode 100644 src/components/chart/EffectScatter.vue create mode 100644 src/components/chart/GaugeChart.vue create mode 100644 src/components/chart/LineChart.vue create mode 100644 src/components/chart/SankeyChart.vue create mode 100644 src/components/customUI/ButtonConnectedGroup.vue create mode 100644 src/components/customUI/ButtonGroup.vue create mode 100644 src/components/customUI/Checkbox.vue create mode 100644 src/components/customUI/Collapse.vue create mode 100644 src/components/customUI/DateGroup.vue create mode 100644 src/components/customUI/DraggableTable.vue create mode 100644 src/components/customUI/Dropdown.vue create mode 100644 src/components/customUI/FileSystemCollapse.vue create mode 100644 src/components/customUI/Input.vue create mode 100644 src/components/customUI/InputNumber.vue create mode 100644 src/components/customUI/Menu.vue create mode 100644 src/components/customUI/Modal.vue create mode 100644 src/components/customUI/Pagination.vue create mode 100644 src/components/customUI/RadioGroup.vue create mode 100644 src/components/customUI/SearchSelect.vue create mode 100644 src/components/customUI/Select.vue create mode 100644 src/components/customUI/Table.vue create mode 100644 src/components/customUI/Textarea.vue create mode 100644 src/components/customUI/Toast.vue create mode 100644 src/components/customUI/Upload.vue create mode 100644 src/components/forge/Forge.vue create mode 100644 src/components/forge/ForgeForSystem.vue create mode 100644 src/components/forge/ForgeModal.vue create mode 100644 src/components/forge/ForgeModalContent.vue create mode 100644 src/components/forge/index.vue create mode 100644 src/components/navbar/Navbar.vue create mode 100644 src/components/navbar/NavbarBuilding.vue create mode 100644 src/components/navbar/NavbarItem.vue create mode 100644 src/components/navbar/NavbarLang.vue create mode 100644 src/components/navbar/NavbarUser.vue create mode 100644 src/config/cn.json create mode 100644 src/config/tw.json create mode 100644 src/config/us.json create mode 100644 src/constant/CalculateTableColumn.js create mode 100644 src/constant/api_app.js create mode 100644 src/constant/api_forge.js create mode 100644 src/constant/authPage.js create mode 100644 src/constant/calculateIcon.js create mode 100644 src/constant/colors.js create mode 100644 src/constant/index.js create mode 100644 src/directives/draggable.js create mode 100644 src/directives/focusPlugin.js create mode 100644 src/fontawsomeIconRegister.js create mode 100644 src/hooks/baja/useAlarmData.js create mode 100644 src/hooks/baja/useRefrigerantHeatMap.js create mode 100644 src/hooks/baja/useSystemHeatmap.js create mode 100644 src/hooks/baja/useSystemStatusByBaja.js create mode 100644 src/hooks/forge/useForgeFloor.js create mode 100644 src/hooks/forge/useForgeHeatmap.js create mode 100644 src/hooks/forge/useForgeSprite.js create mode 100644 src/hooks/useActiveBtn.js create mode 100644 src/hooks/useDashboardOption.js create mode 100644 src/hooks/useFormErrorMessage.js create mode 100644 src/hooks/useGetCookie.js create mode 100644 src/hooks/useGetDevice.js create mode 100644 src/hooks/useSearchParam.js create mode 100644 src/hooks/useSelectedFloor.js create mode 100644 src/hooks/useSystemShowData.js create mode 100644 src/main.js create mode 100644 src/router/index-84b479b.js create mode 100644 src/router/index.js create mode 100644 src/stores/useAlarmStore.js create mode 100644 src/stores/useBuildingStore.js create mode 100644 src/stores/useForgeDbIdStore.js create mode 100644 src/stores/useHeatmapBarStore.js create mode 100644 src/stores/useUserInfoStore.js create mode 100644 src/util/apiHandler.js create mode 100644 src/util/clearChart.js create mode 100644 src/util/downloadExcel.js create mode 100644 src/util/getModalPosition.js create mode 100644 src/util/hexToRgb.js create mode 100644 src/util/request.js create mode 100644 src/util/showChartLoading.js create mode 100644 src/views/AssetManagement/AssetManagement.vue create mode 100644 src/views/AssetManagement/components/AssetMainList.vue create mode 100644 src/views/AssetManagement/components/AssetMainListAddModal.vue create mode 100644 src/views/AssetManagement/components/AssetSubList.vue create mode 100644 src/views/AssetManagement/components/AssetSubListAddModal.vue create mode 100644 src/views/AssetManagement/components/AssetTable.vue create mode 100644 src/views/AssetManagement/components/AssetTableAddModal.vue create mode 100644 src/views/AssetManagement/components/AssetTableModalLeft.vue create mode 100644 src/views/AssetManagement/components/AssetTableModalLeftInfo.vue create mode 100644 src/views/AssetManagement/components/AssetTableModalLeftInfoDept.vue create mode 100644 src/views/AssetManagement/components/AssetTableModalLeftInfoGraph.vue create mode 100644 src/views/AssetManagement/components/AssetTableModalLeftInfoIoT.vue create mode 100644 src/views/AssetManagement/components/AssetTableModalLeftInfoMQTT.vue create mode 100644 src/views/AssetManagement/components/AssetTableModalLeftModule.vue create mode 100644 src/views/AssetManagement/components/AssetTableModalRight.vue create mode 100644 src/views/AssetManagement/components/AssetTableModalRightInfo.vue create mode 100644 src/views/Test.vue create mode 100644 src/views/accountManagement/AccountManagement.vue create mode 100644 src/views/accountManagement/components/Account.vue create mode 100644 src/views/accountManagement/components/AccountModal.vue create mode 100644 src/views/accountManagement/components/AccountPasswordModal.vue create mode 100644 src/views/accountManagement/components/Role.vue create mode 100644 src/views/accountManagement/components/RoleAuthModal.vue create mode 100644 src/views/alert/AlertManagement.vue create mode 100644 src/views/alert/components/AlertQuery/AlertQuery.vue create mode 100644 src/views/alert/components/AlertQuery/AlertSearch.vue create mode 100644 src/views/alert/components/AlertQuery/AlertSearchAckBtns.vue create mode 100644 src/views/alert/components/AlertQuery/AlertSearchNormalBtns.vue create mode 100644 src/views/alert/components/AlertQuery/AlertSearchTimeRange.vue create mode 100644 src/views/alert/components/AlertQuery/AlertSearchTypesButton.vue create mode 100644 src/views/alert/components/AlertQuery/AlertTable.vue create mode 100644 src/views/alert/components/AlertQuery/AlertTableModal.vue create mode 100644 src/views/alert/components/AlertSetting/AlertNoticesTable.vue create mode 100644 src/views/alert/components/AlertSetting/AlertNotifyTable.vue create mode 100644 src/views/alert/components/AlertSetting/AlertNotifyTableAddModal.vue create mode 100644 src/views/alert/components/AlertSetting/AlertOutliersTable.vue create mode 100644 src/views/alert/components/AlertSetting/AlertOutliersTableAddModal.vue create mode 100644 src/views/alert/components/AlertSetting/AlertSetting.vue create mode 100644 src/views/alert/components/AlertSetting/AlertSubList.vue create mode 100644 src/views/alert/components/AlertSetting/AlertTimeTable.vue create mode 100644 src/views/alert/components/AlertSetting/AlertTimeTableAddModal.vue create mode 100644 src/views/dashboard/Dashboard.vue create mode 100644 src/views/dashboard/components/DashboardAlert.vue create mode 100644 src/views/dashboard/components/DashboardEffectScatter.vue create mode 100644 src/views/dashboard/components/DashboardEffectScatterModal.vue create mode 100644 src/views/dashboard/components/DashboardEffectScatterModalChart.vue create mode 100644 src/views/dashboard/components/DashboardElectricity.vue create mode 100644 src/views/dashboard/components/DashboardElectricityModal.vue create mode 100644 src/views/dashboard/components/DashboardEmission.vue create mode 100644 src/views/dashboard/components/DashboardEmissionModal.vue create mode 100644 src/views/dashboard/components/DashboardFloorBar.vue create mode 100644 src/views/dashboard/components/DashboardHumidity.vue create mode 100644 src/views/dashboard/components/DashboardIndoor.vue create mode 100644 src/views/dashboard/components/DashboardIndoorTemp.vue create mode 100644 src/views/dashboard/components/DashboardProduct.vue create mode 100644 src/views/dashboard/components/DashboardProductComplete.vue create mode 100644 src/views/dashboard/components/DashboardProductCompleteModal.vue create mode 100644 src/views/dashboard/components/DashboardProductCompleteModalRecord.vue create mode 100644 src/views/dashboard/components/DashboardProductCompleteModalTarget.vue create mode 100644 src/views/dashboard/components/DashboardRefrig.vue create mode 100644 src/views/dashboard/components/DashboardRefrigTemp.vue create mode 100644 src/views/dashboard/components/DashboardSysCard.vue create mode 100644 src/views/dashboard/components/DashboardTemp.vue create mode 100644 src/views/dashboard/components/ForgeInfoModalChart.vue create mode 100644 src/views/energyManagement/EnergyManagement.vue create mode 100644 src/views/energyManagement/components/BillingDegreeChart.vue create mode 100644 src/views/energyManagement/components/CurrentInformation.vue create mode 100644 src/views/energyManagement/components/ElectricityBillChart.vue create mode 100644 src/views/energyManagement/components/EnergyChart/BillingDegreeChart.vue create mode 100644 src/views/energyManagement/components/EnergyChart/CarbonEmissionChart.vue create mode 100644 src/views/energyManagement/components/EnergyChart/CarbonEmissionModal.vue create mode 100644 src/views/energyManagement/components/EnergyChart/ElecConsumption.vue create mode 100644 src/views/energyManagement/components/EnergyChart/EnergyChart.vue create mode 100644 src/views/energyManagement/components/EnergyChart/ImmediateDemandChart.vue create mode 100644 src/views/energyManagement/components/EnergyChart/ImmediateDemandModal.vue create mode 100644 src/views/energyManagement/components/EnergyChart/IntervalBillChart.vue create mode 100644 src/views/energyManagement/components/EnergyChart/MonthlyElecBillChart.vue create mode 100644 src/views/energyManagement/components/EnergyChart/UsageInformation.vue create mode 100644 src/views/energyManagement/components/EnergyHistoryTable/EnergyActionButton.vue create mode 100644 src/views/energyManagement/components/EnergyHistoryTable/EnergyDataCahrt.vue create mode 100644 src/views/energyManagement/components/EnergyHistoryTable/EnergyDataTable.vue create mode 100644 src/views/energyManagement/components/EnergyHistoryTable/EnergyHistoryTable.vue create mode 100644 src/views/energyManagement/components/EnergyHistoryTable/EnergySearch.vue create mode 100644 src/views/energyManagement/components/EnergyHistoryTable/EnergySearchTime.vue create mode 100644 src/views/energyManagement/components/EnergyHistoryTable/EnergySidebar.vue create mode 100644 src/views/energyManagement/components/EnergyReport/EnergyReport.vue create mode 100644 src/views/energyManagement/components/EnergyReport/EnergyReportSearch.vue create mode 100644 src/views/energyManagement/components/EnergyReport/EnergyReportTable.vue create mode 100644 src/views/energyManagement/components/EnergyReport/EnergyReportTimeRange.vue create mode 100644 src/views/energyManagement/components/ImmediateDemandChart.vue create mode 100644 src/views/energyManagement/components/UsageInformation.vue create mode 100644 src/views/graphManagement/GraphManagement.vue create mode 100644 src/views/graphManagement/components/GraphModal.vue create mode 100644 src/views/graphManagement/components/GraphSidebar.vue create mode 100644 src/views/graphManagement/components/GraphSidebarDropdown.vue create mode 100644 src/views/graphManagement/components/GraphTable.vue create mode 100644 src/views/history/History.vue create mode 100644 src/views/history/components/HistoryActionButton.vue create mode 100644 src/views/history/components/HistoryDataCahrt.vue create mode 100644 src/views/history/components/HistoryFavoriteOption.vue create mode 100644 src/views/history/components/HistorySearch.vue create mode 100644 src/views/history/components/HistorySearchTime.vue create mode 100644 src/views/history/components/HistorySidebar.vue create mode 100644 src/views/history/components/HistoryTable.vue create mode 100644 src/views/login/Login.vue create mode 100644 src/views/operation/Operation.vue create mode 100644 src/views/operation/components/OperationActionButton.vue create mode 100644 src/views/operation/components/OperationSearch.vue create mode 100644 src/views/operation/components/OperationSearchSubSys.vue create mode 100644 src/views/operation/components/OperationSearchType.vue create mode 100644 src/views/operation/components/OperationTable.vue create mode 100644 src/views/operation/components/OperationTableModal.vue create mode 100644 src/views/operation/constant/OperationTableColumns.js create mode 100644 src/views/setting/SettingManagement.vue create mode 100644 src/views/setting/components/Building.vue create mode 100644 src/views/setting/components/BuildingModal.vue create mode 100644 src/views/setting/components/Demand.vue create mode 100644 src/views/setting/components/Dept.vue create mode 100644 src/views/setting/components/DeptModal.vue create mode 100644 src/views/setting/components/ElecPriceManagement.vue create mode 100644 src/views/setting/components/ElecPriceRes.vue create mode 100644 src/views/setting/components/ElecPriceStd.vue create mode 100644 src/views/setting/components/ElecType.vue create mode 100644 src/views/setting/components/ElecTypeModal.vue create mode 100644 src/views/setting/components/Floors.vue create mode 100644 src/views/setting/components/FloorsModal.vue create mode 100644 src/views/setting/components/MQTTCheckboxTree.vue create mode 100644 src/views/setting/components/MQTTList.vue create mode 100644 src/views/setting/components/MQTTListAddModal.vue create mode 100644 src/views/setting/components/PointList.vue create mode 100644 src/views/setting/components/PointListAddModal.vue create mode 100644 src/views/setting/components/Vendor.vue create mode 100644 src/views/setting/components/VendorModal.vue create mode 100644 src/views/system/System.vue create mode 100644 src/views/system/SystemFloor.vue create mode 100644 src/views/system/SystemMain.vue create mode 100644 src/views/system/components/SystemCard.vue create mode 100644 src/views/system/components/SystemDeptBar.vue create mode 100644 src/views/system/components/SystemFloorBar.vue create mode 100644 src/views/system/components/SystemInfoModal.vue create mode 100644 src/views/system/components/SystemInfoModalChart.vue create mode 100644 src/views/system/components/SystemInfoModalCog.vue create mode 100644 src/views/system/components/SystemInfoModalContent.vue create mode 100644 src/views/system/components/SystemInfoModalDesktop.vue create mode 100644 src/views/system/components/SystemInfoModalImage.vue create mode 100644 src/views/system/components/SystemMode.vue create mode 100644 src/views/system/components/SystemSubBar.vue create mode 100644 stats.html create mode 100644 tailwind.config.js create mode 100644 vite.config.js diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..c3ed821 --- /dev/null +++ b/.env.development @@ -0,0 +1,4 @@ +VITE_API_BASEURL = "https://ibms-Empower-api.production.mjmtech.com.tw" +VITE_FILE_API_BASEURL = "https://ibms-Empower.production.mjmtech.com.tw" +VITE_MQTT_BASEURL = "wss://mqttwss.mjm-staging.developers-homelab.net" +VITE_FORGE_BASEURL = "https://ibms-Empower.production.mjmtech.com.tw/dist" \ No newline at end of file diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..c3ed821 --- /dev/null +++ b/.env.production @@ -0,0 +1,4 @@ +VITE_API_BASEURL = "https://ibms-Empower-api.production.mjmtech.com.tw" +VITE_FILE_API_BASEURL = "https://ibms-Empower.production.mjmtech.com.tw" +VITE_MQTT_BASEURL = "wss://mqttwss.mjm-staging.developers-homelab.net" +VITE_FORGE_BASEURL = "https://ibms-Empower.production.mjmtech.com.tw/dist" \ No newline at end of file diff --git a/.env.staging b/.env.staging new file mode 100644 index 0000000..3a51cfe --- /dev/null +++ b/.env.staging @@ -0,0 +1,3 @@ +VITE_API_BASEURL = "http://220.132.206.5:8008" +VITE_FILE_API_BASEURL = "http://220.132.206.5:8085/file" +VITE_FORGE_BASEURL = "http://localhost:5173" \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..b6565d2 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +* text=auto +*.html text eol=lf \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/README.md b/README.md index c35f2a3..da868fb 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ -# 新創賦能 +# 智慧倉儲物流 Node version: 18 \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..2b7c391 --- /dev/null +++ b/index.html @@ -0,0 +1,26 @@ + + + + + + + + + 新創賦能 + + + + + + +
+ + + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..e2195ed --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6798 @@ +{ + "name": "ibms_netzero", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ibms_netzero", + "version": "0.0.0", + "dependencies": { + "@ant-design/icons-vue": "^7.0.1", + "@fortawesome/fontawesome-svg-core": "^1.2.36", + "@fortawesome/free-brands-svg-icons": "^5.15.4", + "@fortawesome/free-regular-svg-icons": "^5.15.4", + "@fortawesome/free-solid-svg-icons": "^5.15.4", + "@fortawesome/vue-fontawesome": "^3.0.5", + "@vuepic/vue-datepicker": "^8.0.0", + "ant-design-vue": "^4.0.7", + "axios": "^1.6.2", + "date-fns": "^3.3.1", + "dayjs": "^1.11.10", + "echarts": "^5.4.3", + "flag-icons": "^7.2.3", + "jquery-ui": "^1.14.1", + "json-schema-generator": "^2.0.6", + "mqtt": "^5.10.3", + "pinia": "^2.1.7", + "requirejs": "^2.3.6", + "tailwind-merge": "^2.2.1", + "vue": "^3.3.4", + "vue-i18n": "^10.0.4", + "vue-router": "^4.2.5", + "vuedraggable": "^4.1.0", + "yup": "^1.4.0", + "yup-phone-lite": "^2.0.1" + }, + "devDependencies": { + "@faker-js/faker": "^9.7.0", + "@vitejs/plugin-vue": "^4.4.0", + "autoprefixer": "^10.4.16", + "daisyui": "^4.4.17", + "postcss": "^8.4.31", + "rollup-plugin-visualizer": "^6.0.3", + "sass": "^1.69.5", + "sass-loader": "^13.3.2", + "tailwindcss": "^3.3.5", + "unplugin-vue-components": "^0.26.0", + "vite": "^4.4.11", + "vite-plugin-svg-icons": "^2.0.1" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ant-design/colors": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz", + "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", + "dependencies": { + "@ctrl/tinycolor": "^3.4.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.3.1.tgz", + "integrity": "sha512-4QBZg8ccyC6LPIRii7A0bZUk3+lEDCLnhB+FVsflGdcWPPmV+j3fire4AwwoqHV/BibgvBmR9ZIo4s867smv+g==" + }, + "node_modules/@ant-design/icons-vue": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-7.0.1.tgz", + "integrity": "sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-svg": "^4.2.1" + }, + "peerDependencies": { + "vue": ">=3.0.3" + } + }, + "node_modules/@antfu/utils": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.6.tgz", + "integrity": "sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", + "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@faker-js/faker": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-9.7.0.tgz", + "integrity": "sha512-aozo5vqjCmDoXLNUJarFZx2IN/GgGaogY4TMJ6so/WLZOWpSV7fvj2dmrV6sEAnUm1O7aCrhTibjpzeDFgNqbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/fakerjs" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.0.0", + "npm": ">=9.0.0" + } + }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "0.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", + "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "1.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", + "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-brands-svg-icons": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-5.15.4.tgz", + "integrity": "sha512-f1witbwycL9cTENJegcmcZRYyawAFbm8+c6IirLmwbbpqz46wyjbQYLuxOc7weXFXfB7QR8/Vd2u5R3q6JYD9g==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-regular-svg-icons": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.15.4.tgz", + "integrity": "sha512-9VNNnU3CXHy9XednJ3wzQp6SwNwT3XaM26oS4Rp391GsxVYA+0oDR2J194YCIWf7jNRCYKjUCOduxdceLrx+xw==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", + "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/vue-fontawesome": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.5.tgz", + "integrity": "sha512-isZZ4+utQH9qg9cWxWYHQ9GwI3r5FeO7GnmzKYV+gbjxcptQhh+F99iZXi1Y9AvFUEgy8kRpAdvDlbb3drWFrw==", + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~1 || ~6", + "vue": ">= 3.0.0 < 4" + } + }, + "node_modules/@intlify/core-base": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-10.0.4.tgz", + "integrity": "sha512-GG428DkrrWCMhxRMRQZjuS7zmSUzarYcaHJqG9VB8dXAxw4iQDoKVQ7ChJRB6ZtsCsX3Jse1PEUlHrJiyQrOTg==", + "license": "MIT", + "dependencies": { + "@intlify/message-compiler": "10.0.4", + "@intlify/shared": "10.0.4" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/message-compiler": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-10.0.4.tgz", + "integrity": "sha512-AFbhEo10DP095/45EauinQJ5hJ3rJUmuuqltGguvc3WsvezZN+g8qNHLGWKu60FHQVizMrQY7VJ+zVlBXlQQkQ==", + "license": "MIT", + "dependencies": { + "@intlify/shared": "10.0.4", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/shared": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-10.0.4.tgz", + "integrity": "sha512-ukFn0I01HsSgr3VYhYcvkTCLS7rGa0gw4A4AMpcy/A9xx/zRJy7PS2BElMXLwUazVFMAr5zuiTk3MQeoeGXaJg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@simonwep/pickr": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@simonwep/pickr/-/pickr-1.8.2.tgz", + "integrity": "sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==", + "dependencies": { + "core-js": "^3.15.1", + "nanopop": "^2.1.0" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/eslint": { + "version": "8.44.8", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.8.tgz", + "integrity": "sha512-4K8GavROwhrYl2QXDXm0Rv9epkA8GBFu0EI+XrrnnuCl7u8CWBRusX7fXJfanhZTDWSAL24gDI/UqXyUM0Injw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "peer": true + }, + "node_modules/@types/node": { + "version": "20.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", + "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/readable-stream": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.18.tgz", + "integrity": "sha512-21jK/1j+Wg+7jVw1xnSwy/2Q1VgVjWuFssbYGTREPUBeZ+rqVFl2udq0IkxzPC0ZhOzVceUbyIACFZKLqKEBlA==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "safe-buffer": "~5.1.1" + } + }, + "node_modules/@types/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/@types/svgo": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@types/svgo/-/svgo-2.6.4.tgz", + "integrity": "sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.13", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", + "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.5.0.tgz", + "integrity": "sha512-a2WSpP8X8HTEww/U00bU4mX1QpLINNuz/2KMNpLsdu3BzOpak3AGI1CJYBTXcc4SPhaD0eNRUp7IyQK405L5dQ==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0 || ^5.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.9.tgz", + "integrity": "sha512-+/Lf68Vr/nFBA6ol4xOtJrW+BQWv3QWKfRwGSm70jtXwfhZNF4R/eRgyVJYoxFRhdCTk/F6g99BP0ffPgZihfQ==", + "dependencies": { + "@babel/parser": "^7.23.3", + "@vue/shared": "3.3.9", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.9.tgz", + "integrity": "sha512-nfWubTtLXuT4iBeDSZ5J3m218MjOy42Vp2pmKVuBKo2/BLcrFUX8nCSr/bKRFiJ32R8qbdnnnBgRn9AdU5v0Sg==", + "dependencies": { + "@vue/compiler-core": "3.3.9", + "@vue/shared": "3.3.9" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.9.tgz", + "integrity": "sha512-wy0CNc8z4ihoDzjASCOCsQuzW0A/HP27+0MDSSICMjVIFzk/rFViezkR3dzH+miS2NDEz8ywMdbjO5ylhOLI2A==", + "dependencies": { + "@babel/parser": "^7.23.3", + "@vue/compiler-core": "3.3.9", + "@vue/compiler-dom": "3.3.9", + "@vue/compiler-ssr": "3.3.9", + "@vue/reactivity-transform": "3.3.9", + "@vue/shared": "3.3.9", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.5", + "postcss": "^8.4.31", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.9.tgz", + "integrity": "sha512-NO5oobAw78R0G4SODY5A502MGnDNiDjf6qvhn7zD7TJGc8XDeIEw4fg6JU705jZ/YhuokBKz0A5a/FL/XZU73g==", + "dependencies": { + "@vue/compiler-dom": "3.3.9", + "@vue/shared": "3.3.9" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.1.tgz", + "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==" + }, + "node_modules/@vue/reactivity": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.9.tgz", + "integrity": "sha512-VmpIqlNp+aYDg2X0xQhJqHx9YguOmz2UxuUJDckBdQCNkipJvfk9yA75woLWElCa0Jtyec3lAAt49GO0izsphw==", + "dependencies": { + "@vue/shared": "3.3.9" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.9.tgz", + "integrity": "sha512-HnUFm7Ry6dFa4Lp63DAxTixUp8opMtQr6RxQCpDI1vlh12rkGIeYqMvJtK+IKyEfEOa2I9oCkD1mmsPdaGpdVg==", + "dependencies": { + "@babel/parser": "^7.23.3", + "@vue/compiler-core": "3.3.9", + "@vue/shared": "3.3.9", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.5" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.9.tgz", + "integrity": "sha512-xxaG9KvPm3GTRuM4ZyU8Tc+pMVzcu6eeoSRQJ9IE7NmCcClW6z4B3Ij6L4EDl80sxe/arTtQ6YmgiO4UZqRc+w==", + "dependencies": { + "@vue/reactivity": "3.3.9", + "@vue/shared": "3.3.9" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.9.tgz", + "integrity": "sha512-e7LIfcxYSWbV6BK1wQv9qJyxprC75EvSqF/kQKe6bdZEDNValzeRXEVgiX7AHI6hZ59HA4h7WT5CGvm69vzJTQ==", + "dependencies": { + "@vue/runtime-core": "3.3.9", + "@vue/shared": "3.3.9", + "csstype": "^3.1.2" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.9.tgz", + "integrity": "sha512-w0zT/s5l3Oa3ZjtLW88eO4uV6AQFqU8X5GOgzq7SkQQu6vVr+8tfm+OI2kDBplS/W/XgCBuFXiPw6T5EdwXP0A==", + "dependencies": { + "@vue/compiler-ssr": "3.3.9", + "@vue/shared": "3.3.9" + }, + "peerDependencies": { + "vue": "3.3.9" + } + }, + "node_modules/@vue/shared": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.9.tgz", + "integrity": "sha512-ZE0VTIR0LmYgeyhurPTpy4KzKsuDyQbMSdM49eKkMnT5X4VfFBLysMzjIZhLEFQYjjOVVfbvUDHckwjDFiO2eA==" + }, + "node_modules/@vuepic/vue-datepicker": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@vuepic/vue-datepicker/-/vue-datepicker-8.0.0.tgz", + "integrity": "sha512-0HsxG2GGTWzeitPVhIEFPHLyLwTU+VT0vk15JreqNi0cB6D5Mpf5vqHppJE0ech+ZTQx36Ip99oSfnQdA0SNrA==", + "dependencies": { + "date-fns": "^3.3.1" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "vue": ">=3.2.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "peer": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "peer": true + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peer": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ant-design-vue": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/ant-design-vue/-/ant-design-vue-4.0.7.tgz", + "integrity": "sha512-oHTtc1GZkfENZTkt2aDvjaD4yoRsowYvCOmxA6+5AGqm5uz/datdJOXsq9nokIhC+vrAMhk6JQVFZ2hh7eU6Pw==", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-vue": "^7.0.0", + "@babel/runtime": "^7.10.5", + "@ctrl/tinycolor": "^3.5.0", + "@emotion/hash": "^0.9.0", + "@emotion/unitless": "^0.8.0", + "@simonwep/pickr": "~1.8.0", + "array-tree-filter": "^2.1.0", + "async-validator": "^4.0.0", + "csstype": "^3.1.1", + "dayjs": "^1.10.5", + "dom-align": "^1.12.1", + "dom-scroll-into-view": "^2.0.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.15", + "resize-observer-polyfill": "^1.5.1", + "scroll-into-view-if-needed": "^2.2.25", + "shallow-equal": "^1.0.0", + "stylis": "^4.1.3", + "throttle-debounce": "^5.0.0", + "vue-types": "^3.0.0", + "warning": "^4.0.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design-vue" + }, + "peerDependencies": { + "vue": ">=3.2.0" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/bl/-/bl-6.0.16.tgz", + "integrity": "sha512-V/kz+z2Mx5/6qDfRCilmrukUXcXuCoXKg3/3hDvzKKoSUx8CJKudfIoT29XZc3UE9xBvxs5qictiHdprwtteEg==", + "license": "MIT", + "dependencies": { + "@types/readable-stream": "^4.0.0", + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^4.2.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-base/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001565", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001565.tgz", + "integrity": "sha512-xrE//a3O7TP0vaJ8ikzkD2c2NgcVUvsEe2IvFTntV4Yd1Z9FVzh+gW+enX96L0psrbaFMcVcH2l90xNuGDWc8w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "license": "Apache-2.0" + }, + "node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/class-utils/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/commist": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/commist/-/commist-3.2.0.tgz", + "integrity": "sha512-4PIMoPniho+LqXmpS5d3NuGYncG6XWlkBSVGiWycL22dd42OYdUGil2CWuzklaJoNxyxUSpO4MKIBU94viWNAw==", + "license": "MIT" + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/compute-scroll-into-view": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", + "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-js": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.34.0.tgz", + "integrity": "sha512-aDdvlDder8QmY91H88GzNi9EtQi2TjvQhpCX6B1v/dAZHU1AuLgHvRh54RiOerpEhEW46Tkf+vgAViB/CWC0ag==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/css-select/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/css-select/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/css-selector-tokenizer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz", + "integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/culori": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/culori/-/culori-3.3.0.tgz", + "integrity": "sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/daisyui": { + "version": "4.4.17", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.4.17.tgz", + "integrity": "sha512-vcxLKoWiqPjEtcBkSayi9sDW1kWgWRdy1GjSu3zNtMiCsXwqDpCzNkdijuY9RuJ/2tBCtnwxhBv72Yizfi7KAQ==", + "dev": true, + "dependencies": { + "css-selector-tokenizer": "^0.8", + "culori": "^3", + "picocolors": "^1", + "postcss-js": "^4" + }, + "engines": { + "node": ">=16.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/daisyui" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/date-fns": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.3.1.tgz", + "integrity": "sha512-y8e109LYGgoQDveiEBD3DYXKba1jWf5BA8YU1FL5Tvm0BTdEfy54WLCwnuYWZNnzzvALy/QQ4Hov+Q9RVRv+Zw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/dom-align": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz", + "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==" + }, + "node_modules/dom-scroll-into-view": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz", + "integrity": "sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==" + }, + "node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "license": "MIT", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/echarts": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.4.3.tgz", + "integrity": "sha512-mYKxLxhzy6zyTi/FaEbJMOZU1ULGEQHaeIeuMR5L+JnJTpz+YR03mnnpBhbR4+UYJAgiXgpyTVLffPAjOTLkZA==", + "dependencies": { + "tslib": "2.3.0", + "zrender": "5.4.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.600", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.600.tgz", + "integrity": "sha512-KD6CWjf1BnQG+NsXuyiTDDT1eV13sKuYsOUioXkQweYTQIbgHkXPry9K7M+7cKtYHnSUPitVaLrXYB1jTkkYrw==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "dev": true, + "peer": true + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "peer": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-unique-numbers": { + "version": "8.0.13", + "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-8.0.13.tgz", + "integrity": "sha512-7OnTFAVPefgw2eBJ1xj2PGGR9FwYzSUso9decayHgCDX4sJkHLdcsYTytTg+tYv+wKF3U8gJuSBz2jJpQV4u/g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.1.0" + } + }, + "node_modules/fast-unique-numbers/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flag-icons": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/flag-icons/-/flag-icons-7.2.3.tgz", + "integrity": "sha512-X2gUdteNuqdNqob2KKTJTS+ZCvyWeLCtDz9Ty8uJP17Y4o82Y+U/Vd4JNrdwTAjagYsRznOn9DZ+E/Q52qbmqg==", + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "peer": true + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/help-me": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", + "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==", + "license": "MIT" + }, + "node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", + "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", + "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz", + "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "license": "MIT" + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/jquery": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" + }, + "node_modules/jquery-ui": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.14.1.tgz", + "integrity": "sha512-DhzsYH8VeIvOaxwi+B/2BCsFFT5EGjShdzOcm5DssWjtcpGWIMsn66rJciDA6jBruzNiLf1q0KvwMoX1uGNvnQ==", + "dependencies": { + "jquery": ">=1.12.0 <5.0.0" + } + }, + "node_modules/js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "node_modules/js-sdsl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "peer": true + }, + "node_modules/json-promise": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/json-promise/-/json-promise-1.1.8.tgz", + "integrity": "sha512-rz31P/7VfYnjQFrF60zpPTT0egMPlc8ZvIQHWs4ZtNZNnAXRmXo6oS+6eyWr5sEMG03OVhklNrTXxiIRYzoUgQ==", + "license": "MIT", + "dependencies": { + "bluebird": "*" + } + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-generator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/json-schema-generator/-/json-schema-generator-2.0.6.tgz", + "integrity": "sha512-WyWDTK3jnv/OBI43uWw7pTGoDQ62PfccySZCHTBsOfS6D9QhsQr+95Wcwq5lqjzkiDQkTNkWzXEqHOhswfufmw==", + "license": "MIT", + "dependencies": { + "json-promise": "^1.1.8", + "mkdirp": "^0.5.0", + "optimist": "^0.6.1", + "pretty-data": "^0.40.0", + "request": "^2.81.0" + }, + "bin": { + "json-schema-generator": "bin/cli.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "license": "ISC" + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "license": "MIT", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/libphonenumber-js": { + "version": "1.10.60", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.60.tgz", + "integrity": "sha512-Ctgq2lXUpEJo5j1762NOzl2xo7z7pqmVWYai0p07LvAkQ32tbPv3wb+tcUeHEiXhKU5buM4H9MXsXo6OlM6C2g==" + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/merge-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-1.0.1.tgz", + "integrity": "sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==", + "dev": true, + "dependencies": { + "is-plain-obj": "^1.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "peer": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mqtt": { + "version": "5.10.3", + "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-5.10.3.tgz", + "integrity": "sha512-hA/6YrUS4fywhBGCjH/XXUuLeueJiPqruVVWjK2A24Ma4KcWfZ/x8x07aoesBV+HXDWBC08tbT4IWfSXNW0Jtw==", + "license": "MIT", + "dependencies": { + "@types/readable-stream": "^4.0.5", + "@types/ws": "^8.5.9", + "commist": "^3.2.0", + "concat-stream": "^2.0.0", + "debug": "^4.3.4", + "help-me": "^5.0.0", + "lru-cache": "^10.0.1", + "minimist": "^1.2.8", + "mqtt-packet": "^9.0.1", + "number-allocator": "^1.0.14", + "readable-stream": "^4.4.2", + "reinterval": "^1.1.0", + "rfdc": "^1.3.0", + "split2": "^4.2.0", + "worker-timers": "^7.1.4", + "ws": "^8.17.1" + }, + "bin": { + "mqtt": "build/bin/mqtt.js", + "mqtt_pub": "build/bin/pub.js", + "mqtt_sub": "build/bin/sub.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/mqtt-packet": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-9.0.1.tgz", + "integrity": "sha512-koZF1V/X2RZUI6uD9wN5OK1JxxcG1ofAR4H3LjCw1FkeKzruZQ26aAA6v2m1lZyWONZIR5wMMJFrZJDRNzbiQw==", + "license": "MIT", + "dependencies": { + "bl": "^6.0.8", + "debug": "^4.3.4", + "process-nextick-args": "^2.0.1" + } + }, + "node_modules/mqtt/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanopop": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/nanopop/-/nanopop-2.3.0.tgz", + "integrity": "sha512-fzN+T2K7/Ah25XU02MJkPZ5q4Tj5FpjmIYq4rvoHX4yb16HzFdCO6JxFFn5Y/oBhQ8no8fUZavnyIv9/+xkBBw==" + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/number-allocator": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.14.tgz", + "integrity": "sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.1", + "js-sdsl": "4.3.0" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-visit/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g==", + "license": "MIT/X11", + "dependencies": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "node_modules/optimist/node_modules/minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==", + "license": "MIT" + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/pathe": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-0.2.0.tgz", + "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinia": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.7.tgz", + "integrity": "sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==", + "dependencies": { + "@vue/devtools-api": "^6.5.0", + "vue-demi": ">=0.14.5" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.3.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-prefix-selector": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.16.0.tgz", + "integrity": "sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==", + "dev": true, + "peerDependencies": { + "postcss": ">4 <9" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/posthtml": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.9.2.tgz", + "integrity": "sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==", + "dev": true, + "dependencies": { + "posthtml-parser": "^0.2.0", + "posthtml-render": "^1.0.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/posthtml-parser": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.2.1.tgz", + "integrity": "sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==", + "dev": true, + "dependencies": { + "htmlparser2": "^3.8.3", + "isobject": "^2.1.0" + } + }, + "node_modules/posthtml-rename-id": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz", + "integrity": "sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==", + "dev": true, + "dependencies": { + "escape-string-regexp": "1.0.5" + } + }, + "node_modules/posthtml-render": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-1.4.0.tgz", + "integrity": "sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/posthtml-svg-mode": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/posthtml-svg-mode/-/posthtml-svg-mode-1.0.3.tgz", + "integrity": "sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==", + "dev": true, + "dependencies": { + "merge-options": "1.0.1", + "posthtml": "^0.9.2", + "posthtml-parser": "^0.2.1", + "posthtml-render": "^1.0.6" + } + }, + "node_modules/pretty-data": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/pretty-data/-/pretty-data-0.40.0.tgz", + "integrity": "sha512-YFLnEdDEDnkt/GEhet5CYZHCvALw6+Elyb/tp8kQG03ZSIuzeaDWpZYndCXwgqu4NAjh1PI534dhDS1mHarRnQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/property-expr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz", + "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "peer": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reinterval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", + "integrity": "sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==", + "license": "MIT" + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "license": "Apache-2.0", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requirejs": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz", + "integrity": "sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==", + "bin": { + "r_js": "bin/r.js", + "r.js": "bin/r.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-visualizer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-6.0.3.tgz", + "integrity": "sha512-ZU41GwrkDcCpVoffviuM9Clwjy5fcUxlz0oMoTXTYsK+tcIFzbdacnrr2n8TXcHxbGKKXtOdjxM2HUS4HjkwIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "open": "^8.0.0", + "picomatch": "^4.0.2", + "source-map": "^0.7.4", + "yargs": "^17.5.1" + }, + "bin": { + "rollup-plugin-visualizer": "dist/bin/cli.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "rolldown": "1.x || ^1.0.0-beta", + "rollup": "2.x || 3.x || 4.x" + }, + "peerDependenciesMeta": { + "rolldown": { + "optional": true + }, + "rollup": { + "optional": true + } + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.69.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz", + "integrity": "sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-loader": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz", + "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==", + "dev": true, + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/scroll-into-view-if-needed": { + "version": "2.2.31", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz", + "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==", + "dependencies": { + "compute-scroll-into-view": "^1.0.20" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shallow-equal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", + "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sortablejs": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.14.0.tgz", + "integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==", + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "dev": true + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "license": "MIT", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "dev": true + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stylis": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.0.tgz", + "integrity": "sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==" + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-baker": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/svg-baker/-/svg-baker-1.7.0.tgz", + "integrity": "sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.0", + "clone": "^2.1.1", + "he": "^1.1.1", + "image-size": "^0.5.1", + "loader-utils": "^1.1.0", + "merge-options": "1.0.1", + "micromatch": "3.1.0", + "postcss": "^5.2.17", + "postcss-prefix-selector": "^1.6.0", + "posthtml-rename-id": "^1.0", + "posthtml-svg-mode": "^1.0.3", + "query-string": "^4.3.2", + "traverse": "^0.6.6" + } + }, + "node_modules/svg-baker/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/micromatch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.0.tgz", + "integrity": "sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.2.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "extglob": "^2.0.2", + "fragment-cache": "^0.2.1", + "kind-of": "^5.0.2", + "nanomatch": "^1.2.1", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/svg-baker/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/svg-baker/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/tailwind-merge": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.2.1.tgz", + "integrity": "sha512-o+2GTLkthfa5YUt4JxPfzMIpQzZ3adD1vLVkvKE1Twl9UAhGsEbIZhHHZVRttyW177S8PDJI3bTQNaebyofK3Q==", + "dependencies": { + "@babel/runtime": "^7.23.7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz", + "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.19.1", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz", + "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "peer": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throttle-debounce": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.0.tgz", + "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==", + "engines": { + "node": ">=12.22" + } + }, + "node_modules/tiny-case": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz", + "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==" + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-regex/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==" + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/traverse": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", + "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "license": "Unlicense" + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unplugin": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.5.1.tgz", + "integrity": "sha512-0QkvG13z6RD+1L1FoibQqnvTwVBXvS4XSPwAyinVgoOCl2jAgwzdUKmEj05o4Lt8xwQI85Hb6mSyYkcAGwZPew==", + "dev": true, + "dependencies": { + "acorn": "^8.11.2", + "chokidar": "^3.5.3", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.6.0" + } + }, + "node_modules/unplugin-vue-components": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.26.0.tgz", + "integrity": "sha512-s7IdPDlnOvPamjunVxw8kNgKNK8A5KM1YpK5j/p97jEKTjlPNrA0nZBiSfAKKlK1gWZuyWXlKL5dk3EDw874LQ==", + "dev": true, + "dependencies": { + "@antfu/utils": "^0.7.6", + "@rollup/pluginutils": "^5.0.4", + "chokidar": "^3.5.3", + "debug": "^4.3.4", + "fast-glob": "^3.3.1", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.3", + "minimatch": "^9.0.3", + "resolve": "^1.22.4", + "unplugin": "^1.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@babel/parser": "^7.15.8", + "@nuxt/kit": "^3.2.2", + "vue": "2 || 3" + }, + "peerDependenciesMeta": { + "@babel/parser": { + "optional": true + }, + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/unplugin-vue-components/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/unplugin-vue-components/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vite": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", + "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-svg-icons": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/vite-plugin-svg-icons/-/vite-plugin-svg-icons-2.0.1.tgz", + "integrity": "sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==", + "dev": true, + "dependencies": { + "@types/svgo": "^2.6.1", + "cors": "^2.8.5", + "debug": "^4.3.3", + "etag": "^1.8.1", + "fs-extra": "^10.0.0", + "pathe": "^0.2.0", + "svg-baker": "1.7.0", + "svgo": "^2.8.0" + }, + "peerDependencies": { + "vite": ">=2.0.0" + } + }, + "node_modules/vue": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.9.tgz", + "integrity": "sha512-sy5sLCTR8m6tvUk1/ijri3Yqzgpdsmxgj6n6yl7GXXCXqVbmW2RCXe9atE4cEI6Iv7L89v5f35fZRRr5dChP9w==", + "dependencies": { + "@vue/compiler-dom": "3.3.9", + "@vue/compiler-sfc": "3.3.9", + "@vue/runtime-dom": "3.3.9", + "@vue/server-renderer": "3.3.9", + "@vue/shared": "3.3.9" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-i18n": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-10.0.4.tgz", + "integrity": "sha512-1xkzVxqBLk2ZFOmeI+B5r1J7aD/WtNJ4j9k2mcFcQo5BnOmHBmD7z4/oZohh96AAaRZ4Q7mNQvxc9h+aT+Md3w==", + "license": "MIT", + "dependencies": { + "@intlify/core-base": "10.0.4", + "@intlify/shared": "10.0.4", + "@vue/devtools-api": "^6.5.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vue-router": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.5.tgz", + "integrity": "sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==", + "dependencies": { + "@vue/devtools-api": "^6.5.0" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/vue-types/-/vue-types-3.0.2.tgz", + "integrity": "sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==", + "dependencies": { + "is-plain-object": "3.0.1" + }, + "engines": { + "node": ">=10.15.0" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vuedraggable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-4.1.0.tgz", + "integrity": "sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==", + "license": "MIT", + "dependencies": { + "sortablejs": "1.14.0" + }, + "peerDependencies": { + "vue": "^3.0.1" + } + }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.1.tgz", + "integrity": "sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==", + "dev": true + }, + "node_modules/wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/worker-timers": { + "version": "7.1.8", + "resolved": "https://registry.npmjs.org/worker-timers/-/worker-timers-7.1.8.tgz", + "integrity": "sha512-R54psRKYVLuzff7c1OTFcq/4Hue5Vlz4bFtNEIarpSiCYhpifHU3aIQI29S84o1j87ePCYqbmEJPqwBTf+3sfw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.5", + "tslib": "^2.6.2", + "worker-timers-broker": "^6.1.8", + "worker-timers-worker": "^7.0.71" + } + }, + "node_modules/worker-timers-broker": { + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-6.1.8.tgz", + "integrity": "sha512-FUCJu9jlK3A8WqLTKXM9E6kAmI/dR1vAJ8dHYLMisLNB/n3GuaFIjJ7pn16ZcD1zCOf7P6H62lWIEBi+yz/zQQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.5", + "fast-unique-numbers": "^8.0.13", + "tslib": "^2.6.2", + "worker-timers-worker": "^7.0.71" + } + }, + "node_modules/worker-timers-broker/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/worker-timers-worker": { + "version": "7.0.71", + "resolved": "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-7.0.71.tgz", + "integrity": "sha512-ks/5YKwZsto1c2vmljroppOKCivB/ma97g9y77MAAz2TBBjPPgpoOiS1qYQKIgvGTr2QYPT3XhJWIB6Rj2MVPQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.5", + "tslib": "^2.6.2" + } + }, + "node_modules/worker-timers-worker/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/worker-timers/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yup": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/yup/-/yup-1.4.0.tgz", + "integrity": "sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg==", + "dependencies": { + "property-expr": "^2.0.5", + "tiny-case": "^1.0.3", + "toposort": "^2.0.2", + "type-fest": "^2.19.0" + } + }, + "node_modules/yup-phone-lite": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/yup-phone-lite/-/yup-phone-lite-2.0.1.tgz", + "integrity": "sha512-IV8q5VSq3MqVDm58ZyPSrtKfVtl+Z5N8UxWdEP573Nk09MLrF6drReOjUX6OggL0ByTMLO+z8r/L8taftUCGyw==", + "dependencies": { + "libphonenumber-js": "^1.10.18" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "yup": ">0.32.0" + } + }, + "node_modules/zrender": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.4.4.tgz", + "integrity": "sha512-0VxCNJ7AGOMCWeHVyTrGzUgrK4asT4ml9PEkeGirAkKNYXYzoPJCLvmyfdoOXcjTHPs10OZVMfD1Rwg16AZyYw==", + "dependencies": { + "tslib": "2.3.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..2ff7a5e --- /dev/null +++ b/package.json @@ -0,0 +1,52 @@ +{ + "name": "ibms_netzero", + "version": "0.0.0", + "private": true, + "homepage": "/netzero", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@ant-design/icons-vue": "^7.0.1", + "@fortawesome/fontawesome-svg-core": "^1.2.36", + "@fortawesome/free-brands-svg-icons": "^5.15.4", + "@fortawesome/free-regular-svg-icons": "^5.15.4", + "@fortawesome/free-solid-svg-icons": "^5.15.4", + "@fortawesome/vue-fontawesome": "^3.0.5", + "@vuepic/vue-datepicker": "^8.0.0", + "ant-design-vue": "^4.0.7", + "axios": "^1.6.2", + "date-fns": "^3.3.1", + "dayjs": "^1.11.10", + "echarts": "^5.4.3", + "flag-icons": "^7.2.3", + "jquery-ui": "^1.14.1", + "json-schema-generator": "^2.0.6", + "mqtt": "^5.10.3", + "pinia": "^2.1.7", + "requirejs": "^2.3.6", + "tailwind-merge": "^2.2.1", + "vue": "^3.3.4", + "vue-i18n": "^10.0.4", + "vue-router": "^4.2.5", + "vuedraggable": "^4.1.0", + "yup": "^1.4.0", + "yup-phone-lite": "^2.0.1" + }, + "devDependencies": { + "@faker-js/faker": "^9.7.0", + "@vitejs/plugin-vue": "^4.4.0", + "autoprefixer": "^10.4.16", + "daisyui": "^4.4.17", + "postcss": "^8.4.31", + "rollup-plugin-visualizer": "^6.0.3", + "sass": "^1.69.5", + "sass-loader": "^13.3.2", + "tailwindcss": "^3.3.5", + "unplugin-vue-components": "^0.26.0", + "vite": "^4.4.11", + "vite-plugin-svg-icons": "^2.0.1" + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..a5a6ff8 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,7 @@ +module.exports = { + plugins: { + "postcss-import": {}, + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/public/build_img.jpg b/public/build_img.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c97ff9b307e3b98aac30807a718c32605bed41f3 GIT binary patch literal 140331 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 RU47BrKlqw_k?d%H|JirsuO0vZ literal 0 HcmV?d00001 diff --git a/public/config.json b/public/config.json new file mode 100644 index 0000000..65d0c7c --- /dev/null +++ b/public/config.json @@ -0,0 +1,44 @@ +{ + "heatmap": { + "temp": { + "range": [0, 50], + "color": ["#0023F5", "#FF1C05"], + "unit": "°C" + }, + "humi": { + "range": [15, 95], + "color": ["#ADD8E6", "#00008B"], + "unit": "%" + }, + "CO2": { + "range": [0, 5000], + "color": ["#FFDAB9", "#FF8C00"], + "unit": "ppm" + }, + "CO": { + "range": [0, 1000], + "color": ["#FFFFE0", "#FFD700"], + "unit": "ppm" + }, + "CH2O": { + "range": [0, 100], + "color": ["#90EE90", "#006400"], + "unit": "ppb" + }, + "PM1": { + "range": [0, 20], + "color": ["#E6E6FA", "#800080"], + "unit": "µg/m³" + }, + "PM2.5": { + "range": [0, 55], + "color": ["#FFB6C1", "#FF0000"], + "unit": "µg/m³" + }, + "PM10": { + "range": [0, 150], + "color": ["#FFDDC1", "#FF1493"], + "unit": "µg/m³" + } + } +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..795b5ce92211ce21a8e6f738e7bdc17cd2959b01 GIT binary patch literal 2834 zcmb`J+f!3l6vornzPHcL^rh2>{wozIW$0xXXVlSYt?dlMMUxO>0*OEZF+dD*lL#aM z)M9DGc94rx5k;|pqL6@CLM2F0kU%b9*E%8LlC!A~J(-=8?5yl>?{EF~+DD=IfL@0_ zQt-PX@}WZUu|lEvl-eO`pHbs}zBKgPC!fcg)Io3Ea}Kz@b+XOnwPSMSArjZXU>BP2 zmZ8IUNjBb1@y}Ps6XCeo(+p+aVWixU<*`){&coYv!W#dlXSb!dq}O z=~3IQM8~YWKF1Hg>O+iPTbm&?*wv)}MT$1hhxM;@STVgifex==JepU}i*~$=tl@QF z5#{=0FxCG6_l(#t&%7I<=m!2-d;z2Gh@>O8{$gbo#vTq}Wix-9bS zcB4tkrAGM`nud(x98mn^$|$aP)(E}loU~ppMVNBR7mv@mlVyO$^LU-8vF1XRmqvc3 zqq?(D$e@c@_DnlrG5<)hBK8hru>We3(}ndpu+MV(>~lN$U1G?AnzU7U=_so?0oQZ+ z`MPOuw2obXPWKJPr^))SQ-2MgcOt339)2rvCfoi^IQ8Q}U*?ar5F zpL5^kvLHs9yRWI>V*rxOZ!}wDfst z!;h=8P4Wy7Q|(V`P+HFWnQKQnjFm^>oT`&=zNtr*Q^M^{1#7 z%hye2=JIg)HZ$?_M{_ol>ge5sT*^JTxr|@tT4)aPV>+MNV5~YO<$xI|EjuD{A*#jg zPl=g|_!+>tuP8l^<>kc`-9$$?wuQchZXpA_CaW_q&LHL0X3Iy9uT2=w%v3pkmKb2~ z9gX^A%}r?TzmF{sAILyMe+i1nMCzT?J@sIge;Gf=Dcket(ZR2jsy8XYO{* tjfrIU^gp3zKG9jk3^ooKFf?>M`Jew}=5`70kMt(vcYjDchyI`Ue*w@}DPjNs literal 0 HcmV?d00001 diff --git a/public/hotspot.svg b/public/hotspot.svg new file mode 100644 index 0000000..2b2249a --- /dev/null +++ b/public/hotspot.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/logo.svg b/public/logo.svg new file mode 100644 index 0000000..b4d6ad4 --- /dev/null +++ b/public/logo.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/setting.html b/public/setting.html new file mode 100644 index 0000000..e3e2eaf --- /dev/null +++ b/public/setting.html @@ -0,0 +1,15 @@ + + + + + + Document + + + + + diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..cc64f26 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/src/apis/account/api.js b/src/apis/account/api.js new file mode 100644 index 0000000..8ae9418 --- /dev/null +++ b/src/apis/account/api.js @@ -0,0 +1,14 @@ +export const GET_ACCOUNT_USERLIST_API = `/User/UserManagerList`; + +export const GET_ACCOUNT_ROLELIST_API = `/User/RoleManagerList`; +export const GET_ACCOUNT_ROLEAUTHLIST_API = `/User/RoleAuthList`; +export const GET_ACCOUNT_ROLEAUTHPAGELIST_API = `/User/AuthPageListByVariable`; + +// export const POST_ROLEAUTHLIST_API = `/User/SaveRoleAuth`; + +export const POST_ACCOUNT_ROLE_API = `/User/SaveRoleAndAuth`; +export const DELETE_ACCOUNT_ROLE_API = `/User/DeleteOneRole`; + +export const GET_ACCOUNT_USER_API = `/User/GetOneUser`; +export const POST_ACCOUNT_USER_API = `/User/SaveUser`; +export const DELETE_ACCOUNT_USER_API = `/User/DeleteOneUser`; diff --git a/src/apis/account/index.js b/src/apis/account/index.js new file mode 100644 index 0000000..210b375 --- /dev/null +++ b/src/apis/account/index.js @@ -0,0 +1,158 @@ +import { + GET_ACCOUNT_USERLIST_API, + GET_ACCOUNT_ROLELIST_API, + GET_ACCOUNT_ROLEAUTHLIST_API, + GET_ACCOUNT_ROLEAUTHPAGELIST_API, + DELETE_ACCOUNT_ROLE_API, + POST_ACCOUNT_ROLE_API, + POST_ACCOUNT_USER_API, + GET_ACCOUNT_USER_API, + DELETE_ACCOUNT_USER_API, +} from "./api"; +import instance from "@/util/request"; +import apihandler from "@/util/apihandler"; + +export const getAccountUserList = async (search_condition = {}) => { + const res = await instance.post(GET_ACCOUNT_USERLIST_API, search_condition); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAccountRoleList = async (search_condition = {}) => { + const res = await instance.post(GET_ACCOUNT_ROLELIST_API, { + Layer: 1, + ...search_condition, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAccountRoleAuthList = async (SelectedRoleId) => { + const res = await instance.post(GET_ACCOUNT_ROLEAUTHLIST_API, { + SelectedRoleId, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAccountRoleAuthPageList = async () => { + const res = await instance.post(GET_ACCOUNT_ROLEAUTHPAGELIST_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postAccountRole = async ({ Id, Name, SaveCheckAuth }) => { + const res = await instance.post(POST_ACCOUNT_ROLE_API, { + Id, + Name, + SaveCheckAuth, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const delRole = async (Id) => { + const res = await instance.post(DELETE_ACCOUNT_ROLE_API, { + Id, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAccountOneUser = async (Id) => { + const res = await instance.post(GET_ACCOUNT_USER_API, { + Id, + }); + + res.data = { + Account: res.data?.account, + Name: res.data?.full_name, + Email: res.data?.email, + Phone: res.data?.phone, + RoleId: res.data?.role_guid, + Id, + }; + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postAccountUser = async ({ + Id, + Account, + Name, + Email, + Phone, + RoleId, + Password, +}) => { + const res = await instance.post( + POST_ACCOUNT_USER_API, + Id + ? { + Id: Id, + Account, + Name, + Email, + Phone, + RoleId, + } + : { + Id: "0", + Account, + Name, + Email, + Phone, + RoleId, + Password, + } + ); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const changePassword = async ({ Id, Password }) => { + const res = await instance.post(POST_ACCOUNT_USER_API, { + Id, + Password, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const delAccount = async (Id) => { + const res = await instance.post(DELETE_ACCOUNT_USER_API, { + Id, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; diff --git a/src/apis/alert/api.js b/src/apis/alert/api.js new file mode 100644 index 0000000..f8f2bab --- /dev/null +++ b/src/apis/alert/api.js @@ -0,0 +1,27 @@ +export const POST_ACK_API = `/obix/alarm`; +export const GET_ALERT_FORMID_API = `/Alert/AlertList`; +export const GET_ALERT_LOG_API = `api/Alarm/GetAlarmLog`; +export const GET_ALERT_LOG_LIST_API = `api/Alarm/GetAlarmLogList`; +export const POST_OPERATION_RECORD_API = `/operation/SavOpeRecord`; + +export const GET_ALERT_SUB_LIST_API = `api/Device/GetMainSub`; + +export const GET_ALERT_MEMBER_LIST_API = `api/Alarm/GetAlarmMemberList`; +export const GET_ALERT_MEMBER = `api/Alarm/GetAlarmMember`; +export const POST_ALERT_MEMBER = `api/Alarm/SaveAlarmMember`; +export const DELETE_ALERT_MEMBER = `api/Alarm/DeleteAlarmMember`; +export const GET_NOTICE_LIST_API = `api/Alarm/GetNotice`; +export const GET_SHOW_ALERT_API = `api/Alarm/GetShowAlarm`; // 取得告警顯示清單 + +export const GET_OUTLIERS_LIST_API = `api/Alarm/GetAlarmSetting`; +export const GET_OUTLIERS_DEVLIST_API = `api/Alarm/GetDevList`; // 取得設備 +export const GET_OUTLIERS_POINTS_API = `api/Alarm/GetAlarmPoints`; // 取得點位 +export const POST_OUTLIERS_SETTING_API = `api/Alarm/SaveAlarmSetting`; // 新增與修改 +export const DELETE_OUTLIERS_SETTING_API = `api/Alarm/DeleteAlarmSetting`; // 刪除 +export const GET_FACTOR_API = `api/Alarm/GetFactor`; // 刪除 + +export const GET_ALERT_SCHEDULE_LIST_API = `api/Alarm/GetAlarmSchedule`; +export const POST_ALERT_SCHEDULE = `api/Alarm/SaveAlarmSchedule`; +export const DELETE_ALERT_SCHEDULE = `api/Alarm/DeleteAlarmSchedule`; + +export const POST_ALERT_MQTT_REFRESH = `api/Alarm/MQTTRefresh`; \ No newline at end of file diff --git a/src/apis/alert/index.js b/src/apis/alert/index.js new file mode 100644 index 0000000..d2f19e3 --- /dev/null +++ b/src/apis/alert/index.js @@ -0,0 +1,238 @@ +import { + POST_ACK_API, + GET_ALERT_FORMID_API, + GET_ALERT_LOG_API, + GET_ALERT_LOG_LIST_API, + POST_OPERATION_RECORD_API, + GET_ALERT_SUB_LIST_API, + GET_OUTLIERS_LIST_API, + GET_OUTLIERS_DEVLIST_API, + GET_OUTLIERS_POINTS_API, + POST_OUTLIERS_SETTING_API, + DELETE_OUTLIERS_SETTING_API, + GET_FACTOR_API, + GET_ALERT_MEMBER_LIST_API, + GET_ALERT_MEMBER, + POST_ALERT_MEMBER, + DELETE_ALERT_MEMBER, + GET_NOTICE_LIST_API, + GET_SHOW_ALERT_API, + GET_ALERT_SCHEDULE_LIST_API, + POST_ALERT_SCHEDULE, + DELETE_ALERT_SCHEDULE, + POST_ALERT_MQTT_REFRESH, +} from "./api"; +import instance from "@/util/request"; +import apihandler from "@/util/apihandler"; + +export const getAlertFormId = async (uuid) => { + const res = await instance.post(GET_ALERT_FORMID_API, uuid); + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAlertLog = async ({ + Start_date, + End_date, + isRecovery, + device_name_tag, +}) => { + const res = await instance.post(GET_ALERT_LOG_API, { + Start_date, + End_date, + isRecovery, + device_name_tag, + }); + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAlertLogList = async (building_guid) => { + const res = await instance.post(GET_ALERT_LOG_LIST_API, { + building_guid, + }); + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postOperationRecord = async (formData) => { + const res = await instance.post(POST_OPERATION_RECORD_API, formData); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAlertSubList = async (building_guid) => { + const res = await instance.post(GET_ALERT_SUB_LIST_API, { + building_guid, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAlarmMemberList = async () => { + const res = await instance.post(GET_ALERT_MEMBER_LIST_API, {}); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getNoticeList = async (lang) => { + const res = await instance.post(GET_NOTICE_LIST_API, { lang }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postAlertMember = async (data) => { + const res = await instance.post(POST_ALERT_MEMBER, data); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const deleteAlarmMember = async (id) => { + try { + const res = await instance.post(DELETE_ALERT_MEMBER, { id }); + console.log("Delete Alarm Member Response:", res); + return { + isSuccess: res.code === "0000", + msg: res.msg || "刪除成功", + }; + } catch (error) { + console.error("API request failed", error); + return { isSuccess: false, msg: "API request failed" }; + } +}; + +export const getAlarmMember = async (data) => { + try { + const res = await instance.post(GET_ALERT_MEMBER, data); + return res.data; + } catch (error) { + console.error("API request failed", error); + return { isSuccess: false, msg: "API request failed" }; + } +}; + +export const getOutliersList = async (id) => { + const res = await instance.post(GET_OUTLIERS_LIST_API, id); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getOutliersDevList = async (id) => { + const res = await instance.post(GET_OUTLIERS_DEVLIST_API, id); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getOutliersPoints = async (id) => { + const res = await instance.post(GET_OUTLIERS_POINTS_API, id); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getFactors = async () => { + const res = await instance.post(GET_FACTOR_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postOutliersSetting = async (data) => { + const res = await instance.post(POST_OUTLIERS_SETTING_API, data); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const delOutliersSetting = async (Id) => { + const res = await instance.post(DELETE_OUTLIERS_SETTING_API, { + Id, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getShowAlarm = async () => { + const res = await instance.post(GET_SHOW_ALERT_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAlarmScheduleList = async () => { + const res = await instance.post(GET_ALERT_SCHEDULE_LIST_API, {}); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postAlertSchedule = async (data) => { + const res = await instance.post(POST_ALERT_SCHEDULE, data); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const deleteAlarmSchedule = async (id) => { + try { + const res = await instance.post(DELETE_ALERT_SCHEDULE, { id }); + return { + isSuccess: res.code === "0000", + msg: res.msg || "刪除成功", + }; + } catch (error) { + console.error("API request failed", error); + return { isSuccess: false, msg: "API request failed" }; + } +}; + +export const postMQTTRefresh = async () => { + const res = await instance.post(POST_ALERT_MQTT_REFRESH); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; diff --git a/src/apis/asset/api.js b/src/apis/asset/api.js new file mode 100644 index 0000000..94f08e1 --- /dev/null +++ b/src/apis/asset/api.js @@ -0,0 +1,37 @@ +export const GET_ASSET_MAIN_LIST_API = `/AssetManage/GetAssetMainList`; +export const DELETE_ASSET_MAIN_LIST_API = `/AssetManage/DeleteAssetMain`; +export const POST_ASSET_MAIN_LIST_API = `/AssetManage/SaveAssetMain`; + +export const GET_ASSET_SUB_LIST_API = `/AssetManage/GetAssetSubList`; +export const POST_ASSET_SUB_LIST_API = `/AssetManage/SaveAssetSub`; +export const DELETE_ASSET_SUB_LIST_API = `/AssetManage/DeleteAssetSub`; + +export const GET_ASSET_LIST_API = `/AssetManage/GetAssetList`; +export const GET_ASSET_SINGLE_API = `/AssetManage/GetAsset`; +export const POST_ASSET_SINGLE_API = `/AssetManage/SaveAsset`; +export const DELETE_ASSET_ITEM_API = `/AssetManage/DeleteAsset`; + +export const GET_ASSET_FLOOR_LIST_API = `/AssetManage/GetFloorList`; + +export const POST_ASSET_FLOOR_API = `/AssetManage/SaveFloor`; +export const DELETE_ASSET_FLOOR_API = `/AssetManage/DeleteFloor`; + +export const GET_ASSET_IOT_LIST_API = `/AssetManage/GetIOTList`; +export const GET_ASSET_SUB_POINT_API = `/AssetManage/GetSubPoint`; + +export const GET_ASSET_IOT_SCHEMA_API = `/AssetManage/GetResponseSchema`; +export const POST_ASSET_IOT_SCHEMA_API = `/AssetManage/SaveResponseSchema`; + +export const GET_ASSET_DEVICE_ITEM_API = `/AssetManage/GetDeviceItem`; +export const POST_ASSET_DEVICE_ITEM_API = `/AssetManage/SaveDeviceItem`; +export const DELETE_ASSET_DEVICE_ITEM_API = `/AssetManage/DeleteDeviceItem`; + +export const GET_ASSET_DEPARTMENT_API = `/AssetManage/GetDepartment`; +export const POST_ASSET_DEPARTMENT_API = `/AssetManage/SaveDepartment`; +export const DELETE_ASSET_DEPARTMENT_API = `/AssetManage/DeleteDepartment`; + +export const GET_ASSET_ELECTYPE_API = `/AssetManage/GetElecType`; +export const POST_ASSET_ELECTYPE_API = `/AssetManage/SaveElecType`; +export const DELETE_ASSET_ELECTYPE_API = `/AssetManage/DeleteElecType`; + +export const POST_ASSET_ELEC_SETTING_API = `/AssetManage/SaveAssetSetting`; \ No newline at end of file diff --git a/src/apis/asset/index.js b/src/apis/asset/index.js new file mode 100644 index 0000000..e124482 --- /dev/null +++ b/src/apis/asset/index.js @@ -0,0 +1,337 @@ +import { + GET_ASSET_MAIN_LIST_API, + DELETE_ASSET_MAIN_LIST_API, + POST_ASSET_MAIN_LIST_API, + GET_ASSET_SUB_LIST_API, + DELETE_ASSET_SUB_LIST_API, + POST_ASSET_SUB_LIST_API, + GET_ASSET_LIST_API, + GET_ASSET_SINGLE_API, + GET_ASSET_FLOOR_LIST_API, + POST_ASSET_FLOOR_API, + DELETE_ASSET_FLOOR_API, + GET_ASSET_IOT_LIST_API, + DELETE_ASSET_ITEM_API, + POST_ASSET_SINGLE_API, + GET_ASSET_SUB_POINT_API, + GET_ASSET_IOT_SCHEMA_API, + POST_ASSET_IOT_SCHEMA_API, + GET_ASSET_DEVICE_ITEM_API, + POST_ASSET_DEVICE_ITEM_API, + DELETE_ASSET_DEVICE_ITEM_API, + GET_ASSET_DEPARTMENT_API, + POST_ASSET_DEPARTMENT_API, + DELETE_ASSET_DEPARTMENT_API, + GET_ASSET_ELECTYPE_API, + POST_ASSET_ELECTYPE_API, + DELETE_ASSET_ELECTYPE_API, + POST_ASSET_ELEC_SETTING_API, +} from "./api"; +import instance from "@/util/request"; +import apihandler from "@/util/apihandler"; +import { object } from "yup"; + +export const getAssetMainList = async (building_guid) => { + const res = await instance.post(GET_ASSET_MAIN_LIST_API,{building_guid}); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const deleteAssetMainItem = async (id) => { + const res = await instance.post(DELETE_ASSET_MAIN_LIST_API, { id }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postAssetMainList = async ({ id, system_key, system_value, building_guid }) => { + const res = await instance.post(POST_ASSET_MAIN_LIST_API, { + id, + system_key, + system_value, + building_guid + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAssetSubList = async (id) => { + const res = await instance.post(GET_ASSET_SUB_LIST_API, { id }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postAssetSubList = async (formData) => { + const res = await instance.post(POST_ASSET_SUB_LIST_API, formData); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const deleteAssetSubItem = async (id) => { + const res = await instance.post(DELETE_ASSET_SUB_LIST_API, { id }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAssetList = async (variable_id) => { + const res = await instance.post(GET_ASSET_LIST_API, { + variable_id: parseInt(variable_id), + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAssetSingle = async (main_id) => { + const res = await instance.post(GET_ASSET_SINGLE_API, { main_id }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postAssetSingle = async (data) => { + let formData = new FormData(); + + for (let [key, value] of Object.entries(data)) { + console.log(key, value); + if (Array.isArray(value)) { + if (key === "oriFile") { + value.forEach((element, index) => { + formData.append(`${key}[${index}].file`, element.id ? null : element); + formData.append(`${key}[${index}].orgName`, element.name); + formData.append( + `${key}[${index}].saveName`, + element.id ? element.saveName : "" + ); + }); + } else { + value.forEach((element, index) => { + formData.append( + `sub_device[${index}].device_number`, + element.device_number + ); + formData.append(`sub_device[${index}].points`, element.points); + }); + } + } else { + formData.append(key, value); + } + } + + const res = await instance.post(POST_ASSET_SINGLE_API, formData); + return apihandler(res.code, res.data, { msg: res.msg, code: res.code }); +}; + +export const deleteAssetItem = async (main_id) => { + const res = await instance.post(DELETE_ASSET_ITEM_API, { main_id }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAssetFloorList = async (building_guid) => { + const res = await instance.post(GET_ASSET_FLOOR_LIST_API, { building_guid }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postAssetFloor = async (formData) => { + const res = await instance.post(POST_ASSET_FLOOR_API, formData); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const deleteAssetFloor = async (formData) => { + const res = await instance.post(DELETE_ASSET_FLOOR_API, formData); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAssetIOTList = async (sub_system_tag, points) => { + const res = await instance.post(GET_ASSET_IOT_LIST_API, { + sub_system_tag, + points, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAssetSubPoint = async (sub_system_tag) => { + const res = await instance.post(GET_ASSET_SUB_POINT_API, { + sub_system_tag, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getIOTSchema = async (variable_id) => { + const res = await instance.post(GET_ASSET_IOT_SCHEMA_API, { variable_id }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postIOTSchema = async ({ name, variable_id, points }) => { + const res = await instance.post(POST_ASSET_IOT_SCHEMA_API, { + name, + variable_id, + points, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getDeviceItem = async (variable_id) => { + const res = await instance.post(GET_ASSET_DEVICE_ITEM_API, { variable_id }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postDeviceItem = async ({ + id, + variable_id, + full_name, + points, + decimals, + is_bool, + is_link, +}) => { + const res = await instance.post(POST_ASSET_DEVICE_ITEM_API, { + id, + variable_id, + full_name, + points, + decimals, + is_bool, + is_link, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const deleteDeviceItem = async (id) => { + const res = await instance.post(DELETE_ASSET_DEVICE_ITEM_API, { id }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getDepartmentList = async () => { + const res = await instance.post(GET_ASSET_DEPARTMENT_API, {}); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postDepartmentList = async ({ name, id }) => { + const res = await instance.post(POST_ASSET_DEPARTMENT_API, { + name, + id, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const deleteDepartmentItem = async (id) => { + const res = await instance.post(DELETE_ASSET_DEPARTMENT_API, { id }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getElecTypeList = async () => { + const res = await instance.post(GET_ASSET_ELECTYPE_API, {}); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postElecTypeList = async ({ name, id }) => { + const res = await instance.post(POST_ASSET_ELECTYPE_API, { + name, + id, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const deleteElecTypeItem = async (id) => { + const res = await instance.post(DELETE_ASSET_ELECTYPE_API, { id }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postAssetElecSetting = async (formData) => { + const res = await instance.post(POST_ASSET_ELEC_SETTING_API, formData); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; diff --git a/src/apis/building/api.js b/src/apis/building/api.js new file mode 100644 index 0000000..b71612b --- /dev/null +++ b/src/apis/building/api.js @@ -0,0 +1,6 @@ +export const GET_BUILDING_API = `/AssetManage/GetBuildingList`; +export const POST_BUILDING_API = `/AssetManage/SaveBuilding`; +export const DELETE_BUILDING_API = `/AssetManage/DeleteBuilding`; +export const GET_AUTHPAGE_API = `/api/GetUsrFroList`; +export const GET_SUBAUTHPAGE_API = `/api/Device/GetMainSub`; +export const GET_ALL_DEVICE_API = `/api/Device/GetAllDevice`; diff --git a/src/apis/building/index.js b/src/apis/building/index.js new file mode 100644 index 0000000..0c3579e --- /dev/null +++ b/src/apis/building/index.js @@ -0,0 +1,90 @@ +import { + GET_BUILDING_API, + POST_BUILDING_API, + DELETE_BUILDING_API, + GET_AUTHPAGE_API, + GET_SUBAUTHPAGE_API, + GET_ALL_DEVICE_API, +} from "./api"; +import instance from "@/util/request"; +import apihandler from "@/util/apihandler"; + +export const getBuildings = async () => { + const res = await instance.post(GET_BUILDING_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postBuildings = async ({ full_name, building_guid }) => { + const res = await instance.post(POST_BUILDING_API, { + full_name, + building_guid, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const deleteBuildings = async (building_guid) => { + const res = await instance.post(DELETE_BUILDING_API, { building_guid }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAuth = async (lang) => { + const res = await instance.post(GET_AUTHPAGE_API, { + lang, + }); + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAllSysSidebar = async (building_guid) => { + const res = await instance.post(GET_SUBAUTHPAGE_API, {building_guid}); + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getSysSidebar = async (building_tag) => { + const res = await instance.post(GET_SUBAUTHPAGE_API, { + building_tag, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAllDevice = async () => { + const res = await instance.post(GET_ALL_DEVICE_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const ackSingleAlarm = async (uuid) => { + const res = await instance.post( + `/obix/alarm/${uuid}/ack`, + '' + ); + console.log("acked", res); + return apihandler(res.code, res, { + msg: res.msg, + code: res.code, + }); +}; diff --git a/src/apis/dashboard/api.js b/src/apis/dashboard/api.js new file mode 100644 index 0000000..1d914f6 --- /dev/null +++ b/src/apis/dashboard/api.js @@ -0,0 +1,13 @@ +export const GET_DASHBOARD_INIT_API = `/SituationRoom/Initialize`; +export const GET_DASHBOARD_DEVICE_API = `/SituationRoom/GetDeviceList`; +export const GET_DASHBOARD_PRODUCT_COMPLETE_API = `/SituationRoom/GetProductionStatus`; +export const GET_DASHBOARD_TEMP_API = `/SituationRoom/GetTempratureData`; +export const GET_DASHBOARD_ROOM_TEMP_API = `/SituationRoom/GetFormulaRoomStatusData`; +export const GET_DASHBOARD_ENERGY_API = `/SituationRoom/GetEnergeData`; +export const POST_DASHBOARD_PRODUCT_TARGET_SETTING_API = `/SituationRoom/SetTargetSetting`; +export const GET_DASHBOARD_PRODUCT_TARGET_SETTING_API = `/SituationRoom/GetTargetSetting` +export const GET_DASHBOARD_PRODUCT_HISTORY_API = `/SituationRoom/GetProductionHistory` + +export const GET_DASHBOARD_ENERGY_INFO_API = `api/dashboard/GetEnergyInfo` +export const GET_DASHBOARD_ENERGY_COST_API = `api/dashboard/GetEnergyCost` +export const GET_DASHBOARD_ALARMOPERATION_INFO_API = `api/dashboard/GetAlarmOperationInfo` \ No newline at end of file diff --git a/src/apis/dashboard/index.js b/src/apis/dashboard/index.js new file mode 100644 index 0000000..b6bc297 --- /dev/null +++ b/src/apis/dashboard/index.js @@ -0,0 +1,175 @@ +import { + GET_DASHBOARD_INIT_API, + GET_DASHBOARD_DEVICE_API, + GET_DASHBOARD_PRODUCT_COMPLETE_API, + GET_DASHBOARD_TEMP_API, + GET_DASHBOARD_ROOM_TEMP_API, + GET_DASHBOARD_ENERGY_API, + POST_DASHBOARD_PRODUCT_TARGET_SETTING_API, + GET_DASHBOARD_PRODUCT_TARGET_SETTING_API, + GET_DASHBOARD_PRODUCT_HISTORY_API, + GET_DASHBOARD_ENERGY_INFO_API, + GET_DASHBOARD_ENERGY_COST_API, + GET_DASHBOARD_ALARMOPERATION_INFO_API, +} from "./api"; +import instance from "@/util/request"; +import apihandler from "@/util/apihandler"; + +export const getDashboardInit = async (page_type = "SR") => { + const res = await instance.post(GET_DASHBOARD_INIT_API, { + page_type, // SR:戰情室;PS:生產設定 + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getDashboardDevice = async ({ option }) => { + const res = await instance.post(GET_DASHBOARD_DEVICE_API, { + option: parseInt(option), + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getDashboardProductCompletion = async () => { + const res = await instance.post(GET_DASHBOARD_PRODUCT_COMPLETE_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getDashboardEnergy = async () => { + const res = await instance.post(GET_DASHBOARD_ENERGY_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getDashboardFormulaRoom = async ({ timeInterval, typeOption }) => { + const res = await instance.post(GET_DASHBOARD_ROOM_TEMP_API, { + timeInterval, + typeOption, + }); + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getDashboardTemp = async ({ + timeInterval, + tempOption, + building_guid, + option +}) => { + const res = await instance.post(GET_DASHBOARD_TEMP_API, { + timeInterval, + tempOption, + building_guid, + option + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postDashboardProductTarget = async ({ date, type, data }) => { + let formatData = []; + + for (let [key, value] of Object.entries(data)) { + formatData.push({ + name: key, + value, + }); + } + + const res = await instance.post(POST_DASHBOARD_PRODUCT_TARGET_SETTING_API, { + target: { + date, + type, + data: formatData, + }, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getDashboardProductTarget = async ({ date, type }) => { + const res = await instance.post(GET_DASHBOARD_PRODUCT_TARGET_SETTING_API, { + target: { + date, + type, + }, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getDashboardProductRecord = async ({ start_time, end_time }) => { + const res = await instance.post(GET_DASHBOARD_PRODUCT_HISTORY_API, { + start_time, + end_time, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getEnergyInfo = async (building_guid) => { + const res = await instance.post(GET_DASHBOARD_ENERGY_INFO_API, { + building_guid, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getEnergyCost = async ({ + department_id, + floor_guid, + building_guid, +}) => { + const res = await instance.post(GET_DASHBOARD_ENERGY_COST_API, { + department_id, + floor_guid, + building_guid, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAlarmOperationInfo = async (building_guid) => { + const res = await instance.post(GET_DASHBOARD_ALARMOPERATION_INFO_API, { + building_guid, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; diff --git a/src/apis/energy/api.js b/src/apis/energy/api.js new file mode 100644 index 0000000..3f7cd70 --- /dev/null +++ b/src/apis/energy/api.js @@ -0,0 +1,27 @@ +export const GET_REALTIME_DATA_API = `/api/Energe/GetRealTimeData`; +export const GET_ELEC_MONTH_API = `/api/Energe/GetElecUseMonth`; +export const GET_ELEC_DAY_API = `/api/Energe/GetElecUseDay`; + +export const GET_REALTIME_DIST_API = `/api/Energe/GetRealTimeDistribution`; +export const GET_ELECUSE_DAY_API = `/api/Energe/GetElecUseDay`; +export const GET_TAI_POWER_API = `/api/Energe/GetTaipower`; + +export const GET_SIDEBAR_API = `/api/GetSideBar`; +export const GET_SEARCH_API = `/api/Energe/GetFilter`; + +export const GET_REPORT_API = `/api/Energe/GetReport`; +export const GET_Excel_API = `/api/Energe/GetReportExcel`; + +// 即時需量 +export const GET_DEMAND_API = `/api/Energe/SearchDemandValue`; +export const POST_ADD_DEMAND_API = `/api/Energe/AddDemandValue`; +export const POST_EDIT_DEMAND_API = `/api/Energe/UpdateDemandValue`; +export const GET_REALTIME_DEMAND_API = `/api/Energe/GetRealTimeDemand`; + +// 碳排係數 +export const GET_CARBON_API = `/api/Energe/SearchCarbonValue`; +export const POST_EDIT_CARBON_API = `/api/Energe/UpdateCarbonValue`; + +// 時間電價 +export const GET_TIME_ELEC_API = `/api/Energe/SearchTimeElec`; +export const POST_TIME_ELEC_API = `/api/Energe/UpdateTimeElecValue`; \ No newline at end of file diff --git a/src/apis/energy/index.js b/src/apis/energy/index.js new file mode 100644 index 0000000..b739a40 --- /dev/null +++ b/src/apis/energy/index.js @@ -0,0 +1,262 @@ +import { + GET_REALTIME_DATA_API, + GET_ELEC_MONTH_API, + GET_ELEC_DAY_API, + GET_REALTIME_DIST_API, + GET_ELECUSE_DAY_API, + GET_TAI_POWER_API, + GET_SIDEBAR_API, + GET_SEARCH_API, + GET_REPORT_API, + GET_Excel_API, + GET_DEMAND_API, + POST_EDIT_DEMAND_API, + GET_REALTIME_DEMAND_API, + GET_CARBON_API, + POST_EDIT_CARBON_API, + GET_TIME_ELEC_API, + POST_TIME_ELEC_API, +} from "./api"; +import instance, { fileInstance } from "@/util/request"; +import apihandler from "@/util/apihandler"; +import downloadExcel from "@/util/downloadExcel"; + +export const getRealTimeData = async () => { + const res = await instance.post(GET_REALTIME_DATA_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getElecUseMonth = async () => { + const res = await instance.post(GET_ELEC_MONTH_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getElecUseofDay = async () => { + const res = await instance.post(GET_ELEC_DAY_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getRealTimeDist = async ({ + building_guid, + department_id_list, + floor_guid_list, +}) => { + const res = await instance.post(GET_REALTIME_DIST_API, { + building_guid, + department_id_list, + floor_guid_list, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getElecUseDay = async ({ + building_guid, + department_id_list, + floor_guid_list, +}) => { + const res = await instance.post(GET_ELECUSE_DAY_API,{ + building_guid, + department_id_list, + floor_guid_list, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getTaipower = async ({ + coefficient, + building_guid, + department_id_list, + floor_guid_list, +}) => { + const res = await instance.post(GET_TAI_POWER_API, { + coefficient, + building_guid, + department_id_list, + floor_guid_list, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getSideBar = async (system_type) => { + const res = await instance.post(GET_SIDEBAR_API, { system_type }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getEnergySearch = async (type) => { + const res = await instance.post(GET_SEARCH_API, { type }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getReport = async ({ + department, + elecType, + floor, + start_time, + end_time, + type, +}) => { + const res = await instance.post(GET_REPORT_API, { + department, + elecType, + floor, + start_time, + end_time, + type, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getExcel = async ({ + department, + elecType, + floor, + start_time, + end_time, + type, +}) => { + const res = await fileInstance.post( + GET_Excel_API, + { + department, + elecType, + floor, + start_time, + end_time, + type, + }, + { responseType: "blob" } + ); + + return apihandler( + res.code, + res, + { + msg: res.msg, + code: res.code, + }, + downloadExcel + ); +}; + +export const getDemand = async (building_guid) => { + const res = await instance.post(GET_DEMAND_API, { building_guid }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postEditDemand = async ({ + id, + contract, + alert, + reset, + building_guid, +}) => { + const res = await instance.put(POST_EDIT_DEMAND_API, { + id, + contract, + alert, + reset, + building_guid, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getCarbonValue = async (building_guid) => { + const res = await instance.post(GET_CARBON_API, { building_guid }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postEditCarbonValue = async ({ + id, + coefficient, + building_guid, +}) => { + const res = await instance.put(POST_EDIT_CARBON_API, { + id, + coefficient, + building_guid, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getRealTimeDemand = async (building_guid) => { + const res = await instance.post(GET_REALTIME_DEMAND_API, { building_guid }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getTimeElec = async (building_guid) => { + const res = await instance.post(GET_TIME_ELEC_API, { building_guid }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postTimeElec = async ({ sheet, cost, building_guid }) => { + const res = await instance.put(POST_TIME_ELEC_API, { + sheet, + cost, + building_guid, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; diff --git a/src/apis/forge/api.js b/src/apis/forge/api.js new file mode 100644 index 0000000..fa01175 --- /dev/null +++ b/src/apis/forge/api.js @@ -0,0 +1,3 @@ +export const GET_FORGETOKEN_API = `/api/forge/oauth/token`; + +export const GET_FORGEURN_API = `/api/Device/GetBuild`; diff --git a/src/apis/forge/index.js b/src/apis/forge/index.js new file mode 100644 index 0000000..d13d4bb --- /dev/null +++ b/src/apis/forge/index.js @@ -0,0 +1,24 @@ +import instance from "@/util/request"; +import { GET_FORGETOKEN_API, GET_FORGEURN_API } from "./api"; +import apihandler from "@/util/apihandler"; + +export const getUrn = async () => { + const res = await instance.post(GET_FORGEURN_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAccessToken = async (callback) => { + try { + const resp = await instance.get(GET_FORGETOKEN_API); + console.log(resp) + const { dictionary } = resp; + callback(dictionary.access_token, dictionary.expires_in); + } catch (err) { + alert("Could not obtain access token. See the console for more details."); + console.error(err); + } +}; diff --git a/src/apis/graph/api.js b/src/apis/graph/api.js new file mode 100644 index 0000000..427ae7c --- /dev/null +++ b/src/apis/graph/api.js @@ -0,0 +1,16 @@ +// graph +const BASEURL = import.meta.env.VITE_API_BASEURL; +export const GET_GRAPH_SIDEBAR_API = `/GraphManage/GraphManageTreeList`; + +export const UPDATE_GRAPH_SIDEBAR_API = `/GraphManage/EditGraphManageTree`; +export const REMOVE_GRAPH_SIDEBAR_API = `/GraphManage/DelGraphManageTree`; +export const POST_GRAPH_SIDEBAR_API = `/GraphManage/SaveGraphManageTree`; + +export const GET_GRAPH_PARAM_OPTION_API = `/GraphManage/GraManSpecList`; + +export const GET_GRAPH_TABLE_API = `/GraphManage/GraManList`; +export const POST_GRAPH_TABLE_API = `/GraphManage/SaveGraMan`; +export const POST_GRAPH_TABLE_API_2 = `/GraphManage/SaveGraMan`; // 原先沒有小類及規格的 +export const UPDATE_GRAPH_TABLE_API = `/GraphManage/EdtOneGraMan`; + +export const DELETE_GRAPH_TABLE_API = `/GraphManage/DelOneGraMan`; diff --git a/src/apis/graph/index.js b/src/apis/graph/index.js new file mode 100644 index 0000000..de9be1f --- /dev/null +++ b/src/apis/graph/index.js @@ -0,0 +1,122 @@ +import { + GET_GRAPH_SIDEBAR_API, + UPDATE_GRAPH_SIDEBAR_API, + REMOVE_GRAPH_SIDEBAR_API, + POST_GRAPH_SIDEBAR_API, + GET_GRAPH_TABLE_API, + GET_GRAPH_PARAM_OPTION_API, + POST_GRAPH_TABLE_API, + DELETE_GRAPH_TABLE_API, + POST_GRAPH_TABLE_API_2, + UPDATE_GRAPH_TABLE_API +} from "./api"; +import instance from "@/util/request"; +import apihandler from "@/util/apiHandler"; + +export const getSideBar = async () => { + const res = await instance.post(GET_GRAPH_SIDEBAR_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const addSideBarTreeName = async ({ parent_id, name }) => { + const res = await instance.post(POST_GRAPH_SIDEBAR_API, { parent_id, name }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const updateSideBarTreeName = async ({ id, name }) => { + const res = await instance.post(UPDATE_GRAPH_SIDEBAR_API, { id, name }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const removeSideBarTreeName = async (id) => { + const res = await instance.post(REMOVE_GRAPH_SIDEBAR_API, { id }); + + return apihandler( + res.code, + { isSuccess: true }, + { + msg: res.msg, + code: res.code, + isSuccess: false, + } + ); +}; + +// 中間 table +export const getGraphData = async (id) => { + const res = await instance.post(GET_GRAPH_TABLE_API, { layer_id: id }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + isSuccess: false, + }); +}; + +export const getGraphAddParamOption = async () => { + const res = await instance.post(GET_GRAPH_PARAM_OPTION_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + isSuccess: false, + }); +}; + +export const addGraphTableData = async (formData) => { + const res = await instance.post(POST_GRAPH_TABLE_API, formData); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + isSuccess: false, + }); +}; + +export const delGraphData = async (id, hard_delete = false, recover_delete = false) => { + const res = await instance.post(DELETE_GRAPH_TABLE_API, { id, hard_delete, recover_delete }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + isSuccess: false, + }); +}; + + +export const addGraphTableDataWithoutSubSys = async (formData) => { + const res = await instance.post(POST_GRAPH_TABLE_API_2, formData); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + isSuccess: false, + }); +}; + +export const editGraphTableDataWithoutSubSys = async (formData) => { + const res = await instance.post(UPDATE_GRAPH_TABLE_API, formData); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + isSuccess: false, + }); +}; + + + + + diff --git a/src/apis/history/api.js b/src/apis/history/api.js new file mode 100644 index 0000000..64de717 --- /dev/null +++ b/src/apis/history/api.js @@ -0,0 +1,11 @@ +// history +const BASEURL = import.meta.env.VITE_API_BASEURL; +export const GET_HISTORY_SIDEBAR_API = `/api/History/GetDeviceInfo`; +export const GET_HISTORY_POINT_API = `/api/History/GetAllDevPoi`; +export const GET_HISTORY_DATA_API = `/api/History/GetHistoryData`; +export const GET_HISTORY_EXPORT_API = `/api/ExportHistoryExcel`; + +export const GET_HISTORY_FAVORITE_API = `/api/History/GetHistoryFavorite`; +export const POST_HISTORY_FAVORITE_API = `/api/History/SaveHistoryFavorite`; +export const DELETE_HISTORY_FAVORITE_API = `/api/History/DeleteHistoryFavorite`; +export const UPDATE_HISTORY_FAVORITE_API = `/api/History/EditHistoryFavorite`; diff --git a/src/apis/history/index.js b/src/apis/history/index.js new file mode 100644 index 0000000..c393159 --- /dev/null +++ b/src/apis/history/index.js @@ -0,0 +1,177 @@ +import { + GET_HISTORY_SIDEBAR_API, + GET_HISTORY_POINT_API, + GET_HISTORY_DATA_API, + GET_HISTORY_FAVORITE_API, + POST_HISTORY_FAVORITE_API, + DELETE_HISTORY_FAVORITE_API, + UPDATE_HISTORY_FAVORITE_API, + GET_HISTORY_EXPORT_API, +} from "./api"; +import instance, { fileInstance } from "@/util/request"; +import apihandler from "@/util/apiHandler"; +import downloadExcel from "@/util/downloadExcel"; + +export const getHistorySideBar = async ({ + sub_system_tag, + department_id, + elec_type_id, + building_guid, +}) => { + const res = await instance.post(GET_HISTORY_SIDEBAR_API, { + sub_system_tag, + department_id, + elec_type_id, + building_guid, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getHistoryPoints = async (Device_list) => { + const res = await instance.post(GET_HISTORY_POINT_API, { + Device_list, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getHistoryData = async ({ + Type, + Start_date, + End_date, + Start_time, + End_time, + Device_list, + Points, + table_type, +}) => { + /* + { + Type, + Start_date, + End_date, + Start_time, + End_time, + Device_list, + Points, + } + */ + const res = await instance.post(GET_HISTORY_DATA_API, { + Start_date, + End_date, + Start_time, + End_time, + Device_list: Array.isArray(Device_list) ? Device_list : [Device_list], + Points: Array.isArray(Points) ? Points : [Points], + Type: parseInt(Type), + table_type: parseInt(table_type), + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getHistoryExportData = async ({ + Type, + Start_date, + End_date, + Start_time, + End_time, + Device_list, + Points, +}) => { + /* + { + Type, + Start_date, + End_date, + Start_time, + End_time, + Device_list, + Points, + } + */ + const res = await fileInstance.post( + GET_HISTORY_EXPORT_API, + { + // ...exportContent, + Start_date: Start_date, + End_date: End_date, + Start_time: Start_time, + End_time: End_time, + Points: Array.isArray(Points) ? Points : [Points], + Device_list: Array.isArray(Device_list) ? Device_list : [Device_list], + Type: parseInt(Type), + Building_tag_list: [...new Set(Device_list.map((d) => d.split("_")[1]))], + }, + { responseType: "blob" } + ); + + return apihandler( + res.code, + res, + { + msg: res.msg, + code: res.code, + }, + downloadExcel + ); +}; + +export const getHistoryFavorite = async () => { + const res = await instance.post(GET_HISTORY_FAVORITE_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const addHistoryFavorite = async (value) => { + const res = await instance.post(POST_HISTORY_FAVORITE_API, { + device_name_tag: value.sub_system_tag, + Device_list: Array.isArray(value.Device_list) + ? value.Device_list + : [value.Device_list], + Points: Array.isArray(value.Points) ? value.Points : [value.Points], + favorite_name: value.favorite_name, + Type: parseInt(value.Type), + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const deleteHistoryFavorite = async (favorite_guid) => { + const res = await instance.post(DELETE_HISTORY_FAVORITE_API, { + favorite_guid, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const editHistoryFavorite = async ({ favorite_guid, favorite_name }) => { + const res = await instance.post(UPDATE_HISTORY_FAVORITE_API, { + favorite_guid, + favorite_name, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; diff --git a/src/apis/login/api.js b/src/apis/login/api.js new file mode 100644 index 0000000..f145d28 --- /dev/null +++ b/src/apis/login/api.js @@ -0,0 +1 @@ +export const POST_LOGIN = `/api/LoginV2/`; diff --git a/src/apis/login/index.js b/src/apis/login/index.js new file mode 100644 index 0000000..2bb6498 --- /dev/null +++ b/src/apis/login/index.js @@ -0,0 +1,27 @@ +import { POST_LOGIN } from "./api"; +import instance from "@/util/request"; +import apihandler from "@/util/apihandler"; + +export async function Login({ account, password }) { + const res = await instance.post(POST_LOGIN, { + account, + password, + }); + + if (res.code === "0000") { + console.log(res.data); + document.cookie = `JWT-Authorization=${res.data.token}; Max-Age=${ + 24 * 60 * 60 * 1000 + }`; + // 設定 user_name Cookie + document.cookie = `user_name=${res.data.user_name}; Max-Age=${ + 24 * 60 * 60 * 1000 + }`; + } + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + isSuccess: false, + }); +} diff --git a/src/apis/operation/api.js b/src/apis/operation/api.js new file mode 100644 index 0000000..ae51f10 --- /dev/null +++ b/src/apis/operation/api.js @@ -0,0 +1,16 @@ +export const GET_OPERATION_RECORD_API = `/operation/OpeRecList`; +export const GET_OPERATION_EXPORT_API = `/operation/OpeExportExcel`; +export const GET_OPERATION_DEVICELIST_API = `/operation/DevList`; +export const GET_OPERATION_COMPANYLIST_API = `/operation/OpeFirSel`; + +export const GET_SINGLE_OPERATION_RECORD_API = `/operation/OpeRecRead`; +export const GET_OPERATION_FORMID_API = `/operation/GetFormId`; // 新增單號前置 +export const POST_OPERATION_RECORD_API = `/operation/SavOpeRecord`; +export const DELETE_OPERATION_RECORD_API = `/operation/DelOpeRecord`; + +// 廠商 +export const GET_OPERATION_COMPANY_API = `/operation/OpeFirList`; // 廠商列表 +export const GET_OPERATION_SINGLE_CONPANY_API = `/operation/OpeFirRead`; // 單一廠商 +export const POST_OPERATION_COMPANY_API = `/operation/SaveOpeFirm`; +export const UPDATE_OPERATION_COMPANY_API = `/operation/EdtOneOpeFirm`; +export const DELETE_OPERATION_COMPANY_API = `/operation/DelOpeFirm`; diff --git a/src/apis/operation/index.js b/src/apis/operation/index.js new file mode 100644 index 0000000..c7c9d1b --- /dev/null +++ b/src/apis/operation/index.js @@ -0,0 +1,190 @@ +import { + GET_OPERATION_RECORD_API, + GET_OPERATION_COMPANY_API, + GET_SINGLE_OPERATION_RECORD_API, + GET_OPERATION_DEVICELIST_API, + POST_OPERATION_RECORD_API, + GET_OPERATION_EXPORT_API, + GET_OPERATION_FORMID_API, + DELETE_OPERATION_RECORD_API, + POST_OPERATION_COMPANY_API, + UPDATE_OPERATION_COMPANY_API, + DELETE_OPERATION_COMPANY_API, +} from "./api"; +import instance from "@/util/request"; +import apihandler from "@/util/apihandler"; +import dayjs from "dayjs"; + +export const getOperationRecord = async ({ + work_type, + start_created_at, + end_created_at, + serial_number, + sub_system_tag, +}) => { + const res = await instance.post(GET_OPERATION_RECORD_API, { + work_type: parseInt(work_type), + // start_created_at: dayjs(start_created_at).format("YYYY-MM-DDTHH:mm:ss"), + // end_created_at: dayjs(end_created_at) + // .date(dayjs(end_created_at).get("date") + 1) + // .format("YYYY-MM-DDTHH:mm:ss"), + serial_number: serial_number || null, + main_system_tag: null, + sub_system_tag: + typeof sub_system_tag === "string" ? [sub_system_tag] : sub_system_tag, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getOperationExportRecord = async ({ + work_type, + start_created_at, + end_created_at, +}) => { + const res = await instance.post(GET_OPERATION_EXPORT_API, { + work_type: parseInt(work_type), + startdate: dayjs(start_created_at).format("YYYY-MM-DDTHH:mm:ss"), + enddate: dayjs(end_created_at) + .date(dayjs(end_created_at).get("date") + 1) + .format("YYYY-MM-DDTHH:mm:ss"), + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getOperationCompanyList = async () => { + const res = await instance.post(GET_OPERATION_COMPANY_API, { + sub_system_tag: [], + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getOperationDeviceList = async ({ + list_sub_system_tag, + device_building_tag, + device_area_tag, +}) => { + const res = await instance.post(GET_OPERATION_DEVICELIST_API, { + list_sub_system_tag: + typeof list_sub_system_tag === "string" + ? [list_sub_system_tag] + : list_sub_system_tag, + device_building_tag, + device_area_tag, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getOperationEditRecord = async (formId) => { + const res = await instance.post(GET_SINGLE_OPERATION_RECORD_API, { + formId, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postOperationRecord = async (formData) => { + const res = await instance.post(POST_OPERATION_RECORD_API, formData); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getOperationFormId = async () => { + const res = await instance.post(GET_OPERATION_FORMID_API, {}); + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const deleteOperationRecord = async (id) => { + const res = await instance.post(DELETE_OPERATION_RECORD_API, { id }); + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +// 公司 +export const postOperationCompany = async ({ + name, + contact_person, + phone, + email, + city, + address, + tax_id_number, + remark, +}) => { + const res = await instance.post(POST_OPERATION_COMPANY_API, { + name, + contact_person, + phone, + email, + city, + address, + tax_id_number, + remark, + }); + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const updateOperationCompany = async ({ + name, + contact_person, + phone, + email, + city, + address, + tax_id_number, + remark, + id, +}) => { + const res = await instance.post(UPDATE_OPERATION_COMPANY_API, { + id, + name, + contact_person, + phone, + email, + city, + address, + tax_id_number, + remark, + }); + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const deleteOperationCompany = async (id) => { + const res = await instance.post(DELETE_OPERATION_COMPANY_API, { id }); + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; diff --git a/src/apis/productSetting/api.js b/src/apis/productSetting/api.js new file mode 100644 index 0000000..d19a40d --- /dev/null +++ b/src/apis/productSetting/api.js @@ -0,0 +1,4 @@ +export const POST_SETTING_POINT_API = `/SituationRoom/SetPointSetting`; + +export const GET_SETTING_TYPE_API = `/SituationRoom/GetProducts`; +export const POST_SETTING_TYPE_API = `/SituationRoom/SetProduct`; diff --git a/src/apis/productSetting/index.js b/src/apis/productSetting/index.js new file mode 100644 index 0000000..1ed4d46 --- /dev/null +++ b/src/apis/productSetting/index.js @@ -0,0 +1,45 @@ +import instance from "@/util/request"; +import apihandler from "@/util/apihandler"; +import { + POST_SETTING_POINT_API, + GET_SETTING_TYPE_API, + POST_SETTING_TYPE_API, +} from "./api"; + +export const postProductSettingPoint = async (type, devices) => { + const res = await instance.post(POST_SETTING_POINT_API, { + devices: devices.map(({ device_number }) => device_number), + values: [ + { + point: "Type", + value: type.value, + }, + ], + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + isSuccess: false, + }); +}; + +export const getProductSettingType = async () => { + const res = await instance.post(GET_SETTING_TYPE_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + isSuccess: false, + }); +}; + +export const postProductSettingType = async (data) => { + const res = await instance.post(POST_SETTING_TYPE_API, data); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + isSuccess: false, + }); +}; diff --git a/src/apis/system/api.js b/src/apis/system/api.js new file mode 100644 index 0000000..4f79543 --- /dev/null +++ b/src/apis/system/api.js @@ -0,0 +1,9 @@ +export const GET_SYSTEM_FLOOR_LIST_API = `/api/Device/GetFloor`; +export const GET_SYSTEM_DEVICE_LIST_API = `/api/Device/GetDeviceList`; +export const GET_SYSTEM_REALTIME_API = `/api/Device/GetRealTimeData`; + +export const GET_SYSTEM_CONFIG_API = `/api/GetSystemConfig`; + +export const POST_MQTT_TOPIC_API = `api/Device/MQTTTopicTest`; +export const POST_MQTT_TOPIC_STOP_API = `api/Device/MQTTTopicTestStop`; + diff --git a/src/apis/system/index.js b/src/apis/system/index.js new file mode 100644 index 0000000..9756bdc --- /dev/null +++ b/src/apis/system/index.js @@ -0,0 +1,67 @@ +import { + GET_SYSTEM_FLOOR_LIST_API, + GET_SYSTEM_DEVICE_LIST_API, + GET_SYSTEM_REALTIME_API, + GET_SYSTEM_CONFIG_API, + POST_MQTT_TOPIC_API, + POST_MQTT_TOPIC_STOP_API, +} from "./api"; +import instance from "@/util/request"; +import apihandler from "@/util/apihandler"; + +export const getSystemFloors = async (building_tag, sub_system_tag) => { + const res = await instance.post(GET_SYSTEM_FLOOR_LIST_API, { + building_tag, + sub_system_tag, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getSystemDevices = async ({ building_guid }) => { + const res = await instance.post(GET_SYSTEM_DEVICE_LIST_API, { + building_guid, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getSystemRealTime = async (device_list) => { + const res = await instance.post(GET_SYSTEM_REALTIME_API, { device_list }); + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getSystemConfig = async (building_guid) => { + const res = await instance.post(GET_SYSTEM_CONFIG_API, { building_guid }); + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postMqttTopic = async ({ iotTag, Topic }) => { + const res = await instance.post(POST_MQTT_TOPIC_API, { iotTag, Topic }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postMqttTopicStop = async ({ iotTag, Topic }) => { + const res = await instance.post(POST_MQTT_TOPIC_STOP_API, { iotTag, Topic }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; diff --git a/src/assets/base.css b/src/assets/base.css new file mode 100644 index 0000000..09140d1 --- /dev/null +++ b/src/assets/base.css @@ -0,0 +1,89 @@ +/* color palette from */ +:root { + --primary: #6fdda8; + --vt-c-white: #ffffff; + --vt-c-white-soft: #f8f8f8; + --vt-c-white-mute: #f2f2f2; + + --vt-c-black: #181818; + --vt-c-black-soft: #222222; + --vt-c-black-mute: #282828; + + --vt-c-indigo: #2c3e50; + + --vt-c-divider-light-1: rgba(60, 60, 60, 0.29); + --vt-c-divider-light-2: rgba(60, 60, 60, 0.12); + --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65); + --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48); + + --vt-c-text-light-1: var(--vt-c-indigo); + --vt-c-text-light-2: rgba(60, 60, 60, 0.66); + --vt-c-text-dark-1: var(--vt-c-white); + --vt-c-text-dark-2: rgba(235, 235, 235, 0.64); +} + +/* semantic color variables for this project */ +:root { + --color-background: var(--vt-c-white); + --color-background-soft: var(--vt-c-white-soft); + --color-background-mute: var(--vt-c-white-mute); + + --color-border: var(--vt-c-divider-light-2); + --color-border-hover: var(--vt-c-divider-light-1); + + --color-heading: var(--vt-c-text-light-1); + --color-text: var(--vt-c-text-dark-1); + + --section-gap: 160px; + +} + +@media (prefers-color-scheme: dark) { + :root { + --color-background: var(--vt-c-black); + --color-background-soft: var(--vt-c-black-soft); + --color-background-mute: var(--vt-c-black-mute); + + --color-border: var(--vt-c-divider-dark-2); + --color-border-hover: var(--vt-c-divider-dark-1); + + --color-heading: var(--vt-c-text-dark-1); + --color-text: var(--vt-c-text-dark-2); + } +} + +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + font-weight: normal; +} + +body { + min-height: 100vh; + color: var(--color-text); + background: var(--color-background); + transition: + color 0.5s, + background-color 0.5s; + line-height: 1.6; + font-family: + Inter, + -apple-system, + BlinkMacSystemFont, + 'Segoe UI', + Roboto, + Oxygen, + Ubuntu, + Cantarell, + 'Fira Sans', + 'Droid Sans', + 'Helvetica Neue', + sans-serif; + font-size: 15px; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} diff --git a/src/assets/btn.css b/src/assets/btn.css new file mode 100644 index 0000000..9071e94 --- /dev/null +++ b/src/assets/btn.css @@ -0,0 +1,56 @@ +/**區域框**/ +.area-box { + /* width: 100%; */ + border-radius: 10px; + display: flex; + align-items: center; + flex-wrap: wrap; + color: #fff; +} + +.area-box .item { + display: flex; + align-items: center; + flex-wrap: wrap; + color: #fff; + margin: 0; +} + +.area-box .item button:last-child::after { + display: none; +} + +.area-box .item button::after { + content: ""; + position: absolute; + top: 0; + bottom: 0; + right: -15px; + margin: auto; + display: block; + width: 15px; + height: 1px; + background-color: #a1ffd6; + z-index: -1; +} + +.area-box .item button { + position: relative; + z-index: 1; + border-radius: 5px; + margin: 0 7px; + background-color: #021422; + padding: 0.5rem 0; + min-width: 65px; + color: #fff; + border: 1px solid #a1ffd6 !important; + text-align: center; + margin-bottom: 15px; + padding: 0 5px; +} + +.area-box .item button.active { + background-color: #6fdda8; + text-shadow: 0px 0px 5px rgba(0, 0, 0, 0.9); + box-shadow: 0px 0px 5px rgba(255, 255, 255, 0.8); +} diff --git a/src/assets/img/area-img-box-line-bottom.png b/src/assets/img/area-img-box-line-bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..021264a1850a5092f020dec74f1d959c969e832c GIT binary patch literal 524 zcmV+n0`vWeP)4==a7I%@H(WIrc1;!z4W&l^h6KR~p^#cK+M28m{Z&I_1a)Fi{=VOalZGJL3eM-X zJkRGDzVN`qheuMa?WPD0BO;bfjDb)hz{@W$Ie?x3}6+tNnLHQ8A!>N(JG)Tvxqs&f> z6C+T9sEXw79+LfiOy$m^DCypPr1$n?;v1%tnHgdr5|pzjW`;wUe)5=^M-O>XxJ>WR zReqGdAjwp_tx2Znxme)-zzLR0i*)VjCUYi-i6XvXDw+ZETW0x8Oc@&<;^p*HsuH#A zzjhtjdHA^P$mf|lm*-PBPeE3zaw=TOR@A@lELMRNj?8Y1w%ILA*pZJiRmf4f2e O0000aRKbtMByW(?+~d&J!QBST z`ibA)Vv|V$Eo)?AD^Qd{^Zm^ zKi_A+A_s;C944!Gy^%We2F{7%s01REhrnE&3=ZX*f5m@&fh=|d6cjqJHR-(D4X zd;cy9QW^6Ihf$-(w!VJWcW!5{QbNRmC}A3bB)s>3&H$Jv*0!42iDwjU-Ne<5-_sbR UQ~l6l?EnA(07*qoM6N<$f-H{ne*gdg literal 0 HcmV?d00001 diff --git a/src/assets/img/background.jpg b/src/assets/img/background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..873a2f9adf39276d98a53bea5174c59b86af5cc6 GIT binary patch literal 95918 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 H`p|y> \ No newline at end of file diff --git a/src/assets/img/chart-data-background02.svg b/src/assets/img/chart-data-background02.svg new file mode 100644 index 0000000..4ccfade --- /dev/null +++ b/src/assets/img/chart-data-background02.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/img/chart-data-background03.svg b/src/assets/img/chart-data-background03.svg new file mode 100644 index 0000000..32d1f69 --- /dev/null +++ b/src/assets/img/chart-data-background03.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/img/chart-title01.svg b/src/assets/img/chart-title01.svg new file mode 100644 index 0000000..8421061 --- /dev/null +++ b/src/assets/img/chart-title01.svg @@ -0,0 +1,21 @@ + + + + + + + + + + diff --git a/src/assets/img/chart-title02.svg b/src/assets/img/chart-title02.svg new file mode 100644 index 0000000..b49dea2 --- /dev/null +++ b/src/assets/img/chart-title02.svg @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/src/assets/img/chart-title03.svg b/src/assets/img/chart-title03.svg new file mode 100644 index 0000000..b935ccf --- /dev/null +++ b/src/assets/img/chart-title03.svg @@ -0,0 +1,21 @@ + + + + + + + + + + diff --git a/src/assets/img/chart-title04.svg b/src/assets/img/chart-title04.svg new file mode 100644 index 0000000..afa5774 --- /dev/null +++ b/src/assets/img/chart-title04.svg @@ -0,0 +1,21 @@ + + + + + + + + + + diff --git a/src/assets/img/equipment-item-background.svg b/src/assets/img/equipment-item-background.svg new file mode 100644 index 0000000..69359bd --- /dev/null +++ b/src/assets/img/equipment-item-background.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/equipment-item-background04.svg b/src/assets/img/equipment-item-background04.svg new file mode 100644 index 0000000..64b7d0d --- /dev/null +++ b/src/assets/img/equipment-item-background04.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/img/equipment-item-background05.svg b/src/assets/img/equipment-item-background05.svg new file mode 100644 index 0000000..67e6cbc --- /dev/null +++ b/src/assets/img/equipment-item-background05.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/img/equipment/replay01.svg b/src/assets/img/equipment/replay01.svg new file mode 100644 index 0000000..639e6eb --- /dev/null +++ b/src/assets/img/equipment/replay01.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/img/equipment/replay02.svg b/src/assets/img/equipment/replay02.svg new file mode 100644 index 0000000..62e067b --- /dev/null +++ b/src/assets/img/equipment/replay02.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/img/equipment/state-background.svg b/src/assets/img/equipment/state-background.svg new file mode 100644 index 0000000..8334698 --- /dev/null +++ b/src/assets/img/equipment/state-background.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/img/equipment/state-title.svg b/src/assets/img/equipment/state-title.svg new file mode 100644 index 0000000..6202385 --- /dev/null +++ b/src/assets/img/equipment/state-title.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/img/equipment/table-item-w.svg b/src/assets/img/equipment/table-item-w.svg new file mode 100644 index 0000000..74bbc0c --- /dev/null +++ b/src/assets/img/equipment/table-item-w.svg @@ -0,0 +1,7 @@ + + + + + + diff --git a/src/assets/img/item-data-left-2.svg b/src/assets/img/item-data-left-2.svg new file mode 100644 index 0000000..33018f6 --- /dev/null +++ b/src/assets/img/item-data-left-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/img/item-data-left.svg b/src/assets/img/item-data-left.svg new file mode 100644 index 0000000..24d1b55 --- /dev/null +++ b/src/assets/img/item-data-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/img/item-data-right-2.svg b/src/assets/img/item-data-right-2.svg new file mode 100644 index 0000000..9025333 --- /dev/null +++ b/src/assets/img/item-data-right-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/img/item-data-right.svg b/src/assets/img/item-data-right.svg new file mode 100644 index 0000000..927beac --- /dev/null +++ b/src/assets/img/item-data-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/img/logo.png b/src/assets/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..08837f4bc897a9f0a6142e1ae5ec6daa7f0c850f GIT binary patch literal 40610 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

3uqxq*90f4u@u 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 r3d9<=)MWFl7+^ \ No newline at end of file diff --git a/src/assets/img/pagination/small-btn.svg b/src/assets/img/pagination/small-btn.svg new file mode 100644 index 0000000..4aab060 --- /dev/null +++ b/src/assets/img/pagination/small-btn.svg @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/src/assets/img/pagination/small-btn02.svg b/src/assets/img/pagination/small-btn02.svg new file mode 100644 index 0000000..131fed5 --- /dev/null +++ b/src/assets/img/pagination/small-btn02.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/src/assets/img/state-box-bottom.png b/src/assets/img/state-box-bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..cf28ba95f542f6f99ce26054fefe2bcb56d6959c GIT binary patch literal 722 zcmV;@0xkWCP)b7a9xzCXop8&7{(fh2hI;31LVAUNMi7>&o#nuI8JoNOaL z5#wdxDtQH7%2t=V4BnM_7W_J={;m16Iu84iCUe`N{vJ>3k3 zBYgevo;>5=Ns7akLkA(LdEMWK7-(qpvw8bAcj1cT%HEF5f&pb2&n>_0gNx*LMH!P> zFsTY-j7h6DB7)YM`+fa{LLpw<2~gMBN$~m&Mu$Skk)F$@vgrU%E?z)8LR0f$>U<3t z$(*o-*$9>~7u?pbY>=ufGsTm_w^)?G&D(q#3Q@kbhT7H^2CnoXT?5Ze@Y*e=#>d&? z_tAQ)orD6*5#pa0%wl{HH(2WU3@{vtaOq43lhGJeJ|ETl8gaZa-5VVpp}Mw)<6UPF zrNAT+oawNZ+yCB-nHH!BA__#%0>uSI)a>5Hvqz5!zk5r3Yyziz?YiEI^_w_-{v7#v z`50qRI7`38ma%9Mk>74j%78{wQd&y!s$yO}4KnueGaheY5$)X_cnenm21gmR<-oKs z$niDGHEcOp>P^E2clk8}9ucMl>ivGA(Mj$F?&4`ac9h{rn2|^X4bw_9h-=a0`WBFD z{>auxMO9TL6&pA31Gq-~-ApbbL;wH)07*qoM6N<$ Ef?2#yNB{r; literal 0 HcmV?d00001 diff --git a/src/assets/img/state-box-top.png b/src/assets/img/state-box-top.png new file mode 100644 index 0000000000000000000000000000000000000000..0d78c949d880b03dc5c419213e5c82032b145af5 GIT binary patch literal 713 zcmV;)0yh1LP)&%9d+LP_~i21P-U6qR8i7)GZg=-9DC zfgU=B)FnxX4yApZtkiqhv8 zxy-!tpZ_z@Gc(WgN`1>?Q@D8}f`-OMAV7EW@xG`qh z*K_p=#u$wFfI=C~!@KthbhJI9rtUI1xp{~flxVb3i#BBbNUy`)VRNWWzjH)6!hL@O z2r&U=44qG&68zeSiblq`b>$k-NEiTL3$i4>lz+Ur>d!RX>=z?UX@jTXZC4lVP0awP z>~#eU_J84aT|GV;r35WgOKsgUG6-YLpC?X45D|O@9v;Dg0ooex5f??_fqi(#Z#LEr zzyHWc@H?ZS5XB`W_)1yNNT$z!rtgpcN}o(O;P+Ez5MU%U%%$pcM8XqnEib3&SOtOp z&S&heKEt~UHFUpv$?BZ7l$IaFh_(t|M*6T68Ip+1N^}zw>B;Z}O*a~djsIlBj$Lf8 zIKu0TwFH81y2;AVWA~|(e7Muhi}p7B$uYL=EOHd%InB2tbwGn_;_k+8t70V0iK4Mo zxrsrNSS^VNT5CF5S{WMbCuhqh_MWb!=jwH0;RsT8sKUfWQCw9?Y&^`T)(5P}T19R_ zzN28L>GR-E?NHbCZDq5)thL<%_OjOvsn<{BpSfvf5RFC&4gFwc_8Q90pQX2 \ No newline at end of file diff --git a/src/assets/img/state-title02.svg b/src/assets/img/state-title02.svg new file mode 100644 index 0000000..93ae18b --- /dev/null +++ b/src/assets/img/state-title02.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/img/state-ul-background01.svg b/src/assets/img/state-ul-background01.svg new file mode 100644 index 0000000..717aee9 --- /dev/null +++ b/src/assets/img/state-ul-background01.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/img/state-ul-background02.svg b/src/assets/img/state-ul-background02.svg new file mode 100644 index 0000000..b2fbadb --- /dev/null +++ b/src/assets/img/state-ul-background02.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/img/state-ul-text.svg b/src/assets/img/state-ul-text.svg new file mode 100644 index 0000000..74a702b --- /dev/null +++ b/src/assets/img/state-ul-text.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/img/state-ul.svg b/src/assets/img/state-ul.svg new file mode 100644 index 0000000..302c130 --- /dev/null +++ b/src/assets/img/state-ul.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/table/content-box-background01.svg b/src/assets/img/table/content-box-background01.svg new file mode 100644 index 0000000..ac04bca --- /dev/null +++ b/src/assets/img/table/content-box-background01.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/table/content-box-background02.svg b/src/assets/img/table/content-box-background02.svg new file mode 100644 index 0000000..634a8e7 --- /dev/null +++ b/src/assets/img/table/content-box-background02.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/table/content-box-background03.svg b/src/assets/img/table/content-box-background03.svg new file mode 100644 index 0000000..325068e --- /dev/null +++ b/src/assets/img/table/content-box-background03.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/table/content-box-background04.svg b/src/assets/img/table/content-box-background04.svg new file mode 100644 index 0000000..3034171 --- /dev/null +++ b/src/assets/img/table/content-box-background04.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/table/content-box-background05.svg b/src/assets/img/table/content-box-background05.svg new file mode 100644 index 0000000..a99f849 --- /dev/null +++ b/src/assets/img/table/content-box-background05.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/table/large-btn.svg b/src/assets/img/table/large-btn.svg new file mode 100644 index 0000000..60f7df9 --- /dev/null +++ b/src/assets/img/table/large-btn.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + diff --git a/src/assets/img/table/large-btn02.svg b/src/assets/img/table/large-btn02.svg new file mode 100644 index 0000000..4ac0476 --- /dev/null +++ b/src/assets/img/table/large-btn02.svg @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/src/assets/img/table/small-btn.svg b/src/assets/img/table/small-btn.svg new file mode 100644 index 0000000..4aab060 --- /dev/null +++ b/src/assets/img/table/small-btn.svg @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/src/assets/img/table/small-btn02.svg b/src/assets/img/table/small-btn02.svg new file mode 100644 index 0000000..131fed5 --- /dev/null +++ b/src/assets/img/table/small-btn02.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/src/assets/img/text-position-line.svg b/src/assets/img/text-position-line.svg new file mode 100644 index 0000000..cec0432 --- /dev/null +++ b/src/assets/img/text-position-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/index.css b/src/assets/index.css new file mode 100644 index 0000000..eda00dd --- /dev/null +++ b/src/assets/index.css @@ -0,0 +1,81 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer components { + .arrow { + @apply relative triangle flex justify-center items-center text-lg; + box-shadow: inset 0px 6px 10px -10px rgba(255, 255, 255, 0.8), + inset 0px -6px 10px -10px rgba(255, 255, 255, 0.8); + } + + .triangle { + @apply after:block after:absolute after:bottom-0 after:left-[100%] + after:border-t-[1rem] after:border-b-[1rem] after:border-l-[2rem] + after:border-t-transparent after:border-b-transparent after:z-50; + } + .triangle-dark { + @apply after:border-l-info; + } + + .triangle-light { + @apply after:border-l-success; + } + .item button { + @apply hover:bg-active !important; + } + /* table */ + .content-box-background { + background: linear-gradient( + 180deg, + rgba(127, 237, 193, 0.1), + rgba(0, 0, 0, 0), + rgba(127, 237, 193, 0.1) + ); + } +} + +@layer utilities { + .btn{ + @apply whitespace-nowrap px-4 py-1; + text-shadow: 0px 0px 5px rgba(0, 0, 0, 0.9); + box-shadow: 0px 0px 5px rgba(255, 255, 255, 0.8); + } + + .btn-success { + @apply text-white border border-active bg-active hover:bg-[theme("colors.green.500")] + } + + .btn-info { + @apply text-white border border-info bg-info hover:bg-[theme("colors.sky.400")] + } + + .btn-outline-success { + @apply text-white border border-active hover:bg-active bg-transparent + } + + .btn-outline-info { + @apply text-white border border-info hover:bg-info bg-transparent + } + + .custom-border { + @apply border border-info rounded-md; + } + + .btn-text-without-border { + @apply active:border-0 focus:border-0 focus-visible:border-0 active:outline-none focus:outline-none focus-visible:outline-none; + } + + .btn-add { + @apply text-white border border-cyan-400 bg-cyan-400 hover:bg-[theme("colors.cyan.500")] + } + + .btn-search { + @apply text-white border border-sky-400 bg-sky-400 hover:bg-[theme("colors.sky.500")] + } + + .btn-export { + @apply text-white border border-emerald-400 bg-emerald-400 hover:bg-[theme("colors.emerald.500")] + } + +} \ No newline at end of file diff --git a/src/assets/logo.svg b/src/assets/logo.svg new file mode 100644 index 0000000..b6cd190 --- /dev/null +++ b/src/assets/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/main.css b/src/assets/main.css new file mode 100644 index 0000000..563f00d --- /dev/null +++ b/src/assets/main.css @@ -0,0 +1,29 @@ +@import "./base.css"; + +#app { + overflow: hidden; + font-weight: normal; + background-color: theme("colors.body"); + background-image: url("./img/background.jpg"); + background-size: cover; + color: #fff; + min-height: 100dvh; +} + +::-webkit-scrollbar { + width: 5px !important; + height: 8px !important; +} + +/* Track */ +::-webkit-scrollbar-track { + box-shadow: inset 0 0 5px grey; + border-radius: 10px; +} + +/* Handle */ +::-webkit-scrollbar-thumb { + background: theme("colors.info"); + border-radius: 10px; + box-shadow: theme("boxShadow.custom"); +} diff --git a/src/assets/pagination.css b/src/assets/pagination.css new file mode 100644 index 0000000..e5369ab --- /dev/null +++ b/src/assets/pagination.css @@ -0,0 +1,40 @@ +.page-box ul { + display: flex; + justify-content: flex-end; + flex-wrap: wrap; + font-size: 1rem; + color: #fff; + margin-bottom: 10px; +} + +.page-box ul li { + padding: 10px; + white-space: nowrap; + cursor: pointer; +} + + +.page-box ul .ant-pagination-item { + background-image: url(./img/pagination/small-btn.svg); + background-repeat: no-repeat; + background-position: center; + background-size: contain; + padding: 10px 15px 10px 25px; + background-color: transparent; + display: flex; + justify-content: center; + align-items: center; + border: none; +} + +.page-box ul .ant-pagination-item.ant-pagination-item-active { + background-image: url(./img/pagination/small-btn02.svg); + background-repeat: no-repeat; + background-position: center; + background-size: contain; + padding: 10px 15px 10px 25px; +} + +.page-box .ant-pagination-item a { + color: #fff; +} diff --git a/src/assets/table.css b/src/assets/table.css new file mode 100644 index 0000000..30adf55 --- /dev/null +++ b/src/assets/table.css @@ -0,0 +1,122 @@ +/**資料框**/ +.ant-table { + width: 100%; + margin-bottom: 1rem; + background-color: transparent !important; + color: white; +} +.ant-table::-webkit-scrollbar-thumb { + background-color: theme("colors.info") !important; +} + +.ant-table th.ant-table-cell::before{ + height: 100% !important; +} + +.content-box { + border: 1px solid #35eded; + padding: 5px; + position: relative; + margin-bottom: 15px; + background-color: theme("colors.body"); +} + +.content-box table, +.content-box table th { + border-radius: 0 !important; +} + +.content-box .ant-table th.ant-table-cell, +.content-box .ant-table td.ant-table-cell { + border-color: #fff !important; + color: #fff !important; + font-size: 1rem !important; + font-weight: 300 !important; + border-right: 1px solid #fff !important; + text-align: center !important; + padding: 0.5rem 0.75rem !important; + background-color: transparent !important; +} + +.content-box .ant-table th.ant-table-cell.ant-table-cell-fix-left, +.content-box .ant-table th.ant-table-cell.ant-table-cell-fix-right { + background-color: theme("colors.body") !important; + color: white; +} + +.content-box .ant-table th.ant-table-cell { + border-bottom: 1px solid #e9e9e9 !important; +} + +.content-box .ant-table tr td:last-child, +.content-box .ant-table tr:first-child th:last-child { + border-right: 0 !important; +} +.content-box .ant-table tr:last-child td { + border-bottom: 0 !important; +} + +/**資料框裝飾**/ +.content-box::before { + content: "" !important; + background: url(./img/table/content-box-background01.svg) center center !important; + position: absolute !important; + left: 4px !important; + top: 4px !important; + height: 20px !important; + width: 20px !important; + background-repeat: no-repeat !important; + z-index: 1 !important; +} + +.content-box::after { + content: "" !important; + background: url(./img/table/content-box-background05.svg) center center !important; + position: absolute !important; + right: 4px !important; + bottom: 4px !important; + height: 20px !important; + width: 20px !important; + background-repeat: no-repeat !important; + z-index: 3 !important; +} + +.content-box .page-box::before { + content: "" !important; + background: url(./img/table/content-box-background03.svg) center center !important; + position: absolute !important; + left: -1.2% !important; + bottom: -2px !important; + height: 56px !important; + width: 30px !important; + background-repeat: no-repeat !important; + z-index: 2 !important; +} + +.content-box .page-box::after { + content: "" !important; + background: url(./img/table/content-box-background04.svg) center center !important; + position: absolute !important; + right: -27px !important; + bottom: -7px !important; + height: 65px !important; + width: 50px !important; + background-repeat: no-repeat !important; + z-index: 2 !important; +} + +.content-box .content-decoration { + @apply px-2; +} + +.content-box .content-decoration::before { + content: "" !important; + background: url(./img/table/content-box-background02.svg) center center !important; + position: absolute !important; + right: -10px !important; + top: -10px !important; + height: 30px !important; + width: 29px !important; + background-repeat: no-repeat !important; + z-index: 1 !important; +} diff --git a/src/components/Loading.vue b/src/components/Loading.vue new file mode 100644 index 0000000..6ad4f0d --- /dev/null +++ b/src/components/Loading.vue @@ -0,0 +1,32 @@ + + + + + diff --git a/src/components/SvgIcon.vue b/src/components/SvgIcon.vue new file mode 100644 index 0000000..ecf5446 --- /dev/null +++ b/src/components/SvgIcon.vue @@ -0,0 +1,44 @@ + + + + diff --git a/src/components/alarm/AlarmCards.vue b/src/components/alarm/AlarmCards.vue new file mode 100644 index 0000000..f675f44 --- /dev/null +++ b/src/components/alarm/AlarmCards.vue @@ -0,0 +1,87 @@ + + + + + \ No newline at end of file diff --git a/src/components/alarm/AlarmDrawer.vue b/src/components/alarm/AlarmDrawer.vue new file mode 100644 index 0000000..54438a9 --- /dev/null +++ b/src/components/alarm/AlarmDrawer.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/src/components/chart/BarChart.vue b/src/components/chart/BarChart.vue new file mode 100644 index 0000000..983732a --- /dev/null +++ b/src/components/chart/BarChart.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/src/components/chart/EffectScatter.vue b/src/components/chart/EffectScatter.vue new file mode 100644 index 0000000..9f122f1 --- /dev/null +++ b/src/components/chart/EffectScatter.vue @@ -0,0 +1,104 @@ + + + + diff --git a/src/components/chart/GaugeChart.vue b/src/components/chart/GaugeChart.vue new file mode 100644 index 0000000..da53127 --- /dev/null +++ b/src/components/chart/GaugeChart.vue @@ -0,0 +1,34 @@ + + + + diff --git a/src/components/chart/LineChart.vue b/src/components/chart/LineChart.vue new file mode 100644 index 0000000..da53127 --- /dev/null +++ b/src/components/chart/LineChart.vue @@ -0,0 +1,34 @@ + + + + diff --git a/src/components/chart/SankeyChart.vue b/src/components/chart/SankeyChart.vue new file mode 100644 index 0000000..557d51e --- /dev/null +++ b/src/components/chart/SankeyChart.vue @@ -0,0 +1,31 @@ + + + + diff --git a/src/components/customUI/ButtonConnectedGroup.vue b/src/components/customUI/ButtonConnectedGroup.vue new file mode 100644 index 0000000..67880cc --- /dev/null +++ b/src/components/customUI/ButtonConnectedGroup.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/src/components/customUI/ButtonGroup.vue b/src/components/customUI/ButtonGroup.vue new file mode 100644 index 0000000..5235a03 --- /dev/null +++ b/src/components/customUI/ButtonGroup.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/src/components/customUI/Checkbox.vue b/src/components/customUI/Checkbox.vue new file mode 100644 index 0000000..2f28bfc --- /dev/null +++ b/src/components/customUI/Checkbox.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/src/components/customUI/Collapse.vue b/src/components/customUI/Collapse.vue new file mode 100644 index 0000000..2b9a911 --- /dev/null +++ b/src/components/customUI/Collapse.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/src/components/customUI/DateGroup.vue b/src/components/customUI/DateGroup.vue new file mode 100644 index 0000000..91e2263 --- /dev/null +++ b/src/components/customUI/DateGroup.vue @@ -0,0 +1,123 @@ + + + + + + diff --git a/src/components/customUI/DraggableTable.vue b/src/components/customUI/DraggableTable.vue new file mode 100644 index 0000000..965bca2 --- /dev/null +++ b/src/components/customUI/DraggableTable.vue @@ -0,0 +1,436 @@ + + + + + diff --git a/src/components/customUI/Dropdown.vue b/src/components/customUI/Dropdown.vue new file mode 100644 index 0000000..78f5453 --- /dev/null +++ b/src/components/customUI/Dropdown.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/src/components/customUI/FileSystemCollapse.vue b/src/components/customUI/FileSystemCollapse.vue new file mode 100644 index 0000000..7b058b0 --- /dev/null +++ b/src/components/customUI/FileSystemCollapse.vue @@ -0,0 +1,189 @@ + + + + + diff --git a/src/components/customUI/Input.vue b/src/components/customUI/Input.vue new file mode 100644 index 0000000..885cbe2 --- /dev/null +++ b/src/components/customUI/Input.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/src/components/customUI/InputNumber.vue b/src/components/customUI/InputNumber.vue new file mode 100644 index 0000000..4bc9ea4 --- /dev/null +++ b/src/components/customUI/InputNumber.vue @@ -0,0 +1,92 @@ + + + + + diff --git a/src/components/customUI/Menu.vue b/src/components/customUI/Menu.vue new file mode 100644 index 0000000..054a6a3 --- /dev/null +++ b/src/components/customUI/Menu.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/src/components/customUI/Modal.vue b/src/components/customUI/Modal.vue new file mode 100644 index 0000000..aa2d5a7 --- /dev/null +++ b/src/components/customUI/Modal.vue @@ -0,0 +1,92 @@ + + + + + diff --git a/src/components/customUI/Pagination.vue b/src/components/customUI/Pagination.vue new file mode 100644 index 0000000..d95ed64 --- /dev/null +++ b/src/components/customUI/Pagination.vue @@ -0,0 +1,200 @@ + + + diff --git a/src/components/customUI/RadioGroup.vue b/src/components/customUI/RadioGroup.vue new file mode 100644 index 0000000..f0ed74a --- /dev/null +++ b/src/components/customUI/RadioGroup.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/src/components/customUI/SearchSelect.vue b/src/components/customUI/SearchSelect.vue new file mode 100644 index 0000000..ae493eb --- /dev/null +++ b/src/components/customUI/SearchSelect.vue @@ -0,0 +1,128 @@ + + + + + diff --git a/src/components/customUI/Select.vue b/src/components/customUI/Select.vue new file mode 100644 index 0000000..41166bc --- /dev/null +++ b/src/components/customUI/Select.vue @@ -0,0 +1,85 @@ + + + + + diff --git a/src/components/customUI/Table.vue b/src/components/customUI/Table.vue new file mode 100644 index 0000000..6914810 --- /dev/null +++ b/src/components/customUI/Table.vue @@ -0,0 +1,410 @@ + + + + + diff --git a/src/components/customUI/Textarea.vue b/src/components/customUI/Textarea.vue new file mode 100644 index 0000000..e14f010 --- /dev/null +++ b/src/components/customUI/Textarea.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/components/customUI/Toast.vue b/src/components/customUI/Toast.vue new file mode 100644 index 0000000..cf312e9 --- /dev/null +++ b/src/components/customUI/Toast.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/src/components/customUI/Upload.vue b/src/components/customUI/Upload.vue new file mode 100644 index 0000000..37ff0a8 --- /dev/null +++ b/src/components/customUI/Upload.vue @@ -0,0 +1,307 @@ + + + + + diff --git a/src/components/forge/Forge.vue b/src/components/forge/Forge.vue new file mode 100644 index 0000000..e55b62d --- /dev/null +++ b/src/components/forge/Forge.vue @@ -0,0 +1,117 @@ + + + + + diff --git a/src/components/forge/ForgeForSystem.vue b/src/components/forge/ForgeForSystem.vue new file mode 100644 index 0000000..4c9bb8a --- /dev/null +++ b/src/components/forge/ForgeForSystem.vue @@ -0,0 +1,282 @@ + + + + + diff --git a/src/components/forge/ForgeModal.vue b/src/components/forge/ForgeModal.vue new file mode 100644 index 0000000..df4a248 --- /dev/null +++ b/src/components/forge/ForgeModal.vue @@ -0,0 +1,160 @@ + + + + + diff --git a/src/components/forge/ForgeModalContent.vue b/src/components/forge/ForgeModalContent.vue new file mode 100644 index 0000000..b83816f --- /dev/null +++ b/src/components/forge/ForgeModalContent.vue @@ -0,0 +1,223 @@ + + + + + diff --git a/src/components/forge/index.vue b/src/components/forge/index.vue new file mode 100644 index 0000000..a9f0e80 --- /dev/null +++ b/src/components/forge/index.vue @@ -0,0 +1,270 @@ + + + + + diff --git a/src/components/navbar/Navbar.vue b/src/components/navbar/Navbar.vue new file mode 100644 index 0000000..4a0c8e7 --- /dev/null +++ b/src/components/navbar/Navbar.vue @@ -0,0 +1,168 @@ + + + + + diff --git a/src/components/navbar/NavbarBuilding.vue b/src/components/navbar/NavbarBuilding.vue new file mode 100644 index 0000000..05238ac --- /dev/null +++ b/src/components/navbar/NavbarBuilding.vue @@ -0,0 +1,43 @@ + + + + + \ No newline at end of file diff --git a/src/components/navbar/NavbarItem.vue b/src/components/navbar/NavbarItem.vue new file mode 100644 index 0000000..15e2d6c --- /dev/null +++ b/src/components/navbar/NavbarItem.vue @@ -0,0 +1,218 @@ + + + + diff --git a/src/components/navbar/NavbarLang.vue b/src/components/navbar/NavbarLang.vue new file mode 100644 index 0000000..bff9147 --- /dev/null +++ b/src/components/navbar/NavbarLang.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/src/components/navbar/NavbarUser.vue b/src/components/navbar/NavbarUser.vue new file mode 100644 index 0000000..5e31aeb --- /dev/null +++ b/src/components/navbar/NavbarUser.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/src/config/cn.json b/src/config/cn.json new file mode 100644 index 0000000..afae1a9 --- /dev/null +++ b/src/config/cn.json @@ -0,0 +1,422 @@ +{ + "language": "简体中文", + "home": "首页", + "sign_out": "登出", + "log_in": "登入", + "account": "帐号", + "password": "密码", + "table": { + "no_data": "表中数据为空", + "in_otal": "笔资料", + "skip_to": "跳至" + }, + "upload": { + "title": "选择一个文件或拖放到这里", + "description": "档案不超过 10MB", + "formats": "档案格式" + }, + "dashboard": { + "production_quantity": "生产量", + "today_production_rate": "今日生产完成率", + "yesterday_today": "昨天/今天", + "elec_consumption_comparison": "用电量比较", + "elec_consumption_comparison_trend": "用电量比较趋势", + "electricity_consumption": "用电量", + "today_electricity_consumption": "今日用电量", + "yesterday_electricity_consumption": "昨天用电量", + "this_last_week": "本周/上周", + "thisweek_electricity_consumption": "本周用电量", + "lastweek_electricity_consumption": "上周用电量", + "one_hour": "1小时", + "four_hour": "4小时", + "eight_hour": "8小时", + "energy_ranking": "能耗排行", + "last_30_days_energy_trend": "近30天能耗趋势", + "today_energy_consumption": "本日能耗", + "this_month_energy_consumption": "本月能耗", + "relative_energy_consumption": "环比能耗", + "daily_relative_change": "日环比", + "weekly_relative_change": "周环比", + "monthly_relative_change": "月环比", + "yearly_relative_change": "年环比", + "today": "今日", + "yesterday": "昨日", + "this_week": "本周", + "last_week": "上周", + "this_month": "本月", + "last_month": "上月", + "this_year": "今年", + "last_year": "去年", + "refrig_chart": "冷藏趨勢", + "indoor_chart": "室內", + "temperature": "温度", + "humidity": "湿度", + "no_data":"无数据", + "alerts_data": "异常资料" + }, + "history": { + "title": "历史资料", + "building_name": "厂区", + "device_name": "设备名称", + "system_category": "系统类别", + "device_category": "设备类别", + "category": "类别", + "value": "数值", + "date": "记录时间", + "point": "点位", + "combinations": "常用组合", + "date_range": "日期区间", + "time_range": "时间区间", + "start_date": "起始日期", + "start_time": "起始时间", + "end_date": "结束日期", + "end_time": "结束时间" + }, + "system": { + "status": "状态", + "details": "详细资料", + "attribute": "属性", + "value": "值" + }, + "energy": { + "elec_consumption": "用电即时分布", + "total_elec": "总用电", + "green_elec": "绿电", + "immediate_demand": "即时需量", + "average_demand": "平均需量", + "real_time_Trend": "即时趋势", + "contract_capacity": "契约容量", + "alert_capacity": "警戒容量", + "reset_value": "复归值", + "edit_automatic_demand": "编辑自动需量", + "elec_bills": "今年电费累计(元)", + "interval_elec_charges": "区间电费(元)", + "year_carbon_emission": "今年碳排当量累计(公斤)", + "interval_carbon_emission": "区间碳排当量", + "year_elec_consumption": "今年用电度数(kWh)", + "interval_elec_consumption": "区间用电度数(kWh)", + "monthly_elec_consumption": "每月用电分析", + "daily_carbon_emission_and_reduction": "每日碳排当量 (kgCO2e)", + "monthly_bill_power": "每月计费度数 (kWh)", + "interval_bill_degree": "区间计费度数", + "peak": "尖峰", + "semi_peak": "半尖峰", + "off_peak": "离峰", + "var_elec_cost": "流动电费", + "fixed_elec_cost": "基本电费", + "total_elec_cost": "总电费", + "carbon_equivalent": "碳排当量", + "edit_carbon_emission": "编辑碳排放系数", + "carbon_emission_coefficient": "碳排放系数", + "electricity_classification": "用电分类", + "electricity_price": "电费每度单价", + "floor": "楼层", + "maximum": "最大值", + "maximum_time": "最大值时间", + "minimum": "最小值", + "minimum_time": "最小值时间", + "average_value": "平均值", + "start_value": "起始值(kWh)", + "end_value": "截止值(kWh)", + "difference": "差值(kWh)", + "power_consumption": "用电量(kWh)", + "ranking": "排名", + "subtotal": "小计", + "unit_price": "单价", + "total_amount": "金额总计", + "elec_price_list": "电价表", + "residential": "住宅型", + "standard": "标准型", + "simple_elec_price_two_stage": "简易型时间电价二段式", + "simple_elec_price_three_stage": "简易型时间电价三段式", + "classification": "分类", + "summer_months": "夏月", + "non_summer_months": "非夏月", + "time_outside_summer_months": "夏月以外的时间", + "basic_elec_charge": "基本电费", + "charged_per_household": "按户计收", + "per_household_month": "每户每月", + "mon_to_friday": "周一~周五", + "peak_hours": "尖峰时间", + "semi_peak_hours": "半尖峰时间", + "off_peak_hours": "离峰时间", + "price_per_kwh": "每度", + "all_day": "全日", + "sat_sun_off_peak_days": "周六、周日及离峰日", + "usage_over_2000kwh": "每月总度数超过2000度之部分", + "add": "加", + "standard_time_of_use_tariff_2_stage": "标准型时间电价二段式", + "standard_time_of_use_tariff_3_stage": "标准型时间电价三段式", + "single_phase": "单相", + "three_phase": "三相", + "frequent_contract": "经常契约", + "per_kw_per_month": "每瓩每月", + "non_summer_contract": "非夏日契约", + "saturday_semi_peak_contract": "周六半尖峰契约", + "off_peak_contract": "离峰契约", + "variable_electricity_charge": "流动电费", + "saturday": "周六", + "sunday_and_off_peak_days": "周日及离峰日", + "latest_elec_consumption": "最新用电度数", + "daily_elec": "每日用电度数", + "line_voltage": "线电压", + "electric_current": "电流", + "monthly_elec_bill": "每月电费分析" + }, + "alarm": { + "title": "显示警告", + "notify": "异常通知", + "number": "异常ID", + "category": "异常类别", + "device_name": "设备名称", + "message": "异常讯息", + "confirm": "确认" + }, + "alert": { + "query_title": "告警纪录查询", + "setting_title": "告警设定", + "offnormal": "未复归", + "normal": "已复归", + "unacked": "未确认", + "acked": "已确认", + "30days": "近30天", + "start_date": "起始日期", + "end_date": "结束日期", + "building_and_floor": "栋别-楼层", + "uuid": "异常ID", + "alarmClass": "告警条件", + "device_name": "设备名称", + "device_number": "设备编号", + "device_point_name": "点位名称", + "date": "发生日期", + "time": "发生时间", + "error_msg": "异常原因", + "ack_state": "Ack 确认", + "repair_order_number": "派工 / 维运单号", + "repair_order": "维修单", + "form_number": "表单编号", + "start_time": "预计开始时间", + "item": "项目", + "maintainance": "保养", + "repair": "维修", + "repair_item": "维修项目", + "repair_item_code": "维修项目代码(设备编号)", + "responsible_vendor": "负责厂商", + "status": "状态", + "not_completed": "未完成", + "completed": "已完成", + "worker_id": "工作人员编号", + "notice": "注意事项", + "result_description": "结果描述", + "upload_file": "上传文件", + "enable": "启用", + "not_enabled": "不启用", + "qualifications": "限定条件", + "upper_limit": "上限", + "lower_limit": "下限", + "delay": "持续秒数", + "highDelay": "上限持续秒数", + "lowDelay": "下限持续秒数", + "warning_method": "警示方式", + "warning_time": "警示时间", + "warning_value": "警示值", + "operation": "功能", + "alarm_settings": "异常设定", + "time_setting": "时间设定", + "yes": "是", + "no": "否", + "no_notify": "无通知", + "notify_name": "姓名", + "notify_phone": "手机号码", + "notify_email": "email", + "notify_items": "通知项目", + "notify_list": "通知名单", + "choose": "选择", + "day_time": "星期/时间", + "click_time_period": "请用滑鼠点击时间段", + "clear": "清空", + "sunday": "星期日", + "monday": "星期一", + "tuesday": "星期二", + "wednesday": "星期三", + "thursday": "星期四", + "friday": "星期五", + "saturday": "星期六", + "schedule_name": "时段名称", + "schedule_content": "时段内容", + "reorganization": "MQTT 告警重整" + }, + "operation": { + "title": "运维管理", + "project": "项目", + "location": "位置", + "uuid": "异常ID", + "form_number": "表单编号", + "device_name": "设备名称", + "status": "狀態", + "staff": "处理人员", + "start_time": "预计开始时间", + "upload": "档案上传", + "finish_time": "完成时间", + "updated_time": "更新时间", + "operation": "功能", + "vendor": "厂商", + "contact_person": "联络人", + "phone": "电话", + "email": "email", + "created_at": "建立日期", + "maintenance": "保养", + "repair": "维修", + "company_info": "厂商资料", + "repair_item": "维修项目", + "repair_item_code": "维修项目代码(设备编号)", + "responsible_vendor": "负责厂商", + "not_completed": "未完成", + "completed": "已完成", + "worker_id": "工作人员编号", + "notice": "注意事项", + "result_description": "结果描述", + "upload_file": "上传文件", + "name": "姓名", + "city": "城市", + "address": "地址", + "tax_id_number": "统一编号", + "remark": "备注", + "date": "日期", + "time": "时间", + "serial": "单号", + "today": "今天", + "yesterday": "昨天", + "start_created_at": "起始日期", + "end_created_at": "结束日期", + "enter_text": "请输入文字", + "enter_serial": "请输入单号" + }, + "graphManagement": { + "title": "图资管理", + "category": "图资类别", + "new_category": "新类别", + "index": "编号", + "oriOrgName": "档案", + "operation": "功能", + "folder_path": "资料夹路径", + "upload": "图资上传", + "staging_area": "删除暂存区", + "no_path": "无资料夹路径" + }, + "assetManagement": { + "title": "资产管理", + "add_system_category": "新增系统类别", + "edit_system_category": "修改系统类别", + "add_device_category": "新增设备类别", + "edit_device_category": "修改设备类别", + "system_name": "名称", + "system_value": "代号", + "system_parent": "所属系統", + "device_number": "设备编号", + "device_name": "设备名称", + "asset_number": "资产编号", + "floor": "设备位置", + "add_floor": "新增楼层", + "add_floor_text": "须先上传楼层地图", + "device_coordinate": "图面标识", + "brand_and_modal": "品牌 / 型号", + "brand": "品牌", + "modal": "型号", + "company_and_contact": "厂商 / 联络人", + "company": "负责厂商", + "buying_date": "建置时间", + "oriFile": "档案上传", + "created_at": "建立时间", + "operation": "功能", + "device_list": "设备列表", + "edit_device": "编辑设备", + "add_device": "新增设备", + "operate_text": "显示名称", + "fill_text": "请由系统人员填写", + "equipment_point": "设备点位", + "point": "点位", + "add_sensor": "新增感测器", + "associated_device": "关联设备", + "choose": "选择", + "index": "编号", + "floor_plan": "平面图", + "department": "部门", + "department_name": "部门名称", + "building": "栋别" + }, + "accountManagement": { + "account_title": "帐号管理", + "role_title": "角色管理", + "index": "编号", + "name": "姓名", + "account": "帐号", + "password": "密码", + "role": "角色", + "role_name": "角色名称", + "role_permissions": "角色权限", + "role_permissions_setting": "角色权限设定", + "permission_name": "权限名称", + "basic_permissions": "基础权限", + "production_permissions": "生产设定权限", + "email": "email", + "phone": "手机", + "created_at": "建立时间", + "operation": "功能", + "name_placeholder": "请输入使用者、帐号名称", + "role_placeholder": "请输入角色名称", + "change_password": "变更密码", + "choose": "选择" + }, + "button": { + "add": "新增", + "cancel": "取消", + "query": "查询", + "search": "搜索", + "view": "查看", + "reset": "重置", + "export": "导出", + "enter_text": "输入文字后按下 Enter", + "required": "必填", + "submit": "确定", + "edit": "修改", + "delete": "删除", + "deselect_all": "取消全选", + "select_all": "全选", + "phone_format": "请输入正确电话号码格式", + "email_format": "请输入正确 Email 地址", + "password_format": "密码长度至少8码,必须包含英文及数字", + "start_time_placeholder": "请输入预计开始日期", + "finish_time_placeholder": "请输入完成日期", + "rename": "重新命名", + "download": "下载", + "confirm": "确认", + "restore": "复原", + "stop_edit": "停止修改", + "start_edit": "开始修改", + "convert": "轉換" + }, + "msg": { + "sure_to_delete": "是否确认删除该项目?", + "sure_to_delete_permanent": "是否确认永久删除该项目?", + "delete_success": "删除成功", + "delete_failed": "删除失败", + "mqtt_refresh": "重新设定成功" + }, + "setting": { + "MQTT_parse": "MQTT 解析", + "schema": "架构", + "point": "点位", + "description": "描述", + "IoT_point_name": "IoT 点位名称", + "IoT_point_code": "IoT 点位代号", + "number_of_decimal_places": "小数位数", + "boolean_value": "布林值", + "hide_point": "点位显示", + "schema_name": "架构名称", + "IoT_point_structure": "IoT点位结构", + "system_point_name": "系统点位名称", + "json_format_text": "请贴上 JSON 格式数据", + "json_click_text": "请在左侧输入JSON并点选转换按钮" + } +} diff --git a/src/config/tw.json b/src/config/tw.json new file mode 100644 index 0000000..a53d1c6 --- /dev/null +++ b/src/config/tw.json @@ -0,0 +1,422 @@ +{ + "language": "繁體中文", + "home": "首頁", + "sign_out": "登出", + "log_in": "登入", + "account": "帳號", + "password": "密碼", + "table": { + "no_data": "表中數據為空", + "in_otal": "筆資料", + "skip_to": "跳至" + }, + "upload": { + "title": "選擇一個文件或拖放到這裡", + "description": "檔案不超過 10MB", + "formats": "檔案格式" + }, + "dashboard": { + "production_quantity": "生產量", + "today_production_rate": "今日生產完成率", + "yesterday_today": "昨天/今天", + "elec_consumption_comparison": "用電量比較", + "elec_consumption_comparison_trend": "用電量比較趨勢", + "electricity_consumption": "用電量", + "today_electricity_consumption": "今日用電量", + "yesterday_electricity_consumption": "昨天用電量", + "this_last_week": "本週/上週", + "thisweek_electricity_consumption": "本周用電量", + "lastweek_electricity_consumption": "上週用電量", + "one_hour": "1小時", + "four_hour": "4小時", + "eight_hour": "8小時", + "energy_ranking": "能耗排行", + "last_30_days_energy_trend": "近30天能耗趨勢", + "today_energy_consumption": "本日能耗", + "this_month_energy_consumption": "本月能耗", + "relative_energy_consumption": "環比能耗", + "daily_relative_change": "日環比", + "weekly_relative_change": "周環比", + "monthly_relative_change": "月環比", + "yearly_relative_change": "年環比", + "today": "今日", + "yesterday": "昨日", + "this_week": "本周", + "last_week": "上周", + "this_month": "本月", + "last_month": "上月", + "this_year": "今年", + "last_year": "去年", + "refrig_chart": "冷藏", + "indoor_chart": "室內", + "temperature": "溫度", + "humidity": "濕度", + "no_data": "無資料", + "alerts_data": "異常資料" + }, + "history": { + "title": "歷史資料", + "building_name": "廠區", + "device_name": "設備名稱", + "system_category": "系統類別", + "device_category": "設備類別", + "category": "類別", + "value": "數值", + "date": "記錄時間", + "point": "點位", + "combinations": "常用組合", + "date_range": "日期區間", + "time_range": "時間區間", + "start_date": "起始日期", + "start_time": "起始時間", + "end_date": "結束日期", + "end_time": "結束時間" + }, + "system": { + "status": "狀態", + "details": "詳細資料", + "attribute": "屬性", + "value": "數值" + }, + "energy": { + "elec_consumption": "用電即時分佈", + "total_elec": "總用電", + "green_elec": "綠電", + "immediate_demand": "即時需量", + "average_demand": "平均需量", + "real_time_Trend": "即時趨勢", + "contract_capacity": "契約容量", + "alert_capacity": "警戒容量", + "reset_value": "復歸值", + "edit_automatic_demand": "編輯自動需量", + "elec_bills": "今年電費累計(元)", + "interval_elec_charges": "區間電費(元)", + "year_carbon_emission": "今年碳排當量累計(公斤)", + "interval_carbon_emission": "區間碳排當量", + "year_elec_consumption": "今年用電度數(kWh)", + "interval_elec_consumption": "區間用電度數(kWh)", + "monthly_elec_consumption": "每月用電分析", + "daily_carbon_emission_and_reduction": "每日碳排當量 (kgCO2e)", + "monthly_bill_power": "每月計費度數 (kWh)", + "interval_bill_degree": "區間計費度數", + "peak": "尖峰", + "semi_peak": "半尖峰", + "off_peak": "離峰", + "var_elec_cost": "流動電費", + "fixed_elec_cost": "基本電費", + "total_elec_cost": "總電費", + "carbon_equivalent": "碳排當量", + "edit_carbon_emission": "編輯碳排放係數", + "carbon_emission_coefficient": "碳排放係數", + "electricity_classification": "用電分類", + "electricity_price": "電費每度單價", + "floor": "樓層", + "maximum": "最大值", + "maximum_time": "最大值時間", + "minimum": "最小值", + "minimum_time": "最小值時間", + "average_value": "平均值", + "start_value": "起始值(kWh)", + "end_value": "截止值(kWh)", + "difference": "差值(kWh)", + "power_consumption": "用電量(kWh)", + "ranking": "排名", + "subtotal": "小計", + "unit_price": "單價", + "total_amount": "金額總計", + "elec_price_list": "電價表", + "residential": "住宅型", + "standard": "標準型", + "simple_elec_price_two_stage": "簡易型時間電價二段式", + "simple_elec_price_three_stage": "簡易型時間電價三段式", + "classification": "分類", + "summer_months": "夏月", + "non_summer_months": "非夏月", + "time_outside_summer_months": "夏月以外的時間", + "basic_elec_charge": "基本電費", + "charged_per_household": "按戶計收", + "per_household_month": "每戶每月", + "mon_to_friday": "週一~週五", + "peak_hours": "尖峰時間", + "semi_peak_hours": "半尖峰時間", + "off_peak_hours": "離峰時間", + "price_per_kwh": "每度", + "all_day": "全日", + "sat_sun_off_peak_days": "週六、週日及離峰日", + "usage_over_2000kwh": "每月總度數超過2000度之部分", + "add": "加", + "standard_time_of_use_tariff_2_stage": "標準型時間電價二段式", + "standard_time_of_use_tariff_3_stage": "標準型時間電價三段式", + "single_phase": "單相", + "three_phase": "三相", + "frequent_contract": "經常契約", + "per_kw_per_month": "每瓩每月", + "non_summer_contract": "非夏日契約", + "saturday_semi_peak_contract": "週六半尖峰契約", + "off_peak_contract": "離峰契約", + "variable_electricity_charge": "流動電費", + "saturday": "週六", + "sunday_and_off_peak_days": "週日及離峰日", + "latest_elec_consumption": "最新用電度數", + "daily_elec": "每日用電度數", + "line_voltage": "線電壓", + "electric_current": "電流", + "monthly_elec_bill": "每月電費分析" + }, + "alarm": { + "title": "顯示警告", + "notify": "異常通知", + "number": "異常ID", + "category": "異常類別", + "device_name": "設備名稱", + "message": "異常訊息", + "confirm": "確認" + }, + "alert": { + "query_title": "告警紀錄查詢", + "setting_title": "告警設定", + "offnormal": "未復歸", + "normal": "已復歸", + "unacked": "未確認", + "acked": "已確認", + "30days": "近30天", + "start_date": "起始日期", + "end_date": "結束日期", + "building_and_floor": "棟別-樓層", + "uuid": "異常ID", + "alarmClass": "告警條件", + "device_name": "設備名稱", + "device_number": "設備編號", + "device_point_name": "點位名稱", + "date": "發生日期", + "time": "發生時間", + "error_msg": "異常原因", + "ack_state": "Ack 確認", + "repair_order_number": "派工 / 維運單號", + "repair_order": "維修單", + "form_number": "表單編號", + "start_time": "預計開始時間", + "item": "項目", + "maintainance": "保養", + "repair": "維修", + "repair_item": "維修項目", + "repair_item_code": "維修項目代碼(設備編號)", + "responsible_vendor": "負責廠商", + "status": "狀態", + "not_completed": "未完成", + "completed": "已完成", + "worker_id": "工作人員編號", + "notice": "注意事項", + "result_description": "結果描述", + "upload_file": "上傳檔案", + "enable": "啟用", + "not_enabled": "不啟用", + "qualifications": "限定條件", + "upper_limit": "上限", + "lower_limit": "下限", + "delay": "持續秒數", + "highDelay": "上限持續秒數", + "lowDelay": "下限持續秒數", + "warning_method": "警示方式", + "warning_time": "警示時間", + "warning_value": "警示值", + "operation": "功能", + "alarm_settings": "異常設定", + "time_setting": "時間設定", + "yes": "是", + "no": "否", + "no_notify": "無通知", + "notify_name": "姓名", + "notify_phone": "手機號碼", + "notify_email": "email", + "notify_items": "通知項目", + "notify_list": "通知名單", + "choose": "選擇", + "day_time": "星期/時間", + "click_time_period": "請用滑鼠點擊時間段", + "clear": "清空", + "sunday": "星期日", + "monday": "星期一", + "tuesday": "星期二", + "wednesday": "星期三", + "thursday": "星期四", + "friday": "星期五", + "saturday": "星期六", + "schedule_name": "時段名稱", + "schedule_content": "時段內容", + "reorganization": "MQTT 告警重整" + }, + "operation": { + "title": "運維管理", + "project": "項目", + "location": "位置", + "uuid": "異常ID", + "form_number": "表單編號", + "device_name": "設備名稱", + "status": "狀態", + "staff": "處理人員", + "start_time": "預計開始時間", + "upload": "檔案上傳", + "finish_time": "完成時間", + "updated_time": "更新時間", + "operation": "功能", + "vendor": "廠商", + "contact_person": "聯絡人", + "phone": "電話", + "email": "email", + "created_at": "建立日期", + "maintenance": "保養", + "repair": "維修", + "company_info": "廠商資料", + "repair_item": "維修項目", + "repair_item_code": "維修項目代碼(設備編號)", + "responsible_vendor": "負責廠商", + "not_completed": "未完成", + "completed": "已完成", + "worker_id": "工作人員編號", + "notice": "注意事項", + "result_description": "結果描述", + "upload_file": "上傳檔案", + "name": "姓名", + "city": "城市", + "address": "地址", + "tax_id_number": "統一編號", + "remark": "備注", + "date": "日期", + "time": "時間", + "serial": "單號", + "today": "今天", + "yesterday": "昨天", + "start_created_at": "起始日期", + "end_created_at": "結束日期", + "enter_text": "請輸入文字", + "enter_serial": "請輸入單號" + }, + "graphManagement": { + "title": "圖資管理", + "category": "圖資類別", + "new_category": "新類別", + "index": "編號", + "oriOrgName": "檔案", + "operation": "功能", + "folder_path": "資料夾路徑", + "upload": "圖資上傳", + "staging_area": "刪除暫存區", + "no_path": "無資料夾路徑" + }, + "assetManagement": { + "title": "資產管理", + "add_system_category": "新增系統類別", + "edit_system_category": "修改系統類別", + "add_device_category": "新增設備類別", + "edit_device_category": "修改設備類別", + "system_name": "名稱", + "system_value": "代號", + "system_parent": "所屬系統", + "device_number": "設備編號", + "device_name": "設備名稱", + "asset_number": "資產編號", + "floor": "設備位置", + "add_floor": "新增樓層", + "add_floor_text": "須先上傳樓層地圖", + "device_coordinate": "圖面標識", + "brand_and_modal": "品牌 / 型號", + "brand": "品牌", + "modal": "型號", + "company_and_contact": "廠商 / 聯絡人", + "company": "負責廠商", + "buying_date": "購買日期", + "oriFile": "檔案上傳", + "created_at": "建立時間", + "operation": "功能", + "device_list": "設備列表", + "edit_device": "編輯設備", + "add_device": "新增設備", + "operate_text": "顯示名稱", + "fill_text": "請由系統人員填寫", + "equipment_point": "設備點位", + "point": "點位", + "add_sensor": "新增感測器", + "associated_device": "關聯設備", + "choose": "選擇", + "index": "編號", + "floor_plan": "平面圖", + "department": "部門", + "department_name": "部門名稱", + "building": "棟別" + }, + "accountManagement": { + "account_title": "帳號管理", + "role_title": "角色管理", + "index": "編號", + "name": "姓名", + "account": "帳號", + "password": "密碼", + "role": "角色", + "role_name": "角色名稱", + "role_permissions": "角色權限", + "role_permissions_setting": "角色權限設定", + "permission_name": "權限名稱", + "basic_permissions": "基礎權限", + "production_permissions": "生產設定權限", + "email": "email", + "phone": "手機", + "created_at": "建立時間", + "operation": "功能", + "name_placeholder": "請輸入使用者、帳號名稱", + "role_placeholder": "請輸入角色名稱", + "change_password": "變更密碼", + "choose": "選擇" + }, + "button": { + "add": "新增", + "cancel": "取消", + "query": "查詢", + "search": "搜尋", + "view": "查看", + "reset": "重置", + "export": "匯出", + "enter_text": "輸入文字後按下 Enter", + "required": "必填", + "submit": "確定", + "edit": "修改", + "delete": "刪除", + "deselect_all": "取消全選", + "select_all": "全選", + "phone_format": "請輸入正確電話號碼格式", + "email_format": "請輸入正確的 Email 地址", + "password_format": "密碼長度至少8碼,必須包含英文及數字", + "start_time_placeholder": "請輸入預計開始日期", + "finish_time_placeholder": "請輸入完成日期", + "rename": "重新命名", + "download": "下載", + "confirm": "確認", + "restore": "復原", + "stop_edit": "停止修改", + "start_edit": "開始修改", + "convert": "轉換" + }, + "msg": { + "sure_to_delete": "是否確認刪除該項目?", + "sure_to_delete_permanent": "是否確認永久刪除該項目?", + "delete_success": "刪除成功", + "delete_failed": "刪除失敗", + "mqtt_refresh": "重新設定成功" + }, + "setting": { + "MQTT_parse": "MQTT 解析", + "schema": "架構", + "point": "點位", + "description": "描述", + "IoT_point_name": "IoT 點位名稱", + "IoT_point_code": "IoT 點位代號", + "number_of_decimal_places": "小數位數", + "boolean_value": "布林值", + "hide_point": "點位顯示", + "schema_name": "架構名稱", + "IoT_point_structure": "IoT點位結構", + "system_point_name": "系統點位名稱", + "json_format_text": "請貼上 JSON 格式數據", + "json_click_text": "請在左側輸入JSON並點選轉換按鈕" + } +} diff --git a/src/config/us.json b/src/config/us.json new file mode 100644 index 0000000..99a19e9 --- /dev/null +++ b/src/config/us.json @@ -0,0 +1,422 @@ +{ + "language": "English", + "home": "Home", + "sign_out": "Sign out", + "log_in": "Log in", + "account": "Account", + "password": "Password", + "table": { + "no_data": "No data", + "in_otal": "items in total", + "skip_to": "Skip to" + }, + "upload": { + "title": "Select a file or drag and drop here", + "description": "File size cannot exceed 10MB", + "formats": "File formats" + }, + "dashboard": { + "production_quantity": "Production Quantity", + "today_production_rate": "Today's Production Completion Rate", + "yesterday_today": "Yesterday / Today's", + "elec_consumption_comparison": "Electricity Consumption Comparison", + "elec_consumption_comparison_trend": "Electricity Consumption Comparison Trend", + "electricity_consumption": "electricity consumption", + "today_electricity_consumption": "Today’s electricity consumption", + "yesterday_electricity_consumption": "Yesterday’s electricity consumption", + "this_last_week": "This Week's / Last Week's", + "thisweek_electricity_consumption": "This week’s electricity consumption", + "lastweek_electricity_consumption": "Last week’s electricity consumption", + "one_hour": "1 hour", + "four_hour": "4 hour", + "eight_hour": "8 hour", + "energy_ranking": "Energy consumption ranking", + "last_30_days_energy_trend": "Energy consumption trend for the past 30 days", + "today_energy_consumption": "Today", + "this_month_energy_consumption": "This month", + "relative_energy_consumption": "Energy consumption trend", + "daily_relative_change": "Daily", + "weekly_relative_change": "Weekly", + "monthly_relative_change": "Monthly", + "yearly_relative_change": "Yearly", + "today": "Today", + "yesterday": "Yesterday", + "this_week": "This week", + "last_week": "Last week", + "this_month": "This month", + "last_month": "Last month", + "this_year": "This year", + "last_year": "Last year", + "refrig_chart": "Refrigeration", + "indoor_chart": "Indoor", + "temperature": "Temp.", + "humidity": "Hum.", + "no_data":"No data", + "alerts_data": "Abnormal data" + }, + "history": { + "title": "Historical Data", + "building_name": "Building", + "device_name": "Device Name", + "system_category": "System Category", + "device_category": "Device Category", + "category": "Category", + "value": "Value", + "date": "Record Time", + "point": "Character", + "combinations": "Common combinations", + "date_range": "Date Range", + "time_range": "Time interval", + "start_date": "Start date", + "start_time": "Start time", + "end_date": "End date", + "end_time": "End time" + }, + "system": { + "status": "Status", + "details": "Details", + "attribute": "Attribute", + "value": "value" + }, + "energy": { + "elec_consumption": "Real-time distribution of electricity consumption", + "total_elec": "Total electricity consumption", + "green_elec": "Green electricity", + "immediate_demand": "Immediate demand", + "average_demand": "Average demand", + "real_time_Trend": "Real-time Trend", + "contract_capacity": "Contract Capacity", + "alert_capacity": "Alert Capacity", + "reset_value": "Reset Value", + "edit_automatic_demand": "Edit automatic demand", + "elec_bills": "Total electricity bills this year (yuan)", + "interval_elec_charges": "Interval electricity charges (yuan)", + "year_carbon_emission": "Cumulative carbon emission equivalent this year (kg)", + "interval_carbon_emission": "Interval carbon emission equivalent", + "year_elec_consumption": "This year's electricity consumption (kWh)", + "interval_elec_consumption": "Interval electricity consumption (kWh)", + "monthly_elec_consumption": "Monthly electricity consumption analysis", + "daily_carbon_emission_and_reduction": "Daily carbon emission equivalent (kgCO2e)", + "monthly_bill_power": "Monthly billing power (kWh)", + "interval_bill_degree": "Interval billing degree", + "peak": "Peak", + "semi_peak": "Semi-Peak", + "off_peak": "Off-Peak", + "var_elec_cost": "Var. Elec. Cost", + "fixed_elec_cost": "Fixed Elec. Cost", + "total_elec_cost": "Total Elec. Cost", + "carbon_equivalent": "Carbon Equivalent", + "edit_carbon_emission": "Edit carbon emission coefficient", + "carbon_emission_coefficient": "Carbon emission coefficient", + "electricity_classification": "Electricity Classification", + "electricity_price": "Electricity charge per unit price", + "floor": "Floor", + "maximum": "Maximum", + "maximum_time": "Maximum time", + "minimum": "Minimum value", + "minimum_time": "Minimum time", + "average_value": "Average value", + "start_value": "Start value (kWh)", + "end_value": "End value (kWh)", + "difference": "Difference (kWh)", + "power_consumption": "Power consumption (kWh)", + "ranking": "Ranking", + "subtotal": "Subtotal", + "unit_price": "Unit price", + "total_amount": "Total amount", + "elec_price_list": "Electricity Price List", + "residential": "Residential", + "standard": "Standard", + "simple_elec_price_two_stage": "Simple Time-of-Use Electricity Price (Two-Tier)", + "simple_elec_price_three_stage": "Simple Time-of-Use Electricity Price (Three-Tier)", + "classification": "Classification", + "summer_months": "Summer Months", + "non_summer_months": "Non-Summer Months", + "time_outside_summer_months": "Time Outside Summer Months", + "basic_elec_charge": "Basic Electricity Charge", + "charged_per_household": "Charged Per Household", + "per_household_month": "Per Household Per Month", + "mon_to_friday": "Monday to Friday", + "peak_hours": "Peak Hours", + "semi_peak_hours": "Semi-Peak Hours", + "off_peak_hours": "Off-Peak Hours", + "price_per_kwh": "Price Per kWh", + "all_day": "All Day", + "sat_sun_off_peak_days": "Saturday, Sunday, and Off-Peak Days", + "usage_over_2000kwh": "Usage Over 2000 kWh Per Month", + "add": "Add", + "standard_time_of_use_tariff_2_stage": "Standard Time-of-Use Tariff (Two-Tier)", + "standard_time_of_use_tariff_3_stage": "Standard Time-of-Use Tariff (Three-Tier)", + "single_phase": "Single Phase", + "three_phase": "Three Phase", + "frequent_contract": "Demand Charge", + "per_kw_per_month": "Per kW Per Month", + "non_summer_contract": "Non-Summer Demand Charge", + "saturday_semi_peak_contract": "Saturday Semi-Peak Demand Charge", + "off_peak_contract": "Off-Peak Demand Charge", + "variable_electricity_charge": "Variable Electricity Charge", + "saturday": "Saturday", + "sunday_and_off_peak_days": "Sunday and Off-Peak Days", + "latest_elec_consumption": "Latest electricity consumption", + "daily_elec": "Daily electricity consumption", + "line_voltage": "Line voltage", + "electric_current": "electric current", + "monthly_elec_bill": "Monthly electricity bill analysis" + }, + "alarm": { + "title": "Warning", + "notify": "Notification", + "number": "ID", + "category": "Category", + "device_name": "Device name", + "message": "Message", + "confirm": "Confirm" + }, + "alert": { + "query_title": "Alarm Record Query", + "setting_title": "Alarm Settings", + "offnormal": "Off Normal", + "normal": "Normal", + "unacked": "Unacked", + "acked": "Acked", + "30days": "Last 30 Days", + "start_date": "Start Date", + "end_date": "End Date", + "building_and_floor": "Building - Floor", + "uuid": "Exception ID", + "alarmClass": "Alarm Conditions", + "device_name": "Device Name", + "device_number": "Device Number", + "device_point_name": "Point Name", + "date": "Occurrence Date", + "time": "Occurrence Time", + "error_msg": "Abnormal Cause", + "ack_state": "Ack Confirm", + "repair_order_number": "Repair Order Number", + "repair_order": "Repair Order", + "form_number": "Form Number", + "start_time": "Estimated Start Time", + "item": "Item", + "maintainance": "Maintainance", + "repair": "Repair", + "repair_item": "Repair Item", + "repair_item_code": "Repair Item Code (Device Number)", + "responsible_vendor": "Responsible Vendor", + "status": "Status", + "not_completed": "Not Completed", + "completed": "Completed", + "worker_id": "Worker ID", + "notice": "Notice", + "result_description": "Result Description", + "upload_file": "Upload File", + "enable": "Enable", + "not_enabled": "Not Enabled", + "qualifications": "Qualifications", + "upper_limit": "Upper Limit", + "lower_limit": "Lower Limit", + "delay": "Duration (s)", + "highDelay": "Max Duration (s)", + "lowDelay": "Min Duration (s)", + "warning_method": "Warning Method", + "warning_time": "Warning Time", + "warning_value": "Warning Value", + "operation": "Function", + "alarm_settings": "Abnormal Alarm Settings", + "time_setting": "Time Setting", + "yes": "Yes", + "no": "No", + "no_notify": "No Notification", + "notify_name": "Name", + "notify_phone": "Phone Number", + "notify_email": "Email", + "notify_items": "Notification Items", + "notify_list": "Notification List", + "choose": "Choose", + "day_time": "Week/Time", + "click_time_period": "Please click the time period with your mouse", + "clear": "Clear", + "sunday": "Sunday", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "schedule_name": "Time period name", + "schedule_content": "Time period content", + "reorganization": "MQTT Alarm Reorganization" + }, + "operation": { + "title": "Operation And Maintenance Management", + "project": "Project", + "location": "Location", + "uuid": "Exception ID", + "form_number": "Form Number", + "device_name": "Device Name", + "status": "Status", + "staff": "Staff", + "start_time": "Estimated Start Time", + "upload": "File Upload", + "finish_time": "Completion Time", + "updated_time": "Update Time", + "operation": "Function", + "vendor": "Company", + "contact_person": "Contact Person", + "phone": "Phone", + "email": "Email", + "created_at": "Creation Date", + "maintenance": "Upkeep", + "repair": "Repair", + "company_info": "Company Info", + "repair_item": "Repair Item", + "repair_item_code": "Repair Item Code (Device Number)", + "responsible_vendor": "Responsible Vendor", + "not_completed": "Not Completed", + "completed": "Completed", + "worker_id": "Worker ID", + "notice": "Notice", + "result_description": "Result Description", + "upload_file": "Upload File", + "name": "Name", + "city": "City", + "address": "Address", + "tax_id_number": "Tax ID Number", + "remark": "Remark", + "date": "Date", + "time": "Time", + "serial": "Order Number", + "today": "Today", + "yesterday": "Yesterday", + "start_created_at": "Start Date", + "end_created_at": "End Date", + "enter_text": "Please enter text", + "enter_serial": "Please enter the order number" + }, + "graphManagement": { + "title": "Data And Publication Management", + "category": "Category", + "new_category": "New Category", + "index": "Serial Number", + "oriOrgName": "File", + "operation": "Function", + "folder_path": "Folder Path", + "upload": "Upload", + "staging_area": "Staging Area", + "no_path": "No path" + }, + "assetManagement": { + "title": "Asset Management", + "add_system_category": "Add system category", + "edit_system_category": "Edit system category", + "add_device_category": "Add device category", + "edit_device_category": "Edit device category", + "system_name": "Name", + "system_value": "Code", + "system_parent": "System category", + "device_number": "Device Number", + "device_name": "Device Name", + "asset_number": "Asset Number", + "floor": "Location", + "add_floor": "Add Floor", + "add_floor_text": "Floor map must be uploaded first", + "device_coordinate": "Coordinate", + "brand_and_modal": "Brand/Model", + "brand": "Brand", + "modal": "Model", + "company_and_contact": "Company/Contact Person", + "company": "Company", + "buying_date": "Purchase Time", + "oriFile": "File Upload", + "created_at": "Creation Time", + "operation": "Function", + "device_list": "Device List", + "edit_device": "Edit Device", + "add_device": "Add Device", + "operate_text": "Display name", + "fill_text": "Please fill it in by system personnel", + "equipment_point": "Equipment Point", + "point": "Point", + "add_sensor": "Add New Sensor", + "associated_device": "Associated Devices", + "choose": "Choose", + "index": "Serial Number", + "floor_plan": "Floor Plan", + "department": "Department", + "department_name": "Department Name", + "building": "Building" + }, + "accountManagement": { + "account_title": "Account Management", + "role_title": "Role Management", + "index": "Serial Number", + "name": "Name", + "account": "Account", + "password": "Password", + "role": "Role", + "role_name": "Role Name", + "role_permissions": "Role Permissions", + "role_permissions_setting": "Role Permissions Settings", + "permission_name": "Permission Name", + "basic_permissions": "Basic Ppermissions", + "production_permissions": "Production Setting Permissions", + "email": "Email", + "phone": "Phone", + "created_at": "Created Time", + "operation": "Function", + "name_placeholder": "Please enter the user's name / account", + "role_placeholder": "Please enter the role's name", + "change_password": "Change Password", + "choose": "Choose" + }, + "button": { + "add": "Add", + "cancel": "Cancel", + "query": "Query", + "search": "Search", + "view": "View", + "reset": "Reset", + "export": "Export", + "enter_text": "After entering text, press Enter", + "required": "Required", + "submit": "Submit", + "edit": "Edit", + "delete": "Delete", + "deselect_all": "Deselect All", + "select_all": "Select All", + "phone_format": "Please enter the correct phone number format", + "email_format": "Please enter correct email address", + "password_format": "The password must be at least 8 characters long and must contain English and numbers.", + "start_time_placeholder": "Please enter expected start date", + "finish_time_placeholder": "Please enter completion date", + "rename": "Rename", + "download": "Download", + "confirm": "Confirm", + "restore": "Restore", + "stop_edit": "Stop editing", + "start_edit": "Start editing", + "convert": "Convert" + }, + "msg": { + "sure_to_delete": "Are you sure to delete this item?", + "sure_to_delete_permanent": "Are you sure you want to permanently delete this item?", + "delete_success": "Delete successfully", + "delete_failed": "Delete failed", + "mqtt_refresh": "MQTT reset successful" + }, + "setting": { + "MQTT_parse": "MQTT Parse", + "schema": "Schema", + "point": "Point", + "description": "Description", + "IoT_point_name": "IoT Point Name", + "IoT_point_code": "IoT Point Code", + "number_of_decimal_places": "Number of Decimal Places", + "boolean_value": "Boolean Value", + "hide_point": "Point Display", + "schema_name": "Schema name", + "IoT_point_structure": "IoT Point Structure", + "system_point_name": "System Point Name", + "json_format_text": "Please paste JSON format data", + "json_click_text": "Please enter JSON on the left and click the conversion button" + } +} diff --git a/src/constant/CalculateTableColumn.js b/src/constant/CalculateTableColumn.js new file mode 100644 index 0000000..5a81ee0 --- /dev/null +++ b/src/constant/CalculateTableColumn.js @@ -0,0 +1,127 @@ +const transformColumns = (columns) => + columns.map((col) => ({ + ...col, + dataIndex: col.key, + width: col.width ?? 120, + align: "center", + })); + +const MONTHCOLUMNS = transformColumns([ + { title: "項目", key: "item", width: 190, fixed: true }, + { title: "1月", key: "January" }, + { title: "2月", key: "February" }, + { title: "3月", key: "March" }, + { title: "4月", key: "April" }, + { title: "5月", key: "May" }, + { title: "6月", key: "June" }, + { title: "7月", key: "July" }, + { title: "8月", key: "August" }, + { title: "9月", key: "September" }, + { title: "10月", key: "October" }, + { title: "11月", key: "November" }, + { title: "12月", key: "December" }, +]); + +const WORKHOURSROW = [ + { + key: "Index", + item: "月份", + }, + { + key: "WorkerNumber", + item: "員工數", + }, + { + key: "WorkDay", + item: "每日每人平均工作時數", + }, + { + key: "Scalar", + item: "總工時", + }, + { + key: "OverTimeWorkerNumber", + item: "加班員工數", + }, + { + key: "OverTimeAverageHourPerDay", + item: "每日每人平均加班時數", + }, + { + key: "OverTimeWorkDay", + item: "月加班工作天數", + }, + { + key: "OverTimeScalar", + item: "月合計加班時數", + }, + { key: "TotalHours", item: "總工時", readonly: true }, + { key: "KgCO2e", item: "KgCO2e", readonly: true }, + { key: "Description", item: "描述/說明" }, + { + item: "使用量佐證文件", + key: "ReferenceFileLink", + }, +]; + +const ELECTRICROW = transformColumns([ + { + key: "Index", + title: "月份", + }, + { + key: "Peak", + title: "尖峰 / 峰", + }, + { + key: "HalfPeak", + title: "半尖峰 / 平", + }, + { + key: "SaturdayHalfPeak", + title: "週六半尖峰", + }, + { + key: "OffPeak", + title: "離峰 / 谷", + }, + { + key: "KgCO2e", + title: "碳排放 KgCO2e", + }, + // { + // key: "Elecdeduct1", + // item: "電力扣除額1", + // }, + // { + // key: "Elecdeduct2", + // item: "電力扣除額2", + // }, + // { + // key: "Scalar", + // item: "總用電量", + // }, + // { key: "Description", item: "描述/說明" }, + // { key: "KgCO2e", item: "KgCO2e", readonly: true }, + // { + // item: "使用量佐證文件", + // key: "ReferenceFileLink", + // }, +]); + +const REFRIGERANTCOLUMNS = transformColumns([ + { title: "廠區 / 製程別", key: "ProcessName" }, + { title: "負責單位", key: "ResponsibleUnit" }, + { title: "設備名稱", key: "Name" }, + { title: "型號", key: "ModelNumber" }, + { title: "使用冷媒 / 製冷劑種類 ", key: "ParameterIDTitle" }, + { title: "全廠台數", key: "TotalNumber" }, + { title: "冷媒 / 製冷劑原始填充量(Kg) ", key: "Scalar" }, + { title: "使用月數", key: "UsedMonth" }, + { title: "設備類型(排放因子) ", key: "ParameterID2Title" }, + { title: "GWP", key: "GWP" }, + { title: "設備逸散率", key: "factor" }, + { title: "KgCO2e", key: "KgCO2e" }, +]); + +export { MONTHCOLUMNS, WORKHOURSROW, ELECTRICROW, REFRIGERANTCOLUMNS }; diff --git a/src/constant/api_app.js b/src/constant/api_app.js new file mode 100644 index 0000000..2744f29 --- /dev/null +++ b/src/constant/api_app.js @@ -0,0 +1,8 @@ +const BASEURL = import.meta.env.VITE_API_BASEURL; +export const POST_LOGIN = `${BASEURL}/api/Login/`; +export const GET_AUTHPAGE_API = `${BASEURL}/api/GetUsrFroList`; +export const GET_SUBAUTHPAGE_API = `${BASEURL}/api/Device/GetMainSub`; +export const GET_DEVICELIST_API = `${BASEURL}/api/Device/GetDeviceList`; +export const GET_DEVICEIMME_API = `${BASEURL}/api/Energe/GetElecBySubSysTag`; + + diff --git a/src/constant/api_forge.js b/src/constant/api_forge.js new file mode 100644 index 0000000..9234002 --- /dev/null +++ b/src/constant/api_forge.js @@ -0,0 +1,4 @@ +const BASEURL = import.meta.env.VITE_API_BASEURL; +export const GET_FORGETOKEN_API = `${BASEURL}/api/forge/oauth/token`; + +export const GET_FORGEURN_API = `${BASEURL}/api/Device/GetBuild`; diff --git a/src/constant/authPage.js b/src/constant/authPage.js new file mode 100644 index 0000000..956d94f --- /dev/null +++ b/src/constant/authPage.js @@ -0,0 +1,70 @@ +export const AUTHPAGES = [ + { + authCode: "PF0", + icon: "home", + navigate: "/dashboard", + }, + { + authCode: "PF1", + icon: "tv", + navigate: "/system", + }, + { + authCode: "PF2", + icon: "chart-pie", + pageName: "energyManagement", + navigate: "/energyManagement", + }, + { + authCode: "PF3", + icon: "chart-area", + navigate: "/historyData", + }, + { + authCode: "PF4", + icon: "chart-line", + navigate: "/historyData", + }, + { + authCode: "PF5", + icon: "bell", + pageName: "alert", + navigate: "/alert", + }, + { + authCode: "PF6", + icon: "server", + pageName: "operation", + navigate: "/operation", + }, + { + authCode: "PF7", + icon: "image", + pageName: "graphManagement", + navigate: "/graphManagement", + }, + { + authCode: "PF8", + icon: "user", + pageName: "accountManagement", + navigate: "/accountManagement", + }, + { + authCode: "PF9", + icon: "database", + pageName: "AssetManagement", + navigate: "/assetManagement", + }, + { + authCode: "PF10", + icon: "leaf", + pageName: "ProductSetting", + navigate: "/productSetting", + }, + { + authCode: "PF11", + icon: "cog", + pageName: "Setting", + navigate: "/Setting", + }, +]; diff --git a/src/constant/calculateIcon.js b/src/constant/calculateIcon.js new file mode 100644 index 0000000..b73e845 --- /dev/null +++ b/src/constant/calculateIcon.js @@ -0,0 +1,465 @@ +// import CapitalGood from "@ASSET/icon/CapitalGood.svg"; // 上游購買資本物品 +// import CapitalGoodHover from "@ASSET/icon/CapitalGood-h.svg"; +// import upstreamEnergyEmission from "@ASSET/icon/UpstreamEnergyEmission.svg"; // 與能源相關活動 +// import upstreamEnergyEmissionHover from "@ASSET/icon/UpstreamEnergyEmission-h.svg"; +// import Energy from "@ASSET/icon/Energy.svg"; // 外購能源排放 +// import EnergyHover from "@ASSET/icon/Energy-h.svg"; +// import Disposal from "@ASSET/icon/Disposal.svg"; // 上游廢棄 +// import DisposalHover from "@ASSET/icon/Disposal-h.svg"; +// import LeasedAsset from "@ASSET/icon/LeasedAsset.svg"; // 上游租賃資產 +// import LeasedAssetHover from "@ASSET/icon/LeasedAsset-h.svg"; +// import PurchasedGood from "@ASSET/icon/PurchasedGood.svg"; // 購買商品 +// import PurchasedGoodHover from "@ASSET/icon/PurchasedGood-h.svg"; +// import Consultant from "@ASSET/icon/Consultant.svg"; // 購買服務 +// import ConsultantHover from "@ASSET/icon/Consultant-h.svg"; +// import UpstreamTransport from "@ASSET/icon/UpstreamTransport.svg"; // 上游運輸及配送 +// import UpstreamTransportHover from "@ASSET/icon/UpstreamTransport-h.svg"; +// import BusinessTravel from "@ASSET/icon/BusinessTravel.svg"; // 商務旅行 +// import BusinessTravelHover from "@ASSET/icon/BusinessTravel-h.svg"; +// import Visitor from "@ASSET/icon/Visitor.svg"; // 訪客 +// import VisitorHover from "@ASSET/icon/Visitor-h.svg"; +// import Commuting from "@ASSET/icon/Commuting.svg"; // 員工通勤 +// import CommutingHover from "@ASSET/icon/Commuting-h.svg"; + +// import StationaryCombustion from "@ASSET/icon/StationaryCombustion.svg"; // 固定源 +// import StationaryCombustionHover from "@ASSET/icon/StationaryCombustion-h.svg"; +// import MobileCombustion from "@ASSET/icon/MobileCombustion.svg"; // 移動源 +// import MobileCombustionHover from "@ASSET/icon/MobileCombustion-h.svg"; +// import DirectFugitiveEmission from "@ASSET/icon/DirectFugitiveEmission.svg"; // 逸散源 +// import DirectFugitiveEmissionHover from "@ASSET/icon/DirectFugitiveEmission-h.svg"; +// import DirectProcessEmission from "@ASSET/icon/DirectProcessEmission.svg"; // 製程 +// import DirectProcessEmissionHover from "@ASSET/icon/DirectProcessEmission-h.svg"; +// import Electricity from "@ASSET/icon/Electricity.svg"; // 用電量 +// import ElectricityHover from "@ASSET/icon/Electricity-h.svg"; +// import Steam from "@ASSET/icon/Steam.svg"; // 蒸氣 +// import SteamHover from "@ASSET/icon/Steam-h.svg"; +// import Refrigerant from "@ASSET/icon/Refrigerant.svg"; // 冷媒 +// import RefrigerantHover from "@ASSET/icon/Refrigerant-h.svg"; +// import OtherCompound from "@ASSET/icon/OtherCompound.svg"; // 其他關注類 +// import OtherCompoundHover from "@ASSET/icon/OtherCompound-h.svg"; + +// import UseEmission from "@ASSET/icon/UseEmission.svg"; // 下游使用銷售產品 +// import UseEmissionHover from "@ASSET/icon/UseEmission-h.svg"; +// import DownstreamDisposal from "@ASSET/icon/DownstreamDisposal.svg"; // 下銷售產品廢棄處理 +// import DownstreamDisposalHover from "@ASSET/icon/DownstreamDisposal-h.svg"; +// import Investment from "@ASSET/icon/Investment.svg"; // 投資 +// import InvestmentHover from "@ASSET/icon/Investment-h.svg"; + +// import Other from "@ASSET/icon/Other.svg"; // 投資 +// import OtherHover from "@ASSET/icon/Other-h.svg"; + +// import WaterUsages from "@ASSET/icon/WaterUsages.png"; // 水 +// import WaterUsagesHover from "@ASSET/icon/WaterUsagesHover.png"; + +import { + MONTHCOLUMNS, + WORKHOURSROW, + ELECTRICROW, + REFRIGERANTCOLUMNS, +} from "./CalculateTableColumn"; + +const alterSourceIcon = (sourceList) => + sourceList.map(({ link, icon, hoverIcon, title, children = null }) => ({ + icon, + hoverIcon, + title, + key: link, + link, + children, + })); + +const sourceIconListForUpstreamS3 = alterSourceIcon([ + { + icon: "CapitalGood", + hoverIcon: "CapitalGood-h", + link: "capitalGood", + title: "購買資本物品 C4", + children: [ + { + title: "購買資本物品 C4", + editType: "lifecycle", + link: "capitalGood", + }, + ], + }, + { + icon: "UpstreamEnergyEmission", + hoverIcon: "UpstreamEnergyEmission-h", + link: "upstreamEmissions", + title: "輸入能源上游排放 C4", + children: [ + { + title: "輸入能源上游排放 C4", + editType: "lifecycle", + link: "upstreamEmissions", + }, + ], + }, + { + icon: "WaterUsages", + hoverIcon: "WaterUsages-h", + link: "waterUsage", + title: "用水(水資源管理) C4", + children: [ + { + title: "用水(水資源管理) C4", + editType: "lifecycle", + link: "waterUsage", + }, + ], + }, + { + icon: "PurchasedGood", + hoverIcon: "PurchasedGood-h", + link: "purchasedGood", + title: "購買商品 C4", + children: [ + { + title: "購買商品 C4", + editType: "lifecycle", + link: "purchasedGood", + }, + ], + }, + { + icon: "LeasedAsset", + hoverIcon: "LeasedAsset-h", + link: "leasedAsset", + title: "上游租賃資產 C4", + children: [ + { + title: "上游租賃資產 C4", + editType: "lifecycle", + link: "leasedAsset", + }, + ], + }, + { + icon: "Consultant", + hoverIcon: "Consultant-h", + link: "consultant", + title: "顧問諮詢、清潔、維護等 C4", + children: [ + { + title: "顧問諮詢、清潔、維護等 C4", + editType: "lifecycle", + link: "consultant", + }, + ], + }, +]); + +const sourceIconListForBusinessS2UP = alterSourceIcon([ + { + icon: "UpstreamTransport", + hoverIcon: "UpstreamTransport-h", + link: "upstreamTransport", + title: "上游運輸及配送 C3", + children: [ + { + title: "上游運輸及配送 C3", + editType: "lifecycle", + link: "upstreamTransport", + }, + ], + }, +]); + +const sourceIconListForBusinessS1 = alterSourceIcon([ + { + icon: "MobileCombustion", + hoverIcon: "MobileCombustion-h", + link: "mobileCombustion", + title: "移動源 C1", + children: [ + { + title: "移動源 C1", + editType: "yearlyDevice", + link: "mobileCombustion", + }, + ], + }, + { + icon: "StationaryCombustion", + hoverIcon: "StationaryCombustion-h", + link: "stationaryCombustion", + title: "固定燃燒源 C1", + children: [ + { + title: "固定燃燒源 C1", + editType: "yearlyDevice", + link: "stationaryCombustion", + }, + ], + }, + { + icon: "DirectProcessEmission", + hoverIcon: "DirectProcessEmission-h", + link: "directProcessEmission", + title: "工業製程 C1", + children: [ + { + title: "工業製程 C1", + editType: "yearlyDevice", + link: "directProcessEmission", + }, + ], + }, + { + icon: "DirectFugitiveEmission", + hoverIcon: "DirectFugitiveEmission-h", + link: "directFugitiveEmission", + title: "人為逸散 C1", + children: [ + { + title: "冷媒設備 B.2.2.d", + editType: "nonYearlyDevice", + link: "refrigerant", + cols: REFRIGERANTCOLUMNS, + main_system_tag: "ME", + sub_system_tag: "M10", + }, + { + title: "工時計算 B.2.2.d", + editType: "lifecycle", + link: "workHour", + rows: WORKHOURSROW, + cols: MONTHCOLUMNS, + data_api: "./mock/workhour.json", + }, + { + title: "消防設備 B.2.2.d", + editType: "nonYearlyDevice", + link: "fireEquipment", + }, + ], + }, + { + icon: "OtherCompound", + hoverIcon: "OtherCompound-h", + link: "otherCompound", + title: "其他關注類物質 C1", + children: [ + { + title: "其他關注類物質 C1", + editType: "nonYearlyDevice", + link: "otherCompound", + }, + ], + }, + + { + icon: "Electricity", + hoverIcon: "Electricity-h", + link: "electricity", + title: "輸入電力 C2", + children: [ + { + title: "一般用電 B.3.2.a", + editType: "month", + link: "plus", + rows: ELECTRICROW, + cols: MONTHCOLUMNS, + main_system_tag: "EE", + sub_system_tag: "E4", + data_api: "./mock/electricity.json", + }, + // { + // title: "綠電 B.3.2.a", + // editType: "month", + // link: "minus", + // rows: ELECTRICROW, + // cols: MONTHCOLUMNS, + // }, + ], + }, + { + icon: "Steam", + hoverIcon: "Steam-h", + link: "steam", + title: "輸入蒸汽 C2", + children: [ + { + title: "蒸氣加項 B.3.2.b", + editType: "month", + link: "plus", + }, + { + title: "蒸氣減項 B.3.2.b", + editType: "month", + link: "minus", + }, + ], + }, + { + icon: "Visitor", + hoverIcon: "Visitor-h", + link: "visitor", + title: "客戶和訪客運輸 C3", + children: [ + { + title: "客戶和訪客運輸 C3", + editType: "lifecycle", + link: "visitor", + }, + ], + }, + { + icon: "BusinessTravel", + hoverIcon: "BusinessTravel-h", + link: "businessTravel", + title: "員工差旅 C3", + children: [ + { + title: "員工差旅 C3", + editType: "lifecycle", + link: "businessTravel", + }, + ], + }, + { + icon: "Commuting", + hoverIcon: "Commuting-h", + link: "commuting", + title: "員工通勤 C3", + children: [ + { + title: "員工通勤 C3", + editType: "lifecycle", + link: "commuting", + }, + ], + }, + { + icon: "Disposal", + hoverIcon: "Disposal-h", + link: "disposal", + title: "營運產生之廢棄物 C4", + children: [ + { + title: "營運產生之廢棄物 C4", + editType: "lifecycle", + link: "disposal", + }, + ], + }, +]); + +const sourceIconListForBusinessS2Down = alterSourceIcon([ + { + icon: "UpstreamTransport", + hoverIcon: "UpstreamTransport-h", + link: "downstreamTransport", + title: "下游運輸及配送 C3", + children: [ + { + title: "下游運輸及配送 C3", + editType: "lifecycle", + link: "downstreamTransport", + }, + ], + }, + { + icon: "UpstreamTransport", + hoverIcon: "UpstreamTransport-h", + link: "disposalDownTransport", + title: "廢棄物運輸 C3", + children: [ + { + title: "廢棄物運輸 C3", + editType: "lifecycle", + link: "disposalDownTransport", + }, + ], + }, +]); + +const sourceIconListForDownstreamS3 = alterSourceIcon([ + { + icon: "LeasedAsset", + hoverIcon: "LeasedAsset-h", + link: "downLeasedAsset", + title: "下游租賃資產 C5", + children: [ + { + title: "下游租賃資產 C5", + editType: "lifecycle", + link: "downLeasedAsset", + }, + ], + }, + { + icon: "UseEmission", + hoverIcon: "UseEmission-h", + link: "useEmission", + title: "產品使用階段 C5", + children: [ + { + title: "產品使用階段 C5", + editType: "lifecycle", + link: "useEmission", + }, + ], + }, + { + icon: "Investment", + hoverIcon: "Investment-h", + link: "investment", + title: "投資 C5", + children: [ + { + title: "投資 C5", + editType: "lifecycle", + link: "investment", + }, + ], + }, + { + icon: "DownstreamDisposal", + hoverIcon: "DownstreamDisposal-h", + link: "downstreamDisposal", + title: "產品壽命終止階段 C5", + children: [ + { + title: "產品壽命終止階段 C5", + editType: "lifecycle", + link: "downstreamDisposal", + }, + ], + }, +]); + +const sourceIconListForOtherS3 = alterSourceIcon([ + { + icon: "Other", + hoverIcon: "Other-h", + link: "other", + title: "其它間接排放 C6", + children: [ + { + title: "其它間接排放 C6", + editType: "lifecycle", + link: "other", + }, + ], + }, +]); + +const allSourceIconList = [ + ...sourceIconListForUpstreamS3, + ...sourceIconListForBusinessS1, + ...sourceIconListForBusinessS2UP, + ...sourceIconListForBusinessS2Down, + ...sourceIconListForDownstreamS3, + ...sourceIconListForOtherS3, +]; + +export { + sourceIconListForUpstreamS3, + sourceIconListForBusinessS1, + sourceIconListForBusinessS2UP, + sourceIconListForBusinessS2Down, + sourceIconListForDownstreamS3, + sourceIconListForOtherS3, + allSourceIconList, +}; diff --git a/src/constant/colors.js b/src/constant/colors.js new file mode 100644 index 0000000..9665e09 --- /dev/null +++ b/src/constant/colors.js @@ -0,0 +1,32 @@ +export const COLOR = [ + "#4cf3e9", // 亮藍 + "#f5d54e", // 黃 + "#63ed84", // 亮綠 + "#9afed8", // 淺綠 + "#e266fe", // 紫 + "#e0e2e2", // 灰 + "#500080", // 紫 + "#115852", // 深綠 + "#4B4E6C", // 灰 + "#eb4c42", // 紅 + "#007ba7", // 藍 + "#da3287", // 粉紅 + "#ccff00", // 綠 + "#fff44f", // 黃 +]; + +// 淺色 +export const CHART_COLOR = [ + "#cb4154", // 紅 + "#fad6a5", // 黃 + "#ace1af", // 綠 + "#9bddff", // 亮藍 +]; + +// 深色 +export const SECOND_CHART_COLOR = [ + "#cc0000", // 紅 + "#ffb300", // 黃 + "#00cc99", // 綠 + "#4997d0", // 藍 +]; diff --git a/src/constant/index.js b/src/constant/index.js new file mode 100644 index 0000000..5a01247 --- /dev/null +++ b/src/constant/index.js @@ -0,0 +1,45 @@ +import { + POST_LOGIN, + GET_AUTHPAGE_API, + GET_SUBAUTHPAGE_API, + GET_DEVICELIST_API, + GET_DEVICEIMME_API, +} from "./api_app"; +import { GET_FORGETOKEN_API, GET_FORGEURN_API } from "./api_forge"; +import { AUTHPAGES } from "./authPage"; +import { + sourceIconListForUpstreamS3, + sourceIconListForBusinessS1, + sourceIconListForBusinessS2UP, + sourceIconListForBusinessS2Down, + sourceIconListForDownstreamS3, + sourceIconListForOtherS3, + allSourceIconList, +} from "./calculateIcon"; +import { MONTHCOLUMNS } from "./CalculateTableColumn"; +import { COLOR, CHART_COLOR, SECOND_CHART_COLOR } from "./colors"; + +export { + // api_app + POST_LOGIN, + GET_AUTHPAGE_API, + GET_SUBAUTHPAGE_API, + GET_DEVICELIST_API, + GET_DEVICEIMME_API, + + //api_forge + GET_FORGETOKEN_API, + GET_FORGEURN_API, + AUTHPAGES, + sourceIconListForUpstreamS3, + sourceIconListForBusinessS1, + sourceIconListForBusinessS2UP, + sourceIconListForBusinessS2Down, + sourceIconListForDownstreamS3, + sourceIconListForOtherS3, + allSourceIconList, + MONTHCOLUMNS, + COLOR, + CHART_COLOR, + SECOND_CHART_COLOR, +}; diff --git a/src/directives/draggable.js b/src/directives/draggable.js new file mode 100644 index 0000000..726d156 --- /dev/null +++ b/src/directives/draggable.js @@ -0,0 +1,66 @@ +const moveModal = (elmnt) => { + console.log(elmnt); + var pos1 = 0, + pos2 = 0, + pos3 = 0, + pos4 = 0; + document.body.addEventListener("mousedown", dragMouseDown, { + passive: false, + }); + + function dragMouseDown(e) { + console.log("dragMouseDown", e); + e = e || window.event; + e.preventDefault(); + // get the mouse cursor position at startup: + pos3 = e.clientX; + pos4 = e.clientY; + document.body.addEventListener("mouseup", closeDragElement, { + passive: false, + }); + // call a function whenever the cursor moves: + document.body.addEventListener("mousemove", elementDrag, { + passive: false, + }); + } + + function elementDrag(e) { + e = e || window.event; + e.preventDefault(); + // calculate the new cursor position: + pos1 = pos3 - e.clientX; + pos2 = pos4 - e.clientY; + pos3 = e.clientX; + pos4 = e.clientY; + // set the element's new position: + elmnt.style.top = elmnt.offsetTop - pos2 + "px"; + elmnt.style.left = elmnt.offsetLeft - pos1 + "px"; + } + + function closeDragElement() { + // stop moving when mouse button is released: + document.body.removeEventListener("mouseup", closeDragElement); + document.body.removeEventListener("mousemove", elementDrag); + } +}; + +export const draggable = { + install(app) { + app.directive("draggable", { + mounted: (el, binding, vnode, prevVnode) => { + console.log("draggable", $(`#${el.id}`).draggable); + if (binding.value) { + if ($(`#${el.id}`).draggable) { + $(`#${el.id}`).draggable({ + cursor: "move", + scroll: true, + container: ".app-container", + }); + } else { + moveModal(el); + } + } + }, + }); + }, +}; diff --git a/src/directives/focusPlugin.js b/src/directives/focusPlugin.js new file mode 100644 index 0000000..d917077 --- /dev/null +++ b/src/directives/focusPlugin.js @@ -0,0 +1,9 @@ +export const focusPlugin = { + install(app) { + app.directive("focus", { + mounted: (el, binding, vnode, prevVnode) => { + el.focus(); + }, + }); + }, +}; diff --git a/src/fontawsomeIconRegister.js b/src/fontawsomeIconRegister.js new file mode 100644 index 0000000..3758302 --- /dev/null +++ b/src/fontawsomeIconRegister.js @@ -0,0 +1,136 @@ +/* import the fontawesome core */ +import { library } from "@fortawesome/fontawesome-svg-core"; + +/* import specific icons */ +import { + faHome, + faTv, + faChartArea, + faChartPie, + faChartLine, + faBell, + faServer, + faImage, + faUser, + faLeaf, + faDesktop, + faCog, + faExclamationTriangle, + faBars, + faTimes, + faAngleDown, + faUserCircle, + faCommentDots, + faCommentSlash, + faPlus, + faSearch, + faCaretRight, + faFolder, + faCloudUploadAlt, + faTrashAlt, + faChevronRight, + faChevronLeft, + faPencilAlt, + faSortUp, + faSortDown, + faFilter, + faFilePdf, + faFileExcel, + faFileWord, + faFilePowerpoint, + faFileArchive, + faFileAlt, + faDatabase, + faBuilding, + faVideo, + faFan, + faTemperatureHigh, + faLightbulb, + faBolt, + faChargingStation, + faTint, + faWater, + faCarBattery, + faFireExtinguisher, + faDoorOpen, + faCar, + faWind, + faEye, + faEyeSlash, + faGlobe, + faDownload, + faStream, + faSave, + faCrown, + faClock, + faCheckCircle +} from "@fortawesome/free-solid-svg-icons"; +import { faCircle } from "@fortawesome/free-regular-svg-icons"; + +/* add icons to the library */ +library.add( + faHome, + faTv, + faChartArea, + faChartPie, + faChartLine, + faBell, + faServer, + faImage, + faUser, + faLeaf, + faDesktop, + faCog, + faExclamationTriangle, + faBars, + faTimes, + faAngleDown, + faUserCircle, + faCommentDots, + faPlus, + faCommentSlash, + faSearch, + faCaretRight, + faFolder, + faCloudUploadAlt, + faTrashAlt, + faChevronRight, + faChevronLeft, + faPencilAlt, + faSortUp, + faSortDown, + faFilter, + faFilePdf, + faFileExcel, + faFileWord, + faFilePowerpoint, + faFileArchive, + faFileAlt, + faDatabase, + faBuilding, + faVideo, + faFan, + faTemperatureHigh, + faLightbulb, + faBolt, + faChargingStation, + faTint, + faWater, + faCarBattery, + faFireExtinguisher, + faDoorOpen, + faCar, + faWind, + faEye, + faEyeSlash, + faGlobe, + faDownload, + faStream, + faSave, + faCrown, + faClock, + faCheckCircle, + faCircle +); + +export default library; diff --git a/src/hooks/baja/useAlarmData.js b/src/hooks/baja/useAlarmData.js new file mode 100644 index 0000000..8562df3 --- /dev/null +++ b/src/hooks/baja/useAlarmData.js @@ -0,0 +1,89 @@ +import { ref, onMounted, onUnmounted } from 'vue'; +import dayjs from 'dayjs'; +import { getAllDevice } from "@/apis/building"; + +export default function useAlarmData() { + let timer = null; + const alarmData = ref([]); + const allDeviceList = ref([]); + + const getFormateDate = (datetime, formatRule = 'YYYY-MM-DD HH:mm') => { + return dayjs(datetime).format(formatRule); + }; + + const getAlarmByBaja = ( + startDate, + endDate, + isRecover, + isAck, + alarmClass, + callback + ) => { + window.require && + window.requirejs(["baja!"], (baja) => { + let alarms = []; + // console.log("進入 bajaSubscriber 準備執行BQL訂閱"); + const alarmClassQuery = alarmClass.map(ac => `alarmClass = '${ac}'`).join(' or '); + const ord = `local:|foxs:|alarm:|bql:select * where (${alarmClassQuery}) and timestamp.millis > ${startDate} and timestamp.millis < ${endDate} and sourceState = '${isRecover}' and ackState = '${isAck}' order by timestamp desc`; + baja.Ord.make(ord).get({ + cursor: { + before: () => { + timer = null; + }, + each: (record) => { + let alarmDisplayName = record.get("alarmData").get("sourceName"); + alarmDisplayName = alarmDisplayName.replace(/\$2d/g, "_"); // 檢查並替換 $2d 為 _ + const sourceTmp = alarmDisplayName.split("_"); + const bfName = sourceTmp[1] + "-" + sourceTmp[4]; + const sourceName = sourceTmp.slice(0, 8).join("_"); + const sourceTmpFinal = sourceTmp[7] + "-" + sourceTmp[8]; + if (!sourceTmpFinal.includes("undefined")) { + alarms.push({ + building_tag: bfName, + uuid: record.get("uuid").$val, + timestamp_date: getFormateDate(record.get("timestamp").getJsDate(), "YYYY/MM/DD "), + timestamp_time: getFormateDate(record.get("timestamp").getJsDate(), "HH:mm:ss"), + alarmClass: record.get("alarmClass"), + device_number: sourceName, + full_name: allDeviceList.value.find((d) => sourceName === d.device_number)?.full_name, + msg: record.get("alarmData").get("msgText"), + sourceState: record.get("sourceState").getDisplayTag(), + normalTime: getFormateDate(record.get("normalTime").getJsDate()), + ackState: record.get("ackState").getDisplayTag(), + ackedTime: getFormateDate(record.get("ackTime").getJsDate()), + }); + } + }, + after: () => { + if (typeof callback === 'function') { + callback({ count: alarms.length, data: alarms }); + } + }, + limit: -1, + offset: 0, + }, + }); + }); + }; + + const getDevice = async () => { + const res = await getAllDevice(); + allDeviceList.value = res.data; + }; + + const stopFetching = () => { + if (timer) { + clearTimeout(timer); + } + }; + + onMounted(() => { + getDevice(); + }); + + onUnmounted(() => { + stopFetching(); + }); + + return { getAlarmByBaja, alarmData, stopFetching }; +} diff --git a/src/hooks/baja/useRefrigerantHeatMap.js b/src/hooks/baja/useRefrigerantHeatMap.js new file mode 100644 index 0000000..4a68ea9 --- /dev/null +++ b/src/hooks/baja/useRefrigerantHeatMap.js @@ -0,0 +1,150 @@ +import { ref, watch, markRaw } from "vue"; + +export default function useRefrigerantTemp() { + const deviceList = ref([]); + const dataVizExtension = ref(null); + + const getBasicData = (viewer, dataVizExtn, deviceArr) => { + dataVizExtension.value = markRaw(dataVizExtn); + const devices = deviceArr.map((d) => ({ + ...d, + id: d.device_number, // An ID to identify this device + roomDbId: Number(d.room_dbid), + position: JSON.parse(d.device_coordinate_3d), // World coordinates of this device + sensorTypes: ["temperature"], // The types/properties this device exposes + temp: 10, + dbId: d.forge_dbid, + })); + deviceList.value = devices; + initHeatMap(viewer, dataVizExtn, devices); + }; + + const initHeatMap = async (viewer, dataVizExtn, deviceList) => { + const { + SurfaceShadingData, + SurfaceShadingPoint, + SurfaceShadingNode, + SurfaceShadingGroup, + } = Autodesk.DataVisualization.Core; + const shadingGroup = new SurfaceShadingGroup("iot-heatmap"); + const rooms = new Map(); + + for (const { id, roomDbId, position, sensorTypes } of deviceList) { + if (!id || roomDbId == -1) { + continue; + } + + if (!rooms.has(roomDbId)) { + const room = new SurfaceShadingNode(id, roomDbId); + shadingGroup.addChild(room); + rooms.set(roomDbId, room); + } + const room = rooms.get(roomDbId); + room.addPoint(new SurfaceShadingPoint(id, position, sensorTypes)); + } + + const shadingData = new SurfaceShadingData(); + shadingData.addChild(shadingGroup); + shadingData.initialize(viewer.model); + + await dataVizExtn.setupSurfaceShading(viewer.model, shadingData); + dataVizExtn.registerSurfaceShadingColors( + "temperature", + [0x0000ff, 0x00ff00, 0xffff00, 0xff0000] + ); + dataVizExtn.renderSurfaceShading( + "iot-heatmap", + "temperature", + getSensorValue + ); + }; + + // Function that provides sensor value in the range of [0.0, 1.0] + function getSensorValue(device, sensorType, pointData) { + const dev = deviceList.value.find( + ({ device_number }) => device_number === device.id + ); + console.log(9, device, dev); + + return (dev?.temp || 0) / 40; + } + + function updateTemp() { + console.log(8, deviceList.value, dataVizExtension.value.updateSurfaceShading); + dataVizExtension.value.updateSurfaceShading(getSensorValue); + + + } + + const transformDeviceNumber = (device_number) => { + return device_number.replaceAll("_", "/"); + }; + + const subscribeDevice = (deviceList) => { + deviceList.forEach((d) => { + const ordPath = transformDeviceNumber(d.device_number); + getRealTempByBaja(ordPath); + }); + }; + + const getRealTempByBaja = (ordPath) => { + window.require && + window.requirejs(["baja!"], (baja) => { + console.log("進入 bajaSubscriber 準備執行BQL訂閱"); + const sub = new baja.Subscriber(); + function changeDeviceValue(temp) { + const device = deviceList.value.find( + ({ device_number }) => + transformDeviceNumber(device_number) === ordPath + ); + console.log(7, device, temp); + device.temp = Number(temp.replace(" °C", "")); + updateTemp(); + } + sub.attach("changed", (prop) => { + if (prop && prop.$displayName === "Out") { + console.log(5, ordPath, prop); + if (prop.$getValue().getValueDisplay().includes(" °C")) { + changeDeviceValue(prop.$getValue().getValueDisplay()); + } + } + }); + sub.attach("subscribed", (prop) => { + if (prop && prop.$displayName === "Out") { + console.log(6, ordPath, prop); + if (prop.$getValue().getValueDisplay().includes(" °C")) { + changeDeviceValue(prop.$getValue().getValueDisplay()); + } + } + }); + // ord 為要訂閱的點位 + // ord 為要訂閱的點位 + baja.Ord.make(`local:|foxs:|station:|slot:/${ordPath}`) + .get() + .then((folder) => { + folder + .getSlots() + .is("control:NumericWritable") + .eachValue((point) => { + if ( + point.getDisplayName() === "Temp" || + point.getDisplayName() === "TEMP" + ) { + baja.Ord.make( + `local:|foxs:|station:|slot:/${ordPath}/${point.getDisplayName()}` + ).get({ subscriber: sub }); + } + }); + }); + }); + }; + + watch(deviceList, (newValue) => { + subscribeDevice(newValue); + }); + + return { + getBasicData, + updateTemp, + }; +} diff --git a/src/hooks/baja/useSystemHeatmap.js b/src/hooks/baja/useSystemHeatmap.js new file mode 100644 index 0000000..4d56f33 --- /dev/null +++ b/src/hooks/baja/useSystemHeatmap.js @@ -0,0 +1,123 @@ +// to deal with the temperature heatmap +import { ref, watch, markRaw } from "vue"; +import useSearchParams from "@/hooks/useSearchParam"; +export default function useSystemHeatmap(updateHeatBarIsShow) { + const { searchParams } = useSearchParams(); + // init heatmap + const forgeViewer = ref(null); + const dataVizExtension = ref(null); + const deviceList = ref([]); + const heatMaps = ref({}); + + const initHeatMap = async (viewer) => { + forgeViewer.value = markRaw(viewer); + const dataVizExtn = await viewer.loadExtension( + "Autodesk.DataVisualization" + ); + dataVizExtension.value = markRaw(dataVizExtn); + }; + const updateHeatMapData = (deviceArr) => { + deviceList.value = Object.values(deviceArr).map((d) => ({ + ...d, + id: d.device_number, // An ID to identify this device + roomDbId: d.room_dbid, + position: d.device_coordinate_3d, // World coordinates of this device + sensorTypes: ["temperature"], // The types/properties this device exposes + temp: 10, + dbId: d.forge_dbid, + })); + }; + + //create the heatmap + function getSensorValue(device, sensorType, pointData) { + const dev = deviceList.value.find( + ({ device_number }) => device_number === device.id + ); + console.log(9, device, dev); + + return (dev?.temp || 0) / 40; + } + + const updateTemp = (device_number, temp) => { + const subDevIndex = deviceList.value.findIndex( + (d) => d.device_number === device_number + ); + deviceList.value[subDevIndex] = { ...deviceList.value[subDevIndex], temp }; + dataVizExtension.value.updateSurfaceShading(getSensorValue); + }; + + const createHeatMap = async (heatMapName) => { + // let dataVizExtn = await viewer.loadExtension("Autodesk.DataVisualization"); + // dataVizExtension.value = markRaw(dataVizExtn); + + const { + SurfaceShadingData, + SurfaceShadingPoint, + SurfaceShadingNode, + SurfaceShadingGroup, + } = Autodesk.DataVisualization.Core; + const shadingGroup = new SurfaceShadingGroup(`iot_heatmap_${heatMapName}`); + const rooms = new Map(); + + for (const { id, roomDbId, position, sensorTypes } of deviceList.value) { + if (!id || roomDbId == -1 || !roomDbId) { + continue; + } + + if (!rooms.has(roomDbId)) { + const room = new SurfaceShadingNode(id, roomDbId); + shadingGroup.addChild(room); + rooms.set(roomDbId, room); + } + const room = rooms.get(roomDbId); + room.addPoint(new SurfaceShadingPoint(id, position, sensorTypes)); + } + + const shadingData = new SurfaceShadingData(); + shadingData.addChild(shadingGroup); + shadingData.initialize(forgeViewer.value?.model); + + await dataVizExtension.value.setupSurfaceShading( + forgeViewer.value.model, + shadingData + ); + dataVizExtension.value.registerSurfaceShadingColors( + "temperature", + [0x0000ff, 0x00ff00, 0xffff00, 0xff0000] + ); + dataVizExtension.value.renderSurfaceShading( + `iot_heatmap_${heatMapName}`, + "temperature", + getSensorValue + ); + + console.log(dataVizExtension.value); + }; + + watch(deviceList, (newValue) => { + console.log("熱圖", newValue); + switch (parseInt(searchParams.value.option)) { + case 2: + createHeatMap("frozen"); + updateHeatBarIsShow(true); + break; + case 3: + createHeatMap("gland"); + updateHeatBarIsShow(true); + break; + case 4: + createHeatMap("packing"); + break; + case 5: + createHeatMap("formula"); + updateHeatBarIsShow(true); + break; + default: + dataVizExtension.value?.removeSurfaceShading(); + updateHeatBarIsShow(false); + break; + } + }); + + return { updateHeatMapData, updateTemp, initHeatMap }; +} diff --git a/src/hooks/baja/useSystemStatusByBaja.js b/src/hooks/baja/useSystemStatusByBaja.js new file mode 100644 index 0000000..e8ba4cf --- /dev/null +++ b/src/hooks/baja/useSystemStatusByBaja.js @@ -0,0 +1,388 @@ +import { onMounted, ref, computed, watch, markRaw, inject } from "vue"; +import { getDashboardDevice } from "@/apis/dashboard"; +import useSearchParams from "@/hooks/useSearchParam"; +import useSystemHeatmap from "./useSystemHeatmap"; + +export default function useSystemStatusByBaja(updateHeatBarIsShow) { + const rawData = ref([]); + const forgeViewer = ref(null); + const urn = ref(""); + const { searchParams } = useSearchParams(); + + const initialData = ref(null); + + const updateInitialData = (data = false) => { + initialData.value = data; + }; + + const { updateHeatMapData, updateTemp, initHeatMap } = + useSystemHeatmap(updateHeatBarIsShow); + + const updateForgeViewer = (viewer) => { + if (!viewer) { + forgeViewer.value = null; + return; + } + forgeViewer.value = markRaw(viewer); + initHeatMap(viewer); + }; + + const getSubPoint = (normal, close, error, sub_points) => { + let points = { + ...Object.fromEntries(sub_points.map((p) => [p, ""])), + }; + if (normal) points[normal] = ""; + if (close) points[close] = ""; + if (error) points[error] = ""; + return points; + }; + const subscribeData = ref({}); + + watch(rawData, () => { + let sub_data = {}; + + rawData.value.forEach((d) => { + sub_data = { + ...sub_data, + ...Object.fromEntries( + d.device.map((dev) => [ + dev.device_number, + { + ...dev, + labelText: d.labelText, + show_value: d.labelText, + device_normal_point_name: d.device_normal_point_name, + device_close_point_name: d.device_close_point_name, + device_error_point_name: d.device_error_point_name, + device_normal_point_value: d.device_normal_point_value, + device_close_point_value: d.device_close_point_value, + device_error_point_value: d.device_error_point_value, + device_normal_color: d.device_normal_color, + device_close_color: d.device_close_color, + device_error_color: d.device_error_color, + forge_dbid: parseInt(dev.forge_dbid), + device_coordinate_3d: dev.device_coordinate_3d + ? JSON.parse(dev.device_coordinate_3d) + : { x: 0, y: 0 }, + points: getSubPoint( + d.device_normal_point_name, + d.device_close_point_name, + d.device_error_point_name, + d.points + ), + is_show: true, + currentColor: d.device_normal_color, + }, + ]) + ), + }; + }); + subscribeData.value = sub_data; + updateHeatMapData(sub_data); + updateSubscribeDataFromBaja(sub_data); + }); + + const visibleDbid = computed(() => { + let visible = []; + + rawData.value.forEach((d) => { + visible = [ + ...visible, + ...d.device.map((dev) => parseInt(dev.forge_dbid)), + ]; + }); + + return visible; + }); + + const getDevice = async (option = 1) => { + const res = await getDashboardDevice({ + option: parseInt(option), + }); + rawData.value = res.data.map((d) => ({ + ...d, + key: d.subSys, + })); + }; + + // subscribe from baja + const booleanPointFacets = ref({}); + const updateFacets = (point, facets) => { + booleanPointFacets.value = { + ...booleanPointFacets, + [point]: facets, + }; + }; + const updateDeviceData = (device_number, point, value) => { + const correspondPoint = initialData.value.points.find( + ({ name }) => name === point + ); + // console.log("sub 回傳值 ", typeof value) + const text = correspondPoint + ? correspondPoint.values.find( + ({ value: pValue }) => pValue === parseInt(value) + )?.text || "" + : value; + + // console.log("sub", correspondPoint, device_number, point, value); + subscribeData.value[device_number].points[point] = text; + if ( + point.toLowerCase() === "temp" && + parseInt(searchParams.value.option) > 1 + ) { + updateTemp(device_number, value); + } + if (point === subscribeData.value[device_number].device_error_point_name) { + subscribeData.value[device_number].currentColor = + value === subscribeData.value[device_number].device_error_point_value + ? subscribeData.value[device_number].device_error_color + : subscribeData.value[device_number].device_normal_color; + } + + updateLabelText(device_number, point, text); + }; + + const transformDeviceNumber = (device_number) => { + return device_number.replaceAll("_", "/"); + }; + + const updateLabelText = (key, point, value) => { + let text = subscribeData.value[key].labelText.replace(`%${point}`, value); + Object.keys(subscribeData.value[key].points) + .filter((p) => p !== point) + .forEach((p) => { + text = text.replace(`%${p}`, subscribeData.value[key].points[p]); + }); + subscribeData.value[key].show_value = text; + }; + + const subComponents = ref(null); + const updateSubscribeDataFromBaja = (data) => { + for (let [key, value] of Object.entries(data)) { + window.require && + window.requirejs(["baja!"], (baja) => { + console.log("進入 bajaSubscriber 準備執行BQL訂閱"); + + const ordPath = transformDeviceNumber(key); + baja.Ord.make(`local:|foxs:|station:|slot:/${ordPath}`) + .get() + .then((folder) => { + const batch = new baja.comm.Batch(); + + const sub = new baja.Subscriber(); + sub.attach({ + changed: function (prop, cx) { + if (prop.$getDisplayName() !== "Out") return; + if ( + Object.hasOwn( + booleanPointFacets.value, + prop.$complex.$propInParent.$slotName + ) + ) { + const facets = + booleanPointFacets.value[ + prop.$complex.$propInParent.$slotName + ]; + + for (let [facetKey, facetValue] of Object.entries(facets)) { + if (facetValue === prop.$getValue().getValueDisplay()) { + updateDeviceData( + key, + prop.$complex.$propInParent.$slotName, + facetKey + ); + } + } + } else { + updateDeviceData( + key, + prop.$complex.$propInParent.$slotName, + prop.$getValue().getValueDisplay() + ); + } + }, + }); + + folder + .getSlots() + .is("control:ControlPoint") + .eachValue((point) => { + if ( + Object.keys(value.points).includes(point.getDisplayName()) + ) { + baja.Ord.make( + `local:|foxs:|station:|slot:/${ordPath}/${point.getDisplayName()}` + ) + .get() + .then((component) => { + if ( + point.getType().getTypeSpec() === + "control:BooleanWritable" + ) { + const facets = component.getFacets1().toObject(); + updateFacets(point.getDisplayName(), facets); + for (let [facetKey, facetValue] of Object.entries( + facets + )) { + if ( + facetValue === + component.getOut().getValue().toString() + ) { + updateDeviceData( + key, + point.getDisplayName(), + facetKey + ); + } + } + } else { + updateDeviceData( + key, + point.getDisplayName(), + component.getOut().getValue() + ); + } + + sub + .subscribe({ + comps: component, // Can also just be an singular Component instance + batch, // if defined, any network calls will be batched into this object (optional) + }) + .then(() => { + console.log("subscribed successfully"); + subComponents.value = sub; + }) + .catch(function (err) { + baja.error( + "some components failed to subscribe: " + err + ); + }); + }); + } + }); + }); + }); + } + }; + + const updateDbidPosition = (viewer, data) => { + if (!viewer) return; + if (!forgeViewer.value) forgeViewer.value = markRaw(viewer); + const tree = viewer.model.getData().instanceTree; + const fragList = viewer.model.getFragmentList(); + for (let [key, value] of Object.entries(data)) { + const nodebBox = new window.THREE.Box3(); + + // for each fragId on the list, get the bounding box + tree.enumNodeFragments( + value.forge_dbid, + (fragId) => { + const fragbBox = new window.THREE.Box3(); + fragList.getWorldBounds(fragId, fragbBox); + nodebBox.union(fragbBox); // create a unifed bounding box + }, + true + ); + subscribeData.value[key].device_coordinate_3d = viewer.worldToClient( + nodebBox.getCenter() + ); + subscribeData.value[key].is_show = viewer.isNodeVisible(value.forge_dbid); + } + }; + + const fitToView = () => { + if(!searchParams.value.camera_position) return + const { x, y, z } = JSON.parse(searchParams.value.camera_position); + const newPosition = new THREE.Vector3(x, y, z); //!<<< 相机的新位置 + + const { + x: x1, + y: y1, + z: z1, + } = JSON.parse(searchParams.value.target_position); //!<<< 计算新焦点位置 + const newTarget = new THREE.Vector3(x1, y1, z1); //!<<< 焦點的新位置 + + forgeViewer.value.navigation.getCamera().setView({ + position: newPosition.clone(), + target: newTarget.clone(), + }); + setTimeout(() => { + updateDbidPosition(forgeViewer.value, subscribeData.value); + }, 700); + }; + + const hideAllObjects = (instanceTree, filDbids = []) => { + const tree = instanceTree || forgeViewer.value.model?.getInstanceTree(); + const allDbIdsStr = Object.keys(tree.nodeAccess.dbIdToIndex); + for (var i = 0; i < allDbIdsStr.length; i++) { + forgeViewer.value.hide(parseInt(allDbIdsStr[i])); + } + + for (var i = 0; i < filDbids.length; i++) { + forgeViewer.value.show(parseInt(filDbids[i])); + } + fitToView(); + forgeViewer.value.impl.invalidate(true); + }; + + const loadModel = (viewer, urn) => { + return new Promise(function (resolve, reject) { + async function onDocumentLoadSuccess(doc) { + viewer.setGroundShadow(false); + viewer.impl.renderer().setClearAlpha(0); //clear alpha channel + viewer.impl.glrenderer().setClearColor(0xffffff, 0); //set transparent background, color code does not matter + viewer.impl.invalidate(true); //trigger rendering + + const documentNode = await viewer.loadDocumentNode( + doc, + doc.getRoot().getDefaultGeometry() + ); + + resolve(documentNode); + } + function onDocumentLoadFailure(code, message, errors) { + reject({ code, message, errors }); + } + Autodesk.Viewing.Document.load( + "urn:" + urn, + onDocumentLoadSuccess, + onDocumentLoadFailure + ); + }); + }; + + const reloadModal = () => {}; + + watch(visibleDbid, (newValue) => { + forgeViewer.value && + hideAllObjects(forgeViewer.value.model.getData().instanceTree, newValue); + }); + + watch(initialData, (newValue) => { + if (newValue) { + getDevice(searchParams.value.option); + } + }); + + watch( + searchParams, + (newValue) => { + getDevice(newValue.option); + }, + { + deep: true, + } + ); + + return { + subscribeData, + visibleDbid, + updateDbidPosition, + hideAllObjects, + updateForgeViewer, + loadModel, + urn, + updateInitialData, + subComponents, + }; +} diff --git a/src/hooks/forge/useForgeFloor.js b/src/hooks/forge/useForgeFloor.js new file mode 100644 index 0000000..aa2f196 --- /dev/null +++ b/src/hooks/forge/useForgeFloor.js @@ -0,0 +1,115 @@ +import useSelectedFloor from "@/hooks/useSelectedFloor"; +import { watch, ref, inject } from "vue"; +import { useRoute } from "vue-router"; +import useSystemShowData from "@/hooks/useSystemShowData"; + +function useForgeFloor() { + const route = useRoute(); + const levelList = ref([]); + const { selectedFloor } = useSelectedFloor(); + const { subscribeData } = inject("system_deviceList"); + + const forgeViewer = ref(null); + const dataVizExtn = ref(null); + const updateViewerFloor = (viewer, dataVisualization) => { + forgeViewer.value = viewer; + dataVizExtn.value = dataVisualization; + }; + + const findLevels = () => { + forgeViewer.value.model.search( + "layer", + (nodeIds) => { + let levels = []; + const tree = forgeViewer.value.model.getInstanceTree(); + for (let i = 0; i < nodeIds.length; i++) { + const dbId = nodeIds[i]; + const name = tree.getNodeName(dbId); + if (!name || name.includes("<沒有層級>")) continue; + levels.push({ + guid: dbId, + name, + dbId, + extension: { + buildingStory: true, + structure: false, + computationHeight: 0, + groundPlane: false, + hasAssociatedViewPlans: false, + }, + }); + } + levels = levels.sort((a, b) => b.elevation - a.elevation); + console.log(levels); + levelList.value = levels; + }, + (e) => { + console.log(e); + } + ); + }; + + watch(forgeViewer, () => { + findLevels(); + }); + + const hideDbIdFn = () => { + const tree = forgeViewer.value?.model.getInstanceTree(); + const allDbIdsStr = Object.keys(tree.nodeAccess.dbIdToIndex); + for (var i = 0; i < allDbIdsStr.length; i++) { + forgeViewer.value.hide(parseInt(allDbIdsStr[i])); + } + }; + + const { flatSubData } = useSystemShowData(); + const showDbIdFn = () => { + hideDbIdFn(); + flatSubData.value.forEach((value, index) => { + forgeViewer.value.show(value.forge_dbid); + }); + + forgeViewer.value.impl.invalidate(true); + }; + + const showLevels = () => { + if (forgeViewer.value) { + const currentFloorName = + selectedFloor.value?.title?.replaceAll(/U/gi, "") || ""; + + const level = levelList.value.find(({ name }) => + name.includes(currentFloorName) + ); + console.log(currentFloorName, level); + + if (!level) { + forgeViewer.value?.impl.toggleGhosting(true); + forgeViewer.value?.fitToView([forgeViewer.value.model.getRootId()]); + showDbIdFn(); + } else { + showDbIdFn(); + // forgeViewer.value.clearSelection(); + // forgeViewer.value.model.setAllVisibility(0); + forgeViewer.value.impl.toggleGhosting(false); + // forgeViewer.value.impl.toggleGroundShadow(false); + forgeViewer.value.show(level.dbId); + forgeViewer.value.impl.invalidate(true); + forgeViewer.value.fitToView([level.dbId]); + } + } + }; + + watch( + () => route, + (newValue) => { + console.log(newValue); + newValue && showLevels(); + }, + { + deep: true, + } + ); + + return { findLevels, showLevels, updateViewerFloor }; +} + +export default useForgeFloor; diff --git a/src/hooks/forge/useForgeHeatmap.js b/src/hooks/forge/useForgeHeatmap.js new file mode 100644 index 0000000..7ae588c --- /dev/null +++ b/src/hooks/forge/useForgeHeatmap.js @@ -0,0 +1,141 @@ +import { watch, inject, markRaw, ref, computed, onMounted } from "vue"; +import { useRoute } from "vue-router"; +import useHeatmapBarStore from "@/stores/useHeatmapBarStore"; +import useSystemShowData from "@/hooks/useSystemShowData"; + +export default function useForgeHeatmap() { + const route = useRoute(); + const { subscribeData, realtimeData } = inject("system_deviceList"); + + const store = useHeatmapBarStore(); + + const forgeViewer = ref(null); + const dataVizExtn = ref(null); + const updateViewExtension = (viewer, dataVisualization) => { + forgeViewer.value = viewer; + dataVizExtn.value = dataVisualization; + }; + + //create the heatmap + function getSensorValue(device, sensorType, pointData) { + const dev = realtimeData.value.find( + ({ device_number }) => device_number === device.id + ); + if (dev) { + const [min, max] = store.heatmapConfig?.range; + const point = dev.data.find(({ point }) => point === route.query?.gas); + console.log(9, device, dev, point, (point?.value - min || 0) / max); + + return Math.random(); + } + return 0; + } + + const { flatSubData } = useSystemShowData(); + + const data = computed(() => + flatSubData.value?.map((d) => { + const pointsMap = d.points ? Object.fromEntries(d.points.map(({ point, value }) => [point, 0])) : {}; + return { + ...d, + ...pointsMap, + }; + }) + ); + + watch( + () => realtimeData, + () => { + dataVizExtn.value && + Object.keys(dataVizExtn.value?.surfaceShading)?.length && + dataVizExtn.value.updateSurfaceShading(getSensorValue); + }, + { + deep: true, + } + ); + + const createHeatMap = async () => { + if (route.query?.gas === "all" || !route.query?.gas || !dataVizExtn.value) return; + const heatMapName = `iot_heatmap_${route.query?.gas}`; + console.log("createHeatMap", heatMapName); + const { + SurfaceShadingData, + SurfaceShadingPoint, + SurfaceShadingNode, + SurfaceShadingGroup, + } = Autodesk.DataVisualization.Core; + const shadingGroup = new SurfaceShadingGroup(`${heatMapName}`); + const rooms = new Map(); + + const roomSet = new Set(data.value.filter(({ device_coordinate_3d }) => device_coordinate_3d).map(({ room_dbid }) => room_dbid)); + // 每個room是一個node + [...roomSet].forEach((roomDbId) => { + if (!roomDbId) { + return; + } + const room = new SurfaceShadingNode(`room_${roomDbId}`, roomDbId); + + //相同room內的設備 + data.value + .filter(({ room_dbid }) => room_dbid === roomDbId) + .forEach( + ({ + device_number: id, + device_coordinate_3d: position, + sensorTypes, + }) => + room.addPoint(new SurfaceShadingPoint(id, position, sensorTypes)) + ); + + shadingGroup.addChild(room); + }); + + // data.value.forEach( + // ({ + // device_number: id, + // room_dbid: roomDbId, + // device_coordinate_3d: position, + // sensorTypes, + // }) => { + // if (!id || roomDbId == -1 || !roomDbId) { + // return; + // } + // if (!rooms.has(roomDbId)) { + // const room = new SurfaceShadingNode(id, roomDbId); + // shadingGroup.addChild(room); + // rooms.set(roomDbId, room); + // } + // const room = rooms.get(roomDbId); + // room.addPoint(new SurfaceShadingPoint(id, position, route.query.gas)); + // } + // ); + const shadingData = new SurfaceShadingData(`${heatMapName}`); + shadingData.addChild(shadingGroup); + shadingData.initialize(forgeViewer.value?.model); + await dataVizExtn.value.setupSurfaceShading( + forgeViewer.value.model, + shadingData + ); + dataVizExtn.value.registerSurfaceShadingColors( + route.query?.gas, + store.heatmapConfig?.color + ); + dataVizExtn.value.renderSurfaceShading( + heatMapName, + route.query?.gas, + getSensorValue + ); + }; + + watch( + data, + (newValue, oldValue) => { + dataVizExtn.value?.removeSurfaceShading(); + createHeatMap(route.query.gas); + }, + { deep: true } + ); + + return { createHeatMap, updateViewExtension }; +} diff --git a/src/hooks/forge/useForgeSprite.js b/src/hooks/forge/useForgeSprite.js new file mode 100644 index 0000000..d0abad8 --- /dev/null +++ b/src/hooks/forge/useForgeSprite.js @@ -0,0 +1,222 @@ +import { watch, inject, markRaw, ref, computed, provide } from "vue"; +import useAlarmStore from "@/stores/useAlarmStore"; +import hexToRgb from "@/util/hexToRgb"; +import useSystemShowData from "@/hooks/useSystemShowData"; +import useForgeHeatmap from "./useForgeHeatmap"; +import useForgeFloor from "./useForgeFloor"; + +export default function useForgeSprite() { + const { subscribeData } = inject("system_deviceList"); + const { getCurrentInfoModalData, clearSelectedDeviceInfo, selected_dbid } = + inject("system_selectedDevice"); + const forgeViewer = ref(null); + const dataVizExtn = ref(null); + let lastClickedDbId = null; + + const { createHeatMap, updateViewExtension } = useForgeHeatmap(); + const { updateViewerFloor } = useForgeFloor(); + + const setCameraPosition = (position, target) => { + // 使用 THREE.Vector3 定義位置與焦點 + const newPosition = new THREE.Vector3(position.x, position.y, position.z); + const newTarget = new THREE.Vector3(target.x, target.y, target.z); + + // 設定攝影機的新位置與焦點 + forgeViewer.value.navigation.setView(newPosition, newTarget); + + // 確保 Home 視角 + forgeViewer.value.autocam.setCurrentViewAsHome(true); + }; + + const updateDataVisualization = async (viewer) => { + if (!forgeViewer.value) { + forgeViewer.value = markRaw(viewer); + } + + const dataVisualization = await viewer.loadExtension( + "Autodesk.DataVisualization" + ); + dataVizExtn.value = markRaw(dataVisualization); + updateViewExtension(markRaw(viewer), markRaw(dataVisualization)); + updateViewerFloor(markRaw(viewer), markRaw(dataVisualization)); + }; + + function onSpriteClicked(event) { + event.hasStopped = true; + + if (event.type === Autodesk.DataVisualization.Core.MOUSE_CLICK_OUT) return; + + const data = subscribeData.value.find( + (d) => + d.spriteDbId === event.dbId || d.forge_dbid === event.dbIdArray?.[0] + ); + console.log("onSpriteClicked", event.target); + console.log("onSpriteClicked", data); + // modalContent.value = data; + // debugger; + if (data) { + getCurrentInfoModalData( + event, + { left: event.target.startX, top: event.target.startY }, + data + ); + } + } + + const { flatSubData } = useSystemShowData(); + + // 創建 sprites + const createSprites = async () => { + if (dataVizExtn.value) { + dataVizExtn.value.removeAllViewables(); + const DataVizCore = Autodesk.DataVisualization.Core; + const viewableType = DataVizCore.ViewableType.SPRITE; + let spriteColor = new THREE.Color(0xffffff); + const BASEURL = import.meta.env.VITE_FORGE_BASEURL; + const spriteIconUrl = `${BASEURL}/hotspot.svg`; + const style = new DataVizCore.ViewableStyle( + viewableType, + spriteColor, + spriteIconUrl + ); + const viewableData = new DataVizCore.ViewableData(); + viewableData.spriteSize = 24; // Sprites as points of size 24 x 24 pixels + flatSubData.value?.forEach((d, index) => { + if (d.device_coordinate_3d) { + const position = d.device_coordinate_3d; + style.color = new THREE.Color(hexToRgb(d.device_normal_color)); + const viewable = new DataVizCore.SpriteViewable( + position, + style, + d.spriteDbId + ); + viewableData.addViewable(viewable); + } + }); + // await viewableData.finish(); + // dataVizExtn.value.addViewables(viewableData); + // console.log(dataVizExtn.value); + viewableData.finish().then( + () => { + dataVizExtn.value.addViewables(viewableData); + createHeatMap(); + }, + (error) => { + console.log(error); + } + ); + } + }; + + watch( + () => flatSubData, + () => { + if (forgeViewer.value?.isLoadDone()) { + createSprites(); + showSubSystemObjects(); + } + }, + { + deep: true, + } + ); + + watch( + () => selected_dbid, + () => { + if (forgeViewer.value?.isLoadDone()) { + cardfitToView(selected_dbid.value); + } + }, + { + immediate: true, + deep: true, + } + ); + + const forgeClickListener = () => { + console.log("監聽forge"); + + forgeViewer.value.addEventListener( + Autodesk.DataVisualization.Core.MOUSE_CLICK, + onSpriteClicked + ); + forgeViewer.value.addEventListener( + Autodesk.DataVisualization.Core.MOUSE_CLICK_OUT, + onSpriteClicked + ); + }; + + const cardfitToView = async ([forge_dbid, spriteDbId]) => { + try { + // 相機調整 + const nav = forgeViewer.value.navigation; + const camera = nav.getCamera(); + forgeViewer.value.fitToView([forge_dbid], null, true); + const direction = new THREE.Vector3(); + camera.getWorldDirection(direction); + const distanceBack = 30; + camera.position.add(direction.multiplyScalar(-distanceBack)); + const target = nav.getTarget(); + const fov = nav.getVerticalFov(); + nav.setRequestTransition(true, camera.position, target, fov); + + if (lastClickedDbId !== null && lastClickedDbId !== spriteDbId) { + dataVizExtn.value.invalidateViewables([lastClickedDbId], (viewable) => { + return { + scale: 1.0, // 恢復為 scale 1 + }; + }); + } + + dataVizExtn.value.invalidateViewables([spriteDbId], (viewable) => { + return { + scale: 2.0, // 設置為 scale 2 + }; + }); + + lastClickedDbId = spriteDbId; + } catch (error) { + console.error("Error in cardfitToView:", error); + } + }; + + const hideAllObjects = () => { + const tree = forgeViewer.value.model.getInstanceTree(); + const allDbIdsStr = Object.keys(tree.nodeAccess.dbIdToIndex); + for (var i = 0; i < allDbIdsStr.length; i++) { + forgeViewer.value.hide(parseInt(allDbIdsStr[i])); + } + }; + + const showSubSystemObjects = () => { + hideAllObjects(); + flatSubData.value.forEach((value, index) => { + forgeViewer.value.show(value.forge_dbid); + }); + + forgeViewer.value.impl.invalidate(true); + }; + + const clear = () => { + forgeViewer.value.removeEventListener( + Autodesk.DataVisualization.Core.MOUSE_CLICK, + onSpriteClicked + ); + forgeViewer.value.removeEventListener( + Autodesk.DataVisualization.Core.MOUSE_CLICK_OUT, + onSpriteClicked + ); + forgeViewer.value.tearDown(); + }; + + return { + createSprites, + setCameraPosition, + updateDataVisualization, + showSubSystemObjects, + forgeClickListener, + clear, + cardfitToView, + }; +} diff --git a/src/hooks/useActiveBtn.js b/src/hooks/useActiveBtn.js new file mode 100644 index 0000000..9691ab2 --- /dev/null +++ b/src/hooks/useActiveBtn.js @@ -0,0 +1,41 @@ +import { computed } from "@vue/reactivity"; +import { ref } from "vue"; +export default function useActiveBtn(type = "single") { + // default buttons + const items = ref([]); + + const setItems = (btnGroup) => { + items.value = btnGroup; + }; + + const selectedBtn = computed(() => { + if (type === "single") { + return items.value?.find((d) => { + return d.active + }); + } else if (type === "multiple") { + return items.value?.filter(({ active }) => active); + } + }); + + // change active button + const changeActiveBtn = (item) => { + if (type === "single") { + // 先將全部變成false + const newItems = Object.assign(items.value).map((it) => ({ + ...it, + active: item.key === it.key, + })); + items.value = newItems; + } else if (type === "multiple") { + // 先將全部變成false + const newItems = Object.assign(items.value).map((it) => ({ + ...it, + active: item.key === it.key ? !item.active : it.active, + })); + items.value = newItems; + } + }; + + return { items, changeActiveBtn, setItems, selectedBtn }; +} diff --git a/src/hooks/useDashboardOption.js b/src/hooks/useDashboardOption.js new file mode 100644 index 0000000..ad2117a --- /dev/null +++ b/src/hooks/useDashboardOption.js @@ -0,0 +1,20 @@ +import { inject, watch } from "vue"; + +export default function useDashboardOption( + SetFn, + injectData = "dashboard_items" +) { + const { initialData } = inject(injectData); + + watch(initialData, (newValue) => { + const data = newValue.points[1].values.filter(({ value }) => value !== 0); + SetFn( + data.map(({ value, text }, index) => ({ + title: text, + key: `option_${value}`, + active: index === 0, + typeOption: value, + })) + ); + }); +} diff --git a/src/hooks/useFormErrorMessage.js b/src/hooks/useFormErrorMessage.js new file mode 100644 index 0000000..4d40f21 --- /dev/null +++ b/src/hooks/useFormErrorMessage.js @@ -0,0 +1,50 @@ +import { onMounted, ref } from "vue"; + +export default function useFormErrorMessage(scheme) { + const formErrorMsg = ref({}); + + onMounted(() => { + // formErrorMsg.value = scheme + if (scheme) { + formErrorMsg.value = Object.fromEntries( + Object.keys(scheme.fields).map((f) => [f, ""]) + ); + } + }); + + const handleSubmit = (scheme, value) => { + return new Promise((resolve, reject) => { + scheme + .validate(value, { + abortEarly: false, + }) + .then((res) => resolve(res)) + .catch((err) => { + let errorMsg = Object.fromEntries( + err.inner.map((e) => [e.path, e.message]) + ); + formErrorMsg.value = errorMsg; + reject(errorMsg); + }); + }); + }; + + const handleErrorReset = () => { + // formErrorMsg.value = Object.fromEntries( + // Object.keys(scheme.fields).map((f) => [f, ""]) + // ); + let resetMsg = {}; + for (let key in formErrorMsg.value) { + resetMsg[key] = ""; + } + formErrorMsg.value = resetMsg; + }; + + const updateScheme = (scheme) => { + formErrorMsg.value = Object.fromEntries( + Object.keys(scheme.fields).map((f) => [f, ""]) + ); + }; + + return { formErrorMsg, handleSubmit, handleErrorReset, updateScheme }; +} diff --git a/src/hooks/useGetCookie.js b/src/hooks/useGetCookie.js new file mode 100644 index 0000000..6d150b0 --- /dev/null +++ b/src/hooks/useGetCookie.js @@ -0,0 +1,8 @@ +export default function getCookie(cookieName) { + let cookie = {}; + document.cookie.split(";").forEach(function (el) { + let [key, value] = el.split("="); + cookie[key.trim()] = value; + }); + return cookie[cookieName]; +} diff --git a/src/hooks/useGetDevice.js b/src/hooks/useGetDevice.js new file mode 100644 index 0000000..a717fe6 --- /dev/null +++ b/src/hooks/useGetDevice.js @@ -0,0 +1,31 @@ +import { ref, computed } from "vue"; +import instance from "@/util/request"; +import { GET_DEVICELIST_API } from "@/constant"; + +export default function useGetDevice() { + const deviceList = ref(null); + //取得設備列表 + const getDeviceList = async ({ + building_tag, + main_system_tag, + sub_system_tag, + floor_tag, + }) => { + const res = await instance.post(GET_DEVICELIST_API, { + building_tag, + floor_tag, + sub_system_tag, + }); + + let devices = [] + res.data.data.forEach(({device_list})=>{ + devices = [...devices, ...device_list] + }) + deviceList.value = devices; + }; + + return { + deviceList, + getDeviceList, + }; +} diff --git a/src/hooks/useSearchParam.js b/src/hooks/useSearchParam.js new file mode 100644 index 0000000..c971a02 --- /dev/null +++ b/src/hooks/useSearchParam.js @@ -0,0 +1,29 @@ +// 取得目前的params +import { computed } from "vue"; +import { useRouter, useRoute } from "vue-router"; + +export default function useSearchParam() { + const router = useRouter(); + const route = useRoute(); + + const searchParams = computed(() => route.query); + + // 排除null + + const deleteNull = (query) => { + let newQuery = {}; + for (let key in query) { + if (Array.isArray(query[key]) && query[key].length === 0) continue; + if (query[key]) { + newQuery[key] = query[key]; + } + } + return newQuery; + }; + + const changeParams = (query) => { + router.push({ path: route.path, query: deleteNull(query) }); + }; + + return { searchParams, changeParams }; +} diff --git a/src/hooks/useSelectedFloor.js b/src/hooks/useSelectedFloor.js new file mode 100644 index 0000000..986c62d --- /dev/null +++ b/src/hooks/useSelectedFloor.js @@ -0,0 +1,17 @@ +import { useRoute } from "vue-router"; +import { computed, inject, ref, watch } from "vue"; + +function useSelectedFloor() { + const { currentFloor } = inject("system_deviceList"); + const route = useRoute(); + const selectedFloor = computed(() => + currentFloor.value?.find(({ key }) => key == route.params.floor_id) + ); + + return { + selectedFloor, + currentFloor, + }; +} + +export default useSelectedFloor; diff --git a/src/hooks/useSystemShowData.js b/src/hooks/useSystemShowData.js new file mode 100644 index 0000000..97f5457 --- /dev/null +++ b/src/hooks/useSystemShowData.js @@ -0,0 +1,27 @@ +import useSelectedFloor from "@/hooks/useSelectedFloor"; +import { computed, inject, watch } from "vue"; + +function useSystemShowData() { + const { data } = inject("system_deviceList"); + const { selectedFloor } = useSelectedFloor(); + + const showData = computed(() => + selectedFloor.value?.key === "main" + ? data.value + : data.value.filter( + ({ floor_guid }) => floor_guid === selectedFloor.value?.key + ) || [] + ); + + const flatSubData = computed(() => { + let items = []; + showData.value.forEach((device) => { + items = [...items, ...device.device_list]; + }); + return items; + }); + + return { showData, flatSubData }; +} + +export default useSystemShowData; diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..9814296 --- /dev/null +++ b/src/main.js @@ -0,0 +1,60 @@ +import "./assets/index.css"; +import "./assets/main.css"; +// import "./assets/table.css"; +import "./assets/btn.css"; +import "./assets/pagination.css"; + +import { createApp } from "vue"; +import { createI18n } from "vue-i18n"; +import tw from "./config/tw.json"; +import cn from "./config/cn.json"; +import us from "./config/us.json"; +import Antd from "ant-design-vue"; +import { createPinia } from "pinia"; +import App from "./App.vue"; +import router from "./router"; +import "virtual:svg-icons-register"; +// 引入项目中的全部全局组件 +import SvgIcon from "@/components/SvgIcon.vue"; +import library from "./fontawsomeIconRegister"; +import "flag-icons/css/flag-icons.min.css"; + +/* import font awesome icon component */ +import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome"; + +import { focusPlugin } from "@/directives/focusPlugin"; +import { draggable } from "@/directives/draggable"; +const messages = { + tw, + cn, + us, +}; + +const storedLanguage = localStorage.getItem("EmpowerLanguage") || "tw"; + +const i18n = createI18n({ + legacy: false, + locale: storedLanguage, + fallbackLocale: 'tw', + messages, +}); +const app = createApp(App); +app.use(createPinia()); +app.use(router); +app.use(Antd); +app.use(i18n); + +// 组装成一个对象 +const allGlobalComponents = { SvgIcon, FontAwesomeIcon }; +const globalComponent = { + install(app) { + // 循环注册所有的全局组件 + Object.keys(allGlobalComponents).forEach((componentName) => { + app.component(componentName, allGlobalComponents[componentName]); + }); + }, +}; +app.use(globalComponent); +app.use(focusPlugin); +app.use(draggable); +app.mount("#app"); diff --git a/src/router/index-84b479b.js b/src/router/index-84b479b.js new file mode 100644 index 0000000000000000000000000000000000000000..01b98c515eae0513f5caa4e271f7d42d8be7d32c GIT binary patch literal 7062 zcmeHMTW=dh6h6;L{D-X{DkH%zh45JC~CC@tzkRYi{N*rv`p_>v3YzuxkFXLdY0 zv$L1P<_)dv_3q4^%QxRSGjsgu<4msQMi#P^wIuR4K12K-%K*<~IY-Mze=X(9pzST% zFXbonT*(yo8SZP9^njjQe6ApA0r`panwzelO*v zH7{U{_4rv}kp@s-xmMUdw~pI#x`| z=+KK>)pw^ptV%sI`0mD~1(NL=ew4Xdx{M&!O_!4pYUQjAAw5@r5^q)$IflkM7WKg~ zj!tk*JTLos3W}HAe+Wo+c{R280)=1eq{}H`6y%>**4S| zpTkG4DY1(C z6smeMc~!CZkZ4R4i5qZ(?Bu*pfDYHP9QefM+ULgO$M26)v(8M;8htt>dIMxT`m<5A zo`&GlWVE4Z_dPbF@ZPqsXtyN84y(=M!{WQbD#?A`Q?Y&Q_%>YIQ9Oag^)?g1ruM_4 zH`h$pC5{JJVVM=0s*4r3s4vFnGuwd1N zb(AY$%E-uo?;rTY{PkDg*yz}({ZV>T*x1c?yI0-fRQp0t+FXy^8GMP;`XwZ?%EME_ zDfq;5LmzjZJ90cFcw%jdH7Hv*;cxQ(9xd*?>~_BNll6&(;+W!_r(>R>oo?cj>?E_t z5L)eCkZmJ3s-EMtV|cXPlUN0(VwiKd$hdLn3<` z3)wQ#HumK{j88mKKWLmy^l71OTz|=zl|C8mWX}>ksohB8-k(zKKENVFoi}>!oNNEz zihh*F8qPal6;?Y~)5!37U(6*vFUuQ1-Ws!a4t;;(w?Tp)P~x*1eW`jj1Ogj)OOMQa zr|8f5nC`e!r_ac5tNpREVmKJeA-g_6Gcl*7M$#GH`1L^Y=Vy5NQ~RQXu-4Vgbz^52?~j3TqHFBE zqD1Z;%hy28VNd+K>8pC*Rlen7TFfRhO*qfJidC^uRU0fCp-(o4%y$)Q6MLy7&on!$IazF-X@rj zIWm#U(|!12?FjSR|IuW!Oc)OqukyTgi>57D;%30D>ttU{Y8ct>+0Qz$v2_+z-#b|* g9{iZH@!}$f`I&nZ_a7VAw=4Bvj>z!;J2BG#1?K=Jj{pDw literal 0 HcmV?d00001 diff --git a/src/router/index.js b/src/router/index.js new file mode 100644 index 0000000..49db595 --- /dev/null +++ b/src/router/index.js @@ -0,0 +1,116 @@ +import { createRouter, createWebHashHistory } from "vue-router"; +import useUserInfoStore from "@/stores/useUserInfoStore"; +import useGetCookie from "@/hooks/useGetCookie"; +import System from "@/views/system/System.vue"; +import SystemFloor from "@/views/system/SystemFloor.vue"; + +const router = createRouter({ + history: createWebHashHistory(import.meta.env.BASE_URL), + routes: [ + { + path: "/login", + name: "login", + component: () => import("@/views/login/Login.vue"), + }, + { + path: "/dashboard", + index: true, + name: "dashboard", + component: () => import("@/views/dashboard/Dashboard.vue"), + }, + { + path: "/system/:main_system_id/:sub_system_id", + name: "system", + component: () => import("@/views/system/System.vue"), + children: [ + { + path: ":floor_id", + name: "sub_system", + component: () => import("@/views/system/SystemMain.vue"), + }, + ], + }, + { + path: "/historyData", + name: "history", + component: () => import("@/views/history/History.vue"), + }, + { + path: "/operation", + name: "operation", + component: () => import("@/views/operation/Operation.vue"), + }, + { + path: "/graphManagement", + name: "graphManagement", + component: () => import("@/views/graphManagement/GraphManagement.vue"), + }, + { + path: "/accountManagement", + name: "accountManagement", + component: () => + import("@/views/accountManagement/AccountManagement.vue"), + }, + { + path: "/assetManagement", + name: "assetManagement", + component: () => import("@/views/AssetManagement/AssetManagement.vue"), + }, + { + path: "/alert", + name: "alert", + component: () => import("@/views/alert/AlertManagement.vue"), + }, + { + path: "/energyManagement", + name: "energyManagement", + component: () => import("@/views/energyManagement/EnergyManagement.vue"), + }, + { + path: "/setting/:main_system_id/:sub_system_id/:type", + name: "setting", + component: () => import("@/views/setting/SettingManagement.vue"), + }, + { + path: "/mytestfile/mjm", + name: "mytestfile", + component: () => import("@/views/Test.vue"), + }, + ], +}); + +router.beforeEach(async (to, from, next) => { + console.log("route", to, location, document.cookie); + // redirect to login page if not logged in and trying to access a restricted page + const publicPages = ["/login", "/"]; + const authRequired = !publicPages.includes(to.path); + const auth = useUserInfoStore(); + const token = useGetCookie("JWT-Authorization"); + const user_name = useGetCookie("user_name"); + + if (to.path === "/logout") { + document.cookie = "JWT-Authorization=; Max-Age=0"; + document.cookie = "user_name=; Max-Age=0"; + auth.user.token = ""; + auth.user.user_name = ""; + localStorage.removeItem("EmpowerBuilding"); + window.location.reload(); + next({ path: "/login" }); + } + + if ((authRequired && !token) || to.path === "/") { + auth.user.token = ""; + next({ path: "/login" }); + } else if (!authRequired) { + document.cookie = "JWT-Authorization=; Max-Age=0"; + document.cookie = "user_name=; Max-Age=0"; + auth.user.token = ""; + auth.user.user_name = ""; + } else { + auth.user.token = token; + auth.user.user_name = user_name; + } + next(); +}); + +export default router; diff --git a/src/stores/useAlarmStore.js b/src/stores/useAlarmStore.js new file mode 100644 index 0000000..7624b7d --- /dev/null +++ b/src/stores/useAlarmStore.js @@ -0,0 +1,63 @@ +import { defineStore } from "pinia"; +import { onMounted, ref } from "vue"; +import dayjs from "dayjs"; +import { getAllDevice } from "@/apis/building"; + +const useAlarmStore = defineStore("alarmData", () => { + let timer = null; + const alarmData = ref([]); + const allDeviceList = ref([]); + + const getFormateDate = (datetime, format_rule = "YYYY-MM-DD HH:mm") => { + return dayjs(datetime).format(format_rule); + }; + // get data from baja + const getAlarmDataFromBaja = () => { + const alarms = []; + const sampleDeviceNames = ["AA", "DeviceB", "DeviceC", "DeviceD"]; + const sampleMsgs = [ + "Over temperature", + "Power failure", + "Sensor malfunction", + "Connection lost", + ]; + + for (let i = 0; i < 3; i++) { + const timestamp = Date.now() - Math.floor(Math.random() * 100000000); + + const device_number = `NTPC_F1_Dust_EM_U9F_NA_AD_AA${Math.floor(Math.random() * 5) + 1}`; + + alarms.push({ + uuid: `uuid-${i+1}`, + building_tag: "U9F", + timestamp_date: new Date(timestamp).toLocaleDateString("en-US"), + timestamp_time: new Date(timestamp).toLocaleTimeString("en-US"), + alarmClass: `Class ${Math.floor(Math.random() * 3) + 1}`, + device_number, + full_name: `AA${Math.floor(Math.random() * 5) + 1}`, + msg: sampleMsgs[Math.floor(Math.random() * sampleMsgs.length)], + sourceState: "offnormal", + normalTime: new Date(timestamp).toLocaleString("en-US"), + ackState: "Unacked", + ackedTime: + Math.random() > 0.5 + ? new Date(timestamp).toLocaleString("en-US") + : null, + }); + } + + alarmData.value = alarms; + }; + + const getDevice = async () => { + const res = await getAllDevice(); + allDeviceList.value = res.data; + }; + + onMounted(() => { + getDevice(); + }); + + return { getAlarmDataFromBaja, alarmData }; +}); +export default useAlarmStore; diff --git a/src/stores/useBuildingStore.js b/src/stores/useBuildingStore.js new file mode 100644 index 0000000..40307a0 --- /dev/null +++ b/src/stores/useBuildingStore.js @@ -0,0 +1,129 @@ +import { defineStore } from "pinia"; +import { ref, computed, watch } from "vue"; +import { useRoute } from "vue-router"; +import { getBuildings, getAllSysSidebar } from "@/apis/building"; +import { getAssetFloorList, getDepartmentList } from "@/apis/asset"; +import { getSystemConfig } from "@/apis/system"; + +const useBuildingStore = defineStore("buildingInfo", () => { + // 狀態定義 + const buildings = ref([]); + const selectedBuilding = ref(null); + const floorList = ref([]); + const deptList = ref([]); + const mainSubSys = ref([]); + const sysConfig = ref([]); + + // 計算屬性 + const mainSys = computed(() => + mainSubSys.value.map(({ main_system_tag, full_name }) => ({ + main_system_tag, + full_name, + })) + ); + + const subSys = computed(() => { + let subPages = []; + mainSubSys.value.forEach(({ main_system_tag, history_Sub_systems }) => { + subPages = [ + ...subPages, + ...history_Sub_systems.map((Sub) => ({ + ...Sub, + main_system_tag, + key: Sub.sub_system_tag, + })), + ]; + }); + return subPages; + }); + + const route = useRoute(); + const selectedSystem = computed(() => { + if (route.params.sub_system_id && subSys.value.length > 0) { + return subSys.value.find((s) => s.key === route.params.sub_system_id); + } + return null; + }); + + // 獲取所有建築物 + const fetchBuildings = async () => { + const res = await getBuildings(); + buildings.value = res.data; + if (res.data.length > 0 ) { + selectedBuilding.value = res.data[0]; // 預設選第一個建築 + }else{ + selectedBuilding.value = null; // 如果沒有建築物,則設為null + } + }; + + // 獲取樓層資料 + const fetchFloorList = async (building_guid) => { + const res = await getAssetFloorList(building_guid); + floorList.value = + res.data[0]?.floors.map((d) => ({ + ...d, + title: d.full_name, + key: d.floor_guid, + })) || []; + }; + + // 獲取部門資料 + const fetchDepartmentList = async () => { + const res = await getDepartmentList(); + deptList.value = + res.data.map((d) => ({ + ...d, + title: d.name, + key: d.id, + })) || []; + }; + + // 取得大小類 + const getSubMonitorPage = async (building_guid) => { + const res = await getAllSysSidebar(building_guid); + mainSubSys.value = res.data.history_Main_Systems; + }; + + // 取得系統設定 + const getSysConfig = async (building_guid) => { + const res = await getSystemConfig(building_guid); + sysConfig.value = res.data; + }; + + // 當 selectedBuilding 改變時,更新 floorList 和 deptList 和 mainSubSys + watch(selectedBuilding, async (newBuilding) => { + if (newBuilding) { + localStorage.setItem("EmpowerBuilding", JSON.stringify(newBuilding)); + await Promise.all([ + fetchFloorList(newBuilding.building_guid), + fetchDepartmentList(), + getSubMonitorPage(newBuilding.building_guid), + getSysConfig(newBuilding.building_guid), + ]); + } + }); + + // 初始化資料 + const initialize = async () => { + await fetchBuildings(); + }; + + return { + buildings, + selectedBuilding, + floorList, + deptList, + mainSubSys, + mainSys, + subSys, + selectedSystem, + sysConfig, + fetchBuildings, + fetchFloorList, + fetchDepartmentList, + getSubMonitorPage, + initialize, + getSysConfig, + }; +}); +export default useBuildingStore; diff --git a/src/stores/useForgeDbIdStore.js b/src/stores/useForgeDbIdStore.js new file mode 100644 index 0000000..d2ace16 --- /dev/null +++ b/src/stores/useForgeDbIdStore.js @@ -0,0 +1,13 @@ +import { ref, computed } from 'vue' +import { defineStore } from 'pinia' + +const useForgeDbIdStore = defineStore('dbId', () => { + const dbId = ref([]) + function getDbIdStore(id) { + dbId.value = [id] + } + + return { dbId, getDbIdStore } +}) + +export default useForgeDbIdStore \ No newline at end of file diff --git a/src/stores/useHeatmapBarStore.js b/src/stores/useHeatmapBarStore.js new file mode 100644 index 0000000..6533620 --- /dev/null +++ b/src/stores/useHeatmapBarStore.js @@ -0,0 +1,31 @@ +import { defineStore } from "pinia"; +import axios from "axios"; +import { useRoute } from "vue-router"; +import { computed, ref, onMounted } from "vue"; + +const useHeatmapBarStore = defineStore("heatmap", () => { + const route = useRoute(); + + const allHeatMaps = ref({}); + const heatmapConfig = computed(() => allHeatMaps.value[route.query?.gas]); + + const getConfig = async () => { + const api = + import.meta.env.MODE === "production" + ? "/dist/config.json" + : "/config.json"; + const res = await axios.get(api); + console.log(res); + allHeatMaps.value = res.data.heatmap; + }; + + onMounted(() => { + getConfig(); + }); + + const heat_bar_isShow = computed(() => Boolean(heatmapConfig.value)); + + return { heatmapConfig, heat_bar_isShow }; +}); + +export default useHeatmapBarStore; diff --git a/src/stores/useUserInfoStore.js b/src/stores/useUserInfoStore.js new file mode 100644 index 0000000..b552ade --- /dev/null +++ b/src/stores/useUserInfoStore.js @@ -0,0 +1,19 @@ +import { defineStore } from "pinia"; +import { ref } from "vue"; + +const useUserInfoStore = defineStore("userInfo", () => { + const user = ref({ + token: "", + expires: 0, + user_name:"", + }); + + const auth_page = ref([]); + const updateAuthPage = (data) => { + auth_page.value = data; + }; + + return { user, auth_page, updateAuthPage }; +}); + +export default useUserInfoStore; diff --git a/src/util/apiHandler.js b/src/util/apiHandler.js new file mode 100644 index 0000000..788c2d3 --- /dev/null +++ b/src/util/apiHandler.js @@ -0,0 +1,11 @@ +const apihandler = (code, successData, errorData, cb = null) => { + return new Promise((resolve, reject) => { + if (code === "0000") { + cb && cb(successData); + resolve({ data: successData, isSuccess: true }); + } + resolve({ ...errorData, isSuccess: false }); + }); +}; + +export default apihandler; diff --git a/src/util/clearChart.js b/src/util/clearChart.js new file mode 100644 index 0000000..b8998f7 --- /dev/null +++ b/src/util/clearChart.js @@ -0,0 +1,13 @@ +const clearChart = (chart) => { + chart.setOption({ + legend: { + data: [], + }, + series: chart.getOption().series.map((d) => ({ + ...d, + data: [], + })), + }); +}; + +export default clearChart; diff --git a/src/util/downloadExcel.js b/src/util/downloadExcel.js new file mode 100644 index 0000000..38c5025 --- /dev/null +++ b/src/util/downloadExcel.js @@ -0,0 +1,42 @@ +const BASEURL = import.meta.env.VITE_API_BASEURL; + +export default function downloadExcel(res) { + let disposition = res.headers.get("Content-Disposition"); + let sDowName = ""; + if (disposition) { + // 解析出名稱 + sDowName = disposition.split(/filename\*=(?:utf-8'')?(.*)/gi)[1]; + if (sDowName.toLowerCase().startsWith("utf-8''")) + sDowName = decodeURIComponent(sDowName.replace(/utf-8''/i, "")); + else sDowName = sDowName.replace(/['"]/g, ""); + sDowName = decodeURIComponent(sDowName); + } + + let blob = res.data; + + if (window.navigator.msSaveOrOpenBlob) { + navigator.msSaveBlob(blob, sDowName); + } else { + const link = document.createElement("a"); + link.href = URL.createObjectURL(blob); + link.download = sDowName; + document.body.appendChild(link); + link.click(); + // 釋放內存 + window.URL.revokeObjectURL(link.link); + document.body.removeChild(link); + } +} + +export const downloadExcelByHref = async (url, filename) => { + const response = await fetch(url); + const blob = await response.blob(); + + const link = document.createElement("a"); + link.href = URL.createObjectURL(blob); + link.setAttribute("download", filename); + // link.setAttribute("target", "_blank"); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); +}; diff --git a/src/util/getModalPosition.js b/src/util/getModalPosition.js new file mode 100644 index 0000000..fa12076 --- /dev/null +++ b/src/util/getModalPosition.js @@ -0,0 +1,18 @@ +export default function getModalPosition(viewer, dbid) { + const tree = viewer.model.getData().instanceTree; + const fragList = viewer.model.getFragmentList(); + const nodebBox = new window.THREE.Box3(); + + // for each fragId on the list, get the bounding box + tree.enumNodeFragments( + dbid, + (fragId) => { + const fragbBox = new window.THREE.Box3(); + fragList.getWorldBounds(fragId, fragbBox); + nodebBox.union(fragbBox); // create a unifed bounding box + }, + true + ); + const pos = viewer.worldToClient(nodebBox.center()); + return { left: Math.floor(pos.x), top: Math.floor(pos.y) }; +} diff --git a/src/util/hexToRgb.js b/src/util/hexToRgb.js new file mode 100644 index 0000000..820f4fe --- /dev/null +++ b/src/util/hexToRgb.js @@ -0,0 +1,12 @@ +//hex -> rgbsensor_circle +export default function hexToRgb(hex) { + return ( + "rgb(" + + parseInt("0x" + hex.slice(1, 3)) + + "," + + parseInt("0x" + hex.slice(3, 5)) + + "," + + parseInt("0x" + hex.slice(5, 7)) + + ")" + ); +} diff --git a/src/util/request.js b/src/util/request.js new file mode 100644 index 0000000..a3f31fa --- /dev/null +++ b/src/util/request.js @@ -0,0 +1,123 @@ +import useGetCookie from "@/hooks/useGetCookie"; +import axios from "axios"; +const BASEURL = import.meta.env.VITE_API_BASEURL; + +const instance = axios.create({ + baseURL: BASEURL, + timeout: -1, + headers: { Authorization: `Bearer ${useGetCookie("JWT-Authorization")}` }, +}); + +// Add a request interceptor +instance.interceptors.request.use( + function (config) { + // Do something before request is sent + const token = useGetCookie("JWT-Authorization"); + // 取得 building_guid 並加到 headers + let buildingGuid = ""; + try { + const cviBuilding = localStorage.getItem("EmpowerBuilding"); + if (cviBuilding) { + const parsed = JSON.parse(cviBuilding); + buildingGuid = parsed.building_guid || ""; + } + } catch (e) { + buildingGuid = ""; + } + config.headers = { + Authorization: `Bearer ${token}`, + "X-Building-GUID": buildingGuid, + }; + return config; + }, + function (error) { + // Do something with request error + return Promise.reject(error); + } +); + +// Add a response interceptor +instance.interceptors.response.use( + function (response) { + // Any status code that lie within the range of 2xx cause this function to trigger + // Do something with response data + const { status, data, headers } = response; + + return { + ...data, + }; + }, + function (error) { + // Any status codes that falls outside the range of 2xx cause this function to trigger + // Do something with response error + if (error.response && error.response.status === 401) { + window.location.href = "/"; + } + return Promise.reject(error); + } +); + +export const fileInstance = axios.create({ + baseURL: BASEURL, + timeout: -1, + headers: { Authorization: `Bearer ${useGetCookie("JWT-Authorization")}` }, +}); + +// Add a request interceptor +fileInstance.interceptors.request.use( + function (config) { + // Do something before request is sent + const token = useGetCookie("JWT-Authorization"); + // 取得 building_guid 並加到 headers + let buildingGuid = ""; + try { + const cviBuilding = localStorage.getItem("EmpowerBuilding"); + if (cviBuilding) { + const parsed = JSON.parse(cviBuilding); + buildingGuid = parsed.building_guid || ""; + } + } catch (e) { + buildingGuid = ""; + } + config.headers = { + Authorization: `Bearer ${token}`, + "X-Building-GUID": buildingGuid, + }; + return config; + }, + function (error) { + // Do something with request error + return Promise.reject(error); + } +); + +// Add a response interceptor +fileInstance.interceptors.response.use( + async function (response) { + // Any status code that lie within the range of 2xx cause this function to trigger + // Do something with response data + const { status, data, headers } = response; + + console.log("@@", status, data, headers); + + let errorData = {}; + if (headers["content-type"] === "application/json; charset=utf-8") { + const blob = new Blob([data]); + const blobText = await blob.text(); + errorData = JSON.parse(blobText); + } + + return headers["content-disposition"] + ? { data, code: "0000", headers } + : { + ...errorData, + }; + }, + function (error) { + // Any status codes that falls outside the range of 2xx cause this function to trigger + // Do something with response error + return Promise.reject(error); + } +); + +export default instance; diff --git a/src/util/showChartLoading.js b/src/util/showChartLoading.js new file mode 100644 index 0000000..3499021 --- /dev/null +++ b/src/util/showChartLoading.js @@ -0,0 +1,9 @@ +const showChartLoading = (chart) => { + chart.showLoading({ + text: "Loading...", + color: "#8ee894", + maskColor: "rgba(12, 21, 54, 0.7)", + }); +}; + +export default showChartLoading; diff --git a/src/views/AssetManagement/AssetManagement.vue b/src/views/AssetManagement/AssetManagement.vue new file mode 100644 index 0000000..0bcda6b --- /dev/null +++ b/src/views/AssetManagement/AssetManagement.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/src/views/AssetManagement/components/AssetMainList.vue b/src/views/AssetManagement/components/AssetMainList.vue new file mode 100644 index 0000000..f0068c7 --- /dev/null +++ b/src/views/AssetManagement/components/AssetMainList.vue @@ -0,0 +1,134 @@ + + + + + diff --git a/src/views/AssetManagement/components/AssetMainListAddModal.vue b/src/views/AssetManagement/components/AssetMainListAddModal.vue new file mode 100644 index 0000000..2fd6fa9 --- /dev/null +++ b/src/views/AssetManagement/components/AssetMainListAddModal.vue @@ -0,0 +1,107 @@ + + + + + diff --git a/src/views/AssetManagement/components/AssetSubList.vue b/src/views/AssetManagement/components/AssetSubList.vue new file mode 100644 index 0000000..ae63968 --- /dev/null +++ b/src/views/AssetManagement/components/AssetSubList.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/src/views/AssetManagement/components/AssetSubListAddModal.vue b/src/views/AssetManagement/components/AssetSubListAddModal.vue new file mode 100644 index 0000000..924cfa6 --- /dev/null +++ b/src/views/AssetManagement/components/AssetSubListAddModal.vue @@ -0,0 +1,172 @@ + + + + + diff --git a/src/views/AssetManagement/components/AssetTable.vue b/src/views/AssetManagement/components/AssetTable.vue new file mode 100644 index 0000000..a8d6cfc --- /dev/null +++ b/src/views/AssetManagement/components/AssetTable.vue @@ -0,0 +1,247 @@ + + + + + diff --git a/src/views/AssetManagement/components/AssetTableAddModal.vue b/src/views/AssetManagement/components/AssetTableAddModal.vue new file mode 100644 index 0000000..5a8f5bd --- /dev/null +++ b/src/views/AssetManagement/components/AssetTableAddModal.vue @@ -0,0 +1,158 @@ + + + + + diff --git a/src/views/AssetManagement/components/AssetTableModalLeft.vue b/src/views/AssetManagement/components/AssetTableModalLeft.vue new file mode 100644 index 0000000..a41044b --- /dev/null +++ b/src/views/AssetManagement/components/AssetTableModalLeft.vue @@ -0,0 +1,20 @@ + + + + + diff --git a/src/views/AssetManagement/components/AssetTableModalLeftInfo.vue b/src/views/AssetManagement/components/AssetTableModalLeftInfo.vue new file mode 100644 index 0000000..16fae59 --- /dev/null +++ b/src/views/AssetManagement/components/AssetTableModalLeftInfo.vue @@ -0,0 +1,227 @@ + + + + + diff --git a/src/views/AssetManagement/components/AssetTableModalLeftInfoDept.vue b/src/views/AssetManagement/components/AssetTableModalLeftInfoDept.vue new file mode 100644 index 0000000..093debb --- /dev/null +++ b/src/views/AssetManagement/components/AssetTableModalLeftInfoDept.vue @@ -0,0 +1,161 @@ + + + + + diff --git a/src/views/AssetManagement/components/AssetTableModalLeftInfoGraph.vue b/src/views/AssetManagement/components/AssetTableModalLeftInfoGraph.vue new file mode 100644 index 0000000..90cacd2 --- /dev/null +++ b/src/views/AssetManagement/components/AssetTableModalLeftInfoGraph.vue @@ -0,0 +1,173 @@ + + + + + diff --git a/src/views/AssetManagement/components/AssetTableModalLeftInfoIoT.vue b/src/views/AssetManagement/components/AssetTableModalLeftInfoIoT.vue new file mode 100644 index 0000000..2406460 --- /dev/null +++ b/src/views/AssetManagement/components/AssetTableModalLeftInfoIoT.vue @@ -0,0 +1,290 @@ + + + + + diff --git a/src/views/AssetManagement/components/AssetTableModalLeftInfoMQTT.vue b/src/views/AssetManagement/components/AssetTableModalLeftInfoMQTT.vue new file mode 100644 index 0000000..e0258f7 --- /dev/null +++ b/src/views/AssetManagement/components/AssetTableModalLeftInfoMQTT.vue @@ -0,0 +1,255 @@ + + + + + diff --git a/src/views/AssetManagement/components/AssetTableModalLeftModule.vue b/src/views/AssetManagement/components/AssetTableModalLeftModule.vue new file mode 100644 index 0000000..effdead --- /dev/null +++ b/src/views/AssetManagement/components/AssetTableModalLeftModule.vue @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/src/views/AssetManagement/components/AssetTableModalRight.vue b/src/views/AssetManagement/components/AssetTableModalRight.vue new file mode 100644 index 0000000..4a1b472 --- /dev/null +++ b/src/views/AssetManagement/components/AssetTableModalRight.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/src/views/AssetManagement/components/AssetTableModalRightInfo.vue b/src/views/AssetManagement/components/AssetTableModalRightInfo.vue new file mode 100644 index 0000000..6689a75 --- /dev/null +++ b/src/views/AssetManagement/components/AssetTableModalRightInfo.vue @@ -0,0 +1,181 @@ + + + + + diff --git a/src/views/Test.vue b/src/views/Test.vue new file mode 100644 index 0000000..e4cff4b --- /dev/null +++ b/src/views/Test.vue @@ -0,0 +1,27 @@ + + + + + diff --git a/src/views/accountManagement/AccountManagement.vue b/src/views/accountManagement/AccountManagement.vue new file mode 100644 index 0000000..b6df707 --- /dev/null +++ b/src/views/accountManagement/AccountManagement.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/src/views/accountManagement/components/Account.vue b/src/views/accountManagement/components/Account.vue new file mode 100644 index 0000000..dc97c4e --- /dev/null +++ b/src/views/accountManagement/components/Account.vue @@ -0,0 +1,222 @@ + + + + + diff --git a/src/views/accountManagement/components/AccountModal.vue b/src/views/accountManagement/components/AccountModal.vue new file mode 100644 index 0000000..95a7bb2 --- /dev/null +++ b/src/views/accountManagement/components/AccountModal.vue @@ -0,0 +1,232 @@ + + + + + diff --git a/src/views/accountManagement/components/AccountPasswordModal.vue b/src/views/accountManagement/components/AccountPasswordModal.vue new file mode 100644 index 0000000..b365198 --- /dev/null +++ b/src/views/accountManagement/components/AccountPasswordModal.vue @@ -0,0 +1,99 @@ + + + + + diff --git a/src/views/accountManagement/components/Role.vue b/src/views/accountManagement/components/Role.vue new file mode 100644 index 0000000..93299b8 --- /dev/null +++ b/src/views/accountManagement/components/Role.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/src/views/accountManagement/components/RoleAuthModal.vue b/src/views/accountManagement/components/RoleAuthModal.vue new file mode 100644 index 0000000..6d03e45 --- /dev/null +++ b/src/views/accountManagement/components/RoleAuthModal.vue @@ -0,0 +1,208 @@ + + + + + diff --git a/src/views/alert/AlertManagement.vue b/src/views/alert/AlertManagement.vue new file mode 100644 index 0000000..910b477 --- /dev/null +++ b/src/views/alert/AlertManagement.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/src/views/alert/components/AlertQuery/AlertQuery.vue b/src/views/alert/components/AlertQuery/AlertQuery.vue new file mode 100644 index 0000000..b10a832 --- /dev/null +++ b/src/views/alert/components/AlertQuery/AlertQuery.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/src/views/alert/components/AlertQuery/AlertSearch.vue b/src/views/alert/components/AlertQuery/AlertSearch.vue new file mode 100644 index 0000000..661a409 --- /dev/null +++ b/src/views/alert/components/AlertQuery/AlertSearch.vue @@ -0,0 +1,28 @@ + + + + + diff --git a/src/views/alert/components/AlertQuery/AlertSearchAckBtns.vue b/src/views/alert/components/AlertQuery/AlertSearchAckBtns.vue new file mode 100644 index 0000000..42e9e96 --- /dev/null +++ b/src/views/alert/components/AlertQuery/AlertSearchAckBtns.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/src/views/alert/components/AlertQuery/AlertSearchNormalBtns.vue b/src/views/alert/components/AlertQuery/AlertSearchNormalBtns.vue new file mode 100644 index 0000000..0af1067 --- /dev/null +++ b/src/views/alert/components/AlertQuery/AlertSearchNormalBtns.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/src/views/alert/components/AlertQuery/AlertSearchTimeRange.vue b/src/views/alert/components/AlertQuery/AlertSearchTimeRange.vue new file mode 100644 index 0000000..ce074d3 --- /dev/null +++ b/src/views/alert/components/AlertQuery/AlertSearchTimeRange.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/src/views/alert/components/AlertQuery/AlertSearchTypesButton.vue b/src/views/alert/components/AlertQuery/AlertSearchTypesButton.vue new file mode 100644 index 0000000..2b268d4 --- /dev/null +++ b/src/views/alert/components/AlertQuery/AlertSearchTypesButton.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/src/views/alert/components/AlertQuery/AlertTable.vue b/src/views/alert/components/AlertQuery/AlertTable.vue new file mode 100644 index 0000000..abdc36f --- /dev/null +++ b/src/views/alert/components/AlertQuery/AlertTable.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/src/views/alert/components/AlertQuery/AlertTableModal.vue b/src/views/alert/components/AlertQuery/AlertTableModal.vue new file mode 100644 index 0000000..49f5a58 --- /dev/null +++ b/src/views/alert/components/AlertQuery/AlertTableModal.vue @@ -0,0 +1,326 @@ + + + + + diff --git a/src/views/alert/components/AlertSetting/AlertNoticesTable.vue b/src/views/alert/components/AlertSetting/AlertNoticesTable.vue new file mode 100644 index 0000000..2bfdfd1 --- /dev/null +++ b/src/views/alert/components/AlertSetting/AlertNoticesTable.vue @@ -0,0 +1,39 @@ + + + + + diff --git a/src/views/alert/components/AlertSetting/AlertNotifyTable.vue b/src/views/alert/components/AlertSetting/AlertNotifyTable.vue new file mode 100644 index 0000000..4589752 --- /dev/null +++ b/src/views/alert/components/AlertSetting/AlertNotifyTable.vue @@ -0,0 +1,124 @@ + + + + + diff --git a/src/views/alert/components/AlertSetting/AlertNotifyTableAddModal.vue b/src/views/alert/components/AlertSetting/AlertNotifyTableAddModal.vue new file mode 100644 index 0000000..d02d03e --- /dev/null +++ b/src/views/alert/components/AlertSetting/AlertNotifyTableAddModal.vue @@ -0,0 +1,159 @@ + + + + + diff --git a/src/views/alert/components/AlertSetting/AlertOutliersTable.vue b/src/views/alert/components/AlertSetting/AlertOutliersTable.vue new file mode 100644 index 0000000..552c684 --- /dev/null +++ b/src/views/alert/components/AlertSetting/AlertOutliersTable.vue @@ -0,0 +1,257 @@ + + + + + diff --git a/src/views/alert/components/AlertSetting/AlertOutliersTableAddModal.vue b/src/views/alert/components/AlertSetting/AlertOutliersTableAddModal.vue new file mode 100644 index 0000000..a92da1b --- /dev/null +++ b/src/views/alert/components/AlertSetting/AlertOutliersTableAddModal.vue @@ -0,0 +1,274 @@ + + + + + diff --git a/src/views/alert/components/AlertSetting/AlertSetting.vue b/src/views/alert/components/AlertSetting/AlertSetting.vue new file mode 100644 index 0000000..a1398d3 --- /dev/null +++ b/src/views/alert/components/AlertSetting/AlertSetting.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/src/views/alert/components/AlertSetting/AlertSubList.vue b/src/views/alert/components/AlertSetting/AlertSubList.vue new file mode 100644 index 0000000..3c3dc74 --- /dev/null +++ b/src/views/alert/components/AlertSetting/AlertSubList.vue @@ -0,0 +1,59 @@ + + + + + \ No newline at end of file diff --git a/src/views/alert/components/AlertSetting/AlertTimeTable.vue b/src/views/alert/components/AlertSetting/AlertTimeTable.vue new file mode 100644 index 0000000..eb440f1 --- /dev/null +++ b/src/views/alert/components/AlertSetting/AlertTimeTable.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/src/views/alert/components/AlertSetting/AlertTimeTableAddModal.vue b/src/views/alert/components/AlertSetting/AlertTimeTableAddModal.vue new file mode 100644 index 0000000..c68cf03 --- /dev/null +++ b/src/views/alert/components/AlertSetting/AlertTimeTableAddModal.vue @@ -0,0 +1,429 @@ + + + + + diff --git a/src/views/dashboard/Dashboard.vue b/src/views/dashboard/Dashboard.vue new file mode 100644 index 0000000..1ef6a7c --- /dev/null +++ b/src/views/dashboard/Dashboard.vue @@ -0,0 +1,182 @@ + + + + + diff --git a/src/views/dashboard/components/DashboardAlert.vue b/src/views/dashboard/components/DashboardAlert.vue new file mode 100644 index 0000000..7a8d6f9 --- /dev/null +++ b/src/views/dashboard/components/DashboardAlert.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/src/views/dashboard/components/DashboardEffectScatter.vue b/src/views/dashboard/components/DashboardEffectScatter.vue new file mode 100644 index 0000000..1425032 --- /dev/null +++ b/src/views/dashboard/components/DashboardEffectScatter.vue @@ -0,0 +1,151 @@ + + + + + diff --git a/src/views/dashboard/components/DashboardEffectScatterModal.vue b/src/views/dashboard/components/DashboardEffectScatterModal.vue new file mode 100644 index 0000000..b2b6278 --- /dev/null +++ b/src/views/dashboard/components/DashboardEffectScatterModal.vue @@ -0,0 +1,288 @@ + + + + + diff --git a/src/views/dashboard/components/DashboardEffectScatterModalChart.vue b/src/views/dashboard/components/DashboardEffectScatterModalChart.vue new file mode 100644 index 0000000..d496181 --- /dev/null +++ b/src/views/dashboard/components/DashboardEffectScatterModalChart.vue @@ -0,0 +1,227 @@ + + + + + diff --git a/src/views/dashboard/components/DashboardElectricity.vue b/src/views/dashboard/components/DashboardElectricity.vue new file mode 100644 index 0000000..ee619f1 --- /dev/null +++ b/src/views/dashboard/components/DashboardElectricity.vue @@ -0,0 +1,177 @@ + + + + + diff --git a/src/views/dashboard/components/DashboardElectricityModal.vue b/src/views/dashboard/components/DashboardElectricityModal.vue new file mode 100644 index 0000000..b192795 --- /dev/null +++ b/src/views/dashboard/components/DashboardElectricityModal.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/src/views/dashboard/components/DashboardEmission.vue b/src/views/dashboard/components/DashboardEmission.vue new file mode 100644 index 0000000..989f5b9 --- /dev/null +++ b/src/views/dashboard/components/DashboardEmission.vue @@ -0,0 +1,165 @@ + + + diff --git a/src/views/dashboard/components/DashboardEmissionModal.vue b/src/views/dashboard/components/DashboardEmissionModal.vue new file mode 100644 index 0000000..efea2d7 --- /dev/null +++ b/src/views/dashboard/components/DashboardEmissionModal.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/src/views/dashboard/components/DashboardFloorBar.vue b/src/views/dashboard/components/DashboardFloorBar.vue new file mode 100644 index 0000000..b5d873d --- /dev/null +++ b/src/views/dashboard/components/DashboardFloorBar.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/src/views/dashboard/components/DashboardHumidity.vue b/src/views/dashboard/components/DashboardHumidity.vue new file mode 100644 index 0000000..b5b8ccb --- /dev/null +++ b/src/views/dashboard/components/DashboardHumidity.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/src/views/dashboard/components/DashboardIndoor.vue b/src/views/dashboard/components/DashboardIndoor.vue new file mode 100644 index 0000000..056aba2 --- /dev/null +++ b/src/views/dashboard/components/DashboardIndoor.vue @@ -0,0 +1,227 @@ + + + + + diff --git a/src/views/dashboard/components/DashboardIndoorTemp.vue b/src/views/dashboard/components/DashboardIndoorTemp.vue new file mode 100644 index 0000000..13e46eb --- /dev/null +++ b/src/views/dashboard/components/DashboardIndoorTemp.vue @@ -0,0 +1,157 @@ + + + + + diff --git a/src/views/dashboard/components/DashboardProduct.vue b/src/views/dashboard/components/DashboardProduct.vue new file mode 100644 index 0000000..702e993 --- /dev/null +++ b/src/views/dashboard/components/DashboardProduct.vue @@ -0,0 +1,204 @@ + + + + diff --git a/src/views/dashboard/components/DashboardProductComplete.vue b/src/views/dashboard/components/DashboardProductComplete.vue new file mode 100644 index 0000000..97ad049 --- /dev/null +++ b/src/views/dashboard/components/DashboardProductComplete.vue @@ -0,0 +1,141 @@ + + + + + diff --git a/src/views/dashboard/components/DashboardProductCompleteModal.vue b/src/views/dashboard/components/DashboardProductCompleteModal.vue new file mode 100644 index 0000000..aa53491 --- /dev/null +++ b/src/views/dashboard/components/DashboardProductCompleteModal.vue @@ -0,0 +1,104 @@ + + + + + diff --git a/src/views/dashboard/components/DashboardProductCompleteModalRecord.vue b/src/views/dashboard/components/DashboardProductCompleteModalRecord.vue new file mode 100644 index 0000000..8e14290 --- /dev/null +++ b/src/views/dashboard/components/DashboardProductCompleteModalRecord.vue @@ -0,0 +1,125 @@ + + + + + + diff --git a/src/views/dashboard/components/DashboardProductCompleteModalTarget.vue b/src/views/dashboard/components/DashboardProductCompleteModalTarget.vue new file mode 100644 index 0000000..86d13a1 --- /dev/null +++ b/src/views/dashboard/components/DashboardProductCompleteModalTarget.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/src/views/dashboard/components/DashboardRefrig.vue b/src/views/dashboard/components/DashboardRefrig.vue new file mode 100644 index 0000000..d9b8336 --- /dev/null +++ b/src/views/dashboard/components/DashboardRefrig.vue @@ -0,0 +1,229 @@ + + + + + diff --git a/src/views/dashboard/components/DashboardRefrigTemp.vue b/src/views/dashboard/components/DashboardRefrigTemp.vue new file mode 100644 index 0000000..0b9c84c --- /dev/null +++ b/src/views/dashboard/components/DashboardRefrigTemp.vue @@ -0,0 +1,160 @@ + + + + + diff --git a/src/views/dashboard/components/DashboardSysCard.vue b/src/views/dashboard/components/DashboardSysCard.vue new file mode 100644 index 0000000..81d8a04 --- /dev/null +++ b/src/views/dashboard/components/DashboardSysCard.vue @@ -0,0 +1,157 @@ + + + + diff --git a/src/views/dashboard/components/DashboardTemp.vue b/src/views/dashboard/components/DashboardTemp.vue new file mode 100644 index 0000000..1959ca5 --- /dev/null +++ b/src/views/dashboard/components/DashboardTemp.vue @@ -0,0 +1,198 @@ + + + + + diff --git a/src/views/dashboard/components/ForgeInfoModalChart.vue b/src/views/dashboard/components/ForgeInfoModalChart.vue new file mode 100644 index 0000000..ac6bb72 --- /dev/null +++ b/src/views/dashboard/components/ForgeInfoModalChart.vue @@ -0,0 +1,219 @@ + + + + + diff --git a/src/views/energyManagement/EnergyManagement.vue b/src/views/energyManagement/EnergyManagement.vue new file mode 100644 index 0000000..16d57da --- /dev/null +++ b/src/views/energyManagement/EnergyManagement.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/src/views/energyManagement/components/BillingDegreeChart.vue b/src/views/energyManagement/components/BillingDegreeChart.vue new file mode 100644 index 0000000..c06650e --- /dev/null +++ b/src/views/energyManagement/components/BillingDegreeChart.vue @@ -0,0 +1,114 @@ + + + + + diff --git a/src/views/energyManagement/components/CurrentInformation.vue b/src/views/energyManagement/components/CurrentInformation.vue new file mode 100644 index 0000000..25b13a4 --- /dev/null +++ b/src/views/energyManagement/components/CurrentInformation.vue @@ -0,0 +1,94 @@ + + + + + diff --git a/src/views/energyManagement/components/ElectricityBillChart.vue b/src/views/energyManagement/components/ElectricityBillChart.vue new file mode 100644 index 0000000..fc8397b --- /dev/null +++ b/src/views/energyManagement/components/ElectricityBillChart.vue @@ -0,0 +1,101 @@ + + + diff --git a/src/views/energyManagement/components/EnergyChart/BillingDegreeChart.vue b/src/views/energyManagement/components/EnergyChart/BillingDegreeChart.vue new file mode 100644 index 0000000..f2f88ac --- /dev/null +++ b/src/views/energyManagement/components/EnergyChart/BillingDegreeChart.vue @@ -0,0 +1,132 @@ + + + + + diff --git a/src/views/energyManagement/components/EnergyChart/CarbonEmissionChart.vue b/src/views/energyManagement/components/EnergyChart/CarbonEmissionChart.vue new file mode 100644 index 0000000..0b8d469 --- /dev/null +++ b/src/views/energyManagement/components/EnergyChart/CarbonEmissionChart.vue @@ -0,0 +1,128 @@ + + + diff --git a/src/views/energyManagement/components/EnergyChart/CarbonEmissionModal.vue b/src/views/energyManagement/components/EnergyChart/CarbonEmissionModal.vue new file mode 100644 index 0000000..30024c0 --- /dev/null +++ b/src/views/energyManagement/components/EnergyChart/CarbonEmissionModal.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/src/views/energyManagement/components/EnergyChart/ElecConsumption.vue b/src/views/energyManagement/components/EnergyChart/ElecConsumption.vue new file mode 100644 index 0000000..460ee3e --- /dev/null +++ b/src/views/energyManagement/components/EnergyChart/ElecConsumption.vue @@ -0,0 +1,141 @@ + + + + + diff --git a/src/views/energyManagement/components/EnergyChart/EnergyChart.vue b/src/views/energyManagement/components/EnergyChart/EnergyChart.vue new file mode 100644 index 0000000..26eb9a5 --- /dev/null +++ b/src/views/energyManagement/components/EnergyChart/EnergyChart.vue @@ -0,0 +1,159 @@ + + + + + diff --git a/src/views/energyManagement/components/EnergyChart/ImmediateDemandChart.vue b/src/views/energyManagement/components/EnergyChart/ImmediateDemandChart.vue new file mode 100644 index 0000000..1d0be05 --- /dev/null +++ b/src/views/energyManagement/components/EnergyChart/ImmediateDemandChart.vue @@ -0,0 +1,186 @@ + + + + + diff --git a/src/views/energyManagement/components/EnergyChart/ImmediateDemandModal.vue b/src/views/energyManagement/components/EnergyChart/ImmediateDemandModal.vue new file mode 100644 index 0000000..bb20865 --- /dev/null +++ b/src/views/energyManagement/components/EnergyChart/ImmediateDemandModal.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/src/views/energyManagement/components/EnergyChart/IntervalBillChart.vue b/src/views/energyManagement/components/EnergyChart/IntervalBillChart.vue new file mode 100644 index 0000000..ecfd31c --- /dev/null +++ b/src/views/energyManagement/components/EnergyChart/IntervalBillChart.vue @@ -0,0 +1,166 @@ + + + + + diff --git a/src/views/energyManagement/components/EnergyChart/MonthlyElecBillChart.vue b/src/views/energyManagement/components/EnergyChart/MonthlyElecBillChart.vue new file mode 100644 index 0000000..26d8956 --- /dev/null +++ b/src/views/energyManagement/components/EnergyChart/MonthlyElecBillChart.vue @@ -0,0 +1,131 @@ + + + diff --git a/src/views/energyManagement/components/EnergyChart/UsageInformation.vue b/src/views/energyManagement/components/EnergyChart/UsageInformation.vue new file mode 100644 index 0000000..4db0856 --- /dev/null +++ b/src/views/energyManagement/components/EnergyChart/UsageInformation.vue @@ -0,0 +1,119 @@ + + + + + diff --git a/src/views/energyManagement/components/EnergyHistoryTable/EnergyActionButton.vue b/src/views/energyManagement/components/EnergyHistoryTable/EnergyActionButton.vue new file mode 100644 index 0000000..7679bc5 --- /dev/null +++ b/src/views/energyManagement/components/EnergyHistoryTable/EnergyActionButton.vue @@ -0,0 +1,136 @@ + + + + + diff --git a/src/views/energyManagement/components/EnergyHistoryTable/EnergyDataCahrt.vue b/src/views/energyManagement/components/EnergyHistoryTable/EnergyDataCahrt.vue new file mode 100644 index 0000000..edfaef3 --- /dev/null +++ b/src/views/energyManagement/components/EnergyHistoryTable/EnergyDataCahrt.vue @@ -0,0 +1,164 @@ + + + + + diff --git a/src/views/energyManagement/components/EnergyHistoryTable/EnergyDataTable.vue b/src/views/energyManagement/components/EnergyHistoryTable/EnergyDataTable.vue new file mode 100644 index 0000000..9e1b7ac --- /dev/null +++ b/src/views/energyManagement/components/EnergyHistoryTable/EnergyDataTable.vue @@ -0,0 +1,170 @@ + + + + + diff --git a/src/views/energyManagement/components/EnergyHistoryTable/EnergyHistoryTable.vue b/src/views/energyManagement/components/EnergyHistoryTable/EnergyHistoryTable.vue new file mode 100644 index 0000000..aa7d750 --- /dev/null +++ b/src/views/energyManagement/components/EnergyHistoryTable/EnergyHistoryTable.vue @@ -0,0 +1,37 @@ + + + + + diff --git a/src/views/energyManagement/components/EnergyHistoryTable/EnergySearch.vue b/src/views/energyManagement/components/EnergyHistoryTable/EnergySearch.vue new file mode 100644 index 0000000..5d5fbe9 --- /dev/null +++ b/src/views/energyManagement/components/EnergyHistoryTable/EnergySearch.vue @@ -0,0 +1,251 @@ + + + diff --git a/src/views/energyManagement/components/EnergyHistoryTable/EnergySearchTime.vue b/src/views/energyManagement/components/EnergyHistoryTable/EnergySearchTime.vue new file mode 100644 index 0000000..34f09e1 --- /dev/null +++ b/src/views/energyManagement/components/EnergyHistoryTable/EnergySearchTime.vue @@ -0,0 +1,159 @@ + + + + + diff --git a/src/views/energyManagement/components/EnergyHistoryTable/EnergySidebar.vue b/src/views/energyManagement/components/EnergyHistoryTable/EnergySidebar.vue new file mode 100644 index 0000000..2d5bbbf --- /dev/null +++ b/src/views/energyManagement/components/EnergyHistoryTable/EnergySidebar.vue @@ -0,0 +1,265 @@ + + + + + diff --git a/src/views/energyManagement/components/EnergyReport/EnergyReport.vue b/src/views/energyManagement/components/EnergyReport/EnergyReport.vue new file mode 100644 index 0000000..ec8efda --- /dev/null +++ b/src/views/energyManagement/components/EnergyReport/EnergyReport.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/views/energyManagement/components/EnergyReport/EnergyReportSearch.vue b/src/views/energyManagement/components/EnergyReport/EnergyReportSearch.vue new file mode 100644 index 0000000..ce7b62f --- /dev/null +++ b/src/views/energyManagement/components/EnergyReport/EnergyReportSearch.vue @@ -0,0 +1,197 @@ + + + + + diff --git a/src/views/energyManagement/components/EnergyReport/EnergyReportTable.vue b/src/views/energyManagement/components/EnergyReport/EnergyReportTable.vue new file mode 100644 index 0000000..eda12c3 --- /dev/null +++ b/src/views/energyManagement/components/EnergyReport/EnergyReportTable.vue @@ -0,0 +1,97 @@ + + + + + diff --git a/src/views/energyManagement/components/EnergyReport/EnergyReportTimeRange.vue b/src/views/energyManagement/components/EnergyReport/EnergyReportTimeRange.vue new file mode 100644 index 0000000..cf6e7a0 --- /dev/null +++ b/src/views/energyManagement/components/EnergyReport/EnergyReportTimeRange.vue @@ -0,0 +1,129 @@ + + + + + \ No newline at end of file diff --git a/src/views/energyManagement/components/ImmediateDemandChart.vue b/src/views/energyManagement/components/ImmediateDemandChart.vue new file mode 100644 index 0000000..c2f6ac3 --- /dev/null +++ b/src/views/energyManagement/components/ImmediateDemandChart.vue @@ -0,0 +1,138 @@ + + + + + diff --git a/src/views/energyManagement/components/UsageInformation.vue b/src/views/energyManagement/components/UsageInformation.vue new file mode 100644 index 0000000..3a5914c --- /dev/null +++ b/src/views/energyManagement/components/UsageInformation.vue @@ -0,0 +1,149 @@ + + + + + diff --git a/src/views/graphManagement/GraphManagement.vue b/src/views/graphManagement/GraphManagement.vue new file mode 100644 index 0000000..1e9074f --- /dev/null +++ b/src/views/graphManagement/GraphManagement.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/src/views/graphManagement/components/GraphModal.vue b/src/views/graphManagement/components/GraphModal.vue new file mode 100644 index 0000000..f2c8cf8 --- /dev/null +++ b/src/views/graphManagement/components/GraphModal.vue @@ -0,0 +1,178 @@ + + + + + diff --git a/src/views/graphManagement/components/GraphSidebar.vue b/src/views/graphManagement/components/GraphSidebar.vue new file mode 100644 index 0000000..6948398 --- /dev/null +++ b/src/views/graphManagement/components/GraphSidebar.vue @@ -0,0 +1,256 @@ + + + + + diff --git a/src/views/graphManagement/components/GraphSidebarDropdown.vue b/src/views/graphManagement/components/GraphSidebarDropdown.vue new file mode 100644 index 0000000..2bc32f9 --- /dev/null +++ b/src/views/graphManagement/components/GraphSidebarDropdown.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/src/views/graphManagement/components/GraphTable.vue b/src/views/graphManagement/components/GraphTable.vue new file mode 100644 index 0000000..648a46e --- /dev/null +++ b/src/views/graphManagement/components/GraphTable.vue @@ -0,0 +1,190 @@ + + + + + diff --git a/src/views/history/History.vue b/src/views/history/History.vue new file mode 100644 index 0000000..705ca0c --- /dev/null +++ b/src/views/history/History.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/src/views/history/components/HistoryActionButton.vue b/src/views/history/components/HistoryActionButton.vue new file mode 100644 index 0000000..a1c0e79 --- /dev/null +++ b/src/views/history/components/HistoryActionButton.vue @@ -0,0 +1,135 @@ + + + + + diff --git a/src/views/history/components/HistoryDataCahrt.vue b/src/views/history/components/HistoryDataCahrt.vue new file mode 100644 index 0000000..73ac973 --- /dev/null +++ b/src/views/history/components/HistoryDataCahrt.vue @@ -0,0 +1,186 @@ + + + + + diff --git a/src/views/history/components/HistoryFavoriteOption.vue b/src/views/history/components/HistoryFavoriteOption.vue new file mode 100644 index 0000000..b54c5a9 --- /dev/null +++ b/src/views/history/components/HistoryFavoriteOption.vue @@ -0,0 +1,205 @@ + + + + + diff --git a/src/views/history/components/HistorySearch.vue b/src/views/history/components/HistorySearch.vue new file mode 100644 index 0000000..be12808 --- /dev/null +++ b/src/views/history/components/HistorySearch.vue @@ -0,0 +1,252 @@ + + + diff --git a/src/views/history/components/HistorySearchTime.vue b/src/views/history/components/HistorySearchTime.vue new file mode 100644 index 0000000..32a4662 --- /dev/null +++ b/src/views/history/components/HistorySearchTime.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/src/views/history/components/HistorySidebar.vue b/src/views/history/components/HistorySidebar.vue new file mode 100644 index 0000000..3b5a11c --- /dev/null +++ b/src/views/history/components/HistorySidebar.vue @@ -0,0 +1,295 @@ + + + + + diff --git a/src/views/history/components/HistoryTable.vue b/src/views/history/components/HistoryTable.vue new file mode 100644 index 0000000..f236c28 --- /dev/null +++ b/src/views/history/components/HistoryTable.vue @@ -0,0 +1,116 @@ + + + + + diff --git a/src/views/login/Login.vue b/src/views/login/Login.vue new file mode 100644 index 0000000..70d1e22 --- /dev/null +++ b/src/views/login/Login.vue @@ -0,0 +1,102 @@ + + + + + diff --git a/src/views/operation/Operation.vue b/src/views/operation/Operation.vue new file mode 100644 index 0000000..6fe3022 --- /dev/null +++ b/src/views/operation/Operation.vue @@ -0,0 +1,140 @@ + + + + + diff --git a/src/views/operation/components/OperationActionButton.vue b/src/views/operation/components/OperationActionButton.vue new file mode 100644 index 0000000..a4d40dd --- /dev/null +++ b/src/views/operation/components/OperationActionButton.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/src/views/operation/components/OperationSearch.vue b/src/views/operation/components/OperationSearch.vue new file mode 100644 index 0000000..fadc6b9 --- /dev/null +++ b/src/views/operation/components/OperationSearch.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/src/views/operation/components/OperationSearchSubSys.vue b/src/views/operation/components/OperationSearchSubSys.vue new file mode 100644 index 0000000..9b24cf6 --- /dev/null +++ b/src/views/operation/components/OperationSearchSubSys.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/src/views/operation/components/OperationSearchType.vue b/src/views/operation/components/OperationSearchType.vue new file mode 100644 index 0000000..f8719bf --- /dev/null +++ b/src/views/operation/components/OperationSearchType.vue @@ -0,0 +1,158 @@ + + + + + diff --git a/src/views/operation/components/OperationTable.vue b/src/views/operation/components/OperationTable.vue new file mode 100644 index 0000000..8037178 --- /dev/null +++ b/src/views/operation/components/OperationTable.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/src/views/operation/components/OperationTableModal.vue b/src/views/operation/components/OperationTableModal.vue new file mode 100644 index 0000000..c33a7c6 --- /dev/null +++ b/src/views/operation/components/OperationTableModal.vue @@ -0,0 +1,452 @@ + + + + + diff --git a/src/views/operation/constant/OperationTableColumns.js b/src/views/operation/constant/OperationTableColumns.js new file mode 100644 index 0000000..bc2db76 --- /dev/null +++ b/src/views/operation/constant/OperationTableColumns.js @@ -0,0 +1,57 @@ +export const getFIX_COL = (t) => [ + { + title: t("operation.project"), + key: "work_type_name", + }, + // { + // title: t("operation.location"), + // key: "location", + // }, + { + title: t("operation.uuid"), + key: "error_code", + }, + { + title: t("operation.form_number"), + key: "formId", + }, + { + title: t("operation.device_name"), + key: "device_name", + }, + { + title: t("operation.status"), + key: "status_name", + filter: true, + }, + { + title: t("operation.staff"), + key: "user_full_name", + filter: true, + }, + { + title: t("operation.start_time"), + key: "start_time", + sort: true, + }, + { + title: t("operation.upload"), + key: "lorf", + width: "15%", + }, + { + title: t("operation.finish_time"), + key: "finish_time", + sort: true, + }, + { + title: t("operation.updated_time"), + key: "updated_at", + sort: true, + }, + { + title: t("operation.operation"), + key: "operation", + width: 200, + }, +]; diff --git a/src/views/setting/SettingManagement.vue b/src/views/setting/SettingManagement.vue new file mode 100644 index 0000000..4555ff3 --- /dev/null +++ b/src/views/setting/SettingManagement.vue @@ -0,0 +1,51 @@ + + diff --git a/src/views/setting/components/Building.vue b/src/views/setting/components/Building.vue new file mode 100644 index 0000000..4bd1968 --- /dev/null +++ b/src/views/setting/components/Building.vue @@ -0,0 +1,108 @@ + + + + + diff --git a/src/views/setting/components/BuildingModal.vue b/src/views/setting/components/BuildingModal.vue new file mode 100644 index 0000000..0885c59 --- /dev/null +++ b/src/views/setting/components/BuildingModal.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/src/views/setting/components/Demand.vue b/src/views/setting/components/Demand.vue new file mode 100644 index 0000000..8453490 --- /dev/null +++ b/src/views/setting/components/Demand.vue @@ -0,0 +1,169 @@ + + + + + diff --git a/src/views/setting/components/Dept.vue b/src/views/setting/components/Dept.vue new file mode 100644 index 0000000..7569a3f --- /dev/null +++ b/src/views/setting/components/Dept.vue @@ -0,0 +1,98 @@ + + + + + diff --git a/src/views/setting/components/DeptModal.vue b/src/views/setting/components/DeptModal.vue new file mode 100644 index 0000000..be9d1d3 --- /dev/null +++ b/src/views/setting/components/DeptModal.vue @@ -0,0 +1,86 @@ + + + + + diff --git a/src/views/setting/components/ElecPriceManagement.vue b/src/views/setting/components/ElecPriceManagement.vue new file mode 100644 index 0000000..648e00d --- /dev/null +++ b/src/views/setting/components/ElecPriceManagement.vue @@ -0,0 +1,105 @@ + + + + + diff --git a/src/views/setting/components/ElecPriceRes.vue b/src/views/setting/components/ElecPriceRes.vue new file mode 100644 index 0000000..07b201a --- /dev/null +++ b/src/views/setting/components/ElecPriceRes.vue @@ -0,0 +1,434 @@ + + + + + diff --git a/src/views/setting/components/ElecPriceStd.vue b/src/views/setting/components/ElecPriceStd.vue new file mode 100644 index 0000000..0d4791c --- /dev/null +++ b/src/views/setting/components/ElecPriceStd.vue @@ -0,0 +1,729 @@ + + + + + diff --git a/src/views/setting/components/ElecType.vue b/src/views/setting/components/ElecType.vue new file mode 100644 index 0000000..5942a92 --- /dev/null +++ b/src/views/setting/components/ElecType.vue @@ -0,0 +1,105 @@ + + + + + diff --git a/src/views/setting/components/ElecTypeModal.vue b/src/views/setting/components/ElecTypeModal.vue new file mode 100644 index 0000000..0038d5c --- /dev/null +++ b/src/views/setting/components/ElecTypeModal.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/src/views/setting/components/Floors.vue b/src/views/setting/components/Floors.vue new file mode 100644 index 0000000..ee6a4b1 --- /dev/null +++ b/src/views/setting/components/Floors.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/src/views/setting/components/FloorsModal.vue b/src/views/setting/components/FloorsModal.vue new file mode 100644 index 0000000..807709a --- /dev/null +++ b/src/views/setting/components/FloorsModal.vue @@ -0,0 +1,112 @@ + + + + + diff --git a/src/views/setting/components/MQTTCheckboxTree.vue b/src/views/setting/components/MQTTCheckboxTree.vue new file mode 100644 index 0000000..d260334 --- /dev/null +++ b/src/views/setting/components/MQTTCheckboxTree.vue @@ -0,0 +1,91 @@ + + + \ No newline at end of file diff --git a/src/views/setting/components/MQTTList.vue b/src/views/setting/components/MQTTList.vue new file mode 100644 index 0000000..3e103db --- /dev/null +++ b/src/views/setting/components/MQTTList.vue @@ -0,0 +1,279 @@ + + + + + diff --git a/src/views/setting/components/MQTTListAddModal.vue b/src/views/setting/components/MQTTListAddModal.vue new file mode 100644 index 0000000..c88c45a --- /dev/null +++ b/src/views/setting/components/MQTTListAddModal.vue @@ -0,0 +1,246 @@ + + + + + diff --git a/src/views/setting/components/PointList.vue b/src/views/setting/components/PointList.vue new file mode 100644 index 0000000..f45e4db --- /dev/null +++ b/src/views/setting/components/PointList.vue @@ -0,0 +1,155 @@ + + + + + diff --git a/src/views/setting/components/PointListAddModal.vue b/src/views/setting/components/PointListAddModal.vue new file mode 100644 index 0000000..1ebb4eb --- /dev/null +++ b/src/views/setting/components/PointListAddModal.vue @@ -0,0 +1,175 @@ + + + + + diff --git a/src/views/setting/components/Vendor.vue b/src/views/setting/components/Vendor.vue new file mode 100644 index 0000000..cb087c4 --- /dev/null +++ b/src/views/setting/components/Vendor.vue @@ -0,0 +1,128 @@ + + + + + diff --git a/src/views/setting/components/VendorModal.vue b/src/views/setting/components/VendorModal.vue new file mode 100644 index 0000000..8fff154 --- /dev/null +++ b/src/views/setting/components/VendorModal.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/src/views/system/System.vue b/src/views/system/System.vue new file mode 100644 index 0000000..aa336fc --- /dev/null +++ b/src/views/system/System.vue @@ -0,0 +1,303 @@ + + + + + \ No newline at end of file diff --git a/src/views/system/SystemFloor.vue b/src/views/system/SystemFloor.vue new file mode 100644 index 0000000..452aee4 --- /dev/null +++ b/src/views/system/SystemFloor.vue @@ -0,0 +1,198 @@ + + + + + diff --git a/src/views/system/SystemMain.vue b/src/views/system/SystemMain.vue new file mode 100644 index 0000000..4c5cb6f --- /dev/null +++ b/src/views/system/SystemMain.vue @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/src/views/system/components/SystemCard.vue b/src/views/system/components/SystemCard.vue new file mode 100644 index 0000000..feaa56d --- /dev/null +++ b/src/views/system/components/SystemCard.vue @@ -0,0 +1,214 @@ + + + + + diff --git a/src/views/system/components/SystemDeptBar.vue b/src/views/system/components/SystemDeptBar.vue new file mode 100644 index 0000000..2c9a06c --- /dev/null +++ b/src/views/system/components/SystemDeptBar.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/src/views/system/components/SystemFloorBar.vue b/src/views/system/components/SystemFloorBar.vue new file mode 100644 index 0000000..2203a5e --- /dev/null +++ b/src/views/system/components/SystemFloorBar.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/src/views/system/components/SystemInfoModal.vue b/src/views/system/components/SystemInfoModal.vue new file mode 100644 index 0000000..0917efe --- /dev/null +++ b/src/views/system/components/SystemInfoModal.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/src/views/system/components/SystemInfoModalChart.vue b/src/views/system/components/SystemInfoModalChart.vue new file mode 100644 index 0000000..b0d74fe --- /dev/null +++ b/src/views/system/components/SystemInfoModalChart.vue @@ -0,0 +1,194 @@ + + + + + diff --git a/src/views/system/components/SystemInfoModalCog.vue b/src/views/system/components/SystemInfoModalCog.vue new file mode 100644 index 0000000..49ae667 --- /dev/null +++ b/src/views/system/components/SystemInfoModalCog.vue @@ -0,0 +1,71 @@ + + + + + diff --git a/src/views/system/components/SystemInfoModalContent.vue b/src/views/system/components/SystemInfoModalContent.vue new file mode 100644 index 0000000..1d2e7f6 --- /dev/null +++ b/src/views/system/components/SystemInfoModalContent.vue @@ -0,0 +1,63 @@ + + + + + \ No newline at end of file diff --git a/src/views/system/components/SystemInfoModalDesktop.vue b/src/views/system/components/SystemInfoModalDesktop.vue new file mode 100644 index 0000000..02cd2ea --- /dev/null +++ b/src/views/system/components/SystemInfoModalDesktop.vue @@ -0,0 +1,77 @@ + + + + + diff --git a/src/views/system/components/SystemInfoModalImage.vue b/src/views/system/components/SystemInfoModalImage.vue new file mode 100644 index 0000000..c8e6cab --- /dev/null +++ b/src/views/system/components/SystemInfoModalImage.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/src/views/system/components/SystemMode.vue b/src/views/system/components/SystemMode.vue new file mode 100644 index 0000000..266acc4 --- /dev/null +++ b/src/views/system/components/SystemMode.vue @@ -0,0 +1,47 @@ + + + + + \ No newline at end of file diff --git a/src/views/system/components/SystemSubBar.vue b/src/views/system/components/SystemSubBar.vue new file mode 100644 index 0000000..a5875b3 --- /dev/null +++ b/src/views/system/components/SystemSubBar.vue @@ -0,0 +1,55 @@ + + + + + \ No newline at end of file diff --git a/stats.html b/stats.html new file mode 100644 index 0000000..a3c2d83 --- /dev/null +++ b/stats.html @@ -0,0 +1,4949 @@ + + + + + + + + Rollup Visualizer + + + +

+ + + + + diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..95ba9d2 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,44 @@ +module.exports = { + content: [ + "./src/**/*.{vue,js,ts}", + "./node_modules/vue-tailwind-datepicker/**/*.js", + ], + purge: ["./index.html", "./src/**/*.{vue,js,ts,jsx,tsx}"], + darkMode: false, + theme: { + extend: { + backgroundImage: { + navbar: + "linear-gradient(to bottom,rgba(0, 15, 125, 0.9),rgba(0, 96, 255, 0.9))", + normal: + "linear-gradient(180deg,rgba(127, 237, 193, 0.1),rgba(0, 0, 0, 0),rgba(127, 237, 193, 0.1))", + }, + colors: { + dark: "#111", + warning: "#ffe448", + "sub-warning": "#BEAC53", + info: "#35eded", + "dark-info": "#24272c", + "light-info": "#83e0ea", + success: "#8ee894", + "sub-success": "#808B68", + "success-content": "#8ee894", + body: "#02101B", + danger: "#722e3c", + active: "#6fdda8", + innerTable: "rgba(111, 221, 168, 0.1)", + error: "#ff033e", + }, + boxShadow: { + custom: "0px 0px 10px 1px rgba(255, 255, 255, 0.8)", + }, + }, + }, + variants: { + extend: {}, + }, + plugins: [require("daisyui")], + daisyui: { + themes: ["synthwave", "dracula"], + }, +}; diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..9f03cdd --- /dev/null +++ b/vite.config.js @@ -0,0 +1,50 @@ +import { fileURLToPath, URL } from "node:url"; +import { defineConfig } from "vite"; +import vue from "@vitejs/plugin-vue"; +import Components from "unplugin-vue-components/vite"; +import { AntDesignVueResolver } from "unplugin-vue-components/resolvers"; +import { createSvgIconsPlugin } from "vite-plugin-svg-icons"; +import path from "path"; + +// https://vitejs.dev/config/ +export default defineConfig({ + base: process.env.NODE_ENV === "production" ? "./" : "/", + build: { + outDir: "./dist", + emptyOutDir: true, + }, + server: { + proxy: { + "/upload": { + target: "https://ibms-empower2.production.mjmtech.com.tw", + changeOrigin: true, + secure: false, + }, + }, + }, + plugins: [ + vue(), + Components({ + resolvers: [ + AntDesignVueResolver({ + importStyle: false, // css in js + }), + ], + }), + createSvgIconsPlugin({ + iconDirs: [path.resolve(process.cwd(), "src/assets/icon")], + symbolId: "icon-[dir]-[name]", + }), + ], + css: { + preprocessorOptions: { + scss: {}, + }, + }, + resolve: { + alias: { + "@": fileURLToPath(new URL("./src", import.meta.url)), + "@ASSET": fileURLToPath(new URL("./src/assets", import.meta.url)), + }, + }, +});