1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-22 18:50:08 +03:00

F #5637: Add material timepicker (#1667)

(cherry picked from commit b88e478f04e3441e91bc657b6657a56a6668e453)
This commit is contained in:
Sergio Betanzos 2021-12-14 12:43:40 +01:00 committed by Tino Vazquez
parent 1deb13bd45
commit f1f2d19d88
No known key found for this signature in database
GPG Key ID: 14201E424D02047E
20 changed files with 368 additions and 353 deletions

View File

@ -26,7 +26,7 @@
"@loadable/component": "5.15.0",
"@loadable/server": "5.15.1",
"@loadable/webpack-plugin": "5.15.1",
"@mui/lab": "5.0.0-alpha.54",
"@mui/lab": "5.0.0-alpha.59",
"@mui/material": "5.1.0",
"@mui/styles": "5.1.0",
"@mui/system": "5.1.0",
@ -46,7 +46,6 @@
"dompurify": "2.2.6",
"express": "4.17.1",
"fast-xml-parser": "3.19.0",
"flatpickr": "4.6.9",
"fs-extra": "9.0.1",
"fuse.js": "6.4.1",
"helmet": "4.1.1",
@ -60,7 +59,7 @@
"jsonwebtoken": "8.5.1",
"jwt-simple": "0.5.6",
"lockfile": "1.0.4",
"luxon": "1.28.0",
"luxon": "2.1.1",
"marked": "2.0.0",
"morgan": "1.10.0",
"multer": "1.4.3",
@ -74,7 +73,6 @@
"react": "17.0.2",
"react-beautiful-dnd": "13.1.0",
"react-dom": "17.0.2",
"react-flatpickr": "3.10.7",
"react-flow-renderer": "9.6.0",
"react-hook-form": "7.18.1",
"react-json-pretty": "2.2.0",
@ -1850,9 +1848,9 @@
}
},
"node_modules/@emotion/babel-plugin": {
"version": "11.3.0",
"resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.3.0.tgz",
"integrity": "sha512-UZKwBV2rADuhRp+ZOGgNWg2eYgbzKzQXfQPtJbu/PLy8onurxlNCLvxMQEvlr1/GudguPI5IU9qIY1+2z1M5bA==",
"version": "11.7.1",
"resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.7.1.tgz",
"integrity": "sha512-K3/6Y+J/sIAjplf3uIteWLhPuOyuMNnE+iyYnTF/m294vc6IL90kTHp7y8ldZYbpKlP17rpOWDKM9DvTcrOmNQ==",
"dependencies": {
"@babel/helper-module-imports": "^7.12.13",
"@babel/plugin-syntax-jsx": "^7.12.13",
@ -1865,22 +1863,22 @@
"escape-string-regexp": "^4.0.0",
"find-root": "^1.1.0",
"source-map": "^0.5.7",
"stylis": "^4.0.3"
"stylis": "4.0.13"
},
"peerDependencies": {
"@babel/core": "^7.0.0"
}
},
"node_modules/@emotion/cache": {
"version": "11.6.0",
"resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.6.0.tgz",
"integrity": "sha512-ElbsWY1KMwEowkv42vGo0UPuLgtPYfIs9BxxVrmvsaJVvktknsHYYlx5NQ5g6zLDcOTyamlDc7FkRg2TAcQDKQ==",
"version": "11.7.1",
"resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz",
"integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==",
"dependencies": {
"@emotion/memoize": "^0.7.4",
"@emotion/sheet": "^1.1.0",
"@emotion/utils": "^1.0.0",
"@emotion/weak-memoize": "^0.2.5",
"stylis": "^4.0.10"
"stylis": "4.0.13"
}
},
"node_modules/@emotion/hash": {
@ -2168,6 +2166,42 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@mui/base": {
"version": "5.0.0-alpha.59",
"resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.59.tgz",
"integrity": "sha512-rPgN2FW0FAjQ9+LQ+XBsq3DFcuiiMFhf8uoLJAWnnzft27IJvJqbrhfpCZ68G6l+umJLbbl5RIIbpt8ALZDDNQ==",
"dependencies": {
"@babel/runtime": "^7.16.3",
"@emotion/is-prop-valid": "^1.1.1",
"@mui/utils": "^5.2.3",
"@popperjs/core": "^2.4.4",
"clsx": "^1.1.1",
"prop-types": "^15.7.2",
"react-is": "^17.0.2"
},
"engines": {
"node": ">=12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/mui"
},
"peerDependencies": {
"@types/react": "^16.8.6 || ^17.0.0",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
}
}
},
"node_modules/@mui/base/node_modules/react-is": {
"version": "17.0.2",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
"integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
},
"node_modules/@mui/core": {
"version": "5.0.0-alpha.54",
"resolved": "https://registry.npmjs.org/@mui/core/-/core-5.0.0-alpha.54.tgz",
@ -2201,33 +2235,37 @@
"integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
},
"node_modules/@mui/lab": {
"version": "5.0.0-alpha.54",
"resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.54.tgz",
"integrity": "sha512-G7Ic9TQkWT+DA8AUYKU99sQivFjz3WEuy3SsG9I/zc9DanlmUH26F1jdwUcHhEiCNEif7tEzVtIAPhgSGjbgsg==",
"version": "5.0.0-alpha.59",
"resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.59.tgz",
"integrity": "sha512-B+7EkbM+NRuUFFPzG2lqbyI73FM3W19RFkrWJdNZ+gd6C+NTdHdVS9UxSZm54PmSFEnd77wAWKdrIkhcFzEgZQ==",
"dependencies": {
"@babel/runtime": "^7.16.0",
"@babel/runtime": "^7.16.3",
"@date-io/date-fns": "^2.11.0",
"@date-io/dayjs": "^2.11.0",
"@date-io/luxon": "^2.11.1",
"@date-io/moment": "^2.11.0",
"@mui/core": "5.0.0-alpha.54",
"@mui/system": "^5.1.0",
"@mui/utils": "^5.1.0",
"@mui/base": "5.0.0-alpha.59",
"@mui/system": "^5.2.3",
"@mui/utils": "^5.2.3",
"clsx": "^1.1.1",
"prop-types": "^15.7.2",
"react-is": "^17.0.2",
"react-transition-group": "^4.4.2",
"rifm": "^0.12.0"
"rifm": "^0.12.1"
},
"engines": {
"node": ">=12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/mui"
},
"peerDependencies": {
"@mui/material": "^5.0.0",
"@types/react": "^16.8.6 || ^17.0.0",
"date-fns": "^2.25.0",
"dayjs": "^1.10.7",
"luxon": "^1.28.0",
"luxon": "^1.28.0 || ^2.0.0",
"moment": "^2.29.1",
"react": "^17.0.2",
"react-dom": "^17.0.2"
@ -2250,6 +2288,45 @@
}
}
},
"node_modules/@mui/lab/node_modules/@mui/system": {
"version": "5.2.3",
"resolved": "https://registry.npmjs.org/@mui/system/-/system-5.2.3.tgz",
"integrity": "sha512-YvkjmqgOruZgr+IkueRns99gl3MmnNs8BhnlZosYMLzKz/1lY0JqVBFqUh4sGVbD0UEKFwdk8H31itG5OIPChA==",
"dependencies": {
"@babel/runtime": "^7.16.3",
"@mui/private-theming": "^5.2.3",
"@mui/styled-engine": "^5.2.0",
"@mui/types": "^7.1.0",
"@mui/utils": "^5.2.3",
"clsx": "^1.1.1",
"csstype": "^3.0.10",
"prop-types": "^15.7.2"
},
"engines": {
"node": ">=12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/mui"
},
"peerDependencies": {
"@emotion/react": "^11.5.0",
"@emotion/styled": "^11.3.0",
"@types/react": "^16.8.6 || ^17.0.0",
"react": "^17.0.2"
},
"peerDependenciesMeta": {
"@emotion/react": {
"optional": true
},
"@emotion/styled": {
"optional": true
},
"@types/react": {
"optional": true
}
}
},
"node_modules/@mui/lab/node_modules/react-is": {
"version": "17.0.2",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
@ -5082,9 +5159,9 @@
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
},
"node_modules/electron-to-chromium": {
"version": "1.4.14",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.14.tgz",
"integrity": "sha512-RsGkAN9JEAYMObS72kzUsPPcPGMqX1rBqGuXi9aa4TBKLzICoLf+DAAtd0fVFzrniJqYzpby47gthCUoObfs0Q=="
"version": "1.4.16",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.16.tgz",
"integrity": "sha512-BQb7FgYwnu6haWLU63/CdVW+9xhmHls3RCQUFiV4lvw3wimEHTVcUk2hkuZo76QhR8nnDdfZE7evJIZqijwPdA=="
},
"node_modules/elliptic": {
"version": "6.5.4",
@ -6579,11 +6656,6 @@
"node": "^10.12.0 || >=12.0.0"
}
},
"node_modules/flatpickr": {
"version": "4.6.9",
"resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.9.tgz",
"integrity": "sha512-F0azNNi8foVWKSF+8X+ZJzz8r9sE1G4hl06RyceIaLvyltKvDl6vqk9Lm/6AUUCi5HWaIjiUbk7UpeE/fOXOpw=="
},
"node_modules/flatted": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz",
@ -7576,9 +7648,9 @@
"integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU="
},
"node_modules/is-negative-zero": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
"integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
"integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
"engines": {
"node": ">= 0.4"
},
@ -7687,11 +7759,11 @@
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
},
"node_modules/is-weakref": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz",
"integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
"integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
"dependencies": {
"call-bind": "^1.0.0"
"call-bind": "^1.0.2"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@ -7721,9 +7793,9 @@
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
},
"node_modules/jest-worker": {
"version": "27.4.2",
"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.2.tgz",
"integrity": "sha512-0QMy/zPovLfUPyHuOuuU4E+kGACXXE84nRnq6lBVI9GJg5DCBiA97SATi+ZP8CpiJwEQy1oCPjRBf8AnLjN+Ag==",
"version": "27.4.4",
"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.4.tgz",
"integrity": "sha512-jfwxYJvfua1b1XkyuyPh01ATmgg4e5fPM/muLmhy9Qc6dmiwacQB0MLHaU6IjEsv/+nAixHGxTn8WllA27Pn0w==",
"dependencies": {
"@types/node": "*",
"merge-stream": "^2.0.0",
@ -8240,11 +8312,11 @@
}
},
"node_modules/luxon": {
"version": "1.28.0",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.0.tgz",
"integrity": "sha512-TfTiyvZhwBYM/7QdAVDh+7dBTBA29v4ik0Ce9zda3Mnf8on1S5KJI8P2jKFZ8+5C0jhmr0KwJEO/Wdpm0VeWJQ==",
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-2.1.1.tgz",
"integrity": "sha512-6VQVNw7+kQu3hL1ZH5GyOhnk8uZm21xS7XJ/6vDZaFNcb62dpFDKcH8TI5NkoZOdMRxr7af7aYGrJlE/Wv0i1w==",
"engines": {
"node": "*"
"node": ">=12"
}
},
"node_modules/make-dir": {
@ -9395,9 +9467,9 @@
}
},
"node_modules/postcss": {
"version": "8.4.4",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.4.tgz",
"integrity": "sha512-joU6fBsN6EIer28Lj6GDFoC/5yOZzLCfn0zHAn/MYXI7aPt4m4hK5KC5ovEZXy+lnCjmYIbQWngvju2ddyEr8Q==",
"version": "8.4.5",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
"integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==",
"dependencies": {
"nanoid": "^3.1.30",
"picocolors": "^1.0.0",
@ -9467,9 +9539,9 @@
}
},
"node_modules/postcss-selector-parser": {
"version": "6.0.6",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz",
"integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==",
"version": "6.0.7",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.7.tgz",
"integrity": "sha512-U+b/Deoi4I/UmE6KOVPpnhS7I7AYdKbhGcat+qTQ27gycvaACvNEw11ba6RrkwVmDVRW7sigWgLj4/KbbJjeDA==",
"dependencies": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
@ -10012,18 +10084,6 @@
"react-dom": ">= 16.3.0"
}
},
"node_modules/react-flatpickr": {
"version": "3.10.7",
"resolved": "https://registry.npmjs.org/react-flatpickr/-/react-flatpickr-3.10.7.tgz",
"integrity": "sha512-dJ7cZAayefqWJnX4Xe8Piy13oK2h4aeGCH9tz+D2iSNh+kbezUAWVMVCKdTqjsNBqTMS4v0DkfMy2CP2atNCTQ==",
"dependencies": {
"flatpickr": "^4.6.2",
"prop-types": "^15.5.10"
},
"peerDependencies": {
"react": "^17.0.1"
}
},
"node_modules/react-flow-renderer": {
"version": "9.6.0",
"resolved": "https://registry.npmjs.org/react-flow-renderer/-/react-flow-renderer-9.6.0.tgz",
@ -11279,9 +11339,9 @@
}
},
"node_modules/stylis": {
"version": "4.0.10",
"resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.10.tgz",
"integrity": "sha512-m3k+dk7QeJw660eIKRRn3xPF6uuvHs/FFzjX3HQ5ove0qYsiygoAhwn5a3IYKaZPo5LrYD0rfVmtv1gNY1uYwg=="
"version": "4.0.13",
"resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz",
"integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag=="
},
"node_modules/supports-color": {
"version": "5.5.0",
@ -13581,9 +13641,9 @@
"integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA=="
},
"@emotion/babel-plugin": {
"version": "11.3.0",
"resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.3.0.tgz",
"integrity": "sha512-UZKwBV2rADuhRp+ZOGgNWg2eYgbzKzQXfQPtJbu/PLy8onurxlNCLvxMQEvlr1/GudguPI5IU9qIY1+2z1M5bA==",
"version": "11.7.1",
"resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.7.1.tgz",
"integrity": "sha512-K3/6Y+J/sIAjplf3uIteWLhPuOyuMNnE+iyYnTF/m294vc6IL90kTHp7y8ldZYbpKlP17rpOWDKM9DvTcrOmNQ==",
"requires": {
"@babel/helper-module-imports": "^7.12.13",
"@babel/plugin-syntax-jsx": "^7.12.13",
@ -13596,19 +13656,19 @@
"escape-string-regexp": "^4.0.0",
"find-root": "^1.1.0",
"source-map": "^0.5.7",
"stylis": "^4.0.3"
"stylis": "4.0.13"
}
},
"@emotion/cache": {
"version": "11.6.0",
"resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.6.0.tgz",
"integrity": "sha512-ElbsWY1KMwEowkv42vGo0UPuLgtPYfIs9BxxVrmvsaJVvktknsHYYlx5NQ5g6zLDcOTyamlDc7FkRg2TAcQDKQ==",
"version": "11.7.1",
"resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz",
"integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==",
"requires": {
"@emotion/memoize": "^0.7.4",
"@emotion/sheet": "^1.1.0",
"@emotion/utils": "^1.0.0",
"@emotion/weak-memoize": "^0.2.5",
"stylis": "^4.0.10"
"stylis": "4.0.13"
}
},
"@emotion/hash": {
@ -13806,6 +13866,27 @@
}
}
},
"@mui/base": {
"version": "5.0.0-alpha.59",
"resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.59.tgz",
"integrity": "sha512-rPgN2FW0FAjQ9+LQ+XBsq3DFcuiiMFhf8uoLJAWnnzft27IJvJqbrhfpCZ68G6l+umJLbbl5RIIbpt8ALZDDNQ==",
"requires": {
"@babel/runtime": "^7.16.3",
"@emotion/is-prop-valid": "^1.1.1",
"@mui/utils": "^5.2.3",
"@popperjs/core": "^2.4.4",
"clsx": "^1.1.1",
"prop-types": "^15.7.2",
"react-is": "^17.0.2"
},
"dependencies": {
"react-is": {
"version": "17.0.2",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
"integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
}
}
},
"@mui/core": {
"version": "5.0.0-alpha.54",
"resolved": "https://registry.npmjs.org/@mui/core/-/core-5.0.0-alpha.54.tgz",
@ -13828,25 +13909,40 @@
}
},
"@mui/lab": {
"version": "5.0.0-alpha.54",
"resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.54.tgz",
"integrity": "sha512-G7Ic9TQkWT+DA8AUYKU99sQivFjz3WEuy3SsG9I/zc9DanlmUH26F1jdwUcHhEiCNEif7tEzVtIAPhgSGjbgsg==",
"version": "5.0.0-alpha.59",
"resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.59.tgz",
"integrity": "sha512-B+7EkbM+NRuUFFPzG2lqbyI73FM3W19RFkrWJdNZ+gd6C+NTdHdVS9UxSZm54PmSFEnd77wAWKdrIkhcFzEgZQ==",
"requires": {
"@babel/runtime": "^7.16.0",
"@babel/runtime": "^7.16.3",
"@date-io/date-fns": "^2.11.0",
"@date-io/dayjs": "^2.11.0",
"@date-io/luxon": "^2.11.1",
"@date-io/moment": "^2.11.0",
"@mui/core": "5.0.0-alpha.54",
"@mui/system": "^5.1.0",
"@mui/utils": "^5.1.0",
"@mui/base": "5.0.0-alpha.59",
"@mui/system": "^5.2.3",
"@mui/utils": "^5.2.3",
"clsx": "^1.1.1",
"prop-types": "^15.7.2",
"react-is": "^17.0.2",
"react-transition-group": "^4.4.2",
"rifm": "^0.12.0"
"rifm": "^0.12.1"
},
"dependencies": {
"@mui/system": {
"version": "5.2.3",
"resolved": "https://registry.npmjs.org/@mui/system/-/system-5.2.3.tgz",
"integrity": "sha512-YvkjmqgOruZgr+IkueRns99gl3MmnNs8BhnlZosYMLzKz/1lY0JqVBFqUh4sGVbD0UEKFwdk8H31itG5OIPChA==",
"requires": {
"@babel/runtime": "^7.16.3",
"@mui/private-theming": "^5.2.3",
"@mui/styled-engine": "^5.2.0",
"@mui/types": "^7.1.0",
"@mui/utils": "^5.2.3",
"clsx": "^1.1.1",
"csstype": "^3.0.10",
"prop-types": "^15.7.2"
}
},
"react-is": {
"version": "17.0.2",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
@ -16123,9 +16219,9 @@
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
},
"electron-to-chromium": {
"version": "1.4.14",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.14.tgz",
"integrity": "sha512-RsGkAN9JEAYMObS72kzUsPPcPGMqX1rBqGuXi9aa4TBKLzICoLf+DAAtd0fVFzrniJqYzpby47gthCUoObfs0Q=="
"version": "1.4.16",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.16.tgz",
"integrity": "sha512-BQb7FgYwnu6haWLU63/CdVW+9xhmHls3RCQUFiV4lvw3wimEHTVcUk2hkuZo76QhR8nnDdfZE7evJIZqijwPdA=="
},
"elliptic": {
"version": "6.5.4",
@ -17266,11 +17362,6 @@
"rimraf": "^3.0.2"
}
},
"flatpickr": {
"version": "4.6.9",
"resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.9.tgz",
"integrity": "sha512-F0azNNi8foVWKSF+8X+ZJzz8r9sE1G4hl06RyceIaLvyltKvDl6vqk9Lm/6AUUCi5HWaIjiUbk7UpeE/fOXOpw=="
},
"flatted": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz",
@ -17992,9 +18083,9 @@
"integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU="
},
"is-negative-zero": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
"integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w=="
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
"integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA=="
},
"is-number": {
"version": "7.0.0",
@ -18058,11 +18149,11 @@
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
},
"is-weakref": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz",
"integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
"integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
"requires": {
"call-bind": "^1.0.0"
"call-bind": "^1.0.2"
}
},
"isarray": {
@ -18086,9 +18177,9 @@
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
},
"jest-worker": {
"version": "27.4.2",
"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.2.tgz",
"integrity": "sha512-0QMy/zPovLfUPyHuOuuU4E+kGACXXE84nRnq6lBVI9GJg5DCBiA97SATi+ZP8CpiJwEQy1oCPjRBf8AnLjN+Ag==",
"version": "27.4.4",
"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.4.tgz",
"integrity": "sha512-jfwxYJvfua1b1XkyuyPh01ATmgg4e5fPM/muLmhy9Qc6dmiwacQB0MLHaU6IjEsv/+nAixHGxTn8WllA27Pn0w==",
"requires": {
"@types/node": "*",
"merge-stream": "^2.0.0",
@ -18527,9 +18618,9 @@
}
},
"luxon": {
"version": "1.28.0",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.0.tgz",
"integrity": "sha512-TfTiyvZhwBYM/7QdAVDh+7dBTBA29v4ik0Ce9zda3Mnf8on1S5KJI8P2jKFZ8+5C0jhmr0KwJEO/Wdpm0VeWJQ=="
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-2.1.1.tgz",
"integrity": "sha512-6VQVNw7+kQu3hL1ZH5GyOhnk8uZm21xS7XJ/6vDZaFNcb62dpFDKcH8TI5NkoZOdMRxr7af7aYGrJlE/Wv0i1w=="
},
"make-dir": {
"version": "2.1.0",
@ -19423,9 +19514,9 @@
"integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w=="
},
"postcss": {
"version": "8.4.4",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.4.tgz",
"integrity": "sha512-joU6fBsN6EIer28Lj6GDFoC/5yOZzLCfn0zHAn/MYXI7aPt4m4hK5KC5ovEZXy+lnCjmYIbQWngvju2ddyEr8Q==",
"version": "8.4.5",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
"integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==",
"requires": {
"nanoid": "^3.1.30",
"picocolors": "^1.0.0",
@ -19465,9 +19556,9 @@
}
},
"postcss-selector-parser": {
"version": "6.0.6",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz",
"integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==",
"version": "6.0.7",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.7.tgz",
"integrity": "sha512-U+b/Deoi4I/UmE6KOVPpnhS7I7AYdKbhGcat+qTQ27gycvaACvNEw11ba6RrkwVmDVRW7sigWgLj4/KbbJjeDA==",
"requires": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
@ -19882,15 +19973,6 @@
"prop-types": "^15.6.0"
}
},
"react-flatpickr": {
"version": "3.10.7",
"resolved": "https://registry.npmjs.org/react-flatpickr/-/react-flatpickr-3.10.7.tgz",
"integrity": "sha512-dJ7cZAayefqWJnX4Xe8Piy13oK2h4aeGCH9tz+D2iSNh+kbezUAWVMVCKdTqjsNBqTMS4v0DkfMy2CP2atNCTQ==",
"requires": {
"flatpickr": "^4.6.2",
"prop-types": "^15.5.10"
}
},
"react-flow-renderer": {
"version": "9.6.0",
"resolved": "https://registry.npmjs.org/react-flow-renderer/-/react-flow-renderer-9.6.0.tgz",
@ -20875,9 +20957,9 @@
"requires": {}
},
"stylis": {
"version": "4.0.10",
"resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.10.tgz",
"integrity": "sha512-m3k+dk7QeJw660eIKRRn3xPF6uuvHs/FFzjX3HQ5ove0qYsiygoAhwn5a3IYKaZPo5LrYD0rfVmtv1gNY1uYwg=="
"version": "4.0.13",
"resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz",
"integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag=="
},
"supports-color": {
"version": "5.5.0",

View File

@ -60,7 +60,7 @@
"@loadable/component": "5.15.0",
"@loadable/server": "5.15.1",
"@loadable/webpack-plugin": "5.15.1",
"@mui/lab": "5.0.0-alpha.54",
"@mui/lab": "5.0.0-alpha.59",
"@mui/material": "5.1.0",
"@mui/styles": "5.1.0",
"@mui/system": "5.1.0",
@ -80,7 +80,6 @@
"dompurify": "2.2.6",
"express": "4.17.1",
"fast-xml-parser": "3.19.0",
"flatpickr": "4.6.9",
"fs-extra": "9.0.1",
"fuse.js": "6.4.1",
"helmet": "4.1.1",
@ -94,7 +93,7 @@
"jsonwebtoken": "8.5.1",
"jwt-simple": "0.5.6",
"lockfile": "1.0.4",
"luxon": "1.28.0",
"luxon": "2.1.1",
"marked": "2.0.0",
"morgan": "1.10.0",
"multer": "1.4.3",
@ -108,7 +107,6 @@
"react": "17.0.2",
"react-beautiful-dnd": "13.1.0",
"react-dom": "17.0.2",
"react-flatpickr": "3.10.7",
"react-flow-renderer": "9.6.0",
"react-hook-form": "7.18.1",
"react-json-pretty": "2.2.0",

View File

@ -103,8 +103,7 @@ const AutocompleteController = memo(
/>
)
},
(prevProps, nextProps) =>
prevProps.error === nextProps.error && prevProps.values === nextProps.values
(prevProps, nextProps) => prevProps.values === nextProps.values
)
AutocompleteController.propTypes = {

View File

@ -77,8 +77,7 @@ const CheckboxController = memo(
)}
</FormControl>
)
},
(prevProps, nextProps) => prevProps.error === nextProps.error
}
)
CheckboxController.propTypes = {

View File

@ -14,12 +14,12 @@
* limitations under the License. *
* ------------------------------------------------------------------------- */
import { memo } from 'react'
import { oneOfType, string, node } from 'prop-types'
import PropTypes from 'prop-types'
import { Stack, Typography, styled } from '@mui/material'
import { WarningCircledOutline as WarningIcon } from 'iconoir-react'
import { Tr, labelCanBeTranslated } from 'client/components/HOC'
import { Translate } from 'client/components/HOC'
const ErrorTypo = styled(Typography)(({ theme }) => ({
...theme.typography.body1,
@ -27,23 +27,38 @@ const ErrorTypo = styled(Typography)(({ theme }) => ({
overflowWrap: 'anywhere',
}))
const ErrorHelper = memo(({ label, ...rest }) => (
<Stack
component="span"
color="error.dark"
direction="row"
alignItems="center"
{...rest}
>
<WarningIcon />
<ErrorTypo component="span" data-cy="error-text">
{labelCanBeTranslated(label) ? Tr(label) : label}
</ErrorTypo>
</Stack>
))
const ErrorHelper = memo(({ label, ...rest }) => {
const translateProps = label?.word ? { ...label } : { word: label }
return (
<Stack
component="span"
color="error.dark"
direction="row"
alignItems="center"
{...rest}
>
<WarningIcon />
<ErrorTypo component="span" data-cy="error-text">
<Translate {...translateProps} />
</ErrorTypo>
</Stack>
)
})
ErrorHelper.propTypes = {
label: oneOfType([string, node]),
label: PropTypes.oneOfType([
PropTypes.string,
PropTypes.node,
PropTypes.shape({
word: PropTypes.string,
values: PropTypes.oneOfType([
PropTypes.number,
PropTypes.string,
PropTypes.array,
]),
}),
]),
}
ErrorHelper.displayName = 'ErrorHelper'

View File

@ -144,9 +144,7 @@ const FileController = memo(
)
},
(prevProps, nextProps) =>
prevProps.error === nextProps.error &&
prevProps.type === nextProps.type &&
prevProps.label === nextProps.label
prevProps.type === nextProps.type && prevProps.label === nextProps.label
)
FileController.propTypes = {

View File

@ -51,8 +51,7 @@ const PasswordController = memo(
/>
)
},
(prevProps, nextProps) =>
prevProps.error === nextProps.error && prevProps.type === nextProps.type
(prevProps, nextProps) => prevProps.type === nextProps.type
)
PasswordController.propTypes = {

View File

@ -89,8 +89,7 @@ const SliderController = memo(
)}
</>
)
},
(prevProps, nextProps) => prevProps.error === nextProps.error
}
)
SliderController.propTypes = {

View File

@ -77,8 +77,7 @@ const SwitchController = memo(
)}
</FormControl>
)
},
(prevProps, nextProps) => prevProps.error === nextProps.error
}
)
SwitchController.propTypes = {

View File

@ -86,7 +86,6 @@ const TableController = memo(
)
},
(prevProps, nextProps) =>
prevProps.error === nextProps.error &&
prevProps.label === nextProps.label &&
prevProps.Table === nextProps.Table &&
prevProps.tooltip === nextProps.tooltip

