From 6137360160c310cc2cc595f19ed0e805e8beae4f Mon Sep 17 00:00:00 2001 From: Andres Date: Tue, 15 Aug 2023 22:11:04 -0700 Subject: [PATCH 01/59] Common breadcrumbs --- package-lock.json | 540 ++++++++++-------- package.json | 2 +- .../src/app/views/ItemEdit/Content/Content.js | 7 +- .../ItemEdit/components/Header2/index.tsx | 221 +++++++ src/shell/components/CustomBreadcrumbs.tsx | 61 ++ src/shell/constants.ts | 15 + 6 files changed, 605 insertions(+), 241 deletions(-) create mode 100644 src/apps/content-editor/src/app/views/ItemEdit/components/Header2/index.tsx create mode 100644 src/shell/components/CustomBreadcrumbs.tsx create mode 100644 src/shell/constants.ts diff --git a/package-lock.json b/package-lock.json index e202ba06e1..54f9686543 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,6 +5,7 @@ "requires": true, "packages": { "": { + "name": "manager-ui", "version": "1.0.1", "license": "Commons Clause License Condition v1.0", "dependencies": { @@ -28,7 +29,7 @@ "@tinymce/tinymce-react": "^3.12.6", "@welldone-software/why-did-you-render": "^6.1.1", "@zesty-io/core": "1.9.1", - "@zesty-io/material": "^0.9.0", + "@zesty-io/material": "file:../material/zesty-io-material-0.10.0.tgz", "chart.js": "^3.8.0", "chartjs-adapter-moment": "^1.0.1", "chartjs-plugin-datalabels": "^2.0.0", @@ -1767,11 +1768,11 @@ } }, "node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz", + "integrity": "sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==", "dependencies": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" @@ -2025,33 +2026,48 @@ } }, "node_modules/@emotion/cache": { - "version": "11.9.3", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.9.3.tgz", - "integrity": "sha512-0dgkI/JKlCXa+lEXviaMtGBL0ynpx4osh7rjOXE71q9bIF8G+XhJgvi+wDu0B0IdCVx37BffiwXlN9I3UuzFvg==", + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", "dependencies": { - "@emotion/memoize": "^0.7.4", - "@emotion/sheet": "^1.1.1", - "@emotion/utils": "^1.0.0", - "@emotion/weak-memoize": "^0.2.5", - "stylis": "4.0.13" + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" } }, + "node_modules/@emotion/cache/node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/cache/node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, + "node_modules/@emotion/cache/node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, "node_modules/@emotion/hash": { "version": "0.8.0", "license": "MIT" }, "node_modules/@emotion/is-prop-valid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz", - "integrity": "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", "dependencies": { - "@emotion/memoize": "^0.8.0" + "@emotion/memoize": "^0.8.1" } }, "node_modules/@emotion/is-prop-valid/node_modules/@emotion/memoize": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", - "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, "node_modules/@emotion/memoize": { "version": "0.7.5", @@ -2094,9 +2110,9 @@ } }, "node_modules/@emotion/sheet": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.1.tgz", - "integrity": "sha512-J3YPccVRMiTZxYAY0IOq3kd+hUP8idY8Kz6B/Cyo+JuXq52Ek+zbPbSQUrVQp95aJ+lsAW7DPL1P2Z+U1jGkKA==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" }, "node_modules/@emotion/styled": { "version": "11.8.1", @@ -2127,8 +2143,9 @@ "license": "MIT" }, "node_modules/@emotion/utils": { - "version": "1.1.0", - "license": "MIT" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" }, "node_modules/@emotion/weak-memoize": { "version": "0.2.5", @@ -2290,16 +2307,16 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-alpha.120", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.120.tgz", - "integrity": "sha512-UoIXLjbl8ghK7OSD1dYzHIj79sx9v5S2J7vYeuhxUS0QR0FwGZ3WLHd31TQ2CT2faPX/AXsHQeFn93wKSnjPUQ==", - "dependencies": { - "@babel/runtime": "^7.21.0", - "@emotion/is-prop-valid": "^1.2.0", - "@mui/types": "^7.2.3", - "@mui/utils": "^5.11.12", - "@popperjs/core": "^2.11.6", - "clsx": "^1.2.1", + "version": "5.0.0-beta.11", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.11.tgz", + "integrity": "sha512-FdKZGPd8qmC3ZNke7CNhzcEgToc02M6WYZc9hcBsNQ17bgAd3s9F//1bDDYgMVBYxDM71V0sv/hBHlOY4I1ZVA==", + "dependencies": { + "@babel/runtime": "^7.22.6", + "@emotion/is-prop-valid": "^1.2.1", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.14.5", + "@popperjs/core": "^2.11.8", + "clsx": "^2.0.0", "prop-types": "^15.8.1", "react-is": "^18.2.0" }, @@ -2321,16 +2338,34 @@ } } }, + "node_modules/@mui/base/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/@mui/base/node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.5.tgz", + "integrity": "sha512-+wpGH1USwPcKMFPMvXqYPC6fEvhxM3FzxC8lyDiNK/imLyyJ6y2DPb1Oue7OGIKJWBmYBqrWWtfovrxd1aJHTA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + } + }, "node_modules/@mui/icons-material": { - "version": "5.8.0", - "license": "MIT", + "version": "5.14.3", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.3.tgz", + "integrity": "sha512-XkxWPhageu1OPUm2LWjo5XqeQ0t2xfGe8EiLkRW9oz2LHMMZmijvCxulhgquUVTF1DnoSh+3KoDLSsoAFtVNVw==", "dependencies": { - "@babel/runtime": "^7.17.2" + "@babel/runtime": "^7.22.6" }, "engines": { "node": ">=12.0.0" @@ -2428,21 +2463,22 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, "node_modules/@mui/material": { - "version": "5.8.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.17.2", - "@mui/base": "5.0.0-alpha.81", - "@mui/system": "^5.8.0", - "@mui/types": "^7.1.3", - "@mui/utils": "^5.8.0", - "@types/react-transition-group": "^4.4.4", - "clsx": "^1.1.1", - "csstype": "^3.0.11", - "hoist-non-react-statics": "^3.3.2", + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.5.tgz", + "integrity": "sha512-4qa4GMfuZH0Ai3mttk5ccXP8a3sf7aPlAJwyMrUSz6h9hPri6BPou94zeu3rENhhmKLby9S/W1y+pmficy8JKA==", + "dependencies": { + "@babel/runtime": "^7.22.6", + "@mui/base": "5.0.0-beta.11", + "@mui/core-downloads-tracker": "^5.14.5", + "@mui/system": "^5.14.5", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.14.5", + "@types/react-transition-group": "^4.4.6", + "clsx": "^2.0.0", + "csstype": "^3.1.2", "prop-types": "^15.8.1", - "react-is": "^17.0.2", - "react-transition-group": "^4.4.2" + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" }, "engines": { "node": ">=12.0.0" @@ -2470,45 +2506,26 @@ } } }, - "node_modules/@mui/material/node_modules/@mui/base": { - "version": "5.0.0-alpha.81", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.81.tgz", - "integrity": "sha512-KJP+RdKBLSbhiAliy1b5xFuoAezawupfIHc/MRtEZdqAmUW0+UFNDXIUDlBKR9zLCjgjQ7eVJsSe0TwAgd8OMQ==", - "dependencies": { - "@babel/runtime": "^7.17.2", - "@emotion/is-prop-valid": "^1.1.2", - "@mui/types": "^7.1.3", - "@mui/utils": "^5.8.0", - "@popperjs/core": "^2.11.5", - "clsx": "^1.1.1", - "prop-types": "^15.8.1", - "react-is": "^17.0.2" - }, + "node_modules/@mui/material/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "node": ">=6" } }, + "node_modules/@mui/material/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, "node_modules/@mui/private-theming": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.9.0.tgz", - "integrity": "sha512-t0ZsWxE/LvX5RH5azjx1esBHbIfD9zjnbSAYkpE59BPpkOrqAYDGoJguL2EPd9LaUb6COmBozmAwNenvI6RJRQ==", + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.5.tgz", + "integrity": "sha512-cC4C5RrpXpDaaZyH9QwmPhRLgz+f2SYbOty3cPkk4qPSOSfif2ZEcDD9HTENKDDd9deB+xkPKzzZhi8cxIx8Ig==", "dependencies": { - "@babel/runtime": "^7.17.2", - "@mui/utils": "^5.9.0", + "@babel/runtime": "^7.22.6", + "@mui/utils": "^5.14.5", "prop-types": "^15.8.1" }, "engines": { @@ -2529,13 +2546,13 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.8.7", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.8.7.tgz", - "integrity": "sha512-tVqtowjbYmiRq+qcqXK731L9eWoL9H8xTRhuTgaDGKdch1zlt4I2UwInUe1w2N9N/u3/jHsFbLcl1Un3uOwpQg==", + "version": "5.13.2", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.13.2.tgz", + "integrity": "sha512-VCYCU6xVtXOrIN8lcbuPmoG+u7FYuOERG++fpY74hPpEWkyFQG97F+/XfTQVYzlR2m7nPjnwVUgATcTCMEaMvw==", "dependencies": { - "@babel/runtime": "^7.17.2", - "@emotion/cache": "^11.9.3", - "csstype": "^3.1.0", + "@babel/runtime": "^7.21.0", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.2", "prop-types": "^15.8.1" }, "engines": { @@ -2560,17 +2577,17 @@ } }, "node_modules/@mui/system": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.9.0.tgz", - "integrity": "sha512-KLZDYMmT1usokEJH+raGTh1SbdOx4BVrT+wg8nRpKGNii2sfc3ntuJSKuv3Fu9oeC9xVFTnNBHXKrpJuxeDcqg==", - "dependencies": { - "@babel/runtime": "^7.17.2", - "@mui/private-theming": "^5.9.0", - "@mui/styled-engine": "^5.8.7", - "@mui/types": "^7.1.4", - "@mui/utils": "^5.9.0", - "clsx": "^1.2.1", - "csstype": "^3.1.0", + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.5.tgz", + "integrity": "sha512-mextXZHDeGcR7E1kx43TRARrVXy+gI4wzpUgNv7MqZs1dvTVXQGVeAT6ydj9d6FUqHBPMNLGV/21vJOrpqsL+w==", + "dependencies": { + "@babel/runtime": "^7.22.6", + "@mui/private-theming": "^5.14.5", + "@mui/styled-engine": "^5.13.2", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.14.5", + "clsx": "^2.0.0", + "csstype": "^3.1.2", "prop-types": "^15.8.1" }, "engines": { @@ -2598,10 +2615,18 @@ } } }, + "node_modules/@mui/system/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/@mui/types": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.3.tgz", - "integrity": "sha512-tZ+CQggbe9Ol7e/Fs5RcKwg/woU+o8DCtOnccX6KmbBc7YrfqMYEYuaIcXHuhpT880QwNkZZ3wQwvtlDFA2yOw==", + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz", + "integrity": "sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==", "peerDependencies": { "@types/react": "*" }, @@ -2612,13 +2637,13 @@ } }, "node_modules/@mui/utils": { - "version": "5.11.12", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.11.12.tgz", - "integrity": "sha512-5vH9B/v8pzkpEPO2HvGM54ToXV6cFdAn8UrvdN8TMEEwpn/ycW0jLiyBcgUlPsQ+xha7hqXCPQYHaYFDIcwaiw==", + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.5.tgz", + "integrity": "sha512-6Hzw63VR9C5xYv+CbjndoRLU6Gntal8rJ5W+GUzkyHrGWIyYPWZPa6AevnyGioySNETATe1H9oXS8f/7qgIHJA==", "dependencies": { - "@babel/runtime": "^7.21.0", + "@babel/runtime": "^7.22.6", "@types/prop-types": "^15.7.5", - "@types/react-is": "^16.7.1 || ^17.0.0", + "@types/react-is": "^18.2.1", "prop-types": "^15.8.1", "react-is": "^18.2.0" }, @@ -2979,9 +3004,9 @@ } }, "node_modules/@popperjs/core": { - "version": "2.11.6", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", - "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -3474,8 +3499,9 @@ } }, "node_modules/@types/react-is": { - "version": "17.0.3", - "license": "MIT", + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-18.2.1.tgz", + "integrity": "sha512-wyUkmaaSZEzFZivD8F2ftSyAfk6L+DfFliVj/mYdOXbVjRcS87fQJLTnhk6dRZPuJjI+9g6RZJO4PNCngUrmyw==", "dependencies": { "@types/react": "*" } @@ -3512,9 +3538,9 @@ } }, "node_modules/@types/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==", + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz", + "integrity": "sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==", "dependencies": { "@types/react": "*" } @@ -3789,14 +3815,15 @@ } }, "node_modules/@zesty-io/material": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@zesty-io/material/-/material-0.9.0.tgz", - "integrity": "sha512-sxvNRTBsxSaXDlEnRBbFVEPCM1pjafZBLlti62gHeFPR6bUDlbKSUtyp53jYCsu9FJGHB6vr7CZugQy3aKGwZA==", + "version": "0.10.0", + "resolved": "file:../material/zesty-io-material-0.10.0.tgz", + "integrity": "sha512-RUztrST6OsiBjv9FgXgcKWfklGU7YKkehxhXX+8NuzHotCvrCpFWv6cTtIR4PQRrifcKz2lMWu42dEJD6u2TBw==", + "license": "MIT", "dependencies": { "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", - "@mui/icons-material": "^5.6.2", - "@mui/material": "^5.6.4", + "@mui/icons-material": "^5.14.3", + "@mui/material": "^5.14.5", "@mui/x-date-pickers": "^5.0.0-alpha.5", "date-fns": "^2.28.0", "react-window": "^1.8.7" @@ -5935,8 +5962,9 @@ } }, "node_modules/csstype": { - "version": "3.1.0", - "license": "MIT" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, "node_modules/csv-parse": { "version": "4.16.3", @@ -12008,9 +12036,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regenerator-transform": { "version": "0.15.0", @@ -16635,11 +16663,11 @@ } }, "@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz", + "integrity": "sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==", "requires": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" } }, "@babel/template": { @@ -16809,32 +16837,49 @@ } }, "@emotion/cache": { - "version": "11.9.3", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.9.3.tgz", - "integrity": "sha512-0dgkI/JKlCXa+lEXviaMtGBL0ynpx4osh7rjOXE71q9bIF8G+XhJgvi+wDu0B0IdCVx37BffiwXlN9I3UuzFvg==", + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", "requires": { - "@emotion/memoize": "^0.7.4", - "@emotion/sheet": "^1.1.1", - "@emotion/utils": "^1.0.0", - "@emotion/weak-memoize": "^0.2.5", - "stylis": "4.0.13" + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + }, + "dependencies": { + "@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, + "stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + } } }, "@emotion/hash": { "version": "0.8.0" }, "@emotion/is-prop-valid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz", - "integrity": "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", "requires": { - "@emotion/memoize": "^0.8.0" + "@emotion/memoize": "^0.8.1" }, "dependencies": { "@emotion/memoize": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", - "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" } } }, @@ -16864,9 +16909,9 @@ } }, "@emotion/sheet": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.1.tgz", - "integrity": "sha512-J3YPccVRMiTZxYAY0IOq3kd+hUP8idY8Kz6B/Cyo+JuXq52Ek+zbPbSQUrVQp95aJ+lsAW7DPL1P2Z+U1jGkKA==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" }, "@emotion/styled": { "version": "11.8.1", @@ -16882,7 +16927,9 @@ "version": "0.7.5" }, "@emotion/utils": { - "version": "1.1.0" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" }, "@emotion/weak-memoize": { "version": "0.2.5" @@ -16985,20 +17032,25 @@ } }, "@mui/base": { - "version": "5.0.0-alpha.120", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.120.tgz", - "integrity": "sha512-UoIXLjbl8ghK7OSD1dYzHIj79sx9v5S2J7vYeuhxUS0QR0FwGZ3WLHd31TQ2CT2faPX/AXsHQeFn93wKSnjPUQ==", - "requires": { - "@babel/runtime": "^7.21.0", - "@emotion/is-prop-valid": "^1.2.0", - "@mui/types": "^7.2.3", - "@mui/utils": "^5.11.12", - "@popperjs/core": "^2.11.6", - "clsx": "^1.2.1", + "version": "5.0.0-beta.11", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.11.tgz", + "integrity": "sha512-FdKZGPd8qmC3ZNke7CNhzcEgToc02M6WYZc9hcBsNQ17bgAd3s9F//1bDDYgMVBYxDM71V0sv/hBHlOY4I1ZVA==", + "requires": { + "@babel/runtime": "^7.22.6", + "@emotion/is-prop-valid": "^1.2.1", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.14.5", + "@popperjs/core": "^2.11.8", + "clsx": "^2.0.0", "prop-types": "^15.8.1", "react-is": "^18.2.0" }, "dependencies": { + "clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==" + }, "react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", @@ -17006,10 +17058,17 @@ } } }, + "@mui/core-downloads-tracker": { + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.5.tgz", + "integrity": "sha512-+wpGH1USwPcKMFPMvXqYPC6fEvhxM3FzxC8lyDiNK/imLyyJ6y2DPb1Oue7OGIKJWBmYBqrWWtfovrxd1aJHTA==" + }, "@mui/icons-material": { - "version": "5.8.0", + "version": "5.14.3", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.3.tgz", + "integrity": "sha512-XkxWPhageu1OPUm2LWjo5XqeQ0t2xfGe8EiLkRW9oz2LHMMZmijvCxulhgquUVTF1DnoSh+3KoDLSsoAFtVNVw==", "requires": { - "@babel/runtime": "^7.17.2" + "@babel/runtime": "^7.22.6" } }, "@mui/lab": { @@ -17049,88 +17108,92 @@ } }, "@mui/material": { - "version": "5.8.0", - "requires": { - "@babel/runtime": "^7.17.2", - "@mui/base": "5.0.0-alpha.81", - "@mui/system": "^5.8.0", - "@mui/types": "^7.1.3", - "@mui/utils": "^5.8.0", - "@types/react-transition-group": "^4.4.4", - "clsx": "^1.1.1", - "csstype": "^3.0.11", - "hoist-non-react-statics": "^3.3.2", + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.5.tgz", + "integrity": "sha512-4qa4GMfuZH0Ai3mttk5ccXP8a3sf7aPlAJwyMrUSz6h9hPri6BPou94zeu3rENhhmKLby9S/W1y+pmficy8JKA==", + "requires": { + "@babel/runtime": "^7.22.6", + "@mui/base": "5.0.0-beta.11", + "@mui/core-downloads-tracker": "^5.14.5", + "@mui/system": "^5.14.5", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.14.5", + "@types/react-transition-group": "^4.4.6", + "clsx": "^2.0.0", + "csstype": "^3.1.2", "prop-types": "^15.8.1", - "react-is": "^17.0.2", - "react-transition-group": "^4.4.2" + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" }, "dependencies": { - "@mui/base": { - "version": "5.0.0-alpha.81", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.81.tgz", - "integrity": "sha512-KJP+RdKBLSbhiAliy1b5xFuoAezawupfIHc/MRtEZdqAmUW0+UFNDXIUDlBKR9zLCjgjQ7eVJsSe0TwAgd8OMQ==", - "requires": { - "@babel/runtime": "^7.17.2", - "@emotion/is-prop-valid": "^1.1.2", - "@mui/types": "^7.1.3", - "@mui/utils": "^5.8.0", - "@popperjs/core": "^2.11.5", - "clsx": "^1.1.1", - "prop-types": "^15.8.1", - "react-is": "^17.0.2" - } + "clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==" + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" } } }, "@mui/private-theming": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.9.0.tgz", - "integrity": "sha512-t0ZsWxE/LvX5RH5azjx1esBHbIfD9zjnbSAYkpE59BPpkOrqAYDGoJguL2EPd9LaUb6COmBozmAwNenvI6RJRQ==", + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.5.tgz", + "integrity": "sha512-cC4C5RrpXpDaaZyH9QwmPhRLgz+f2SYbOty3cPkk4qPSOSfif2ZEcDD9HTENKDDd9deB+xkPKzzZhi8cxIx8Ig==", "requires": { - "@babel/runtime": "^7.17.2", - "@mui/utils": "^5.9.0", + "@babel/runtime": "^7.22.6", + "@mui/utils": "^5.14.5", "prop-types": "^15.8.1" } }, "@mui/styled-engine": { - "version": "5.8.7", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.8.7.tgz", - "integrity": "sha512-tVqtowjbYmiRq+qcqXK731L9eWoL9H8xTRhuTgaDGKdch1zlt4I2UwInUe1w2N9N/u3/jHsFbLcl1Un3uOwpQg==", + "version": "5.13.2", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.13.2.tgz", + "integrity": "sha512-VCYCU6xVtXOrIN8lcbuPmoG+u7FYuOERG++fpY74hPpEWkyFQG97F+/XfTQVYzlR2m7nPjnwVUgATcTCMEaMvw==", "requires": { - "@babel/runtime": "^7.17.2", - "@emotion/cache": "^11.9.3", - "csstype": "^3.1.0", + "@babel/runtime": "^7.21.0", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.2", "prop-types": "^15.8.1" } }, "@mui/system": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.9.0.tgz", - "integrity": "sha512-KLZDYMmT1usokEJH+raGTh1SbdOx4BVrT+wg8nRpKGNii2sfc3ntuJSKuv3Fu9oeC9xVFTnNBHXKrpJuxeDcqg==", - "requires": { - "@babel/runtime": "^7.17.2", - "@mui/private-theming": "^5.9.0", - "@mui/styled-engine": "^5.8.7", - "@mui/types": "^7.1.4", - "@mui/utils": "^5.9.0", - "clsx": "^1.2.1", - "csstype": "^3.1.0", + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.5.tgz", + "integrity": "sha512-mextXZHDeGcR7E1kx43TRARrVXy+gI4wzpUgNv7MqZs1dvTVXQGVeAT6ydj9d6FUqHBPMNLGV/21vJOrpqsL+w==", + "requires": { + "@babel/runtime": "^7.22.6", + "@mui/private-theming": "^5.14.5", + "@mui/styled-engine": "^5.13.2", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.14.5", + "clsx": "^2.0.0", + "csstype": "^3.1.2", "prop-types": "^15.8.1" + }, + "dependencies": { + "clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==" + } } }, "@mui/types": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.3.tgz", - "integrity": "sha512-tZ+CQggbe9Ol7e/Fs5RcKwg/woU+o8DCtOnccX6KmbBc7YrfqMYEYuaIcXHuhpT880QwNkZZ3wQwvtlDFA2yOw==" + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz", + "integrity": "sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==" }, "@mui/utils": { - "version": "5.11.12", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.11.12.tgz", - "integrity": "sha512-5vH9B/v8pzkpEPO2HvGM54ToXV6cFdAn8UrvdN8TMEEwpn/ycW0jLiyBcgUlPsQ+xha7hqXCPQYHaYFDIcwaiw==", + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.5.tgz", + "integrity": "sha512-6Hzw63VR9C5xYv+CbjndoRLU6Gntal8rJ5W+GUzkyHrGWIyYPWZPa6AevnyGioySNETATe1H9oXS8f/7qgIHJA==", "requires": { - "@babel/runtime": "^7.21.0", + "@babel/runtime": "^7.22.6", "@types/prop-types": "^15.7.5", - "@types/react-is": "^16.7.1 || ^17.0.0", + "@types/react-is": "^18.2.1", "prop-types": "^15.8.1", "react-is": "^18.2.0" }, @@ -17311,9 +17374,9 @@ } }, "@popperjs/core": { - "version": "2.11.6", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", - "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==" + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" }, "@react-dnd/asap": { "version": "4.0.1" @@ -17692,7 +17755,9 @@ } }, "@types/react-is": { - "version": "17.0.3", + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-18.2.1.tgz", + "integrity": "sha512-wyUkmaaSZEzFZivD8F2ftSyAfk6L+DfFliVj/mYdOXbVjRcS87fQJLTnhk6dRZPuJjI+9g6RZJO4PNCngUrmyw==", "requires": { "@types/react": "*" } @@ -17728,9 +17793,9 @@ } }, "@types/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==", + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz", + "integrity": "sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==", "requires": { "@types/react": "*" } @@ -17943,14 +18008,13 @@ } }, "@zesty-io/material": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@zesty-io/material/-/material-0.9.0.tgz", - "integrity": "sha512-sxvNRTBsxSaXDlEnRBbFVEPCM1pjafZBLlti62gHeFPR6bUDlbKSUtyp53jYCsu9FJGHB6vr7CZugQy3aKGwZA==", + "version": "file:../material/zesty-io-material-0.10.0.tgz", + "integrity": "sha512-RUztrST6OsiBjv9FgXgcKWfklGU7YKkehxhXX+8NuzHotCvrCpFWv6cTtIR4PQRrifcKz2lMWu42dEJD6u2TBw==", "requires": { "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", - "@mui/icons-material": "^5.6.2", - "@mui/material": "^5.6.4", + "@mui/icons-material": "^5.14.3", + "@mui/material": "^5.14.5", "@mui/x-date-pickers": "^5.0.0-alpha.5", "date-fns": "^2.28.0", "react-window": "^1.8.7" @@ -19362,7 +19426,9 @@ "dev": true }, "csstype": { - "version": "3.1.0" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, "csv-parse": { "version": "4.16.3" @@ -23330,9 +23396,9 @@ } }, "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "regenerator-transform": { "version": "0.15.0", diff --git a/package.json b/package.json index e63ab52171..1d3b0b59a6 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "@tinymce/tinymce-react": "^3.12.6", "@welldone-software/why-did-you-render": "^6.1.1", "@zesty-io/core": "1.9.1", - "@zesty-io/material": "^0.9.0", + "@zesty-io/material": "file:../material/zesty-io-material-0.10.0.tgz", "chart.js": "^3.8.0", "chartjs-adapter-moment": "^1.0.1", "chartjs-plugin-datalabels": "^2.0.0", diff --git a/src/apps/content-editor/src/app/views/ItemEdit/Content/Content.js b/src/apps/content-editor/src/app/views/ItemEdit/Content/Content.js index 47c08550e3..5406107290 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/Content/Content.js +++ b/src/apps/content-editor/src/app/views/ItemEdit/Content/Content.js @@ -2,7 +2,7 @@ import { useSelector } from "react-redux"; import cx from "classnames"; import { Editor } from "../../../components/Editor"; -import { Header } from "../components/Header"; +import { Header2 } from "../components/Header2"; import { ItemVersioning } from "../components/Header/ItemVersioning"; import { PreviewMode } from "../../../components/Editor/PreviewMode"; import { ActionsDrawer } from "./ActionsDrawer"; @@ -13,7 +13,7 @@ export default function Content(props) { return (
-
-
+ */} +
{ + const { modelZUID, itemZUID } = useParams<{ + modelZUID: string; + itemZUID: string; + }>(); + const location = useLocation(); + const history = useHistory(); + + const { data: contentItem } = useGetContentItemQuery(itemZUID); + + return ( + + `2px solid ${theme?.palette?.divider} `, + "*": { + boxSizing: "border-box", + }, + }} + > + + + {contentItem?.web?.metaTitle || contentItem?.web?.metaLinkText} + + + history.push(`/content/${modelZUID}/${itemZUID}/${value}`) + } + sx={{ + position: "relative", + top: "2px", + }} + > + } + iconPosition="start" + /> + } + iconPosition="start" + /> + } + iconPosition="start" + /> + } + iconPosition="start" + /> + } + iconPosition="start" + /> + } + iconPosition="start" + /> + + + + ); +}; + +const ContentBreadcrumbs = () => { + const { data: nav } = useGetContentNavItemsQuery(); + const { modelZUID, itemZUID } = useParams<{ + modelZUID: string; + itemZUID: string; + }>(); + + const breadcrumbData = useMemo(() => { + let activeItem = nav?.find((item) => item.ZUID === itemZUID); + const crumbs = []; + + // If nav item is not found that means that it is part of a dataset so we push that dataset onto the breadcrumb + if (!activeItem) { + activeItem = nav?.find((item) => item.ZUID === modelZUID); + if (activeItem) { + crumbs.push(activeItem); + } else { + return []; + } + } + + let parent = activeItem.parentZUID; + while (parent) { + const parentItem = nav?.find((item) => item.ZUID === parent); + if (parentItem) { + crumbs.unshift(parentItem); + parent = parentItem.parentZUID; + } else { + parent = null; + } + } + return crumbs; + }, [nav, itemZUID]); + + return ( + + item.label === "Homepage")?.contentModelZUID + }/${nav?.find((item) => item.label === "Homepage")?.ZUID}`} + > + + + {breadcrumbData.map((item) => ( + + ))} + + ); +}; + +type BreadcrumbProps = { + contentNavItem: ContentNavItem; +}; + +export const Breadcrumb = ({ contentNavItem }: BreadcrumbProps) => { + const { data: model } = useGetContentModelQuery( + contentNavItem.contentModelZUID + ); + + return ( + + + {/* @ts-ignore */} + + {contentNavItem.label} + + + ); +}; diff --git a/src/shell/components/CustomBreadcrumbs.tsx b/src/shell/components/CustomBreadcrumbs.tsx new file mode 100644 index 0000000000..882412e6c5 --- /dev/null +++ b/src/shell/components/CustomBreadcrumbs.tsx @@ -0,0 +1,61 @@ +import { Children, ReactNode, useCallback, useState } from "react"; +import { Breadcrumbs, Box, IconButton, Menu, MenuItem } from "@mui/material"; +import { MoreHorizRounded } from "@mui/icons-material"; + +type CustomBreadcrumbsProps = { + children: ReactNode[]; +}; + +export const CustomBreadcrumbs = ({ children }: CustomBreadcrumbsProps) => { + const [showBreadcrumbPopover, setShowBreadcrumbPopover] = + useState(null); + + const CollapseButton = useCallback(() => { + return ( + { + event.stopPropagation(); + setShowBreadcrumbPopover(event.currentTarget); + }} + > + + + ); + }, []); + + return ( + <> + + {children} + {/* Trailing slash */} + + + setShowBreadcrumbPopover(null)} + > + {Children.toArray(children) + .slice(2, -1) + .map((item, index) => ( + + {item} + + ))} + + + ); +}; diff --git a/src/shell/constants.ts b/src/shell/constants.ts new file mode 100644 index 0000000000..d2a20953dc --- /dev/null +++ b/src/shell/constants.ts @@ -0,0 +1,15 @@ +import FormatListBulletedRoundedIcon from "@mui/icons-material/FormatListBulletedRounded"; +import { FileTable } from "@zesty-io/material"; +import DescriptionRoundedIcon from "@mui/icons-material/DescriptionRounded"; + +export const MODEL_ICON = { + templateset: DescriptionRoundedIcon, + dataset: FileTable, + pageset: FormatListBulletedRoundedIcon, +} as const; + +export const MODEL_NAME = { + templateset: "Single Page", + dataset: "Dataset", + pageset: "Multi Page", +} as const; From a6bea653982275f9773397b9e18a263197bcc3dc Mon Sep 17 00:00:00 2001 From: Andres Date: Tue, 15 Aug 2023 23:40:26 -0700 Subject: [PATCH 02/59] content layout rework --- .../src/app/components/Editor/Editor.js | 2 +- .../src/app/components/Editor/Editor.less | 6 +- .../Content/ActionsDrawer/ActionsDrawer.less | 3 +- .../src/app/views/ItemEdit/Content/Content.js | 28 +++-- .../app/views/ItemEdit/Content/Content.less | 12 +- .../src/app/views/ItemEdit/ItemEdit.js | 9 +- .../ItemEdit/components/Header2/index.tsx | 104 +++++++++--------- src/shell/components/CustomBreadcrumbs.tsx | 5 + 8 files changed, 84 insertions(+), 85 deletions(-) diff --git a/src/apps/content-editor/src/app/components/Editor/Editor.js b/src/apps/content-editor/src/app/components/Editor/Editor.js index 7902642f6f..f92a9bf6ea 100644 --- a/src/apps/content-editor/src/app/components/Editor/Editor.js +++ b/src/apps/content-editor/src/app/components/Editor/Editor.js @@ -139,7 +139,7 @@ export default memo(function Editor({ return (
- {item.meta && item.meta.ZUID && } + {/* {item.meta && item.meta.ZUID && } */} {activeFields.length ? ( activeFields.map((field) => { diff --git a/src/apps/content-editor/src/app/components/Editor/Editor.less b/src/apps/content-editor/src/app/components/Editor/Editor.less index 4880b86734..421e4dfcbd 100644 --- a/src/apps/content-editor/src/app/components/Editor/Editor.less +++ b/src/apps/content-editor/src/app/components/Editor/Editor.less @@ -3,10 +3,10 @@ .Fields { display: flex; flex-direction: column; - padding: 32px 0 32px 32px; + padding: 20px 0 32px 32px; @media only screen and (min-width: 2000px) { - padding: 32px 0 32px 48px; + padding: 20px 0 32px 48px; } //Hide Scrollbar @@ -18,7 +18,7 @@ } //Scroll Calc (GlobalTopbar - Content Header - padding) - height: calc(100vh - 40px - 73px - 32px - 32px); + // height: calc(100vh - 40px - 73px - 32px - 32px); .Field { padding: 12px 0; diff --git a/src/apps/content-editor/src/app/views/ItemEdit/Content/ActionsDrawer/ActionsDrawer.less b/src/apps/content-editor/src/app/views/ItemEdit/Content/ActionsDrawer/ActionsDrawer.less index c802ee84f2..fa5a809e65 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/Content/ActionsDrawer/ActionsDrawer.less +++ b/src/apps/content-editor/src/app/views/ItemEdit/Content/ActionsDrawer/ActionsDrawer.less @@ -2,7 +2,6 @@ @import "~@zesty-io/core/typography.less"; /* Scroll Calc (GlobalTopbar - Content Header - button - padding) */ -@height: calc(100vh - 40px - 73px); .Drawer { background-color: @white; @@ -10,7 +9,7 @@ flex-direction: column; // border: 1px solid @bright-gray; border-width: 1px 0 0 0; - height: @height; + height: 100%; width: 40px; transition: width 350ms ease; diff --git a/src/apps/content-editor/src/app/views/ItemEdit/Content/Content.js b/src/apps/content-editor/src/app/views/ItemEdit/Content/Content.js index 5406107290..12b588853a 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/Content/Content.js +++ b/src/apps/content-editor/src/app/views/ItemEdit/Content/Content.js @@ -31,7 +31,7 @@ export default function Content(props) { dispatch={props.dispatch} /> */} - + {/* */}
-
- this.setState({ makeActive: "" })} - model={props.model} - itemZUID={props.itemZUID} - item={props.item} - fields={props.fields} - dispatch={props.dispatch} - isDirty={props.item.dirty} - onSave={props.onSave} - modelZUID={props.modelZUID} - /> -
+ this.setState({ makeActive: "" })} + model={props.model} + itemZUID={props.itemZUID} + item={props.item} + fields={props.fields} + dispatch={props.dispatch} + isDirty={props.item.dirty} + onSave={props.onSave} + modelZUID={props.modelZUID} + /> {ui.duoMode && ( state.fields, @@ -284,7 +285,11 @@ export default function ItemEdit() { onDiscard={discard} /> -
+ + -
+ )} diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/index.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/index.tsx index 49507c8c17..94b7c1a618 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/index.tsx +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/index.tsx @@ -1,14 +1,4 @@ -import { - Breadcrumbs, - Box, - IconButton, - Menu, - MenuItem, - SvgIcon, - Tabs, - Tab, - Typography, -} from "@mui/material"; +import { Box, SvgIcon, Tabs, Tab, Typography } from "@mui/material"; import { useGetContentItemQuery, useGetContentModelQuery, @@ -16,13 +6,12 @@ import { } from "../../../../../../../../shell/services/instance"; import { Home, theme } from "@zesty-io/material"; import { useHistory, useLocation, useParams } from "react-router"; -import { useCallback, useEffect, useMemo, useState } from "react"; +import { useMemo } from "react"; import { ContentNavItem } from "../../../../../../../../shell/services/types"; import { MODEL_ICON } from "../../../../../../../../shell/constants"; import { Link } from "react-router-dom"; import { ThemeProvider } from "@mui/material/styles"; import { - MoreHorizRounded, VerticalSplitRounded, QueryStatsRounded, BarChartRounded, @@ -32,6 +21,39 @@ import { } from "@mui/icons-material"; import { CustomBreadcrumbs } from "../../../../../../../../shell/components/CustomBreadcrumbs"; +const tabs = [ + { + label: "Content", + icon: VerticalSplitRounded, + value: "", + }, + { + label: "SEO", + icon: QueryStatsRounded, + value: "meta", + }, + { + label: "Analytics", + icon: BarChartRounded, + value: "analytics", + }, + { + label: "Head Tags", + icon: CodeRounded, + value: "head", + }, + { + label: "APIs", + icon: ApiRounded, + value: "api", + }, + { + label: "Publish Status", + icon: ManageAccountsRounded, + value: "publishings", + }, +]; + export const Header2 = () => { const { modelZUID, itemZUID } = useParams<{ modelZUID: string; @@ -41,6 +63,7 @@ export const Header2 = () => { const history = useHistory(); const { data: contentItem } = useGetContentItemQuery(itemZUID); + const { data: model } = useGetContentModelQuery(modelZUID); return ( @@ -85,48 +108,19 @@ export const Header2 = () => { top: "2px", }} > - } - iconPosition="start" - /> - } - iconPosition="start" - /> - } - iconPosition="start" - /> - } - iconPosition="start" - /> - } - iconPosition="start" - /> - } - iconPosition="start" - /> + {tabs.map((tab) => { + if (tab.value === "meta" && model?.type === "dataset") return; + return ( + } + iconPosition="start" + /> + ); + })} diff --git a/src/shell/components/CustomBreadcrumbs.tsx b/src/shell/components/CustomBreadcrumbs.tsx index 882412e6c5..25cdaefd6b 100644 --- a/src/shell/components/CustomBreadcrumbs.tsx +++ b/src/shell/components/CustomBreadcrumbs.tsx @@ -18,6 +18,11 @@ export const CustomBreadcrumbs = ({ children }: CustomBreadcrumbsProps) => { event.stopPropagation(); setShowBreadcrumbPopover(event.currentTarget); }} + sx={{ + "&:hover": { + color: "primary.main", + }, + }} > From aa61c162bec208b4d614b4a07cbdc8eab468828f Mon Sep 17 00:00:00 2001 From: Andres Date: Sun, 20 Aug 2023 17:25:43 -0700 Subject: [PATCH 03/59] Full item edit header swap --- package-lock.json | 4 +- .../src/app/views/Analytics/index.tsx | 3 +- .../src/app/views/ItemEdit/ItemEdit.js | 39 +- .../app/views/ItemEdit/ItemHead/ItemHead.js | 8 - .../app/views/ItemEdit/ItemHead/ItemHead.less | 3 +- .../src/app/views/ItemEdit/Meta/Meta.js | 19 - .../src/app/views/ItemEdit/Meta/Meta.less | 5 +- .../Header2/ItemEditHeaderActions.tsx | 513 ++++++++++++++++++ .../ItemEdit/components/Header2/index.tsx | 129 +++-- .../src/app/components/ModelApi/ApiCard.tsx | 2 +- .../app/components/ModelApi/ApiCardList.tsx | 39 +- .../app/components/ModelApi/ApiDetails.tsx | 9 +- src/shell/components/CustomBreadcrumbs.tsx | 88 +-- src/shell/services/instance.ts | 52 ++ src/shell/store/content.js | 21 +- src/utility/formatDate.ts | 24 + 16 files changed, 778 insertions(+), 180 deletions(-) create mode 100644 src/apps/content-editor/src/app/views/ItemEdit/components/Header2/ItemEditHeaderActions.tsx create mode 100644 src/utility/formatDate.ts diff --git a/package-lock.json b/package-lock.json index 54f9686543..231c337cba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3817,7 +3817,7 @@ "node_modules/@zesty-io/material": { "version": "0.10.0", "resolved": "file:../material/zesty-io-material-0.10.0.tgz", - "integrity": "sha512-RUztrST6OsiBjv9FgXgcKWfklGU7YKkehxhXX+8NuzHotCvrCpFWv6cTtIR4PQRrifcKz2lMWu42dEJD6u2TBw==", + "integrity": "sha512-2tg6hIVbYTyeVraBryBGOMZOZK3fCjUEQzaZHQFZDpM8HE4nyleUno5iG/hOXT6hgzgcRSr/sPaM8A2SzUmk7A==", "license": "MIT", "dependencies": { "@emotion/react": "^11.9.0", @@ -18009,7 +18009,7 @@ }, "@zesty-io/material": { "version": "file:../material/zesty-io-material-0.10.0.tgz", - "integrity": "sha512-RUztrST6OsiBjv9FgXgcKWfklGU7YKkehxhXX+8NuzHotCvrCpFWv6cTtIR4PQRrifcKz2lMWu42dEJD6u2TBw==", + "integrity": "sha512-2tg6hIVbYTyeVraBryBGOMZOZK3fCjUEQzaZHQFZDpM8HE4nyleUno5iG/hOXT6hgzgcRSr/sPaM8A2SzUmk7A==", "requires": { "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", diff --git a/src/apps/content-editor/src/app/views/Analytics/index.tsx b/src/apps/content-editor/src/app/views/Analytics/index.tsx index 65c86b9c2e..0f9d33bb29 100644 --- a/src/apps/content-editor/src/app/views/Analytics/index.tsx +++ b/src/apps/content-editor/src/app/views/Analytics/index.tsx @@ -35,8 +35,9 @@ const Analytics = ({ item }: Props) => { boxSizing: "border-box", color: (theme) => theme.palette.text.primary, }} - height={item ? "calc(100% - 65px)" : "100%"} + height={"100%"} overflow="auto" + bgcolor="grey.50" > {!isError ? ( <> diff --git a/src/apps/content-editor/src/app/views/ItemEdit/ItemEdit.js b/src/apps/content-editor/src/app/views/ItemEdit/ItemEdit.js index d1897ae263..61617857ec 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/ItemEdit.js +++ b/src/apps/content-editor/src/app/views/ItemEdit/ItemEdit.js @@ -289,7 +289,7 @@ export default function ItemEdit() { component="section" sx={{ display: "flex", flexDirection: "column", height: "100%" }} > - + ( - <> -
- - - )} + render={() => } /> ( -
( - <> -
- load(modelZUID, itemZUID)} - /> - + load(modelZUID, itemZUID)} /> )} /> -
); diff --git a/src/apps/content-editor/src/app/views/ItemEdit/ItemHead/ItemHead.less b/src/apps/content-editor/src/app/views/ItemEdit/ItemHead/ItemHead.less index f7bf566735..56a1012a2f 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/ItemHead/ItemHead.less +++ b/src/apps/content-editor/src/app/views/ItemEdit/ItemHead/ItemHead.less @@ -2,8 +2,9 @@ @import "~@zesty-io/core/typography.less"; .ItemHead { - height: calc(100vh - 54px); + flex: 1; overflow: scroll; + background-color: #f9fafb; // .Head { // display: flex; diff --git a/src/apps/content-editor/src/app/views/ItemEdit/Meta/Meta.js b/src/apps/content-editor/src/app/views/ItemEdit/Meta/Meta.js index 7059eb9727..0d50f04a9a 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/Meta/Meta.js +++ b/src/apps/content-editor/src/app/views/ItemEdit/Meta/Meta.js @@ -8,25 +8,6 @@ import styles from "./Meta.less"; export function Meta(props) { return (
-
- -
-
{props.model && props.model?.type === "dataset" ? ( diff --git a/src/apps/content-editor/src/app/views/ItemEdit/Meta/Meta.less b/src/apps/content-editor/src/app/views/ItemEdit/Meta/Meta.less index 129a521873..f73ba1b173 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/Meta/Meta.less +++ b/src/apps/content-editor/src/app/views/ItemEdit/Meta/Meta.less @@ -1,9 +1,10 @@ .MetaEdit { display: flex; - height: calc(100vh - 54px); + flex: 1; + background-color: #f9fafb; overflow: scroll; flex-direction: column; .MetaWrap { - margin: 32px; + margin: 4px 32px 20px 32px; } } diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/ItemEditHeaderActions.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/ItemEditHeaderActions.tsx new file mode 100644 index 0000000000..bc7e9effd9 --- /dev/null +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/ItemEditHeaderActions.tsx @@ -0,0 +1,513 @@ +import { + Box, + Button, + ButtonGroup, + IconButton, + Typography, + Tooltip, + Menu, + MenuItem, + ListItemIcon, + Dialog, + DialogTitle, + DialogActions, +} from "@mui/material"; +import { + useCreateItemPublishingMutation, + useDeleteItemPublishingMutation, + useGetAuditsQuery, + useGetItemPublishingsQuery, +} from "../../../../../../../../shell/services/instance"; +import { useHistory, useParams } from "react-router"; +import { useEffect, useState } from "react"; +import { + ContentItem, + Publishing, +} from "../../../../../../../../shell/services/types"; +import { + SaveRounded, + MoreHorizRounded, + ContentCopyRounded, + ArrowDropDownRounded, + CloudUploadRounded, + CheckCircleRounded, + UnpublishedRounded, + CalendarTodayRounded, + ManageAccountsRounded, + ScheduleRounded, +} from "@mui/icons-material"; +import { useDispatch, useSelector } from "react-redux"; +import { AppState } from "../../../../../../../../shell/store/types"; +import { useMetaKey } from "../../../../../../../../shell/hooks/useMetaKey"; +import { fetchItemPublishing } from "../../../../../../../../shell/store/content"; +import { LoadingButton } from "@mui/lab"; +import { useGetUsersQuery } from "../../../../../../../../shell/services/accounts"; +import { formatDate } from "../../../../../../../../utility/formatDate"; +import { ScheduleFlyout } from "../Header/ItemVersioning/ScheduleFlyout"; + +type ContentItemWithDirtyAndPublishing = ContentItem & { + dirty: boolean; + publishing: Publishing; + scheduling: any; +}; + +type ItemEditHeaderActionsProps = { + saving: boolean; + onSave: () => void; +}; + +export const ItemEditHeaderActions = ({ + saving, + onSave, +}: ItemEditHeaderActionsProps) => { + const { modelZUID, itemZUID } = useParams<{ + modelZUID: string; + itemZUID: string; + }>(); + const dispatch = useDispatch(); + const history = useHistory(); + const [publishMenu, setPublishMenu] = useState(null); + const [publishAfterSave, setPublishAfterSave] = useState(false); + const [unpublishDialogOpen, setUnpublishDialogOpen] = useState(false); + const [scheduledPublishDialogOpen, setScheduledPublishDialogOpen] = + useState(false); + const [scheduleAfterSave, setScheduleAfterSave] = useState(false); + const item = useSelector( + (state: AppState) => + state.content[itemZUID] as ContentItemWithDirtyAndPublishing + ); + const { data: users } = useGetUsersQuery(); + const { data: itemAudit } = useGetAuditsQuery({ + affectedZUID: itemZUID, + }); + const [createPublishing, { isLoading: publishing }] = + useCreateItemPublishingMutation(); + const [deleteItemPublishing, { isLoading: unpublishing }] = + useDeleteItemPublishingMutation(); + const lastItemUpdateAudit = itemAudit?.find((audit) => audit.action === 2); + const { data: itemPublishings, isFetching } = useGetItemPublishingsQuery({ + modelZUID, + itemZUID, + }); + const activePublishing = itemPublishings?.find( + (itemPublishing) => itemPublishing._active + ); + + const isPublished = activePublishing?.version === item?.meta.version; + const isScheduled = item?.scheduling?.isScheduled; + + const saveShortcut = useMetaKey("s", undefined, () => { + if (item?.dirty) { + onSave(); + } + }); + + const publishShortcut = useMetaKey("p", undefined, () => { + if (item?.dirty) { + setPublishAfterSave(true); + onSave(); + } else { + handlePublish(); + } + }); + + const handlePublish = async () => { + // If item is scheduled, delete the scheduled publishing first + if (isScheduled) { + await deleteItemPublishing({ + modelZUID, + itemZUID, + publishingZUID: item?.scheduling?.ZUID, + }); + } + createPublishing({ + modelZUID, + itemZUID, + body: { + version: item?.meta.version, + publishAt: "now", + unpublishAt: "never", + }, + }).then(() => { + // Retain non rtk-query fetch of item publishing for legacy code + dispatch(fetchItemPublishing(modelZUID, itemZUID)); + }); + }; + + const handleUnpublish = async () => { + deleteItemPublishing({ + modelZUID, + itemZUID, + publishingZUID: activePublishing?.ZUID, + }).then(() => { + // Retain non rtk-query fetch of item publishing for legacy code + dispatch(fetchItemPublishing(modelZUID, itemZUID)); + setUnpublishDialogOpen(false); + }); + }; + + useEffect(() => { + // If publish after save is queued and the item was successfully saved, publish + if ( + publishAfterSave && + activePublishing?.version !== item?.meta.version && + !saving + ) { + handlePublish(); + setPublishAfterSave(false); + } + }, [item, publishAfterSave, saving, activePublishing]); + + useEffect(() => { + // If schedule after save is queued and the item was successfully saved, schedule + if ( + scheduleAfterSave && + activePublishing?.version !== item?.meta.version && + !saving + ) { + setScheduledPublishDialogOpen(true); + setScheduleAfterSave(false); + } + }, [item, scheduleAfterSave, saving, activePublishing]); + + console.log("tesint data", item?.publishing); + + return ( + <> + + setPublishMenu(e.currentTarget)} + > + + + + + + + + + + + Save Item
+ {saveShortcut} +
+ ) : ( +
+ v{item?.meta?.version} saved on
+ {formatDate(item?.meta?.updatedAt)}
+ by {lastItemUpdateAudit?.firstName}{" "} + {lastItemUpdateAudit?.lastName} +
+ ) + } + placement="bottom" + > + {item?.dirty ? ( + } + size="small" + onClick={() => { + onSave(); + }} + loading={saving && !publishAfterSave} + > + Save + + ) : ( + + + + Saved + + + )} + + {!isScheduled && ( + + {item?.dirty ? "Save & Publish Item" : "Publish Item"}
+ {publishShortcut} +
+ ) : ( +
+ v{activePublishing?.version} published on
+ by {formatDate(activePublishing?.publishAt)}
+ { + users?.find( + (user: any) => + user.ZUID === activePublishing?.publishedByUserZUID + )?.firstName + }{" "} + { + users?.find( + (user: any) => + user.ZUID === activePublishing?.publishedByUserZUID + )?.lastName + } +
+ ) + } + placement="bottom" + > + {!isPublished || item?.dirty || publishAfterSave || isFetching ? ( + + } + sx={{ + color: "common.white", + whiteSpace: "nowrap", + }} + onClick={() => { + if (item?.dirty) { + setPublishAfterSave(true); + onSave(); + } else { + handlePublish(); + } + }} + loading={publishing || publishAfterSave || isFetching} + color="success" + variant="contained" + > + {item?.dirty ? "Save & Publish" : "Publish"} + + + + ) : ( + + + + + Published + + + { + setPublishMenu(e.currentTarget); + }} + > + + + + )} + + )} + {isScheduled && ( + + v{item?.scheduling?.version} published on
+ {formatDate(item?.scheduling?.publishAt)}
+ by{" "} + { + users?.find( + (user: any) => + user.ZUID === item?.scheduling?.publishedByUserZUID + )?.firstName + }{" "} + { + users?.find( + (user: any) => + user.ZUID === item?.scheduling?.publishedByUserZUID + )?.lastName + } +
+ } + placement="bottom" + > + + + + + Scheduled + + + { + setPublishMenu(e.currentTarget); + }} + > + + + + + )} + + setPublishMenu(null)} + anchorOrigin={{ + vertical: "bottom", + horizontal: "right", + }} + transformOrigin={{ + vertical: -8, + horizontal: "right", + }} + anchorEl={publishMenu} + open={!!publishMenu} + > + { + if (item?.dirty) { + setPublishAfterSave(true); + onSave(); + } else if (isScheduled) { + handlePublish(); + } else if (isPublished) { + setUnpublishDialogOpen(true); + } else { + handlePublish(); + } + setPublishMenu(null); + }} + > + + {item?.dirty ? ( + + ) : isScheduled ? ( + + ) : isPublished ? ( + + ) : ( + + )} + + {item?.dirty + ? "Save & Publish" + : isScheduled + ? "Publish Now" + : isPublished + ? "Unpublish Now" + : "Publish Now"} + + { + if (item?.dirty) { + setScheduleAfterSave(true); + onSave(); + } else if (isScheduled) { + setScheduledPublishDialogOpen(true); + } else if (isPublished) { + console.log("schedule unpublish"); + //setUnpublishDialogOpen(true); + } else { + setScheduledPublishDialogOpen(true); + } + setPublishMenu(null); + }} + > + + + + {item?.dirty + ? "Save & Schedule Publish" + : isScheduled + ? "Unschedule Publish" + : isPublished + ? "Schedule Unpublish" + : "Schedule Publish"} + + history.push("publishings")}> + + + + Manage Publish Status + + + {unpublishDialogOpen && ( + setUnpublishDialogOpen(false)} + > + + + + + + + Unpublish Content Item: + {" "} + {item?.web?.metaTitle || item?.web?.metaLinkText} + + + This will make the it immediately unavailable on all of your + platforms. You can always republish this item by clicking on the + publish button. + + + + + handleUnpublish()} + loading={unpublishing} + > + Unpublish Item + + + + )} + setScheduledPublishDialogOpen(false)} + /> + + ); +}; diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/index.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/index.tsx index 94b7c1a618..51fb708349 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/index.tsx +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/index.tsx @@ -1,13 +1,16 @@ -import { Box, SvgIcon, Tabs, Tab, Typography } from "@mui/material"; +import { Box, SvgIcon, Tabs, Tab, Typography, Tooltip } from "@mui/material"; import { - useGetContentItemQuery, useGetContentModelQuery, useGetContentNavItemsQuery, } from "../../../../../../../../shell/services/instance"; import { Home, theme } from "@zesty-io/material"; import { useHistory, useLocation, useParams } from "react-router"; import { useMemo } from "react"; -import { ContentNavItem } from "../../../../../../../../shell/services/types"; +import { + ContentItem, + ContentNavItem, + Publishing, +} from "../../../../../../../../shell/services/types"; import { MODEL_ICON } from "../../../../../../../../shell/constants"; import { Link } from "react-router-dom"; import { ThemeProvider } from "@mui/material/styles"; @@ -20,6 +23,9 @@ import { ManageAccountsRounded, } from "@mui/icons-material"; import { CustomBreadcrumbs } from "../../../../../../../../shell/components/CustomBreadcrumbs"; +import { useSelector } from "react-redux"; +import { AppState } from "../../../../../../../../shell/store/types"; +import { ItemEditHeaderActions } from "./ItemEditHeaderActions"; const tabs = [ { @@ -54,7 +60,16 @@ const tabs = [ }, ]; -export const Header2 = () => { +type ContentItemWithDirtyAndPublishing = ContentItem & { + dirty: boolean; + publishing: Publishing; +}; + +type HeaderProps = { + saving: boolean; + onSave: () => void; +}; +export const Header2 = ({ saving, onSave }: HeaderProps) => { const { modelZUID, itemZUID } = useParams<{ modelZUID: string; itemZUID: string; @@ -62,8 +77,11 @@ export const Header2 = () => { const location = useLocation(); const history = useHistory(); - const { data: contentItem } = useGetContentItemQuery(itemZUID); const { data: model } = useGetContentModelQuery(modelZUID); + const item = useSelector( + (state: AppState) => + state.content[itemZUID] as ContentItemWithDirtyAndPublishing + ); return ( @@ -79,21 +97,26 @@ export const Header2 = () => { }, }} > - - - {contentItem?.web?.metaTitle || contentItem?.web?.metaLinkText} - + + + + + {item?.web?.metaTitle || item?.web?.metaLinkText} + + + + { modelZUID: string; itemZUID: string; }>(); + const history = useHistory(); const breadcrumbData = useMemo(() => { let activeItem = nav?.find((item) => item.ZUID === itemZUID); @@ -158,25 +182,45 @@ const ContentBreadcrumbs = () => { parent = null; } } - return crumbs; + return crumbs.map((item) => ({ + node: , + onClick: () => { + if (item.type === "item") { + history.push(`/content/${item.contentModelZUID}/${item.ZUID}`); + } else { + history.push(`/content/${item.contentModelZUID}`); + } + }, + })); }, [nav, itemZUID]); return ( - - item.label === "Homepage")?.contentModelZUID - }/${nav?.find((item) => item.label === "Homepage")?.ZUID}`} - > - - - {breadcrumbData.map((item) => ( - - ))} - + item.label === "Homepage")?.contentModelZUID + }/${nav?.find((item) => item.label === "Homepage")?.ZUID}`} + > + + + ), + onClick: () => { + history.push( + `/content/${ + nav?.find((item) => item.label === "Homepage")?.contentModelZUID + }/${nav?.find((item) => item.label === "Homepage")?.ZUID}` + ); + }, + }, + ...breadcrumbData, + ]} + /> ); }; @@ -196,18 +240,7 @@ export const Breadcrumb = ({ contentNavItem }: BreadcrumbProps) => { fontSize="small" component={MODEL_ICON[model?.type]} /> - {/* @ts-ignore */} - + {contentNavItem.label} diff --git a/src/apps/schema/src/app/components/ModelApi/ApiCard.tsx b/src/apps/schema/src/app/components/ModelApi/ApiCard.tsx index 52e643736c..79f2fbf82c 100644 --- a/src/apps/schema/src/app/components/ModelApi/ApiCard.tsx +++ b/src/apps/schema/src/app/components/ModelApi/ApiCard.tsx @@ -27,7 +27,7 @@ export const ApiCard = ({ type }: Props) => { return ( { return ( - + { meets your needs. - - - {apiTypes.map((apiType) => ( - - ))} - + + + {apiTypes.map((apiType) => ( + + ))} ); diff --git a/src/apps/schema/src/app/components/ModelApi/ApiDetails.tsx b/src/apps/schema/src/app/components/ModelApi/ApiDetails.tsx index cac9b02b96..7d0603b1c3 100644 --- a/src/apps/schema/src/app/components/ModelApi/ApiDetails.tsx +++ b/src/apps/schema/src/app/components/ModelApi/ApiDetails.tsx @@ -139,7 +139,14 @@ export const ApiDetails = () => { ) : ( - + {selectedType === "site-generators" && !headlessEnabled ? ( void; +}; type CustomBreadcrumbsProps = { - children: ReactNode[]; + items: BreadCrumbItem[]; }; -export const CustomBreadcrumbs = ({ children }: CustomBreadcrumbsProps) => { +export const CustomBreadcrumbs = ({ items }: CustomBreadcrumbsProps) => { const [showBreadcrumbPopover, setShowBreadcrumbPopover] = useState(null); - const CollapseButton = useCallback(() => { - return ( - { - event.stopPropagation(); - setShowBreadcrumbPopover(event.currentTarget); - }} - sx={{ - "&:hover": { - color: "primary.main", - }, - }} - > - - - ); - }, []); - return ( <> { + event.stopPropagation(); + setShowBreadcrumbPopover(event.target as HTMLButtonElement); + }, + }, }} > - {children} + {items.map((item, index) => ( + + {item.node} + + ))} {/* Trailing slash */} @@ -48,18 +56,20 @@ export const CustomBreadcrumbs = ({ children }: CustomBreadcrumbsProps) => { open={!!showBreadcrumbPopover} onClose={() => setShowBreadcrumbPopover(null)} > - {Children.toArray(children) - .slice(2, -1) - .map((item, index) => ( - - {item} - - ))} + {items.slice(2, -1).map((item, index) => ( + { + setShowBreadcrumbPopover(null); + item.onClick?.(); + }} + > + {item.node} + + ))} ); diff --git a/src/shell/services/instance.ts b/src/shell/services/instance.ts index 74bd8c7454..c29ed10811 100644 --- a/src/shell/services/instance.ts +++ b/src/shell/services/instance.ts @@ -44,6 +44,7 @@ export const instanceApi = createApi({ "Scripts", "Languages", "ContentNav", + "ContentItem", ], endpoints: (builder) => ({ // https://www.zesty.io/docs/instances/api-reference/content/models/items/publishings/#Get-All-Item-Publishings @@ -73,6 +74,28 @@ export const instanceApi = createApi({ // TODO: Remove once all item publishing mutations are using rtk query keepUnusedDataFor: 0, }), + // https://www.zesty.io/docs/instances/api-reference/content/models/items/publishings/#Create-Item-Publishing + createItemPublishing: builder.mutation< + any, + { + modelZUID: string; + itemZUID: string; + body: { + publishAt: string; + unpublishAt: string; + version: number; + }; + } + >({ + query: ({ modelZUID, itemZUID, body }) => ({ + url: `content/models/${modelZUID}/items/${itemZUID}/publishings`, + method: "POST", + body, + }), + invalidatesTags: (result, error, id) => [ + { type: "ItemPublishing", id: id.itemZUID }, + ], + }), // https://www.zesty.io/docs/instances/api-reference/content/models/items/publishings/#Delete-Item-Publishing deleteItemPublishing: builder.mutation< any, @@ -464,6 +487,32 @@ export const instanceApi = createApi({ transformResponse: getResponseData, providesTags: ["Languages"], }), + // https://www.zesty.io/docs/instances/api-reference/content/models/items/versions/#Get-All-Item-Versions + getContentItemVersions: builder.query< + ContentItem[], + { + modelZUID: string; + itemZUID: string; + } + >({ + query: ({ modelZUID, itemZUID }) => + `/content/models/${modelZUID}/items/${itemZUID}/versions`, + transformResponse: getResponseData, + }), + // https://www.zesty.io/docs/instances/api-reference/content/models/items/#Update-Item + updateContentItem: builder.mutation< + any, + { modelZUID: string; itemZUID: string; body: Partial } + >({ + query: ({ modelZUID, itemZUID, body }) => ({ + url: `content/models/${modelZUID}/items/${itemZUID}`, + method: "PUT", + body, + }), + invalidatesTags: (result, error, arg) => [ + { type: "ContentItem", id: arg.itemZUID }, + ], + }), }), }); @@ -473,6 +522,7 @@ export const { useGetAuditsQuery, useGetItemPublishingsQuery, useGetAllPublishingsQuery, + useCreateItemPublishingMutation, useDeleteItemPublishingMutation, useGetContentItemQuery, useGetContentItemsQuery, @@ -504,4 +554,6 @@ export const { useGetScriptsQuery, useCreateInstanceSettingsMutation, useGetLangsQuery, + useGetContentItemVersionsQuery, + useUpdateContentItemMutation, } = instanceApi; diff --git a/src/shell/store/content.js b/src/shell/store/content.js index a0c615b482..02d677e90b 100644 --- a/src/shell/store/content.js +++ b/src/shell/store/content.js @@ -432,18 +432,17 @@ export function saveItem(itemZUID, action = "") { web: item.web, }, } - ).then((res) => { + ).then(async (res) => { dispatch(instanceApi.util.invalidateTags(["ContentNav"])); dispatch({ type: "UNMARK_ITEMS_DIRTY", items: [itemZUID], }); - dispatch(fetchItem(item.meta.contentModelZUID, itemZUID)).then(() => { - // NOTE: Communicate with ActivePreview that this item - // was updated and it needs to refreshed - zesty.trigger("PREVIEW_REFRESH"); - }); + await dispatch(fetchItem(item.meta.contentModelZUID, itemZUID)); + + zesty.trigger("PREVIEW_REFRESH"); + return res; }); }; @@ -588,6 +587,11 @@ export function publish(modelZUID, itemZUID, data, meta = {}) { ); }) .then(() => { + dispatch( + instanceApi.util.invalidateTags([ + { type: "ItemPublishing", itemZUID }, + ]) + ); return dispatch(fetchItemPublishing(modelZUID, itemZUID)); }) .catch((err) => { @@ -640,6 +644,11 @@ export function unpublish(modelZUID, itemZUID, publishZUID, options = {}) { ); }) .then(() => { + dispatch( + instanceApi.util.invalidateTags([ + { type: "ItemPublishing", itemZUID }, + ]) + ); return dispatch(fetchItemPublishing(modelZUID, itemZUID)); }) .catch((err) => { diff --git a/src/utility/formatDate.ts b/src/utility/formatDate.ts new file mode 100644 index 0000000000..0c3db223c3 --- /dev/null +++ b/src/utility/formatDate.ts @@ -0,0 +1,24 @@ +import moment from "moment-timezone"; + +export const formatDate = (dateString: string) => { + // Get the user's timezone + const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone; + + const inputDate = moment(dateString).tz(timeZone); + const currentDate = moment().tz(timeZone); + let formattedDate; + + // Check for today or yesterday + if (inputDate.isSame(currentDate, "day")) { + formattedDate = "Today"; + } else if (inputDate.isSame(currentDate.subtract(1, "day"), "day")) { + formattedDate = "Yesterday"; + } else { + formattedDate = inputDate.format("MMM D"); + } + + // Get the timezone abbreviation + const tzAbbreviation = inputDate.format("z"); + + return `${formattedDate}, ${inputDate.format("h:mm A")} ${tzAbbreviation}`; +}; From 69f3f48b5a5a3d6dd6ff65db6aeef5725471c955 Mon Sep 17 00:00:00 2001 From: Andres Date: Sun, 20 Aug 2023 19:48:56 -0700 Subject: [PATCH 04/59] Version and language selector --- .../Header2/ItemEditHeaderActions.tsx | 2 - .../components/Header2/LanguageSelector.tsx | 130 ++++++++++++++++++ .../components/Header2/VersionSelector.tsx | 115 ++++++++++++++++ .../ItemEdit/components/Header2/index.tsx | 64 +++++---- src/shell/services/instance.ts | 4 + src/shell/store/content.js | 3 + 6 files changed, 288 insertions(+), 30 deletions(-) create mode 100644 src/apps/content-editor/src/app/views/ItemEdit/components/Header2/LanguageSelector.tsx create mode 100644 src/apps/content-editor/src/app/views/ItemEdit/components/Header2/VersionSelector.tsx diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/ItemEditHeaderActions.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/ItemEditHeaderActions.tsx index bc7e9effd9..5ebf4a767c 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/ItemEditHeaderActions.tsx +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/ItemEditHeaderActions.tsx @@ -170,8 +170,6 @@ export const ItemEditHeaderActions = ({ } }, [item, scheduleAfterSave, saving, activePublishing]); - console.log("tesint data", item?.publishing); - return ( <> diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/LanguageSelector.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/LanguageSelector.tsx new file mode 100644 index 0000000000..fc241c3e23 --- /dev/null +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/LanguageSelector.tsx @@ -0,0 +1,130 @@ +import { Button, Menu, MenuItem, Box } from "@mui/material"; +import { + useGetContentItemVersionsQuery, + useGetItemPublishingsQuery, + useGetLangsQuery, +} from "../../../../../../../../shell/services/instance"; +import { useHistory, useLocation, useParams } from "react-router"; +import { KeyboardArrowDownRounded } from "@mui/icons-material"; +import { useEffect, useState } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { ContentItem } from "../../../../../../../../shell/services/types"; +import { AppState } from "../../../../../../../../shell/store/types"; +import { selectLang } from "../../../../../../../../shell/store/user"; + +const getCountryCode = (langCode: string) => { + const splitTag = langCode.split("-"); + const countryCode = + splitTag.length === 2 ? splitTag[1] : langCode.toUpperCase(); + return countryCode; +}; + +const getFlagEmojiFromIETFTag = (langCode: string) => { + const countryCode = getCountryCode(langCode); + + // Convert country code to flag emoji. + // Unicode flag emojis are made up of regional indicator symbols, which are a sequence of two letters. + const baseOffset = 0x1f1e6; + return ( + String.fromCodePoint(baseOffset + (countryCode.charCodeAt(0) - 65)) + + String.fromCodePoint(baseOffset + (countryCode.charCodeAt(1) - 65)) + ); +}; + +export const LanguageSelector = () => { + const dispatch = useDispatch(); + const history = useHistory(); + const location = useLocation(); + const { modelZUID, itemZUID } = useParams<{ + modelZUID: string; + itemZUID: string; + }>(); + const [anchorEl, setAnchorEl] = useState(null); + const { data: versions } = useGetContentItemVersionsQuery({ + modelZUID, + itemZUID, + }); + const { data: itemPublishings } = useGetItemPublishingsQuery({ + modelZUID, + itemZUID, + }); + const { data: languages } = useGetLangsQuery({}); + + const item = useSelector( + (state: AppState) => state.content[itemZUID] as ContentItem + ); + + const onSelect = (langId: string) => { + dispatch(selectLang(langId)); + + // If we are at a content item level then reload newly selected language item + const parts = location.pathname.split("/"); + if (parts[3]) { + const subpath = parts.slice(0, 3); + // @ts-ignore + subpath.push(item.siblings[langId]); + history.push(`${subpath.join("/")}`); + } + }; + + const activeLanguage = languages?.find( + (lang) => lang.ID === item?.meta?.langID + ) || { + code: "en-US", + }; + + return ( + <> + + setAnchorEl(null)} + anchorOrigin={{ + vertical: "bottom", + horizontal: "right", + }} + transformOrigin={{ + vertical: -8, + horizontal: "right", + }} + anchorEl={anchorEl} + open={!!anchorEl} + PaperProps={{ + style: { + width: "280px", + }, + }} + > + {languages?.map((language) => ( + { + setAnchorEl(null); + onSelect(language.code); + }} + > + {getFlagEmojiFromIETFTag(language.code)}{" "} + {language.code.split("-")[0]?.toUpperCase()} ( + {getCountryCode(language.code)}) + + ))} + + + ); +}; diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/VersionSelector.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/VersionSelector.tsx new file mode 100644 index 0000000000..ca02b3b8c4 --- /dev/null +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/VersionSelector.tsx @@ -0,0 +1,115 @@ +import { Button, Menu, MenuItem, Box } from "@mui/material"; +import { + useGetContentItemVersionsQuery, + useGetItemPublishingsQuery, +} from "../../../../../../../../shell/services/instance"; +import { useLocation, useParams } from "react-router"; +import { KeyboardArrowDownRounded } from "@mui/icons-material"; +import { useEffect, useState } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { ContentItem } from "../../../../../../../../shell/services/types"; +import { AppState } from "../../../../../../../../shell/store/types"; +import { formatDate } from "../../../../../../../../utility/formatDate"; + +export const VersionSelector = () => { + const dispatch = useDispatch(); + const { modelZUID, itemZUID } = useParams<{ + modelZUID: string; + itemZUID: string; + }>(); + const location = useLocation(); + const queryParams = new URLSearchParams(location.search); + const [anchorEl, setAnchorEl] = useState(null); + const { data: versions } = useGetContentItemVersionsQuery({ + modelZUID, + itemZUID, + }); + const { data: itemPublishings } = useGetItemPublishingsQuery({ + modelZUID, + itemZUID, + }); + + const item = useSelector( + (state: AppState) => state.content[itemZUID] as ContentItem + ); + + const onSelect = (version: ContentItem) => { + dispatch({ + type: "LOAD_ITEM_VERSION", + itemZUID: itemZUID, + data: version, + }); + }; + + useEffect(() => { + const versionParam = queryParams.get("version"); + const version = versions?.find((v) => v.meta.version === +versionParam); + if (version) { + onSelect(version); + } + }, [queryParams.get("version"), versions]); + + return ( + <> + + setAnchorEl(null)} + anchorOrigin={{ + vertical: "bottom", + horizontal: "right", + }} + transformOrigin={{ + vertical: -8, + horizontal: "right", + }} + anchorEl={anchorEl} + open={!!anchorEl} + PaperProps={{ + style: { + maxHeight: "496px", + overflow: "auto", + width: "320px", + }, + }} + > + {versions?.map((version) => ( + { + setAnchorEl(null); + onSelect(version); + }} + > + + + {`v${version.meta.version}${ + itemPublishings?.find( + (itemPublishing) => itemPublishing._active + )?.version === version.meta.version + ? " - Live" + : "" + }`} + + {formatDate(version.web.createdAt)} + + + ))} + + + ); +}; diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/index.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/index.tsx index 51fb708349..109e04693d 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/index.tsx +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/index.tsx @@ -26,6 +26,8 @@ import { CustomBreadcrumbs } from "../../../../../../../../shell/components/Cust import { useSelector } from "react-redux"; import { AppState } from "../../../../../../../../shell/store/types"; import { ItemEditHeaderActions } from "./ItemEditHeaderActions"; +import { VersionSelector } from "./VersionSelector"; +import { LanguageSelector } from "./LanguageSelector"; const tabs = [ { @@ -117,34 +119,40 @@ export const Header2 = ({ saving, onSave }: HeaderProps) => { - - history.push(`/content/${modelZUID}/${itemZUID}/${value}`) - } - sx={{ - position: "relative", - top: "2px", - }} - > - {tabs.map((tab) => { - if (tab.value === "meta" && model?.type === "dataset") return; - return ( - } - iconPosition="start" - /> - ); - })} - + + + history.push(`/content/${modelZUID}/${itemZUID}/${value}`) + } + sx={{ + position: "relative", + top: "2px", + }} + > + {tabs.map((tab) => { + if (tab.value === "meta" && model?.type === "dataset") return; + return ( + } + iconPosition="start" + /> + ); + })} + + + + + + ); diff --git a/src/shell/services/instance.ts b/src/shell/services/instance.ts index c29ed10811..e212f33586 100644 --- a/src/shell/services/instance.ts +++ b/src/shell/services/instance.ts @@ -45,6 +45,7 @@ export const instanceApi = createApi({ "Languages", "ContentNav", "ContentItem", + "ItemVersions", ], endpoints: (builder) => ({ // https://www.zesty.io/docs/instances/api-reference/content/models/items/publishings/#Get-All-Item-Publishings @@ -498,6 +499,9 @@ export const instanceApi = createApi({ query: ({ modelZUID, itemZUID }) => `/content/models/${modelZUID}/items/${itemZUID}/versions`, transformResponse: getResponseData, + providesTags: (result, error, id) => [ + { type: "ItemVersions", id: id.itemZUID }, + ], }), // https://www.zesty.io/docs/instances/api-reference/content/models/items/#Update-Item updateContentItem: builder.mutation< diff --git a/src/shell/store/content.js b/src/shell/store/content.js index 02d677e90b..7e9f53afb4 100644 --- a/src/shell/store/content.js +++ b/src/shell/store/content.js @@ -434,6 +434,9 @@ export function saveItem(itemZUID, action = "") { } ).then(async (res) => { dispatch(instanceApi.util.invalidateTags(["ContentNav"])); + dispatch( + instanceApi.util.invalidateTags([{ type: "ItemVersions", itemZUID }]) + ); dispatch({ type: "UNMARK_ITEMS_DIRTY", items: [itemZUID], From 64cf5296601e85da82644e9d203ea4876e97dcab Mon Sep 17 00:00:00 2001 From: Andres Date: Sun, 20 Aug 2023 22:36:54 -0700 Subject: [PATCH 05/59] move files --- .../src/app/views/ItemEdit/Content/Content.js | 2 +- .../src/app/views/ItemEdit/ItemEdit.js | 4 +- .../ItemEditHeader/ItemEditBreadcrumbs.tsx | 109 ++++++++++++++++++ .../ItemEditHeaderActions.tsx | 0 .../LanguageSelector.tsx | 0 .../VersionSelector.tsx | 0 .../{Header2 => ItemEditHeader}/index.tsx | 102 +--------------- 7 files changed, 115 insertions(+), 102 deletions(-) create mode 100644 src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditBreadcrumbs.tsx rename src/apps/content-editor/src/app/views/ItemEdit/components/{Header2 => ItemEditHeader}/ItemEditHeaderActions.tsx (100%) rename src/apps/content-editor/src/app/views/ItemEdit/components/{Header2 => ItemEditHeader}/LanguageSelector.tsx (100%) rename src/apps/content-editor/src/app/views/ItemEdit/components/{Header2 => ItemEditHeader}/VersionSelector.tsx (100%) rename src/apps/content-editor/src/app/views/ItemEdit/components/{Header2 => ItemEditHeader}/index.tsx (61%) diff --git a/src/apps/content-editor/src/app/views/ItemEdit/Content/Content.js b/src/apps/content-editor/src/app/views/ItemEdit/Content/Content.js index 12b588853a..89a68739db 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/Content/Content.js +++ b/src/apps/content-editor/src/app/views/ItemEdit/Content/Content.js @@ -2,7 +2,7 @@ import { useSelector } from "react-redux"; import cx from "classnames"; import { Editor } from "../../../components/Editor"; -import { Header2 } from "../components/Header2"; +import { Header2 } from "../components/ItemEditHeader"; import { ItemVersioning } from "../components/Header/ItemVersioning"; import { PreviewMode } from "../../../components/Editor/PreviewMode"; import { ActionsDrawer } from "./ActionsDrawer"; diff --git a/src/apps/content-editor/src/app/views/ItemEdit/ItemEdit.js b/src/apps/content-editor/src/app/views/ItemEdit/ItemEdit.js index 61617857ec..53fdbdb3ae 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/ItemEdit.js +++ b/src/apps/content-editor/src/app/views/ItemEdit/ItemEdit.js @@ -40,7 +40,7 @@ import { ApiCardList } from "../../../../../schema/src/app/components/ModelApi/A import { theme } from "@zesty-io/material"; import { ThemeProvider } from "@mui/material/styles"; import { Box } from "@mui/material"; -import { Header2 } from "./components/Header2"; +import { ItemEditHeader } from "./components/ItemEditHeader"; const selectSortedModelFields = createSelector( (state) => state.fields, @@ -289,7 +289,7 @@ export default function ItemEdit() { component="section" sx={{ display: "flex", flexDirection: "column", height: "100%" }} > - + { + const { data: nav } = useGetContentNavItemsQuery(); + const { modelZUID, itemZUID } = useParams<{ + modelZUID: string; + itemZUID: string; + }>(); + const history = useHistory(); + + const breadcrumbData = useMemo(() => { + let activeItem = nav?.find((item) => item.ZUID === itemZUID); + const crumbs = []; + + // If nav item is not found that means that it is part of a dataset so we push that dataset onto the breadcrumb + if (!activeItem) { + activeItem = nav?.find((item) => item.ZUID === modelZUID); + if (activeItem) { + crumbs.push(activeItem); + } else { + return []; + } + } + + let parent = activeItem.parentZUID; + while (parent) { + const parentItem = nav?.find((item) => item.ZUID === parent); + if (parentItem) { + crumbs.unshift(parentItem); + parent = parentItem.parentZUID; + } else { + parent = null; + } + } + return crumbs.map((item) => ({ + node: , + onClick: () => { + if (item.type === "item") { + history.push(`/content/${item.contentModelZUID}/${item.ZUID}`); + } else { + history.push(`/content/${item.contentModelZUID}`); + } + }, + })); + }, [nav, itemZUID]); + + return ( + item.label === "Homepage")?.contentModelZUID + }/${nav?.find((item) => item.label === "Homepage")?.ZUID}`} + > + + + ), + onClick: () => { + history.push( + `/content/${ + nav?.find((item) => item.label === "Homepage")?.contentModelZUID + }/${nav?.find((item) => item.label === "Homepage")?.ZUID}` + ); + }, + }, + ...breadcrumbData, + ]} + /> + ); +}; + +type BreadcrumbProps = { + contentNavItem: ContentNavItem; +}; + +export const Breadcrumb = ({ contentNavItem }: BreadcrumbProps) => { + const { data: model } = useGetContentModelQuery( + contentNavItem.contentModelZUID + ); + + return ( + + + + {contentNavItem.label} + + + ); +}; diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/ItemEditHeaderActions.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx similarity index 100% rename from src/apps/content-editor/src/app/views/ItemEdit/components/Header2/ItemEditHeaderActions.tsx rename to src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/LanguageSelector.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/LanguageSelector.tsx similarity index 100% rename from src/apps/content-editor/src/app/views/ItemEdit/components/Header2/LanguageSelector.tsx rename to src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/LanguageSelector.tsx diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/VersionSelector.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/VersionSelector.tsx similarity index 100% rename from src/apps/content-editor/src/app/views/ItemEdit/components/Header2/VersionSelector.tsx rename to src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/VersionSelector.tsx diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/index.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx similarity index 61% rename from src/apps/content-editor/src/app/views/ItemEdit/components/Header2/index.tsx rename to src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx index 109e04693d..f95a64b232 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/components/Header2/index.tsx +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx @@ -28,6 +28,7 @@ import { AppState } from "../../../../../../../../shell/store/types"; import { ItemEditHeaderActions } from "./ItemEditHeaderActions"; import { VersionSelector } from "./VersionSelector"; import { LanguageSelector } from "./LanguageSelector"; +import { ItemEditBreadcrumbs } from "./ItemEditBreadcrumbs"; const tabs = [ { @@ -71,7 +72,7 @@ type HeaderProps = { saving: boolean; onSave: () => void; }; -export const Header2 = ({ saving, onSave }: HeaderProps) => { +export const ItemEditHeader = ({ saving, onSave }: HeaderProps) => { const { modelZUID, itemZUID } = useParams<{ modelZUID: string; itemZUID: string; @@ -101,7 +102,7 @@ export const Header2 = ({ saving, onSave }: HeaderProps) => { > - + { ); }; - -const ContentBreadcrumbs = () => { - const { data: nav } = useGetContentNavItemsQuery(); - const { modelZUID, itemZUID } = useParams<{ - modelZUID: string; - itemZUID: string; - }>(); - const history = useHistory(); - - const breadcrumbData = useMemo(() => { - let activeItem = nav?.find((item) => item.ZUID === itemZUID); - const crumbs = []; - - // If nav item is not found that means that it is part of a dataset so we push that dataset onto the breadcrumb - if (!activeItem) { - activeItem = nav?.find((item) => item.ZUID === modelZUID); - if (activeItem) { - crumbs.push(activeItem); - } else { - return []; - } - } - - let parent = activeItem.parentZUID; - while (parent) { - const parentItem = nav?.find((item) => item.ZUID === parent); - if (parentItem) { - crumbs.unshift(parentItem); - parent = parentItem.parentZUID; - } else { - parent = null; - } - } - return crumbs.map((item) => ({ - node: , - onClick: () => { - if (item.type === "item") { - history.push(`/content/${item.contentModelZUID}/${item.ZUID}`); - } else { - history.push(`/content/${item.contentModelZUID}`); - } - }, - })); - }, [nav, itemZUID]); - - return ( - item.label === "Homepage")?.contentModelZUID - }/${nav?.find((item) => item.label === "Homepage")?.ZUID}`} - > - - - ), - onClick: () => { - history.push( - `/content/${ - nav?.find((item) => item.label === "Homepage")?.contentModelZUID - }/${nav?.find((item) => item.label === "Homepage")?.ZUID}` - ); - }, - }, - ...breadcrumbData, - ]} - /> - ); -}; - -type BreadcrumbProps = { - contentNavItem: ContentNavItem; -}; - -export const Breadcrumb = ({ contentNavItem }: BreadcrumbProps) => { - const { data: model } = useGetContentModelQuery( - contentNavItem.contentModelZUID - ); - - return ( - - - - {contentNavItem.label} - - - ); -}; From c0900a2d722340fa05457be133f8823c245a6ec6 Mon Sep 17 00:00:00 2001 From: Andres Date: Sun, 20 Aug 2023 23:13:59 -0700 Subject: [PATCH 06/59] re-org and permissions --- .../ItemEditHeader/ItemEditHeaderActions.tsx | 186 +++++++++--------- .../ItemEditHeader/UnpublishDialog.tsx | 69 +++++++ 2 files changed, 159 insertions(+), 96 deletions(-) create mode 100644 src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/UnpublishDialog.tsx diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx index 5ebf4a767c..a6c8a9dd74 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx @@ -8,9 +8,6 @@ import { Menu, MenuItem, ListItemIcon, - Dialog, - DialogTitle, - DialogActions, } from "@mui/material"; import { useCreateItemPublishingMutation, @@ -19,7 +16,7 @@ import { useGetItemPublishingsQuery, } from "../../../../../../../../shell/services/instance"; import { useHistory, useParams } from "react-router"; -import { useEffect, useState } from "react"; +import { useEffect, useMemo, useState } from "react"; import { ContentItem, Publishing, @@ -44,6 +41,15 @@ import { LoadingButton } from "@mui/lab"; import { useGetUsersQuery } from "../../../../../../../../shell/services/accounts"; import { formatDate } from "../../../../../../../../utility/formatDate"; import { ScheduleFlyout } from "../Header/ItemVersioning/ScheduleFlyout"; +import { UnpublishDialog } from "./UnpublishDialog"; +import { usePermission } from "../../../../../../../../shell/hooks/use-permissions"; + +const ITEM_STATES = { + dirty: "dirty", + published: "published", + scheduled: "scheduled", + draft: "draft", +} as const; type ContentItemWithDirtyAndPublishing = ContentItem & { dirty: boolean; @@ -66,6 +72,8 @@ export const ItemEditHeaderActions = ({ }>(); const dispatch = useDispatch(); const history = useHistory(); + const canPublish = usePermission("PUBLISH"); + const canUpdate = usePermission("UPDATE"); const [publishMenu, setPublishMenu] = useState(null); const [publishAfterSave, setPublishAfterSave] = useState(false); const [unpublishDialogOpen, setUnpublishDialogOpen] = useState(false); @@ -93,17 +101,14 @@ export const ItemEditHeaderActions = ({ (itemPublishing) => itemPublishing._active ); - const isPublished = activePublishing?.version === item?.meta.version; - const isScheduled = item?.scheduling?.isScheduled; - const saveShortcut = useMetaKey("s", undefined, () => { - if (item?.dirty) { + if (itemState === ITEM_STATES.dirty) { onSave(); } }); const publishShortcut = useMetaKey("p", undefined, () => { - if (item?.dirty) { + if (itemState === ITEM_STATES.dirty) { setPublishAfterSave(true); onSave(); } else { @@ -111,9 +116,21 @@ export const ItemEditHeaderActions = ({ } }); + const itemState = (() => { + if (item?.dirty) { + return ITEM_STATES.dirty; + } else if (item?.scheduling?.isScheduled) { + return ITEM_STATES.scheduled; + } else if (activePublishing?.version === item?.meta.version) { + return ITEM_STATES.published; + } else { + return ITEM_STATES.draft; + } + })(); + const handlePublish = async () => { // If item is scheduled, delete the scheduled publishing first - if (isScheduled) { + if (itemState === ITEM_STATES.scheduled) { await deleteItemPublishing({ modelZUID, itemZUID, @@ -190,7 +207,7 @@ export const ItemEditHeaderActions = ({ enterDelay={1000} enterNextDelay={1000} title={ - item?.dirty ? ( + itemState === ITEM_STATES.dirty ? (
Save Item
{saveShortcut} @@ -206,7 +223,7 @@ export const ItemEditHeaderActions = ({ } placement="bottom" > - {item?.dirty ? ( + {itemState === ITEM_STATES.dirty ? ( } @@ -215,6 +232,7 @@ export const ItemEditHeaderActions = ({ onSave(); }} loading={saving && !publishAfterSave} + disabled={canUpdate} > Save @@ -231,14 +249,18 @@ export const ItemEditHeaderActions = ({ )} - {!isScheduled && ( + {itemState !== ITEM_STATES.scheduled && canPublish && ( - {item?.dirty ? "Save & Publish Item" : "Publish Item"}
+ {itemState === ITEM_STATES.dirty + ? "Save & Publish Item" + : "Publish Item"}{" "} +
{publishShortcut}
) : ( @@ -262,7 +284,10 @@ export const ItemEditHeaderActions = ({ } placement="bottom" > - {!isPublished || item?.dirty || publishAfterSave || isFetching ? ( + {itemState === ITEM_STATES.draft || + itemState === ITEM_STATES.dirty || + publishAfterSave || + isFetching ? ( } @@ -271,7 +296,7 @@ export const ItemEditHeaderActions = ({ whiteSpace: "nowrap", }} onClick={() => { - if (item?.dirty) { + if (itemState === ITEM_STATES.dirty) { setPublishAfterSave(true); onSave(); } else { @@ -282,7 +307,9 @@ export const ItemEditHeaderActions = ({ color="success" variant="contained" > - {item?.dirty ? "Save & Publish" : "Publish"} + {itemState === ITEM_STATES.dirty + ? "Save & Publish" + : "Publish"} - handleUnpublish()} - loading={unpublishing} - > - Unpublish Item - - - + onConfirm={handleUnpublish} + itemName={item?.web?.metaTitle || item?.web?.metaLinkText} + loading={unpublishing} + /> )} void; + onConfirm: () => void; + itemName: string; + loading: boolean; +}; + +export const UnpublishDialog = ({ + onClose, + onConfirm, + itemName, + loading, +}: UnpublishDialogProps) => { + return ( + + + + + + + + Unpublish Content Item: + {" "} + {itemName} + + + This will make the it immediately unavailable on all of your + platforms. You can always republish this item by clicking on the + publish button. + + + + + + Unpublish Item + + + + ); +}; From ac51b835b864b98d0f37875bf890b2dfdbb123af Mon Sep 17 00:00:00 2001 From: Andres Date: Mon, 21 Aug 2023 00:10:33 -0700 Subject: [PATCH 07/59] duo mode toggle --- .../ItemEditHeader/DuoModeToggle.tsx | 108 ++++++++++++++++++ .../components/ItemEditHeader/index.tsx | 4 +- 2 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/DuoModeToggle.tsx diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/DuoModeToggle.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/DuoModeToggle.tsx new file mode 100644 index 0000000000..b72f3e9ef4 --- /dev/null +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/DuoModeToggle.tsx @@ -0,0 +1,108 @@ +import { Switch, SwitchProps } from "@mui/material"; +import { useDispatch, useSelector } from "react-redux"; +import { AppState } from "../../../../../../../../shell/store/types"; +import { useGetInstanceSettingsQuery } from "../../../../../../../../shell/services/instance"; +import { useEffect } from "react"; +import { actions } from "../../../../../../../../shell/store/ui"; +import { styled } from "@mui/material/styles"; + +export const DuoModeSwitch = () => { + const ui = useSelector((state: AppState) => state.ui); + const dispatch = useDispatch(); + const instanceSettings2 = useSelector( + (state: AppState) => state.settings.instance + ); + const { data: instanceSettings, isFetching } = useGetInstanceSettingsQuery(); + const shouldHide = instanceSettings?.find((setting: any) => { + // if any of these settings are present then DuoMode is unavailable + return ( + (setting.key === "basic_content_api_key" && setting.value) || + (setting.key === "headless_authorization_key" && setting.value) || + (setting.key === "authorization_key" && setting.value) || + (setting.key === "x_frame_options" && setting.value) + ); + }); + + useEffect(() => { + if (shouldHide) { + dispatch(actions.setDuoMode(false)); + } + }, [instanceSettings, shouldHide]); + + if (shouldHide || isFetching) { + return null; + } + + return ( + { + if (event.target.checked) { + dispatch(actions.setDuoMode(true)); + dispatch(actions.setContentActions(false)); + } else { + dispatch(actions.setDuoMode(false)); + dispatch(actions.setContentActions(true)); + } + }} + /> + ); +}; + +// https://mui.com/material-ui/react-switch/#customization +const IOSSwitch = styled((props: SwitchProps) => ( + +))(({ theme }) => ({ + width: 60, + height: 32, + padding: 0, + "& .MuiSwitch-switchBase": { + padding: 0, + margin: 2, + transitionDuration: "300ms", + "&.Mui-checked": { + transform: "translateX(28px)", + color: "#fff", + "& + .MuiSwitch-track": { + backgroundColor: theme.palette.grey[100], + opacity: 1, + border: 0, + }, + "&.Mui-disabled + .MuiSwitch-track": { + opacity: 0.5, + }, + "& .MuiSwitch-thumb": { + backgroundColor: theme.palette.primary.main, + }, + }, + "&.Mui-focusVisible .MuiSwitch-thumb": { + color: theme.palette.grey[300], + border: "6px solid #fff", + }, + }, + "& .MuiSwitch-thumb": { + boxSizing: "border-box", + width: 28, + height: 28, + backgroundColor: theme.palette.grey[300], + "&:before": { + content: "''", + position: "absolute", + width: "100%", + height: "100%", + left: 0, + top: 0, + backgroundRepeat: "no-repeat", + backgroundPosition: "center", + backgroundImage: `url('data:image/svg+xml;utf8,')`, + }, + }, + "& .MuiSwitch-track": { + borderRadius: 100, + backgroundColor: theme.palette.grey[100], + opacity: 1, + transition: theme.transitions.create(["background-color"], { + duration: 500, + }), + }, +})); diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx index f95a64b232..7727a80c95 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx @@ -29,6 +29,7 @@ import { ItemEditHeaderActions } from "./ItemEditHeaderActions"; import { VersionSelector } from "./VersionSelector"; import { LanguageSelector } from "./LanguageSelector"; import { ItemEditBreadcrumbs } from "./ItemEditBreadcrumbs"; +import { DuoModeSwitch } from "./DuoModeToggle"; const tabs = [ { @@ -149,7 +150,8 @@ export const ItemEditHeader = ({ saving, onSave }: HeaderProps) => { ); })} - + + From f7340a5d3215f1203993bb48d363a678391add46 Mon Sep 17 00:00:00 2001 From: Andres Date: Mon, 21 Aug 2023 00:13:39 -0700 Subject: [PATCH 08/59] disabled fix --- .../components/ItemEditHeader/ItemEditHeaderActions.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx index a6c8a9dd74..ebf8474463 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx @@ -232,7 +232,7 @@ export const ItemEditHeaderActions = ({ onSave(); }} loading={saving && !publishAfterSave} - disabled={canUpdate} + disabled={!canUpdate} > Save From 80a798f7e3d241252655624c4bbbd9ac60468087 Mon Sep 17 00:00:00 2001 From: Andres Date: Mon, 21 Aug 2023 15:03:28 -0700 Subject: [PATCH 09/59] Add duplicate item dialog --- package-lock.json | 4 +- .../ItemEditHeader/DuoModeToggle.tsx | 2 +- .../ItemEditHeader/DuplicateItemDialog.tsx | 112 ++++ .../ItemEditHeader/ItemEditHeaderActions.tsx | 535 +++++++++--------- .../components/ItemEditHeader/MoreMenu.tsx | 117 ++++ .../components/ItemEditHeader/index.tsx | 27 +- src/shell/services/instance.ts | 9 +- 7 files changed, 528 insertions(+), 278 deletions(-) create mode 100644 src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/DuplicateItemDialog.tsx create mode 100644 src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/MoreMenu.tsx diff --git a/package-lock.json b/package-lock.json index 231c337cba..3229ea2c3b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3817,7 +3817,7 @@ "node_modules/@zesty-io/material": { "version": "0.10.0", "resolved": "file:../material/zesty-io-material-0.10.0.tgz", - "integrity": "sha512-2tg6hIVbYTyeVraBryBGOMZOZK3fCjUEQzaZHQFZDpM8HE4nyleUno5iG/hOXT6hgzgcRSr/sPaM8A2SzUmk7A==", + "integrity": "sha512-yihCmStexl+BSFqspI2ssEndAIJzx/ZgLTd0PDRZBahnZaqN27DmNShH1kAIuh0xR4844A3kjo9wS4kT9NQvuw==", "license": "MIT", "dependencies": { "@emotion/react": "^11.9.0", @@ -18009,7 +18009,7 @@ }, "@zesty-io/material": { "version": "file:../material/zesty-io-material-0.10.0.tgz", - "integrity": "sha512-2tg6hIVbYTyeVraBryBGOMZOZK3fCjUEQzaZHQFZDpM8HE4nyleUno5iG/hOXT6hgzgcRSr/sPaM8A2SzUmk7A==", + "integrity": "sha512-yihCmStexl+BSFqspI2ssEndAIJzx/ZgLTd0PDRZBahnZaqN27DmNShH1kAIuh0xR4844A3kjo9wS4kT9NQvuw==", "requires": { "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/DuoModeToggle.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/DuoModeToggle.tsx index b72f3e9ef4..ec2da37272 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/DuoModeToggle.tsx +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/DuoModeToggle.tsx @@ -84,7 +84,7 @@ const IOSSwitch = styled((props: SwitchProps) => ( boxSizing: "border-box", width: 28, height: 28, - backgroundColor: theme.palette.grey[300], + backgroundColor: theme.palette.grey[600], "&:before": { content: "''", position: "absolute", diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/DuplicateItemDialog.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/DuplicateItemDialog.tsx new file mode 100644 index 0000000000..10a045204f --- /dev/null +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/DuplicateItemDialog.tsx @@ -0,0 +1,112 @@ +import { + Button, + Dialog, + DialogActions, + DialogTitle, + Typography, +} from "@mui/material"; +import { ContentCopyRounded } from "@mui/icons-material"; +import { useState } from "react"; +import { useHistory, useParams } from "react-router"; +import { useSelector } from "react-redux"; +import { AppState } from "../../../../../../../../shell/store/types"; +import { ContentItem } from "../../../../../../../../shell/services/types"; +import { + useCreateContentItemMutation, + useGetContentModelFieldsQuery, +} from "../../../../../../../../shell/services/instance"; +import { Box } from "@mui/system"; +import { LoadingButton } from "@mui/lab"; + +type DuplicateItemProps = { + onClose: () => void; +}; + +export const DuplicateItemDialog = ({ onClose }: DuplicateItemProps) => { + const { modelZUID, itemZUID } = useParams<{ + modelZUID: string; + itemZUID: string; + }>(); + const { data: modelFields } = useGetContentModelFieldsQuery(modelZUID); + const history = useHistory(); + const item = useSelector( + (state: AppState) => state.content[itemZUID] as ContentItem + ); + + const [createContentItem, { isLoading }] = useCreateContentItemMutation(); + + const duplicateItem = () => { + let fieldToChange; + if (modelFields?.[0]?.datatype === "text") { + fieldToChange = modelFields[0].name; + } + createContentItem({ + modelZUID, + body: { + data: { + ...item.data, + ...(fieldToChange && { + [fieldToChange]: item.data[fieldToChange] + " (copy)", + }), + }, + web: { + canonicalTagMode: item.web.canonicalTagMode, + parentZUID: item.web.parentZUID, + metaLinkText: item.web.metaLinkText + " (copy)", + metaTitle: item.web.metaTitle + " (copy)", + pathPart: item.web.pathPart + `-${new Date().toISOString()}`, + }, + meta: { + langID: item.meta.langID, + contentModelZUID: item.meta.contentModelZUID, + }, + }, + }) + .unwrap() + .then((res) => { + history.push(`/content/${modelZUID}/${res.data.ZUID}`); + }); + }; + + return ( + + + + + + + + Duplicate Content Item: + {" "} + {item?.web?.metaTitle || item?.web?.metaLinkText} + + + This will create and save a copy of this item immediately. + + + + + duplicateItem()} + loading={isLoading} + > + Duplicate Item + + + + ); +}; diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx index ebf8474463..3f99a42a48 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx @@ -16,15 +16,13 @@ import { useGetItemPublishingsQuery, } from "../../../../../../../../shell/services/instance"; import { useHistory, useParams } from "react-router"; -import { useEffect, useMemo, useState } from "react"; +import { useEffect, useState } from "react"; import { ContentItem, Publishing, } from "../../../../../../../../shell/services/types"; import { SaveRounded, - MoreHorizRounded, - ContentCopyRounded, ArrowDropDownRounded, CloudUploadRounded, CheckCircleRounded, @@ -189,198 +187,129 @@ export const ItemEditHeaderActions = ({ return ( <> - - setPublishMenu(e.currentTarget)} - > - - - - - - - - - + + Save Item
+ {saveShortcut} + + ) : ( +
+ v{item?.meta?.version} saved on
+ {formatDate(item?.meta?.updatedAt)}
+ by {lastItemUpdateAudit?.firstName}{" "} + {lastItemUpdateAudit?.lastName} +
+ ) + } + placement="bottom" + > + {itemState === ITEM_STATES.dirty ? ( + } + size="small" + onClick={() => { + onSave(); + }} + loading={saving && !publishAfterSave} + disabled={!canUpdate} + > + Save + + ) : ( + + + + Saved + + + )} +
+ {itemState !== ITEM_STATES.scheduled && canPublish && ( - Save Item
- {saveShortcut} + {itemState === ITEM_STATES.dirty + ? "Save & Publish Item" + : "Publish Item"}{" "} +
+ {publishShortcut} ) : (
- v{item?.meta?.version} saved on
- {formatDate(item?.meta?.updatedAt)}
- by {lastItemUpdateAudit?.firstName}{" "} - {lastItemUpdateAudit?.lastName} -
- ) - } - placement="bottom" - > - {itemState === ITEM_STATES.dirty ? ( - } - size="small" - onClick={() => { - onSave(); - }} - loading={saving && !publishAfterSave} - disabled={!canUpdate} - > - Save - - ) : ( - - - - Saved - - - )} -
- {itemState !== ITEM_STATES.scheduled && canPublish && ( - - {itemState === ITEM_STATES.dirty - ? "Save & Publish Item" - : "Publish Item"}{" "} -
- {publishShortcut} - - ) : ( -
- v{activePublishing?.version} published on
- by {formatDate(activePublishing?.publishAt)}
- { - users?.find( - (user: any) => - user.ZUID === activePublishing?.publishedByUserZUID - )?.firstName - }{" "} - { - users?.find( - (user: any) => - user.ZUID === activePublishing?.publishedByUserZUID - )?.lastName - } -
- ) - } - placement="bottom" - > - {itemState === ITEM_STATES.draft || - itemState === ITEM_STATES.dirty || - publishAfterSave || - isFetching ? ( - - } - sx={{ - color: "common.white", - whiteSpace: "nowrap", - }} - onClick={() => { - if (itemState === ITEM_STATES.dirty) { - setPublishAfterSave(true); - onSave(); - } else { - handlePublish(); - } - }} - loading={publishing || publishAfterSave || isFetching} - color="success" - variant="contained" - > - {itemState === ITEM_STATES.dirty - ? "Save & Publish" - : "Publish"} - - - - ) : ( - - - - - Published - - - { - setPublishMenu(e.currentTarget); - }} - > - - - - )} -
- )} - - {itemState === ITEM_STATES.scheduled && canPublish && ( - - v{item?.scheduling?.version} published on
- {formatDate(item?.scheduling?.publishAt)}
- by{" "} + v{activePublishing?.version} published on
+ by {formatDate(activePublishing?.publishAt)}
{ users?.find( (user: any) => - user.ZUID === item?.scheduling?.publishedByUserZUID + user.ZUID === activePublishing?.publishedByUserZUID )?.firstName }{" "} { users?.find( (user: any) => - user.ZUID === item?.scheduling?.publishedByUserZUID + user.ZUID === activePublishing?.publishedByUserZUID )?.lastName } - } - placement="bottom" - > + ) + } + placement="bottom" + > + {itemState === ITEM_STATES.draft || + itemState === ITEM_STATES.dirty || + publishAfterSave || + isFetching ? ( + + } + sx={{ + color: "common.white", + whiteSpace: "nowrap", + }} + onClick={() => { + if (itemState === ITEM_STATES.dirty) { + setPublishAfterSave(true); + onSave(); + } else { + handlePublish(); + } + }} + loading={publishing || publishAfterSave || isFetching} + color="success" + variant="contained" + > + {itemState === ITEM_STATES.dirty ? "Save & Publish" : "Publish"} + + + + ) : ( - + - Scheduled + Published -
- )} -
- setPublishMenu(null)} - anchorOrigin={{ - vertical: "bottom", - horizontal: "right", - }} - transformOrigin={{ - vertical: -8, - horizontal: "right", - }} - anchorEl={publishMenu} - open={!!publishMenu} - > - { - switch (itemState) { - case ITEM_STATES.dirty: - setPublishAfterSave(true); - onSave(); - break; - case ITEM_STATES.published: - setUnpublishDialogOpen(true); - break; - case ITEM_STATES.scheduled: - setScheduledPublishDialogOpen(true); - break; - case ITEM_STATES.draft: - handlePublish(); - break; - } + )} + + )} - setPublishMenu(null); - }} - > - - {itemState === ITEM_STATES.dirty ? ( - - ) : itemState === ITEM_STATES.scheduled ? ( - - ) : itemState === ITEM_STATES.published ? ( - - ) : ( - - )} - - {itemState === ITEM_STATES.dirty - ? "Save & Publish" - : itemState === ITEM_STATES.scheduled - ? "Publish Now" - : itemState === ITEM_STATES.published - ? "Unpublish Now" - : "Publish Now"} - - { - switch (itemState) { - case ITEM_STATES.dirty: - setScheduleAfterSave(true); - onSave(); - break; - case ITEM_STATES.scheduled: - setScheduledPublishDialogOpen(true); - break; - case ITEM_STATES.published: - console.log("schedule unpublish"); - break; - case ITEM_STATES.draft: - setScheduledPublishDialogOpen(true); - break; - } - setPublishMenu(null); - }} + {itemState === ITEM_STATES.scheduled && canPublish && ( + + v{item?.scheduling?.version} published on
+ {formatDate(item?.scheduling?.publishAt)}
+ by{" "} + { + users?.find( + (user: any) => + user.ZUID === item?.scheduling?.publishedByUserZUID + )?.firstName + }{" "} + { + users?.find( + (user: any) => + user.ZUID === item?.scheduling?.publishedByUserZUID + )?.lastName + } + + } + placement="bottom" > - - - - {itemState === ITEM_STATES.dirty - ? "Save & Schedule Publish" - : itemState === ITEM_STATES.scheduled - ? "Unschedule Publish" - : itemState === ITEM_STATES.published - ? "Schedule Unpublish" - : "Schedule Publish"} -
- history.push("publishings")}> - - - - Manage Publish Status - -
+ + + + + Scheduled + + + { + setPublishMenu(e.currentTarget); + }} + > + + + + + )} + + setPublishMenu(null)} + anchorEl={publishMenu} + setPublishAfterSave={setPublishAfterSave} + setScheduleAfterSave={setScheduleAfterSave} + setUnpublishDialogOpen={setUnpublishDialogOpen} + setScheduledPublishDialogOpen={setScheduledPublishDialogOpen} + handlePublish={handlePublish} + /> {unpublishDialogOpen && ( setUnpublishDialogOpen(false)} @@ -503,3 +397,122 @@ export const ItemEditHeaderActions = ({ ); }; + +type PublishingMenuProps = { + itemState: string; + onSave: () => void; + onClose: () => void; + anchorEl: null | HTMLElement; + setPublishAfterSave: (value: boolean) => void; + setScheduleAfterSave: (value: boolean) => void; + setUnpublishDialogOpen: (value: boolean) => void; + setScheduledPublishDialogOpen: (value: boolean) => void; + handlePublish: () => void; +}; + +const PublishingMenu = ({ + itemState, + onSave, + onClose, + anchorEl, + setPublishAfterSave, + setScheduleAfterSave, + setUnpublishDialogOpen, + setScheduledPublishDialogOpen, + handlePublish, +}: PublishingMenuProps) => { + const history = useHistory(); + return ( + onClose()} + anchorOrigin={{ + vertical: "bottom", + horizontal: "right", + }} + transformOrigin={{ + vertical: -8, + horizontal: "right", + }} + anchorEl={anchorEl} + open={!!anchorEl} + > + { + switch (itemState) { + case ITEM_STATES.dirty: + setPublishAfterSave(true); + onSave(); + break; + case ITEM_STATES.published: + setUnpublishDialogOpen(true); + break; + case ITEM_STATES.scheduled: + setScheduledPublishDialogOpen(true); + break; + case ITEM_STATES.draft: + handlePublish(); + break; + } + + onClose(); + }} + > + + {itemState === ITEM_STATES.dirty ? ( + + ) : itemState === ITEM_STATES.scheduled ? ( + + ) : itemState === ITEM_STATES.published ? ( + + ) : ( + + )} + + {itemState === ITEM_STATES.dirty + ? "Save & Publish" + : itemState === ITEM_STATES.scheduled + ? "Publish Now" + : itemState === ITEM_STATES.published + ? "Unpublish Now" + : "Publish Now"} + + { + switch (itemState) { + case ITEM_STATES.dirty: + setScheduleAfterSave(true); + onSave(); + break; + case ITEM_STATES.scheduled: + setScheduledPublishDialogOpen(true); + break; + case ITEM_STATES.published: + console.log("schedule unpublish"); + break; + case ITEM_STATES.draft: + setScheduledPublishDialogOpen(true); + break; + } + onClose(); + }} + > + + + + {itemState === ITEM_STATES.dirty + ? "Save & Schedule Publish" + : itemState === ITEM_STATES.scheduled + ? "Unschedule Publish" + : itemState === ITEM_STATES.published + ? "Schedule Unpublish" + : "Schedule Publish"} + + history.push("publishings")}> + + + + Manage Publish Status + + + ); +}; diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/MoreMenu.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/MoreMenu.tsx new file mode 100644 index 0000000000..6cc083217a --- /dev/null +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/MoreMenu.tsx @@ -0,0 +1,117 @@ +import { IconButton, ListItemIcon, Menu, MenuItem } from "@mui/material"; +import { + MoreHorizRounded, + WidgetsRounded, + ContentCopyRounded, + BoltRounded, + DataObjectRounded, + CodeRounded, + DeleteRounded, +} from "@mui/icons-material"; +import { useState } from "react"; +import { Database } from "@zesty-io/material"; +import { useHistory, useParams } from "react-router"; +import { useSelector } from "react-redux"; +import { AppState } from "../../../../../../../../shell/store/types"; +import { ContentItem } from "../../../../../../../../shell/services/types"; +import { + useCreateContentItemMutation, + useGetContentModelFieldsQuery, + useGetContentModelQuery, +} from "../../../../../../../../shell/services/instance"; +import { DuplicateItemDialog } from "./DuplicateItemDialog"; + +export const MoreMenu = () => { + const { modelZUID, itemZUID } = useParams<{ + modelZUID: string; + itemZUID: string; + }>(); + const [showDuplicateItemDialog, setShowDuplicateItemDialog] = useState(false); + const [anchorEl, setAnchorEl] = useState(null); + const { data: modelFields } = useGetContentModelFieldsQuery(modelZUID); + const history = useHistory(); + const item = useSelector( + (state: AppState) => state.content[itemZUID] as ContentItem + ); + + return ( + <> + { + setAnchorEl(event.currentTarget); + }} + > + + + { + setAnchorEl(null); + }} + > + { + setAnchorEl(null); + setShowDuplicateItemDialog(true); + }} + > + + + + Duplicate Item + + + + + + Copy + + + + + + View Quick Access API + + + + + + View Site Generators API + + + + + + Edit Model + + + + + + Edit Template + + + + + + Delete Item + + + {showDuplicateItemDialog && ( + setShowDuplicateItemDialog(false)} + /> + )} + + ); +}; diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx index 7727a80c95..a9f67c22ac 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx @@ -1,18 +1,11 @@ -import { Box, SvgIcon, Tabs, Tab, Typography, Tooltip } from "@mui/material"; -import { - useGetContentModelQuery, - useGetContentNavItemsQuery, -} from "../../../../../../../../shell/services/instance"; -import { Home, theme } from "@zesty-io/material"; +import { Box, Tabs, Tab, Typography, IconButton } from "@mui/material"; +import { useGetContentModelQuery } from "../../../../../../../../shell/services/instance"; +import { ScreenShare, theme } from "@zesty-io/material"; import { useHistory, useLocation, useParams } from "react-router"; -import { useMemo } from "react"; import { ContentItem, - ContentNavItem, Publishing, } from "../../../../../../../../shell/services/types"; -import { MODEL_ICON } from "../../../../../../../../shell/constants"; -import { Link } from "react-router-dom"; import { ThemeProvider } from "@mui/material/styles"; import { VerticalSplitRounded, @@ -21,8 +14,8 @@ import { CodeRounded, ApiRounded, ManageAccountsRounded, + ContentCopyRounded, } from "@mui/icons-material"; -import { CustomBreadcrumbs } from "../../../../../../../../shell/components/CustomBreadcrumbs"; import { useSelector } from "react-redux"; import { AppState } from "../../../../../../../../shell/store/types"; import { ItemEditHeaderActions } from "./ItemEditHeaderActions"; @@ -30,6 +23,7 @@ import { VersionSelector } from "./VersionSelector"; import { LanguageSelector } from "./LanguageSelector"; import { ItemEditBreadcrumbs } from "./ItemEditBreadcrumbs"; import { DuoModeSwitch } from "./DuoModeToggle"; +import { MoreMenu } from "./MoreMenu"; const tabs = [ { @@ -119,7 +113,16 @@ export const ItemEditHeader = ({ saving, onSave }: HeaderProps) => { {item?.web?.metaTitle || item?.web?.metaLinkText}
- + + + + + + + + + +
; meta: Partial } } + { + modelZUID: string; + body: { web: Partial; meta: Partial; data?: Data }; + } >({ query: ({ modelZUID, body }) => ({ url: `content/models/${modelZUID}/items`, method: "POST", body, }), + invalidatesTags: ["ContentNav"], }), // https://www.zesty.io/docs/instances/api-reference/env/nav/#Get-Content-Navigation getContentNavItems: builder.query({ From 4f1c909b2631e443fd94ccb4e7f6cc46a74f0845 Mon Sep 17 00:00:00 2001 From: Andres Date: Mon, 21 Aug 2023 15:58:57 -0700 Subject: [PATCH 10/59] duplicate content item --- .../ItemEditHeader/ItemEditHeaderActions.tsx | 1 - .../components/ItemEditHeader/index.tsx | 161 ++++++++++-------- 2 files changed, 89 insertions(+), 73 deletions(-) diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx index 3f99a42a48..2fca8de469 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx @@ -69,7 +69,6 @@ export const ItemEditHeaderActions = ({ itemZUID: string; }>(); const dispatch = useDispatch(); - const history = useHistory(); const canPublish = usePermission("PUBLISH"); const canUpdate = usePermission("UPDATE"); const [publishMenu, setPublishMenu] = useState(null); diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx index a9f67c22ac..b8b3f4bbba 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx @@ -24,6 +24,8 @@ import { LanguageSelector } from "./LanguageSelector"; import { ItemEditBreadcrumbs } from "./ItemEditBreadcrumbs"; import { DuoModeSwitch } from "./DuoModeToggle"; import { MoreMenu } from "./MoreMenu"; +import { DuplicateItemDialog } from "./DuplicateItemDialog"; +import { useState } from "react"; const tabs = [ { @@ -74,6 +76,7 @@ export const ItemEditHeader = ({ saving, onSave }: HeaderProps) => { }>(); const location = useLocation(); const history = useHistory(); + const [showDuplicateItemDialog, setShowDuplicateItemDialog] = useState(false); const { data: model } = useGetContentModelQuery(modelZUID); const item = useSelector( @@ -83,83 +86,97 @@ export const ItemEditHeader = ({ saving, onSave }: HeaderProps) => { return ( - `2px solid ${theme?.palette?.divider} `, - "*": { - boxSizing: "border-box", - }, - }} - > - - - - + `2px solid ${theme?.palette?.divider} `, + "*": { + boxSizing: "border-box", + }, + }} + > + + + + + {item?.web?.metaTitle || item?.web?.metaLinkText} + + + + + setShowDuplicateItemDialog(true)} + > + + + + + + + + + + + history.push(`/content/${modelZUID}/${itemZUID}/${value}`) + } sx={{ - display: "-webkit-box", - "-webkit-line-clamp": "2", - "-webkit-box-orient": "vertical", - wordBreak: "break-all", - overflow: "hidden", - mb: 2, + position: "relative", + top: "2px", }} > - {item?.web?.metaTitle || item?.web?.metaLinkText} - - - - - - - - - - - - - - - - history.push(`/content/${modelZUID}/${itemZUID}/${value}`) - } - sx={{ - position: "relative", - top: "2px", - }} - > - {tabs.map((tab) => { - if (tab.value === "meta" && model?.type === "dataset") return; - return ( - } - iconPosition="start" - /> - ); - })} - - - - - + {tabs.map((tab) => { + if (tab.value === "meta" && model?.type === "dataset") return; + return ( + } + iconPosition="start" + /> + ); + })} + + + + + + - + {showDuplicateItemDialog && ( + setShowDuplicateItemDialog(false)} + /> + )} + ); }; From 4cc55828fb9072c39f7012ce6bdd6c76b86ff9d8 Mon Sep 17 00:00:00 2001 From: Andres Date: Mon, 21 Aug 2023 22:42:17 -0700 Subject: [PATCH 11/59] Add preview button and urls --- .../ScheduleFlyout/ScheduleFlyout.js | 3 + .../ItemEditHeader/ItemEditHeaderActions.tsx | 7 +- .../components/ItemEditHeader/MoreMenu.tsx | 158 ++++++++++++++++-- .../components/ItemEditHeader/PreviewMenu.tsx | 98 +++++++++++ .../components/ItemEditHeader/index.tsx | 16 +- src/apps/home/app/index.tsx | 4 +- src/shell/services/instance.ts | 12 -- 7 files changed, 256 insertions(+), 42 deletions(-) create mode 100644 src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/PreviewMenu.tsx diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/Header/ItemVersioning/ScheduleFlyout/ScheduleFlyout.js b/src/apps/content-editor/src/app/views/ItemEdit/components/Header/ItemVersioning/ScheduleFlyout/ScheduleFlyout.js index 7c947ed17a..c77b3f952b 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/components/Header/ItemVersioning/ScheduleFlyout/ScheduleFlyout.js +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/Header/ItemVersioning/ScheduleFlyout/ScheduleFlyout.js @@ -229,6 +229,9 @@ export default class ScheduleFlyout extends Component { onClick={this.handleSchedulePublish} disabled={this.state.scheduling} startIcon={} + sx={{ + color: "common.white", + }} > Schedule Publishing Version {this.props.item.meta.version} diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx index 2fca8de469..d2da6016b3 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx @@ -41,6 +41,7 @@ import { formatDate } from "../../../../../../../../utility/formatDate"; import { ScheduleFlyout } from "../Header/ItemVersioning/ScheduleFlyout"; import { UnpublishDialog } from "./UnpublishDialog"; import { usePermission } from "../../../../../../../../shell/hooks/use-permissions"; +import { ContentItemWithDirtyAndPublishing } from "."; const ITEM_STATES = { dirty: "dirty", @@ -49,12 +50,6 @@ const ITEM_STATES = { draft: "draft", } as const; -type ContentItemWithDirtyAndPublishing = ContentItem & { - dirty: boolean; - publishing: Publishing; - scheduling: any; -}; - type ItemEditHeaderActionsProps = { saving: boolean; onSave: () => void; diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/MoreMenu.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/MoreMenu.tsx index 6cc083217a..f938e6ed66 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/MoreMenu.tsx +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/MoreMenu.tsx @@ -1,4 +1,11 @@ -import { IconButton, ListItemIcon, Menu, MenuItem } from "@mui/material"; +import { + Chip, + IconButton, + ListItemIcon, + Menu, + MenuItem, + Typography, +} from "@mui/material"; import { MoreHorizRounded, WidgetsRounded, @@ -7,6 +14,9 @@ import { DataObjectRounded, CodeRounded, DeleteRounded, + CheckRounded, + DesignServicesRounded, + VisibilityRounded, } from "@mui/icons-material"; import { useState } from "react"; import { Database } from "@zesty-io/material"; @@ -14,25 +24,51 @@ import { useHistory, useParams } from "react-router"; import { useSelector } from "react-redux"; import { AppState } from "../../../../../../../../shell/store/types"; import { ContentItem } from "../../../../../../../../shell/services/types"; -import { - useCreateContentItemMutation, - useGetContentModelFieldsQuery, - useGetContentModelQuery, -} from "../../../../../../../../shell/services/instance"; import { DuplicateItemDialog } from "./DuplicateItemDialog"; +import { ApiType } from "../../../../../../../schema/src/app/components/ModelApi"; +import { useGetDomainsQuery } from "../../../../../../../../shell/services/accounts"; +import { useFilePath } from "../../../../../../../../shell/hooks/useFilePath"; export const MoreMenu = () => { const { modelZUID, itemZUID } = useParams<{ modelZUID: string; itemZUID: string; }>(); - const [showDuplicateItemDialog, setShowDuplicateItemDialog] = useState(false); const [anchorEl, setAnchorEl] = useState(null); - const { data: modelFields } = useGetContentModelFieldsQuery(modelZUID); + const [isCopied, setIsCopied] = useState(false); + const [showDuplicateItemDialog, setShowDuplicateItemDialog] = useState(false); + const [showApiEndpoints, setShowApiEndpoints] = useState( + null + ); + const [apiEndpointType, setApiEndpointType] = useState("quick-access"); const history = useHistory(); const item = useSelector( (state: AppState) => state.content[itemZUID] as ContentItem ); + const instance = useSelector((state: AppState) => state.instance); + const { data: domains } = useGetDomainsQuery(); + const codePath = useFilePath(modelZUID); + + const handleCopyClick = (data: string) => { + navigator?.clipboard + ?.writeText(data) + .then(() => { + setIsCopied(true); + setTimeout(() => { + setIsCopied(false); + }, 1500); + }) + .catch((err) => { + console.error(err); + }); + }; + + const apiTypeEndpointMap: Partial> = { + "quick-access": `/-/instant/${itemZUID}.json`, + "site-generators": item ? `/${item?.web?.pathPart}/?toJSON` : "/?toJSON", + }; + + const liveDomain = domains?.find((domain) => domain.branch == "live"); return ( <> @@ -70,31 +106,53 @@ export const MoreMenu = () => { Duplicate Item - + handleCopyClick(itemZUID)}> - + {isCopied ? ( + + ) : ( + + )} - Copy + Copy ZUID - + { + setShowApiEndpoints(event.currentTarget); + setApiEndpointType("quick-access"); + }} + > View Quick Access API - + { + setShowApiEndpoints(event.currentTarget); + setApiEndpointType("site-generators"); + }} + > View Site Generators API - + { + history.push(`/schema/${modelZUID}`); + }} + > Edit Model - + { + history.push(codePath); + }} + > @@ -112,6 +170,76 @@ export const MoreMenu = () => { onClose={() => setShowDuplicateItemDialog(false)} /> )} + { + setShowApiEndpoints(null); + }} + > + { + setShowApiEndpoints(null); + window.open( + // @ts-expect-error config not typed + `${CONFIG.URL_PREVIEW_PROTOCOL}${instance.randomHashID}${CONFIG.URL_PREVIEW}${apiTypeEndpointMap[apiEndpointType]}`, + "_blank" + ); + }} + > + + + + + {/* @ts-expect-error config not typed */} + {`${instance.randomHashID}${CONFIG.URL_PREVIEW}${apiTypeEndpointMap[apiEndpointType]}`} + + + + {liveDomain && ( + { + setShowApiEndpoints(null); + window.open( + `https://${liveDomain.domain}${ + apiTypeEndpointMap[ + apiEndpointType as keyof typeof apiTypeEndpointMap + ] + }`, + "_blank" + ); + }} + > + + + + + {`${liveDomain.domain}${ + apiTypeEndpointMap[ + apiEndpointType as keyof typeof apiTypeEndpointMap + ] + }`} + + + + )} + ); }; diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/PreviewMenu.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/PreviewMenu.tsx new file mode 100644 index 0000000000..b3a554bec3 --- /dev/null +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/PreviewMenu.tsx @@ -0,0 +1,98 @@ +import { IconButton, ListItemIcon, Menu, MenuItem } from "@mui/material"; +import { DesignServicesRounded, LanguageRounded } from "@mui/icons-material"; +import { useState } from "react"; +import { ScreenShare } from "@zesty-io/material"; +import { useParams } from "react-router"; +import { useSelector } from "react-redux"; +import { AppState } from "../../../../../../../../shell/store/types"; +import { useDomain } from "../../../../../../../../shell/hooks/use-domain"; +import { ContentItemWithDirtyAndPublishing } from "."; +import { useGetItemPublishingsQuery } from "../../../../../../../../shell/services/instance"; + +export const PreviewMenu = () => { + const { modelZUID, itemZUID } = useParams<{ + modelZUID: string; + itemZUID: string; + }>(); + const [anchorEl, setAnchorEl] = useState(null); + const domain = useDomain(); + const item = useSelector( + (state: AppState) => + state.content[itemZUID] as ContentItemWithDirtyAndPublishing + ); + const { data: itemPublishings } = useGetItemPublishingsQuery({ + modelZUID, + itemZUID, + }); + const activePublishing = itemPublishings?.find( + (itemPublishing) => itemPublishing._active + ); + const instance = useSelector((state: AppState) => state.instance); + const previewLock = useSelector((state: AppState) => + state.settings.instance.find( + (setting: any) => setting.key === "preview_lock_password" && setting.value + ) + ); + const pathPart = item.web.pathPart !== "zesty_home" ? item.web.path : ""; + const prodUrl = domain + pathPart; + + // @ts-expect-error Config not typed + let devUrl = `${CONFIG.URL_PREVIEW_PROTOCOL}${instance.randomHashID}${CONFIG.URL_PREVIEW}${item?.web?.path}`; + + if (previewLock) { + devUrl = `${devUrl}?zpw=${previewLock.value}`; + } + + return ( + <> + { + setAnchorEl(event.currentTarget); + }} + > + + + { + setAnchorEl(null); + }} + > + { + setAnchorEl(null); + window.open(devUrl, "_blank"); + }} + > + + + + Draft Preview - v{item?.meta?.version} + + {activePublishing && ( + { + setAnchorEl(null); + window.open(prodUrl, "_blank"); + }} + > + + + + Production Preview -v{activePublishing?.version} + + )} + + + ); +}; diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx index b8b3f4bbba..f8d9961ef5 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx @@ -26,6 +26,7 @@ import { DuoModeSwitch } from "./DuoModeToggle"; import { MoreMenu } from "./MoreMenu"; import { DuplicateItemDialog } from "./DuplicateItemDialog"; import { useState } from "react"; +import { PreviewMenu } from "./PreviewMenu"; const tabs = [ { @@ -60,9 +61,10 @@ const tabs = [ }, ]; -type ContentItemWithDirtyAndPublishing = ContentItem & { +export type ContentItemWithDirtyAndPublishing = ContentItem & { dirty: boolean; publishing: Publishing; + scheduling: any; }; type HeaderProps = { @@ -125,9 +127,7 @@ export const ItemEditHeader = ({ saving, onSave }: HeaderProps) => { > - - - + @@ -138,9 +138,11 @@ export const ItemEditHeader = ({ saving, onSave }: HeaderProps) => { > + tab.label !== "Content" && + location.pathname.includes(tab.value) + )?.value || "" } onChange={(event, value) => history.push(`/content/${modelZUID}/${itemZUID}/${value}`) diff --git a/src/apps/home/app/index.tsx b/src/apps/home/app/index.tsx index 185837b734..a7dac6c5b5 100644 --- a/src/apps/home/app/index.tsx +++ b/src/apps/home/app/index.tsx @@ -4,9 +4,9 @@ import { useState } from "react"; import moment from "moment"; import { useSelector } from "react-redux"; import { - useGetContentItemPublishingsQuery, useGetContentModelItemsQuery, useGetContentModelsQuery, + useGetItemPublishingsQuery, } from "../../../shell/services/instance"; import { AppState } from "../../../shell/store/types"; import { CongratulationsDialog } from "./components/CongratulationsDialog"; @@ -33,7 +33,7 @@ export const HomeApp = () => { const { data: contentItemPublishings, isFetching: isContentItemPublishingsFetching, - } = useGetContentItemPublishingsQuery( + } = useGetItemPublishingsQuery( { modelZUID: homepageModel?.ZUID, itemZUID: contentModelItems?.[0]?.meta?.ZUID, diff --git a/src/shell/services/instance.ts b/src/shell/services/instance.ts index 8b21ba87ca..b0e033c25b 100644 --- a/src/shell/services/instance.ts +++ b/src/shell/services/instance.ts @@ -183,17 +183,6 @@ export const instanceApi = createApi({ // Restore cache when content/schema uses rtk query for mutations and can invalidate this keepUnusedDataFor: 0.0001, }), - // https://www.zesty.io/docs/instances/api-reference/content/models/items/publishings/#Get-Item-Publishing - getContentItemPublishings: builder.query< - ContentModel[], - { modelZUID: string; itemZUID: string } - >({ - query: ({ modelZUID, itemZUID }) => - `content/models/${modelZUID}/items/${itemZUID}/publishings`, - transformResponse: getResponseData, - // Restore cache once content/schema uses rtk query for mutations and can invalidate this - keepUnusedDataFor: 0.0001, - }), // https://www.zesty.io/docs/instances/api-reference/search/#Search searchContent: builder.query({ query: ({ query, ...rest }) => ({ @@ -538,7 +527,6 @@ export const { useGetContentModelQuery, useGetContentModelsQuery, useGetContentModelItemsQuery, - useGetContentItemPublishingsQuery, useSearchContentQuery, useGetContentModelFieldsQuery, useBulkUpdateContentModelFieldMutation, From eb4f3787b6088bfcb1eab925ed3481971f1f94aa Mon Sep 17 00:00:00 2001 From: Andres Date: Mon, 21 Aug 2023 23:31:36 -0700 Subject: [PATCH 12/59] Hide Schedule unpublish --- .../ItemEditHeader/DeleteItemDialog.tsx | 83 +++++++++++++++++++ .../ItemEditHeader/ItemEditHeaderActions.tsx | 64 +++++++------- .../components/ItemEditHeader/MoreMenu.tsx | 12 ++- src/shell/services/instance.ts | 15 ++++ 4 files changed, 142 insertions(+), 32 deletions(-) create mode 100644 src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/DeleteItemDialog.tsx diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/DeleteItemDialog.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/DeleteItemDialog.tsx new file mode 100644 index 0000000000..2a7cbc7a23 --- /dev/null +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/DeleteItemDialog.tsx @@ -0,0 +1,83 @@ +import { + Button, + Dialog, + DialogActions, + DialogTitle, + Typography, +} from "@mui/material"; +import { DeleteRounded } from "@mui/icons-material"; +import { useHistory, useParams } from "react-router"; +import { useSelector } from "react-redux"; +import { AppState } from "../../../../../../../../shell/store/types"; +import { ContentItem } from "../../../../../../../../shell/services/types"; +import { + useDeleteContentItemMutation, + useGetContentModelFieldsQuery, +} from "../../../../../../../../shell/services/instance"; +import { Box } from "@mui/system"; +import { LoadingButton } from "@mui/lab"; + +type DuplicateItemProps = { + onClose: () => void; +}; + +export const DeleteItemDialog = ({ onClose }: DuplicateItemProps) => { + const { modelZUID, itemZUID } = useParams<{ + modelZUID: string; + itemZUID: string; + }>(); + const history = useHistory(); + const item = useSelector( + (state: AppState) => state.content[itemZUID] as ContentItem + ); + + const [deleteContentItem, { isLoading }] = useDeleteContentItemMutation(); + + return ( + + + + + + + + Delete Content Item: + {" "} + {item?.web?.metaTitle || item?.web?.metaLinkText} + + + Deleting this item will remove it from all locations throughout your + site and make it unavailable to API requests. This cannot be undone. + + + + + + deleteContentItem({ + modelZUID: modelZUID, + itemZUID: itemZUID, + }).then(() => history.push(`/content/${modelZUID}`)) + } + loading={isLoading} + > + Delete Item + + + + ); +}; diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx index d2da6016b3..1f7270ea68 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx @@ -470,37 +470,39 @@ const PublishingMenu = ({ ? "Unpublish Now" : "Publish Now"} - { - switch (itemState) { - case ITEM_STATES.dirty: - setScheduleAfterSave(true); - onSave(); - break; - case ITEM_STATES.scheduled: - setScheduledPublishDialogOpen(true); - break; - case ITEM_STATES.published: - console.log("schedule unpublish"); - break; - case ITEM_STATES.draft: - setScheduledPublishDialogOpen(true); - break; - } - onClose(); - }} - > - - - - {itemState === ITEM_STATES.dirty - ? "Save & Schedule Publish" - : itemState === ITEM_STATES.scheduled - ? "Unschedule Publish" - : itemState === ITEM_STATES.published - ? "Schedule Unpublish" - : "Schedule Publish"} - + {itemState !== ITEM_STATES.published && ( + { + switch (itemState) { + case ITEM_STATES.dirty: + setScheduleAfterSave(true); + onSave(); + break; + case ITEM_STATES.scheduled: + setScheduledPublishDialogOpen(true); + break; + case ITEM_STATES.published: + console.log("schedule unpublish"); + break; + case ITEM_STATES.draft: + setScheduledPublishDialogOpen(true); + break; + } + onClose(); + }} + > + + + + {itemState === ITEM_STATES.dirty + ? "Save & Schedule Publish" + : itemState === ITEM_STATES.scheduled + ? "Unschedule Publish" + : itemState === ITEM_STATES.published + ? "Schedule Unpublish" + : "Schedule Publish"} + + )} history.push("publishings")}> diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/MoreMenu.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/MoreMenu.tsx index f938e6ed66..f5d96efd13 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/MoreMenu.tsx +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/MoreMenu.tsx @@ -28,6 +28,7 @@ import { DuplicateItemDialog } from "./DuplicateItemDialog"; import { ApiType } from "../../../../../../../schema/src/app/components/ModelApi"; import { useGetDomainsQuery } from "../../../../../../../../shell/services/accounts"; import { useFilePath } from "../../../../../../../../shell/hooks/useFilePath"; +import { DeleteItemDialog } from "./DeleteItemDialog"; export const MoreMenu = () => { const { modelZUID, itemZUID } = useParams<{ @@ -40,6 +41,7 @@ export const MoreMenu = () => { const [showApiEndpoints, setShowApiEndpoints] = useState( null ); + const [showDeleteItemDialog, setShowDeleteItemDialog] = useState(false); const [apiEndpointType, setApiEndpointType] = useState("quick-access"); const history = useHistory(); const item = useSelector( @@ -158,7 +160,12 @@ export const MoreMenu = () => { Edit Template - + { + setShowDeleteItemDialog(true); + setAnchorEl(null); + }} + > @@ -240,6 +247,9 @@ export const MoreMenu = () => { )} + {showDeleteItemDialog && ( + setShowDeleteItemDialog(false)} /> + )} ); }; diff --git a/src/shell/services/instance.ts b/src/shell/services/instance.ts index b0e033c25b..96adf681dc 100644 --- a/src/shell/services/instance.ts +++ b/src/shell/services/instance.ts @@ -511,6 +511,20 @@ export const instanceApi = createApi({ { type: "ContentItem", id: arg.itemZUID }, ], }), + // https://www.zesty.io/docs/instances/api-reference/content/models/items/#Delete-Item + deleteContentItem: builder.mutation< + any, + { + modelZUID: string; + itemZUID: string; + } + >({ + query: ({ modelZUID, itemZUID }) => ({ + url: `content/models/${modelZUID}/items/${itemZUID}`, + method: "DELETE", + }), + invalidatesTags: ["ContentNav"], + }), }), }); @@ -553,4 +567,5 @@ export const { useGetLangsQuery, useGetContentItemVersionsQuery, useUpdateContentItemMutation, + useDeleteContentItemMutation, } = instanceApi; From 60a13591ce1ebb9db1074a79b695945b92a94778 Mon Sep 17 00:00:00 2001 From: Andres Date: Tue, 22 Aug 2023 21:13:54 -0700 Subject: [PATCH 13/59] Resolve vqa changes --- .../PendingEditsModal/PendingEditsModal.js | 117 --------------- .../PendingEditsModal/PendingEditsModal.tsx | 134 ++++++++++++++++++ .../src/app/views/ItemEdit/ItemEdit.js | 2 + .../ItemEditHeader/ItemEditHeaderActions.tsx | 1 + .../ItemEditHeader/LanguageSelector.tsx | 4 +- .../components/ItemEditHeader/index.tsx | 4 +- src/shell/components/CustomBreadcrumbs.tsx | 2 +- 7 files changed, 144 insertions(+), 120 deletions(-) delete mode 100644 src/apps/content-editor/src/app/components/PendingEditsModal/PendingEditsModal.js create mode 100644 src/apps/content-editor/src/app/components/PendingEditsModal/PendingEditsModal.tsx diff --git a/src/apps/content-editor/src/app/components/PendingEditsModal/PendingEditsModal.js b/src/apps/content-editor/src/app/components/PendingEditsModal/PendingEditsModal.js deleted file mode 100644 index 5c5e03be42..0000000000 --- a/src/apps/content-editor/src/app/components/PendingEditsModal/PendingEditsModal.js +++ /dev/null @@ -1,117 +0,0 @@ -import { memo, useState, useEffect } from "react"; -import { Prompt } from "react-router-dom"; - -import Stack from "@mui/material/Stack"; -import Button from "@mui/material/Button"; -import SaveIcon from "@mui/icons-material/Save"; -import DeleteIcon from "@mui/icons-material/Delete"; -import DoDisturbAltIcon from "@mui/icons-material/DoDisturbAlt"; -import LoadingButton from "@mui/lab/LoadingButton"; - -import { - Modal, - ModalHeader, - ModalContent, - ModalFooter, -} from "@zesty-io/core/Modal"; - -import styles from "./PendingEditsModal.less"; -export default memo(function PendingEditsModal(props) { - // FIXME: non memoized onSave & onDiscard props are causing rerenders - - const [loading, setLoading] = useState(props.loading || false); - const [open, setOpen] = useState(false); - const [answer, setAnswer] = useState(() => () => {}); - - // Expose globals so external components can invoke - // NOTE: Should this be a portal? - useEffect(() => { - window.openContentNavigationModal = (callback) => { - setOpen(true); - setAnswer(() => callback); - }; - - return () => { - window.openContentNavigationModal = null; - }; - }, []); - - const handler = (action) => { - switch (action) { - case "save": - setLoading(true); - props.onSave().then(() => { - setLoading(false); - setOpen(false); - answer(true); - }); - break; - case "delete": - setLoading(true); - props.onDiscard().then(() => { - setLoading(false); - setOpen(false); - answer(true); - }); - break; - case "cancel": - setOpen(false); - answer(false); - default: - break; - } - }; - - return ( - <> - - { - answer(false); - setOpen(false); - }} - open={open} - > - -

{props.title}

-
- -

{props.message}

-
- - - - handler("delete")} - loading={loading} - loadingPosition="start" - startIcon={} - > - Discard - - handler("save")} - startIcon={} - > - Save - - - -
- - ); -}); diff --git a/src/apps/content-editor/src/app/components/PendingEditsModal/PendingEditsModal.tsx b/src/apps/content-editor/src/app/components/PendingEditsModal/PendingEditsModal.tsx new file mode 100644 index 0000000000..cf97bcf10d --- /dev/null +++ b/src/apps/content-editor/src/app/components/PendingEditsModal/PendingEditsModal.tsx @@ -0,0 +1,134 @@ +import { memo, useState, useEffect } from "react"; +import { Prompt } from "react-router-dom"; +import { ThemeProvider } from "@mui/material/styles"; +import { + Button, + Dialog, + DialogTitle, + DialogActions, + Box, + Typography, +} from "@mui/material"; +import { WarningAmberRounded } from "@mui/icons-material"; +import { theme } from "@zesty-io/material"; +import { LoadingButton } from "@mui/lab"; + +type PendingEditsModalProps = { + show: boolean; + loading?: boolean; + onSave: () => Promise; + onDiscard: () => Promise; +}; + +export default memo(function PendingEditsModal(props: PendingEditsModalProps) { + // FIXME: non memoized onSave & onDiscard props are causing rerenders + + const [loading, setLoading] = useState(props.loading || false); + const [open, setOpen] = useState(false); + const [answer, setAnswer] = useState(() => () => {}); + + // Expose globals so external components can invoke + // NOTE: Should this be a portal? + useEffect(() => { + window.openContentNavigationModal = (callback) => { + setOpen(true); + setAnswer(() => callback); + }; + + return () => { + window.openContentNavigationModal = null; + }; + }, []); + + const handler = (action: string) => { + switch (action) { + case "save": + setLoading(true); + props.onSave().then(() => { + setLoading(false); + setOpen(false); + // @ts-ignore + answer(true); + }); + break; + case "delete": + setLoading(true); + props.onDiscard().then(() => { + setLoading(false); + setOpen(false); + // @ts-ignore + answer(true); + }); + break; + case "cancel": + setOpen(false); + // @ts-ignore + answer(false); + default: + break; + } + }; + + return ( + <> + + + handler("cancel")} + > + + + + + + Unsaved Changes + + + + You have unsaved changes that will be lost if you leave this page. + + + + + + handler("delete")} + > + Don't Save + + handler("save")} + > + Save + + + + + + + ); +}); diff --git a/src/apps/content-editor/src/app/views/ItemEdit/ItemEdit.js b/src/apps/content-editor/src/app/views/ItemEdit/ItemEdit.js index 53fdbdb3ae..719879e428 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/ItemEdit.js +++ b/src/apps/content-editor/src/app/views/ItemEdit/ItemEdit.js @@ -285,6 +285,8 @@ export default function ItemEdit() { onDiscard={discard} /> + {/* */} + { setPublishMenu(e.currentTarget); }} + disabled={publishing || publishAfterSave || isFetching} > diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/LanguageSelector.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/LanguageSelector.tsx index fc241c3e23..34623bfa77 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/LanguageSelector.tsx +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/LanguageSelector.tsx @@ -89,7 +89,9 @@ export const LanguageSelector = () => { endIcon={} onClick={(e) => setAnchorEl(e.currentTarget)} > - {getFlagEmojiFromIETFTag(activeLanguage?.code)}{" "} + + {getFlagEmojiFromIETFTag(activeLanguage?.code)} + {" "} {activeLanguage?.code?.split("-")[0]?.toUpperCase()} ( {getCountryCode(activeLanguage?.code)}) diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx index f8d9961ef5..3d48e32e43 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx @@ -111,7 +111,9 @@ export const ItemEditHeader = ({ saving, onSave }: HeaderProps) => { display: "-webkit-box", "-webkit-line-clamp": "2", "-webkit-box-orient": "vertical", - wordBreak: "break-all", + wordBreak: "break-word", + wordWrap: "break-word", + hyphens: "auto", overflow: "hidden", mb: 2, }} diff --git a/src/shell/components/CustomBreadcrumbs.tsx b/src/shell/components/CustomBreadcrumbs.tsx index 910d438b4e..2d3f74f31a 100644 --- a/src/shell/components/CustomBreadcrumbs.tsx +++ b/src/shell/components/CustomBreadcrumbs.tsx @@ -18,7 +18,7 @@ export const CustomBreadcrumbs = ({ items }: CustomBreadcrumbsProps) => { <> Date: Wed, 23 Aug 2023 21:26:09 -0700 Subject: [PATCH 14/59] vqa changes --- package-lock.json | 4 +-- .../ItemEditHeader/ItemEditHeaderActions.tsx | 13 +++++++- .../ItemEditHeader/LanguageSelector.tsx | 5 ++-- .../components/ItemEditHeader/MoreMenu.tsx | 30 +++++++++++-------- .../components/ItemEditHeader/PreviewMenu.tsx | 4 +-- .../ItemEditHeader/VersionSelector.tsx | 2 +- .../components/ItemEditHeader/index.tsx | 4 +-- src/shell/constants.ts | 4 +-- 8 files changed, 41 insertions(+), 25 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3229ea2c3b..55a67936a1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3817,7 +3817,7 @@ "node_modules/@zesty-io/material": { "version": "0.10.0", "resolved": "file:../material/zesty-io-material-0.10.0.tgz", - "integrity": "sha512-yihCmStexl+BSFqspI2ssEndAIJzx/ZgLTd0PDRZBahnZaqN27DmNShH1kAIuh0xR4844A3kjo9wS4kT9NQvuw==", + "integrity": "sha512-ac+lAX7V5UTTT3X1v9stpz+beSrxZBX9k/5yIVvAnNJv7kapJUsy7JAFYiNmxnKSIszwvU0A3DVLdnMrJhDF4A==", "license": "MIT", "dependencies": { "@emotion/react": "^11.9.0", @@ -18009,7 +18009,7 @@ }, "@zesty-io/material": { "version": "file:../material/zesty-io-material-0.10.0.tgz", - "integrity": "sha512-yihCmStexl+BSFqspI2ssEndAIJzx/ZgLTd0PDRZBahnZaqN27DmNShH1kAIuh0xR4844A3kjo9wS4kT9NQvuw==", + "integrity": "sha512-ac+lAX7V5UTTT3X1v9stpz+beSrxZBX9k/5yIVvAnNJv7kapJUsy7JAFYiNmxnKSIszwvU0A3DVLdnMrJhDF4A==", "requires": { "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx index 8fd2af2403..f7692bf672 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx @@ -262,7 +262,16 @@ export const ItemEditHeaderActions = ({ itemState === ITEM_STATES.dirty || publishAfterSave || isFetching ? ( - + } sx={{ @@ -286,6 +295,8 @@ export const ItemEditHeaderActions = ({ - )} - {hideUpload ? null : ( - - )} - + {groupId ? ( + { + closeMenu(); + setOpenDialog("delete"); + }} + > + + + + Delete + + ) : null} + {id ? ( + { + closeMenu(); + if (hiddenGroups.includes(id)) { + setHiddenGroups( + hiddenGroups.filter((group) => group !== id) + ); + } else { + setHiddenGroups([...(hiddenGroups as String[]), id]); + } + // dispatches storage event for components to listen to + window.dispatchEvent(new StorageEvent("storage")); + }} + > + + {hiddenGroups.includes(id) ? ( + + ) : ( + + )} + + + {hiddenGroups.includes(id) ? "Show" : "Hide"} + + + ) : null} + + {hideFolderCreate ? null : ( + + )} + {hideUpload ? null : ( + + )} + + )} From 33757f1624bf6c8a1db6f63aa192566cd2b649e1 Mon Sep 17 00:00:00 2001 From: Nar Cuenca Date: Fri, 25 Aug 2023 11:03:01 +0800 Subject: [PATCH 26/59] task: center align separator --- src/shell/components/CustomBreadcrumbs.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/shell/components/CustomBreadcrumbs.tsx b/src/shell/components/CustomBreadcrumbs.tsx index 2d3f74f31a..284b59b67a 100644 --- a/src/shell/components/CustomBreadcrumbs.tsx +++ b/src/shell/components/CustomBreadcrumbs.tsx @@ -28,6 +28,11 @@ export const CustomBreadcrumbs = ({ items }: CustomBreadcrumbsProps) => { }, }, }} + sx={{ + "& .MuiBreadcrumbs-separator": { + alignItems: "center", + }, + }} > {items.map((item, index) => ( Date: Fri, 25 Aug 2023 11:03:26 +0800 Subject: [PATCH 27/59] task: title vertical clamp --- src/apps/media/src/app/components/Header.tsx | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/apps/media/src/app/components/Header.tsx b/src/apps/media/src/app/components/Header.tsx index bebe38ad27..46f4a0b145 100644 --- a/src/apps/media/src/app/components/Header.tsx +++ b/src/apps/media/src/app/components/Header.tsx @@ -324,11 +324,23 @@ export const Header = ({ )} - + {title} - + {id ? ( Date: Fri, 25 Aug 2023 11:03:47 +0800 Subject: [PATCH 28/59] task: show breadcrumbs in folder view --- src/apps/media/src/app/views/FolderMedia.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/apps/media/src/app/views/FolderMedia.tsx b/src/apps/media/src/app/views/FolderMedia.tsx index d6755f1995..bb59df336b 100644 --- a/src/apps/media/src/app/views/FolderMedia.tsx +++ b/src/apps/media/src/app/views/FolderMedia.tsx @@ -175,6 +175,7 @@ export const FolderMedia = ({ files={groupFiles} groupId={currentGroup?.group_id || groupData?.group_id} addImagesCallback={addImagesCallback} + showBreadcrumbs /> {isBinsFetching || isBinGroupsFetching || isFetching ? ( Date: Fri, 25 Aug 2023 11:04:00 +0800 Subject: [PATCH 29/59] task: create media breadcrumbs component --- .../src/app/components/MediaBreadcrumbs.tsx | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 src/apps/media/src/app/components/MediaBreadcrumbs.tsx diff --git a/src/apps/media/src/app/components/MediaBreadcrumbs.tsx b/src/apps/media/src/app/components/MediaBreadcrumbs.tsx new file mode 100644 index 0000000000..481cea1cdc --- /dev/null +++ b/src/apps/media/src/app/components/MediaBreadcrumbs.tsx @@ -0,0 +1,92 @@ +import { FC, useMemo } from "react"; +import { useSelector } from "react-redux"; +import { Stack, Typography, SvgIcon } from "@mui/material"; +import { FolderGlobal } from "@zesty-io/material"; +import { FolderRounded } from "@mui/icons-material"; +import { useHistory } from "react-router-dom"; + +import { CustomBreadcrumbs } from "../../../../../shell/components/CustomBreadcrumbs"; +import { + useGetAllBinGroupsQuery, + useGetBinsQuery, +} from "../../../../../shell/services/mediaManager"; +import { Group } from "../../../../../shell/services/types"; + +interface Props { + id: string; +} +export const MediaBreadcrumbs: FC = ({ id }) => { + const history = useHistory(); + const instanceId = useSelector((state: any) => state.instance.ID); + const ecoId = useSelector((state: any) => state.instance.ecoID); + const { data: bins } = useGetBinsQuery({ instanceId, ecoId }); + const { data: binGroups } = useGetAllBinGroupsQuery( + bins?.map((bin) => bin.id), + { + skip: !bins?.length, + } + ); + + const crumbs = useMemo(() => { + if (binGroups?.length) { + const items = []; + + if (id.startsWith("1")) { + const binFolder = bins?.find((bin) => bin.id === id); + + items.push({ + node: , + onClick: () => history.push(`/media/folder/${id}`), + }); + } else { + const activeFolder = binGroups.flat().find((group) => group.id === id); + + let parentFolder = activeFolder?.group_id; + + while (parentFolder) { + const parent = parentFolder.startsWith("1") + ? bins?.find((bin) => bin.id === parentFolder) + : binGroups.flat().find((group) => group.id === parentFolder); + + if (parent) { + items.unshift({ + node: , + onClick: () => history.push(`/media/folder/${parent?.id}`), + }); + + parentFolder = parent?.id.startsWith("1") + ? null + : (parent as Group)?.group_id; + } else { + parentFolder = null; + } + } + } + + return items; + } + + return []; + }, [id, binGroups]); + + return ; +}; + +interface CrumbProps { + id: string; + name: string; +} +const Crumb: FC = ({ id, name }) => { + return ( + + + + {name} + + + ); +}; From e251ad687d928eaada80958535e26411a9ad26ee Mon Sep 17 00:00:00 2001 From: Andres Date: Thu, 24 Aug 2023 22:02:11 -0700 Subject: [PATCH 30/59] cypress updates --- cypress/e2e/content/actions.spec.js | 18 ++++++++++-------- cypress/e2e/content/content.spec.js | 19 +++++++++---------- .../ScheduleFlyout/ScheduleFlyout.js | 2 +- .../ItemEditHeader/DuoModeToggle.tsx | 1 + .../ItemEditHeader/ItemEditHeaderActions.tsx | 4 ++++ 5 files changed, 25 insertions(+), 19 deletions(-) diff --git a/cypress/e2e/content/actions.spec.js b/cypress/e2e/content/actions.spec.js index 9369f31450..875285a589 100644 --- a/cypress/e2e/content/actions.spec.js +++ b/cypress/e2e/content/actions.spec.js @@ -84,7 +84,8 @@ describe("Actions in content editor", () => { it.skip("Schedules a Publish for an item", () => { // TODO: remove reload when UI state is consistent cy.reload(); - cy.get("#PublishScheduleButton").click(); + cy.getBySelector("PublishMenuButton").click(); + cy.getBySelector("PublishScheduleButton").click(); // select date and time cy.get(".form-control").first().click(); cy.get(".flatpickr-calendar.open .flatpickr-next-month").click(); @@ -102,10 +103,12 @@ describe("Actions in content editor", () => { cy.visit("/content/6-556370-8sh47g/7-82a5c7ffb0-07vj1c"); }); - cy.get("#PublishScheduleButton").click(); - cy.get( - ".ModalAligner--ptdt- .MuiOutlinedInput-root .MuiInputAdornment-root .MuiButtonBase-root" - ).click(); + cy.getBySelector("PublishMenuButton").click(); + cy.getBySelector("PublishScheduleButton").click(); + // cy.get( + // ".ModalAligner--ptdt- .MuiOutlinedInput-root .MuiInputAdornment-root .MuiButtonBase-root" + // ).click(); + cy.getBySelector("SchedulePublishDate").find("button").click(); cy.get( '.MuiCalendarPicker-root .MuiPickersArrowSwitcher-root button[aria-label="Previous month"]' @@ -116,8 +119,8 @@ describe("Actions in content editor", () => { }); it.skip("Unschedules a Publish for an item", () => { - cy.get("#PublishScheduleButton").click(); - cy.get("[data-cy=UnschedulePublishButton]").click(); + cy.getBySelector("PublishMenuButton").click(); + cy.getBySelector("PublishScheduleButton").click(); cy.get("#SchedulePublishClose").click(); }); @@ -134,7 +137,6 @@ describe("Actions in content editor", () => { it("Saved item becomes publishable", () => { cy.get("#PublishButton").should("exist"); - cy.get("#PublishButton").should("contain", "1"); }); it("Displays a new item in the list", () => { diff --git a/cypress/e2e/content/content.spec.js b/cypress/e2e/content/content.spec.js index 60ce2041d7..2568cb1225 100644 --- a/cypress/e2e/content/content.spec.js +++ b/cypress/e2e/content/content.spec.js @@ -41,16 +41,15 @@ describe("Content Specs", () => { }); it("Check Duo Mode Collapsed functionality", () => { - cy.get("main header button span").then((el) => { - // el[1] === ON(desktop icon) - const classList = Array.from(el[1].classList); - if (classList.includes("Selected--3_F85")) { - console.log("Selected"); - cy.get("[data-cy=DuoModeContainer] iframe").should("be.visible"); - } else { - console.log("Not Selected"); - } - }); + cy.getBySelector("DuoModeToggle") + .invoke("hasClass", "Mui-checked") + .then((hasClass) => { + if (hasClass) { + cy.get("[data-cy=DuoModeContainer] iframe").should("be.visible"); + } else { + cy.log("Not Selected"); + } + }); }); }); diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/Header/ItemVersioning/ScheduleFlyout/ScheduleFlyout.js b/src/apps/content-editor/src/app/views/ItemEdit/components/Header/ItemVersioning/ScheduleFlyout/ScheduleFlyout.js index c77b3f952b..c46c5e453b 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/components/Header/ItemVersioning/ScheduleFlyout/ScheduleFlyout.js +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/Header/ItemVersioning/ScheduleFlyout/ScheduleFlyout.js @@ -201,7 +201,7 @@ export default class ScheduleFlyout extends Component { /> -
+
{ return ( { if (event.target.checked) { diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx index 11d1d251fb..a29748295c 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/ItemEditHeaderActions.tsx @@ -211,6 +211,7 @@ export const ItemEditHeaderActions = ({ }} loading={saving && !publishAfterSave} disabled={!canUpdate} + id="SaveItemButton" > Save @@ -289,6 +290,7 @@ export const ItemEditHeaderActions = ({ loading={publishing || publishAfterSave || isFetching} color="success" variant="contained" + id="PublishButton" > {itemState === ITEM_STATES.dirty ? "Save & Publish" : "Publish"} @@ -303,6 +305,7 @@ export const ItemEditHeaderActions = ({ setPublishMenu(e.currentTarget); }} disabled={publishing || publishAfterSave || isFetching} + data-cy="PublishMenuButton" > @@ -504,6 +507,7 @@ const PublishingMenu = ({ } onClose(); }} + data-cy="PublishScheduleButton" > From e8350bdd6a5c3fe75f307628219813e92ac760b3 Mon Sep 17 00:00:00 2001 From: Andres Date: Thu, 24 Aug 2023 22:15:17 -0700 Subject: [PATCH 31/59] remove local package --- package-lock.json | 694 +++++++++++++++++++++++++++------------------- package.json | 2 +- 2 files changed, 403 insertions(+), 293 deletions(-) diff --git a/package-lock.json b/package-lock.json index eba505f0a2..2987169dec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "@tinymce/tinymce-react": "^3.12.6", "@welldone-software/why-did-you-render": "^6.1.1", "@zesty-io/core": "1.9.1", - "@zesty-io/material": "file:../material/zesty-io-material-0.10.0.tgz", + "@zesty-io/material": "^0.9.0", "chart.js": "^3.8.0", "chartjs-adapter-moment": "^1.0.1", "chartjs-plugin-datalabels": "^2.0.0", @@ -505,6 +505,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -986,6 +987,7 @@ }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.17.12", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.17.12" @@ -2005,24 +2007,21 @@ } }, "node_modules/@emotion/babel-plugin": { - "version": "11.9.2", - "license": "MIT", + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", "dependencies": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/plugin-syntax-jsx": "^7.12.13", - "@babel/runtime": "^7.13.10", - "@emotion/hash": "^0.8.0", - "@emotion/memoize": "^0.7.5", - "@emotion/serialize": "^1.0.2", - "babel-plugin-macros": "^2.6.1", + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", "find-root": "^1.1.0", "source-map": "^0.5.7", - "stylis": "4.0.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "stylis": "4.2.0" } }, "node_modules/@emotion/cache": { @@ -2037,24 +2036,10 @@ "stylis": "4.2.0" } }, - "node_modules/@emotion/cache/node_modules/@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" - }, - "node_modules/@emotion/cache/node_modules/@emotion/weak-memoize": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", - "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" - }, - "node_modules/@emotion/cache/node_modules/stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" - }, "node_modules/@emotion/hash": { - "version": "0.8.0", - "license": "MIT" + "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/is-prop-valid": { "version": "1.2.1", @@ -2064,48 +2049,43 @@ "@emotion/memoize": "^0.8.1" } }, - "node_modules/@emotion/is-prop-valid/node_modules/@emotion/memoize": { + "node_modules/@emotion/memoize": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, - "node_modules/@emotion/memoize": { - "version": "0.7.5", - "license": "MIT" - }, "node_modules/@emotion/react": { - "version": "11.9.0", - "license": "MIT", + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", + "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", "dependencies": { - "@babel/runtime": "^7.13.10", - "@emotion/babel-plugin": "^11.7.1", - "@emotion/cache": "^11.7.1", - "@emotion/serialize": "^1.0.3", - "@emotion/utils": "^1.1.0", - "@emotion/weak-memoize": "^0.2.5", + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", "hoist-non-react-statics": "^3.3.1" }, "peerDependencies": { - "@babel/core": "^7.0.0", "react": ">=16.8.0" }, "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, "@types/react": { "optional": true } } }, "node_modules/@emotion/serialize": { - "version": "1.0.3", - "license": "MIT", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", "dependencies": { - "@emotion/hash": "^0.8.0", - "@emotion/memoize": "^0.7.4", - "@emotion/unitless": "^0.7.5", - "@emotion/utils": "^1.0.0", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", "csstype": "^3.0.2" } }, @@ -2115,32 +2095,39 @@ "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" }, "node_modules/@emotion/styled": { - "version": "11.8.1", - "license": "MIT", + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", + "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", "dependencies": { - "@babel/runtime": "^7.13.10", - "@emotion/babel-plugin": "^11.7.1", - "@emotion/is-prop-valid": "^1.1.2", - "@emotion/serialize": "^1.0.2", - "@emotion/utils": "^1.1.0" + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" }, "peerDependencies": { - "@babel/core": "^7.0.0", "@emotion/react": "^11.0.0-rc.0", "react": ">=16.8.0" }, "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, "@types/react": { "optional": true } } }, "node_modules/@emotion/unitless": { - "version": "0.7.5", - "license": "MIT" + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peerDependencies": { + "react": ">=16.8.0" + } }, "node_modules/@emotion/utils": { "version": "1.2.1", @@ -2148,8 +2135,43 @@ "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" }, "node_modules/@emotion/weak-memoize": { - "version": "0.2.5", - "license": "MIT" + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, + "node_modules/@floating-ui/core": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz", + "integrity": "sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==", + "dependencies": { + "@floating-ui/utils": "^0.1.1" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz", + "integrity": "sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==", + "dependencies": { + "@floating-ui/core": "^1.4.1", + "@floating-ui/utils": "^0.1.1" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.1.tgz", + "integrity": "sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA==", + "dependencies": { + "@floating-ui/dom": "^1.3.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz", + "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==" }, "node_modules/@foreachbe/cypress-tinymce": { "version": "1.0.0", @@ -2307,14 +2329,15 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-beta.11", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.11.tgz", - "integrity": "sha512-FdKZGPd8qmC3ZNke7CNhzcEgToc02M6WYZc9hcBsNQ17bgAd3s9F//1bDDYgMVBYxDM71V0sv/hBHlOY4I1ZVA==", + "version": "5.0.0-beta.12", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.12.tgz", + "integrity": "sha512-tZjjXNAyUpwSDT1uRliZMhRQkWYzELJ8Qi61EuOMRpi36HIwnK2T7Nr4RI423Sv8G2EEikDAZj7je33eNd73NQ==", "dependencies": { - "@babel/runtime": "^7.22.6", + "@babel/runtime": "^7.22.10", "@emotion/is-prop-valid": "^1.2.1", + "@floating-ui/react-dom": "^2.0.1", "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.5", + "@mui/utils": "^5.14.6", "@popperjs/core": "^2.11.8", "clsx": "^2.0.0", "prop-types": "^15.8.1", @@ -2352,20 +2375,20 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.14.5", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.5.tgz", - "integrity": "sha512-+wpGH1USwPcKMFPMvXqYPC6fEvhxM3FzxC8lyDiNK/imLyyJ6y2DPb1Oue7OGIKJWBmYBqrWWtfovrxd1aJHTA==", + "version": "5.14.6", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.6.tgz", + "integrity": "sha512-QZEU3pyGWLuaHbxvOlShol7U1FVgzWBR0OH9H8D7L8w4/vto5N5jJVvlqFQS3T0zbR6YGHxFaiL6Ky87jQg7aw==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui" } }, "node_modules/@mui/icons-material": { - "version": "5.14.3", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.3.tgz", - "integrity": "sha512-XkxWPhageu1OPUm2LWjo5XqeQ0t2xfGe8EiLkRW9oz2LHMMZmijvCxulhgquUVTF1DnoSh+3KoDLSsoAFtVNVw==", + "version": "5.14.6", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.6.tgz", + "integrity": "sha512-7Cujy7lRGTj2T3SvY9C9ZOTFDtrXJogeNnRcU/ODyNoxwskMNPFOcc15F+98MAdJenBVLJPYu+vPP6DUvEpNrA==", "dependencies": { - "@babel/runtime": "^7.22.6" + "@babel/runtime": "^7.22.10" }, "engines": { "node": ">=12.0.0" @@ -2463,16 +2486,16 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, "node_modules/@mui/material": { - "version": "5.14.5", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.5.tgz", - "integrity": "sha512-4qa4GMfuZH0Ai3mttk5ccXP8a3sf7aPlAJwyMrUSz6h9hPri6BPou94zeu3rENhhmKLby9S/W1y+pmficy8JKA==", - "dependencies": { - "@babel/runtime": "^7.22.6", - "@mui/base": "5.0.0-beta.11", - "@mui/core-downloads-tracker": "^5.14.5", - "@mui/system": "^5.14.5", + "version": "5.14.6", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.6.tgz", + "integrity": "sha512-C3UgGrmtvcGkQkm0ONBU7bTdapTjQc2Se3b2354xMmU7lgSgW7VM6EP9wIH5XqqoJ60m9l/s9kbTWX0Y+EaWvA==", + "dependencies": { + "@babel/runtime": "^7.22.10", + "@mui/base": "5.0.0-beta.12", + "@mui/core-downloads-tracker": "^5.14.6", + "@mui/system": "^5.14.6", "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.5", + "@mui/utils": "^5.14.6", "@types/react-transition-group": "^4.4.6", "clsx": "^2.0.0", "csstype": "^3.1.2", @@ -2520,12 +2543,12 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, "node_modules/@mui/private-theming": { - "version": "5.14.5", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.5.tgz", - "integrity": "sha512-cC4C5RrpXpDaaZyH9QwmPhRLgz+f2SYbOty3cPkk4qPSOSfif2ZEcDD9HTENKDDd9deB+xkPKzzZhi8cxIx8Ig==", + "version": "5.14.6", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.6.tgz", + "integrity": "sha512-3VBLFGizBXfofyk33bwRg6t9L648aKnLmOKPfY1wFuiXq3AEYwobK65iDci/tHKxm/VKbZ6A7PFjLejvB3EvRQ==", "dependencies": { - "@babel/runtime": "^7.22.6", - "@mui/utils": "^5.14.5", + "@babel/runtime": "^7.22.10", + "@mui/utils": "^5.14.6", "prop-types": "^15.8.1" }, "engines": { @@ -2546,11 +2569,11 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.13.2", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.13.2.tgz", - "integrity": "sha512-VCYCU6xVtXOrIN8lcbuPmoG+u7FYuOERG++fpY74hPpEWkyFQG97F+/XfTQVYzlR2m7nPjnwVUgATcTCMEaMvw==", + "version": "5.14.6", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.6.tgz", + "integrity": "sha512-I6zeu/OP1Hk4NsX1Oj85TiYl1dER0JMsLJVn76J1Ihl24A5EbiZQKJp3Mn+ufA79ypkdAvM9aQCAQyiVBFcUHg==", "dependencies": { - "@babel/runtime": "^7.21.0", + "@babel/runtime": "^7.22.10", "@emotion/cache": "^11.11.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -2577,15 +2600,15 @@ } }, "node_modules/@mui/system": { - "version": "5.14.5", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.5.tgz", - "integrity": "sha512-mextXZHDeGcR7E1kx43TRARrVXy+gI4wzpUgNv7MqZs1dvTVXQGVeAT6ydj9d6FUqHBPMNLGV/21vJOrpqsL+w==", + "version": "5.14.6", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.6.tgz", + "integrity": "sha512-/n0ae1MegWjiV1BpRU8jgg4E0zBjeB2VYsT/68ag/xaDuq3/TaDKJeT9REIvyBvwlG3CI3S2O+tRELktxCD1kg==", "dependencies": { - "@babel/runtime": "^7.22.6", - "@mui/private-theming": "^5.14.5", - "@mui/styled-engine": "^5.13.2", + "@babel/runtime": "^7.22.10", + "@mui/private-theming": "^5.14.6", + "@mui/styled-engine": "^5.14.6", "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.5", + "@mui/utils": "^5.14.6", "clsx": "^2.0.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -2637,11 +2660,11 @@ } }, "node_modules/@mui/utils": { - "version": "5.14.5", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.5.tgz", - "integrity": "sha512-6Hzw63VR9C5xYv+CbjndoRLU6Gntal8rJ5W+GUzkyHrGWIyYPWZPa6AevnyGioySNETATe1H9oXS8f/7qgIHJA==", + "version": "5.14.6", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.6.tgz", + "integrity": "sha512-AznpqLu6hrFnpHgcvsSSMCG+cDbkcCYfo+daUwBVReNYv4l+NQ8+wvBAF4aUMi155N7xWbbgh0cyKs6Wdsm3aA==", "dependencies": { - "@babel/runtime": "^7.22.6", + "@babel/runtime": "^7.22.10", "@types/prop-types": "^15.7.5", "@types/react-is": "^18.2.1", "prop-types": "^15.8.1", @@ -2713,21 +2736,21 @@ } }, "node_modules/@mui/x-date-pickers": { - "version": "5.0.0-beta.0", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-5.0.0-beta.0.tgz", - "integrity": "sha512-WfcYe+5j3xbGO9d+uMFem06b9q+9yIcFj0dP3PKCa1zb6m3Tbkigig6vlCuHLKLSXe1P6IQCt+BNVVbU1rfh7A==", - "dependencies": { - "@babel/runtime": "^7.17.2", - "@date-io/core": "^2.14.0", - "@date-io/date-fns": "^2.14.0", - "@date-io/dayjs": "^2.14.0", - "@date-io/luxon": "^2.14.0", - "@date-io/moment": "^2.14.0", - "@mui/utils": "^5.4.1", - "@types/react-transition-group": "^4.4.4", + "version": "5.0.20", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-5.0.20.tgz", + "integrity": "sha512-ERukSeHIoNLbI1C2XRhF9wRhqfsr+Q4B1SAw2ZlU7CWgcG8UBOxgqRKDEOVAIoSWL+DWT6GRuQjOKvj6UXZceA==", + "dependencies": { + "@babel/runtime": "^7.18.9", + "@date-io/core": "^2.15.0", + "@date-io/date-fns": "^2.15.0", + "@date-io/dayjs": "^2.15.0", + "@date-io/luxon": "^2.15.0", + "@date-io/moment": "^2.15.0", + "@mui/utils": "^5.10.3", + "@types/react-transition-group": "^4.4.5", "clsx": "^1.2.1", "prop-types": "^15.7.2", - "react-transition-group": "^4.4.2", + "react-transition-group": "^4.4.5", "rifm": "^0.12.1" }, "engines": { @@ -2744,9 +2767,10 @@ "@mui/system": "^5.4.1", "date-fns": "^2.25.0", "dayjs": "^1.10.7", - "luxon": "^1.28.0 || ^2.0.0", + "luxon": "^1.28.0 || ^2.0.0 || ^3.0.0", "moment": "^2.29.1", - "react": "^17.0.2 || ^18.0.0" + "react": "^17.0.2 || ^18.0.0", + "react-dom": "^17.0.2 || ^18.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -3482,7 +3506,8 @@ }, "node_modules/@types/parse-json": { "version": "4.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "node_modules/@types/prop-types": { "version": "15.7.5", @@ -3815,15 +3840,14 @@ } }, "node_modules/@zesty-io/material": { - "version": "0.10.0", - "resolved": "file:../material/zesty-io-material-0.10.0.tgz", - "integrity": "sha512-oeYhws4rAd8FrEniPYGu54m/cLeUEiRfJsGUyyWrUZi82DWzwoozj8Edxhk8VNdGiR+H7Y5Mcc8SQPpeP8//1A==", - "license": "MIT", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@zesty-io/material/-/material-0.9.0.tgz", + "integrity": "sha512-sxvNRTBsxSaXDlEnRBbFVEPCM1pjafZBLlti62gHeFPR6bUDlbKSUtyp53jYCsu9FJGHB6vr7CZugQy3aKGwZA==", "dependencies": { "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", - "@mui/icons-material": "^5.14.3", - "@mui/material": "^5.14.5", + "@mui/icons-material": "^5.6.2", + "@mui/material": "^5.6.4", "@mui/x-date-pickers": "^5.0.0-alpha.5", "date-fns": "^2.28.0", "react-window": "^1.8.7" @@ -4361,12 +4385,17 @@ } }, "node_modules/babel-plugin-macros": { - "version": "2.8.0", - "license": "MIT", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", "dependencies": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" } }, "node_modules/babel-plugin-polyfill-corejs2": { @@ -4876,7 +4905,8 @@ }, "node_modules/callsites": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "engines": { "node": ">=6" } @@ -5713,17 +5743,18 @@ "license": "MIT" }, "node_modules/cosmiconfig": { - "version": "6.0.0", - "license": "MIT", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "dependencies": { "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", + "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", - "yaml": "^1.7.2" + "yaml": "^1.10.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/create-ecdh": { @@ -6185,9 +6216,12 @@ } }, "node_modules/date-fns": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz", - "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==", + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, "engines": { "node": ">=0.11" }, @@ -6837,7 +6871,8 @@ }, "node_modules/error-ex": { "version": "1.3.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dependencies": { "is-arrayish": "^0.2.1" } @@ -6925,7 +6960,8 @@ }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "engines": { "node": ">=10" }, @@ -7672,7 +7708,8 @@ }, "node_modules/find-root": { "version": "1.1.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" }, "node_modules/find-up": { "version": "4.1.0", @@ -8676,7 +8713,8 @@ }, "node_modules/import-fresh": { "version": "3.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -8831,7 +8869,8 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-bigint": { "version": "1.0.4", @@ -9522,7 +9561,8 @@ }, "node_modules/lines-and-columns": { "version": "1.2.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/listr2": { "version": "3.14.0", @@ -10797,7 +10837,8 @@ }, "node_modules/parent-module": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dependencies": { "callsites": "^3.0.0" }, @@ -10819,7 +10860,8 @@ }, "node_modules/parse-json": { "version": "5.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -12253,7 +12295,8 @@ }, "node_modules/resolve-from": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "engines": { "node": ">=4" } @@ -13566,8 +13609,9 @@ } }, "node_modules/stylis": { - "version": "4.0.13", - "license": "MIT" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" }, "node_modules/supports-color": { "version": "5.5.0", @@ -15513,7 +15557,8 @@ }, "node_modules/yaml": { "version": "1.10.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "engines": { "node": ">= 6" } @@ -15915,7 +15960,8 @@ "@babel/helper-plugin-utils": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", - "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==" + "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==", + "dev": true }, "@babel/helper-remap-async-to-generator": { "version": "7.16.8", @@ -16203,6 +16249,7 @@ }, "@babel/plugin-syntax-jsx": { "version": "7.17.12", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.17.12" } @@ -16820,20 +16867,21 @@ "dev": true }, "@emotion/babel-plugin": { - "version": "11.9.2", + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", "requires": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/plugin-syntax-jsx": "^7.12.13", - "@babel/runtime": "^7.13.10", - "@emotion/hash": "^0.8.0", - "@emotion/memoize": "^0.7.5", - "@emotion/serialize": "^1.0.2", - "babel-plugin-macros": "^2.6.1", + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", "find-root": "^1.1.0", "source-map": "^0.5.7", - "stylis": "4.0.13" + "stylis": "4.2.0" } }, "@emotion/cache": { @@ -16846,27 +16894,12 @@ "@emotion/utils": "^1.2.1", "@emotion/weak-memoize": "^0.3.1", "stylis": "4.2.0" - }, - "dependencies": { - "@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" - }, - "@emotion/weak-memoize": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", - "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" - }, - "stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" - } } }, "@emotion/hash": { - "version": "0.8.0" + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" }, "@emotion/is-prop-valid": { "version": "1.2.1", @@ -16874,37 +16907,37 @@ "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", "requires": { "@emotion/memoize": "^0.8.1" - }, - "dependencies": { - "@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" - } } }, "@emotion/memoize": { - "version": "0.7.5" + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, "@emotion/react": { - "version": "11.9.0", - "requires": { - "@babel/runtime": "^7.13.10", - "@emotion/babel-plugin": "^11.7.1", - "@emotion/cache": "^11.7.1", - "@emotion/serialize": "^1.0.3", - "@emotion/utils": "^1.1.0", - "@emotion/weak-memoize": "^0.2.5", + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", + "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", "hoist-non-react-statics": "^3.3.1" } }, "@emotion/serialize": { - "version": "1.0.3", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", "requires": { - "@emotion/hash": "^0.8.0", - "@emotion/memoize": "^0.7.4", - "@emotion/unitless": "^0.7.5", - "@emotion/utils": "^1.0.0", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", "csstype": "^3.0.2" } }, @@ -16914,17 +16947,27 @@ "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" }, "@emotion/styled": { - "version": "11.8.1", + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", + "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", "requires": { - "@babel/runtime": "^7.13.10", - "@emotion/babel-plugin": "^11.7.1", - "@emotion/is-prop-valid": "^1.1.2", - "@emotion/serialize": "^1.0.2", - "@emotion/utils": "^1.1.0" + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" } }, "@emotion/unitless": { - "version": "0.7.5" + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==" }, "@emotion/utils": { "version": "1.2.1", @@ -16932,7 +16975,39 @@ "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" }, "@emotion/weak-memoize": { - "version": "0.2.5" + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, + "@floating-ui/core": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz", + "integrity": "sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==", + "requires": { + "@floating-ui/utils": "^0.1.1" + } + }, + "@floating-ui/dom": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz", + "integrity": "sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==", + "requires": { + "@floating-ui/core": "^1.4.1", + "@floating-ui/utils": "^0.1.1" + } + }, + "@floating-ui/react-dom": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.1.tgz", + "integrity": "sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA==", + "requires": { + "@floating-ui/dom": "^1.3.0" + } + }, + "@floating-ui/utils": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz", + "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==" }, "@foreachbe/cypress-tinymce": { "version": "1.0.0", @@ -17032,14 +17107,15 @@ } }, "@mui/base": { - "version": "5.0.0-beta.11", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.11.tgz", - "integrity": "sha512-FdKZGPd8qmC3ZNke7CNhzcEgToc02M6WYZc9hcBsNQ17bgAd3s9F//1bDDYgMVBYxDM71V0sv/hBHlOY4I1ZVA==", + "version": "5.0.0-beta.12", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.12.tgz", + "integrity": "sha512-tZjjXNAyUpwSDT1uRliZMhRQkWYzELJ8Qi61EuOMRpi36HIwnK2T7Nr4RI423Sv8G2EEikDAZj7je33eNd73NQ==", "requires": { - "@babel/runtime": "^7.22.6", + "@babel/runtime": "^7.22.10", "@emotion/is-prop-valid": "^1.2.1", + "@floating-ui/react-dom": "^2.0.1", "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.5", + "@mui/utils": "^5.14.6", "@popperjs/core": "^2.11.8", "clsx": "^2.0.0", "prop-types": "^15.8.1", @@ -17059,16 +17135,16 @@ } }, "@mui/core-downloads-tracker": { - "version": "5.14.5", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.5.tgz", - "integrity": "sha512-+wpGH1USwPcKMFPMvXqYPC6fEvhxM3FzxC8lyDiNK/imLyyJ6y2DPb1Oue7OGIKJWBmYBqrWWtfovrxd1aJHTA==" + "version": "5.14.6", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.6.tgz", + "integrity": "sha512-QZEU3pyGWLuaHbxvOlShol7U1FVgzWBR0OH9H8D7L8w4/vto5N5jJVvlqFQS3T0zbR6YGHxFaiL6Ky87jQg7aw==" }, "@mui/icons-material": { - "version": "5.14.3", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.3.tgz", - "integrity": "sha512-XkxWPhageu1OPUm2LWjo5XqeQ0t2xfGe8EiLkRW9oz2LHMMZmijvCxulhgquUVTF1DnoSh+3KoDLSsoAFtVNVw==", + "version": "5.14.6", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.6.tgz", + "integrity": "sha512-7Cujy7lRGTj2T3SvY9C9ZOTFDtrXJogeNnRcU/ODyNoxwskMNPFOcc15F+98MAdJenBVLJPYu+vPP6DUvEpNrA==", "requires": { - "@babel/runtime": "^7.22.6" + "@babel/runtime": "^7.22.10" } }, "@mui/lab": { @@ -17108,16 +17184,16 @@ } }, "@mui/material": { - "version": "5.14.5", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.5.tgz", - "integrity": "sha512-4qa4GMfuZH0Ai3mttk5ccXP8a3sf7aPlAJwyMrUSz6h9hPri6BPou94zeu3rENhhmKLby9S/W1y+pmficy8JKA==", - "requires": { - "@babel/runtime": "^7.22.6", - "@mui/base": "5.0.0-beta.11", - "@mui/core-downloads-tracker": "^5.14.5", - "@mui/system": "^5.14.5", + "version": "5.14.6", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.6.tgz", + "integrity": "sha512-C3UgGrmtvcGkQkm0ONBU7bTdapTjQc2Se3b2354xMmU7lgSgW7VM6EP9wIH5XqqoJ60m9l/s9kbTWX0Y+EaWvA==", + "requires": { + "@babel/runtime": "^7.22.10", + "@mui/base": "5.0.0-beta.12", + "@mui/core-downloads-tracker": "^5.14.6", + "@mui/system": "^5.14.6", "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.5", + "@mui/utils": "^5.14.6", "@types/react-transition-group": "^4.4.6", "clsx": "^2.0.0", "csstype": "^3.1.2", @@ -17139,36 +17215,36 @@ } }, "@mui/private-theming": { - "version": "5.14.5", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.5.tgz", - "integrity": "sha512-cC4C5RrpXpDaaZyH9QwmPhRLgz+f2SYbOty3cPkk4qPSOSfif2ZEcDD9HTENKDDd9deB+xkPKzzZhi8cxIx8Ig==", + "version": "5.14.6", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.6.tgz", + "integrity": "sha512-3VBLFGizBXfofyk33bwRg6t9L648aKnLmOKPfY1wFuiXq3AEYwobK65iDci/tHKxm/VKbZ6A7PFjLejvB3EvRQ==", "requires": { - "@babel/runtime": "^7.22.6", - "@mui/utils": "^5.14.5", + "@babel/runtime": "^7.22.10", + "@mui/utils": "^5.14.6", "prop-types": "^15.8.1" } }, "@mui/styled-engine": { - "version": "5.13.2", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.13.2.tgz", - "integrity": "sha512-VCYCU6xVtXOrIN8lcbuPmoG+u7FYuOERG++fpY74hPpEWkyFQG97F+/XfTQVYzlR2m7nPjnwVUgATcTCMEaMvw==", + "version": "5.14.6", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.6.tgz", + "integrity": "sha512-I6zeu/OP1Hk4NsX1Oj85TiYl1dER0JMsLJVn76J1Ihl24A5EbiZQKJp3Mn+ufA79ypkdAvM9aQCAQyiVBFcUHg==", "requires": { - "@babel/runtime": "^7.21.0", + "@babel/runtime": "^7.22.10", "@emotion/cache": "^11.11.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" } }, "@mui/system": { - "version": "5.14.5", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.5.tgz", - "integrity": "sha512-mextXZHDeGcR7E1kx43TRARrVXy+gI4wzpUgNv7MqZs1dvTVXQGVeAT6ydj9d6FUqHBPMNLGV/21vJOrpqsL+w==", + "version": "5.14.6", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.6.tgz", + "integrity": "sha512-/n0ae1MegWjiV1BpRU8jgg4E0zBjeB2VYsT/68ag/xaDuq3/TaDKJeT9REIvyBvwlG3CI3S2O+tRELktxCD1kg==", "requires": { - "@babel/runtime": "^7.22.6", - "@mui/private-theming": "^5.14.5", - "@mui/styled-engine": "^5.13.2", + "@babel/runtime": "^7.22.10", + "@mui/private-theming": "^5.14.6", + "@mui/styled-engine": "^5.14.6", "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.5", + "@mui/utils": "^5.14.6", "clsx": "^2.0.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -17187,11 +17263,11 @@ "integrity": "sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==" }, "@mui/utils": { - "version": "5.14.5", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.5.tgz", - "integrity": "sha512-6Hzw63VR9C5xYv+CbjndoRLU6Gntal8rJ5W+GUzkyHrGWIyYPWZPa6AevnyGioySNETATe1H9oXS8f/7qgIHJA==", + "version": "5.14.6", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.6.tgz", + "integrity": "sha512-AznpqLu6hrFnpHgcvsSSMCG+cDbkcCYfo+daUwBVReNYv4l+NQ8+wvBAF4aUMi155N7xWbbgh0cyKs6Wdsm3aA==", "requires": { - "@babel/runtime": "^7.22.6", + "@babel/runtime": "^7.22.10", "@types/prop-types": "^15.7.5", "@types/react-is": "^18.2.1", "prop-types": "^15.8.1", @@ -17233,21 +17309,21 @@ } }, "@mui/x-date-pickers": { - "version": "5.0.0-beta.0", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-5.0.0-beta.0.tgz", - "integrity": "sha512-WfcYe+5j3xbGO9d+uMFem06b9q+9yIcFj0dP3PKCa1zb6m3Tbkigig6vlCuHLKLSXe1P6IQCt+BNVVbU1rfh7A==", - "requires": { - "@babel/runtime": "^7.17.2", - "@date-io/core": "^2.14.0", - "@date-io/date-fns": "^2.14.0", - "@date-io/dayjs": "^2.14.0", - "@date-io/luxon": "^2.14.0", - "@date-io/moment": "^2.14.0", - "@mui/utils": "^5.4.1", - "@types/react-transition-group": "^4.4.4", + "version": "5.0.20", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-5.0.20.tgz", + "integrity": "sha512-ERukSeHIoNLbI1C2XRhF9wRhqfsr+Q4B1SAw2ZlU7CWgcG8UBOxgqRKDEOVAIoSWL+DWT6GRuQjOKvj6UXZceA==", + "requires": { + "@babel/runtime": "^7.18.9", + "@date-io/core": "^2.15.0", + "@date-io/date-fns": "^2.15.0", + "@date-io/dayjs": "^2.15.0", + "@date-io/luxon": "^2.15.0", + "@date-io/moment": "^2.15.0", + "@mui/utils": "^5.10.3", + "@types/react-transition-group": "^4.4.5", "clsx": "^1.2.1", "prop-types": "^15.7.2", - "react-transition-group": "^4.4.2", + "react-transition-group": "^4.4.5", "rifm": "^0.12.1" } }, @@ -17739,7 +17815,9 @@ "dev": true }, "@types/parse-json": { - "version": "4.0.0" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "@types/prop-types": { "version": "15.7.5" @@ -18008,13 +18086,14 @@ } }, "@zesty-io/material": { - "version": "file:../material/zesty-io-material-0.10.0.tgz", - "integrity": "sha512-oeYhws4rAd8FrEniPYGu54m/cLeUEiRfJsGUyyWrUZi82DWzwoozj8Edxhk8VNdGiR+H7Y5Mcc8SQPpeP8//1A==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@zesty-io/material/-/material-0.9.0.tgz", + "integrity": "sha512-sxvNRTBsxSaXDlEnRBbFVEPCM1pjafZBLlti62gHeFPR6bUDlbKSUtyp53jYCsu9FJGHB6vr7CZugQy3aKGwZA==", "requires": { "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", - "@mui/icons-material": "^5.14.3", - "@mui/material": "^5.14.5", + "@mui/icons-material": "^5.6.2", + "@mui/material": "^5.6.4", "@mui/x-date-pickers": "^5.0.0-alpha.5", "date-fns": "^2.28.0", "react-window": "^1.8.7" @@ -18346,11 +18425,13 @@ } }, "babel-plugin-macros": { - "version": "2.8.0", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", "requires": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" } }, "babel-plugin-polyfill-corejs2": { @@ -18694,7 +18775,9 @@ } }, "callsites": { - "version": "3.1.0" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "camel-case": { "version": "4.1.2", @@ -19256,13 +19339,15 @@ "dev": true }, "cosmiconfig": { - "version": "6.0.0", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "requires": { "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", + "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", - "yaml": "^1.7.2" + "yaml": "^1.10.0" } }, "create-ecdh": { @@ -19577,9 +19662,12 @@ } }, "date-fns": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz", - "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==" + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "requires": { + "@babel/runtime": "^7.21.0" + } }, "dayjs": { "version": "1.11.2", @@ -20016,6 +20104,8 @@ }, "error-ex": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "requires": { "is-arrayish": "^0.2.1" } @@ -20080,7 +20170,9 @@ "dev": true }, "escape-string-regexp": { - "version": "4.0.0" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "eslint-scope": { "version": "5.1.1", @@ -20600,7 +20692,9 @@ } }, "find-root": { - "version": "1.1.0" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" }, "find-up": { "version": "4.1.0", @@ -21255,6 +21349,8 @@ }, "import-fresh": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -21345,7 +21441,9 @@ } }, "is-arrayish": { - "version": "0.2.1" + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "is-bigint": { "version": "1.0.4", @@ -21746,7 +21844,9 @@ } }, "lines-and-columns": { - "version": "1.2.4" + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "listr2": { "version": "3.14.0", @@ -22580,6 +22680,8 @@ }, "parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "requires": { "callsites": "^3.0.0" } @@ -22597,6 +22699,8 @@ }, "parse-json": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -23546,7 +23650,9 @@ } }, "resolve-from": { - "version": "4.0.0" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" }, "resolve-pathname": { "version": "3.0.0" @@ -24451,7 +24557,9 @@ "dev": true }, "stylis": { - "version": "4.0.13" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" }, "supports-color": { "version": "5.5.0", @@ -25740,7 +25848,9 @@ "version": "2.1.2" }, "yaml": { - "version": "1.10.2" + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" }, "yargs": { "version": "14.2.3", diff --git a/package.json b/package.json index 1d3b0b59a6..e63ab52171 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "@tinymce/tinymce-react": "^3.12.6", "@welldone-software/why-did-you-render": "^6.1.1", "@zesty-io/core": "1.9.1", - "@zesty-io/material": "file:../material/zesty-io-material-0.10.0.tgz", + "@zesty-io/material": "^0.9.0", "chart.js": "^3.8.0", "chartjs-adapter-moment": "^1.0.1", "chartjs-plugin-datalabels": "^2.0.0", From f4ef7809e66f21aa05791a61af38acb9d64e477f Mon Sep 17 00:00:00 2001 From: Nar Cuenca Date: Fri, 25 Aug 2023 13:18:11 +0800 Subject: [PATCH 32/59] task: folder bg color and media list spacing --- src/apps/media/src/app/components/Folder/index.tsx | 1 + src/apps/media/src/app/components/MediaList.tsx | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/apps/media/src/app/components/Folder/index.tsx b/src/apps/media/src/app/components/Folder/index.tsx index db1524c86c..6404250a91 100644 --- a/src/apps/media/src/app/components/Folder/index.tsx +++ b/src/apps/media/src/app/components/Folder/index.tsx @@ -28,6 +28,7 @@ export const Folder: React.FC = ({ name, id }) => { color: "grey.500", borderColor: "grey.100", textTransform: "none", + backgroundColor: "background.paper", "&:focus": { backgroundColor: (theme) => alpha(theme.palette.primary.main, 0.08), }, diff --git a/src/apps/media/src/app/components/MediaList.tsx b/src/apps/media/src/app/components/MediaList.tsx index ef9e7a1ada..e4dcb23edf 100644 --- a/src/apps/media/src/app/components/MediaList.tsx +++ b/src/apps/media/src/app/components/MediaList.tsx @@ -760,7 +760,7 @@ export const MediaList: FC = ({ files, groups }) => { ]; return ( - + {files && ( = ({ files, groups }) => { cursor: "pointer", }, border: "none", + "& .MuiDataGrid-columnHeaders": { + backgroundColor: "grey.100", + }, }} columns={columns} rows={items} From 1e286bc8f3a83d552cdb8b9424fadd53ec1e925a Mon Sep 17 00:00:00 2001 From: Nar Cuenca Date: Fri, 25 Aug 2023 13:29:27 +0800 Subject: [PATCH 33/59] task: changed font variant --- src/apps/media/src/app/components/Header.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/media/src/app/components/Header.tsx b/src/apps/media/src/app/components/Header.tsx index 46f4a0b145..72f35fe74e 100644 --- a/src/apps/media/src/app/components/Header.tsx +++ b/src/apps/media/src/app/components/Header.tsx @@ -233,7 +233,7 @@ export const Header = ({ > - + {selectedFiles?.length}{" "} {isSelectDialog && limitSelected ? ` / ${limitSelected} ` From fb5f337bee6d9e4be72b57b5f388a07bde14aa06 Mon Sep 17 00:00:00 2001 From: Nar Cuenca Date: Tue, 29 Aug 2023 08:21:31 +0800 Subject: [PATCH 34/59] fix: remove duplicate buttons --- src/apps/media/src/app/components/Header.tsx | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/apps/media/src/app/components/Header.tsx b/src/apps/media/src/app/components/Header.tsx index ecfe78c755..fc5e3b6986 100644 --- a/src/apps/media/src/app/components/Header.tsx +++ b/src/apps/media/src/app/components/Header.tsx @@ -377,22 +377,6 @@ export const Header = ({ )} - - {hideFolderCreate ? null : ( - - )} - {hideUpload ? null : ( - - )} - )} From 25d297e79120581cb6c5ffde06b166db5a89d878 Mon Sep 17 00:00:00 2001 From: Nar Cuenca Date: Tue, 29 Aug 2023 08:21:37 +0800 Subject: [PATCH 35/59] task: cypress tests --- cypress/e2e/media/folders.spec.js | 6 ++++++ src/shell/components/CustomBreadcrumbs.tsx | 1 + 2 files changed, 7 insertions(+) diff --git a/cypress/e2e/media/folders.spec.js b/cypress/e2e/media/folders.spec.js index b2ec2ca729..c55d73720f 100644 --- a/cypress/e2e/media/folders.spec.js +++ b/cypress/e2e/media/folders.spec.js @@ -51,6 +51,12 @@ describe("Media Folders", () => { .contains("CYPRESS TEST NEW FOLDER") .should("exist"); }); + it("Navigates folders via breadcrumbs", () => { + cy.get(".MuiTreeView-root").contains("CYPRESS TEST NEW FOLDER").click(); + + cy.getBySelector("breadcrumbs").find(".MuiBreadcrumbs-li").first().click(); + cy.location("pathname").should("eq", "/media/folder/1-6c9618c-r26pt"); + }); it("Renames folder", () => { cy.get(".MuiTreeView-root").contains("CYPRESS TEST NEW FOLDER").click(); diff --git a/src/shell/components/CustomBreadcrumbs.tsx b/src/shell/components/CustomBreadcrumbs.tsx index 284b59b67a..d42609af3f 100644 --- a/src/shell/components/CustomBreadcrumbs.tsx +++ b/src/shell/components/CustomBreadcrumbs.tsx @@ -17,6 +17,7 @@ export const CustomBreadcrumbs = ({ items }: CustomBreadcrumbsProps) => { return ( <> Date: Tue, 29 Aug 2023 16:09:48 -0700 Subject: [PATCH 36/59] Responsive content title bar --- .../components/ItemEditHeader/index.tsx | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx index 1ab5c43d1e..042e3063ed 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx @@ -27,6 +27,7 @@ import { MoreMenu } from "./MoreMenu"; import { DuplicateItemDialog } from "./DuplicateItemDialog"; import { useState } from "react"; import { PreviewMenu } from "./PreviewMenu"; +import { styled } from "@mui/system"; const tabs = [ { @@ -99,9 +100,20 @@ export const ItemEditHeader = ({ saving, onSave }: HeaderProps) => { "*": { boxSizing: "border-box", }, + containerType: "inline-size", }} > - + { wordWrap: "break-word", hyphens: "auto", overflow: "hidden", - mb: 2, }} > {item?.web?.metaTitle || item?.web?.metaLinkText} - + { display="flex" justifyContent="space-between" alignItems="center" + mt={2} > From 0cbecceefaeda147de0da76bfa91600efc0c08f1 Mon Sep 17 00:00:00 2001 From: Nar Cuenca Date: Wed, 30 Aug 2023 09:57:23 +0800 Subject: [PATCH 37/59] task: moved to theme --- src/apps/media/src/app/components/InsightsTable.tsx | 3 --- src/apps/media/src/app/components/MediaList.tsx | 3 --- src/shell/components/CustomBreadcrumbs.tsx | 5 ----- 3 files changed, 11 deletions(-) diff --git a/src/apps/media/src/app/components/InsightsTable.tsx b/src/apps/media/src/app/components/InsightsTable.tsx index 8ee52f0aff..e2539a6c8f 100644 --- a/src/apps/media/src/app/components/InsightsTable.tsx +++ b/src/apps/media/src/app/components/InsightsTable.tsx @@ -730,9 +730,6 @@ export const InsightsTable: FC = ({ files, loading }) => { cursor: "pointer", }, border: "none", - "& .MuiDataGrid-columnHeaders": { - backgroundColor: "grey.100", - }, }} columns={columns} rows={files} diff --git a/src/apps/media/src/app/components/MediaList.tsx b/src/apps/media/src/app/components/MediaList.tsx index e4dcb23edf..904b6422af 100644 --- a/src/apps/media/src/app/components/MediaList.tsx +++ b/src/apps/media/src/app/components/MediaList.tsx @@ -769,9 +769,6 @@ export const MediaList: FC = ({ files, groups }) => { cursor: "pointer", }, border: "none", - "& .MuiDataGrid-columnHeaders": { - backgroundColor: "grey.100", - }, }} columns={columns} rows={items} diff --git a/src/shell/components/CustomBreadcrumbs.tsx b/src/shell/components/CustomBreadcrumbs.tsx index d42609af3f..fa5222e553 100644 --- a/src/shell/components/CustomBreadcrumbs.tsx +++ b/src/shell/components/CustomBreadcrumbs.tsx @@ -29,11 +29,6 @@ export const CustomBreadcrumbs = ({ items }: CustomBreadcrumbsProps) => { }, }, }} - sx={{ - "& .MuiBreadcrumbs-separator": { - alignItems: "center", - }, - }} > {items.map((item, index) => ( Date: Wed, 30 Aug 2023 09:58:35 +0800 Subject: [PATCH 38/59] task: remove local package --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7620ec015c..e63ab52171 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "@tinymce/tinymce-react": "^3.12.6", "@welldone-software/why-did-you-render": "^6.1.1", "@zesty-io/core": "1.9.1", - "@zesty-io/material": "../material/zesty-io-material-0.10.0-rc.2.tgz", + "@zesty-io/material": "^0.9.0", "chart.js": "^3.8.0", "chartjs-adapter-moment": "^1.0.1", "chartjs-plugin-datalabels": "^2.0.0", From 16b468af906b87a3af174150b3daf0b84f99ffcb Mon Sep 17 00:00:00 2001 From: Nar Cuenca Date: Wed, 30 Aug 2023 10:45:08 +0800 Subject: [PATCH 39/59] task: filter button update --- .../app/components/Controls/DateFilter.tsx | 1 + .../components/Controls/FiletypeFilter.tsx | 50 +++---------------- .../src/app/components/Controls/Sort.tsx | 47 ++++++++++------- 3 files changed, 38 insertions(+), 60 deletions(-) diff --git a/src/apps/media/src/app/components/Controls/DateFilter.tsx b/src/apps/media/src/app/components/Controls/DateFilter.tsx index 43676f8f44..abbf11235c 100644 --- a/src/apps/media/src/app/components/Controls/DateFilter.tsx +++ b/src/apps/media/src/app/components/Controls/DateFilter.tsx @@ -105,6 +105,7 @@ export const DateRangeFilter: FC = () => { color="inherit" sx={{ py: "1px", + backgroundColor: "common.white", }} > Date diff --git a/src/apps/media/src/app/components/Controls/FiletypeFilter.tsx b/src/apps/media/src/app/components/Controls/FiletypeFilter.tsx index 4e69f64ba5..16264b67e8 100644 --- a/src/apps/media/src/app/components/Controls/FiletypeFilter.tsx +++ b/src/apps/media/src/app/components/Controls/FiletypeFilter.tsx @@ -25,6 +25,7 @@ import { AppState } from "../../../../../../shell/store/types"; import { Filetype } from "../../../../../../shell/store/media-revamp"; import { ImageFilterRow } from "./ImageFilterRow"; import { VideoFilterRow } from "./VideoFilterRow"; +import { FilterButton } from "../../../../../../shell/components/Filters"; const pluralize = (filetype: Filetype) => { // audio & code filetypes can't be pluralized @@ -51,50 +52,15 @@ export const FiletypeFilter: FC = () => { handleClose(); }; - const inactiveButton = ( - - ); - - const activeButton = ( - - - - - ); - return ( <> - {activeFilter ? activeButton : inactiveButton} + handleChange(null)} + /> diff --git a/src/apps/media/src/app/components/Controls/Sort.tsx b/src/apps/media/src/app/components/Controls/Sort.tsx index c13f711469..27ac2e5be7 100644 --- a/src/apps/media/src/app/components/Controls/Sort.tsx +++ b/src/apps/media/src/app/components/Controls/Sort.tsx @@ -5,7 +5,14 @@ import { useSelector, useDispatch } from "react-redux"; import { AppState } from "../../../../../../shell/store/types"; import { MediaSortOrder } from "../../../../../../shell/store/media-revamp"; import { useParams } from "../../../../../../shell/hooks/useParams"; +import { FilterButton } from "../../../../../../shell/components/Filters"; +type SortOrder = "AtoZ" | "ZtoA" | "dateadded"; +const SORT_ORDER: Record = { + dateadded: "Date Added", + AtoZ: "Name (A to Z)", + ZtoA: "Name (Z to A)", +} as const; export const Sort: FC = () => { const dispatch = useDispatch(); const [anchorEl, setAnchorEl] = useState(null); @@ -17,32 +24,36 @@ export const Sort: FC = () => { const handleClose = () => { setAnchorEl(null); }; - type SortOrder = "AtoZ" | "ZtoA" | "dateadded"; const handleChange = (sortOrder: SortOrder) => { //dispatch(setSortOrder(sortOrder)); setParams(sortOrder, "sort"); handleClose(); }; + return ( <> - + {}} + /> - handleChange("dateadded")}> - Date Added - - handleChange("AtoZ")}>Name (A to Z) - handleChange("ZtoA")}>Name (Z to A) + {Object.entries(SORT_ORDER).map(([key, value]) => ( + handleChange(key as SortOrder)} + selected={ + key === "dateadded" + ? !params.get("sort") || params.get("sort") === key + : params.get("sort") === key + } + > + {value} + + ))} ); From 369447928aff78516a9a90a1257385871916e529 Mon Sep 17 00:00:00 2001 From: Nar Cuenca Date: Wed, 30 Aug 2023 11:11:56 +0800 Subject: [PATCH 40/59] task: spacing update --- src/apps/media/src/app/components/Controls/Controls.tsx | 2 +- src/apps/media/src/app/components/Controls/ToggleViews.tsx | 4 ++-- src/apps/media/src/app/components/MediaGrid.tsx | 2 +- src/apps/media/src/app/components/MediaList.tsx | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/apps/media/src/app/components/Controls/Controls.tsx b/src/apps/media/src/app/components/Controls/Controls.tsx index 13fc5f3c01..f22565266a 100644 --- a/src/apps/media/src/app/components/Controls/Controls.tsx +++ b/src/apps/media/src/app/components/Controls/Controls.tsx @@ -13,7 +13,7 @@ export const Controls: FC = ({ showFilters = true }) => { { color="primary" > - + - + ); diff --git a/src/apps/media/src/app/components/MediaGrid.tsx b/src/apps/media/src/app/components/MediaGrid.tsx index 52b082fc79..584dbca9a3 100644 --- a/src/apps/media/src/app/components/MediaGrid.tsx +++ b/src/apps/media/src/app/components/MediaGrid.tsx @@ -160,7 +160,7 @@ export const MediaGrid = ({ groups, files, hideHeaders = false }: Props) => { ); return ( - + {({ width, height }) => ( = ({ files, groups }) => { ]; return ( - + {files && ( Date: Wed, 30 Aug 2023 11:22:50 +0800 Subject: [PATCH 41/59] task: select item header spacing --- src/apps/media/src/app/components/Header.tsx | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/apps/media/src/app/components/Header.tsx b/src/apps/media/src/app/components/Header.tsx index fc5e3b6986..dd380fb668 100644 --- a/src/apps/media/src/app/components/Header.tsx +++ b/src/apps/media/src/app/components/Header.tsx @@ -225,7 +225,11 @@ export const Header = ({ }} > {selectedFiles?.length > 0 ? ( - + - + )} - + ) : ( <> From 3df2309f4eb57ea527542226ab3d3c1faa3dd9cd Mon Sep 17 00:00:00 2001 From: Andres Date: Tue, 29 Aug 2023 20:25:15 -0700 Subject: [PATCH 42/59] only wrap below 900 --- package-lock.json | 22 +++++++++---------- package.json | 2 +- .../components/ItemEditHeader/index.tsx | 11 +++++++++- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2987169dec..6672d45fd8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "@tinymce/tinymce-react": "^3.12.6", "@welldone-software/why-did-you-render": "^6.1.1", "@zesty-io/core": "1.9.1", - "@zesty-io/material": "^0.9.0", + "@zesty-io/material": "file:../material/zesty-io-material-0.10.0.tgz", "chart.js": "^3.8.0", "chartjs-adapter-moment": "^1.0.1", "chartjs-plugin-datalabels": "^2.0.0", @@ -3840,14 +3840,15 @@ } }, "node_modules/@zesty-io/material": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@zesty-io/material/-/material-0.9.0.tgz", - "integrity": "sha512-sxvNRTBsxSaXDlEnRBbFVEPCM1pjafZBLlti62gHeFPR6bUDlbKSUtyp53jYCsu9FJGHB6vr7CZugQy3aKGwZA==", + "version": "0.10.0", + "resolved": "file:../material/zesty-io-material-0.10.0.tgz", + "integrity": "sha512-oeYhws4rAd8FrEniPYGu54m/cLeUEiRfJsGUyyWrUZi82DWzwoozj8Edxhk8VNdGiR+H7Y5Mcc8SQPpeP8//1A==", + "license": "MIT", "dependencies": { "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", - "@mui/icons-material": "^5.6.2", - "@mui/material": "^5.6.4", + "@mui/icons-material": "^5.14.3", + "@mui/material": "^5.14.5", "@mui/x-date-pickers": "^5.0.0-alpha.5", "date-fns": "^2.28.0", "react-window": "^1.8.7" @@ -18086,14 +18087,13 @@ } }, "@zesty-io/material": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@zesty-io/material/-/material-0.9.0.tgz", - "integrity": "sha512-sxvNRTBsxSaXDlEnRBbFVEPCM1pjafZBLlti62gHeFPR6bUDlbKSUtyp53jYCsu9FJGHB6vr7CZugQy3aKGwZA==", + "version": "file:../material/zesty-io-material-0.10.0.tgz", + "integrity": "sha512-oeYhws4rAd8FrEniPYGu54m/cLeUEiRfJsGUyyWrUZi82DWzwoozj8Edxhk8VNdGiR+H7Y5Mcc8SQPpeP8//1A==", "requires": { "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", - "@mui/icons-material": "^5.6.2", - "@mui/material": "^5.6.4", + "@mui/icons-material": "^5.14.3", + "@mui/material": "^5.14.5", "@mui/x-date-pickers": "^5.0.0-alpha.5", "date-fns": "^2.28.0", "react-window": "^1.8.7" diff --git a/package.json b/package.json index e63ab52171..1d3b0b59a6 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "@tinymce/tinymce-react": "^3.12.6", "@welldone-software/why-did-you-render": "^6.1.1", "@zesty-io/core": "1.9.1", - "@zesty-io/material": "^0.9.0", + "@zesty-io/material": "file:../material/zesty-io-material-0.10.0.tgz", "chart.js": "^3.8.0", "chartjs-adapter-moment": "^1.0.1", "chartjs-plugin-datalabels": "^2.0.0", diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx index 042e3063ed..aeb1d19ffb 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/index.tsx @@ -132,7 +132,16 @@ export const ItemEditHeader = ({ saving, onSave }: HeaderProps) => { {item?.web?.metaTitle || item?.web?.metaLinkText} - + Date: Wed, 30 Aug 2023 11:35:51 +0800 Subject: [PATCH 43/59] task: replace upload files image --- public/images/uploadFiles.jpg | Bin 24161 -> 0 bytes public/images/uploadFiles.svg | 36 ++++++++++++++++++ .../media/src/app/components/EmptyState.tsx | 2 +- 3 files changed, 37 insertions(+), 1 deletion(-) delete mode 100644 public/images/uploadFiles.jpg create mode 100644 public/images/uploadFiles.svg diff --git a/public/images/uploadFiles.jpg b/public/images/uploadFiles.jpg deleted file mode 100644 index bed3f3ea98f17ae3ca3c60f94847e347c6adfb03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24161 zcmbSz2|SzG`hQgSK}VG?ww9twsM@#aOqG_Ps`g?~OGK=-B!b@QVwYNKm$cR*C`qir zw3bvY8A4Q4)V?){h@Jk^&fK{(zkBcJ-uplKeBSrGdC&Qt=RA4NInVQ)=j6+WFP{M4 z8yVa(0B~^u09>38;L8Z$I)LZsvE#>%@EkvWoR^n}@1&T($?v~EdGVaEpqQLAQ2w&C ztgND{zLw(EYs#{++U7df3~qrsF_zURE;I>3GC z(BXrJ4sptHI(2~iApfBYN+$(=F!w(!arKV#DajxImh>{Y>P?@Z@?Dnz)t~dmnHOF4 zEmAlD=QzL|@IRw-aUVQ%;4tUi6@Cu*0WNOt1BVYB_zL|Eod4j-3rdFsevr8Oqxl`@ zza>d3`&X&FJSFJzg$Cf^=G5Tl<_G8jwqN~0?muTbJ_nc0ioc3_IZ3SS;R(UBObb4$ z@rJV_upxcZ(wuyP?iaxG$YAY7_z#pz3s0HiO)Y(i>-&+_i2DnVlTO$AX4x>z;ye2j z@kQF^vq$p~rud5078NBrWyXLnHK-tDV0%A4WN z?Q0ahU+v>Dbs&60)jNyM%Hfl6~OBHKX>&1`x|D;ZoMJh1N+`&|2u?4 z)1brO@}-U2XC#87LzfjTvJNmY(G-X*oUV0!lRj`3a zi4Vt+&9M77ClD9JrfN6Xt7$Uk(@vuWTF#;YBV**p*G2b=-(J9)fkp3Z(8p%>GIG)} z?TQy(8Q#UINmt`QMm$f9MNCr^VzGq^N zzx;pq@}DZ6K_^G2e~RmOTwvb6*SArbXR-vAiPmSRKqd$tD$&795?$$Sql{WF# z?{=;D0L!OlujP(P-g8XYHwf z0nDFp5ZZm*Coa}_D}A@gO85()g9+RrF1WsX_gA$4{^@{JvnJd4M(6(h?Iz2KIa>7W z$$`;ViRM6{>PlDS`D5@S@%4}>!Rq^XtLL-ImtlH%mF9}UF4Nw#xn;hJ)|o`Bpv%i? z_>4HC6_=VgE1+#m%)FAWEg}qX@+%R?8Qx$oX{5Ber_F-j#=!LZKFUI67A-}|Gb3Xq z{oQu@xlNV{f#!7mE!loDcDMDQ0SkZ3&P2D-Jei3%)QDlaP5LimE?T{AQS+K8pmh=w z%J`={pM?_*^3BpSKR&z&ejKm7;g@i0Ln0zZ19Xh-QTwz(4N(5mKR9qeoPWa3R5*$_ zFde(xU)4)pi#ppL{)!4!ClzN>#=ii(cPLxR+Ocm?aqBP7Sq!v;ucg znu_31Mv7D(p;9w*<*H*HvuD|}9NO#dk)JZLdx!Qp1trqsXI+3CvxRpi%ktFY3^ew7 zfo+V6uHg!HtL=s>dGYcmmuztF^t+}RR=v$iGcf(SQsT~3t6tRfT96%blW@jWL9V?7 zbY=YHgL9v0BBMl$CXb1Nwd#-XqNd_jQ$8?-K-6{?zFyH<(K^x&D*|06+Z7Pn+B(K5 z<#~N|0OMadJ!W}P`v_$M;x-6=)i{GfC1ug^iMkS7x~vUGBkJ`Hh}~XQ9yJ^O>_`FN zfR*e{-K{q(%k&|Bw?~Pyru!?89j)UinWpzwvxE;EcDv9M!6lqr#gvbS=M8nI#?o{h0?GQ z*6*P3D}he3?YpILe`D?$eusCh*-{x{6|gJwiG9#3Q2Zddxbt*ji$^zWen*&=vp799 z`c|VNLa;Qxt{7oPLPc0Tb+qQIcdbC*-VQvv&Fdo?k(?DTL{HmuK^982Wn|R#}J=gGYQL`g#Tv*;W)*R+p=uXAoaLwr^>tiW`tzmX95)$t2ND+@S6BI0d zyjA&(L#rZ!&i3!rNOd)U|xrk#FrBfEEsYx)yFSY>M! zg0ohT>+y9u6Le28&UMJT3RaS(MfI3i3y`N$jBk`F3nlt1=?Ym~?6)2#dk5}lkKcM5 z`q6#la7CZ}TKT@O

NWl+ap+k_s^R#5MoZ@d{vvY<^7pBk1fr$P!M-tEvxeTD;3?S?HJJSzj(@d2dPv?Jj&1Gx4dU1y3G`i9Pb*r%RRhPDf zXh?eZW@4@4_e1vwrWYa8PH8&Xq4#`)cWR@-D&R3STS5^mte2&%>!!_jZla>E*8@w0 z_^r#*GB%3WeS*tC%|zuK6V24Qp}rMw8uV0M3w$DS0!zu}JCA zN$!l!$UrA&(Oj-S^pDSxvlUQQqtJspofc2zO>~0m%2Gu02JpTDqSE4W1I|m!UE^rK z1>N`w3UTG*`u2F{-gq3QBhGrXcvWjf4#tI*N^LX`N1ApDtkLf?5lnO z^k*Q-i*R+eD5(YkVJd!ce=JrOZiW_+cm=ru*@8JuEro{E6fA zlCV2WFFUB`tbjmYSZnAP0N8HqW*7hN0Qab(>IzQG-ZgiS-p_857{J@%dZlH`C~?0s zMGcA;zXJ60;>eE|p=o7AitzcF1tWr(s37ZZu-y;Rvn`EcyoSIF-aJxWF< zZS+Qn`~BtjcH~Tlgb2;|0`-VLqV*RAqZ}vqUW{Yz511k?cj8kh)3qtDy#|~~uihXv zp+bd|kQo0Jw;ZdF7g%r9WBqn>^ei+OO(lAVh~vjT7UnSrj{y(>u1PhG&P1p#Ql|5W z(7i0=TGy?tDUxRf1}lG?o%(qy&d^ww(n669mwO78tsLJZs7#Mku*57Tk16PVfCUdL zd%|>zmu2@H;%4j5G+|S$GXZygXU2bhJ8?F$E4?-cb8!3nn3dQqdP7q}L>@-L*l<}f zPeV-Ek#uIz@C%^YgFWN6GKGi_SGsiVQox_l4?`i?_A+Gwk&T$SU%sOYlZqN$sJ>on z@kt_+gTK0RhRehz<8*lg*v$H1O5V_diZ#QfrBN56E0r$>N$ekvN>^n>EG?R8-)BG0 zTFrQ_esto4>QK2$7_sFd+3CjH;SBW3XJ?{an&v*P=pE$b@d=lRBj9MV zTS3nkQ7Oc#l^m=E{GrBoW9{0QahEp>=@Pr&^iAV z<;V}8pQsOb`A*xQs2)3-8)l!Ms8JRaXFX9Itq4o(q{<4^E!9dtGDfNCHadLPZ`Aq9Qd%>&r}pAq%tx`*(nc zUmHK-^toJH=d#C4r}A$8w&oGoXSTM;=_5JIdc@bP;$8nQ013_y=vzXeyvONbIc5*J zLbs#^8h0b&p1(NpeQt=5YV1*=dy;W(zuu3fxo=8`FTlf{?SRc1#0MW9I1Wq{fe|nt z&6v2brdQ0w*RxhOY=>p8oR<%{26Ew?0LskmF40M0CBz2NG-vFET{eO5by zJb_B4RxT^=-BYLl?T3q|zoxVt?p!15y~pmq6n-PHlNf)5_pc26Z=Pa2H;P2kYXnCe zex`@6?@2oZeF1dWmZh)1C$6P^0pvu=llT)JV);A>U*N#H5n{|->GT7>u3pvv&_%BN0WqpqM($7W6sz5ukq zpocQFCrR^zTev612PQ)13-Jirg$8twzg$p}*7hjvSp4k`F${{8E@|c#gk!qD5ld0t z6E6FVHX~uN2-mUghKv|=l6<@3>ih5pY$BgxXRpPujuLZW)vPesr?Q%MoK*u}XX7K? zHbUUL@*CExsDb&?cjFVNx5cE-8@wdX+8`)6FedwbU(J<~-m^=3A2a4r-$7z!*E`TF zy_@5VndhH}U>k_g=PQ7V--NbD_hqFA3d+$hhg%lE-?pDc54kSwz3lNt%lVFY7*b?* zapKj^r;WAe7ifL?xhvgp*eDCsq8zbbkgSVyt}pKT|7O2)|QRLNI!21}Kz`=2+|wl5yJTU>Nb zl9%XyHeM`v??Rp7-P|jK9}RPGABPq`2&XQHNeW8-vNXTi`oViZXB|2%p0Dlw?%{6} z+;5a$nGA1yQ&Va3YGk5-vX=V=P*!~>%&Bn4kh^I@y+-)PB&A@#pVHQ1;MK_|a|2fH zwN)s$;#8G|Q|`)pLnnqH036HfK;*G;cxd7+TG*K~5PL>1rL^BKK`6QEL#w_0EYVlK zzWy#rizOKqOGD_B3q-|l#I_mq@#A{I8mk?{O8w0JxfqWxfX{lniQLAfEX!Do>V#fs z_;+ude7?)uG0@p$8pur&?LSTn)b=S`L@eLpOesL=NcRW>&mN_htlgnyWk-%xROHAt z96bOy#_8ArcL{ZLQn%Nj6Yi;NMDUcp&x7-{Fsn?AnD46i)k(VNXTGE_^eEeK4fTzE9FOvg(-6Dj!p*X8E1>oe*p*VeyUIgz;@-Dt|9bn0%c)}0PLz+`nFS2pJ;hNb0vo;nyn<|NE7Fplwy3ahAV({m2)D8m zC)Av3w6%InE6oaveL;4Ul{xPpIWgQX`#2G!%_5ETy(aH;i5&m#9tc`jh&M+Kv)>D#>4G{0pfLfQK} zsYpphSL+WeM1_$mr_#oBMO7`uSN9K?f0P; zx5Yh4>^-j6&>aK4$~l94k*)oQG}R6-@{<;Wu=jgEd=6c{9P<1~)oiVka;+`%$jfMq z^tIoCkHpt4rVBFZ>g9PZE=U*0Uyzkf1vPOF*(Tu|BuF$yV+BLWGC=PU&6TN|MqdCU zKBBa8ji(y3PJuGTkLw-OOqXReH#}0CQHRaKPT5b->l}Om5FI+y3Ko$uJB5l(g0s<( zQeSt%8aY1!SR|=%i6+_G3@s*4W2r2mYX@FmpIFaY$-PT*Tyk9p|1hZ)3)!@S*U;JS zNdl9~or@wqziQkT|MA(uha9OEs@TKkX3RU@vRyUM2?Qy>|9As^Q?lDtW09Bht1-qHv&x1wp@Q#!Fb^T2J*p8 z4f>ZVIew=hbWJK<1`}p*25mWeUnoa)02Zgaq4n_4d*Le!SAW6;d~CLztEMb6r)jkt zKv1~U9UXfSTeqvUil>JZFxKfuE};h_Y;7Uz44lEpI&4~goumpa@*2K)2>N%1bNGH( zJsMyM-Fxw?=LD2)a4%`opSAaKsf7mfDRQq1euLU0GPZGU(-Wkb5MXGiX7y%*;nHFd z^7^g3VyJmm>T1FkdFtihjsw3>Z@L*Rde=I)b~mSK8A^kNnUw3gdz5u$rwm-RXMA29 zU&C51M=Uk|z;KtZm&hVIQ1=vV>7sn{sXd8`iEM&Lj)_NTdbfazh?#XOW8L{>B5%SbNi5XTBJ-L`l=f#HpM%=94hMW;TdpN7fT%xX}>a2PTYE*ZCO6B zs7M=dZ<^7ODNwo3=J6Ld3%=+0JdMI$k8-G7&o_L8n4bt7n}6R@mOJD>8c`cs zeHo92l5;{;zvL>sSd22gv|Bnv2rIqfM;z81^RiwXbS?h%r`F9dD^$A=#Px=f6*iq5 zw)+rxm&12@&mMt6KSf%e4!NYlvsrMKKVfspGnY*gH(=SY)ZD_nUUJ>%!rw+gC1YKdD#%|&t zK2y=}evtNl3MF<^tV1H?ss7hu+>S_dqAO`!e(-YQQ5U#yQIf84_Bgywu(`}09QPfojc+D>zr<3G}glY*4S)8q(-1i zPMvJZlIV<>?28^@ie+3s48PC7Vf(4-xu%y;<>RdJ1D!s#BDvS3VRZk|?WbDy#@{zsvFJ-BWb zxlz0U>VP_1y-_cXluW%|v9A2MS3a;!*&6Do)-Evaq}OBedF&8crgZsg2hBThIkExy za_t;d&ZgW&LbBirYfFirVX-AOcjN+xf!|WAW4?-WE0i2{laVHcV)R?q%;lpN16(|=**A%mb9uZ!wt(ioeC2M9Bby$ zzY>};pQxx*pLWgl!8O2HQsNeHxX_)l_IOY4c&85>b_#WAR?)Jsd_r&x2$`{**9t$3 z{J5hVyEW`z-1q5?aDNhwg)ZS$nT#khUY%`s<~Dn~GC3PbtR2b=f(j<&Nl4DU>$7V| zUI$h}O=qr&p|5?T_~1ToI__1CCfXWB|6Xk6{t}LIG2-ml;Ie1~>|`YnQF3MesYFP^ zc>1m1x3dnb8+Kt<`XjHvI@9peROHKZTQK-6WsccAaU1aL@OxKg?c52$f{}SK7@@$r z*h&4xU){{g0!ljBa-nEq;VYGkyp}|g>@07RcE`%&>aX-%3eW$fI$^W3%P%;1M^BEF zT4zj==Ajr<2Rd)f+9ni<+uZf<<$e@PsTFn|&=0HE*-x3}i#n0b*gL(F&i}~#^ac!X zzg7Ek5wC?7=Xe_Zdw}C0p*2^&qJe1`!)a=90Vry@lG-;bW^_McQAy9R`0+P3065x` zO*Y4KeXe=|VrscjJQtNBRc*SCxw(ocm%cNM(V3bSDchygoj%ml9weqh=?~xe0=T(d zxT5HegBI1Z&Asg+8YASs06as^ATk%0xe8{?Q?c zjCo=G>wc|q%F6WHzjGA;IJ!+7?KoB&zxw1N$D1o_x4X9#o)=CFKwMO@;P25 ze!A;&>!<%=|ITifOI4U6I}TzE<9j>Su2Xu!sqL{tO?d>YuQKSkNeF%$sAJ-%KijecH(Z$2 zNEfF1AMa80ERx+7oCjgy^>xgSyb$0AT|G71j~y>h*k&m&2D&GvHlepM z-;mXYlW!zq9`_Sjb}*26pDRDV@O9wbH+EY~oe?ICNnD3cDAO8e)b2We;-`iSm_LMo zBZ~)io=z{T1dWx44;$U}yVrQXS(ceF?lU)0Yw2z zdGJ=FnRGpax!lRnA8o%534V5#E~xh4_`pPkks0REvx(+Tk2h+aFEe}0z5psBF6}Q3 zKi`C(y+Wo)k4ZIMb?#K{w0CVn0)@e96pLhHkxL(&V`j9jWql6MH9dZRH8atF9>f=E z|Jhv_JYx8&MsIy8VSIqJps_r15uzPYOIYj|04zCE2)mYn>B*h!vC`e~--^?0k}NM1s~&V+whMvGcWO`l?xq#M`u}AmFYk80mObxx$l7n{wt|F~6Q8GUitZO@@ zpz{@Ul%~aYzX05pqK18h3pc9o1k!Z^0#SYF-H&H>LsB(*#orQ$1|yKyG-$uCPMLW2 z>v6HJ`3Kr=12BxvgKWb_r<;ycLZJ&GIyy0lr+#>A`09G%udrulo_*!&xAa!6MKAE@ zU<~5pOKJFzDYn@y115RlAEqrc76&imoQlfNtG?#*jqwb++k+gI2(Y5G_*C_|VJ8MD zUX!ORYHd&m7lhP2AvDO6;X(wHY?x2hvM0CkJ;}1!b7P?a#=PP}1CaIdSz#zE|dyRaZvYModYKv?Js_ez?Dc3!)GYRIkj9A*S@4!*T zRFUdtrF4pD_U>RHzp^b|+Qk*k{DkXc=G5iMp=G2Ze9u^V3soYF76PE5^PNYxn}uKX zFGCVXC7G7ILlCw`kP3%5`(7RA)3$H@ywq!StDJfzQ}@m8PC*Idrze&dNSB+$Pm_x` z0>T+OMew)F#^scSd}K)CP=W_mv&Sk9los6Su*fpJd@GKj{ zX2njf2nb8KYrmzKwL!wm(zFF;$7Pe0l!(R{*qf5BpToNXwmkCUocDk#95T~?R?D^r z?=Mm8;m4(=wT;1c((1=e)fpG(1MSW7%VCIB0;6B%J*dLNvV0H< z(-KOQ7)-OPqq3~T9FVpb57(RraEY6zuNcno!dKU4apEUfP|gN8fH$M0rAhCZu4}Qo zI=Xu8=wE?2w}YO^5-0S zp`@hJODlM?bW+IME+-rtT)wDN6Oj4ZjY5Z{rPzlfZCcZ%d6JOUSu`DIwKw)5WxXJi zlC`mh4cj+WZuAe*O7>lE?>6Krz*KiMAxi9(=M|`gHipApeKWGn6d`fZJTCO}RAGz8 zbN}ScM%xDy?OE!#2I|i_epnVNEUH1BLC3+w&k=$vIKgc!s<3L#$r?J%KGQQc^9@F(wQiU>mrE9 z=q3(k^%nLOPW07r;f$XK&c=oYVGLt(4d{8&9=9>Ae!)t;wkX7&?!gbySeWQ}7kqc` z=;b?d=ls!BPY}5x!9?<7&(OZn={}9#r>eW^3ZnV7wO+Vs&$+FsHY!CxKtQAhbL2>F z)JW%`nA93Q8}qT90{V$7rr*&In>&*z*+ERXOB7f1(5)gHzn%ZJ71l43!=5MpW?TMQ zRDl`_jv?)Ot557Bq7;M5NIpr;{W!q}*m0b7X$oKTksF@v zsg0-L50mO6APx)7(@jzcu`JtFmV@VJuMT=CPg1nmbN*68FK>$2I)xTsJ&k@{MsTmm zqTx6!&zS2|C8eE}81^%+Y`U_b1oNygvd5I>+rE)juSugQt=c*iQfK>nH!F29X$Yfb z!}b*qT0LlqHQRr;=c>!H6EA;?kmq2dF}gExb6K_1wmko>GtR7}r>GVxIMeJuu8?nD z)LKFs?z)MGZ^;sJPAh0;LuS5FQJuLMLA8ibW$xWI>i5sFRpZS6jmW-!tF!(t1FoN^ z$^-7e>(9nuIZFmOAR}XLtl%3Z%S*ese)9;u98|CB{#dtYsX`B)#bwLv2-0N0JZv4nPnLCTs z6&&V~7USA)JNrpKrET?Rp%nO2 zJDgKhB62oW?d5_ZtxIX#(af(L`*p=)CpMLZOJ;WkYcU*l?~6UW_7Bv*=7xGGesWk+V2fI>KM~gk@m} ze`8y7Yr5-=gu7%;{ycj-{Kib(vgoVnVT|DOvE0kV4nh;`eK$;*GhH3CGrjPtKcKL- zxYH+&;dJ6nX~MEYV?>KDJMUZdDl z05{aI)+(3zp3_tbta8#g2tLTMTS}#2jyn8WDo3JtL>8zGvSF(f-Ab0Q2-aUK+gy&3%G3ZA2h1{H8LL-QJKhVQwN(#lnrFMuas z0ORBx4FMHSv9*~Pt+L}U~$pwu00>v zqM-txV{BGRtMX}|T^Yt%zI;+IVi(gzGgXdjL6lC25A~E#SEJJazg; ze(^2=+cbQ@{`_=ndNCFhu7vO1X(K&))YHnC`WTu{L4-(- zeqFb0f3x@Im56fo4>H4YO%(ejf-wf(R`YmcM=$mr=l+8aL}f1iRpd1(jGC+h4Aj~?mY=kaPnk6Y%;teL;+NrJ%YPcn|$1~bmWfQ?4_P7?*PvLXR*OW z7n;g=IM%Ys3&6ww3;Tbb56D317rCnIb?6fzi6%U4-46~kXKLdRO&8Apy(G`&O?1TI zq@c%h`1^=rm7h2syy=Df%xrLXFH2{}+PPxZdwBWP{KGSZGP|B~CBei%d6D03G~-CWxjW9r_Qs_1ZnKpR0^RKIltV|R!o@7h~R$Gd%M?DvEgb@ zE;A!3GN|$4q%9FN>e7=_X}2mU%#Ckq%dzV zGv=Eb_B1_V@P_7Tk`}Iz>emD+4$}__!L&OGid9A}sH7+(md(B!%5z60+%Fm&F!X6r z33}2iviXe`dn!`r`HgB92I%wy7c#x6@Ld~2nqjzQyW7msfD3O+J# zD%%LboFiFl8r!ACSyAi_N4DfI{v#jeuE+T58)=3e1XKnPzK&Y0%(+e%JR%sfu(0@T>Bgm?F@p)@r{| z*2CeNuKEMJUI7lRRiqF&GkW@Rguo_IFmi|SE#^53$NR?qob}S=?RDgpz zZ_#TKCXjE2hqLt z{s`|Ix?4_7;@$ZLf?JQzw)Z5(d{F*jA!kA0iu#VB#u;R$zBVIbkqBL+^QfHei(kWA zo;nf|Rwp+~7P`7xms~Tpp7!!ZddPz}F$xEdkef?>oeS8Y8QH;mM~r?f`+0hkX}0^) zYu@FnXCTW;@m7KbcMMvm46k-qh)K8E~Pwe6z3IWGw2R zXiApiY|u-FV#b^eZqXTzVe`BhmCy}yuvAB(EA4uZ2`Ix<^Yn&&mx{aMq(xG|sT_k! zS~!xFCNj4ADc#=qtG!mk@hU0m4mR|Dhmu~WkVAYqdSd!vWCJpnXq`o-vjC{xJ*U$-aNpQHVh9J{#Q|0pXAzZSEd|_K zDxvy0*7TEysv!HuvS=V}VY!_UQ5vFxgsv=*UoN@#Hyom@;V?kaBa07~Q7 z%zJa2RGk#T0mBgAEG?t=Ypt)^31#h^J|ZsI?<|1S-HzyVAGM8 zp;nT61E66|!U~%d# zPEKd;Hja6&iTjMFeKy$g4_n)R{V9jfUEG%wm%1HkMqZj2*m|6B*m2R?*z8trVV|al zVL|5@1QK~R(c>K5D`1f>|B>6`%s27nTza*fq#9MQG~|nDnzW0~YxygFIq9=$qtUC0 z0k7ZWzj-uX0N$naS`Qs6CcB5NLYzbg�V>r>vOB%|;lDh$!-b;Goqp$C%a|epGDw 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 diff --git a/public/images/uploadFiles.svg b/public/images/uploadFiles.svg new file mode 100644 index 0000000000..4d39dc0ab8 --- /dev/null +++ b/public/images/uploadFiles.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/apps/media/src/app/components/EmptyState.tsx b/src/apps/media/src/app/components/EmptyState.tsx index 0facfa01f4..21898a0640 100644 --- a/src/apps/media/src/app/components/EmptyState.tsx +++ b/src/apps/media/src/app/components/EmptyState.tsx @@ -1,5 +1,5 @@ import { Box, Stack, Typography } from "@mui/material"; -import uploadFiles from "../../../../../../public/images/uploadFiles.jpg"; +import uploadFiles from "../../../../../../public/images/uploadFiles.svg"; import { UploadButton } from "./UploadButton"; type Props = { From 07dace748f468b57037bad4270daa29d16cdb01b Mon Sep 17 00:00:00 2001 From: Nar Cuenca Date: Wed, 30 Aug 2023 11:38:44 +0800 Subject: [PATCH 44/59] task: change maxwidth and fontweight --- src/apps/media/src/app/components/UploadModal.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/media/src/app/components/UploadModal.tsx b/src/apps/media/src/app/components/UploadModal.tsx index b88a455cfe..f1b1054e56 100644 --- a/src/apps/media/src/app/components/UploadModal.tsx +++ b/src/apps/media/src/app/components/UploadModal.tsx @@ -53,7 +53,7 @@ export const UploadModal: FC = () => { onClose={handleDismiss} PaperProps={{ style: { - maxWidth: "1120px", + maxWidth: "1280px", }, }} > @@ -81,7 +81,7 @@ export const UploadModal: FC = () => { - + {filesToUpload.length} Files Selected for Upload From 965d6800f492d4e16f1d44c2b7f8d2c08d93832b Mon Sep 17 00:00:00 2001 From: Nar Cuenca Date: Wed, 30 Aug 2023 11:44:59 +0800 Subject: [PATCH 45/59] task: preview model file name font weight --- .../media/src/app/components/FileModal/FileModalContent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/media/src/app/components/FileModal/FileModalContent.tsx b/src/apps/media/src/app/components/FileModal/FileModalContent.tsx index e70b524a0e..c3ed79cbbc 100644 --- a/src/apps/media/src/app/components/FileModal/FileModalContent.tsx +++ b/src/apps/media/src/app/components/FileModal/FileModalContent.tsx @@ -261,7 +261,7 @@ export const FileModalContent: FC = ({ width: "300px", }} > - + {newFilename} From f5ec39058adf55eacf2162a2ce60c383cedf9c67 Mon Sep 17 00:00:00 2001 From: Nar Cuenca Date: Wed, 30 Aug 2023 11:53:46 +0800 Subject: [PATCH 46/59] task: only show term when searching --- src/apps/media/src/app/components/Header.tsx | 2 +- src/apps/media/src/app/views/SearchMedia.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/media/src/app/components/Header.tsx b/src/apps/media/src/app/components/Header.tsx index dd380fb668..be35e975f3 100644 --- a/src/apps/media/src/app/components/Header.tsx +++ b/src/apps/media/src/app/components/Header.tsx @@ -317,7 +317,7 @@ export const Header = ({ justifyContent="space-between" alignItems="center" > - + {showBackButton && (

Date: Wed, 30 Aug 2023 13:03:47 +0800 Subject: [PATCH 47/59] task: breadcrumb alignment --- src/apps/media/src/app/components/Header.tsx | 86 ++++++++++---------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/src/apps/media/src/app/components/Header.tsx b/src/apps/media/src/app/components/Header.tsx index be35e975f3..87e0dcec3c 100644 --- a/src/apps/media/src/app/components/Header.tsx +++ b/src/apps/media/src/app/components/Header.tsx @@ -310,13 +310,13 @@ export const Header = ({ ) : ( - <> - {showBreadcrumbs && id && } - + + + {showBreadcrumbs && id && } {showBackButton && ( - - {id ? ( - - - - ) : null} - - {hideFolderCreate ? null : ( - - )} - {hideUpload ? null : ( - - )} - - + + {id ? ( + + + + ) : null} + + {hideFolderCreate ? null : ( + + )} + {hideUpload ? null : ( + + )} + + )} {openDialog === "new" ? ( From 9079e0a18236ec27efb407e96813fb47494d8bbd Mon Sep 17 00:00:00 2001 From: Nar Cuenca Date: Thu, 31 Aug 2023 10:49:42 +0800 Subject: [PATCH 48/59] task: use filter button component --- .../media/src/app/views/InsightsMedia.tsx | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/apps/media/src/app/views/InsightsMedia.tsx b/src/apps/media/src/app/views/InsightsMedia.tsx index 9c57d181da..4a8ef1bbde 100644 --- a/src/apps/media/src/app/views/InsightsMedia.tsx +++ b/src/apps/media/src/app/views/InsightsMedia.tsx @@ -24,6 +24,7 @@ import { } from "../../../../../shell/services/mediaManager"; import { AppState } from "../../../../../shell/store/types"; import { uniqBy } from "lodash"; +import { FilterButton } from "../../../../../shell/components/Filters"; const iconStyles = { height: "32px", @@ -108,18 +109,12 @@ export const InsightsMedia: FC = () => { - + {}} + onOpenMenu={(event) => setAnchorEl(event.currentTarget)} + /> {dateRanges.map((dateRangeItem) => ( Date: Thu, 31 Aug 2023 10:53:21 +0800 Subject: [PATCH 49/59] task: grammar correction --- src/apps/media/src/app/components/UploadModal.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/apps/media/src/app/components/UploadModal.tsx b/src/apps/media/src/app/components/UploadModal.tsx index f1b1054e56..30b3fbe399 100644 --- a/src/apps/media/src/app/components/UploadModal.tsx +++ b/src/apps/media/src/app/components/UploadModal.tsx @@ -82,7 +82,8 @@ export const UploadModal: FC = () => { - {filesToUpload.length} Files Selected for Upload + {filesToUpload.length} File{filesToUpload.length > 1 && "s"}{" "} + Selected for Upload From 55647e516d9ab2f8dc479d00c33836f913fec340 Mon Sep 17 00:00:00 2001 From: Nar Cuenca Date: Thu, 31 Aug 2023 10:56:59 +0800 Subject: [PATCH 50/59] task: remove checkbox background color --- src/apps/media/src/app/components/Thumbnail/index.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/apps/media/src/app/components/Thumbnail/index.tsx b/src/apps/media/src/app/components/Thumbnail/index.tsx index 3fdb6df103..a9898749e4 100644 --- a/src/apps/media/src/app/components/Thumbnail/index.tsx +++ b/src/apps/media/src/app/components/Thumbnail/index.tsx @@ -163,10 +163,7 @@ export const Thumbnail: FC = ({ checked={checked} icon={} checkedIcon={ - + } // onChange={(evt, checked) => {} onClick={(evt) => { From 45b26aa0f9119faee5d1efcb784361dd42099bf3 Mon Sep 17 00:00:00 2001 From: Nar Cuenca Date: Thu, 31 Aug 2023 11:41:54 +0800 Subject: [PATCH 51/59] task: change check icon --- .../src/app/components/Thumbnail/index.tsx | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/apps/media/src/app/components/Thumbnail/index.tsx b/src/apps/media/src/app/components/Thumbnail/index.tsx index a9898749e4..c39b13f9f7 100644 --- a/src/apps/media/src/app/components/Thumbnail/index.tsx +++ b/src/apps/media/src/app/components/Thumbnail/index.tsx @@ -163,7 +163,24 @@ export const Thumbnail: FC = ({ checked={checked} icon={} checkedIcon={ - + + + + } // onChange={(evt, checked) => {} onClick={(evt) => { From b84d8764d110951e44af7c2b2f4ad25e154c2e7c Mon Sep 17 00:00:00 2001 From: Nar Cuenca Date: Thu, 31 Aug 2023 11:55:05 +0800 Subject: [PATCH 52/59] task: add breadcrumb tooltip --- .../src/app/components/MediaBreadcrumbs.tsx | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/apps/media/src/app/components/MediaBreadcrumbs.tsx b/src/apps/media/src/app/components/MediaBreadcrumbs.tsx index 481cea1cdc..8ec1d98813 100644 --- a/src/apps/media/src/app/components/MediaBreadcrumbs.tsx +++ b/src/apps/media/src/app/components/MediaBreadcrumbs.tsx @@ -1,6 +1,6 @@ import { FC, useMemo } from "react"; import { useSelector } from "react-redux"; -import { Stack, Typography, SvgIcon } from "@mui/material"; +import { Stack, Typography, SvgIcon, Tooltip } from "@mui/material"; import { FolderGlobal } from "@zesty-io/material"; import { FolderRounded } from "@mui/icons-material"; import { useHistory } from "react-router-dom"; @@ -78,15 +78,22 @@ interface CrumbProps { } const Crumb: FC = ({ id, name }) => { return ( - - - - {name} - - + + + + + {name} + + + ); }; From 31ecae9c77711a88ffd2d1ff9fed2fe4a65750c1 Mon Sep 17 00:00:00 2001 From: Nar Cuenca Date: Thu, 31 Aug 2023 12:19:28 +0800 Subject: [PATCH 53/59] task: update app error screen --- src/shell/components/AppError/AppError.js | 24 ----------- src/shell/components/AppError/AppError.tsx | 42 +++++++++++++++++++ .../AppError/{index.js => index.ts} | 0 3 files changed, 42 insertions(+), 24 deletions(-) delete mode 100644 src/shell/components/AppError/AppError.js create mode 100644 src/shell/components/AppError/AppError.tsx rename src/shell/components/AppError/{index.js => index.ts} (100%) diff --git a/src/shell/components/AppError/AppError.js b/src/shell/components/AppError/AppError.js deleted file mode 100644 index 2b08f2d7a1..0000000000 --- a/src/shell/components/AppError/AppError.js +++ /dev/null @@ -1,24 +0,0 @@ -import { connect } from "react-redux"; - -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { faBug } from "@fortawesome/free-solid-svg-icons"; - -import styles from "./AppError.less"; - -export default connect((state) => { - return { user: state.user, platform: state.platform }; -})(function AppError(props) { - return ( -
-

- -  We apologize but something went wrong -

-

- This error has been sent to our development team.
You will need - to reload the application to continue ( - {props.platform.isMac ? "CMD" : "CTRL"} + R). -

-
- ); -}); diff --git a/src/shell/components/AppError/AppError.tsx b/src/shell/components/AppError/AppError.tsx new file mode 100644 index 0000000000..39174686d7 --- /dev/null +++ b/src/shell/components/AppError/AppError.tsx @@ -0,0 +1,42 @@ +import { Stack, Box, Typography, Button, ThemeProvider } from "@mui/material"; +import RefreshRoundedIcon from "@mui/icons-material/RefreshRounded"; +import { theme } from "@zesty-io/material"; + +import notFound from "../../../../public/images/notFoundTransparent.png"; + +export default () => { + return ( + + + + + Oops, something went wrong + + + This error has been sent to our team. Please reload our application to + continue. + + + + + ); +}; diff --git a/src/shell/components/AppError/index.js b/src/shell/components/AppError/index.ts similarity index 100% rename from src/shell/components/AppError/index.js rename to src/shell/components/AppError/index.ts From 99ae31db7e60bcbdb6d3ac4941cf894437b67cb5 Mon Sep 17 00:00:00 2001 From: Nar Cuenca Date: Thu, 31 Aug 2023 14:01:55 +0800 Subject: [PATCH 54/59] task: change to named export --- src/shell/components/AppError/AppError.tsx | 2 +- src/shell/components/AppError/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/shell/components/AppError/AppError.tsx b/src/shell/components/AppError/AppError.tsx index 39174686d7..afc17dc311 100644 --- a/src/shell/components/AppError/AppError.tsx +++ b/src/shell/components/AppError/AppError.tsx @@ -4,7 +4,7 @@ import { theme } from "@zesty-io/material"; import notFound from "../../../../public/images/notFoundTransparent.png"; -export default () => { +export const AppError = () => { return ( Date: Fri, 1 Sep 2023 07:52:00 +0800 Subject: [PATCH 55/59] task: table font update --- src/apps/media/src/app/components/InsightsTable.tsx | 2 +- src/apps/media/src/app/components/MediaList.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/media/src/app/components/InsightsTable.tsx b/src/apps/media/src/app/components/InsightsTable.tsx index e2539a6c8f..ecc5c724a8 100644 --- a/src/apps/media/src/app/components/InsightsTable.tsx +++ b/src/apps/media/src/app/components/InsightsTable.tsx @@ -682,7 +682,7 @@ export const InsightsTable: FC = ({ files, loading }) => { width: 140, renderCell: (params: any) => { return ( - + {numberFormatter.format(params.row.ThroughtputGB)} GB ); diff --git a/src/apps/media/src/app/components/MediaList.tsx b/src/apps/media/src/app/components/MediaList.tsx index c7ffdd275f..54203d4a05 100644 --- a/src/apps/media/src/app/components/MediaList.tsx +++ b/src/apps/media/src/app/components/MediaList.tsx @@ -722,7 +722,7 @@ export const MediaList: FC = ({ files, groups }) => { sortable: false, renderCell: (params: any) => { return ( - + {params.row.created_at && moment(params.row.created_at).format("MMMM Do YYYY")} @@ -732,7 +732,7 @@ export const MediaList: FC = ({ files, groups }) => { { field: "type", headerName: "Type", - width: 88, + width: 104, sortable: false, renderCell: (params: any) => { return ( From 2753fb89350d8466bba408d8c8ec9803c23e4634 Mon Sep 17 00:00:00 2001 From: Andres Date: Tue, 5 Sep 2023 13:41:19 -0700 Subject: [PATCH 56/59] test fixes --- .../e2e/content/analyticsDashboard.spec.js | 9 +- cypress/e2e/content/content.spec.js | 6 +- cypress/e2e/content/multi-lang.spec.js | 5 +- .../e2e/content/singlePageAnalytics.spec.js | 9 +- .../ScheduleFlyout/ScheduleFlyout.js | 218 +++++++++--------- .../ItemEditHeader/LanguageSelector.tsx | 1 + 6 files changed, 133 insertions(+), 115 deletions(-) diff --git a/cypress/e2e/content/analyticsDashboard.spec.js b/cypress/e2e/content/analyticsDashboard.spec.js index 5280b974b4..455015c47e 100644 --- a/cypress/e2e/content/analyticsDashboard.spec.js +++ b/cypress/e2e/content/analyticsDashboard.spec.js @@ -12,19 +12,22 @@ describe("Analytics dashboard", () => { cy.get('input[placeholder="Search Google Analytics Properties"]').type( "zesty.pw" ); - cy.get(".MuiList-root .MuiListItemButton-root").should("have.length", 1); + + cy.get('[role="presentation"]') + .find(".MuiList-root .MuiListItemButton-root") + .should("have.length", 1); cy.get("body").type("{esc}"); }); it("Allows property switching by updating instance setting", () => { cy.getBySelector("analytics-settings").click(); cy.waitOn("*/env/settings/*", () => { - cy.contains("zesty.pw - GA4").click(); + cy.get('[role="presentation"]').contains("zesty.pw").click(); }); }); it("Displays linked google account information", () => { cy.getBySelector("analytics-settings").click(); cy.contains("GA Settings").click(); - cy.contains("Stuart Runyan"); + cy.contains("Andres Galindo"); cy.get("body").type("{esc}"); }); it("Applies selected date filter to url params", () => { diff --git a/cypress/e2e/content/content.spec.js b/cypress/e2e/content/content.spec.js index 2568cb1225..865e58a0e5 100644 --- a/cypress/e2e/content/content.spec.js +++ b/cypress/e2e/content/content.spec.js @@ -97,7 +97,7 @@ describe("Content Specs", () => { it("Date Field", () => { cy.get("#12-63ab04-0nkwcc button").click(); - cy.get("[role=dialog]").find('[aria-label="Mar 5, 2019"]').click(); + cy.get('[aria-label="Choose date, selected date is Mar 5, 2019"]'); cy.get("#12-63ab04-0nkwcc input").should("have.value", "2019-03-05"); }); @@ -105,11 +105,11 @@ describe("Content Specs", () => { it("Date & Time Field", () => { cy.get("#12-f3db44-c8kt0q button").click(); - cy.get("[role=dialog]").find('[aria-label="Mar 5, 2019"]').click(); + // cy.get("[role=dialog]").find('[aria-label="Mar 5, 2019"]').click(); cy.get("#12-f3db44-c8kt0q input").should( "have.value", - "2019-03-05 14:30:00.000000" + "2019-03-21 14:30:00.000000" ); }); diff --git a/cypress/e2e/content/multi-lang.spec.js b/cypress/e2e/content/multi-lang.spec.js index 754eef4b1e..8106a68202 100644 --- a/cypress/e2e/content/multi-lang.spec.js +++ b/cypress/e2e/content/multi-lang.spec.js @@ -7,9 +7,8 @@ describe("multi-lang", () => { } ); - cy.get(".LanguageSelector").click(); - cy.get('[data-value="es"]').click(); + cy.getBySelector("language-selector").click(); - cy.get(".LanguageSelector").contains("es"); + cy.contains("ES (ES)"); }); }); diff --git a/cypress/e2e/content/singlePageAnalytics.spec.js b/cypress/e2e/content/singlePageAnalytics.spec.js index eec6c630b0..5580c43414 100644 --- a/cypress/e2e/content/singlePageAnalytics.spec.js +++ b/cypress/e2e/content/singlePageAnalytics.spec.js @@ -12,13 +12,16 @@ describe("Single Page Analytics", () => { cy.get('input[placeholder="Search Google Analytics Properties"]').type( "zesty.pw" ); - cy.get(".MuiList-root .MuiListItemButton-root").should("have.length", 1); + + cy.get('[role="presentation"]') + .find(".MuiList-root .MuiListItemButton-root") + .should("have.length", 1); cy.get("body").type("{esc}"); }); it("Allows property switching by updating instance setting", () => { cy.getBySelector("analytics-settings").click(); cy.waitOn("*/env/settings/*", () => { - cy.contains("zesty.pw - GA4").click(); + cy.get('[role="presentation"]').contains("zesty.pw").click(); }); }); it("Allows selecting a page to compare by showing recent publishings", () => { @@ -39,7 +42,7 @@ describe("Single Page Analytics", () => { it("Displays linked google account information", () => { cy.getBySelector("analytics-settings").click(); cy.contains("GA Settings").click(); - cy.contains("Stuart Runyan"); + cy.contains("Andres Galindo"); cy.get("body").type("{esc}"); }); it("Applies selected date filter to url params", () => { diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/Header/ItemVersioning/ScheduleFlyout/ScheduleFlyout.js b/src/apps/content-editor/src/app/views/ItemEdit/components/Header/ItemVersioning/ScheduleFlyout/ScheduleFlyout.js index c46c5e453b..e045202254 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/components/Header/ItemVersioning/ScheduleFlyout/ScheduleFlyout.js +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/Header/ItemVersioning/ScheduleFlyout/ScheduleFlyout.js @@ -10,7 +10,13 @@ import { Modal, ModalContent, ModalFooter } from "@zesty-io/core/Modal"; import { Notice } from "@zesty-io/core/Notice"; import { FieldTypeDateTime } from "@zesty-io/material"; -import { FormControl, FormLabel, Autocomplete, TextField } from "@mui/material"; +import { + FormControl, + FormLabel, + Autocomplete, + TextField, + Dialog, +} from "@mui/material"; import { publish, unpublish } from "shell/store/content"; @@ -126,25 +132,26 @@ export default class ScheduleFlyout extends Component { render() { return ( this.props.isOpen && ( - - {this.props.item.scheduling && - this.props.item.scheduling.isScheduled ? ( - <> - - - New versions can not be published while there is a version - scheduled. - -

- Version {this.props.item.scheduling.version} is scheduled to - publish on{" "} - - {/* +

+ + {this.props.item.scheduling && + this.props.item.scheduling.isScheduled ? ( + <> + + + New versions can not be published while there is a version + scheduled. + +

+ Version {this.props.item.scheduling.version} is scheduled to + publish on{" "} + + {/* publishAt from API is in UTC. Order of moment > utc > local > format is important @@ -155,90 +162,95 @@ export default class ScheduleFlyout extends Component { that information is not persisted to the API so we always display it after the fact in the users current timezone */} - {moment - .utc(this.props.item.scheduling.publishAt) - .tz(this.state.userTimezone) - .format(DISPLAY_FORMAT)} - {" "} - in the {this.state.userTimezone} timezone. -

-
- - - - - - ) : ( - <> - -
- - Timezone where this will be published - } - value={this.state.selectedTimezone} - onChange={(_, value) => this.handleChangeTimezone(value)} - options={this.state.timezones} + {moment + .utc(this.props.item.scheduling.publishAt) + .tz(this.state.userTimezone) + .format(DISPLAY_FORMAT)} + {" "} + in the {this.state.userTimezone} timezone. +

+ + + + + + + ) : ( + <> + +
+ + + Timezone where this will be published + + } + value={this.state.selectedTimezone} + onChange={(_, value) => + this.handleChangeTimezone(value) + } + options={this.state.timezones} + /> + +
+
+ - -
-
- -
-
- - - - - - )} - +
+
+ + + + + + )} +
+ ) ); } diff --git a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/LanguageSelector.tsx b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/LanguageSelector.tsx index 2442166bbd..ac0d385105 100644 --- a/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/LanguageSelector.tsx +++ b/src/apps/content-editor/src/app/views/ItemEdit/components/ItemEditHeader/LanguageSelector.tsx @@ -88,6 +88,7 @@ export const LanguageSelector = () => { color="inherit" endIcon={} onClick={(e) => setAnchorEl(e.currentTarget)} + data-cy="language-selector" > {getFlagEmojiFromIETFTag(activeLanguage?.code)} From fb9029ede1ad45e2bb584003aea1cb2f7cb60462 Mon Sep 17 00:00:00 2001 From: Andres Date: Tue, 5 Sep 2023 13:46:20 -0700 Subject: [PATCH 57/59] Bump dependency --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1d3b0b59a6..11b9e1c99a 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "@tinymce/tinymce-react": "^3.12.6", "@welldone-software/why-did-you-render": "^6.1.1", "@zesty-io/core": "1.9.1", - "@zesty-io/material": "file:../material/zesty-io-material-0.10.0.tgz", + "@zesty-io/material": "0.10.0", "chart.js": "^3.8.0", "chartjs-adapter-moment": "^1.0.1", "chartjs-plugin-datalabels": "^2.0.0", From d960311ec9a0e01dcb4c5b48ee38b5cdde9e0230 Mon Sep 17 00:00:00 2001 From: Nar Cuenca Date: Thu, 7 Sep 2023 09:45:01 +0800 Subject: [PATCH 58/59] fix: updated cypress tests --- cypress/e2e/home/mature.spec.js | 2 +- cypress/e2e/schema/models.spec.js | 3 ++- cypress/e2e/search/search-bar.spec.js | 4 +++- cypress/e2e/search/search-page.spec.js | 4 ++-- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/cypress/e2e/home/mature.spec.js b/cypress/e2e/home/mature.spec.js index ec80b65aa6..02423e5c10 100644 --- a/cypress/e2e/home/mature.spec.js +++ b/cypress/e2e/home/mature.spec.js @@ -6,7 +6,7 @@ describe("Mature Home", () => { cy.url().should("include", "/launchpad"); }); it("Displays user first name", () => { - cy.contains("Good Morning, FirstName"); + cy.contains("Good Morning, Developers"); }); it("Displays delta percentage on metric card if instance is over 2 months old", () => { // Test instance is over 2 months old diff --git a/cypress/e2e/schema/models.spec.js b/cypress/e2e/schema/models.spec.js index 6196c84d1d..9176def073 100644 --- a/cypress/e2e/schema/models.spec.js +++ b/cypress/e2e/schema/models.spec.js @@ -1,3 +1,4 @@ +const SEARCH_TERM = `cypress ${Date.now()}`; describe("Schema: Models", () => { before(() => { cy.waitOn("/v1/content/models", () => { @@ -22,7 +23,7 @@ describe("Schema: Models", () => { }); it("Creates model", () => { cy.getBySelector(`create-model-button-all-models`).click(); - cy.contains("Single Page Model").click(); + cy.contains("Multi Page Model").click(); cy.contains("Next").click(); cy.contains("Display Name").next().type("Cypress Test Model"); cy.contains("Reference ID") diff --git a/cypress/e2e/search/search-bar.spec.js b/cypress/e2e/search/search-bar.spec.js index 7b29f6ce1f..01eda25979 100644 --- a/cypress/e2e/search/search-bar.spec.js +++ b/cypress/e2e/search/search-bar.spec.js @@ -60,7 +60,9 @@ describe("Global Search: Search Bar", () => { cy.getBySelector("global-search-recent-keyword") .should("exist") .trigger("mouseover"); - cy.getBySelector("RemoveRecentSearchKeyword").should("exist").click(); + cy.getBySelector("RemoveRecentSearchKeyword") + .should("exist") + .click({ force: true }); // Verify if keyword was removed cy.getBySelector("global-search-recent-keyword").should("not.exist"); diff --git a/cypress/e2e/search/search-page.spec.js b/cypress/e2e/search/search-page.spec.js index 642cb48d6e..85cba8bbf3 100644 --- a/cypress/e2e/search/search-page.spec.js +++ b/cypress/e2e/search/search-page.spec.js @@ -26,7 +26,7 @@ describe("Global Search: Search Page", () => { "https://8-f48cf3a682-7fthvk.api.dev.zesty.io/v1/search/items*", () => { cy.visit( - "/search?q=somerandomstringthatdoesnotexist&user=5-b497838d8d-p2j5tm&datePreset=today" + "/search?q=somerandomstringthatdoesnotexist&user=5-faeda8978e-j5xb6l&datePreset=today" ); } ); @@ -68,7 +68,7 @@ describe("Global Search: Search Page", () => { cy.location("search").should( "equal", - `?q=somerandomstringthatdoesnotexist&sort=created&user=5-84d1e6d4ae-s3m974&datePreset=today` + `?q=somerandomstringthatdoesnotexist&sort=created&user=5-da8c91c9da-l9cqsz&datePreset=today` ); }); From 96a969467421d2638e92db0576971e6c63ee4686 Mon Sep 17 00:00:00 2001 From: Nar Cuenca Date: Thu, 7 Sep 2023 11:16:10 +0800 Subject: [PATCH 59/59] task: update cypress test --- cypress/e2e/search/advanced-search.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress/e2e/search/advanced-search.spec.js b/cypress/e2e/search/advanced-search.spec.js index 14da2b85b8..b347bf1a3e 100644 --- a/cypress/e2e/search/advanced-search.spec.js +++ b/cypress/e2e/search/advanced-search.spec.js @@ -17,7 +17,7 @@ describe("Global Search: Advanced Search", () => { .find("input") .should("exist") .type("cypress"); - cy.getBySelector("AdvancedSearchButton").click(); + cy.getBySelector("AdvancedSearchButton").click({ force: true }); cy.getBySelector("AdvanceSearchModal").should("exist"); cy.get("body").type("{esc}"); });