View File

@ -79,7 +79,6 @@ const TextController = memo(
)
},
(prevProps, nextProps) =>
prevProps.error === nextProps.error &&
prevProps.type === nextProps.type &&
prevProps.label === nextProps.label &&
prevProps.tooltip === nextProps.tooltip &&

View File

@ -1,126 +0,0 @@
/* ------------------------------------------------------------------------- *
* Copyright 2002-2021, OpenNebula Project, OpenNebula Systems *
* *
* Licensed under the Apache License, Version 2.0 (the "License"); you may *
* not use this file except in compliance with the License. You may obtain *
* a copy of the License at *
* *
* http://www.apache.org/licenses/LICENSE-2.0 *
* *
* Unless required by applicable law or agreed to in writing, software *
* distributed under the License is distributed on an "AS IS" BASIS, *
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
* See the License for the specific language governing permissions and *
* limitations under the License. *
* ------------------------------------------------------------------------- */
import { memo, useState, useEffect } from 'react'
import PropTypes from 'prop-types'
import Flatpickr from 'react-flatpickr'
import { TextField } from '@mui/material'
import { Controller } from 'react-hook-form'
import { Tr } from 'client/components/HOC'
import { ErrorHelper } from 'client/components/FormControl'
const WrapperToLoadLib = ({ children, id, lib }) => {
const [loading, setLoading] = useState(true)
useEffect(() => {
const loadLib = async () => {
try {
await import(lib)
} finally {
setLoading(false)
}
}
loadLib()
return () => {
// remove all styles when component will be unmounted
document
.querySelectorAll(`[id^=${id}]`)
.forEach((child) => child.parentNode.removeChild(child))
}
}, [])
return loading ? null : children
}
const TimeController = memo(
({ control, cy, name, label, error, fieldProps }) => (
<WrapperToLoadLib
id="flatpicker"
lib={'flatpickr/dist/themes/material_blue.css'}
>
<Controller
render={({ value, onChange, onBlur }) => {
const translated = typeof label === 'string' ? Tr(label) : label
return (
<Flatpickr
onblur={onBlur}
onChange={onChange}
// onCreate={function (flatpickr) { this.calendar = flatpickr }}
onDestroy={() => {
onChange(undefined)
}}
data-enable-time
options={{ allowInput: true }}
render={({ defaultValue, ...props }, ref) => (
<TextField
{...props}
fullWidth
defaultValue={defaultValue}
value={value}
label={translated}
inputProps={{ 'data-cy': cy }}
inputRef={ref}
error={Boolean(error)}
helperText={Boolean(error) && <ErrorHelper label={error} />}
FormHelperTextProps={{ 'data-cy': `${cy}-error` }}
{...fieldProps}
/>
)}
/>
)
}}
name={name}
control={control}
/>
</WrapperToLoadLib>
),
(prevProps, nextProps) => prevProps.error === nextProps.error
)
TimeController.propTypes = {
control: PropTypes.object,
cy: PropTypes.string,
multiline: PropTypes.bool,
name: PropTypes.string.isRequired,
label: PropTypes.any,
tooltip: PropTypes.any,
error: PropTypes.any,
fieldProps: PropTypes.object,
formContext: PropTypes.shape({
setValue: PropTypes.func,
setError: PropTypes.func,
clearErrors: PropTypes.func,
watch: PropTypes.func,
register: PropTypes.func,
}),
}
TimeController.defaultProps = {
control: {},
cy: 'cy',
name: '',
label: '',
error: false,
fieldProps: undefined,
}
TimeController.displayName = 'TimeController'
export default TimeController

View File

@ -16,62 +16,70 @@
import { memo } from 'react'
import PropTypes from 'prop-types'
import { TextField } from '@mui/material'
import { useController } from 'react-hook-form'
import { TextField } from '@mui/material'
import DateTimePicker from '@mui/lab/DateTimePicker'
import { ErrorHelper } from 'client/components/FormControl'
import { Tr, labelCanBeTranslated } from 'client/components/HOC'
import { ErrorHelper, Tooltip } from 'client/components/FormControl'
import { Translate } from 'client/components/HOC'
import { generateKey } from 'client/utils'
import { T } from 'client/constants'
const TimeController = memo(
({
control,
cy = `datetime-${generateKey()}`,
cy = `input-date-${generateKey()}`,
name = '',
label = '',
type = 'datetime-local',
fieldProps = {},
tooltip,
fieldProps: { defaultValue, ...fieldProps } = {},
...props
}) => {
const {
field: { ref, value, ...inputProps },
field: { value, ...controllerProps },
fieldState: { error },
} = useController({ name, control })
} = useController({ name, control, defaultValue })
return (
<TextField
{...inputProps}
fullWidth
label={labelCanBeTranslated(label) ? Tr(label) : label}
inputRef={ref}
type={type}
inputProps={{ 'data-cy': cy, ...fieldProps }}
InputLabelProps={{ shrink: true }}
error={Boolean(error)}
helperText={Boolean(error) && <ErrorHelper label={error?.message} />}
FormHelperTextProps={{ 'data-cy': `${cy}-error` }}
<DateTimePicker
{...controllerProps}
{...fieldProps}
value={value}
label={<Translate word={label} />}
cancelText={<Translate word={T.Cancel} />}
clearText={<Translate word={T.Clear} />}
todayText={<Translate word={T.Today} />}
InputProps={{
autoComplete: 'off',
startAdornment: tooltip && <Tooltip title={tooltip} />,
}}
renderInput={({ inputProps, ...dateTimePickerProps }) => (
<TextField
{...dateTimePickerProps}
fullWidth
inputProps={{ ...inputProps, 'data-cy': cy }}
error={Boolean(error)}
helperText={
Boolean(error) && <ErrorHelper label={error?.message} />
}
FormHelperTextProps={{ 'data-cy': `${cy}-error` }}
/>
)}
/>
)
},
(prevProps, nextProps) =>
prevProps.error === nextProps.error && prevProps.label === nextProps.label
prevProps.label === nextProps.label &&
prevProps.tooltip === nextProps.tooltip
)
TimeController.propTypes = {
control: PropTypes.object,
cy: PropTypes.string,
multiline: PropTypes.bool,
name: PropTypes.string.isRequired,
label: PropTypes.any,
tooltip: PropTypes.any,
type: PropTypes.string,
fieldProps: PropTypes.object,
formContext: PropTypes.shape({
setValue: PropTypes.func,
setError: PropTypes.func,
clearErrors: PropTypes.func,
watch: PropTypes.func,
register: PropTypes.func,
}),
}
TimeController.displayName = 'TimeController'

View File

@ -96,7 +96,6 @@ const ToggleController = memo(
)
},
(prevProps, nextProps) =>
prevProps.error === nextProps.error &&
prevProps.values.length === nextProps.values.length &&
prevProps.label === nextProps.label &&
prevProps.tooltip === nextProps.tooltip

View File

@ -27,7 +27,9 @@ const TranslateContext = createContext()
let languageScript = root.document?.createElement('script')
const labelCanBeTranslated = (val) =>
typeof val === 'string' || (Array.isArray(val) && val.length === 2)
typeof val === 'string' ||
(Array.isArray(val) && val.length === 2) ||
(typeof val === 'object' && val?.word)
const GenerateScript = (
language = DEFAULT_LANGUAGE,
@ -131,12 +133,7 @@ TranslateProvider.propTypes = {
Translate.propTypes = {
word: PropTypes.oneOfType([PropTypes.string, PropTypes.array]),
values: PropTypes.oneOfType([
PropTypes.string,
PropTypes.number,
PropTypes.bool,
PropTypes.array,
]),
values: PropTypes.any,
}
export {

View File

@ -157,6 +157,7 @@ module.exports = {
Yearly: 'Yearly',
EachHours: 'Each %s hours',
AfterTimes: 'After %s times',
Today: 'Today',
/* dashboard */
InTotal: 'In Total',

View File

@ -69,7 +69,7 @@ export const timeFromMilliseconds = (time) => DateTime.fromMillis(+time * 1000)
/**
* Returns the epoch milliseconds of the date.
*
* @param {number|string} date - Date
* @param {number|string} date - JS Date
* @returns {number} - Total milliseconds.
*/
export const dateToMilliseconds = (date) =>
@ -78,7 +78,7 @@ export const dateToMilliseconds = (date) =>
/**
* Returns the epoch milliseconds of the date.
*
* @param {number|string} date - Date
* @param {number|string} date - Date on ISO format
* @returns {number} - Total milliseconds.
*/
export const isoDateToMilliseconds = (date) =>

View File

@ -24,6 +24,9 @@ import {
useMediaQuery,
} from '@mui/material'
import StylesProvider from '@mui/styles/StylesProvider'
import AdapterLuxon from '@mui/lab/AdapterLuxon'
import LocalizationProvider from '@mui/lab/LocalizationProvider'
import { createTheme, generateClassName } from 'client/theme'
import { useAuth } from 'client/features/Auth'
import { SCHEMES } from 'client/constants'
@ -55,14 +58,16 @@ const MuiProvider = ({ theme: appTheme, children }) => {
}, [scheme, prefersDarkMode])
return (
<StyledEngineProvider injectFirst>
<ThemeProvider theme={muitheme}>
<CssBaseline enableColorScheme />
<StylesProvider generateClassName={generateClassName}>
{children}
</StylesProvider>
</ThemeProvider>
</StyledEngineProvider>
<LocalizationProvider dateAdapter={AdapterLuxon}>
<StyledEngineProvider injectFirst>
<ThemeProvider theme={muitheme}>
<CssBaseline enableColorScheme />
<StylesProvider generateClassName={generateClassName}>
{children}
</StylesProvider>
</ThemeProvider>
</StyledEngineProvider>
</LocalizationProvider>
)
}

View File

@ -359,16 +359,16 @@ export const mapUserInputs = (userInputs = {}) =>
* @param {any[]} list - List of option values
* @param {object} [options] - Options to conversion
* @param {boolean|string} [options.addEmpty] - If `true`, add an empty option
* @param {function(any):any} [options.getText] - Function to get the text option
* @param {function(any):any} [options.getValue] - Function to get the value option
* @param {function(any, number):any} [options.getText] - Function to get the text option
* @param {function(any, number):any} [options.getValue] - Function to get the value option
* @returns {SelectOption} Options
*/
export const arrayToOptions = (list = [], options = {}) => {
const { addEmpty = true, getText = (o) => o, getValue = (o) => o } = options
const values = list.map((item) => ({
text: getText(item),
value: getValue(item),
const values = list.map((item, idx) => ({
text: getText(item, idx),
value: getValue(item, idx),
}))
if (addEmpty) {

View File

@ -98,16 +98,31 @@ const buildTranslationLocale = () => {
default: () => T['validation.mixed.default'],
required: () => T['validation.mixed.required'],
defined: () => T['validation.mixed.defined'],
oneOf: ({ values }) => [T['validation.mixed.oneOf'], values],
notOneOf: ({ values }) => [T['validation.mixed.notOneOf'], values],
oneOf: ({ values }) => ({ word: T['validation.mixed.oneOf'], values }),
notOneOf: ({ values }) => ({
word: T['validation.mixed.notOneOf'],
values,
}),
notType: ({ type }) =>
T[`validation.mixed.notType.${type}`] ?? T['validation.mixed.notType'],
},
string: {
length: ({ length }) => [T['validation.string.length'], length],
min: ({ min }) => [T['validation.string.min'], min],
max: ({ max }) => [T['validation.string.max'], max],
matches: ({ matches }) => [T['validation.string.matches'], matches],
length: ({ length }) => ({
word: T['validation.string.length'],
values: length,
}),
min: ({ min }) => ({
word: T['validation.string.min'],
values: min,
}),
max: ({ max }) => ({
word: T['validation.string.max'],
values: max,
}),
matches: ({ matches }) => ({
word: T['validation.string.matches'],
values: matches,
}),
email: () => T['validation.string.email'],
url: () => T['validation.string.url'],
uuid: () => T['validation.string.uuid'],
@ -116,31 +131,61 @@ const buildTranslationLocale = () => {
uppercase: () => T['validation.string.uppercase'],
},
number: {
min: ({ min }) => [T['validation.number.min'], min],
max: ({ max }) => [T['validation.number.max'], max],
lessThan: ({ less }) => [T['validation.number.lessThan'], less],
moreThan: ({ more }) => [T['validation.number.moreThan'], more],
min: ({ min }) => ({
word: T['validation.number.min'],
values: min,
}),
max: ({ max }) => ({
word: T['validation.number.max'],
values: max,
}),
lessThan: ({ less }) => ({
word: T['validation.number.lessThan'],
values: less,
}),
moreThan: ({ more }) => ({
word: T['validation.number.moreThan'],
values: more,
}),
positive: () => T['validation.number.positive'],
negative: () => T['validation.number.negative'],
integer: () => T['validation.number.integer'],
},
boolean: {
isValue: ({ value }) => [T['validation.boolean.isValue'], value],
isValue: ({ value }) => ({
word: T['validation.boolean.isValue'],
values: [value],
}),
},
date: {
min: ({ min }) => [T['validation.date.min'], min],
max: ({ max }) => [T['validation.date.max'], max],
min: ({ min }) => ({
word: T['validation.date.min'],
values: min,
}),
max: ({ max }) => ({
word: T['validation.date.max'],
values: max,
}),
},
object: {
noUnknown: ({ nounknown }) => [
T['validation.object.noUnknown'],
nounknown,
],
noUnknown: ({ nounknown }) => ({
word: T['validation.object.noUnknown'],
values: nounknown,
}),
},
array: {
min: ({ min }) => [T['validation.array.min'], min],
max: ({ max }) => [T['validation.array.max'], max],
length: ({ length }) => [T['validation.array.length'], length],
min: ({ min }) => ({
word: T['validation.array.min'],
values: min,
}),
max: ({ max }) => ({
word: T['validation.array.max'],
values: max,
}),
length: ({ length }) => ({
word: T['validation.array.length'],
values: length,
}),
},
})
}