diff --git a/package-lock.json b/package-lock.json index becda5c2d..22a7bd66d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,14 +39,14 @@ "query-string": "^9.1.0", "react": "^18.1.0", "react-chartjs-2": "^5.2.0", - "react-datepicker": "^8.0.0", + "react-datepicker": "^9.1.0", "react-dom": "^18.1.0", "react-error-boundary": "^6.0.0", "react-gtm-module": "^2.0.11", "react-i18next": "^16.0.0", "react-image-crop": "^11.0.6", "react-range-slider-input": "^3.2.1", - "react-router": "^7.5.2", + "react-router": "^7.12.0", "react-slider": "^2.0.6", "summernote": "^0.9.1", "terser-webpack-plugin": "^5.3.9", @@ -304,7 +304,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", "dev": true, - "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.0", @@ -1873,7 +1872,6 @@ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=6.9.0" } @@ -1950,7 +1948,6 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz", "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==", - "peer": true, "dependencies": { "@dnd-kit/accessibility": "^3.1.1", "@dnd-kit/utilities": "^3.2.2", @@ -2159,32 +2156,32 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.6.9", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz", - "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.2.9" + "@floating-ui/utils": "^0.2.10" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz", - "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", + "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.9" + "@floating-ui/core": "^1.7.3", + "@floating-ui/utils": "^0.2.10" } }, "node_modules/@floating-ui/react": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.3.tgz", - "integrity": "sha512-CLHnes3ixIFFKVQDdICjel8muhFLOBdQH7fgtHNPY8UbCNqbeKZ262G7K66lGQOUQWWnYocf7ZbUsLJgGfsLHg==", + "version": "0.27.16", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.16.tgz", + "integrity": "sha512-9O8N4SeG2z++TSM8QA/KTeKFBVCNEz/AGS7gWPJf6KFRzmRWixFRnCnkPHRDwSVZW6QPDO6uT0P2SpWNKCc9/g==", "license": "MIT", "dependencies": { - "@floating-ui/react-dom": "^2.1.2", - "@floating-ui/utils": "^0.2.9", + "@floating-ui/react-dom": "^2.1.6", + "@floating-ui/utils": "^0.2.10", "tabbable": "^6.0.0" }, "peerDependencies": { @@ -2193,12 +2190,12 @@ } }, "node_modules/@floating-ui/react-dom": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", - "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", + "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", "license": "MIT", "dependencies": { - "@floating-ui/dom": "^1.0.0" + "@floating-ui/dom": "^1.7.4" }, "peerDependencies": { "react": ">=16.8.0", @@ -2206,9 +2203,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", - "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", "license": "MIT" }, "node_modules/@googlemaps/js-api-loader": { @@ -3172,7 +3169,6 @@ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "dev": true, - "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -3331,7 +3327,6 @@ "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -3714,7 +3709,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.8.1.tgz", "integrity": "sha512-hQUVn2Lij2NAxVFEdvIGxT9gP1tq2yM83m+by3whWFsWC+1y8pxxxHUFE1UqDu2VsGi2i6RLcv4QvouM84U+ow==", "dev": true, - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.8.1", "@typescript-eslint/types": "8.8.1", @@ -4728,7 +4722,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -4804,7 +4797,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -5300,23 +5292,24 @@ "dev": true }, "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", "dev": true, + "license": "MIT", "dependencies": { - "bytes": "3.1.2", + "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8", @@ -5332,12 +5325,43 @@ "ms": "2.0.0" } }, + "node_modules/body-parser/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/body-parser/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/bonjour-service": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", @@ -5565,7 +5589,6 @@ "url": "https://github.com/sponsors/ai" } ], - "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001669", "electron-to-chromium": "^1.5.41", @@ -5741,7 +5764,6 @@ "version": "4.4.4", "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.4.tgz", "integrity": "sha512-emICKGBABnxhMjUjlYRR12PmOXhJ2eJjEHL2/dZlWjxRAZT1D8xplLFq5M0tMQK8ja+wBS/tuVEJB5C6r7VxJA==", - "peer": true, "dependencies": { "@kurkle/color": "^0.3.0" }, @@ -7190,7 +7212,6 @@ "integrity": "sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", @@ -7252,7 +7273,6 @@ "integrity": "sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==", "dev": true, "license": "MIT", - "peer": true, "bin": { "eslint-config-prettier": "build/bin/cli.js" }, @@ -7685,40 +7705,40 @@ } }, "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", "dev": true, "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", + "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.13.0", + "qs": "~6.14.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", + "send": "~0.19.0", + "serve-static": "~1.16.2", "setprototypeof": "1.2.0", - "statuses": "2.0.1", + "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -8652,7 +8672,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.27.6" }, @@ -8670,6 +8689,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -10779,7 +10799,6 @@ "url": "https://github.com/sponsors/ai" } ], - "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.0", @@ -10882,7 +10901,6 @@ "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -11007,12 +11025,13 @@ } }, "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -11094,16 +11113,48 @@ } }, "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "dev": true, + "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/raw-body/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -11112,7 +11163,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -11130,25 +11180,30 @@ } }, "node_modules/react-datepicker": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-8.0.0.tgz", - "integrity": "sha512-OmWkFx3BGPXQhBdhFCZyfqR6n2Z5T3WaEXQxz0tdTY6zNntklnIDkaDSYsbKwy7TcyBgeoneG5f4sCwmFPJ4eA==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-9.1.0.tgz", + "integrity": "sha512-lOp+m5bc+ttgtB5MHEjwiVu4nlp4CvJLS/PG1OiOe5pmg9kV73pEqO8H0Geqvg2E8gjqTaL9eRhSe+ZpeKP3nA==", "license": "MIT", "dependencies": { - "@floating-ui/react": "^0.27.3", + "@floating-ui/react": "^0.27.15", "clsx": "^2.1.1", "date-fns": "^4.1.0" }, "peerDependencies": { + "date-fns-tz": "^3.0.0", "react": "^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "date-fns-tz": { + "optional": true + } } }, "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -11239,14 +11294,13 @@ } }, "node_modules/react-router": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.2.tgz", - "integrity": "sha512-9Rw8r199klMnlGZ8VAsV/I8WrIF6IyJ90JQUdboupx1cdkgYqwnrYjH+I/nY/7cA1X5zia4mDJqH36npP7sxGQ==", + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.12.0.tgz", + "integrity": "sha512-kTPDYPFzDVGIIGNLS5VJykK0HfHLY5MF3b+xj0/tTyNYL1gF1qs7u67Z9jEhQk2sQ98SUaHxlG31g1JtF7IfVw==", "license": "MIT", "dependencies": { "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0", - "turbo-stream": "2.4.0" + "set-cookie-parser": "^2.6.0" }, "engines": { "node": ">=20.0.0" @@ -11710,14 +11764,14 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/sass": { "version": "1.78.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.78.0.tgz", "integrity": "sha512-AaIqGSrjo5lA2Yg7RvFZrlXDBCp3nV4XP73GrLGvdRWWwk+8H3l0SDvq/5bA4eF+0RFPLuWUk3E+P1U/YqnpsQ==", "dev": true, - "peer": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -12107,15 +12161,73 @@ "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -12683,9 +12795,9 @@ } }, "node_modules/tabbable": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", + "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", "license": "MIT" }, "node_modules/tapable": { @@ -12750,7 +12862,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -12916,7 +13027,6 @@ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -13102,8 +13212,7 @@ "node_modules/tslib": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "peer": true + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" }, "node_modules/tty-browserify": { "version": "0.0.1", @@ -13111,12 +13220,6 @@ "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", "dev": true }, - "node_modules/turbo-stream": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", - "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==", - "license": "ISC" - }, "node_modules/turndown": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.2.0.tgz", @@ -13235,7 +13338,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "devOptional": true, - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -13453,7 +13555,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -13618,7 +13719,6 @@ "version": "5.94.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", - "peer": true, "dependencies": { "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.12.1", @@ -13665,7 +13765,6 @@ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-6.0.1.tgz", "integrity": "sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==", "dev": true, - "peer": true, "dependencies": { "@discoveryjs/json-ext": "^0.6.1", "@webpack-cli/configtest": "^3.0.1", @@ -13825,7 +13924,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", diff --git a/package.json b/package.json index ef12779bd..7226c5f1d 100644 --- a/package.json +++ b/package.json @@ -113,14 +113,14 @@ "query-string": "^9.1.0", "react": "^18.1.0", "react-chartjs-2": "^5.2.0", - "react-datepicker": "^8.0.0", + "react-datepicker": "^9.1.0", "react-dom": "^18.1.0", "react-error-boundary": "^6.0.0", "react-gtm-module": "^2.0.11", "react-i18next": "^16.0.0", "react-image-crop": "^11.0.6", "react-range-slider-input": "^3.2.1", - "react-router": "^7.5.2", + "react-router": "^7.12.0", "react-slider": "^2.0.6", "summernote": "^0.9.1", "terser-webpack-plugin": "^5.3.9", diff --git a/react/assets/forus-platform/resources/_platform-common/assets/img/features/icons/product_funds.svg b/react/assets/forus-platform/resources/_platform-common/assets/img/features/icons/product_funds.svg new file mode 100644 index 000000000..4cd8891b4 --- /dev/null +++ b/react/assets/forus-platform/resources/_platform-common/assets/img/features/icons/product_funds.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/react/assets/forus-platform/resources/_platform-common/assets/img/landing/splash-top.png b/react/assets/forus-platform/resources/_platform-common/assets/img/landing/splash-top.png deleted file mode 100644 index 687e52fa1..000000000 Binary files a/react/assets/forus-platform/resources/_platform-common/assets/img/landing/splash-top.png and /dev/null differ diff --git a/react/assets/forus-platform/scss/_common/blocks/block-breadcrumbs.scss b/react/assets/forus-platform/scss/_common/blocks/block-breadcrumbs.scss index f1927fc37..fa80d4235 100644 --- a/react/assets/forus-platform/scss/_common/blocks/block-breadcrumbs.scss +++ b/react/assets/forus-platform/scss/_common/blocks/block-breadcrumbs.scss @@ -1,4 +1,4 @@ -&.block-breadcrumbs { +.block.block-breadcrumbs { display: flex; flex-direction: row; margin: 0 0 15px; diff --git a/react/assets/forus-platform/scss/_common/blocks/block-card-toggleable.scss b/react/assets/forus-platform/scss/_common/blocks/block-card-toggleable.scss deleted file mode 100644 index e11da37ca..000000000 --- a/react/assets/forus-platform/scss/_common/blocks/block-card-toggleable.scss +++ /dev/null @@ -1,30 +0,0 @@ -&.block-card-toggleable { - display: flex; - flex-direction: column; - - .block-title { - font: 500 13px var(--base-font); - color: #646f79; - margin: 0 0 5px; - } - - .card-toggleable { - display: flex; - flex-direction: row; - width: 100%; - border-bottom: 1px solid var(--border-color); - padding: 10px 0; - - .card-toggleable-label { - display: flex; - flex-grow: 1; - font: 500 16px/24px var(--base-font); - } - - .button { - margin: -4px 0; - font: 500 12px/20px var(--base-font); - padding: 5px 10px; - } - } -} diff --git a/react/assets/forus-platform/scss/_common/blocks/block-charts.scss b/react/assets/forus-platform/scss/_common/blocks/block-charts.scss new file mode 100644 index 000000000..d8d44e446 --- /dev/null +++ b/react/assets/forus-platform/scss/_common/blocks/block-charts.scss @@ -0,0 +1,169 @@ +.block.block-charts { + .chart-row { + display: flex; + margin: 0 -10px 20px; + + .card { + width: 25%; + margin: 0 10px; + } + + &.chart-row-condensed { + .chart-control { + margin: 0 auto; + } + + .chart-radial { + width: 70px; + margin: auto; + } + + .chart-value { + min-height: auto; + padding: 10px 0; + + .chart-value_label { + color: var(--color-primary); + } + + .chart-value_value { + color: var(--color-primary); + } + } + } + } + + .chart-control { + margin: -10px 0; + display: flex; + flex-direction: column; + text-align: center; + cursor: default; + + .chart-label { + color: #151b26; + font: 500 13px/18px var(--base-font); + margin-bottom: 20px; + } + + .chart-value { + padding: 50px 0 20px; + display: flex; + flex-direction: column; + min-height: 180px; + + .chart-value_value { + color: #007f96; + font: 500 26px/32px var(--base-font); + } + + .chart-value_label { + color: var(--color-primary); + font: 500 11px/18px var(--base-font); + } + + .chart-value_value_b { + color: #282b39; + font: 500 14px/22px var(--base-font); + } + } + + &.chart-control-provider_overview { + padding: 5px 0; + + .chart-label { + margin-bottom: 0; + } + + .chart-value { + padding: 25px 0 25px; + min-height: auto; + } + } + } + + .chart-body { + padding: 20px 0 0; + margin: 0 -20px -10px -10px; + + canvas { + margin: 0 auto; + } + } + + .chart-header { + margin: -25px -25px 0; + border-bottom: 1px solid #d4d9dd; + padding: 15px 25px; + display: flex; + cursor: default; + + .chart-header-range { + flex-basis: 40%; + + .chart-header-item { + color: rgba($color: #151b26, $alpha: 0.5); + font: 500 14px/34px var(--base-font); + display: inline-block; + margin-right: 20px; + transition: 0.4s; + cursor: pointer; + + &:last-child { + margin-right: 0; + } + + &:hover, + &.active { + color: #d91d46; + font-weight: 500; + } + } + } + + .chart-header-title { + flex: 1 0; + text-align: center; + font: 500 13px/34px var(--base-font); + color: #151b26; + flex-basis: 20%; + } + + .chart-header-actions { + flex-basis: 40%; + display: flex; + flex-direction: row; + justify-content: flex-end; + + .flex-row { + flex: 1; + flex-direction: row; + justify-content: flex-end; + flex-wrap: nowrap; + } + + .form-group { + margin: 0 10px 0 0; + } + + .form-control { + max-width: 200px; + } + } + } + + @media screen and (max-width: 1000px) { + .chart-row { + flex-wrap: wrap; + + .card { + width: 100%; + margin: 0 0 20px; + + &:last-child { + margin-bottom: 0; + } + } + } + } +} diff --git a/react/assets/forus-platform/scss/_common/blocks/block-chat.scss b/react/assets/forus-platform/scss/_common/blocks/block-chat.scss index d30601ff5..d8272b89c 100644 --- a/react/assets/forus-platform/scss/_common/blocks/block-chat.scss +++ b/react/assets/forus-platform/scss/_common/blocks/block-chat.scss @@ -1,4 +1,4 @@ -&.block-chat { +.block.block-chat { display: flex; flex-direction: column; cursor: default; diff --git a/react/assets/forus-platform/scss/_common/blocks/block-collapsable.scss b/react/assets/forus-platform/scss/_common/blocks/block-collapsable.scss deleted file mode 100644 index 629ee222e..000000000 --- a/react/assets/forus-platform/scss/_common/blocks/block-collapsable.scss +++ /dev/null @@ -1,36 +0,0 @@ -.block.block-collapsable { - display: flex; - flex-direction: column; - background: #ffffff; - border: 1px solid var(--border-color); - box-shadow: 0 0 5px rgba(25, 39, 52, 0.22); - border-radius: calc(var(--border-radius)); - - .collapsable-header { - display: flex; - align-items: center; - padding: 10px; - cursor: pointer; - - .collapsable-header-icon { - font-size: 24px; - line-height: 30px; - } - - .collapsable-header-title { - flex-grow: 1; - font: 700 14px/30px var(--base-font); - } - } - - .collapsable-body { - padding: 20px; - border-top: 1px solid var(--border-color); - } - - .collapsable-footer { - display: flex; - border-top: 1px solid var(--border-color); - padding: 15px 20px; - } -} diff --git a/react/assets/forus-platform/scss/_common/blocks/block-compact-datalist.scss b/react/assets/forus-platform/scss/_common/blocks/block-compact-datalist.scss new file mode 100644 index 000000000..6d84f8c3f --- /dev/null +++ b/react/assets/forus-platform/scss/_common/blocks/block-compact-datalist.scss @@ -0,0 +1,69 @@ +.block.block-compact-datalist { + display: grid; + + .datalist-row { + border-bottom: 1px dashed #ccc; + display: grid; + grid-template-columns: 200px 1fr; + + .datalist-key { + @extend .text-wrap; + font: 500 14px/20px var(--base-font); + color: #646f79; + padding: 7.5px 15px 7.5px 0; + } + + .datalist-value { + @extend .text-wrap; + font: 500 14px/20px var(--base-font); + color: #646f79; + padding: 7.5px 0; + } + } + + &.compact-datalist-outline { + padding: 5px 20px; + border: 1px dashed #ccc; + border-radius: var(--border-radius); + + .datalist-row { + .datalist-key { + color: var(--color-primary); + } + + .datalist-value { + color: var(--text-color); + } + + &:last-child { + border-bottom: 0; + } + } + } + + &.compact-datalist-vertical { + grid-auto-flow: column; + gap: 20px; + + .datalist-row { + grid-template-columns: 1fr; + border: none; + + .datalist-key, + .datalist-value { + margin: 0; + padding: 0; + } + + .datalist-key { + color: var(--color-primary); + font: 600 11px/20px var(--base-font); + } + + .datalist-value { + color: var(--text-color); + font: 500 13px/20px var(--base-font); + } + } + } +} diff --git a/react/assets/forus-platform/scss/_common/blocks/block-critera-editor.scss b/react/assets/forus-platform/scss/_common/blocks/block-critera-editor.scss index 05b46ffcc..5acccf7f7 100644 --- a/react/assets/forus-platform/scss/_common/blocks/block-critera-editor.scss +++ b/react/assets/forus-platform/scss/_common/blocks/block-critera-editor.scss @@ -1,4 +1,4 @@ -&.block-criteria-editor { +.block.block-criteria-editor { display: flex; flex-direction: column; gap: 20px; diff --git a/react/assets/forus-platform/scss/_common/blocks/block-csv.scss b/react/assets/forus-platform/scss/_common/blocks/block-csv.scss new file mode 100644 index 000000000..94c2a2d35 --- /dev/null +++ b/react/assets/forus-platform/scss/_common/blocks/block-csv.scss @@ -0,0 +1,150 @@ +.block.block-csv { + background: #fff; + margin-bottom: 20px; + + .csv-inner { + padding: 65px 20px 20px; + width: 660px; + margin: 0 auto; + text-align: center; + display: flex; + flex-direction: column; + gap: 20px; + } + + .csv-upload-icon { + width: 54px; + height: 54px; + line-height: 53px; + text-align: center; + margin: 0 auto 12px; + border: 1px solid #d2e6ff; + border-radius: 60px; + background: #fff; + color: #009ef4; + transition: + color 0.4s, + background-color 0.4s; + + .mdi { + color: inherit; + font-size: 26px; + } + } + + .csv-upload-btn { + cursor: pointer; + + .csv-upload-text { + font: 500 16px var(--base-font); + color: #282b39; + transition: + color 0.4s, + background-color 0.4s; + + span { + font: 400 12px var(--base-font); + color: #646f79; + } + } + + &:hover, + &.hover { + .csv-upload-icon { + background: #009ef4; + color: #fff; + } + + .csv-upload-text { + color: #009ef4; + } + } + } + + .csv-upload-btn-groups { + display: flex; + flex-direction: column; + gap: 20px; + } + + .csv-upload-actions { + display: flex; + flex-direction: column; + gap: 20px; + } + + .csv-file-error { + font: 500 13px/20px var(--base-font); + color: var(--color-danger); + margin: 0; + } + + .csv-file-warning { + font: 500 13px/20px var(--base-font); + color: #e7740a; + margin: 0; + } + + .csv-upload-progress { + .csv-upload-icon { + .mdi { + @extend .spin; + } + } + + .csv-progress-state { + font: 400 12px var(--base-font); + margin: 0 0 10px; + color: #646f79; + } + + .csv-progress-bar { + margin: 0 0 20px; + height: 5px; + background: #d2e6ff; + border-radius: var(--border-radius); + width: 100%; + position: relative; + + .csv-progress-bar-stick { + @include fill_parent(); + right: auto; + top: -1px; + bottom: -1px; + background: #009ef4; + border-radius: var(--border-radius); + transition: 1s; + } + } + + .csv-progress-value { + font: 500 16px var(--base-font); + color: #282b39; + margin: 0 0 20px; + } + + &.done { + .csv-upload-icon { + color: #fff; + background: #24b37e; + + .mdi { + animation: none; + } + + &.csv-upload-icon-warning { + background-color: var(--color-primary); + } + } + } + } + + &.on-dragover { + background: lighten($color: #9ca6af, $amount: 32); + border-color: #9ca6af; + } + + &:last-child { + margin-bottom: 0; + } +} diff --git a/react/assets/forus-platform/scss/_common/blocks/block-danger_zone.scss b/react/assets/forus-platform/scss/_common/blocks/block-danger_zone.scss index 397e4ed70..2a83ab654 100644 --- a/react/assets/forus-platform/scss/_common/blocks/block-danger_zone.scss +++ b/react/assets/forus-platform/scss/_common/blocks/block-danger_zone.scss @@ -1,4 +1,4 @@ -&.block-danger_zone { +.block.block-danger_zone { display: flex; flex-direction: column; border: 1px solid var(--color-danger); diff --git a/react/assets/forus-platform/scss/_common/blocks/block-email-confirmed.scss b/react/assets/forus-platform/scss/_common/blocks/block-email-confirmed.scss new file mode 100644 index 000000000..895e60f8f --- /dev/null +++ b/react/assets/forus-platform/scss/_common/blocks/block-email-confirmed.scss @@ -0,0 +1,40 @@ +.block.block-email-confirmed { + flex-direction: column; + justify-content: center; + display: flex; + @include fill_parent(); + background: #fff; + cursor: default; + + .block-email-confirmed-content { + text-align: center; + margin: 0 0 15px; + + .block-email-confirmed-icon { + margin: 0 auto; + + img { + display: block; + width: 220px; + max-width: 100%; + margin: auto; + } + } + + .block-email-confirmed-title { + font: 500 26px/32px var(--base-font); + color: var(--color-primary); + margin: 0 0 10px; + } + + .block-email-confirmed-subtitle { + font: 500 16px/26px var(--base-font); + color: #454545; + margin: 0 0 15px; + } + } + + .block-email-confirmed-footer { + text-align: center; + } +} diff --git a/react/assets/forus-platform/scss/_common/blocks/block-empty.scss b/react/assets/forus-platform/scss/_common/blocks/block-empty.scss new file mode 100644 index 000000000..00e03a808 --- /dev/null +++ b/react/assets/forus-platform/scss/_common/blocks/block-empty.scss @@ -0,0 +1,44 @@ +.block.block-empty { + cursor: default; + + .empty-icon { + display: flex; + flex-direction: row; + justify-content: center; + margin-bottom: 10px; + + .empty-icon-img { + width: 50px; + height: 50px; + display: flex; + border: 1px solid transparent; + border-radius: 50px; + align-items: center; + + &.empty-icon-img-border { + border-color: var(--border-color-light); + } + } + } + + .empty-title { + font: 700 16px/28px var(--base-font); + margin: 0; + } + + .empty-details { + font: 500 14px/24px var(--base-font); + margin: 0; + + &:last-child { + margin-bottom: 0; + } + } + + .empty-actions { + font: 500 14px var(--base-font); + display: flex; + padding: 15px 0 0; + justify-content: center; + } +} diff --git a/react/assets/forus-platform/scss/_common/blocks/block-entity-overview.scss b/react/assets/forus-platform/scss/_common/blocks/block-entity-overview.scss new file mode 100644 index 000000000..179baa391 --- /dev/null +++ b/react/assets/forus-platform/scss/_common/blocks/block-entity-overview.scss @@ -0,0 +1,34 @@ +.block.block-entity-overview { + display: flex; + flex-direction: row; + + .entity-title { + font: 600 14px/20px var(--base-font); + + .entity-title-icon-suffix { + display: inline-block; + color: #a1a1a1; + margin-left: 5px; + } + } + + .entity-photo { + width: 50px; + + .entity-photo-img { + display: block; + max-width: 100%; + border: 1px solid var(--border-color); + border-radius: var(--border-radius); + } + } + + .entity-details { + padding-left: 15px; + display: flex; + flex-direction: column; + min-height: 100%; + justify-content: center; + justify-items: center; + } +} diff --git a/react/assets/forus-platform/scss/_common/blocks/block-external-validators.scss b/react/assets/forus-platform/scss/_common/blocks/block-external-validators.scss deleted file mode 100644 index 0b3902263..000000000 --- a/react/assets/forus-platform/scss/_common/blocks/block-external-validators.scss +++ /dev/null @@ -1,85 +0,0 @@ -&.block-external-validators { - display: flex; - flex-direction: column; - margin-bottom: 20px; - - .validator-item { - background: #ffffff; - box-shadow: 0 0 5px rgba(25, 39, 52, 0.22); - border-radius: calc(var(--border-radius)); - margin-bottom: 20px; - padding: 15px 20px; - display: flex; - flex-direction: row; - - .validator-logo { - .validator-logo-img { - display: block; - width: 60px; - height: 60px; - border-radius: 60px; - border: 1px solid var(--border-color); - } - } - - .validator-details { - @include ellipsis(); - padding: 15px; - flex-grow: 1; - - .validator-title { - font: 600 16px/30px var(--base-font); - margin: 0 0 15px; - display: flex; - cursor: pointer; - - .validator-title-toggle { - font-size: 25px; - margin-right: 5px; - line-height: 30px; - color: #646f79; - transition: color 0.4s; - } - - &:hover { - .validator-title-toggle { - color: var(--color-primary); - } - } - - &:last-child { - margin-bottom: 0; - } - } - - .validator-properties { - display: block; - @include cf(); - - .validator-property { - width: 30%; - float: left; - - .validator-property-label { - margin: 0 0 5px; - font: 600 11px var(--base-font); - color: var(--color-primary); - } - - .validator-property-value { - margin: 0 0; - font: 600 14px var(--base-font); - } - } - } - } - - .validator-actions { - padding: 12px 0 0; - } - - &:last-child { - margin-bottom: 0; - } - } -} diff --git a/react/assets/forus-platform/scss/_common/blocks/block-faq-editor.scss b/react/assets/forus-platform/scss/_common/blocks/block-faq-editor.scss index 1a4cc5447..ce4ccf32a 100644 --- a/react/assets/forus-platform/scss/_common/blocks/block-faq-editor.scss +++ b/react/assets/forus-platform/scss/_common/blocks/block-faq-editor.scss @@ -1,4 +1,4 @@ -&.block-faq-editor { +.block.block-faq-editor { display: flex; flex-direction: column; diff --git a/react/assets/forus-platform/scss/_common/blocks/block-file.scss b/react/assets/forus-platform/scss/_common/blocks/block-file.scss new file mode 100644 index 000000000..da4b6aa88 --- /dev/null +++ b/react/assets/forus-platform/scss/_common/blocks/block-file.scss @@ -0,0 +1,89 @@ +.block.block-file { + width: 100%; + border: 1px dashed #d4d9dd; + border-radius: var(--border-radius); + text-align: left; + cursor: default; + display: flex; + padding: 0; + align-items: center; + + .block-file-details { + display: flex; + flex-direction: row; + gap: 10px; + flex: 1; + flex-grow: 100; + padding: 8px; + position: relative; + } + + .block-file-buttons { + flex: 1; + padding: 12px 15px; + border-left: 1px dashed #d4d9dd; + } + + .file-error { + display: none; + position: absolute; + left: 17px; + top: 12px; + font-size: 26px; + color: #e63b3b; + } + + .file-remove { + position: absolute; + right: 7.5px; + top: 7.5px; + font-size: 22px; + color: #757f88; + cursor: pointer; + + &:hover { + color: #cf274d; + } + } + + .file-icon { + display: flex; + flex: 0 0 30px; + justify-content: center; + + .mdi { + height: 40px; + font-size: 22px; + line-height: 40px; + color: #cfd8dc; + } + } + + .file-details { + display: flex; + flex-direction: column; + flex: 1 1 auto; + justify-content: center; + + .file-name { + font: 600 12px/20px var(--base-font); + color: var(--color-primary); + } + + .file-size { + font: 500 11px/14px var(--base-font); + color: #646f79; + } + } + + &.has-error { + border-color: #e63b3b; + background: none; + + .file-icon { + .mdi { + color: #e63b3b; + } + } + } +} diff --git a/react/assets/forus-platform/scss/_common/blocks/block-form_tooltip.scss b/react/assets/forus-platform/scss/_common/blocks/block-form_tooltip.scss new file mode 100644 index 000000000..b79c2c96e --- /dev/null +++ b/react/assets/forus-platform/scss/_common/blocks/block-form_tooltip.scss @@ -0,0 +1,115 @@ +.block.block-form_tooltip { + position: relative; + display: inline-block; + padding-right: 15px; + vertical-align: text-bottom; + + .tooltip-icon { + width: 24px; + height: 24px; + font-size: 24px; + line-height: 24px; + color: #2987fd; + cursor: pointer; + } + + .tooltip { + position: absolute; + width: 300px; + border: 1px solid var(--border-color); + box-shadow: 0 4px 25px rgba(0, 0, 0, 0.1); + padding: 15px; + background: #fff; + z-index: 5; + border-radius: var(--border-radius); + font: 500 13px/20px var(--base-font); + text-transform: none; + color: #45535e; + display: none; + + ul { + list-style-type: disc; + list-style-position: inside; + + li { + font: 400 13px/20px var(--base-font); + } + + strong { + font-weight: 500; + } + } + + &:not(.tooltip-bottom) { + left: 100%; + top: 12px; + transform: translate(0, -50%); + + &:after, + &:before { + right: 100%; + top: 50%; + border: solid transparent; + content: ' '; + height: 0; + width: 0; + position: absolute; + pointer-events: none; + } + + &:after { + border-color: rgba(255, 255, 255, 0); + border-right-color: #fff; + border-width: 10px; + margin-top: -10px; + } + + &:before { + border-color: rgba(210, 230, 255, 0); + border-right-color: #d2e6ff; + border-width: 11px; + margin-top: -11px; + } + } + + &.tooltip-bottom { + top: 100%; + left: 8px; + margin-top: 10px; + transform: translate(-50%, 0); + + &:before, + &:after { + content: ''; + left: 50%; + transform: translate(-50%); + position: absolute; + top: -10px; + display: inline-block; + width: 0; + height: 0; + border-style: solid; + border-width: 0 10px 10px 10px; + border-color: transparent transparent #ffffff transparent; + } + + &:before { + top: -11.5px; + border-color: transparent transparent var(--border-color) transparent; + } + } + } + + &:hover { + .tooltip { + display: block; + } + } + + @media screen and (max-width: 1000px) { + .tooltip { + left: 0; + width: 250px; + } + } +} diff --git a/react/assets/forus-platform/scss/_common/blocks/block-fund.scss b/react/assets/forus-platform/scss/_common/blocks/block-fund.scss index b5a554b48..131ba9c72 100644 --- a/react/assets/forus-platform/scss/_common/blocks/block-fund.scss +++ b/react/assets/forus-platform/scss/_common/blocks/block-fund.scss @@ -1,4 +1,4 @@ -&.block-fund { +.block.block-fund { display: flex; flex-direction: column; margin: 0 0; diff --git a/react/assets/forus-platform/scss/_common/blocks/block-info.scss b/react/assets/forus-platform/scss/_common/blocks/block-info.scss new file mode 100644 index 000000000..d793d0712 --- /dev/null +++ b/react/assets/forus-platform/scss/_common/blocks/block-info.scss @@ -0,0 +1,56 @@ +.block.block-info { + color: #646f79; + font: 400 11px/16px var(--base-font); + border: 1px dashed #d4d9dd; + padding: 17.5px; + border-radius: var(--border-radius); + + &.block-info-primary { + background-color: #f7f9fc; + } +} + +.block.block-info { + padding-left: 30px; + font: 500 13px/20px var(--base-font); + color: #45535e; + + .block-info-icon { + float: left; + font-size: 20px; + margin-left: -25px; + margin-right: 5px; + color: var(--color-primary); + } + + &.block-info-list { + border-style: solid; + padding: 12px; + color: #151b26; + + .block-info-list-title { + display: flex; + font: 500 12px/19px var(--base-font); + margin: 0 0 5px 0; + } + + .block-info-icon { + margin: 0 5px 0 0; + } + + .block-info-list-items { + margin: 0 0 0 25px; + list-style-type: disc; + list-style-position: inside; + + .block-info-list-item { + font: 500 12px/24px var(--base-font); + + .block-info-list-item-value { + margin: 0 0 0 5px; + color: #646f79; + } + } + } + } +} diff --git a/react/assets/forus-platform/scss/_common/blocks/block-information.scss b/react/assets/forus-platform/scss/_common/blocks/block-information.scss new file mode 100644 index 000000000..26dd87f52 --- /dev/null +++ b/react/assets/forus-platform/scss/_common/blocks/block-information.scss @@ -0,0 +1,37 @@ +.block.block-information { + background: #fff; + padding: 15px 20px; + border-radius: var(--border-radius); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + font: 400 13px/20px var(--base-font); + margin-bottom: 15px; + display: flex; + + .block-information-icon { + margin: 2.5px 10px auto 0; + color: #009ef4; + font-size: 16px; + } + + .block-information-info { + display: flex; + flex-direction: column; + justify-content: center; + font: 500 13px/18px var(--base-font); + color: #646f79; + + a { + color: #009ef4; + font-size: 13px; + font-weight: 500; + } + } + + &.block-information-danger { + background: #fcfaf6; + } + + &.block-information-info { + background: #009ef421; + } +} diff --git a/react/assets/forus-platform/scss/_common/blocks/block-inline-filters.scss b/react/assets/forus-platform/scss/_common/blocks/block-inline-filters.scss new file mode 100644 index 000000000..21b378822 --- /dev/null +++ b/react/assets/forus-platform/scss/_common/blocks/block-inline-filters.scss @@ -0,0 +1,247 @@ +.block.block-inline-filters { + display: flex; + justify-content: flex-end; + + .button { + height: 30px; + line-height: 24px; + padding-top: 2px; + padding-bottom: 2px; + font-size: 12px; + box-shadow: none; + white-space: nowrap; + } + + .select-control { + width: 180px !important; + + .select-control-input { + label.form-control:not([type='radio']):not([type='checkbox']) { + padding-left: 7.5px; + font-size: 12px; + line-height: 28px; + + .select-control-search-placeholder-media { + margin: 4px 0; + } + } + + .select-control-search-container .select-control-search-clear { + line-height: 18px; + } + } + + .select-control-options { + .select-control-option { + padding-left: 10px; + font-size: 12px; + } + } + + &.select-control-lg { + width: 240px !important; + } + } + + .form { + display: flex; + margin-right: 10px; + + .form-group { + margin: 0 10px 0 0; + + &:last-child { + margin-right: 0; + } + } + + .form-control { + height: 30px; + margin: 0; + padding: 0 10px; + line-height: 28px; + + &.select-control { + .select-control-input { + font-size: 12px; + + .select-control-options { + .select-control-option { + --option-height: 35px; + color: #353535; + font: 500 12px/20px var(--base-font); + } + } + } + } + } + + select.form-control { + padding-right: 25px; + } + + &:last-child { + margin-right: 0; + } + } + + .inline-filters-dropdown { + position: relative; + display: inline-block; + + $cardHeaderDropdownRadius: 6px; + + .inline-filters-dropdown-content { + width: 260px; + min-height: 75px; + position: absolute; + top: 100%; + margin-top: 15px; + right: -5px; + background: #fff; + z-index: 2; + box-shadow: 1px 2px 40px rgba(0, 0, 0, 0.12); + padding: 0 20px; + text-align: left; + border-radius: $cardHeaderDropdownRadius; + display: flex; + flex-direction: column; + + .arrow-box { + right: 30px; + left: auto; + transform: none; + } + + .inline-filters-pane { + padding: 0 10px 10px; + } + + .form { + flex-direction: column; + + .form-group { + background: #f6f9fc; + margin: 0 -20px; + padding: 0 15px 0; + + .form-label { + display: block; + color: #282b39; + + &.form-label-toggle { + cursor: pointer; + background: #fff; + margin: 0 -15px 0; + padding: 10px 10px 10px 15px; + transition: color 0.4s; + border-bottom: 1px solid #e7e7e7; + + .form-label-icon-active { + display: none; + } + + .mdi { + float: right; + font-size: 2em; + color: #646f79; + transition: color 0.4s; + } + + &:hover { + color: #009ef4; + + .mdi { + color: inherit; + } + } + + & + * { + display: none; + } + + &.active { + margin: 0 -15px 10px; + border-bottom: 1px solid #fff; + + .form-label-icon { + display: none; + } + + .form-label-icon-active { + display: block; + } + + & + * { + display: block; + } + } + } + } + + .form-control { + margin: 0 0 10px; + height: 30px; + font-size: 12px; + width: 100% !important; + + &.select-control { + .select-control-search { + margin-bottom: 0; + border: 1px solid #d4d9dd; + line-height: 30px; + } + + .select-control-options { + --option-height: 35px; + + .select-control-option { + color: #353535; + font: 500 12px/20px var(--base-font); + } + } + } + } + + &:first-child { + border-top-left-radius: $cardHeaderDropdownRadius; + border-top-right-radius: $cardHeaderDropdownRadius; + + .form-label { + border-top-left-radius: $cardHeaderDropdownRadius; + border-top-right-radius: $cardHeaderDropdownRadius; + } + } + + &:last-child { + .form-label:not(.active) { + border-bottom: none; + border-bottom-left-radius: $cardHeaderDropdownRadius; + border-bottom-right-radius: $cardHeaderDropdownRadius; + } + } + } + + .radio, + .checkbox { + padding-top: 5px; + padding-bottom: 5px; + + .radio-label, + .radio-checkbox { + font: 600 12px/20px var(--base-font); + width: 100%; + } + } + } + + .form-actions { + background: #fff; + padding: 15px; + margin: 0 -20px; + border-bottom-left-radius: $cardHeaderDropdownRadius; + border-bottom-right-radius: $cardHeaderDropdownRadius; + } + } + } +} diff --git a/react/assets/forus-platform/scss/_common/blocks/block-login.scss b/react/assets/forus-platform/scss/_common/blocks/block-login.scss new file mode 100644 index 000000000..e017c8d5c --- /dev/null +++ b/react/assets/forus-platform/scss/_common/blocks/block-login.scss @@ -0,0 +1,260 @@ +.block.block-login { + flex-direction: column; + justify-content: center; + display: flex; + @include fill_parent(); + position: fixed; + padding-bottom: 60px; + cursor: default; + + .block-login-window { + display: block; + margin: 0 auto; + width: 760px; + max-width: 100%; + border: 1px solid #e5e5e5; + border-radius: var(--border-radius); + background-color: #fff; + } + + .block-login-content { + padding: 30px 40px; + border-bottom: 1px solid #e5e5e5; + + .block-login-title { + font: 500 21px/36px var(--base-font); + color: #222530; + } + + .block-login-description { + font: 400 18px/26px var(--base-font); + color: #222530; + margin: 0 0 30px; + } + + .block-login-form { + margin: 0 0 30px; + + .form-label { + color: #7e818c; + margin-left: 10px; + font-weight: 400; + } + + .block-login-control { + display: flex; + flex-direction: row; + + .form-group { + padding-right: 20px; + flex-grow: 1; + margin: 0 0; + display: flex; + flex-direction: column; + } + + .button { + align-self: flex-start; + } + } + + .form-control:not([type='radio']):not([type='checkbox']) { + font: 400 16px/20px var(--base-font); + } + + button { + padding-left: 50px; + padding-right: 50px; + } + + &:last-child { + margin-bottom: 0; + } + } + + .block-login-me_app { + display: flex; + flex-direction: row; + flex-grow: 1; + + .qr_code-container { + padding-right: 30px; + + .auth-title { + font: 500 21px/28px var(--base-font); + color: #333; + margin: 0 0 5px; + } + + .auth-description { + font: 400 15px/22px var(--base-font); + color: #333; + margin: 0 0 5px; + } + } + + .qr_code-block { + display: flex; + flex-direction: column; + + .qr_code-block-placeholder { + width: 200px; + height: 200px; + border: 1px solid #e5e5e5; + display: flex; + flex-direction: column; + justify-content: center; + text-align: center; + + button { + background: rgba(53, 97, 255, 0.15); + border-radius: var(--border-radius); + font: 500 14px/25px var(--base-font); + color: #3561ff; + margin: 0 auto; + padding: 7.5px 15px; + box-shadow: none; + align-self: center; + } + } + + .block.block-qr-code { + width: 200px; + height: 200px; + padding: 0; + + .qr_code { + border-radius: 0; + width: 100%; + height: 100%; + border: none; + padding: 12.5px; + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.12); + } + } + } + } + + .block-login-email_sent { + text-align: center; + + .block-login-email_sent-icon { + margin: 0 auto 10px; + + .block-login-email_sent-icon-img { + display: block; + width: 300px; + max-width: 100%; + margin: auto; + } + } + + .block-login-email_sent-title { + font: 500 28px/38px var(--base-font); + color: var(--color-primary); + margin: 0 0 20px; + } + + .block-login-email_sent-text { + font: 500 18px/27px var(--base-font); + color: #454545; + margin: 0 0 20px; + } + } + + &:last-child { + border-bottom: none; + } + } + + .block-login-footer { + display: flex; + flex-direction: column; + justify-content: center; + padding: 30px; + + .block-login-footer-title { + font: 500 19px/21px var(--base-font); + text-align: center; + margin: 0 auto 20px; + } + + .block-login-footer-button { + width: 320px; + transform: translate(0, 0); + color: #0c66ff; + background: rgba(12, 102, 255, 0.1); + padding: 20px 65px; + text-align: center; + background: #fff; + border: 1px solid #0c66ff; + border-radius: 8px; + font: 600 16px/21px var(--base-font); + transition: + color 0.3s, + border-color 0.3s, + background 0.3s, + box-shadow 0.3s; + margin: auto; + + &:hover { + text-decoration: none; + background: rgba(12, 102, 255, 0.1); + border-color: #0c66ff; + } + } + } + + @media screen and (max-width: 1000px) { + position: initial; + + .block-login-window { + border: none; + background: none; + } + + .block-login-content { + padding: 25px; + + .block-login-title { + font: 500 17px/30px var(--base-font); + } + + .block-login-description { + font: 400 13px/20px var(--base-font); + } + + .block-login-form { + margin: 0; + + .block-login-control { + flex-direction: column; + + .flex { + justify-content: center; + } + + .form-group { + margin-bottom: 20px; + padding-right: 0; + } + } + } + + .block-login-me_app { + display: none; + } + } + } + + .block-login-footer { + .block-login-footer-title { + font: 500 17px/21px var(--base-font); + } + + .block-login-footer-button { + padding: 15px 45px; + width: auto; + } + } +} diff --git a/react/assets/forus-platform/scss/_common/blocks/block-mail_preview.scss b/react/assets/forus-platform/scss/_common/blocks/block-mail_preview.scss index 7c1c681e8..4e0a961eb 100644 --- a/react/assets/forus-platform/scss/_common/blocks/block-mail_preview.scss +++ b/react/assets/forus-platform/scss/_common/blocks/block-mail_preview.scss @@ -1,6 +1,5 @@ -$mailFont: Verdana, Arial, sans-serif; - .block.block-mail_preview { + --mail-font: Verdana, Arial, sans-serif; background: #fff; .mail_preview-wrapper { @@ -31,7 +30,7 @@ $mailFont: Verdana, Arial, sans-serif; .mail_preview-footer { color: #9397a3; - font: 400 12px/20px $mailFont; + font: 400 12px/20px var(--mail-font); padding: 10px 5px 10px; cursor: default; text-align: center; @@ -47,34 +46,34 @@ $mailFont: Verdana, Arial, sans-serif; } h1 { - font: 700 32px/38px $mailFont; + font: 700 32px/38px var(--mail-font); margin: 0 0 25px; } h2 { - font: 700 25px/32px $mailFont; + font: 700 25px/32px var(--mail-font); margin: 0 0 20px; } h3 { - font: 700 21px/28px $mailFont; + font: 700 21px/28px var(--mail-font); margin: 0 0 15px; } h4 { - font: 700 18px/24px $mailFont; + font: 700 18px/24px var(--mail-font); margin: 0 0 10px; } h5 { - font: 700 16px/20px $mailFont; + font: 700 16px/20px var(--mail-font); margin: 0 0 10px; } .mail_btn { display: inline-block; padding: 5px 75px; - font: 600 14px/40px $mailFont; + font: 600 14px/40px var(--mail-font); color: #fff; border-radius: var(--border-radius); text-decoration: none; diff --git a/react/assets/forus-platform/scss/_common/blocks/block-message.scss b/react/assets/forus-platform/scss/_common/blocks/block-message.scss new file mode 100644 index 000000000..c5f3e876f --- /dev/null +++ b/react/assets/forus-platform/scss/_common/blocks/block-message.scss @@ -0,0 +1,14 @@ +.block.block-message { + .message-title { + color: #282b39; + font: 600 16px/24px var(--base-font); + text-align: center; + margin: 0 0 10px; + } + + .message-details { + color: #282b39; + font: 500 13px/20px var(--base-font); + text-align: center; + } +} diff --git a/react/assets/forus-platform/scss/_common/blocks/block-notifications.scss b/react/assets/forus-platform/scss/_common/blocks/block-notifications.scss index ca8af2a33..54ac47bbe 100644 --- a/react/assets/forus-platform/scss/_common/blocks/block-notifications.scss +++ b/react/assets/forus-platform/scss/_common/blocks/block-notifications.scss @@ -1,4 +1,4 @@ -&.block-notifications { +.block.block-notifications { display: flex; flex-direction: column; margin: 0 0 15px; diff --git a/react/assets/forus-platform/scss/_common/blocks/block-page-loading-bar.scss b/react/assets/forus-platform/scss/_common/blocks/block-page-loading-bar.scss new file mode 100644 index 000000000..19e94d31d --- /dev/null +++ b/react/assets/forus-platform/scss/_common/blocks/block-page-loading-bar.scss @@ -0,0 +1,36 @@ +.block.block-page-loading-bar { + position: fixed; + top: 0; + left: 0; + background-color: var(--color-primary); + height: 3px; + width: 0; + transition: width 0.3s linear; + opacity: 1; + z-index: 1000; + + &:after { + content: ''; + position: absolute; + right: 0; + top: 0; + height: 100%; + width: 10px; + background: #fff; + } + + &.start, + &.complete { + opacity: 0; + } + + &.complete { + transition: + opacity 1s linear, + width 0.3s linear; + } + + &.start { + transition: 0s; + } +} diff --git a/react/assets/forus-platform/scss/_common/blocks/block-pdf-preview.scss b/react/assets/forus-platform/scss/_common/blocks/block-pdf-preview.scss new file mode 100644 index 000000000..b7bdbe2bf --- /dev/null +++ b/react/assets/forus-platform/scss/_common/blocks/block-pdf-preview.scss @@ -0,0 +1,10 @@ +.block.block-pdf-preview { + background: #242424; + display: flex; + flex-wrap: wrap; + + canvas { + display: block; + margin: 0 auto; + } +} diff --git a/react/assets/forus-platform/scss/_common/blocks/block-photo-selector.scss b/react/assets/forus-platform/scss/_common/blocks/block-photo-selector.scss new file mode 100644 index 000000000..36317f559 --- /dev/null +++ b/react/assets/forus-platform/scss/_common/blocks/block-photo-selector.scss @@ -0,0 +1,44 @@ +.block.block-photo-selector { + @include cf(); + + .photo-img { + float: left; + border: 1px solid #d4d9dd; + border-radius: 75px; + width: 75px; + height: 75px; + margin-right: 15px; + overflow: hidden; + background: #ffffff 50%; + background-size: cover; + + img { + display: block; + width: 100%; + } + } + + .photo-label { + display: block; + font: 500 16px/26px var(--base-font); + color: #151b26; + margin-bottom: 10px; + } + + @media screen and (max-width: 1000px) { + text-align: center; + + .photo-img { + width: 100px; + height: 100px; + margin: 0 auto 10px; + float: none; + display: block; + } + + .photo-label { + text-align: center; + margin: 0 0 10px; + } + } +} diff --git a/react/assets/forus-platform/scss/_common/blocks/block-preferences.scss b/react/assets/forus-platform/scss/_common/blocks/block-preferences.scss new file mode 100644 index 000000000..ba6a4cde3 --- /dev/null +++ b/react/assets/forus-platform/scss/_common/blocks/block-preferences.scss @@ -0,0 +1,35 @@ +.block.block-preferences { + display: block; + + .preference-option { + border-bottom: 1px solid #d4d9dd; + display: flex; + width: 100%; + padding: 10px 25px; + cursor: pointer; + transition: background 0.4s; + outline-offset: -2px; + + .preference-option-details { + flex-grow: 1; + } + + .preference-option-input { + justify-content: center; + align-items: center; + display: flex; + } + + &:hover { + background-color: #f7fafc; + } + + &:last-child { + border-bottom: none; + } + } + + &:not(:last-child) { + border-bottom: 1px solid #d4d9dd; + } +} diff --git a/react/assets/forus-platform/scss/_common/blocks/block-qr-code.scss b/react/assets/forus-platform/scss/_common/blocks/block-qr-code.scss new file mode 100644 index 000000000..f257093fa --- /dev/null +++ b/react/assets/forus-platform/scss/_common/blocks/block-qr-code.scss @@ -0,0 +1,34 @@ +.block.block-qr-code { + .qr_code { + width: 280px; + height: 280px; + padding: 20px; + background: #fff; + margin: auto; + border-radius: 15px; + -webkit-box-shadow: 0 5px 35px rgba(0, 0, 0, 0.075); + box-shadow: 0 5px 35px rgba(0, 0, 0, 0.075); + border: 2px dashed #d2e6ff; + + img, + canvas { + display: block; + width: 100%; + } + } + + .qr_code-desc { + text-align: center; + padding: 25px 0; + font: 600 15px/28px var(--base-font); + } + + &.block-qr-code-fit { + width: 100%; + + .qr_code { + width: 100%; + height: auto; + } + } +} diff --git a/react/assets/forus-platform/scss/_common/blocks/block-schedule-editor.scss b/react/assets/forus-platform/scss/_common/blocks/block-schedule-editor.scss new file mode 100644 index 000000000..0d8bacb95 --- /dev/null +++ b/react/assets/forus-platform/scss/_common/blocks/block-schedule-editor.scss @@ -0,0 +1,88 @@ +.block.block-schedule-editor { + @include cf(); + + .schedule-editor-heading { + font: 500 16px/20px var(--base-font); + margin: 0 0 15px; + color: #282b39; + + &.schedule-editor-heading-lg { + font: 500 28px/36px var(--base-font); + } + } + + .ui-control { + &.ui-control-checkbox { + .ui-checkbox-label { + font: 500 13px/16px var(--base-font); + } + } + } + + table { + th { + font: 600 13px/16px var(--base-font); + letter-spacing: 0.08px; + text-transform: uppercase; + color: #222530; + text-align: left; + } + + td { + padding-right: 22px; + height: 30px; + font: 400 13px/16px var(--base-font); + color: #222530; + + span { + font: 400 13px/24px var(--base-font); + } + + &.weekend { + color: #f15642; + } + + &.breaks { + padding-left: 40px; + } + } + + th, + td { + &.breaks { + text-align: center; + } + } + + .ui-control { + &.ui-control-text { + width: 80px; + height: 30px; + + input { + height: 30px; + border-radius: 6px; + } + } + + &.breaks { + display: table-cell; + + &.end { + input { + margin-right: 0; + } + } + + input { + width: 80px; + margin-right: 22px; + } + } + + .ui-control-clear { + display: none; + } + } + } +} diff --git a/react/assets/forus-platform/scss/_common/blocks/block-sessions.scss b/react/assets/forus-platform/scss/_common/blocks/block-sessions.scss index dcf3e0559..56fcf74e3 100644 --- a/react/assets/forus-platform/scss/_common/blocks/block-sessions.scss +++ b/react/assets/forus-platform/scss/_common/blocks/block-sessions.scss @@ -1,9 +1,8 @@ -&.block-sessions { +.block.block-sessions { display: flex; flex-direction: column; .session-item { - flex-direction: column; display: flex; padding: 20px; flex-direction: row; diff --git a/react/assets/forus-platform/scss/_common/blocks/block-sign_up.scss b/react/assets/forus-platform/scss/_common/blocks/block-sign_up.scss new file mode 100644 index 000000000..0bfc4f263 --- /dev/null +++ b/react/assets/forus-platform/scss/_common/blocks/block-sign_up.scss @@ -0,0 +1,1041 @@ +.block.block-sign_up { + --paginator-button-active-background: #305dfb; + + .card-header { + padding-top: 0; + margin: 10px 0 15px; + position: relative; + + &:not(.card-header-no-line) { + padding-top: 30px; + + &:before { + content: ''; + position: absolute; + top: 0; + border-top: 1px solid #dbdcdb; + width: calc(100% + 80px); + left: -40px; + } + } + + & > .flex { + align-items: center; + gap: 10px; + } + + .card-title { + display: flex; + align-items: center; + + span { + &:first-child { + font-style: normal; + font-weight: 700; + font-size: 18px; + line-height: 27px; + margin-right: 10px; + } + + &.total-count { + padding: 8px 10px; + height: 32px; + border: 1px solid #315efd; + border-radius: 7px; + color: #315efd; + font-style: normal; + font-weight: 500; + font-size: 16px; + line-height: 16px; + } + } + } + + .block.block-inline-filters .button { + height: 36px; + font-weight: 700; + font-size: 13px; + line-height: 18px; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + padding: 9px 12px; + + &.button-secondary { + border: 1px solid #dbdcdb; + + &:hover { + border-color: var(--color-primary); + } + } + } + } + + .sign_up-pane { + .block-photo-selector { + max-width: 200px; + + .button { + font-size: 12px; + width: 100%; + padding: 10px 5px; + margin: 0 0 15px; + } + } + + .sign_up-pane-header { + font-style: normal; + font-weight: 500; + font-size: 21px; + line-height: 30px; + } + + .sign_up-heading-block { + font: 400 18px/22px var(--base-font); + padding: 30px 40px; + font-style: normal; + color: #222530; + border-bottom: 1px solid #edeef0; + } + + .sign_up-pane-body { + padding: 30px 40px; + + .sign_up-pane-subtitle { + text-align: center; + font: 400 26px/36px var(--base-font); + color: #3561ff; + margin-top: 25px; + } + + & + .sign_up-pane-body { + border-top: 1px solid #edeef0; + } + } + + .sign_up-pane-footer { + .button { + &.button-text { + font-weight: 500; + font-size: 16px; + color: #3561ff; + line-height: 30px; + + .mdi { + color: #3561ff; + width: 36px; + font-size: 34px; + } + } + } + } + + .app-download-notice { + font: 400 13px/27px var(--base-font); + color: #222530; + margin-top: 15px; + + a { + color: blue; + text-decoration: underline; + font-weight: 500; + } + } + + .sign_up-pane-auth { + &.test-qr { + margin-top: 30px; + justify-content: space-around; + } + + .sign_up-pane-auth-content { + .block-app_links { + margin-top: 26px; + } + + .notice-small { + font: 400 13px/27px var(--base-font); + color: #989898; + margin-top: 25px; + } + } + + .sign_up-pane-auth-qr_code { + .qr_code { + width: 228px !important; + height: 228px !important; + } + } + } + + ul { + li { + font: inherit; + background-image: assetUrl('img/icon-list.svg'); + background-repeat: no-repeat; + line-height: 30px; + padding-left: 50px; + font-weight: 400; + } + } + } + + .sign_up-offices { + display: flex; + flex-direction: column; + border-bottom: 1px solid #edeef0; + + .sign_up-office { + display: flex; + flex-direction: row; + padding: 30px 0 30px 30px; + border-bottom: 1px solid var(--border-color); + + .office-media { + padding-left: 10px; + + img { + width: 80px; + display: block; + border-radius: var(--border-radius); + } + + &.office-media-placeholder { + img { + border: 1px solid var(--border-color); + } + } + } + + .office-contacts { + padding-left: 40px; + display: flex; + flex-direction: column; + flex-grow: 1; + + .office-contact { + font: 400 16px/20px var(--base-font); + margin: 0 0 15px; + color: #222530; + + span { + font: inherit; + color: inherit; + } + + .mdi { + color: #9ea7b6; + float: left; + width: 20px; + font-size: 18px; + margin-right: 3px; + margin-left: -25px; + padding-right: 3px; + text-align: right; + } + + &:last-child { + margin-bottom: 0; + } + } + } + + .office-map { + display: flex; + flex-direction: column; + margin: -30px 0; + + .office-map-content { + border: 1px solid var(--border-color); + border-top: none; + border-right: none; + margin: 0 0 10px; + width: 270px; + height: 180px; + position: relative; + + .map { + @include fill_parent(); + + .map-canvas { + @include fill_parent(); + } + } + } + + .office-actions { + display: flex; + flex-direction: row; + margin: 0 0 10px; + + .office-action { + display: flex; + flex-direction: row; + flex-grow: 1; + color: #9ea7b6; + font: 400 13px var(--base-font); + + .mdi { + margin-right: 3px; + float: left; + } + } + } + } + + &:last-child { + border-bottom: none; + } + } + + .block-schedule-editor { + .schedule-editor-heading { + font: 500 21px/27px var(--base-font); + margin: 0 0 15px; + + &.schedule-editor-heading-lg { + font: 500 28px/36px var(--base-font); + } + } + } + + .form { + .form-group { + &.col { + padding-right: 0; + } + } + + .office-block { + margin-left: 0; + margin-right: 0; + padding-left: 20px; + padding-right: 20px; + border-bottom: 1px solid #eff2f4; + } + + .schedule-settings-block, + .schedule-block { + margin-left: 0; + margin-right: 0; + padding-left: 35px; + padding-right: 35px; + border-bottom: 1px solid #eff2f4; + } + + .description { + margin-left: 0; + margin-right: 0; + padding-left: 40px; + padding-right: 40px; + font: 400 16px/24px var(--base-font); + color: #222530; + border-bottom: 1px solid #eff2f4; + } + + .schedule { + th { + font: 600 13px/16px var(--base-font); + letter-spacing: 0.08px; + text-transform: uppercase; + color: #222530; + text-align: left; + } + + td { + padding-right: 22px; + height: 30px; + font: 400 16px/20px var(--base-font); + color: #222530; + + &.weekend { + color: #f15642; + } + + span { + font: 400 16px/20px var(--base-font); + } + } + + th, + td { + &.breaks { + text-align: center; + } + } + + td { + &.breaks { + padding-left: 40px; + } + } + + .ui-control { + &.ui-control-text { + width: 80px; + height: 30px; + + input { + height: 30px; + border-radius: 6px; + } + } + + &.breaks { + display: table-cell; + + &.end { + input { + margin-right: 0; + } + } + + input { + width: 80px; + margin-right: 22px; + } + } + + .ui-control-clear { + display: none; + } + } + } + + .opening { + .ui-control.ui-control-checkbox { + .ui-checkbox-label { + padding-bottom: 0; + font-size: 16px; + } + } + + .sign_up-pane-text { + font-weight: 500; + font-size: 21px; + line-height: 26px; + } + + .form-group { + &.col { + margin-bottom: 5px; + } + } + + .sync { + padding-bottom: 0; + } + } + } + + &:last-child { + border-bottom: none; + } + } + + .sign_up-employees { + display: flex; + flex-direction: column; + margin: 0 0 30px; + + .sign_up-employee { + font: 600 16px/30px var(--base-font); + width: fit-content; + display: flex; + flex-direction: row; + color: #222530; + margin: 0 0 5px; + + .sign_up-employee-actions { + padding-left: 20px; + display: flex; + flex-direction: row; + + .mdi { + margin-left: 5px; + color: #9ea7b6; + font-size: 18px; + float: left; + line-height: 28px; + } + } + } + } + + .finish-screen { + .sign_up-pane-heading { + font: 500 28px/38px var(--base-font) !important; + line-height: 38px; + text-align: center; + color: #3561ff; + margin-top: 0 !important; + } + + .sign_up-pane-text { + padding-left: 50px; + padding-right: 50px; + } + } + + .fund-apply { + .header { + margin-bottom: 30px !important; + } + + .card { + box-shadow: none; + margin-bottom: 15px; + border: 1px solid #e5e6ec; + border-radius: var(--border-radius); + + .card-section { + background: #fff; + padding: 16px 18px; + + .card-block { + &.card-block-fund { + padding-top: 0; + display: flex; + + .fund-img { + margin: 0 10px auto 0; + padding: 0; + width: 50px; + height: 50px; + min-width: 50px; + } + + .fund-details { + padding-right: 140px; + + .fund-title { + display: block; + font: 500 18px/24px var(--base-font); + margin: 0 0 5px; + color: #191a1c; + } + + .fund-organization { + display: block; + font: 400 14px/18px var(--base-font); + color: #222530; + margin: 0 0; + } + } + } + } + + &.card-section-fund { + display: flex; + align-items: center; + + .card-section-actions { + right: 16px; + top: 16px; + + .button { + white-space: nowrap; + font: 700 12px/12px var(--base-font); + padding: 12px; + + &:focus { + outline: none; + box-shadow: none; + } + } + } + + &.applied { + background-color: #f8f4e7; + cursor: default; + pointer-events: none; + + .card-section-actions { + button { + background-color: rgba(255, 255, 255, 0.5); + color: #0f0f0f; + border-color: #c2c2c2; + } + } + + .card-block { + &.card-block-fund { + .fund-organization { + color: #4b4b4b; + } + + .fund-title { + color: #4b4b4b; + } + } + } + } + + &.selected { + background: #f8fbf7; + } + } + + &.card-section-primary { + padding: 0; + } + } + + &:last-child { + margin-bottom: 0; + } + } + } + + .form { + .ui-control .form-control:not([type='radio']):not([type='checkbox']) { + background-color: #eff2f4; + border-color: #eff2f4; + padding: 4px 15px; + + ::placeholder { + color: #9b9b9b; + opacity: 1; + } + } + + .ui-control { + &.ui-control-checkbox { + .ui-checkbox-label { + color: #222530; + font-size: 14px; + line-height: 17px; + font-weight: normal; + } + } + } + + .employee-info { + display: block; + padding-top: 30px; + padding-left: 20px; + font: 500 16px/20px var(--base-font); + + .details { + display: inline-block; + width: 200px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .actions { + display: inline-block; + + .mdi { + padding-right: 20px; + cursor: pointer; + color: #888888; + font-size: 22px; + } + } + } + + .select-control-input { + .select-control-search { + background-color: #eff2f4; + border-color: #eff2f4; + height: 50px; + font: 400 13px/24px var(--base-font) !important; + } + + .select-control-option { + background-color: #eff2f4; + border-color: #eff2f4; + border-bottom: 1px solid #e3e3e3; + } + + .select-control-options { + border: none; + } + } + + .form-label { + color: #7e818c; + font-weight: normal; + font-size: 13px; + line-height: 16px; + padding-left: 10px; + + letter-spacing: 0.08px; + } + + .block.block-photo-selector { + margin-bottom: 0; + + .photo-img { + margin-left: auto; + margin-right: auto; + float: none; + margin-bottom: 15px; + background: #eff2f4; + border: none; + border-radius: 8px; + display: block; + } + + .photo-label { + text-align: center; + font-weight: normal; + font-size: 18px; + line-height: 26px; + color: #222530; + } + + .photo-description { + text-align: center; + color: #9ea7b6; + font: 400 13px/18px var(--base-font); + } + } + + .info-block.info-block-primary { + color: #646f79; + font: 400 11px/16px var(--base-font); + padding: 17.5px; + text-align: center; + background: none; + border: none; + } + } + + .sign_up-organizations { + display: flex; + flex-direction: column; + margin: 0 0 20px; + + .sign_up-organization { + width: 100%; + border: 1px solid #ebedf0; + border-radius: var(--border-radius); + margin: 0 0 20px; + padding: 15px; + display: flex; + flex-direction: row; + transition: 0.4s ease; + + .sign_up-organization-logo { + width: 80px; + height: 80px; + flex-direction: column; + justify-content: center; + + img { + border-radius: 15px; + max-width: 80px; + margin: 0 auto; + padding: 5px; + } + } + + .sign_up-organization-title { + display: flex; + flex-grow: 1; + flex-direction: column; + text-align: center; + justify-content: center; + font: 500 16px/24px var(--base-font); + } + + &:hover { + border-color: #3561ff; + color: #3561ff; + } + + &:last-child { + margin-bottom: 0; + } + } + + &:last-child { + margin-bottom: 0; + } + } + + @media (max-width: 1199px) { + .card-header { + margin: 25px 0 15px; + } + } + + @media (max-width: 991px) { + .card-header { + &:before { + width: calc(100% + 40px); + left: -20px; + } + + & > .flex { + flex-direction: column; + } + } + + .block-title { + margin: 0 0 20px; + font: 500 28px/34px var(--base-font); + } + + .block-pincode { + text-align: left; + width: 100% !important; + + .pincode-number { + align-items: start !important; + height: 31px !important; + width: 38px !important; + margin-right: 3px !important; + font: 400 22px/31px var(--base-font) !important; + } + } + + .fund-apply { + .card { + .card-section.card-section-fund { + .card-block.card-block-fund { + .fund-details { + padding-right: 0; + + .fund-title { + font: 500 15px/24px var(--base-font); + } + } + } + + .card-section-actions { + padding-top: 15px; + } + } + } + } + + .sign_up-employees { + .sign_up-employee { + width: 100%; + + span { + display: flex; + flex-grow: 1; + } + } + } + + .sign_up-header { + margin: 0 -10px 25px; + } + + .sign_up-pane { + .block-title { + margin: 0 0 20px; + } + + .sign_up-pane-header { + font: 500 18px/26px var(--base-font); + } + + .sign_up-offices { + .sign_up-office { + flex-wrap: wrap; + padding: 20px 0 30px; + + .office-media { + order: 1; + padding-right: 15px; + + &.office-media-placeholder { + img { + height: 70px; + width: 70px; + } + } + } + + .office-contacts { + width: 60%; + + .office-contact { + margin: 0 0 5px; + font: 400 15px/20px var(--base-font); + } + } + + .office-map { + order: 2; + margin-top: 20px; + width: 100%; + + .office-map-content { + width: 100%; + } + + .office-actions { + padding-left: 50px; + } + } + } + + &:last-child { + border-bottom: 1px solid #edeef0; + } + } + + .sign_up-pane-body { + padding: 20px; + + .sign_up-pane-subtitle { + font: 400 24px/30px var(--base-font); + } + + .sign_up-office-edit { + border-bottom: none; + + .sign_up-pane-section { + border-bottom: none; + } + + .schedule { + border-collapse: collapse; + + td { + display: inline-block; + padding-right: 10px; + + &.breaks { + padding-left: 0; + } + } + + tr { + margin-bottom: 10px; + + &:first-child { + border-top: none; + } + } + + .schedule-day-name { + width: 100px; + margin-top: 10px; + padding-top: 5px; + } + + .schedule-day-available { + width: 60%; + } + + .time { + input { + font: 400 14px/20px var(--base-font); + } + } + + .ui-control { + &.ui-control-checkbox { + padding-right: 5px; + } + + &.ui-control-text { + width: 62px !important; + height: 30px !important; + + input { + padding: 4px 10px; + } + } + + &.breaks { + input { + margin-right: 10px; + width: 60px; + } + } + } + } + + .office-edit-actions { + .sign_up-pane-col { + border-top: none; + } + + .flex-row { + flex-direction: column; + + .flex-col { + margin-top: 12px; + + &:first-child { + margin-top: 0; + } + } + } + } + } + + .card-section-fund { + padding: 20px 20px 30px; + + .card-block { + &.card-block-fund { + padding-bottom: 20px; + + .fund-title { + font: 500 16px/26px var(--base-font); + margin: 0 0 0; + } + + .fund-organization { + font: 400 13px/16px var(--base-font); + margin: 0 0 10px; + } + } + } + } + } + + .sign_up-pane-footer { + padding: 10px 15px; + + .button { + font: 500 14px/16px var(--base-font) !important; + + .mdi { + width: auto !important; + font-size: 20px !important; + + &.icon-right, + &.icon-left { + margin-right: 0; + } + } + } + } + } + + .sign_up-organizations { + .sign_up-organization { + padding: 10px; + margin-bottom: 15px; + + .sign_up-organization-logo { + width: 36px; + height: 36px; + + img { + height: 100%; + } + } + + .sign_up-organization-title { + font: 500 16px/20px var(--base-font); + padding-left: 15px; + text-align: left; + } + } + } + } +} diff --git a/react/assets/forus-platform/scss/_common/blocks/block-tooltip-details.scss b/react/assets/forus-platform/scss/_common/blocks/block-tooltip-details.scss new file mode 100644 index 000000000..29287c9ef --- /dev/null +++ b/react/assets/forus-platform/scss/_common/blocks/block-tooltip-details.scss @@ -0,0 +1,177 @@ +.block.block-tooltip-details { + position: relative; + + .tooltip-content { + font: 500 13px/20px var(--base-font); + display: none; + padding: 8px 15px; + background: #fff; + box-shadow: 2.5px 5px 10px rgba($color: #000000, $alpha: 0.1); + border: 1px solid var(--border-color); + border-radius: var(--border-radius); + position: absolute; + left: 100%; + margin-left: 10px; + top: 50%; + width: 450px; + max-width: calc(100vw - 100px); + transform: translate(0, -50%); + z-index: 1; + color: #151b26; + cursor: default; + white-space: normal; + + .tooltip-header { + font: 600 15px/28px var(--base-font); + color: inherit; + margin: 0 0 10px; + } + + .tooltip-heading { + font: 700 1.1em/1.5em var(--base-font); + color: inherit; + margin: 0 0; + } + + .tooltip-text { + font: inherit; + color: inherit; + margin: 0 0 10px; + } + + .tooltip-list { + .tooltip-list-item { + color: #151b26; + font: 500 13px/20px var(--base-font); + margin: 0 0 5px; + + .mdi { + line-height: 20px; + color: var(--color-primary); + float: left; + margin: 0 5px 0 0; + } + + &:last-child { + margin-bottom: 0; + } + } + } + + .tooltip-text, + .tooltip-list, + .tooltip-header { + &:last-child { + margin-bottom: 0; + } + } + + &:after, + &:before { + content: ''; + display: block; + width: 0; + height: 0; + border-style: solid; + border-width: 7.5px 10px 7.5px 0; + border-color: transparent #ffffff transparent transparent; + position: absolute; + right: 100%; + top: 50%; + transform: translate(0, -50%); + } + + &:before { + transform: translate(0, -50%); + border-width: 8.5px 12px 8.5px 0; + border-color: transparent var(--border-color) transparent transparent; + } + + &.tooltip-content-left { + left: auto; + right: 100%; + margin-left: 0; + margin-right: 10px; + + &:after, + &:before { + right: auto; + left: 100%; + transform: rotate(180deg) translate(0, 50%); + } + } + + &.tooltip-content-bottom { + top: 100%; + left: 50%; + transform: translate(-50%); + margin-left: 0; + margin-right: 0; + margin-top: 7.5px; + + &:before, + &::after { + display: none; + } + + .triangle { + position: absolute; + top: -10px; + left: 0; + width: 100%; + bottom: 100%; + margin: auto; + + &:before, + &:after { + content: ''; + position: absolute; + top: 0; + left: 50%; + bottom: 100%; + width: 0; + height: 0; + border-style: solid; + border-width: 0 10px 10px 10px; + border-color: transparent transparent var(--border-color) transparent; + transform: rotate(0deg) translate(-50%); + z-index: 1; + } + + &:before { + z-index: 2; + margin-top: 2px; + border-color: transparent transparent #ffffff transparent; + } + } + } + + &.tooltip-content-fit { + width: fit-content; + } + + &.tooltip-content-compact { + padding: 10px 15px; + } + + &.tooltip-content-ghost { + pointer-events: none; + } + } + + &.block-tooltip-details-inline { + font-size: 20px; + color: var(--color-primary); + height: inherit; + line-height: inherit; + display: inline-flex; + margin-left: 5px; + } + + &.block-tooltip-hover:hover, + &.active { + .tooltip-content { + display: block; + } + } +} diff --git a/react/assets/forus-platform/scss/_common/blocks/block-user_emails.scss b/react/assets/forus-platform/scss/_common/blocks/block-user_emails.scss new file mode 100644 index 000000000..7df175548 --- /dev/null +++ b/react/assets/forus-platform/scss/_common/blocks/block-user_emails.scss @@ -0,0 +1,81 @@ +.block.block-user_emails { + display: flex; + flex-direction: column; + + .user_email-item { + display: flex; + flex-direction: row; + border-bottom: 1px solid #d4d9dd; + + .user_email-icon { + padding: 20px 0 20px 20px; + + .mdi { + font-size: 26px; + margin-left: 5px; + margin-right: -5px; + color: #8ca3a6; + } + } + + .user_email-details { + padding: 20px; + flex-grow: 1; + + .user_email-address, + .user_email-options { + &:last-child { + margin-bottom: 0; + } + } + + .user_email-address { + font: 500 14px/24px var(--base-font); + color: var(--text-color); + margin: 0 0 5px; + } + + .user_email-options { + margin: 0 0 10px; + + .user_email-option { + font: 500 13px/20px var(--base-font); + color: var(--text-color); + margin: 0 0 5px; + padding-left: 15px; + position: relative; + + &:before { + content: ''; + position: absolute; + display: block; + width: 4px; + height: 4px; + border-radius: var(--border-radius); + background: var(--color-primary-light); + left: 0; + top: 50%; + transform: translate(0, -50%); + } + + &:last-child { + margin-bottom: 0; + } + } + } + } + + .user_email-actions { + padding: 20px; + + .button, + .label { + margin-left: 10px; + } + } + + &:last-child { + border-bottom: none; + } + } +} diff --git a/react/assets/forus-platform/scss/_common/card-blocks/card-block-bank.scss b/react/assets/forus-platform/scss/_common/card-blocks/card-block-bank.scss new file mode 100644 index 000000000..d6dfd17ff --- /dev/null +++ b/react/assets/forus-platform/scss/_common/card-blocks/card-block-bank.scss @@ -0,0 +1,72 @@ +.card-block.card-block-bank { + display: flex; + margin: -20px; + border-radius: inherit; + + .card-block-bank-media { + display: flex; + width: 140px; + border-top-left-radius: inherit; + border-bottom-left-radius: inherit; + overflow: hidden; + border-right: 1px solid var(--border-color); + + img { + width: 140px; + height: 140px; + overflow: hidden; + background-color: #f9fafa; + } + } + + .card-block-bank-details { + display: flex; + flex-direction: column; + justify-content: flex-start; + flex-grow: 1; + padding: 20px 25px; + + .card-block-bank-name { + font: 700 18px/30px var(--base-font); + margin: 0 0 15px; + } + + .card-block-bank-properties { + display: flex; + flex-direction: row; + + .card-block-bank-property { + display: flex; + flex-direction: column; + padding-right: 30px; + + .card-block-bank-property-label { + font: 600 13px/22px var(--base-font); + color: #134478; + } + + .card-block-bank-property-value { + font: 600 16px/26px var(--base-font); + + &.card-block-bank-property-value-link { + transition: 0.4s; + cursor: pointer; + + .mdi { + transition: 0.4s; + font-size: inherit; + color: var(--color-primary); + margin-left: 2.5px; + line-height: inherit; + font-size: 18px; + } + + &:hover { + color: var(--color-primary); + } + } + } + } + } + } +} diff --git a/react/assets/forus-platform/scss/_common/card-blocks/card-block-financial.scss b/react/assets/forus-platform/scss/_common/card-blocks/card-block-financial.scss new file mode 100644 index 000000000..3b182fcbd --- /dev/null +++ b/react/assets/forus-platform/scss/_common/card-blocks/card-block-financial.scss @@ -0,0 +1,27 @@ +.card-block.card-block-financial { + .table { + .table-separator { + border-bottom: 2px solid #d4d9dd; + } + + .table-highlight td { + background: #f6f6f6; + font-weight: 600; + } + + .table-highlight-grey td { + background: #f6f6f6ad; + } + + tr { + &.table-totals { + white-space: nowrap; + border-top: 3px solid #134478; + + td { + font-weight: 600; + } + } + } + } +} diff --git a/react/assets/forus-platform/scss/_common/card-blocks/card-block-fund.scss b/react/assets/forus-platform/scss/_common/card-blocks/card-block-fund.scss new file mode 100644 index 000000000..3fab44ae4 --- /dev/null +++ b/react/assets/forus-platform/scss/_common/card-blocks/card-block-fund.scss @@ -0,0 +1,61 @@ +.card-block.card-block-fund { + padding-top: 15px; + + .fund-img { + float: left; + display: block; + width: 70px; + height: 70px; + border: 1px solid #e7e7e7; + border-radius: 70px; + overflow: hidden; + margin-top: -15px; + margin-right: 15px; + + img { + width: 100%; + display: block; + } + } + + .fund-closed { + position: absolute; + top: 20px; + right: 20px; + font: 500 14px/18px var(--base-font); + } + + .fund-title { + cursor: default; + display: inline-block; + font: 500 16px/20px var(--base-font); + color: #151b26; + transition: 0.4s; + clear: both; + position: relative; + border-bottom: 1px solid transparent; + } + + a.fund-title { + cursor: pointer; + + &:hover { + color: #9ca6af; + border-bottom-color: #9ca6af; + text-decoration: none; + } + } + + .fund-organization { + display: inline-block; + font: 500 14px/20px var(--base-font); + color: #009ef4; + margin-bottom: 10px; + clear: both; + text-decoration: none; + } + + &.card-block-fund-margin-bottom { + margin-bottom: 20px; + } +} diff --git a/react/assets/forus-platform/scss/_common/card-blocks/card-block-keyvalue.scss b/react/assets/forus-platform/scss/_common/card-blocks/card-block-keyvalue.scss new file mode 100644 index 000000000..ebbbe0fcd --- /dev/null +++ b/react/assets/forus-platform/scss/_common/card-blocks/card-block-keyvalue.scss @@ -0,0 +1,300 @@ +.card-block.card-block-keyvalue { + margin-bottom: 10px; + @include cf(); + + .keyvalue-item { + padding-bottom: 10px; + @include cf(); + + .keyvalue-key { + float: left; + color: var(--color-primary); + font: 500 13px/20px var(--base-font); + width: 180px; + padding-right: 20px; + } + + .keyvalue-value { + float: left; + color: #282b39; + font: 500 13px/20px var(--base-font); + width: calc(100% - 210px); + display: flex; + align-items: center; + gap: 10px; + + .block-form_tooltip { + vertical-align: middle; + margin-top: -2px; + + &:not(:first-child) { + margin-left: 5px; + } + + &:not(:last-child) { + margin-right: 5px; + } + } + + .icon { + margin-left: 7px; + } + + .form-numeric { + margin-top: -5px; + } + + .keyvalue-value-info-block-toggle { + color: #134478; + font: 600 12px / 18px var(--base-font); + display: flex; + align-items: center; + cursor: pointer; + + .mdi { + color: #646f79; + font-size: 20px; + } + + &.keyvalue-value-info-block-toggle-secondary { + .mdi { + color: #134478; + font-size: 16px; + } + + &.active { + .mdi { + color: #009ef4; + } + } + } + + &:hover { + color: #426993; + } + } + + .keyvalue-value-history { + display: flex; + flex-direction: column; + width: 100%; + gap: 5px; + + .keyvalue-value-history-header { + display: flex; + flex-direction: row; + gap: 8px; + + .keyvalue-value-history-toggle { + font: 600 12px/20px var(--base-font); + display: flex; + flex-direction: row; + gap: 0; + color: #646f79; + cursor: pointer; + + .mdi { + height: 20px; + line-height: 20px; + font-size: 20px; + } + + &:hover { + color: var(--color-primary); + } + } + } + + .keyvalue-value-history-body { + background: #f7f9fc; + border-radius: var(--border-radius); + border: 1px solid var(--border-color); + padding: 5px 15px; + max-height: 350px; + overflow: auto; + @include webkit_scrollbar(); + + .keyvalue-value-history-body-item { + display: flex; + flex-direction: row; + gap: 5px; + padding: 6px 0; + font: 500 12px/20px var(--base-font); + border-bottom: 1px solid var(--border-color); + word-break: break-word; + color: #646f79; + + strong { + color: #000; + display: contents; + } + + &:last-child { + border-bottom: none; + } + } + } + } + + &.keyvalue-value-gap-sm { + gap: 5px; + } + } + + .keyvalue-link { + color: #009ef4; + font: 500 13px/20px var(--base-font); + margin-left: 5px; + display: inline-block; + + .mdi { + font-size: 1.5em; + } + } + + &:last-child, + &:last-of-type { + padding-bottom: 0; + } + + &.keyvalue-item-disabled { + pointer-events: none; + cursor: default; + } + } + + .keyvalue-item-info-block { + background: #fbfbfb; + padding: 15px 20px; + margin: 0 -20px 10px -20px; + border-top: 1px solid #d4d9dd; + border-bottom: 1px solid #d4d9dd; + + ul { + li { + display: flex; + gap: 10px; + font: 500 12px / 18px var(--base-font); + color: #151b26; + margin-bottom: 10px; + + .mdi { + font-size: 14px; + color: #134478; + } + + &:last-child { + margin-bottom: 0; + } + } + } + } + + &:not(.card-block-keyvalue-horizontal) { + .keyvalue-item { + width: 100%; + } + } + + &.card-block-keyvalue-horizontal { + .keyvalue-item { + padding-bottom: 0; + position: relative; + margin: -5px 0 -5px; + + .keyvalue-key { + font: 500 13px var(--base-font); + color: #646f79; + width: 100%; + margin-bottom: 10px; + display: block; + } + + .keyvalue-value { + font: 500 16px var(--base-font); + color: #282b39; + width: 100%; + display: block; + } + + &.keyvalue-item-narrow { + &:not(:first-child) { + padding-left: 10px; + padding-right: 10px; + } + } + + &:not(:first-child) { + padding-left: 30px; + padding-right: 30px; + } + + &:not(:last-child):not(:last-of-type) { + .keyvalue-key { + &:after { + content: ''; + display: block; + top: 10px; + bottom: 10px; + width: 1px; + right: 1px; + background: #d4d9dd; + position: absolute; + } + } + } + } + } + + &.card-block-keyvalue-bordered { + border-bottom: 1px solid #d4d9dd; + padding-bottom: 14px; + margin-bottom: 14px; + } + + &.card-block-keyvalue-md { + .keyvalue-item { + .keyvalue-key { + width: 240px; + } + + .keyvalue-value { + width: calc(100% - 240px); + } + } + } + + &.card-block-keyvalue-lg { + .keyvalue-item { + .keyvalue-key { + width: 280px; + } + + .keyvalue-value { + width: calc(100% - 280px); + } + } + } + + &.card-block-keyvalue-text-sm { + .keyvalue-item { + padding: 0 0 4px; + + .keyvalue-key { + font: 600 12px/20px var(--base-font); + } + + .keyvalue-value { + font: 500 12px/20px var(--base-font); + } + + &:last-child { + padding: 0 0 0; + } + } + } + + &:last-child { + margin-bottom: 0; + } +} diff --git a/react/assets/forus-platform/scss/_common/card-blocks/card-block-listing.scss b/react/assets/forus-platform/scss/_common/card-blocks/card-block-listing.scss new file mode 100644 index 000000000..a495d1dfe --- /dev/null +++ b/react/assets/forus-platform/scss/_common/card-blocks/card-block-listing.scss @@ -0,0 +1,67 @@ +.card-block.card-block-listing { + font: 500 13px/20px var(--base-font); + color: #282b39; + + span { + font: inherit; + color: inherit; + } + + .card-block-listing-label { + font: 600 11px/18px var(--base-font); + color: var(--color-primary); + margin: 0 0 2px; + } + + .card-block-listing-value { + font: inherit; + + & > .mdi { + font-size: 18px; + line-height: 18px; + vertical-align: bottom; + color: var(--color-primary); + margin: 0 5px; + transition: 0.32s; + + &:hover { + color: var(--color-primary-light); + } + } + } + + .card-block-listing-row { + margin: 0 0 15px; + + &:last-child { + margin-bottom: 0; + } + } + + &.card-block-listing-variant { + display: inline-block; + font-size: 14px; + color: #282b39; + + .card-block-listing-label { + color: var(--color-primary); + font: 500 11px/20px var(--base-font); + } + } + + &.card-block-listing-inline { + display: inline-block; + padding-bottom: 10px; + padding-right: 20px; + + &:last-child, + &:last-of-type { + padding-right: 0; + padding-bottom: 0; + } + } + + &.card-block-listing-no-pad { + padding-bottom: 0; + } +} diff --git a/react/assets/forus-platform/scss/_common/card-blocks/card-block-notes.scss b/react/assets/forus-platform/scss/_common/card-blocks/card-block-notes.scss new file mode 100644 index 000000000..5e5b8ba08 --- /dev/null +++ b/react/assets/forus-platform/scss/_common/card-blocks/card-block-notes.scss @@ -0,0 +1,65 @@ +.card-block.card-block-notes { + margin: -20px; + + .note-form { + padding: 15px 15px 15px 55px; + + .note-form-actions { + padding-top: 10px; + @include cf(); + + .note-form-desc { + float: left; + width: 50%; + } + + .note-form-buttons { + text-align: right; + float: right; + width: 50%; + } + } + } + + .note-item { + position: relative; + padding: 15px 55px; + border-bottom: 1px solid #d4d9dd; + background: #fff; + transition: 0.4s; + cursor: default; + + &:last-child { + border-bottom: 1px solid transparent; + } + + &:hover { + background: #f6f8f9; + } + } + + .note-item-icon { + position: absolute; + left: 25px; + top: 20px; + width: 16px; + height: 16px; + } + + .note-item-text { + color: #282b39; + font: 500 13px/18px var(--base-font); + } + + .note-item-sign { + color: #646f79; + font: 500 12px/18px var(--base-font); + + .mdi { + font-size: 5px; + margin-left: 5px; + margin-right: 5px; + color: #d4d9dd; + } + } +} diff --git a/react/assets/forus-platform/scss/_common/card-blocks/card-block-provider.scss b/react/assets/forus-platform/scss/_common/card-blocks/card-block-provider.scss new file mode 100644 index 000000000..899889ec8 --- /dev/null +++ b/react/assets/forus-platform/scss/_common/card-blocks/card-block-provider.scss @@ -0,0 +1,71 @@ +.card-block.card-block-provider { + display: flex; + gap: 20px; + flex-direction: row; + padding-bottom: 20px; + + .provider-offset { + float: left; + display: block; + width: 70px; + } + + .provider-img { + float: left; + display: block; + width: 50px; + height: 50px; + flex: 0 0 50px; + border: 1px solid #e7e7e7; + border-radius: var(--border-radius); + overflow: hidden; + background-color: #f1f4f7; + + img { + width: 100%; + display: block; + } + } + + .provider-details { + flex: 1 1 auto; + display: flex; + flex-direction: column; + justify-content: center; + min-width: 0; + gap: 4px; + + .provider-title { + display: block; + font: 500 16px/20px var(--base-font); + color: #151b26; + transition: 0.4s; + position: relative; + cursor: default; + word-wrap: break-word; + } + + .provider-subtitle { + font: 500 12px/16px var(--base-font); + color: #646f79; + word-wrap: break-word; + } + } + + .provider-actions { + display: flex; + flex-direction: row; + flex: 0 0 auto; + height: fit-content; + } + + a.provider-title:hover { + cursor: pointer; + color: #9ca6af; + text-decoration: none; + } + + &:last-child { + padding-bottom: 0; + } +} diff --git a/react/assets/forus-platform/scss/_common/card-blocks/card-block-request-record.scss b/react/assets/forus-platform/scss/_common/card-blocks/card-block-request-record.scss new file mode 100644 index 000000000..3425cc447 --- /dev/null +++ b/react/assets/forus-platform/scss/_common/card-blocks/card-block-request-record.scss @@ -0,0 +1,27 @@ +.card-block.card-block-request-record { + .card-header { + .card-title { + margin-bottom: 0; + } + } + + .block-label-tabs { + margin-bottom: 10px; + } + + .table { + tr { + td { + &.collapse-content { + padding: 15px 20px; + } + + .card { + border: 1px solid var(--border-color); + overflow: hidden; + box-shadow: none; + } + } + } + } +} diff --git a/react/assets/forus-platform/scss/_common/card-blocks/card-block-schedule.scss b/react/assets/forus-platform/scss/_common/card-blocks/card-block-schedule.scss new file mode 100644 index 000000000..0cf3201a6 --- /dev/null +++ b/react/assets/forus-platform/scss/_common/card-blocks/card-block-schedule.scss @@ -0,0 +1,10 @@ +.card-block.card-block-schedule { + display: flex; + flex-direction: column; + margin-top: -5px; + gap: 10px; + + .card-block-schedule-title { + font: 600 14px/24px var(--base-font); + } +} diff --git a/react/assets/forus-platform/scss/_common/card-blocks/card-block-table.scss b/react/assets/forus-platform/scss/_common/card-blocks/card-block-table.scss new file mode 100644 index 000000000..698278f11 --- /dev/null +++ b/react/assets/forus-platform/scss/_common/card-blocks/card-block-table.scss @@ -0,0 +1,3 @@ +.card-block.card-block-table { + margin: -20px; +} diff --git a/react/assets/forus-platform/scss/_common/components/app.scss b/react/assets/forus-platform/scss/_common/components/app.scss new file mode 100644 index 000000000..8247f337f --- /dev/null +++ b/react/assets/forus-platform/scss/_common/components/app.scss @@ -0,0 +1,612 @@ +.app { + flex: 1 0 auto; + @include webkit_scrollbar(#848588); + + &.app-header { + padding: 20px 0; + position: relative; + z-index: 2; + width: 100%; + max-width: 1470px; + display: flex; + flex-direction: column; + gap: 20px; + margin: 0 auto; + + .app-header-row { + position: relative; + display: flex; + flex-direction: row; + } + + .header-logo { + float: left; + padding: 10px 0; + + .header-logo-img { + display: block; + height: 40px; + } + } + + .header-organization-switcher { + width: 265px; + display: flex; + align-items: center; + + .select-control { + width: 100%; + } + } + + .notifications { + margin-right: 40px; + padding-bottom: 0; + position: relative; + display: flex; + flex-direction: column; + justify-content: center; + + .notifications-icons { + .notifications-icon { + color: var(--text-color); + background-color: #fff; + box-shadow: 0 5px 15px rgba($color: #000000, $alpha: 0.1); + border-radius: 50px; + width: 36px; + height: 36px; + text-align: center; + line-height: 36px; + font-size: 18px; + cursor: pointer; + transition: + background 0.4s, + color 0.4s; + margin-right: 20px; + + .mdi { + transition: transform 0.4s; + } + + &:hover { + background-color: #fafafa; + + &.notifications-icon-updates { + color: #fafafa; + background-color: #d91d46; + + .mdi { + transform: rotate(50deg); + } + } + } + + &.notifications-icon-updates { + color: #d91d46; + + .mdi { + transform: rotate(30deg); + } + } + + &:last-child { + margin-right: 0; + } + } + } + + .notifications-menu { + display: none; + position: absolute; + width: 360px; + top: 100%; + z-index: 1; + right: -15px; + + .notifications-menu-inner { + background: #ffffff; + border-radius: var(--border-radius); + box-shadow: 0 10px 25px rgba(#000, 0.15); + position: relative; + + .arrow-box { + right: 32.5px; + left: auto; + transform: scale(0.75); + } + + .notifications-menu-header { + border-bottom: 1px solid #d4d9dd; + padding: 10px 20px; + font: 500 13px/20px var(--base-font); + color: #282b39; + position: relative; + cursor: default; + + .notifications-menu-header-link { + font: 500 13px/20px var(--base-font); + position: absolute; + right: 20px; + top: 50%; + transform: translate(0, -50%); + cursor: pointer; + transition: color 0.4s; + + .mdi { + padding-left: 5px; + font-size: 1.15em; + line-height: 20px; + color: inherit; + transition: color 0.4s; + } + + &:hover { + color: #009ef4; + + .mdi { + color: #009ef4; + } + } + } + } + + .notifications-menu-body { + max-height: 300px; + overflow-y: auto; + @include webkit_scrollbar(); + + .notifications-menu-item { + padding: 15px 20px; + border-bottom: 1px solid #d4d9dd; + position: relative; + transition: background-color 0.4s; + cursor: default; + display: flex; + flex-direction: row; + word-break: break-word; + + .notifications-menu-item-icon { + margin-right: 10px; + padding: 2.5px 0; + + img { + display: block; + } + } + + .notifications-menu-item-details { + display: flex; + flex-direction: column; + } + + .notifications-menu-item-title { + font: 700 13px/16px var(--base-font); + margin: 0 0 5px; + color: #282b39; + } + + .notifications-menu-item-text { + font: 500 13px/16px var(--base-font); + margin: 0 0 10px; + color: #282b39; + } + + .notifications-menu-item-date { + font: 500 12px/14px var(--base-font); + color: #646f79; + + .mdi { + line-height: inherit; + margin-right: 3px; + } + } + + &.notifications-menu-item-new { + background-color: #e4ecf170; + } + + &:last-child { + border-bottom: 0; + } + + /* &:hover { + background: #f6f8f9; + } */ + } + + .notifications-menu-empty { + cursor: default; + padding: 20px 20px; + font: 500 13px/16px var(--base-font); + color: #282b39; + text-align: center; + } + } + } + } + + &.active { + .notifications-menu { + display: block; + } + } + } + + .header-auth { + float: right; + position: relative; + z-index: 1; + display: flex; + + .auth-user { + position: relative; + padding-bottom: 15px; + margin-bottom: -10px; + display: flex; + flex-direction: row; + cursor: pointer; + @include cf(); + + .auth-user-details { + display: flex; + flex-direction: column; + padding: 5px 10px 5px 0; + + .auth-user-name { + font: 500 14px/20px var(--base-font); + color: #151b26; + text-align: right; + } + + .auth-user-role { + font: 400 12px/20px var(--base-font); + color: #151b26; + text-align: right; + + .auth-user-role-separator { + font-size: 22px; + line-height: inherit; + vertical-align: top; + color: #a1a1a1; + padding: 0 3px; + } + } + } + + .auth-user-caret { + display: flex; + align-items: center; + color: #151b26; + padding-left: 5px; + + em { + font-size: 20px; + font-weight: 600; + margin-top: 3px; + } + + @media screen and (max-width: 1000px) { + display: none; + } + } + + .auth-user-img { + display: block; + width: 50px; + height: 50px; + border-radius: 50px; + background: #fff; + box-shadow: 0 2px 9px rgba(0, 0, 0, 0.1); + } + + .auth-user-menu { + position: absolute; + right: 0; + top: 60px; + border: 1px solid #f3f4f5; + background: #fff; + border-radius: var(--border-radius); + box-shadow: 0 5px 30px rgba(#000, 0.1); + min-width: 220px; + max-width: 80%; + padding: 10px 10px; + cursor: default; + + .auth-user-menu-title { + text-transform: uppercase; + color: #646f79; + font: 600 11px/13px var(--base-font); + padding: 10px 0 10px 2px; + } + + .auth-user-menu-sep { + display: block; + border-top: 1px solid #f3f4f5; + margin: 10px -10px 10px; + } + + .auth-user-menu-item { + display: flex; + justify-content: flex-start; + cursor: pointer; + padding: 0; + font: 500 13px/36px var(--base-font); + letter-spacing: -0.312px; + color: #151b26; + transition: 0.4s; + + .auth-user-menu-item-icon { + display: flex; + flex: 0 0 32px; + width: 32px; + height: 36px; + margin-right: 4px; + + svg, + img { + max-width: 100%; + max-height: 100%; + object-fit: contain; + object-position: center; + transition: 0.4s; + + path { + transition: 0.4s; + } + } + + svg { + height: 36px; + } + } + + &.active { + padding-right: 30px; + position: relative; + color: #004195; + + .auth-user-menu-item-icon { + svg { + path { + fill: #134478; + } + } + } + + &:after { + content: ''; + background-image: assetUrl('img/icon-check.svg'); + background-position: center; + background-size: contain; + background-repeat: no-repeat; + width: 20px; + height: 20px; + position: absolute; + right: 0; + top: 50%; + transform: translate(0, -50%); + } + } + + &:hover { + text-decoration: none; + background: #f6f8f9; + color: #004195; + + .auth-user-menu-item-icon { + svg { + path { + fill: #134478; + } + } + } + } + + &:last-child { + margin-bottom: 0; + } + } + } + } + } + } + + &.app-container { + width: 100%; + max-width: 1470px; + display: flex; + flex-direction: row; + gap: 30px; + margin: 0 auto; + } + + &.app-sidebar { + flex: 0 0 260px; + padding-left: 8px; + position: relative; + + .sidebar-nav { + display: flex; + flex-direction: column; + gap: 4px; + padding-bottom: 30px; + position: sticky; + left: 0; + top: 15px; + + .sidebar-nav-group { + display: flex; + flex-direction: column; + background: transparent; + transition: 0.4s; + + .sidebar-nav-group-header { + display: flex; + flex-direction: row; + align-items: flex-start; + border-radius: var(--border-radius); + transition: background-color 0.4s; + gap: 6px; + + .sidebar-nav-group-header-icon { + display: flex; + flex: 0 0 32px; + position: relative; + + svg { + display: block; + } + + .sidebar-nav-group-header-icon-default { + opacity: 1; + transition: opacity 0.4s; + } + + .sidebar-nav-group-header-icon-active { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0; + transition: opacity 0.4s; + } + } + + .sidebar-nav-group-header-title { + display: flex; + flex: 1 1 auto; + font: 500 13px/20px var(--base-font); + padding: 6px 0; + transition: color 0.4s; + } + + .sidebar-nav-group-header-toggle { + display: flex; + flex: 0 0 32px; + height: 32px; + justify-content: center; + align-items: center; + color: #b0bec5; + font-size: 20px; + transition: color 0.4s; + } + + &:hover { + background: #426993; + + .sidebar-nav-group-header-icon { + .sidebar-nav-group-header-icon-default { + opacity: 0; + } + + .sidebar-nav-group-header-icon-active { + opacity: 1; + } + } + + .sidebar-nav-group-header-title { + color: #fff; + } + + .sidebar-nav-group-header-toggle { + color: #fff; + } + } + } + + .sidebar-nav-group-items { + display: flex; + flex-direction: column; + margin: 0 0 0 14px; + border-left: 2px solid var(--border-color); + padding: 4px 0; + + .sidebar-nav-group-item { + padding: 5px 10px 5px 22px; + font: 500 13px/20px var(--base-font); + color: #151b26; + text-decoration: none; + margin-left: -2px; + border-left: 2px solid var(--border-color); + + &:hover { + color: #426993; + text-decoration: underline; + } + + &.active { + color: #134478; + border-left: 2px solid #134478; + } + } + } + + &.sidebar-nav-group-active { + & > .sidebar-nav-group-header { + background: #134478; + border-radius: var(--border-radius); + + .sidebar-nav-group-header-icon { + .sidebar-nav-group-header-icon-default { + opacity: 0; + } + + .sidebar-nav-group-header-icon-active { + opacity: 1; + } + } + + .sidebar-nav-group-header-title { + color: #fff; + } + + .sidebar-nav-group-header-toggle { + color: #fff; + } + } + } + } + } + } + + &.app-content { + flex: 1 1 auto; + display: flex; + flex-direction: column; + min-width: 0; + padding: 0 0 30px; + } + + @media screen and (max-width: 1300px) { + &.app-sidebar { + width: 240px; + padding-right: 40px; + } + + &.app-content { + width: calc(100% - 240px); + } + } + + @media screen and (max-width: 1000px) { + &.app-header { + padding: 25px 0; + + .header-logo { + display: none; + } + } + + &.app-sidebar { + width: 100%; + margin-bottom: 20px; + padding: 0; + } + + &.app-content { + padding: 0; + width: 100%; + } + } +} diff --git a/react/assets/forus-platform/scss/_common/components/card-heading.scss b/react/assets/forus-platform/scss/_common/components/card-heading.scss new file mode 100644 index 000000000..2872e28b3 --- /dev/null +++ b/react/assets/forus-platform/scss/_common/components/card-heading.scss @@ -0,0 +1,38 @@ +.card-heading { + font: 500 18px/26px var(--base-font); + color: #282b39; + margin-bottom: 10px; + cursor: default; + + .block.block-inline-filters { + .form { + .form-group { + margin: 0 10px 0 0; + + &:last-child { + margin-right: 0; + } + } + } + } + + .link { + display: inline-block; + color: #646f79; + transition: 0.4s; + margin-left: 10px; + font: 500 13px/26px var(--base-font); + + .mdi { + line-height: inherit; + float: left; + font-size: 1.2em; + color: inherit; + margin-right: 5px; + } + + &:hover { + color: #d91d46; + } + } +} diff --git a/react/assets/forus-platform/scss/_common/components/card.scss b/react/assets/forus-platform/scss/_common/components/card.scss new file mode 100644 index 000000000..d94724427 --- /dev/null +++ b/react/assets/forus-platform/scss/_common/components/card.scss @@ -0,0 +1,521 @@ +.card { + --card-margin: 20px; + background: #ffffff; + border-radius: var(--border-radius); + box-shadow: 0 2px 8px rgba(#000, 0.1); + margin-bottom: var(--card-margin); + cursor: default; + + @mixin bgDanger() { + background: rgba(246, 246, 246, 0.4); + } + + .card-header, + .card-section, + .card-footer { + border-bottom: 1px solid var(--border-color); + + &:first-child { + border-top-left-radius: 5px; + border-top-right-radius: 5px; + } + + &:last-child { + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + } + } + + .card-header { + &:last-child { + border-bottom: none; + } + } + + .card-title { + font: 500 16px/30px var(--base-font); + color: #282b39; + cursor: inherit; + display: flex; + + .card-collapse { + float: right; + font-size: 36px; + line-height: 28px; + color: #777; + } + + .tag { + margin-left: 10px; + } + + .mdi { + margin-right: 7px; + font-size: 20px; + line-height: 30px; + height: 30px; + } + + &.card-title-sm { + font-size: 14px; + } + } + + .card-subtitle { + font: 500 13px/20px var(--base-font); + color: #404040; + + .mdi { + font-size: 16px; + margin-right: 2px; + color: #404040; + } + } + + .card-header { + padding: 15px 20px 14px; + position: relative; + display: flex; + flex-direction: row; + align-items: center; + + .card-title { + margin: 0 0 !important; + } + + .card-header-filters { + display: flex; + flex-direction: row; + gap: 10px; + align-items: center; + + .block-inline-filters { + display: flex; + flex-direction: row; + gap: 10px; + align-items: center; + + .form-control:not(.select-control) { + min-height: auto !important; + + &:not([type='radio']):not([type='checkbox']) { + height: 30px; + padding: 0 10px; + line-height: 28px; + } + } + + .block-label-tabs { + .label-tab { + height: 30px; + line-height: 24px; + padding-top: 2px; + padding-bottom: 2px; + font-size: 12px; + + .mdi { + line-height: 24px; + } + } + } + + .select-control { + min-height: auto !important; + + .form-control:not([type='radio']):not([type='checkbox']) { + padding-right: 30px; + } + } + + & > * { + margin: 0 0 0 0; + } + } + } + + .card-header-actions { + margin: -1px 0; + display: flex; + flex-direction: column; + gap: 5px; + } + + .block-label-tabs { + margin-left: 0; + } + + .button { + line-height: 22px; + } + + &.card-header-warning { + background: #fcf2dd; + } + + &.card-header-danger { + @include bgDanger(); + } + + &.card-header-primary { + background: #f6f9fc; + } + + &.card-header-success { + background: #f7f9de; + } + + &.card-header-sm { + padding: 7.5px 25px; + + .card-title { + color: #646f79; + } + } + + &.card-header-md { + .card-title { + font: 600 14px / 21px var(--base-font); + + .mdi { + margin-right: 0; + margin-left: -15px; + color: #646f79; + } + } + } + + &.card-header-cursor-default { + cursor: default; + } + } + + .label-item { + font: 500 13px var(--base-font); + color: #646f79; + margin-bottom: 5px; + } + + .card-heading { + font: 600 14px/22px var(--base-font); + color: #282b39; + margin: 0 0 15px; + cursor: inherit; + + &:last-child, + &.card-heading-padless { + margin-bottom: 0; + } + } + + .card-text { + font: 500 14px/20px var(--base-font); + color: #646f79; + margin: 0 0 15px; + cursor: inherit; + + &:last-child { + margin-bottom: 0; + } + + &.alert { + color: #a80a2d; + font: 600 16px/18px var(--base-font); + } + } + + .card-text-link { + color: inherit; + font: inherit; + text-decoration: underline; + } + + .card-section { + display: flex; + flex-direction: column; + padding: 20px; + position: relative; + cursor: inherit; + font: 500 13px var(--base-font); + + .card-title { + font: 500 16px/30px var(--base-font); + color: #282b39; + cursor: inherit; + margin: 0 0 10px; + + &:last-child, + &:last-of-type { + margin: 0; + } + } + + .card-loading { + padding: 15px 0; + display: flex; + justify-content: center; + + .mdi { + font-size: 40px; + display: flex; + opacity: 0.5; + } + } + + .card-col { + padding: 25px; + border-right: 1px solid #d4d9dd; + + &.card-col-1 { + width: calc(100% / 6) * 1; + } + + &.card-col-2 { + width: calc(100% / 6) * 2; + } + + &.card-col-3 { + width: calc(100% / 6) * 3; + } + + &.card-col-4 { + width: calc(100% / 6) * 4; + } + + &.card-col-5 { + width: calc(100% / 6) * 5; + } + + &.card-col-6 { + width: calc(100% / 6) * 6; + } + + &:last-child { + border-right: none; + } + } + + .card-section-inner { + margin: -20px; + } + + .card-section-actions { + position: absolute; + margin-bottom: -10px; + right: 20px; + top: 25px; + z-index: 1; + + .card-section-action { + display: inline-block; + font: 500 13px/25px var(--base-font); + color: #646f79; + margin-right: 10px; + vertical-align: top; + cursor: pointer; + + .mdi { + font-size: 1.6em; + float: left; + margin-right: 3px; + } + + &:hover { + text-decoration: none; + color: #e63b3b; + + .mdi { + color: #e63b3b; + } + } + + &:last-child { + margin-right: 0; + } + } + + .card-section-action-price { + margin-right: 10px; + display: inline-block; + font: 500 16px var(--base-font); + color: #151b26; + vertical-align: top; + text-align: right; + + .old-price { + font: 500 14px var(--base-font); + color: #646f79; + display: block; + text-decoration: line-through; + } + } + + .card-section-actions-details { + .card-section-actions-label { + font: 600 11px/18px var(--base-font); + text-align: right; + color: #134478; + margin: 0 0 2px; + } + + .card-section-actions-value { + font: 500 12px/20px var(--base-font); + text-align: right; + color: #000000; + } + + &:not(:first-child) { + padding-top: 15px; + } + } + + &.card-section-actions-bottom { + top: auto; + bottom: 25px; + } + } + + .divider { + padding-top: 25px; + border-bottom: 1px solid #d4d9dd; + margin: 0 -25px 25px; + } + + &.card-section-warning { + background: #fcfaf6; + } + + &.card-section-danger { + @include bgDanger(); + } + + &.card-section-primary { + background: #f6f9fc; + } + + &.card-section-success { + background: #f7f9de; + } + + &.card-section-narrow { + padding: 15px 25px 15px; + } + + &.card-section-sm { + padding: 10px; + } + + &.card-section-padless, + &.card-section-no-padding { + padding: 0; + } + + &.card-section-no-border, + &:last-child { + border-bottom: 0; + } + } + + .card-info { + border-bottom: 1px solid var(--border-color); + padding: 10px 15px; + display: grid; + grid-template-columns: 20px 1fr; + min-height: 50px; + gap: 15px; + + .card-info-icon { + min-height: 20px; + font-size: 18px; + align-self: center; + display: flex; + justify-content: center; + } + + .card-info-details { + font: 400 13px/18px var(--base-font); + margin: 0 0 0; + display: flex; + justify-content: center; + flex-direction: column; + + strong { + font-weight: 500; + } + } + + &.card-info-dim { + background-color: #fbfbfb; + } + } + + .card-footer { + padding: 15px 20px; + + &.card-footer-warning { + background: #fcfaf6; + } + + &.card-footer-danger { + @include bgDanger(); + } + + &.card-footer-primary { + background: #f6f9fc; + } + + &.card-footer-success { + background: #f7f9de; + } + + &.card-footer-sm { + padding: 7.5px 25px; + + .card-title { + color: #646f79; + } + } + } + + &:last-child { + margin-bottom: 0; + } + + &.card-outline { + border: 1px solid var(--border-color); + } + + &.card-collapsable { + transition: background 0.4s; + + .card-header, + .card-section { + &[ng-click] { + cursor: pointer; + } + } + + &:not(.card-collapsed):hover { + background: lighten($color: #f3f4f5, $amount: 2); + } + } + + &.card-wrapped { + margin-bottom: var(--card-margin); + } + + &.card-padded { + margin-bottom: 0; + } + + &.card-bordered { + border: 1px solid var(--border-color); + } + + &.card-overflow-hidden { + overflow: hidden; + } + + &.card-no-shadow { + box-shadow: none; + } +} diff --git a/react/assets/forus-platform/scss/_common/components/signup-layout.scss b/react/assets/forus-platform/scss/_common/components/signup-layout.scss new file mode 100644 index 000000000..326e953bd --- /dev/null +++ b/react/assets/forus-platform/scss/_common/components/signup-layout.scss @@ -0,0 +1,313 @@ +.signup-layout { + background-color: #f7f9fc; + + .header-auth { + display: none !important; + } + + .header-logo { + display: none !important; + } + + .section-footer { + display: none !important; + } + + .app.app-header { + padding: 0; + } + + .text-primary { + color: #305dfb !important; + } + + .card { + border: 1px solid #d2e6ff; + box-shadow: 5px 25px 35px rgba($color: #000000, $alpha: 0.075); + margin-bottom: 30px; + + .card-header { + border-bottom: 1px solid #d2e6ff; + position: relative; + + .card-header-image { + position: absolute; + bottom: 0; + right: 20px; + width: 40px; + } + } + + .card-title { + font: 700 22px/36px var(--base-font); + color: #282b39; + + i, + b { + font-weight: 700; + font-size: 22px; + } + } + + .card-subtitle { + font: 400 16px/24px var(--base-font); + color: #646f79; + + i, + b { + font-size: 16px; + } + } + + .card-subdescription { + font: 400 13px/20px var(--base-font); + color: #646f79; + + i, + b { + font-size: 13px; + } + } + + .card-section { + border-color: #d2e6ff; + + .card-title { + font: 700 22px var(--base-font); + margin: 0 0 15px; + color: #282b39; + } + + .card-col { + border-color: #d2e6ff; + } + } + } + + .button { + transform: translate(0, 0); + font: 700 14px/30px var(--base-font); + padding: 10px 65px; + text-align: center; + border-radius: var(--border-radius); + + &.button-primary { + background: #305dfb; + border-color: #305dfb; + color: #fff; + + &:hover { + background: #4c74ff; + border-color: #4c74ff; + } + } + + &.button-text { + &.button-text-primary { + color: #305dfb; + } + } + + &.button-default { + background: #282b39; + border-color: #282b39; + color: #fff; + + &:hover { + background: #646f79; + border-color: #646f79; + } + } + + &.button-text { + &:hover { + color: #305dfb; + } + } + } + + .form { + .form-label { + text-transform: uppercase; + font-weight: 600; + font-size: 11px; + } + + .form-group { + margin-bottom: 15px; + } + } + + // override + .block.block-schedule-editor { + .schedule-item { + select.form-control { + height: 34px; + padding: 0 12px; + border: 1px solid #d2e6ff; + color: #282b39; + font: 500 12px var(--base-font); + } + } + } + + .modal { + .modal-window { + background: #fff; + } + } + + &.signup-layout-new { + background: #fff; + + .button { + line-height: 28px; + font-size: 16px; + font-weight: 500; + border-radius: calc(var(--border-radius)); + + &.button-disabled, + [disabled] { + background: #eff2f4; + border-color: #eff2f4; + color: #ccd0e0; + box-shadow: none; + pointer-events: none; + cursor: default; + + &:hover { + box-shadow: none; + } + } + + .mdi { + font-size: 26px; + + &.icon-start { + margin-left: -10px; + margin-right: 10px; + } + + &.icon-end { + margin-left: 10px; + margin-right: -10px; + } + } + } + + @media (max-width: 991px) { + .modal { + .button { + font-size: 14px; + padding: 7px 35px; + } + } + + .fund-apply { + .card { + .card-section { + &.card-section-fund { + flex-direction: column; + align-items: flex-start; + justify-content: flex-start; + padding: 20px 20px; + + .card-section-actions { + order: 2; + position: initial; + margin: 0 0 0; + width: 100%; + + .button { + width: 100%; + } + } + + .card-block.card-block-fund { + order: 1; + padding: 0 0 0; + } + } + } + } + } + + .sign_up-pane-body { + .block-photo-selector { + display: flex; + max-width: none; + + .photo-img { + width: 80px; + height: 80px; + margin: 0 20px 0 0 !important; + } + + .photo-details { + max-width: calc(100% - 100px); + + .photo-label, + .photo-description { + text-align: left; + line-height: 20px; + } + } + } + + .sign_up-pane-auth { + .sign_up-pane-auth-qr_code { + .block.block-qr-code { + margin: 0 auto; + } + } + } + + .sign_up-pane-section { + flex-direction: column !important; + padding-right: 0 !important; + + .sign_up-pane-col { + width: 100% !important; + padding: 14px !important; + border-top: 1px solid #edeef0; + + &.sign_up-pane-col-2 { + order: 1; + } + } + } + + .ui-control.ui-control-checkbox { + padding-top: 5px; + padding-bottom: 5px; + } + } + + .finish-screen { + .sign_up-pane-body { + .sign_up-pane-text { + padding-left: 10px; + padding-right: 10px; + text-align: center !important; + } + + .button { + background-color: #e1e8ff; + border-radius: var(--border-radius); + } + } + } + + .sign_up-pane-footer { + .button { + .mdi { + &:before, + &:after { + line-height: inherit; + } + } + } + } + } + } +} diff --git a/react/assets/forus-platform/scss/_common/dashboard.scss b/react/assets/forus-platform/scss/_common/dashboard.scss index 44d2756d8..0f8837035 100644 --- a/react/assets/forus-platform/scss/_common/dashboard.scss +++ b/react/assets/forus-platform/scss/_common/dashboard.scss @@ -7,13 +7,14 @@ @import 'includes/common'; @import 'includes/visibility'; -// DEV PAGES -@import 'includes/ie'; - // modules @import 'includes/printables'; // components +@import 'components/app.scss'; +@import 'components/card-heading.scss'; +@import 'components/card.scss'; +@import 'components/signup-layout.scss'; @import 'components/forms'; @import 'components/tables'; @import 'components/buttons'; @@ -21,28 +22,24 @@ @import 'components/grid'; @import 'components/labels'; @import 'components/flex-grid'; -@import 'components/modals.scss'; @import 'components/frame-director.scss'; -// blocks -.block { - @import 'blocks/block-chat'; - @import 'blocks/block-fund'; - @import 'blocks/block-critera-editor'; - @import 'blocks/block-faq-editor'; - @import 'blocks/block-card-toggleable'; - @import 'blocks/block-external-validators'; - @import 'blocks/block-danger_zone'; - @import 'blocks/block-sessions'; - @import 'blocks/block-breadcrumbs'; - @import 'blocks/block-notifications'; - @import '../../../forus-webshop/scss/includes/components/ui-controls'; -} - +@import '../../../forus-webshop/scss/includes/components/ui-controls'; @import '../../../forus-webshop/scss/includes/components/table-pagination'; + +// blocks from webshop @import '../../../forus-webshop/scss/includes/blocks/block-sign_up'; @import '../../../forus-webshop/scss/includes/blocks/block-exception'; +// blocks +@import 'blocks/block-chat'; +@import 'blocks/block-fund'; +@import 'blocks/block-critera-editor'; +@import 'blocks/block-faq-editor'; +@import 'blocks/block-danger_zone'; +@import 'blocks/block-sessions'; +@import 'blocks/block-breadcrumbs'; +@import 'blocks/block-notifications'; @import 'blocks/block-app_download.scss'; @import 'blocks/block-app_links.scss'; @import 'blocks/block-timeframe.scss'; @@ -64,18 +61,6 @@ @import 'blocks/block-voucher-records-editor.scss'; @import 'blocks/block-content.scss'; -// Marketplace feature blocks -@import 'blocks/marketplace-features/block-features-overview.scss'; -@import 'blocks/marketplace-features/block-features-demo-banner.scss'; -@import 'blocks/marketplace-features/block-feature-icons.scss'; -@import 'blocks/marketplace-features/block-feature-steps.scss'; -@import 'blocks/marketplace-features/block-feature-list.scss'; -@import 'blocks/marketplace-features/block-feature-list-row.scss'; -@import 'blocks/marketplace-features/block-feature-text-image-columns.scss'; -@import 'blocks/marketplace-features/block-features.scss'; -@import 'blocks/marketplace-features/block-feature.scss'; -@import 'blocks/marketplace-features/block-feature-faq.scss'; - @import 'blocks/block-payment-connection.scss'; @import 'blocks/block-pre-checks-blocks-editor'; @import 'blocks/block-table-config.scss'; @@ -93,7 +78,6 @@ @import 'blocks/block-push-notifications.scss'; @import 'blocks/block-inline-copy.scss'; @import 'blocks/block-inline-edit.scss'; -@import 'blocks/block-collapsable.scss'; @import 'blocks/block-fund-request-assigned.scss'; @import 'blocks/block-product.scss'; @import 'blocks/block-label-tabs.scss'; @@ -104,6503 +88,72 @@ @import 'blocks/block-request-clarification.scss'; @import 'blocks/block-product-media-uploader.scss'; @import 'blocks/block-file-uploader'; +@import 'blocks/block-form_tooltip.scss'; +@import 'blocks/block-sign_up.scss'; +@import 'blocks/block-pdf-preview.scss'; +@import 'blocks/block-tooltip-details.scss'; +@import 'blocks/block-info.scss'; +@import 'blocks/block-empty.scss'; +@import 'blocks/block-qr-code.scss'; +@import 'blocks/block-preferences.scss'; +@import 'blocks/block-message.scss'; +@import 'blocks/block-csv.scss'; +@import 'blocks/block-schedule-editor.scss'; +@import 'blocks/block-photo-selector.scss'; +@import 'blocks/block-file.scss'; +@import 'blocks/block-inline-filters.scss'; +@import 'blocks/block-information.scss'; +@import 'blocks/block-entity-overview.scss'; +@import 'blocks/block-page-loading-bar.scss'; +@import 'blocks/block-login.scss'; +@import 'blocks/block-email-confirmed.scss'; +@import 'blocks/block-charts.scss'; +@import 'blocks/block-compact-datalist.scss'; +@import 'blocks/block-user_emails.scss'; + +// card-blocks +@import 'card-blocks/card-block-table.scss'; +@import 'card-blocks/card-block-listing.scss'; +@import 'card-blocks/card-block-keyvalue.scss'; +@import 'card-blocks/card-block-fund.scss'; +@import 'card-blocks/card-block-provider.scss'; +@import 'card-blocks/card-block-notes.scss'; +@import 'card-blocks/card-block-financial.scss'; +@import 'card-blocks/card-block-bank.scss'; +@import 'card-blocks/card-block-request-record.scss'; +@import 'card-blocks/card-block-schedule.scss'; + +// Marketplace feature blocks +@import 'blocks/marketplace-features/block-features-overview.scss'; +@import 'blocks/marketplace-features/block-features-demo-banner.scss'; +@import 'blocks/marketplace-features/block-feature-icons.scss'; +@import 'blocks/marketplace-features/block-feature-steps.scss'; +@import 'blocks/marketplace-features/block-feature-list.scss'; +@import 'blocks/marketplace-features/block-feature-list-row.scss'; +@import 'blocks/marketplace-features/block-feature-text-image-columns.scss'; +@import 'blocks/marketplace-features/block-features.scss'; +@import 'blocks/marketplace-features/block-feature.scss'; +@import 'blocks/marketplace-features/block-feature-faq.scss'; + +// modals +@import 'modals/modal.scss'; +@import 'modals/modal-voucher_qr.scss'; +@import 'modals/modal-fund-offers.scss'; +@import 'modals/modal-pdf-preview.scss'; +@import 'modals/modal-image-preview.scss'; +@import 'modals/modal-fund-unsubscribe.scss'; +@import 'modals/modal-2fa-setup.scss'; +@import 'modals/modal-voucher-create.scss'; +@import 'modals/modal-feature-contact.scss'; +@import 'modals/modal-photo-upload.scss'; +@import 'modals/modal-voucher-transaction.scss'; +@import 'modals/modal-pin-code.scss'; +@import 'modals/modal-provider-products-required.scss'; +@import 'modals/modal-bulk-upload.scss'; // Select controls @import 'select-controls/select-control-funds'; @import 'select-controls/select-control-organizations'; // Dropdown menus -.dropdown { - // dropdown blocks - @import 'dropdown/dropdown-actions'; -} - -.modal { - @import 'modals/modal-photo-upload.scss'; - @import 'modals/modal-voucher-transaction.scss'; - @import 'modals/modal-pin-code.scss'; - @import 'modals/modal-provider-products-required.scss'; - @import 'modals/modal-bulk-upload.scss'; -} - -html, -body { - height: 100%; -} - -body { - display: flex; - flex-direction: column; -} - -.hover-actions { - position: relative; - - .mdi { - font-size: 1.5em; - color: #8ca3a6; - cursor: pointer; - } - - .hover-actions-menu { - display: none; - z-index: 1; - position: absolute; - right: 50%; - top: 50%; - margin-top: 2px; - background: #fff; - max-width: 80vw; - width: 240px; - border: 1px solid #f3f4f5; - border-radius: var(--border-radius); - box-shadow: 0 5px 25px rgba(#000, 0.15); - padding: 5px 20px; - @include cf(); - - .hover-actions-label { - padding: 10px 20px; - margin: 0 -20px; - font: 500 13px/20px var(--base-font); - color: #646f79; - } - - .hover-actions-item { - padding: 10px 20px; - margin: 0 -20px; - white-space: nowrap; - color: var(--color-primary); - cursor: pointer; - font: 500 12px/20px var(--base-font); - transition: 0.4s; - - &:hover { - color: #d91d46; - background: #f6f8f9; - } - } - - .hover-actions-sep { - border-bottom: 1px solid #f3f4f5; - } - } - - &:hover { - .hover-actions-menu { - display: block; - } - } -} - -.paginator-loader { - text-align: center; - - .paginator-actions { - margin: 0 0 10px; - } - - .paginator-progress { - font: 500 13px/16px var(--base-font); - color: #666; - } -} - -.app { - flex: 1 0 auto; - @include webkit_scrollbar(#848588); - - &.app-header { - padding: 20px 0; - position: relative; - z-index: 2; - width: 100%; - max-width: 1470px; - display: flex; - flex-direction: column; - gap: 20px; - margin: 0 auto; - - .app-header-row { - position: relative; - display: flex; - flex-direction: row; - } - - .header-logo { - float: left; - padding: 10px 0; - - .header-logo-img { - display: block; - height: 40px; - } - } - - .header-organization-switcher { - width: 265px; - display: flex; - align-items: center; - - .select-control { - width: 100%; - } - } - - .notifications { - margin-right: 40px; - padding-bottom: 0; - position: relative; - display: flex; - flex-direction: column; - justify-content: center; - - .notifications-icons { - .notifications-icon { - color: var(--text-color); - background-color: #fff; - box-shadow: 0 5px 15px rgba($color: #000000, $alpha: 0.1); - border-radius: 50px; - width: 36px; - height: 36px; - text-align: center; - line-height: 36px; - font-size: 18px; - cursor: pointer; - transition: - background 0.4s, - color 0.4s; - margin-right: 20px; - - .mdi { - transition: transform 0.4s; - } - - &:hover { - background-color: #fafafa; - - &.notifications-icon-updates { - color: #fafafa; - background-color: #d91d46; - - .mdi { - transform: rotate(50deg); - } - } - } - - &.notifications-icon-updates { - color: #d91d46; - - .mdi { - transform: rotate(30deg); - } - } - - &:last-child { - margin-right: 0; - } - } - } - - .notifications-menu { - display: none; - position: absolute; - width: 360px; - top: 100%; - z-index: 1; - right: -15px; - - .notifications-menu-inner { - background: #ffffff; - border-radius: var(--border-radius); - box-shadow: 0 10px 25px rgba(#000, 0.15); - position: relative; - - .arrow-box { - right: 32.5px; - left: auto; - transform: scale(0.75); - } - - .notifications-menu-header { - border-bottom: 1px solid #d4d9dd; - padding: 10px 20px; - font: 500 13px/20px var(--base-font); - color: #282b39; - position: relative; - cursor: default; - - .notifications-menu-header-link { - font: 500 13px/20px var(--base-font); - position: absolute; - right: 20px; - top: 50%; - transform: translate(0, -50%); - cursor: pointer; - transition: color 0.4s; - - .mdi { - padding-left: 5px; - font-size: 1.15em; - line-height: 20px; - color: inherit; - transition: color 0.4s; - } - - &:hover { - color: #009ef4; - - .mdi { - color: #009ef4; - } - } - } - } - - .notifications-menu-body { - max-height: 300px; - overflow-y: auto; - @include webkit_scrollbar(); - - .notifications-menu-item { - padding: 15px 20px; - border-bottom: 1px solid #d4d9dd; - position: relative; - transition: background-color 0.4s; - cursor: default; - display: flex; - flex-direction: row; - word-break: break-word; - - .notifications-menu-item-icon { - margin-right: 10px; - padding: 2.5px 0; - - img { - display: block; - } - } - - .notifications-menu-item-details { - display: flex; - flex-direction: column; - } - - .notifications-menu-item-title { - font: 700 13px/16px var(--base-font); - margin: 0 0 5px; - color: #282b39; - } - - .notifications-menu-item-text { - font: 500 13px/16px var(--base-font); - margin: 0 0 10px; - color: #282b39; - } - - .notifications-menu-item-date { - font: 500 12px/14px var(--base-font); - color: #646f79; - - .mdi { - line-height: inherit; - margin-right: 3px; - } - } - - &.notifications-menu-item-new { - background-color: #e4ecf170; - } - - &:last-child { - border-bottom: 0; - } - - /* &:hover { - background: #f6f8f9; - } */ - } - - .notifications-menu-empty { - cursor: default; - padding: 20px 20px; - font: 500 13px/16px var(--base-font); - color: #282b39; - text-align: center; - } - } - } - } - - &.active { - .notifications-menu { - display: block; - } - } - } - - .header-auth { - float: right; - position: relative; - z-index: 1; - display: flex; - - .auth-user { - position: relative; - padding-bottom: 15px; - margin-bottom: -10px; - display: flex; - flex-direction: row; - cursor: pointer; - @include cf(); - - .auth-user-details { - display: flex; - flex-direction: column; - padding: 5px 10px 5px 0; - - .auth-user-name { - font: 500 14px/20px var(--base-font); - color: #151b26; - text-align: right; - } - - .auth-user-role { - font: 400 12px/20px var(--base-font); - color: #151b26; - text-align: right; - - .auth-user-role-separator { - font-size: 22px; - line-height: inherit; - vertical-align: top; - color: #a1a1a1; - padding: 0 3px; - } - } - } - - .auth-user-caret { - display: flex; - align-items: center; - color: #151b26; - padding-left: 5px; - - em { - font-size: 20px; - font-weight: 600; - margin-top: 3px; - } - - @media screen and (max-width: 1000px) { - display: none; - } - } - - .auth-user-img { - display: block; - width: 50px; - height: 50px; - border-radius: 50px; - background: #fff; - box-shadow: 0 2px 9px rgba(0, 0, 0, 0.1); - } - - .auth-user-menu { - position: absolute; - right: 0; - top: 60px; - border: 1px solid #f3f4f5; - background: #fff; - border-radius: var(--border-radius); - box-shadow: 0 5px 30px rgba(#000, 0.1); - min-width: 220px; - max-width: 80%; - padding: 10px 10px; - cursor: default; - - .auth-user-menu-title { - text-transform: uppercase; - color: #646f79; - font: 600 11px/13px var(--base-font); - padding: 10px 0 10px 2px; - } - - .auth-user-menu-sep { - display: block; - border-top: 1px solid #f3f4f5; - margin: 10px -10px 10px; - } - - .auth-user-menu-item { - display: flex; - justify-content: flex-start; - cursor: pointer; - padding: 0; - font: 500 13px/36px var(--base-font); - letter-spacing: -0.312px; - color: #151b26; - transition: 0.4s; - - .auth-user-menu-item-icon { - display: flex; - flex: 0 0 32px; - width: 32px; - height: 36px; - margin-right: 4px; - - svg, - img { - max-width: 100%; - max-height: 100%; - object-fit: contain; - object-position: center; - transition: 0.4s; - - path { - transition: 0.4s; - } - } - - svg { - height: 36px; - } - } - - &.active { - padding-right: 30px; - position: relative; - color: #004195; - - .auth-user-menu-item-icon { - svg { - path { - fill: #134478; - } - } - } - - &:after { - content: ''; - background-image: assetUrl('img/icon-check.svg'); - background-position: center; - background-size: contain; - background-repeat: no-repeat; - width: 20px; - height: 20px; - position: absolute; - right: 0; - top: 50%; - transform: translate(0, -50%); - } - } - - &:hover { - text-decoration: none; - background: #f6f8f9; - color: #004195; - - .auth-user-menu-item-icon { - svg { - path { - fill: #134478; - } - } - } - } - - &:last-child { - margin-bottom: 0; - } - } - } - } - } - } - - &.app-container { - width: 100%; - max-width: 1470px; - display: flex; - flex-direction: row; - gap: 30px; - margin: 0 auto; - } - - &.app-sidebar { - flex: 0 0 260px; - padding-left: 8px; - position: relative; - - .sidebar-nav { - display: flex; - flex-direction: column; - gap: 4px; - padding-bottom: 30px; - position: sticky; - left: 0; - top: 15px; - - .sidebar-nav-group { - display: flex; - flex-direction: column; - background: transparent; - transition: 0.4s; - - .sidebar-nav-group-header { - display: flex; - flex-direction: row; - align-items: flex-start; - border-radius: var(--border-radius); - transition: background-color 0.4s; - gap: 6px; - - .sidebar-nav-group-header-icon { - display: flex; - flex: 0 0 32px; - position: relative; - - svg { - display: block; - } - - .sidebar-nav-group-header-icon-default { - opacity: 1; - transition: opacity 0.4s; - } - - .sidebar-nav-group-header-icon-active { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - opacity: 0; - transition: opacity 0.4s; - } - } - - .sidebar-nav-group-header-title { - display: flex; - flex: 1 1 auto; - font: 500 13px/20px var(--base-font); - padding: 6px 0; - transition: color 0.4s; - } - - .sidebar-nav-group-header-toggle { - display: flex; - flex: 0 0 32px; - height: 32px; - justify-content: center; - align-items: center; - color: #b0bec5; - font-size: 20px; - transition: color 0.4s; - } - - &:hover { - background: #426993; - - .sidebar-nav-group-header-icon { - .sidebar-nav-group-header-icon-default { - opacity: 0; - } - - .sidebar-nav-group-header-icon-active { - opacity: 1; - } - } - - .sidebar-nav-group-header-title { - color: #fff; - } - - .sidebar-nav-group-header-toggle { - color: #fff; - } - } - } - - .sidebar-nav-group-items { - display: flex; - flex-direction: column; - margin: 0 0 0 14px; - border-left: 2px solid var(--border-color); - padding: 4px 0; - - .sidebar-nav-group-item { - padding: 5px 10px 5px 22px; - font: 500 13px/20px var(--base-font); - color: #151b26; - text-decoration: none; - margin-left: -2px; - border-left: 2px solid var(--border-color); - - &:hover { - color: #426993; - text-decoration: underline; - } - - &.active { - color: #134478; - border-left: 2px solid #134478; - } - } - } - - &.sidebar-nav-group-active { - & > .sidebar-nav-group-header { - background: #134478; - border-radius: var(--border-radius); - - .sidebar-nav-group-header-icon { - .sidebar-nav-group-header-icon-default { - opacity: 0; - } - - .sidebar-nav-group-header-icon-active { - opacity: 1; - } - } - - .sidebar-nav-group-header-title { - color: #fff; - } - - .sidebar-nav-group-header-toggle { - color: #fff; - } - } - } - } - } - } - - &.app-content { - flex: 1 1 auto; - display: flex; - flex-direction: column; - min-width: 0; - padding: 0 0 30px; - } - - @media screen and (max-width: 1300px) { - &.app-sidebar { - width: 240px; - padding-right: 40px; - } - - &.app-content { - width: calc(100% - 240px); - } - } - - @media screen and (max-width: 1000px) { - &.app-header { - padding: 25px 0; - - .header-logo { - display: none; - } - } - - &.app-sidebar { - width: 100%; - margin-bottom: 20px; - padding: 0; - } - - &.app-content { - padding: 0; - width: 100%; - } - } -} - -.card-heading { - font: 500 18px/26px var(--base-font); - color: #282b39; - margin-bottom: 10px; - cursor: default; - - .block.block-inline-filters { - .form { - .form-group { - margin: 0 10px 0 0; - - &:last-child { - margin-right: 0; - } - } - } - } - - .link { - display: inline-block; - color: #646f79; - transition: 0.4s; - margin-left: 10px; - font: 500 13px/26px var(--base-font); - - .mdi { - line-height: inherit; - float: left; - font-size: 1.2em; - color: inherit; - margin-right: 5px; - } - - &:hover { - color: #d91d46; - } - } -} - -.card { - --card-margin: 20px; - background: #ffffff; - border-radius: var(--border-radius); - box-shadow: 0 2px 8px rgba(#000, 0.1); - margin-bottom: var(--card-margin); - cursor: default; - - @mixin bgDanger() { - background: rgba(246, 246, 246, 0.4); - } - - .card-header, - .card-section, - .card-footer { - border-bottom: 1px solid var(--border-color); - - &:first-child { - border-top-left-radius: 5px; - border-top-right-radius: 5px; - } - - &:last-child { - border-bottom-left-radius: 5px; - border-bottom-right-radius: 5px; - } - } - - .card-header { - &:last-child { - border-bottom: none; - } - } - - .card-title { - font: 500 16px/30px var(--base-font); - color: #282b39; - cursor: inherit; - display: flex; - - .card-collapse { - float: right; - font-size: 36px; - line-height: 28px; - color: #777; - } - - .tag { - margin-left: 10px; - } - - .mdi { - margin-right: 7px; - font-size: 20px; - line-height: 30px; - height: 30px; - } - - &.card-title-sm { - font-size: 14px; - } - } - - .card-subtitle { - font: 500 13px/20px var(--base-font); - color: #404040; - - .mdi { - font-size: 16px; - margin-right: 2px; - color: #404040; - } - } - - .card-header { - padding: 15px 20px 14px; - position: relative; - display: flex; - flex-direction: row; - align-items: center; - - .card-title { - margin: 0 0 !important; - } - - .card-header-filters { - display: flex; - flex-direction: row; - gap: 10px; - align-items: center; - - .block-inline-filters { - display: flex; - flex-direction: row; - gap: 10px; - align-items: center; - - .form-control:not(.select-control) { - min-height: auto !important; - - &:not([type='radio']):not([type='checkbox']) { - height: 30px; - padding: 0 10px; - line-height: 28px; - } - } - - .block-label-tabs { - .label-tab { - height: 30px; - line-height: 24px; - padding-top: 2px; - padding-bottom: 2px; - font-size: 12px; - - .mdi { - line-height: 24px; - } - } - } - - .select-control { - min-height: auto !important; - - .form-control:not([type='radio']):not([type='checkbox']) { - padding-right: 30px; - } - } - - & > * { - margin: 0 0 0 0; - } - } - } - - .card-header-actions { - margin: -1px 0; - display: flex; - flex-direction: column; - gap: 5px; - } - - .block-label-tabs { - margin-left: 0; - } - - .button { - line-height: 22px; - } - - &.card-header-warning { - background: #fcf2dd; - } - - &.card-header-danger { - @include bgDanger(); - } - - &.card-header-primary { - background: #f6f9fc; - } - - &.card-header-success { - background: #f7f9de; - } - - &.card-header-sm { - padding: 7.5px 25px; - - .card-title { - color: #646f79; - } - } - - &.card-header-md { - .card-title { - font: 600 14px / 21px var(--base-font); - - .mdi { - margin-right: 0; - margin-left: -15px; - color: #646f79; - } - } - } - - &.card-header-cursor-default { - cursor: default; - } - } - - .label-item { - font: 500 13px var(--base-font); - color: #646f79; - margin-bottom: 5px; - } - - .card-heading { - font: 600 14px/22px var(--base-font); - color: #282b39; - margin: 0 0 15px; - cursor: inherit; - - &:last-child, - &.card-heading-padless { - margin-bottom: 0; - } - } - - .card-text { - font: 500 14px/20px var(--base-font); - color: #646f79; - margin: 0 0 15px; - cursor: inherit; - - &:last-child { - margin-bottom: 0; - } - - &.alert { - color: #a80a2d; - font: 600 16px/18px var(--base-font); - } - } - - .card-text-link { - color: inherit; - font: inherit; - text-decoration: underline; - } - - .card-section { - display: flex; - flex-direction: column; - padding: 20px; - position: relative; - cursor: inherit; - font: 500 13px var(--base-font); - - .card-title { - font: 500 16px/30px var(--base-font); - color: #282b39; - cursor: inherit; - margin: 0 0 10px; - - &:last-child, - &:last-of-type { - margin: 0; - } - } - - .card-loading { - padding: 15px 0; - display: flex; - justify-content: center; - - .mdi { - font-size: 40px; - display: flex; - opacity: 0.5; - } - } - - .card-col { - padding: 25px; - border-right: 1px solid #d4d9dd; - - &.card-col-1 { - width: calc(100% / 6) * 1; - } - - &.card-col-2 { - width: calc(100% / 6) * 2; - } - - &.card-col-3 { - width: calc(100% / 6) * 3; - } - - &.card-col-4 { - width: calc(100% / 6) * 4; - } - - &.card-col-5 { - width: calc(100% / 6) * 5; - } - - &.card-col-6 { - width: calc(100% / 6) * 6; - } - - &:last-child { - border-right: none; - } - } - - .card-section-inner { - margin: -20px; - } - - .card-section-actions { - position: absolute; - margin-bottom: -10px; - right: 20px; - top: 25px; - z-index: 1; - - .card-section-action { - display: inline-block; - font: 500 13px/25px var(--base-font); - color: #646f79; - margin-right: 10px; - vertical-align: top; - cursor: pointer; - - .mdi { - font-size: 1.6em; - float: left; - margin-right: 3px; - } - - &:hover { - text-decoration: none; - color: #e63b3b; - - .mdi { - color: #e63b3b; - } - } - - &:last-child { - margin-right: 0; - } - } - - .card-section-action-price { - margin-right: 10px; - display: inline-block; - font: 500 16px var(--base-font); - color: #151b26; - vertical-align: top; - text-align: right; - - .old-price { - font: 500 14px var(--base-font); - color: #646f79; - display: block; - text-decoration: line-through; - } - } - - .card-section-actions-details { - .card-section-actions-label { - font: 600 11px/18px var(--base-font); - text-align: right; - color: #134478; - margin: 0 0 2px; - } - - .card-section-actions-value { - font: 500 12px/20px var(--base-font); - text-align: right; - color: #000000; - } - - &:not(:first-child) { - padding-top: 15px; - } - } - - &.card-section-actions-bottom { - top: auto; - bottom: 25px; - } - } - - .divider { - padding-top: 25px; - border-bottom: 1px solid #d4d9dd; - margin: 0 -25px 25px; - } - - &.card-section-warning { - background: #fcfaf6; - } - - &.card-section-danger { - @include bgDanger(); - } - - &.card-section-primary { - background: #f6f9fc; - } - - &.card-section-success { - background: #f7f9de; - } - - &.card-section-narrow { - padding: 15px 25px 15px; - } - - &.card-section-sm { - padding: 10px; - } - - &.card-section-padless, - &.card-section-no-padding { - padding: 0; - } - - &.card-section-no-border, - &:last-child { - border-bottom: 0; - } - } - - .card-info { - border-bottom: 1px solid var(--border-color); - padding: 10px 15px; - display: grid; - grid-template-columns: 20px 1fr; - min-height: 50px; - gap: 15px; - - .card-info-icon { - min-height: 20px; - font-size: 18px; - align-self: center; - display: flex; - justify-content: center; - } - - .card-info-details { - font: 400 13px/18px var(--base-font); - margin: 0 0 0; - display: flex; - justify-content: center; - flex-direction: column; - - strong { - font-weight: 500; - } - } - - &.card-info-dim { - background-color: #fbfbfb; - } - } - - .card-footer { - padding: 15px 20px; - - &.card-footer-warning { - background: #fcfaf6; - } - - &.card-footer-danger { - @include bgDanger(); - } - - &.card-footer-primary { - background: #f6f9fc; - } - - &.card-footer-success { - background: #f7f9de; - } - - &.card-footer-sm { - padding: 7.5px 25px; - - .card-title { - color: #646f79; - } - } - } - - &:last-child { - margin-bottom: 0; - } - - &.card-outline { - border: 1px solid var(--border-color); - } - - &.card-collapsable { - transition: background 0.4s; - - .card-header, - .card-section { - &[ng-click] { - cursor: pointer; - } - } - - &:not(.card-collapsed):hover { - background: lighten($color: #f3f4f5, $amount: 2); - } - } - - &.card-wrapped { - margin-bottom: var(--card-margin); - } - - &.card-padded { - margin-bottom: 0; - } - - &.card-bordered { - border: 1px solid var(--border-color); - } - - &.card-overflow-hidden { - overflow: hidden; - } - - &.card-no-shadow { - box-shadow: none; - } -} - -.card-block { - &.card-block-table { - margin: -20px; - } - - &.card-block-listing { - font: 500 13px/20px var(--base-font); - color: #282b39; - - span { - font: inherit; - color: inherit; - } - - .card-block-listing-label { - font: 600 11px/18px var(--base-font); - color: var(--color-primary); - margin: 0 0 2px; - } - - .card-block-listing-value { - font: inherit; - - & > .mdi { - font-size: 18px; - line-height: 18px; - vertical-align: bottom; - color: var(--color-primary); - margin: 0 5px; - transition: 0.32s; - - &:hover { - color: var(--color-primary-light); - } - } - } - - .card-block-listing-row { - margin: 0 0 15px; - - &:last-child { - margin-bottom: 0; - } - } - - &.card-block-listing-variant { - display: inline-block; - font-size: 14px; - color: #282b39; - - .card-block-listing-label { - color: var(--color-primary); - font: 500 11px/20px var(--base-font); - } - } - - &.card-block-listing-inline { - display: inline-block; - padding-bottom: 10px; - padding-right: 20px; - - &:last-child, - &:last-of-type { - padding-right: 0; - padding-bottom: 0; - } - } - - &.card-block-listing-no-pad { - padding-bottom: 0; - } - } - - &.card-block-keyvalue { - margin-bottom: 10px; - @include cf(); - - .keyvalue-item { - padding-bottom: 10px; - @include cf(); - - .keyvalue-key { - float: left; - color: var(--color-primary); - font: 500 13px/20px var(--base-font); - width: 180px; - padding-right: 20px; - } - - .keyvalue-value { - float: left; - color: #282b39; - font: 500 13px/20px var(--base-font); - width: calc(100% - 210px); - display: flex; - align-items: center; - gap: 10px; - - .block-form_tooltip { - vertical-align: middle; - margin-top: -2px; - - &:not(:first-child) { - margin-left: 5px; - } - - &:not(:last-child) { - margin-right: 5px; - } - } - - .icon { - margin-left: 7px; - } - - .form-numeric { - margin-top: -5px; - } - - .keyvalue-value-info-block-toggle { - color: #134478; - font: 600 12px / 18px var(--base-font); - display: flex; - align-items: center; - cursor: pointer; - - .mdi { - color: #646f79; - font-size: 20px; - } - - &.keyvalue-value-info-block-toggle-secondary { - .mdi { - color: #134478; - font-size: 16px; - } - - &.active { - .mdi { - color: #009ef4; - } - } - } - - &:hover { - color: #426993; - } - } - - .keyvalue-value-history { - display: flex; - flex-direction: column; - width: 100%; - gap: 5px; - - .keyvalue-value-history-header { - display: flex; - flex-direction: row; - gap: 8px; - - .keyvalue-value-history-toggle { - font: 600 12px/20px var(--base-font); - display: flex; - flex-direction: row; - gap: 0; - color: #646f79; - cursor: pointer; - - .mdi { - height: 20px; - line-height: 20px; - font-size: 20px; - } - - &:hover { - color: var(--color-primary); - } - } - } - - .keyvalue-value-history-body { - background: #f7f9fc; - border-radius: var(--border-radius); - border: 1px solid var(--border-color); - padding: 5px 15px; - max-height: 350px; - overflow: auto; - @include webkit_scrollbar(); - - .keyvalue-value-history-body-item { - display: flex; - flex-direction: row; - gap: 5px; - padding: 6px 0; - font: 500 12px/20px var(--base-font); - border-bottom: 1px solid var(--border-color); - word-break: break-word; - color: #646f79; - - strong { - color: #000; - display: contents; - } - - &:last-child { - border-bottom: none; - } - } - } - } - - &.keyvalue-value-gap-sm { - gap: 5px; - } - } - - .keyvalue-link { - color: #009ef4; - font: 500 13px/20px var(--base-font); - margin-left: 5px; - display: inline-block; - - .mdi { - font-size: 1.5; - } - } - - &:last-child, - &:last-of-type { - padding-bottom: 0; - } - - &.keyvalue-item-disabled { - pointer-events: none; - cursor: default; - } - } - - .keyvalue-item-info-block { - background: #fbfbfb; - padding: 15px 20px; - margin: 0 -20px 10px -20px; - border-top: 1px solid #d4d9dd; - border-bottom: 1px solid #d4d9dd; - - ul { - li { - display: flex; - gap: 10px; - font: 500 12px / 18px var(--base-font); - color: #151b26; - margin-bottom: 10px; - - .mdi { - font-size: 14px; - color: #134478; - } - - &:last-child { - margin-bottom: 0; - } - } - } - } - - &:not(.card-block-keyvalue-horizontal) { - .keyvalue-item { - width: 100%; - } - } - - &.card-block-keyvalue-horizontal { - .keyvalue-item { - padding-bottom: 0; - position: relative; - margin: -5px 0 -5px; - - .keyvalue-key { - font: 500 13px var(--base-font); - color: #646f79; - width: 100%; - margin-bottom: 10px; - display: block; - } - - .keyvalue-value { - font: 500 16px var(--base-font); - color: #282b39; - width: 100%; - display: block; - } - - &.keyvalue-item-narrow { - &:not(:first-child) { - padding-left: 10px; - padding-right: 10px; - } - } - - &:not(:first-child) { - padding-left: 30px; - padding-right: 30px; - } - - &:not(:last-child):not(:last-of-type) { - .keyvalue-key { - &:after { - content: ''; - display: block; - top: 10px; - bottom: 10px; - width: 1px; - right: 1px; - background: #d4d9dd; - position: absolute; - } - } - } - } - } - - &.card-block-keyvalue-bordered { - border-bottom: 1px solid #d4d9dd; - padding-bottom: 14px; - margin-bottom: 14px; - } - - &.card-block-keyvalue-md { - .keyvalue-item { - .keyvalue-key { - width: 240px; - } - - .keyvalue-value { - width: calc(100% - 240px); - } - } - } - - &.card-block-keyvalue-lg { - .keyvalue-item { - .keyvalue-key { - width: 280px; - } - - .keyvalue-value { - width: calc(100% - 280px); - } - } - } - - &.card-block-keyvalue-text-sm { - .keyvalue-item { - padding: 0 0 4px; - - .keyvalue-key { - font: 600 12px/20px var(--base-font); - } - - .keyvalue-value { - font: 500 12px/20px var(--base-font); - } - - &:last-child { - padding: 0 0 0; - } - } - } - - &:last-child { - margin-bottom: 0; - } - } - - &.card-block-fund { - padding-top: 15px; - - .fund-img { - float: left; - display: block; - width: 70px; - height: 70px; - border: 1px solid #e7e7e7; - border-radius: 70px; - overflow: hidden; - margin-top: -15px; - margin-right: 15px; - - img { - width: 100%; - display: block; - } - } - - .fund-closed { - position: absolute; - top: 20px; - right: 20px; - font: 500 14px/18px var(--base-font); - } - - .fund-title { - cursor: default; - display: inline-block; - font: 500 16px/20px var(--base-font); - color: #151b26; - transition: 0.4s; - clear: both; - position: relative; - border-bottom: 1px solid transparent; - } - - a.fund-title { - cursor: pointer; - - &:hover { - color: #9ca6af; - border-bottom-color: #9ca6af; - text-decoration: none; - } - } - - .fund-organization { - display: inline-block; - font: 500 14px/20px var(--base-font); - color: #009ef4; - margin-bottom: 10px; - clear: both; - text-decoration: none; - } - - &.card-block-fund-margin-bottom { - margin-bottom: 20px; - } - } - - &.card-block-provider { - display: flex; - gap: 20px; - flex-direction: row; - padding-bottom: 20px; - - .provider-offset { - float: left; - display: block; - width: 70px; - } - - .provider-img { - float: left; - display: block; - width: 50px; - height: 50px; - flex: 0 0 50px; - border: 1px solid #e7e7e7; - border-radius: var(--border-radius); - overflow: hidden; - background-color: #f1f4f7; - - img { - width: 100%; - display: block; - } - } - - .provider-details { - flex: 1 1 auto; - display: flex; - flex-direction: column; - justify-content: center; - min-width: 0; - gap: 4px; - - .provider-title { - display: block; - font: 500 16px/20px var(--base-font); - color: #151b26; - transition: 0.4s; - position: relative; - cursor: default; - word-wrap: break-word; - } - - .provider-subtitle { - font: 500 12px/16px var(--base-font); - color: #646f79; - word-wrap: break-word; - } - } - - .provider-actions { - display: flex; - flex-direction: row; - flex: 0 0 auto; - height: fit-content; - } - - a.provider-title:hover { - cursor: pointer; - color: #9ca6af; - text-decoration: none; - } - - &:last-child { - padding-bottom: 0; - } - } - - &.card-block-product { - .product-img { - width: 200px; - float: left; - - img { - display: block; - min-height: 160px; - width: 100%; - margin: -25px 20px -25px -25px; - } - } - - .product-details { - display: inline-block; - } - - .product-title, - .product-subtitle { - display: block; - } - - .product-title { - font: 500 16px/22px var(--base-font); - color: #151b26; - } - - .product-subtitle { - font: 400 14px var(--base-font); - color: #646f79; - margin-bottom: 10px; - } - } - - &.card-block-notes { - margin: -20px; - - .note-form { - padding: 15px 15px 15px 55px; - - .note-form-actions { - padding-top: 10px; - @include cf(); - - .note-form-desc { - float: left; - width: 50%; - } - - .note-form-buttons { - text-align: right; - float: right; - width: 50%; - } - } - } - - .note-item { - position: relative; - padding: 15px 55px; - border-bottom: 1px solid #d4d9dd; - background: #fff; - transition: 0.4s; - cursor: default; - - .hover-actions { - position: absolute; - right: 20px; - top: 10px; - } - - &:last-child { - border-bottom: 1px solid transparent; - } - - &:hover { - background: #f6f8f9; - } - } - - .note-item-icon { - position: absolute; - left: 25px; - top: 20px; - width: 16px; - height: 16px; - } - - .note-item-text { - color: #282b39; - font: 500 13px/18px var(--base-font); - } - - .note-item-sign { - color: #646f79; - font: 500 12px/18px var(--base-font); - - .mdi { - font-size: 5px; - margin-left: 5px; - margin-right: 5px; - color: #d4d9dd; - } - } - } - - &.card-block-download-app { - width: 980px; - max-width: 100%; - - .download-links { - padding: 20px 0 10px; - display: flex; - @include cf(); - - .download-link { - border: 1px dashed #d2e6ff; - border-radius: var(--border-radius); - position: relative; - display: block; - margin-bottom: 25px; - width: 50%; - float: left; - margin-right: 20px; - padding-left: 150px; - overflow: hidden; - transition: all 0.4s; - - .download-link-icon { - display: block; - border-radius: 100px; - width: 200px; - height: 200px; - position: absolute; - padding: 15px 10px 15px 25px; - right: 100%; - margin-right: -130px; - top: 50%; - transform: translate(0, -50%); - background-color: #f2fafd; - background-repeat: no-repeat; - background-position: calc(100% - 40px) 50%; - } - - .download-link-title { - padding: 30px 0; - font: 700 18px/28px var(--base-font); - color: #282b39; - - .download-link-arrow { - display: inline-block; - font-size: 1.2em; - line-height: inherit; - color: #4568d6; - position: absolute; - transform: translate(0); - transition: transform 0.4s; - margin-left: 5px; - } - } - - &:hover { - transform: translate(0, -3px); - box-shadow: 0 5px 35px rgba(0, 0, 0, 0.1); - - .download-link-arrow { - transform: translate(3px); - } - } - - &:last-of-type { - margin-right: 0; - } - - &.download-link-android { - .download-link-icon { - background-color: #f9fbf0; - } - } - } - } - - .download-url { - border: 1px dashed #d2e6ff; - border-radius: var(--border-radius); - padding: 13px; - width: 320px; - margin: 0 auto 25px; - font: 700 13px/22px var(--base-font); - color: var(--text-color); - max-width: 100%; - cursor: default; - - .download-url-address { - color: #305dfb; - } - } - - .download-confirmation { - border: 1px dashed #d2e6ff; - margin-bottom: 20px; - border-radius: var(--border-radius); - padding: 13px; - display: block; - cursor: pointer; - - .checkbox { - display: inline-block; - padding: 0 15px 0 30px; - vertical-align: middle; - - input[type='checkbox'] { - display: none; - - &:checked + .checkbox-label { - .checkbox-box { - border-color: #305dfb; - background-color: #305dfb; - - .mdi { - opacity: 1; - } - } - } - } - - .checkbox-label { - font: 700 13px/22px var(--base-font); - color: #305dfb; - display: inline-block; - vertical-align: middle; - text-transform: uppercase; - margin: 0; - cursor: pointer; - - .checkbox-box { - display: block; - width: 22px; - height: 22px; - min-width: 22px; - min-height: 22px; - border: 2px solid #d2e6ff; - border-radius: 50%; - position: relative; - margin-right: 5px; - margin-left: -30px; - float: left; - transition: 0.4s; - - .mdi { - color: #fff; - position: absolute; - left: 50%; - top: 50%; - transform: translate(-50%, -50%); - font-size: 16px; - transition: 0.4s; - opacity: 0; - font-weight: bold; - } - } - } - } - } - } - - &.card-block-login { - .login-title { - font: 700 22px var(--base-font); - color: #282b39; - margin-bottom: 15px; - } - - .login-description { - font: 400 16px/25px var(--base-font); - color: #646f79; - margin-bottom: 15px; - } - - .login-qrcode { - float: left; - margin-right: 25px; - width: 200px; - height: 200px; - - .block-qr-code { - width: 100%; - - .qr_code { - width: 100%; - height: auto; - box-shadow: none; - } - } - } - } - - &.card-block-pincode { - text-align: center; - margin: 0 auto 20px; - - .pincode-title { - font: 700 22px/36px var(--base-font); - color: #282b39; - } - - .pincode-subtitle { - font: 400 16px/28px var(--base-font); - color: #646f79; - margin-bottom: 30px; - } - - .pincode-errors { - .form-error { - color: #e63b3b; - font: 400 13px/24px var(--base-font); - - &:first-of-type { - padding-top: 20px; - } - } - } - } - - &.card-block-financial { - .table { - .table-separator { - border-bottom: 2px solid #d4d9dd; - } - - .table-highlight td { - background: #f6f6f6; - font-weight: 600; - } - - .table-highlight-grey td { - background: #f6f6f6ad; - } - - tr { - &.table-totals { - white-space: nowrap; - border-top: 3px solid #134478; - - td { - font-weight: 600; - } - } - } - } - } - - &.card-block-bank { - display: flex; - margin: -20px; - border-radius: inherit; - - .card-block-bank-media { - display: flex; - width: 140px; - border-top-left-radius: inherit; - border-bottom-left-radius: inherit; - overflow: hidden; - border-right: 1px solid var(--border-color); - - img { - width: 140px; - height: 140px; - overflow: hidden; - background-color: #f9fafa; - } - } - - .card-block-bank-details { - display: flex; - flex-direction: column; - justify-content: flex-start; - flex-grow: 1; - padding: 20px 25px; - - .card-block-bank-name { - font: 700 18px/30px var(--base-font); - margin: 0 0 15px; - } - - .card-block-bank-properties { - display: flex; - flex-direction: row; - - .card-block-bank-property { - display: flex; - flex-direction: column; - padding-right: 30px; - - .card-block-bank-property-label { - font: 600 13px/22px var(--base-font); - color: #134478; - } - - .card-block-bank-property-value { - font: 600 16px/26px var(--base-font); - - &.card-block-bank-property-value-link { - transition: 0.4s; - cursor: pointer; - - .mdi { - transition: 0.4s; - font-size: inherit; - color: var(--color-primary); - margin-left: 2.5px; - line-height: inherit; - font-size: 18px; - } - - &:hover { - color: var(--color-primary); - } - } - } - } - } - } - } - - &.card-block-request-record { - .card-header { - .card-title { - margin-bottom: 0; - } - } - - .block-label-tabs { - margin-bottom: 10px; - } - - .table { - tr { - td { - &.collapse-content { - padding: 15px 20px; - } - - .card { - border: 1px solid var(--border-color); - overflow: hidden; - box-shadow: none; - } - } - } - } - } - - &.card-block-schedule { - display: flex; - flex-direction: column; - margin-top: -5px; - gap: 10px; - - .card-block-schedule-title { - font: 600 14px/24px var(--base-font); - } - } -} - -.block { - &.block-error_404 { - width: 100%; - padding: 0 30px; - text-align: center; - - .error_404-icon { - img { - display: block; - width: 100px; - height: 100px; - border-radius: 100px; - margin: 0 auto 20px; - background: #fff; - padding: 20px; - box-shadow: 0 5px 10px rgba(#000, 0.15); - } - } - - .error_404-title { - font: 600 16px/20px var(--base-font); - margin: 0 0 10px; - } - - .error_404-subtitle { - font: 500 14px/20px var(--base-font); - margin: 0 0 10px; - color: #646f79; - } - } - - &.block-form_tooltip { - position: relative; - display: inline-block; - padding-right: 15px; - vertical-align: text-bottom; - - .tooltip-icon { - width: 24px; - height: 24px; - font-size: 24px; - line-height: 24px; - color: #2987fd; - cursor: pointer; - } - - .tooltip { - position: absolute; - width: 300px; - border: 1px solid var(--border-color); - box-shadow: 0 4px 25px rgba(0, 0, 0, 0.1); - padding: 15px; - background: #fff; - z-index: 5; - border-radius: var(--border-radius); - font: 500 13px/20px var(--base-font); - text-transform: none; - color: #45535e; - display: none; - - ul { - list-style-type: disc; - list-style-position: inside; - - li { - font: 400 13px/20px var(--base-font); - } - - strong { - font-weight: 500; - } - } - - &:not(.tooltip-bottom) { - left: 100%; - top: 12px; - transform: translate(0, -50%); - - &:after, - &:before { - right: 100%; - top: 50%; - border: solid transparent; - content: ' '; - height: 0; - width: 0; - position: absolute; - pointer-events: none; - } - - &:after { - border-color: rgba(255, 255, 255, 0); - border-right-color: #fff; - border-width: 10px; - margin-top: -10px; - } - - &:before { - border-color: rgba(210, 230, 255, 0); - border-right-color: #d2e6ff; - border-width: 11px; - margin-top: -11px; - } - } - - &.tooltip-bottom { - top: 100%; - left: 8px; - margin-top: 10px; - transform: translate(-50%, 0); - - &:before, - &:after { - content: ''; - left: 50%; - transform: translate(-50%); - position: absolute; - top: -10px; - display: inline-block; - width: 0; - height: 0; - border-style: solid; - border-width: 0 10px 10px 10px; - border-color: transparent transparent #ffffff transparent; - } - - &:before { - top: -11.5px; - border-color: transparent transparent var(--border-color) transparent; - } - } - } - - &:hover { - .tooltip { - display: block; - } - } - - @media screen and (max-width: 1000px) { - .tooltip { - left: 0; - width: 250px; - } - } - } - - &.block-sign_up { - --paginator-button-active-background: #305dfb; - - .card-header { - padding-top: 0; - margin: 10px 0 15px; - position: relative; - - &:not(.card-header-no-line) { - padding-top: 30px; - - &:before { - content: ''; - position: absolute; - top: 0; - border-top: 1px solid #dbdcdb; - width: calc(100% + 80px); - left: -40px; - } - } - - & > .flex { - align-items: center; - gap: 10px; - } - - .card-title { - display: flex; - align-items: center; - - span { - &:first-child { - font-style: normal; - font-weight: 700; - font-size: 18px; - line-height: 27px; - margin-right: 10px; - } - - &.total-count { - padding: 8px 10px; - height: 32px; - border: 1px solid #315efd; - border-radius: 7px; - color: #315efd; - font-style: normal; - font-weight: 500; - font-size: 16px; - line-height: 16px; - } - } - } - - .block.block-inline-filters .button { - height: 36px; - font-weight: 700; - font-size: 13px; - line-height: 18px; - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - padding: 9px 12px; - - &.button-secondary { - border: 1px solid #dbdcdb; - - &:hover { - border-color: var(--color-primary); - } - } - } - } - - .sign_up-pane { - .block-photo-selector { - max-width: 200px; - - .button { - font-size: 12px; - width: 100%; - padding: 10px 5px; - margin: 0 0 15px; - } - } - - .sign_up-pane-header { - font-style: normal; - font-weight: 500; - font-size: 21px; - line-height: 30px; - } - - .sign_up-heading-block { - font: 400 18px/22px var(--base-font); - padding: 30px 40px; - font-style: normal; - color: #222530; - border-bottom: 1px solid #edeef0; - } - - .sign_up-pane-body { - padding: 30px 40px; - - .sign_up-pane-subtitle { - text-align: center; - font: 400 26px/36px var(--base-font); - color: #3561ff; - margin-top: 25px; - } - - & + .sign_up-pane-body { - border-top: 1px solid #edeef0; - } - } - - .sign_up-pane-footer { - .button { - &.button-text { - font-weight: 500; - font-size: 16px; - color: #3561ff; - line-height: 30px; - - .mdi { - color: #3561ff; - width: 36px; - font-size: 34px; - } - } - } - } - - .app-download-notice { - font: 400 13px/27px var(--base-font); - color: #222530; - margin-top: 15px; - - a { - color: blue; - text-decoration: underline; - font-weight: 500; - } - } - - .sign_up-pane-auth { - &.test-qr { - margin-top: 30px; - justify-content: space-around; - } - - .sign_up-pane-auth-content { - .block-app_links { - margin-top: 26px; - } - - .notice-small { - font: 400 13px/27px var(--base-font); - color: #989898; - margin-top: 25px; - } - } - - .sign_up-pane-auth-qr_code { - .qr_code { - width: 228px !important; - height: 228px !important; - } - } - } - - ul { - li { - font: inherit; - background-image: assetUrl('img/icon-list.svg'); - background-repeat: no-repeat; - line-height: 30px; - padding-left: 50px; - font-weight: 400; - } - } - } - - .sign_up-offices { - display: flex; - flex-direction: column; - border-bottom: 1px solid #edeef0; - - .sign_up-office { - display: flex; - flex-direction: row; - padding: 30px 0 30px 30px; - border-bottom: 1px solid var(--border-color); - - .office-media { - padding-left: 10px; - - img { - width: 80px; - display: block; - border-radius: var(--border-radius); - } - - &.office-media-placeholder { - img { - border: 1px solid var(--border-color); - } - } - } - - .office-contacts { - padding-left: 40px; - display: flex; - flex-direction: column; - flex-grow: 1; - - .office-contact { - font: 400 16px/20px var(--base-font); - margin: 0 0 15px; - color: #222530; - - span { - font: inherit; - color: inherit; - } - - .mdi { - color: #9ea7b6; - float: left; - width: 20px; - font-size: 18px; - margin-right: 3px; - margin-left: -25px; - padding-right: 3px; - text-align: right; - } - - &:last-child { - margin-bottom: 0; - } - } - } - - .office-map { - display: flex; - flex-direction: column; - margin: -30px 0; - - .office-map-content { - border: 1px solid var(--border-color); - border-top: none; - border-right: none; - margin: 0 0 10px; - width: 270px; - height: 180px; - position: relative; - - .map { - @include fill_parent(); - - .map-canvas { - @include fill_parent(); - } - } - } - - .office-actions { - display: flex; - flex-direction: row; - margin: 0 0 10px; - - .office-action { - display: flex; - flex-direction: row; - flex-grow: 1; - color: #9ea7b6; - font: 400 13px var(--base-font); - - .mdi { - margin-right: 3px; - float: left; - } - } - } - } - - &:last-child { - border-bottom: none; - } - } - - .block-schedule-editor { - .schedule-editor-heading { - font: 500 21px/27px var(--base-font); - margin: 0 0 15px; - - &.schedule-editor-heading-lg { - font: 500 28px/36px var(--base-font); - } - } - } - - .form { - .form-group { - &.col { - padding-right: 0; - } - } - - .office-block { - margin-left: 0; - margin-right: 0; - padding-left: 20px; - padding-right: 20px; - border-bottom: 1px solid #eff2f4; - } - - .schedule-settings-block, - .schedule-block { - margin-left: 0; - margin-right: 0; - padding-left: 35px; - padding-right: 35px; - border-bottom: 1px solid #eff2f4; - } - - .description { - margin-left: 0; - margin-right: 0; - padding-left: 40px; - padding-right: 40px; - font: 400 16px/24px var(--base-font); - color: #222530; - border-bottom: 1px solid #eff2f4; - } - - .schedule { - th { - font: 600 13px/16px var(--base-font); - letter-spacing: 0.08px; - text-transform: uppercase; - color: #222530; - text-align: left; - } - - td { - padding-right: 22px; - height: 30px; - font: 400 16px/20px var(--base-font); - color: #222530; - - &.weekend { - color: #f15642; - } - - span { - font: 400 16px/20px var(--base-font); - } - } - - th, - td { - &.breaks { - text-align: center; - } - } - - td { - &.breaks { - padding-left: 40px; - } - } - - .ui-control { - &.ui-control-text { - width: 80px; - height: 30px; - - input { - height: 30px; - border-radius: 6px; - } - } - - &.breaks { - display: table-cell; - - &.end { - input { - margin-right: 0; - } - } - - input { - width: 80px; - margin-right: 22px; - } - } - - .ui-control-clear { - display: none; - } - } - } - - .opening { - .ui-control.ui-control-checkbox { - .ui-checkbox-label { - padding-bottom: 0; - font-size: 16px; - } - } - - .sign_up-pane-text { - font-weight: 500; - font-size: 21px; - line-height: 26px; - } - - .form-group { - &.col { - margin-bottom: 5px; - } - } - - .sync { - padding-bottom: 0; - } - } - } - - &:last-child { - border-bottom: none; - } - } - - .sign_up-employees { - display: flex; - flex-direction: column; - margin: 0 0 30px; - - .sign_up-employee { - font: 600 16px/30px var(--base-font); - width: fit-content; - display: flex; - flex-direction: row; - color: #222530; - margin: 0 0 5px; - - .sign_up-employee-actions { - padding-left: 20px; - display: flex; - flex-direction: row; - - .mdi { - margin-left: 5px; - color: #9ea7b6; - font-size: 18px; - float: left; - line-height: 28px; - } - } - } - } - - .finish-screen { - .sign_up-pane-heading { - font: 500 28px/38px var(--base-font) !important; - line-height: 38px; - text-align: center; - color: #3561ff; - margin-top: 0 !important; - } - - .sign_up-pane-text { - padding-left: 50px; - padding-right: 50px; - } - } - - .fund-apply { - .header { - margin-bottom: 30px !important; - } - - .card { - box-shadow: none; - margin-bottom: 15px; - border: 1px solid #e5e6ec; - border-radius: var(--border-radius); - - .card-section { - background: #fff; - padding: 16px 18px; - - .card-block { - &.card-block-fund { - padding-top: 0; - display: flex; - - .fund-img { - margin: 0 10px auto 0; - padding: 0; - width: 50px; - height: 50px; - min-width: 50px; - } - - .fund-details { - padding-right: 140px; - - .fund-title { - display: block; - font: 500 18px/24px var(--base-font); - margin: 0 0 5px; - color: #191a1c; - } - - .fund-organization { - display: block; - font: 400 14px/18px var(--base-font); - color: #222530; - margin: 0 0; - } - } - } - } - - &.card-section-fund { - display: flex; - align-items: center; - - .card-section-actions { - right: 16px; - top: 16px; - - .button { - white-space: nowrap; - font: 700 12px/12px var(--base-font); - padding: 12px; - - &:focus { - outline: none; - box-shadow: none; - } - } - } - - &.applied { - background-color: #f8f4e7; - cursor: default; - pointer-events: none; - - .card-section-actions { - button { - background-color: rgba(255, 255, 255, 0.5); - color: #0f0f0f; - border-color: #c2c2c2; - } - } - - .card-block { - &.card-block-fund { - .fund-organization { - color: #4b4b4b; - } - - .fund-title { - color: #4b4b4b; - } - } - } - } - - &.selected { - background: #f8fbf7; - } - } - - &.card-section-primary { - padding: 0; - } - } - - &:last-child { - margin-bottom: 0; - } - } - } - - .form { - .ui-control .form-control:not([type='radio']):not([type='checkbox']) { - background-color: #eff2f4; - border-color: #eff2f4; - padding: 4px 15px; - - ::placeholder { - color: #9b9b9b; - opacity: 1; - } - } - - .ui-control { - &.ui-control-checkbox { - .ui-checkbox-label { - color: #222530; - font-size: 14px; - line-height: 17px; - font-weight: normal; - } - } - } - - .employee-info { - display: block; - padding-top: 30px; - padding-left: 20px; - font: 500 16px/20px var(--base-font); - - .details { - display: inline-block; - width: 200px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - - .actions { - display: inline-block; - - .mdi { - padding-right: 20px; - cursor: pointer; - color: #888888; - font-size: 22px; - } - } - } - - .select-control-input { - .select-control-search { - background-color: #eff2f4; - border-color: #eff2f4; - height: 50px; - font: 400 13px/24px var(--base-font) !important; - } - - .select-control-option { - background-color: #eff2f4; - border-color: #eff2f4; - border-bottom: 1px solid #e3e3e3; - } - - .select-control-options { - border: none; - } - } - - .form-label { - color: #7e818c; - font-weight: normal; - font-size: 13px; - line-height: 16px; - padding-left: 10px; - - letter-spacing: 0.08px; - } - - .block.block-photo-selector { - margin-bottom: 0; - - .photo-img { - margin-left: auto; - margin-right: auto; - float: none; - margin-bottom: 15px; - background: #eff2f4; - border: none; - border-radius: 8px; - display: block; - } - - .photo-label { - text-align: center; - font-weight: normal; - font-size: 18px; - line-height: 26px; - color: #222530; - } - - .photo-description { - text-align: center; - color: #9ea7b6; - font: 400 13px/18px var(--base-font); - } - } - - .info-block.info-block-primary { - color: #646f79; - font: 400 11px/16px var(--base-font); - padding: 17.5px; - text-align: center; - background: none; - border: none; - } - } - - .sign_up-organizations { - display: flex; - flex-direction: column; - margin: 0 0 20px; - - .sign_up-organization { - width: 100%; - border: 1px solid #ebedf0; - border-radius: var(--border-radius); - margin: 0 0 20px; - padding: 15px; - display: flex; - flex-direction: row; - transition: 0.4s ease; - - .sign_up-organization-logo { - width: 80px; - height: 80px; - flex-direction: column; - justify-content: center; - - img { - border-radius: 15px; - max-width: 80px; - margin: 0 auto; - padding: 5px; - } - } - - .sign_up-organization-title { - display: flex; - flex-grow: 1; - flex-direction: column; - text-align: center; - justify-content: center; - font: 500 16px/24px var(--base-font); - } - - &:hover { - border-color: #3561ff; - color: #3561ff; - } - - &:last-child { - margin-bottom: 0; - } - } - - &:last-child { - margin-bottom: 0; - } - } - - @media (max-width: 1199px) { - .card-header { - margin: 25px 0 15px; - } - } - - @media (max-width: 991px) { - .card-header { - &:before { - width: calc(100% + 40px); - left: -20px; - } - - & > .flex { - flex-direction: column; - } - } - - .block-title { - margin: 0 0 20px; - font: 500 28px/34px var(--base-font); - } - - .block-pincode { - text-align: left; - width: 100% !important; - - .pincode-number { - align-items: start !important; - height: 31px !important; - width: 38px !important; - margin-right: 3px !important; - font: 400 22px/31px var(--base-font) !important; - } - } - - .fund-apply { - .card { - .card-section.card-section-fund { - .card-block.card-block-fund { - .fund-details { - padding-right: 0; - - .fund-title { - font: 500 15px/24px var(--base-font); - } - } - } - - .card-section-actions { - padding-top: 15px; - } - } - } - } - - .sign_up-employees { - .sign_up-employee { - width: 100%; - - span { - display: flex; - flex-grow: 1; - } - } - } - - .sign_up-header { - margin: 0 -10px 25px; - } - - .sign_up-pane { - .block-title { - margin: 0 0 20px; - } - - .sign_up-pane-header { - font: 500 18px/26px var(--base-font); - } - - .sign_up-offices { - .sign_up-office { - flex-wrap: wrap; - padding: 20px 0 30px; - - .office-media { - order: 1; - padding-right: 15px; - - &.office-media-placeholder { - img { - height: 70px; - width: 70px; - } - } - } - - .office-contacts { - width: 60%; - - .office-contact { - margin: 0 0 5px; - font: 400 15px/20px var(--base-font); - } - } - - .office-map { - order: 2; - margin-top: 20px; - width: 100%; - - .office-map-content { - width: 100%; - } - - .office-actions { - padding-left: 50px; - } - } - } - - &:last-child { - border-bottom: 1px solid #edeef0; - } - } - - .sign_up-pane-body { - padding: 20px; - - .sign_up-pane-subtitle { - font: 400 24px/30px var(--base-font); - } - - .sign_up-office-edit { - border-bottom: none; - - .sign_up-pane-section { - border-bottom: none; - } - - .schedule { - border-collapse: collapse; - - td { - display: inline-block; - padding-right: 10px; - - &.breaks { - padding-left: 0; - } - } - - tr { - margin-bottom: 10px; - - &:first-child { - border-top: none; - } - } - - .schedule-day-name { - width: 100px; - margin-top: 10px; - padding-top: 5px; - } - - .schedule-day-available { - width: 60%; - } - - .time { - input { - font: 400 14px/20px var(--base-font); - } - } - - .ui-control { - &.ui-control-checkbox { - padding-right: 5px; - } - - &.ui-control-text { - width: 62px !important; - height: 30px !important; - - input { - padding: 4px 10px; - } - } - - &.breaks { - input { - margin-right: 10px; - width: 60px; - } - } - } - } - - .office-edit-actions { - .sign_up-pane-col { - border-top: none; - } - - .flex-row { - flex-direction: column; - - .flex-col { - margin-top: 12px; - - &:first-child { - margin-top: 0; - } - } - } - } - } - - .card-section-fund { - padding: 20px 20px 30px; - - .card-block { - &.card-block-fund { - padding-bottom: 20px; - - .fund-title { - font: 500 16px/26px var(--base-font); - margin: 0 0 0; - } - - .fund-organization { - font: 400 13px/16px var(--base-font); - margin: 0 0 10px; - } - } - } - } - } - - .sign_up-pane-footer { - padding: 10px 15px; - - .button { - font: 500 14px/16px var(--base-font) !important; - - .mdi { - width: auto !important; - font-size: 20px !important; - - &.icon-right, - &.icon-left { - margin-right: 0; - } - } - } - } - } - - .sign_up-organizations { - .sign_up-organization { - padding: 10px; - margin-bottom: 15px; - - .sign_up-organization-logo { - width: 36px; - height: 36px; - - img { - height: 100%; - } - } - - .sign_up-organization-title { - font: 500 16px/20px var(--base-font); - padding-left: 15px; - text-align: left; - } - } - } - } - } - - &.block-pdf-preview { - background: #242424; - display: flex; - flex-wrap: wrap; - - canvas { - display: block; - margin: 0 auto; - } - } - - &.block-tooltip-details { - position: relative; - - .tooltip-content { - font: 500 13px/20px var(--base-font); - display: none; - padding: 8px 15px; - background: #fff; - box-shadow: 2.5px 5px 10px rgba($color: #000000, $alpha: 0.1); - border: 1px solid var(--border-color); - border-radius: var(--border-radius); - position: absolute; - left: 100%; - margin-left: 10px; - top: 50%; - width: 450px; - max-width: calc(100vw - 100px); - transform: translate(0, -50%); - z-index: 1; - color: #151b26; - cursor: default; - white-space: normal; - - .tooltip-header { - font: 600 15px/28px var(--base-font); - color: inherit; - margin: 0 0 10px; - } - - .tooltip-heading { - font: 700 1.1em/1.5em var(--base-font); - color: inherit; - margin: 0 0; - } - - .tooltip-text { - font: inherit; - color: inherit; - margin: 0 0 10px; - } - - .tooltip-list { - .tooltip-list-item { - color: #151b26; - font: 500 13px/20px var(--base-font); - margin: 0 0 5px; - - .mdi { - line-height: 20px; - color: var(--color-primary); - float: left; - margin: 0 5px 0 0; - } - - &:last-child { - margin-bottom: 0; - } - } - } - - .tooltip-text, - .tooltip-list, - .tooltip-header { - &:last-child { - margin-bottom: 0; - } - } - - &:after, - &:before { - content: ''; - display: block; - width: 0; - height: 0; - border-style: solid; - border-width: 7.5px 10px 7.5px 0; - border-color: transparent #ffffff transparent transparent; - position: absolute; - right: 100%; - top: 50%; - transform: translate(0, -50%); - } - - &:before { - transform: translate(0, -50%); - border-width: 8.5px 12px 8.5px 0; - border-color: transparent var(--border-color) transparent transparent; - } - - &.tooltip-content-left { - left: auto; - right: 100%; - margin-left: 0; - margin-right: 10px; - - &:after, - &:before { - right: auto; - left: 100%; - transform: rotate(180deg) translate(0, 50%); - } - } - - &.tooltip-content-bottom { - top: 100%; - left: 50%; - transform: translate(-50%); - margin-left: 0; - margin-right: 0; - margin-top: 7.5px; - - &:before, - &::after { - display: none; - } - - .triangle { - position: absolute; - top: -10px; - left: 0; - width: 100%; - bottom: 100%; - margin: auto; - - &:before, - &:after { - content: ''; - position: absolute; - top: 0; - left: 50%; - bottom: 100%; - width: 0; - height: 0; - border-style: solid; - border-width: 0 10px 10px 10px; - border-color: transparent transparent var(--border-color) transparent; - transform: rotate(0deg) translate(-50%); - z-index: 1; - } - - &:before { - z-index: 2; - margin-top: 2px; - border-color: transparent transparent #ffffff transparent; - } - } - } - - &.tooltip-content-fit { - width: fit-content; - } - - &.tooltip-content-compact { - padding: 10px 15px; - } - - &.tooltip-content-ghost { - pointer-events: none; - } - } - - &.block-tooltip-details-inline { - font-size: 20px; - color: var(--color-primary); - height: inherit; - line-height: inherit; - display: inline-flex; - margin-left: 5px; - } - - &.block-tooltip-hover:hover, - &.active { - .tooltip-content { - display: block; - } - } - } - - &.block-info { - color: #646f79; - font: 400 11px/16px var(--base-font); - border: 1px dashed #d4d9dd; - padding: 17.5px; - border-radius: var(--border-radius); - - &.block-info-primary { - background-color: #f7f9fc; - } - } - - &.block-empty { - cursor: default; - - .empty-icon { - display: flex; - flex-direction: row; - justify-content: center; - margin-bottom: 10px; - - .empty-icon-img { - width: 50px; - height: 50px; - display: flex; - border: 1px solid transparent; - border-radius: 50px; - align-items: center; - - &.empty-icon-img-border { - border-color: var(--border-color-light); - } - } - } - - .empty-title { - font: 700 16px/28px var(--base-font); - margin: 0; - } - - .empty-details { - font: 500 14px/24px var(--base-font); - margin: 0; - - &:last-child { - margin-bottom: 0; - } - } - - .empty-actions { - font: 500 14px var(--base-font); - display: flex; - padding: 15px 0 0; - justify-content: center; - } - } - - &.block-qr-code { - .qr_code { - width: 280px; - height: 280px; - padding: 20px; - background: #fff; - margin: auto; - border-radius: 15px; - -webkit-box-shadow: 0 5px 35px rgba(0, 0, 0, 0.075); - box-shadow: 0 5px 35px rgba(0, 0, 0, 0.075); - border: 2px dashed #d2e6ff; - - img, - canvas { - display: block; - width: 100%; - } - } - - .qr_code-desc { - text-align: center; - padding: 25px 0; - font: 600 15px/28px var(--base-font); - } - - &.block-qr-code-fit { - width: 100%; - - .qr_code { - width: 100%; - height: auto; - } - } - } - - &.block-preferences { - display: block; - - .preference-option { - border-bottom: 1px solid #d4d9dd; - display: flex; - width: 100%; - padding: 10px 25px; - cursor: pointer; - transition: background 0.4s; - outline-offset: -2px; - - .preference-option-details { - flex-grow: 1; - } - - .preference-option-input { - justify-content: center; - align-items: center; - display: flex; - } - - &:hover { - background-color: #f7fafc; - } - - &:last-child { - border-bottom: none; - } - } - - &:not(:last-child) { - border-bottom: 1px solid #d4d9dd; - } - } - - &.block-info { - padding-left: 30px; - font: 500 13px/20px var(--base-font); - color: #45535e; - - .block-info-icon { - float: left; - font-size: 20px; - margin-left: -25px; - margin-right: 5px; - color: var(--color-primary); - } - - &.block-info-list { - border-style: solid; - padding: 12px; - color: #151b26; - - .block-info-list-title { - display: flex; - font: 500 12px/19px var(--base-font); - margin: 0 0 5px 0; - } - - .block-info-icon { - margin: 0 5px 0 0; - } - - .block-info-list-items { - margin: 0 0 0 25px; - list-style-type: disc; - list-style-position: inside; - - .block-info-list-item { - font: 500 12px/24px var(--base-font); - - .block-info-list-item-value { - margin: 0 0 0 5px; - color: #646f79; - } - } - } - } - } - - &.block-auth-type { - font-size: 0; - padding: 0 0 20px; - text-align: center; - @include cf(); - - .auth_type-item { - display: inline-block; - width: 340px; - max-width: 50%; - padding: 0 30px; - - .auth_type-icon { - padding: 50px 0; - background: #ffffff; - border-radius: 10px; - box-shadow: 0 10px 40px rgba(#000, 0.04); - margin-bottom: 30px; - transform: translate(0, 0); - transition: 0.4s; - - img { - display: block; - margin: 0 auto; - } - } - - .auth_type-name { - font: 700 18px var(--base-font); - color: #282b39; - transition: 0.4s; - } - - .auth_type-item-inner { - width: 100%; - cursor: pointer; - - &:hover { - .auth_type-icon { - transform: translate(0, -10px); - box-shadow: 0 10px 60px rgba(#000, 0.15); - } - - .auth_type-name { - color: #004195; - } - } - } - } - } - - &.block-auth-qr-code { - width: 100%; - padding-bottom: 20px; - - .qr_code { - width: 280px; - height: 280px; - padding: 20px; - background: #fff; - margin: auto; - border-radius: 15px; - box-shadow: 0 5px 35px rgba(#000, 0.075); - - img, - canvas { - display: block; - width: 100%; - } - } - } - - &.block-message { - .message-title { - color: #282b39; - font: 600 16px/24px var(--base-font); - text-align: center; - margin: 0 0 10px; - } - - .message-details { - color: #282b39; - font: 500 13px/20px var(--base-font); - text-align: center; - } - } - - &.block-sign-up-steps { - width: 1200px; - max-width: 100%; - margin: 0 auto; - padding: 60px 0; - - .section-product { - .back { - padding-bottom: 15px; - margin: 0 50px; - font: 500 18px/22px var(--base-font); - color: #9e9e9e; - - span { - display: inline-block; - margin-top: 2px; - font-size: 18px; - color: #9e9e9e; - } - } - - .heading { - font: 500 36px/36px var(--base-font); - color: #191a1c; - text-align: center; - } - } - - .block.block-photo-selector { - margin-bottom: 25px; - - .photo-img { - width: 85px; - height: 85px; - border-radius: 6px; - margin-right: 25px; - } - - .photo-label { - font: 700 22px/35px var(--base-font); - color: #282b39; - margin-bottom: 10px; - } - - .button { - padding: 4px 30px; - } - - &:last-child { - margin-bottom: 0; - } - } - - .sign-up-header { - .steps { - margin-bottom: 30px; - width: 100%; - display: flex; - - .step-item { - flex-grow: 1; - float: left; - position: relative; - padding-top: 80px; - padding-bottom: 20px; - - .step-item-icon { - background: #fff; - border-radius: 50%; - width: 50px; - height: 50px; - margin-bottom: 10px; - box-shadow: 0 10px 20px rgba(0, 0, 0, 0.05); - z-index: 2; - position: absolute; - top: 10px; - left: 35px; - border: 3px solid #d2e6ff; - transition: 0.4s; - transform: translate(-50%); - - img { - width: 27px; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%) scale(0.7); - margin: auto; - } - } - - .step-item-title { - text-transform: uppercase; - font: 600 12px/20px var(--base-font); - color: #8ca3a6; - position: absolute; - left: 35px; - transform: translate(-50%); - max-width: 100px; - @include ellipsis(); - text-align: center; - } - - &:after { - content: ' '; - position: absolute; - top: 35px; - left: 0; - border: 3px solid #d2e6ff; - width: calc(100% + 30px); - z-index: 1; - } - - &:last-child { - &:after { - border: none; - } - } - - &.active { - .step-item-icon { - width: 70px; - height: 70px; - top: 0; - left: 35px; - border-width: 0; - - img { - transform: translate(-50%, -50%) scale(1); - } - } - - .step-item-title { - color: #305dfb; - } - } - - &.done { - .step-item-icon { - background: #305dfb; - width: 70px; - height: 70px; - top: 0; - left: 35px; - border-width: 0; - - img { - transform: translate(-50%, -50%) scale(1); - } - } - - .step-item-title { - color: #00122a; - } - } - } - } - } - - .sign-up-content { - // fill parrent block - @mixin nth_offset($nth: 1, $count: 7) { - &:nth-child(#{$nth}) { - .card:before, - .card:after { - left: calc(calc(100% / #{$count}) * #{$nth - 1} + 35px); - } - } - } - - .step-item { - margin-bottom: 30px; - - .step-header { - padding-top: 10px; - - .step-header-title { - font: 700 40px/60px var(--base-font); - color: #282b39; - margin-bottom: 10px; - } - - .step-header-subtitle { - font: 400 22px/30px var(--base-font); - color: #646f79; - margin-bottom: 20px; - } - } - - .card { - position: relative; - - .card-section-fund { - border-radius: var(--border-radius); - background: #fff; - margin-bottom: 12.5px; - box-shadow: 0 5px 10px rgba($color: #000000, $alpha: 0.05); - border: none; - - .fund-img { - display: none; - } - - .card-block-fund { - padding: 0; - cursor: default; - - .fund-title { - color: #151b26; - font: 500 16px var(--base-font); - position: relative; - - &:before { - content: '▶'; - position: absolute; - right: 100%; - top: 50%; - opacity: 0; - transform: translate(-3px, -50%); - font-size: 0.5em; - transition: 0.4s; - } - - &:hover { - color: #9ca6af; - - &:before { - opacity: 1; - color: #9ca6af; - } - } - } - - .fund-organization { - color: #009ef4; - margin-bottom: 15px; - } - } - - &:last-child { - margin-bottom: 0; - } - } - - .divider-img { - background-color: #f7f9fc; - margin-top: -1px; - z-index: 1; - position: relative; - - img { - width: 100%; - } - } - - .filters { - margin-bottom: 20px; - } - - &:before, - &:after { - bottom: 100%; - left: 50%; - border: solid transparent; - content: ' '; - height: 0; - width: 0; - position: absolute; - pointer-events: none; - } - - &:before { - border-color: rgba(255, 255, 255, 0); - border-bottom-color: #fff; - border-width: 13px; - margin-left: -13px; - z-index: 1; - } - - &:after { - border-color: rgba(210, 230, 255, 0); - border-bottom-color: #d2e6ff; - border-width: 14px; - margin-left: -14px; - } - - &:not(:first-child) { - &:before, - &:after { - display: none; - } - } - } - - @include nth_offset(1); - @include nth_offset(2); - @include nth_offset(3); - @include nth_offset(4); - @include nth_offset(5); - @include nth_offset(6); - @include nth_offset(7); - } - - &.steps_5 { - .step-item { - @include nth_offset(1, 5); - @include nth_offset(2, 5); - @include nth_offset(3, 5); - @include nth_offset(4, 5); - @include nth_offset(5, 5); - } - } - - .app-instruction { - .col { - padding: 0 70px; - position: relative; - - img { - &:not(.line-item) { - width: 100%; - border: 2px dashed #d2e6ff; - border-radius: var(--border-radius); - box-shadow: 0 5px 35px rgba(0, 0, 0, 0.1); - position: relative; - z-index: 1; - } - - &.line-item { - position: absolute; - top: 200px; - left: calc(100% - 82px); - width: 163px; - z-index: 2; - } - } - - .title { - font: 500 16px/24px var(--base-font); - padding: 5px 0 15px 0; - text-align: center; - } - } - } - } - } - - &.block-csv { - background: #fff; - margin-bottom: 20px; - - .csv-inner { - padding: 65px 20px 20px; - width: 660px; - margin: 0 auto; - text-align: center; - display: flex; - flex-direction: column; - gap: 20px; - } - - .csv-upload-icon { - width: 54px; - height: 54px; - line-height: 53px; - text-align: center; - margin: 0 auto 12px; - border: 1px solid #d2e6ff; - border-radius: 60px; - background: #fff; - color: #009ef4; - transition: - color 0.4s, - background-color 0.4s; - - .mdi { - color: inherit; - font-size: 26px; - } - } - - .csv-upload-btn { - cursor: pointer; - - .csv-upload-text { - font: 500 16px var(--base-font); - color: #282b39; - transition: - color 0.4s, - background-color 0.4s; - - span { - font: 400 12px var(--base-font); - color: #646f79; - } - } - - &:hover, - &.hover { - .csv-upload-icon { - background: #009ef4; - color: #fff; - } - - .csv-upload-text { - color: #009ef4; - } - } - } - - .csv-upload-btn-groups { - display: flex; - flex-direction: column; - gap: 20px; - } - - .csv-upload-actions { - display: flex; - flex-direction: column; - gap: 20px; - } - - .csv-file-error { - font: 500 13px/20px var(--base-font); - color: var(--color-danger); - margin: 0; - } - - .csv-file-warning { - font: 500 13px/20px var(--base-font); - color: #e7740a; - margin: 0; - } - - .csv-upload-progress { - .csv-upload-icon { - .mdi { - @extend .spin; - } - } - - .csv-progress-state { - font: 400 12px var(--base-font); - margin: 0 0 10px; - color: #646f79; - } - - .csv-progress-bar { - margin: 0 0 20px; - height: 5px; - background: #d2e6ff; - border-radius: var(--border-radius); - width: 100%; - position: relative; - - .csv-progress-bar-stick { - @include fill_parent(); - right: auto; - top: -1px; - bottom: -1px; - background: #009ef4; - border-radius: var(--border-radius); - transition: 1s; - } - } - - .csv-progress-value { - font: 500 16px var(--base-font); - color: #282b39; - margin: 0 0 20px; - } - - &.done { - .csv-upload-icon { - color: #fff; - background: #24b37e; - - .mdi { - animation: none; - } - - &.csv-upload-icon-warning { - background-color: var(--color-primary); - } - } - } - } - - &.on-dragover { - background: lighten($color: #9ca6af, $amount: 32); - border-color: #9ca6af; - } - - &:last-child { - margin-bottom: 0; - } - } - - &.block-choose-organization { - margin: 0 -7.5px 0; - @include cf(); - - .organization-heading { - font: 500 18px var(--base-font); - color: #282b39; - padding: 0 12px; - margin: 0 0 15px; - display: flex; - flex-wrap: wrap; - } - - .organizations-list { - display: flex; - flex-wrap: wrap; - @include cf(); - } - - .organization-item { - width: 20%; - text-align: center; - padding: 0 7.5px; - margin-bottom: 15px; - cursor: pointer; - float: left; - height: 100%; - - &:nth-of-type(5n + 1) { - clear: both; - } - - .organization-item-inner { - padding: 15px 10px 10px; - display: block; - background: #fff; - border-radius: var(--border-radius); - box-shadow: 0 5px 10px rgba($color: #000000, $alpha: 0.1); - transform: translate(0, 0); - transition: 0.4s; - - .organization-logo { - width: 32px; - height: 32px; - border-radius: 70px; - background: #e2e8e9; - border: 1px solid #e2e8e9; - overflow: hidden; - margin: 0 auto 5px; - - img { - display: block; - width: 100%; - height: 100%; - } - - .mdi { - font-size: 40px; - line-height: 66px; - color: var(--color-primary); - transition: 0.4s; - display: block; - } - - &.organization-logo-mdi { - background: #fff; - } - } - - .organization-name { - font: 500 13px/18px var(--base-font); - color: #282b39; - } - - &.active, - &:hover { - background-color: #2166af; - - .organization-name { - color: #fff; - } - } - - &.active { - background-color: #134478; - } - } - } - } - - &.block-schedule-editor { - @include cf(); - - .schedule-editor-heading { - font: 500 16px/20px var(--base-font); - margin: 0 0 15px; - color: #282b39; - - &.schedule-editor-heading-lg { - font: 500 28px/36px var(--base-font); - } - } - - .ui-control { - &.ui-control-checkbox { - .ui-checkbox-label { - font: 500 13px/16px var(--base-font); - } - } - } - - table { - th { - font: 600 13px/16px var(--base-font); - letter-spacing: 0.08px; - text-transform: uppercase; - color: #222530; - text-align: left; - } - - td { - padding-right: 22px; - height: 30px; - font: 400 13px/16px var(--base-font); - color: #222530; - - span { - font: 400 13px/24px var(--base-font); - } - - &.weekend { - color: #f15642; - } - - &.breaks { - padding-left: 40px; - } - } - - th, - td { - &.breaks { - text-align: center; - } - } - - .ui-control { - &.ui-control-text { - width: 80px; - height: 30px; - - input { - height: 30px; - border-radius: 6px; - } - } - - &.breaks { - display: table-cell; - - &.end { - input { - margin-right: 0; - } - } - - input { - width: 80px; - margin-right: 22px; - } - } - - .ui-control-clear { - display: none; - } - } - } - } - - &.block-photo-selector { - @include cf(); - - .photo-img { - float: left; - border: 1px solid #d4d9dd; - border-radius: 75px; - width: 75px; - height: 75px; - margin-right: 15px; - overflow: hidden; - background: #ffffff 50%; - background-size: cover; - - img { - display: block; - width: 100%; - } - } - - .photo-label { - display: block; - font: 500 16px/26px var(--base-font); - color: #151b26; - margin-bottom: 10px; - } - } - - &.block-file { - width: 100%; - border: 1px dashed #d4d9dd; - border-radius: var(--border-radius); - text-align: left; - cursor: default; - display: flex; - padding: 0; - align-items: center; - - .block-file-details { - display: flex; - flex-direction: row; - gap: 10px; - flex: 1; - flex-grow: 100; - padding: 8px; - position: relative; - } - - .block-file-buttons { - flex: 1; - padding: 12px 15px; - border-left: 1px dashed #d4d9dd; - } - - .file-error { - display: none; - position: absolute; - left: 17px; - top: 12px; - font-size: 26px; - color: #e63b3b; - } - - .file-remove { - position: absolute; - right: 7.5px; - top: 7.5px; - font-size: 22px; - color: #757f88; - cursor: pointer; - - &:hover { - color: #cf274d; - } - } - - .file-icon { - display: flex; - flex: 0 0 30px; - justify-content: center; - - .mdi { - height: 40px; - font-size: 22px; - line-height: 40px; - color: #cfd8dc; - } - } - - .file-details { - display: flex; - flex-direction: column; - flex: 1 1 auto; - justify-content: center; - - .file-name { - font: 600 12px/20px var(--base-font); - color: var(--color-primary); - } - - .file-size { - font: 500 11px/14px var(--base-font); - color: #646f79; - } - } - - &.has-error { - border-color: #e63b3b; - background: none; - - .file-icon { - .mdi { - color: #e63b3b; - } - } - } - } - - &.block-inline-filters { - display: flex; - justify-content: flex-end; - - .button { - height: 30px; - line-height: 24px; - padding-top: 2px; - padding-bottom: 2px; - font-size: 12px; - box-shadow: none; - white-space: nowrap; - } - - .select-control { - width: 180px !important; - - .select-control-input { - label.form-control:not([type='radio']):not([type='checkbox']) { - padding-left: 7.5px; - font-size: 12px; - line-height: 28px; - - .select-control-search-placeholder-media { - margin: 4px 0; - } - } - - .select-control-search-container .select-control-search-clear { - line-height: 18px; - } - } - - .select-control-options { - .select-control-option { - padding-left: 10px; - font-size: 12px; - } - } - - &.select-control-lg { - width: 240px !important; - } - } - - .form { - display: flex; - margin-right: 10px; - - .form-group { - margin: 0 10px 0 0; - - &:last-child { - margin-right: 0; - } - } - - .form-control { - height: 30px; - margin: 0; - padding: 0 10px; - line-height: 28px; - - &.select-control { - .select-control-input { - font-size: 12px; - - .select-control-options { - .select-control-option { - --option-height: 35px; - color: #353535; - font: 500 12px/20px var(--base-font); - } - } - } - } - } - - select.form-control { - padding-right: 25px; - } - - &:last-child { - margin-right: 0; - } - } - - .inline-filters-dropdown { - position: relative; - display: inline-block; - - $cardHeaderDropdownRadius: 6px; - - .inline-filters-dropdown-content { - width: 260px; - min-height: 75px; - position: absolute; - top: 100%; - margin-top: 15px; - right: -5px; - background: #fff; - z-index: 2; - box-shadow: 1px 2px 40px rgba(0, 0, 0, 0.12); - padding: 0 20px; - text-align: left; - border-radius: $cardHeaderDropdownRadius; - display: flex; - flex-direction: column; - - .arrow-box { - right: 30px; - left: auto; - transform: none; - } - - .inline-filters-pane { - padding: 0 10px 10px; - } - - .form { - flex-direction: column; - - .form-group { - background: #f6f9fc; - margin: 0 -20px; - padding: 0 15px 0; - - .form-label { - display: block; - color: #282b39; - - &.form-label-toggle { - cursor: pointer; - background: #fff; - margin: 0 -15px 0; - padding: 10px 10px 10px 15px; - transition: color 0.4s; - border-bottom: 1px solid #e7e7e7; - - .form-label-icon-active { - display: none; - } - - .mdi { - float: right; - font-size: 2em; - color: #646f79; - transition: color 0.4s; - } - - &:hover { - color: #009ef4; - - .mdi { - color: inherit; - } - } - - & + * { - display: none; - } - - &.active { - margin: 0 -15px 10px; - border-bottom: 1px solid #fff; - - .form-label-icon { - display: none; - } - - .form-label-icon-active { - display: block; - } - - & + * { - display: block; - } - } - } - } - - .form-control { - margin: 0 0 10px; - height: 30px; - font-size: 12px; - width: 100% !important; - - &.select-control { - .select-control-search { - margin-bottom: 0; - border: 1px solid #d4d9dd; - line-height: 30px; - } - - .select-control-options { - --option-height: 35px; - - .select-control-option { - color: #353535; - font: 500 12px/20px var(--base-font); - } - } - } - } - - &:first-child { - border-top-left-radius: $cardHeaderDropdownRadius; - border-top-right-radius: $cardHeaderDropdownRadius; - - .form-label { - border-top-left-radius: $cardHeaderDropdownRadius; - border-top-right-radius: $cardHeaderDropdownRadius; - } - } - - &:last-child { - .form-label:not(.active) { - border-bottom: none; - border-bottom-left-radius: $cardHeaderDropdownRadius; - border-bottom-right-radius: $cardHeaderDropdownRadius; - } - } - } - - .radio, - .checkbox { - padding-top: 5px; - padding-bottom: 5px; - - .radio-label, - .radio-checkbox { - font: 600 12px/20px var(--base-font); - width: 100%; - } - } - } - - .form-actions { - background: #fff; - padding: 15px; - margin: 0 -20px; - border-bottom-left-radius: $cardHeaderDropdownRadius; - border-bottom-right-radius: $cardHeaderDropdownRadius; - } - } - } - } - - &.block-information { - background: #fff; - padding: 15px 20px; - border-radius: var(--border-radius); - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); - font: 400 13px/20px var(--base-font); - margin-bottom: 15px; - display: flex; - - .block-information-icon { - margin: 2.5px 10px auto 0; - color: #009ef4; - font-size: 16px; - } - - .block-information-info { - display: flex; - flex-direction: column; - justify-content: center; - font: 500 13px/18px var(--base-font); - color: #646f79; - - a { - color: #009ef4; - font-size: 13px; - font-weight: 500; - } - } - - &.block-information-danger { - background: #fcfaf6; - } - - &.block-information-info { - background: #009ef421; - } - } - - &.block-app-instruction { - display: flex; - flex-direction: column; - - .step-items { - display: flex; - flex-direction: row; - justify-content: center; - margin-bottom: 20px; - } - - .step-item { - position: relative; - display: inline-block; - text-align: center; - padding: 0 20px; - - .step-item-title { - font: 700 24px/30px var(--base-font); - margin: 0 0 0; - } - - .step-item-subtitle { - font: 600 14px/22px var(--base-font); - margin: 0 0 10px; - } - - img { - margin: 0 auto; - display: block; - - &:not(.line-item) { - width: 220px; - border-radius: var(--border-radius); - box-shadow: 0 5px 35px rgba(0, 0, 0, 0.1); - position: relative; - z-index: 1; - } - - &.line-item { - position: absolute; - top: 220px; - left: calc(100% - 80px); - min-width: 70px; - z-index: 2; - } - } - - .app-title { - font: 500 13px/24px var(--base-font); - padding: 5px 0 15px 0; - text-align: center; - } - } - - .divider-img { - img { - width: 100%; - } - } - - @media screen and (max-width: 1000px) { - .step-item { - padding: 0 30px; - width: 50%; - } - - img.line-item { - display: none; - } - } - - @media screen and (max-width: 767px) { - .step-item { - padding: 0 30px; - width: 50%; - } - - .line-item { - display: none; - } - } - } - - &.block-auth-widget { - .auth-title { - font: 600 18px/20px var(--base-font); - color: #333; - margin: 0 0 5px; - } - - .auth-subtitle { - cursor: pointer; - font: 400 14px/20px var(--base-font); - color: #333; - margin-bottom: 10px; - } - - .auth-form { - margin: 0 0 30px; - display: flex; - flex-direction: row; - - .auth-form-input { - flex-grow: 1; - padding-right: 20px; - } - - .button { - box-shadow: none; - text-transform: uppercase; - width: 175px; - text-align: center; - - p &:hover { - box-shadow: none; - } - } - } - - .auth-digid { - border: 1px solid #e7e7e7; - border-left: none; - border-right: none; - padding: 18px 0; - margin: 0 0 30px; - - .auth-digid-link { - color: #3661ff; - font: 600 14px/20px var(--base-font); - display: flex; - flex-direction: row; - - .mdi { - font-size: 1.5em; - height: 20px; - line-height: 20px; - display: flex; - flex-direction: row; - justify-content: center; - justify-items: center; - transition: 0.4s; - transform: translate(0, 0); - margin: 1px 0 -1px; - } - - &:hover { - .mdi { - transform: translate(2px, 0); - } - } - } - } - - .auth-digid-form { - padding: 10px; - - .auth-title { - margin: 0 0 20px; - } - - .auth-subtitle { - margin: 0 0 20px; - - &:last-child { - margin-bottom: 0; - } - } - - &.button-digid { - background-color: #000; - background-image: assetUrl('img/icon-digid.svg'); - background-repeat: no-repeat; - background-position: center; - border-color: #000; - box-shadow: none; - cursor: default; - pointer-events: none; - } - } - - .auth-digid-message { - display: flex; - flex-direction: column; - align-content: center; - justify-items: center; - align-items: center; - justify-content: center; - text-align: center; - padding: 10px 0; - - .digid-icon { - color: #3661ff; - width: 140px; - height: 140px; - border-radius: 140px; - background: #fff; - text-align: center; - line-height: 140px; - font-size: 80px; - margin: 0 0 20px; - } - - .digid-title { - color: #282b39; - font: 600 21px/20px var(--base-font); - margin: 0 0 20px; - } - - .digid-message { - color: #646f79; - font: 500 14px/20px var(--base-font); - } - } - - .auth-qr_code { - display: flex; - flex-direction: column; - - .qr_code-container { - display: flex; - flex-direction: row; - font: 400 14px/20px var(--base-font); - - .qr_code-description { - padding-right: 10px; - flex-grow: 1; - - .qr_code-download-app { - display: flex; - - .download-link { - height: 40px; - display: inline-flex; - margin-right: 10px; - } - } - } - - .qr_code-block { - width: 175px; - min-width: 175px; - - .block-qr-code { - .qr_code { - padding: 10px; - width: 100%; - height: auto; - border: 2px dashed #000; - } - } - } - } - } - - @media screen and (max-width: 1000px) { - .auth-title { - font-size: 16px; - font-weight: 700; - margin: 0 0 10px; - } - - .auth-subtitle { - font-size: 13px; - font-weight: 400; - line-height: 18px; - margin: 0 0 15px; - } - - .auth-form { - margin: 0 0 10px; - - .button { - width: auto; - } - } - } - } - - &.block-entity-overview { - display: flex; - flex-direction: row; - - .entity-title { - font: 600 14px/20px var(--base-font); - - .entity-title-icon-suffix { - display: inline-block; - color: #a1a1a1; - margin-left: 5px; - } - } - - .entity-photo { - width: 50px; - - .entity-photo-img { - display: block; - max-width: 100%; - border: 1px solid var(--border-color); - border-radius: var(--border-radius); - } - } - - .entity-details { - padding-left: 15px; - display: flex; - flex-direction: column; - min-height: 100%; - justify-content: center; - justify-items: center; - } - } - - &.block-page-loading-bar { - position: fixed; - top: 0; - left: 0; - background-color: var(--color-primary); - height: 3px; - width: 0; - transition: width 0.3s linear; - opacity: 1; - z-index: 1000; - - &:after { - content: ''; - position: absolute; - right: 0; - top: 0; - height: 100%; - width: 10px; - background: #fff; - } - - &.start, - &.complete { - opacity: 0; - } - - &.complete { - transition: - opacity 1s linear, - width 0.3s linear; - } - - &.start { - transition: 0s; - } - } - - &.block-fund-invite { - padding: 20px 0; - - .wrapper { - width: 900px; - } - - .invite-icon { - margin: 0 0 20px; - - .invite-icon-img { - display: block; - width: 150px; - max-width: 100%; - margin: 0 auto 0; - } - } - - .invite-title { - text-align: center; - font: 500 28px/46px var(--base-font); - color: #282b39; - margin: 0 0 15px; - } - - .invite-subtitle { - text-align: center; - font: 300 15px/26px var(--base-font); - color: #191a1c; - margin: 0 0 30px; - } - - .invite-fund { - border: 1px solid var(--border-color-light); - background: #fff; - border-radius: var(--border-radius); - padding: 30px 40px 36px; - display: flex; - flex-direction: row; - margin-bottom: 30px; - position: relative; - - .invite-fund-photo { - .invite-fund-photo-img { - display: block; - width: 100px; - border: 1px solid var(--border-color-light); - border-radius: var(--border-radius); - } - } - - .invite-fund-details { - flex-grow: 1; - padding-left: 30px; - - .invite-fund-title { - font: 500 21px/25px var(--base-font); - color: #282b39; - margin: 0 0 0; - } - - .invite-fund-subtitle { - font: 400 14px/20px var(--base-font); - color: #7e818c; - margin: 0 0 20px; - } - - .invite-fund-description { - font: 400 14px/17.5px var(--base-font); - color: #262728; - margin: 0 0 0; - } - } - - .invite-fund-expiration { - text-align: right; - padding-left: 30px; - white-space: nowrap; - - .invite-fund-expiration-label { - font: 400 13px var(--base-font); - color: #7e818c; - } - - .invite-fund-expiration-value { - font: 400 14px var(--base-font); - color: #262728; - margin: 0 0 25px; - } - } - - &:after { - content: ''; - height: 6px; - width: 100%; - position: absolute; - left: 0; - bottom: 0; - background: #fbfbfb; - border-top: 1px solid var(--border-color-light); - border-bottom-left-radius: var(--border-radius); - border-bottom-right-radius: var(--border-radius); - } - } - - .block-auth-widget { - background: #fff; - border: 1px solid var(--border-color-light); - border-radius: var(--border-radius); - padding: 40px; - max-width: 100%; - margin: 0 auto 30px; - } - } - - &.block-desktop-only { - @include fill_parent(); - position: fixed; - background: #fff; - z-index: 9999; - text-align: center; - color: #282b39; - - .block-inner { - @include float_parent(); - width: 100%; - padding: 30px; - margin-top: -10vh; - - .block-title { - font: 600 18px/24px var(--base-font); - margin: 0 0 10px; - } - - .block-description { - font: 500 12px/18px var(--base-font); - } - - .block-media { - margin-bottom: 40px; - - img { - width: 120px; - display: block; - margin: 0 auto; - } - } - } - } - - &.block-login { - flex-direction: column; - justify-content: center; - display: flex; - @include fill_parent(); - position: fixed; - padding-bottom: 60px; - cursor: default; - - .block-login-window { - display: block; - margin: 0 auto; - width: 760px; - max-width: 100%; - border: 1px solid #e5e5e5; - border-radius: var(--border-radius); - background-color: #fff; - } - - .block-login-content { - padding: 30px 40px; - border-bottom: 1px solid #e5e5e5; - - .block-login-title { - font: 500 21px/36px var(--base-font); - color: #222530; - } - - .block-login-description { - font: 400 18px/26px var(--base-font); - color: #222530; - margin: 0 0 30px; - } - - .block-login-form { - margin: 0 0 30px; - - .form-label { - color: #7e818c; - margin-left: 10px; - font-weight: 400; - } - - .block-login-control { - display: flex; - flex-direction: row; - - .form-group { - padding-right: 20px; - flex-grow: 1; - margin: 0 0; - display: flex; - flex-direction: column; - } - - .button { - align-self: flex-start; - } - } - - .form-control:not([type='radio']):not([type='checkbox']) { - font: 400 16px/20px var(--base-font); - } - - button { - padding-left: 50px; - padding-right: 50px; - } - - &:last-child { - margin-bottom: 0; - } - } - - .block-login-me_app { - display: flex; - flex-direction: row; - flex-grow: 1; - - .qr_code-container { - padding-right: 30px; - - .auth-title { - font: 500 21px/28px var(--base-font); - color: #333; - margin: 0 0 5px; - } - - .auth-description { - font: 400 15px/22px var(--base-font); - color: #333; - margin: 0 0 5px; - } - } - - .qr_code-block { - display: flex; - flex-direction: column; - - .qr_code-block-placeholder { - width: 200px; - height: 200px; - border: 1px solid #e5e5e5; - display: flex; - flex-direction: column; - justify-content: center; - text-align: center; - - button { - background: rgba(53, 97, 255, 0.15); - border-radius: var(--border-radius); - font: 500 14px/25px var(--base-font); - color: #3561ff; - margin: 0 auto; - padding: 7.5px 15px; - box-shadow: none; - align-self: center; - } - } - - .block.block-qr-code { - width: 200px; - height: 200px; - padding: 0; - - .qr_code { - border-radius: 0; - width: 100%; - height: 100%; - border: none; - padding: 12.5px; - box-shadow: 0 5px 15px rgba(0, 0, 0, 0.12); - } - } - } - } - - .block-login-email_sent { - text-align: center; - - .block-login-email_sent-icon { - margin: 0 auto 10px; - - .block-login-email_sent-icon-img { - display: block; - width: 300px; - max-width: 100%; - margin: auto; - } - } - - .block-login-email_sent-title { - font: 500 28px/38px var(--base-font); - color: var(--color-primary); - margin: 0 0 20px; - } - - .block-login-email_sent-text { - font: 500 18px/27px var(--base-font); - color: #454545; - margin: 0 0 20px; - } - } - - &:last-child { - border-bottom: none; - } - } - - .block-login-footer { - display: flex; - flex-direction: column; - justify-content: center; - padding: 30px; - - .block-login-footer-title { - font: 500 19px/21px var(--base-font); - text-align: center; - margin: 0 auto 20px; - } - - .block-login-footer-button { - width: 320px; - transform: translate(0, 0); - color: #0c66ff; - background: rgba(12, 102, 255, 0.1); - padding: 20px 65px; - text-align: center; - background: #fff; - border: 1px solid #0c66ff; - border-radius: 8px; - font: 600 16px/21px var(--base-font); - transition: - color 0.3s, - border-color 0.3s, - background 0.3s, - box-shadow 0.3s; - margin: auto; - - &:hover { - text-decoration: none; - background: rgba(12, 102, 255, 0.1); - border-color: #0c66ff; - } - } - } - - @media screen and (max-width: 1000px) { - position: initial; - - .block-login-window { - border: none; - background: none; - } - - .block-login-content { - padding: 25px; - - .block-login-title { - font: 500 17px/30px var(--base-font); - } - - .block-login-description { - font: 400 13px/20px var(--base-font); - } - - .block-login-form { - margin: 0; - - .block-login-control { - flex-direction: column; - - .flex { - justify-content: center; - } - - .form-group { - margin-bottom: 20px; - padding-right: 0; - } - } - } - - .block-login-me_app { - display: none; - } - } - } - - .block-login-footer { - .block-login-footer-title { - font: 500 17px/21px var(--base-font); - } - - .block-login-footer-button { - padding: 15px 45px; - width: auto; - } - } - } - - &.block-email-confirmed { - flex-direction: column; - justify-content: center; - display: flex; - @include fill_parent(); - background: #fff; - cursor: default; - - .block-email-confirmed-content { - text-align: center; - margin: 0 0 15px; - - .block-email-confirmed-icon { - margin: 0 auto; - - img { - display: block; - width: 220px; - max-width: 100%; - margin: auto; - } - } - - .block-email-confirmed-title { - font: 500 26px/32px var(--base-font); - color: var(--color-primary); - margin: 0 0 10px; - } - - .block-email-confirmed-subtitle { - font: 500 16px/26px var(--base-font); - color: #454545; - margin: 0 0 15px; - } - } - - .block-email-confirmed-footer { - text-align: center; - } - } - - &.block-charts { - .chart-row { - display: flex; - margin: 0 -10px 20px; - - .card { - width: 25%; - margin: 0 10px; - } - - &.chart-row-condensed { - .chart-control { - margin: 0 auto; - } - - .chart-radial { - width: 70px; - margin: auto; - } - - .chart-value { - min-height: auto; - padding: 10px 0; - - .chart-value_label { - color: var(--color-primary); - } - - .chart-value_value { - color: var(--color-primary); - } - } - } - } - - .chart-control { - margin: -10px 0; - display: flex; - flex-direction: column; - text-align: center; - cursor: default; - - .chart-label { - color: #151b26; - font: 500 13px/18px var(--base-font); - margin-bottom: 20px; - } - - .chart-value { - padding: 50px 0 20px; - display: flex; - flex-direction: column; - min-height: 180px; - - .chart-value_value { - color: #007f96; - font: 500 26px/32px var(--base-font); - } - - .chart-value_label { - color: var(--color-primary); - font: 500 11px/18px var(--base-font); - } - - .chart-value_value_b { - color: #282b39; - font: 500 14px/22px var(--base-font); - } - } - - &.chart-control-provider_overview { - padding: 5px 0; - - .chart-label { - margin-bottom: 0; - } - - .chart-value { - padding: 25px 0 25px; - min-height: auto; - } - } - } - - .chart-body { - padding: 20px 0 0; - margin: 0 -20px -10px -10px; - - canvas { - margin: 0 auto; - } - } - - .chart-header { - margin: -25px -25px 0; - border-bottom: 1px solid #d4d9dd; - padding: 15px 25px; - display: flex; - cursor: default; - - .chart-header-range { - flex-basis: 40%; - - .chart-header-item { - color: rgba($color: #151b26, $alpha: 0.5); - font: 500 14px/34px var(--base-font); - display: inline-block; - margin-right: 20px; - transition: 0.4s; - cursor: pointer; - - &:last-child { - margin-right: 0; - } - - &:hover, - &.active { - color: #d91d46; - font-weight: 500; - } - } - } - - .chart-header-title { - flex: 1 0; - text-align: center; - font: 500 13px/34px var(--base-font); - color: #151b26; - flex-basis: 20%; - } - - .chart-header-actions { - flex-basis: 40%; - display: flex; - flex-direction: row; - justify-content: flex-end; - - .flex-row { - flex: 1; - flex-direction: row; - justify-content: flex-end; - flex-wrap: nowrap; - } - - .form-group { - margin: 0 10px 0 0; - } - - .form-control { - max-width: 200px; - } - } - } - } - - @media screen and (max-width: 1000px) { - &.block-photo-selector { - text-align: center; - - .photo-img { - width: 100px; - height: 100px; - margin: 0 auto 10px; - float: none; - display: block; - } - - .photo-label { - text-align: center; - margin: 0 0 10px; - } - } - - &.block-choose-organization { - .organization-item { - width: 50%; - } - } - - &.block-charts { - .chart-row { - flex-wrap: wrap; - - .card { - width: 100%; - margin: 0 0 20px; - - &:last-child { - margin-bottom: 0; - } - } - } - } - } - - &.block-compact-datalist { - display: grid; - - .datalist-row { - border-bottom: 1px dashed #ccc; - display: grid; - grid-template-columns: 200px 1fr; - - .datalist-key { - @extend .text-wrap; - font: 500 14px/20px var(--base-font); - color: #646f79; - padding: 7.5px 15px 7.5px 0; - } - - .datalist-value { - @extend .text-wrap; - font: 500 14px/20px var(--base-font); - color: #646f79; - padding: 7.5px 0; - } - } - - &.compact-datalist-outline { - padding: 5px 20px; - border: 1px dashed #ccc; - border-radius: var(--border-radius); - - .datalist-row { - .datalist-key { - color: var(--color-primary); - } - - .datalist-value { - color: var(--text-color); - } - - &:last-child { - border-bottom: 0; - } - } - } - - &.compact-datalist-vertical { - grid-auto-flow: column; - gap: 20px; - - .datalist-row { - grid-template-columns: 1fr; - border: none; - - .datalist-key, - .datalist-value { - margin: 0; - padding: 0; - } - - .datalist-key { - color: var(--color-primary); - font: 600 11px/20px var(--base-font); - } - - .datalist-value { - color: var(--text-color); - font: 500 13px/20px var(--base-font); - } - } - } - } - - &.block-user_emails { - display: flex; - flex-direction: column; - - .user_email-item { - display: flex; - flex-direction: row; - border-bottom: 1px solid #d4d9dd; - - .user_email-icon { - padding: 20px 0 20px 20px; - - .mdi { - font-size: 26px; - margin-left: 5px; - margin-right: -5px; - color: #8ca3a6; - } - } - - .user_email-details { - padding: 20px; - flex-grow: 1; - - .user_email-address, - .user_email-options { - &:last-child { - margin-bottom: 0; - } - } - - .user_email-address { - font: 500 14px/24px var(--base-font); - color: var(--text-color); - margin: 0 0 5px; - } - - .user_email-options { - margin: 0 0 10px; - - .user_email-option { - font: 500 13px/20px var(--base-font); - color: var(--text-color); - margin: 0 0 5px; - padding-left: 15px; - position: relative; - - &:before { - content: ''; - position: absolute; - display: block; - width: 4px; - height: 4px; - border-radius: var(--border-radius); - background: var(--color-primary-light); - left: 0; - top: 50%; - transform: translate(0, -50%); - } - - &:last-child { - margin-bottom: 0; - } - } - } - } - - .user_email-actions { - padding: 20px; - - .button, - .label { - margin-left: 10px; - } - } - - &:last-child { - border-bottom: none; - } - } - } - - &.block-toggles { - display: flex; - flex-direction: column; - gap: 20px; - - .toggle-item { - border: 1px dashed #bfbfbf; - border-radius: calc(var(--border-radius)); - align-items: center; - background: #f6f9fc; - padding: 20px; - color: #646f79; - width: 100%; - display: flex; - flex-grow: 1; - - .toggle-label { - font: 600 13px/13px var(--base-font); - color: #646f79; - display: flex; - flex-grow: 1; - - &:hover { - color: #426993; - transition: all 0.4s; - } - } - - .form-toggle { - width: auto; - } - - &.active { - background: #fff; - color: #134478; - border-color: transparent; - box-shadow: 0 0 10px rgba(25, 39, 52, 0.22); - - .toggle-label { - color: #134478; - } - } - } - } -} - -.signup-layout { - background-color: #f7f9fc; - - .header-auth { - display: none !important; - } - - .header-logo { - display: none !important; - } - - .section-footer { - display: none !important; - } - - .app.app-header { - padding: 0; - } - - .text-primary { - color: #305dfb !important; - } - - .card { - border: 1px solid #d2e6ff; - box-shadow: 5px 25px 35px rgba($color: #000000, $alpha: 0.075); - margin-bottom: 30px; - - .card-header { - border-bottom: 1px solid #d2e6ff; - position: relative; - - .card-header-image { - position: absolute; - bottom: 0; - right: 20px; - width: 40px; - } - } - - .card-title { - font: 700 22px/36px var(--base-font); - color: #282b39; - - i, - b { - font-weight: 700; - font-size: 22px; - } - } - - .card-subtitle { - font: 400 16px/24px var(--base-font); - color: #646f79; - - i, - b { - font-size: 16px; - } - } - - .card-subdescription { - font: 400 13px/20px var(--base-font); - color: #646f79; - - i, - b { - font-size: 13px; - } - } - - .card-section { - border-color: #d2e6ff; - - .card-title { - font: 700 22px var(--base-font); - margin: 0 0 15px; - color: #282b39; - } - - .card-col { - border-color: #d2e6ff; - } - } - } - - .button { - transform: translate(0, 0); - font: 700 14px/30px var(--base-font); - padding: 10px 65px; - text-align: center; - border-radius: var(--border-radius); - - &.button-primary { - background: #305dfb; - border-color: #305dfb; - color: #fff; - - &:hover { - background: #4c74ff; - border-color: #4c74ff; - } - } - - &.button-text { - &.button-text-primary { - color: #305dfb; - } - } - - &.button-default { - background: #282b39; - border-color: #282b39; - color: #fff; - - &:hover { - background: #646f79; - border-color: #646f79; - } - } - - &.button-text { - &:hover { - color: #305dfb; - } - } - } - - .form { - .form-label { - text-transform: uppercase; - font-weight: 600; - font-size: 11px; - } - - .form-group { - margin-bottom: 15px; - } - } - - // override - .block { - &.block-schedule-editor { - .schedule-item { - select.form-control { - height: 34px; - padding: 0 12px; - border: 1px solid #d2e6ff; - color: #282b39; - font: 500 12px var(--base-font); - } - } - } - - &.block-office-edit-card { - background: #fff; - border: 1px solid #d2e6ff; - border-radius: var(--border-radius); - box-shadow: 2px 5px 5px rgba($color: #000000, $alpha: 0.05); - margin-bottom: 25px; - - &:last-of-type { - margin-bottom: 0; - } - } - } - - .modal { - .modal-window { - background: #fff; - } - } - - &.signup-layout-new { - background: #fff; - - .button { - line-height: 28px; - font-size: 16px; - font-weight: 500; - border-radius: calc(var(--border-radius)); - - &.button-disabled, - [disabled] { - background: #eff2f4; - border-color: #eff2f4; - color: #ccd0e0; - box-shadow: none; - pointer-events: none; - cursor: default; - - &:hover { - box-shadow: none; - } - } - - .mdi { - font-size: 26px; - - &.icon-start { - margin-left: -10px; - margin-right: 10px; - } - - &.icon-end { - margin-left: 10px; - margin-right: -10px; - } - } - } - - @media (max-width: 991px) { - .modal { - .button { - font-size: 14px; - padding: 7px 35px; - } - } - - .fund-apply { - .card { - .card-section { - &.card-section-fund { - flex-direction: column; - align-items: flex-start; - justify-content: flex-start; - padding: 20px 20px; - - .card-section-actions { - order: 2; - position: initial; - margin: 0 0 0; - width: 100%; - - .button { - width: 100%; - } - } - - .card-block { - &.card-block-fund { - order: 1; - padding: 0 0 0; - } - } - } - } - } - } - - .sign_up-pane-body { - .block-photo-selector { - display: flex; - max-width: none; - - .photo-img { - width: 80px; - height: 80px; - margin: 0 20px 0 0 !important; - } - - .photo-details { - max-width: calc(100% - 100px); - - .photo-label, - .photo-description { - text-align: left; - line-height: 20px; - } - } - } - - .sign_up-pane-auth { - .sign_up-pane-auth-qr_code { - .block.block-qr-code { - margin: 0 auto; - } - } - } - - .sign_up-pane-section { - flex-direction: column !important; - padding-right: 0 !important; - - .sign_up-pane-col { - width: 100% !important; - padding: 14px !important; - border-top: 1px solid #edeef0; - - &.sign_up-pane-col-2 { - order: 1; - } - } - } - - .ui-control { - &.ui-control-checkbox { - padding-top: 5px; - padding-bottom: 5px; - } - } - } - - .finish-screen { - .sign_up-pane-body { - .sign_up-pane-text { - padding-left: 10px; - padding-right: 10px; - text-align: center !important; - } - - .button { - background-color: #e1e8ff; - border-radius: var(--border-radius); - } - } - } - - .sign_up-pane-footer { - .button { - .mdi { - &:before, - &:after { - line-height: inherit; - } - } - } - } - } - } -} - -@media screen and (max-width: 1000px) { - .wrapper { - padding: 0 25px; - } -} +@import 'dropdown/dropdown-actions'; diff --git a/react/assets/forus-platform/scss/_common/dropdown/dropdown-actions.scss b/react/assets/forus-platform/scss/_common/dropdown/dropdown-actions.scss index 4b98987e2..f20ac5e59 100644 --- a/react/assets/forus-platform/scss/_common/dropdown/dropdown-actions.scss +++ b/react/assets/forus-platform/scss/_common/dropdown/dropdown-actions.scss @@ -1,18 +1,12 @@ -&.dropdown-actions { - border: 1px solid var(--border-color); - border-radius: var(--border-radius); - background: #fff; +.dropdown.dropdown-actions { width: 240px; color: var(--text-color); box-shadow: var(--box-shadow); - display: flex; flex-direction: column; - border-radius: var(--border-radius); border: 1px solid var(--border-color); + border-radius: var(--border-radius); background: #ffffff; - box-shadow: var(--box-shadow); padding: 4px; - flex-direction: column; display: grid; .dropdown-item { diff --git a/react/assets/forus-platform/scss/_common/includes/common.scss b/react/assets/forus-platform/scss/_common/includes/common.scss index 2fa00a3fd..5340feb92 100644 --- a/react/assets/forus-platform/scss/_common/includes/common.scss +++ b/react/assets/forus-platform/scss/_common/includes/common.scss @@ -5,9 +5,16 @@ z-index: 1; } +html, +body { + height: 100%; +} + body { background: #f1f4f7; min-height: 100vh; + display: flex; + flex-direction: column; @include webkit_scrollbar(#848588); } diff --git a/react/assets/forus-platform/scss/_common/includes/helpers.scss b/react/assets/forus-platform/scss/_common/includes/helpers.scss index 26f625921..389dcabc1 100644 --- a/react/assets/forus-platform/scss/_common/includes/helpers.scss +++ b/react/assets/forus-platform/scss/_common/includes/helpers.scss @@ -209,5 +209,5 @@ } @function assetUrl($url) { - @return if(variable-exists(buildReact), url('./assets/' + $url), url('../' + $url)); + @return url('./assets/' + $url); } diff --git a/react/assets/forus-platform/scss/_common/includes/ie.scss b/react/assets/forus-platform/scss/_common/includes/ie.scss deleted file mode 100644 index 1c3fb9d8d..000000000 --- a/react/assets/forus-platform/scss/_common/includes/ie.scss +++ /dev/null @@ -1,104 +0,0 @@ -.header-splash { - position: absolute; - top: 0; - right: 0; - width: 100%; - z-index: 0; - - .splash { - background-image: url(../img/landing/splash-top.png); - background-position: 100% 0; - background-size: auto 100%; - background-repeat: no-repeat; - height: 750px; - width: 100%; - } -} - -.block { - &.block-cards { - .card-item { - .card-description { - max-width: 400px; - } - } - } - &.block-old-ie { - width: 1200px; - margin: auto; - max-width: 100%; - position: relative; - z-index: 1; - padding: 50px 100px; - box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2); - background-color: #fff; - border-radius: 10px; - - .title { - font: 700 30px/50px var(--base-font); - } - - .description { - font: 400 15px/24px var(--base-font); - } - - .btn-block { - margin-top: 35px; - - .button { - font: 700 14px/24px var(--base-font); - color: #646f79; - cursor: pointer; - border: 1px solid transparent; - padding: 12px 25px; - -webkit-transition: color 0.4s, background 0.4s, border 0.4s, -webkit-box-shadow 0.4s; - transition: color 0.4s, background 0.4s, border 0.4s, -webkit-box-shadow 0.4s; - transition: color 0.4s, background 0.4s, box-shadow 0.4s, border 0.4s; - transition: color 0.4s, background 0.4s, box-shadow 0.4s, border 0.4s, -webkit-box-shadow 0.4s; - border-radius: 6px; - display: inline-block; - margin-right: 15px; - text-align: center; - - &.button-upper { - color: #fff; - background: #305dfb; - border: 1px solid #305dfb; - -webkit-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15); - box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15); - padding: 7px 25px; - text-transform: uppercase; - - &:not(:last-of-type) { - margin-right: 25px; - } - - img { - margin: 2px 15px 0 -15px; - float: left; - display: block; - -webkit-transition: 0.4s; - transition: 0.4s; - } - - &:hover { - color: #fff; - background: #4c74ff; - -webkit-box-shadow: 0 10px 20px rgba(0, 0, 0, 0.3); - box-shadow: 0 10px 20px rgba(0, 0, 0, 0.3); - - img { - filter: none; - } - } - } - } - } - } -} - -.oldie { - height: 100%; - padding-top: 90px; - display: none; -} diff --git a/react/assets/forus-platform/scss/_common/landing.scss b/react/assets/forus-platform/scss/_common/landing.scss index 0a24063b3..d15a621f4 100644 --- a/react/assets/forus-platform/scss/_common/landing.scss +++ b/react/assets/forus-platform/scss/_common/landing.scss @@ -319,23 +319,6 @@ } } -.header-splash { - position: relative; - top: 0; - right: 0; - width: 100%; - z-index: 0; - - .splash { - background-image: assetUrl('../img/landing/splash-top.png'); - background-position: 100% 0; - background-size: auto 100%; - background-repeat: no-repeat; - height: 750px; - width: 100%; - } -} - .button { font: 700 14px/24px var(--base-font-landing); color: #646f79; @@ -796,101 +779,6 @@ } } - &.block-cards { - position: relative; - z-index: 3; - margin: 0 0 70px; - float: left; - display: flex; - width: 100%; - @include cf(); - - .card-item { - width: 50%; - margin-bottom: 20px; - display: flex; - - .card-item-inner { - border-radius: 6px; - overflow: hidden; - box-shadow: 0 10px 50px rgba(#000, 0.2); - background-color: #ffffff; - position: relative; - transform: translate(0, 0); - transition: transform 0.4s; - cursor: default; - min-height: 200px; - display: flex; - - .card-icon { - position: absolute; - width: 340px; - height: 340px; - background: #f9fbf0; - border-radius: 340px; - right: 100%; - top: 50%; - margin-right: -170px; - transform: translate(0, -50%); - - img { - display: block; - width: 110px; - height: 110px; - position: absolute; - top: 50%; - right: 30px; - transform: translate(0, -50%); - } - } - - .card-content { - height: 100%; - flex-grow: 1; - padding: 30px 25px 30px 200px; - display: flex; - flex-direction: column; - justify-content: center; - } - - .card-title { - font: 700 18px/24px var(--base-font-landing); - color: #282b39; - margin-bottom: 5px; - - .mdi { - font-size: 1em; - line-height: inherit; - color: #004195; - vertical-align: baseline; - position: relative; - margin-left: 0; - transition: 0.4s; - } - } - - .card-description { - font: 600 14px/25px var(--base-font-landing); - color: #646f79; - } - } - - &:nth-child(1) { - padding-right: 15px; - } - - &:nth-child(2) { - padding-left: 15px; - - .card-item-inner { - .card-icon { - background: #f2fafd; - } - } - } - } - } - &.block-auth-type { font-size: 0; padding: 0 0 20px; @@ -972,18 +860,6 @@ } } - &.block-cards { - .card-item { - &:nth-child(1) { - padding-right: 10px; - } - - &:nth-child(2) { - padding-left: 10px; - } - } - } - &.block-auth-type { .auth_type-item { .auth_type-icon { @@ -1137,50 +1013,6 @@ } } - &.block-cards { - flex-direction: column; - margin: 0 0 30px; - - .card-item { - width: 100%; - - .card-item-inner { - .card-icon { - margin-right: -100px; - - img { - right: 20px; - width: 60px; - height: auto; - } - } - - .card-title { - font: 700 16px/24px var(--base-font-landing); - margin: 0 0 10px; - } - - .card-description { - font: 400 14px/22px var(--base-font-landing); - margin: 0 0 10px; - } - - .card-content { - padding-left: 120px; - } - } - - &:nth-child(1) { - padding-right: 0; - } - - &:nth-child(2) { - padding-left: 0; - margin-bottom: 0; - } - } - } - &.block-auth-type { margin: 0 0 10px; @@ -1258,16 +1090,6 @@ width: 1100px; } - .header-splash { - .splash { - height: 650px; - - &.splash-c { - height: 700px; - } - } - } - .app-instruction { .step-item { padding: 50px 80px; @@ -1301,13 +1123,6 @@ padding: 0 25px; } - .header-splash { - .splash { - height: 300px; - background-size: 75% auto; - } - } - .label { padding: 0 10px; font: 700 11px/22px var(--base-font-landing); diff --git a/react/assets/forus-platform/scss/_common/modals/modal-2fa-setup.scss b/react/assets/forus-platform/scss/_common/modals/modal-2fa-setup.scss new file mode 100644 index 000000000..442eaeeca --- /dev/null +++ b/react/assets/forus-platform/scss/_common/modals/modal-2fa-setup.scss @@ -0,0 +1,17 @@ +.modal.modal-2fa-setup { + .modal-section { + overflow: visible; + } + + .modal-body { + overflow: visible; + + .phone-control { + margin-bottom: 10px; + } + + .modal-text { + text-align: left; + } + } +} diff --git a/react/assets/forus-platform/scss/_common/modals/modal-bulk-upload.scss b/react/assets/forus-platform/scss/_common/modals/modal-bulk-upload.scss index 785d6168f..bb037f34d 100644 --- a/react/assets/forus-platform/scss/_common/modals/modal-bulk-upload.scss +++ b/react/assets/forus-platform/scss/_common/modals/modal-bulk-upload.scss @@ -1,4 +1,4 @@ -&.modal-bulk-upload { +.modal.modal-bulk-upload { .modal-window { width: 760px; diff --git a/react/assets/forus-platform/scss/_common/modals/modal-feature-contact.scss b/react/assets/forus-platform/scss/_common/modals/modal-feature-contact.scss new file mode 100644 index 000000000..e84366dc7 --- /dev/null +++ b/react/assets/forus-platform/scss/_common/modals/modal-feature-contact.scss @@ -0,0 +1,92 @@ +.modal.modal-feature-contact { + .modal-close { + top: 15px; + color: #646f79; + } + + .modal-header { + padding: 15px 20px; + } + + .modal-section { + .icon-wrapper { + display: flex; + justify-content: center; + margin-bottom: 15px; + + .icon { + border-radius: var(--border-radius); + border: 1px solid #d4d9dd; + background: #fff; + display: flex; + justify-content: center; + align-items: center; + height: 48px; + width: 50px; + + .mdi { + font-size: 22px; + line-height: 22px; + color: #004195; + } + } + } + + .title { + font: 600 16px/24px var(--base-font); + color: #2b303a; + margin-bottom: 5px; + } + + .description { + font: 400 13px/18px var(--base-font); + color: #414141; + margin-bottom: 24px; + } + + .contact-row { + display: flex; + flex-wrap: wrap; + gap: 8px; + + .contact-item { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + border-radius: var(--border-radius); + border: 1px dashed #d4d9dd; + background: #fff; + padding: 20px; + + .icon { + margin-bottom: 10px; + + .mdi { + font-size: 18px; + line-height: 18px; + color: #134478; + } + } + + .title { + font: 600 14px/1 var(--base-font); + color: #282b39; + margin-bottom: 5px; + } + + .description { + font: 400 14px/20px var(--base-font); + color: #282b39; + margin-bottom: 0; + } + } + } + } + + .modal-footer { + .button { + line-height: 1; + padding: 8px 12px; + } + } +} diff --git a/react/assets/forus-platform/scss/_common/modals/modal-fund-offers.scss b/react/assets/forus-platform/scss/_common/modals/modal-fund-offers.scss new file mode 100644 index 000000000..9e1dbea90 --- /dev/null +++ b/react/assets/forus-platform/scss/_common/modals/modal-fund-offers.scss @@ -0,0 +1,15 @@ +.modal.modal-fund-offers { + .modal-window { + width: 1400px; + + .modal-section { + .table { + td { + &:last-child { + width: 150px; + } + } + } + } + } +} diff --git a/react/assets/forus-platform/scss/_common/modals/modal-fund-unsubscribe.scss b/react/assets/forus-platform/scss/_common/modals/modal-fund-unsubscribe.scss new file mode 100644 index 000000000..1e8ac4737 --- /dev/null +++ b/react/assets/forus-platform/scss/_common/modals/modal-fund-unsubscribe.scss @@ -0,0 +1,60 @@ +.modal.modal-fund-unsubscribe { + .modal-window { + width: 820px; + border-radius: 12px; + + .modal-title { + font: 600 14px/21px var(--base-font); + text-align: center; + color: #252325; + margin-bottom: 10px; + } + + .modal-description { + font: 400 13px/18px var(--base-font); + text-align: center; + color: #646f79; + padding-bottom: 20px; + margin-bottom: 20px; + border-bottom: 1px solid #d4d9dd; + } + + .modal-warning { + border: 1px dashed #d4d9dd; + border-radius: var(--border-radius); + padding: 15px 13px; + margin-top: 20px; + background-color: #f6f9fc; + + .modal-warning-icon { + display: flex; + width: 50px; + height: 100%; + + .mdi { + margin-left: auto; + margin-right: auto; + } + } + + .modal-warning-details { + .modal-warning-title { + color: #646f79; + font: 500 13px/18px var(--base-font); + margin-bottom: 5px; + } + + .modal-warning-description { + color: #134478; + font: 600 11px/13px var(--base-font); + margin-bottom: 5px; + } + + .modal-warning-phone { + color: #404040; + font: 600 13px/18px var(--base-font); + } + } + } + } +} diff --git a/react/assets/forus-platform/scss/_common/modals/modal-image-preview.scss b/react/assets/forus-platform/scss/_common/modals/modal-image-preview.scss new file mode 100644 index 000000000..82532f1d2 --- /dev/null +++ b/react/assets/forus-platform/scss/_common/modals/modal-image-preview.scss @@ -0,0 +1,28 @@ +.modal.modal-image-preview { + .modal-window { + .modal-body { + .modal-section { + padding: 0; + max-width: 100%; + } + } + } + + .block-pdf-preview { + canvas { + display: block; + max-width: 100%; + } + } + + .img-block { + display: flex; + margin: 0 auto; + justify-content: center; + + img { + height: 100%; + max-width: 100%; + } + } +} diff --git a/react/assets/forus-platform/scss/_common/modals/modal-pdf-preview.scss b/react/assets/forus-platform/scss/_common/modals/modal-pdf-preview.scss new file mode 100644 index 000000000..ba960aa4d --- /dev/null +++ b/react/assets/forus-platform/scss/_common/modals/modal-pdf-preview.scss @@ -0,0 +1,39 @@ +.modal.modal-pdf-preview { + .modal-window { + display: flex; + flex-direction: column; + + .modal-body { + flex-grow: 1; + width: 100%; + display: flex; + + .modal-section { + padding: 0; + max-width: 100%; + + .block.block-pdf-preview { + width: 100%; + flex-grow: 1; + overflow: auto; + + canvas { + display: block; + max-width: 100%; + } + } + } + } + } + + .img-block { + display: flex; + margin: 0 auto; + justify-content: center; + + img { + height: 100%; + max-width: 100%; + } + } +} diff --git a/react/assets/forus-platform/scss/_common/modals/modal-photo-upload.scss b/react/assets/forus-platform/scss/_common/modals/modal-photo-upload.scss index 56f8d6cba..9b50c46ed 100644 --- a/react/assets/forus-platform/scss/_common/modals/modal-photo-upload.scss +++ b/react/assets/forus-platform/scss/_common/modals/modal-photo-upload.scss @@ -1,4 +1,4 @@ -&.modal-photo-upload { +.modal.modal-photo-upload { cursor: default; .modal-title { diff --git a/react/assets/forus-platform/scss/_common/modals/modal-pin-code.scss b/react/assets/forus-platform/scss/_common/modals/modal-pin-code.scss index ab441041e..20c6408c7 100644 --- a/react/assets/forus-platform/scss/_common/modals/modal-pin-code.scss +++ b/react/assets/forus-platform/scss/_common/modals/modal-pin-code.scss @@ -1,4 +1,4 @@ -&.modal-pin-code { +.modal.modal-pin-code { .modal-window { width: 820px; overflow: auto; diff --git a/react/assets/forus-platform/scss/_common/modals/modal-provider-products-required.scss b/react/assets/forus-platform/scss/_common/modals/modal-provider-products-required.scss index 755f8c82d..b87e8d6cc 100644 --- a/react/assets/forus-platform/scss/_common/modals/modal-provider-products-required.scss +++ b/react/assets/forus-platform/scss/_common/modals/modal-provider-products-required.scss @@ -1,4 +1,4 @@ -&.modal-provider-products-required { +.modal.modal-provider-products-required { .modal-body { .modal-section.modal-section-funds-list { .card { diff --git a/react/assets/forus-platform/scss/_common/modals/modal-voucher-create.scss b/react/assets/forus-platform/scss/_common/modals/modal-voucher-create.scss new file mode 100644 index 000000000..146514685 --- /dev/null +++ b/react/assets/forus-platform/scss/_common/modals/modal-voucher-create.scss @@ -0,0 +1,11 @@ +.modal.modal-voucher-create { + .modal-window { + width: 760px; + + .modal-body { + .modal-section { + padding: 25px 80px; + } + } + } +} diff --git a/react/assets/forus-platform/scss/_common/modals/modal-voucher-transaction.scss b/react/assets/forus-platform/scss/_common/modals/modal-voucher-transaction.scss index 31a57b4f8..b872f17fe 100644 --- a/react/assets/forus-platform/scss/_common/modals/modal-voucher-transaction.scss +++ b/react/assets/forus-platform/scss/_common/modals/modal-voucher-transaction.scss @@ -1,4 +1,4 @@ -&.modal-voucher-transaction { +.modal.modal-voucher-transaction { .modal-body { .modal-section { .block.block-compact-datalist { diff --git a/react/assets/forus-platform/scss/_common/modals/modal-voucher_qr.scss b/react/assets/forus-platform/scss/_common/modals/modal-voucher_qr.scss new file mode 100644 index 000000000..47db7879f --- /dev/null +++ b/react/assets/forus-platform/scss/_common/modals/modal-voucher_qr.scss @@ -0,0 +1,45 @@ +.modal.modal-voucher_qr { + .modal-window { + width: 540px; + + .form { + width: 380px; + max-width: 100%; + margin: 0 auto; + } + + .voucher_qr-block { + .voucher_qr-title { + color: #282b39; + font: 600 16px var(--base-font); + text-align: center; + margin: 0 0 20px; + } + + .voucher_qr-actions { + width: 300px; + max-width: 100%; + margin: 0 auto; + } + + .block.block-qr-code { + width: 170px; + margin: 0 auto 20px; + + .qr_code { + width: 100%; + background: #fff; + padding: 10px; + height: 100%; + border: 1px solid var(--border-color); + box-shadow: 0 2px 4px 1px rgba($color: #000000, $alpha: 0.05); + + img, + canvas { + width: 100%; + } + } + } + } + } +} diff --git a/react/assets/forus-platform/scss/_common/components/modals.scss b/react/assets/forus-platform/scss/_common/modals/modal.scss similarity index 61% rename from react/assets/forus-platform/scss/_common/components/modals.scss rename to react/assets/forus-platform/scss/_common/modals/modal.scss index 6b4f9e91b..843499acf 100644 --- a/react/assets/forus-platform/scss/_common/components/modals.scss +++ b/react/assets/forus-platform/scss/_common/modals/modal.scss @@ -464,52 +464,6 @@ } } - &.modal-voucher_qr { - .modal-window { - width: 540px; - - .form { - width: 380px; - max-width: 100%; - margin: 0 auto; - } - - .voucher_qr-block { - .voucher_qr-title { - color: #282b39; - font: 600 16px var(--base-font); - text-align: center; - margin: 0 0 20px; - } - - .voucher_qr-actions { - width: 300px; - max-width: 100%; - margin: 0 auto; - } - - .block.block-qr-code { - width: 170px; - margin: 0 auto 20px; - - .qr_code { - width: 100%; - background: #fff; - padding: 10px; - height: 100%; - border: 1px solid var(--border-color); - box-shadow: 0 2px 4px 1px rgba($color: #000000, $alpha: 0.05); - - img, - canvas { - width: 100%; - } - } - } - } - } - } - &.modal-lg { .modal-window { width: 960px; @@ -528,22 +482,6 @@ } } - &.modal-fund-offers { - .modal-window { - width: 1400px; - - .modal-section { - .table { - td { - &:last-child { - width: 150px; - } - } - } - } - } - } - &.modal-animated { .modal-backdrop, .modal-window { @@ -575,239 +513,6 @@ } } - &.modal-pdf-preview, - &.modal-image-preview { - .modal-window { - .modal-body { - .modal-section { - padding: 0; - max-width: 100%; - } - } - } - - .block-pdf-preview { - canvas { - display: block; - max-width: 100%; - } - } - - .img-block { - display: flex; - margin: 0 auto; - justify-content: center; - - img { - height: 100%; - max-width: 100%; - } - } - } - - &.modal-pdf-preview { - .modal-window { - display: flex; - flex-direction: column; - - .modal-body { - flex-grow: 1; - width: 100%; - display: flex; - } - - .block.block-pdf-preview { - width: 100%; - flex-grow: 1; - overflow: auto; - } - } - } - - &.modal-fund-unsubscribe { - .modal-window { - width: 820px; - border-radius: 12px; - - .modal-title { - font: 600 14px/21px var(--base-font); - text-align: center; - color: #252325; - margin-bottom: 10px; - } - - .modal-description { - font: 400 13px/18px var(--base-font); - text-align: center; - color: #646f79; - padding-bottom: 20px; - margin-bottom: 20px; - border-bottom: 1px solid #d4d9dd; - } - - .modal-warning { - border: 1px dashed #d4d9dd; - border-radius: var(--border-radius); - padding: 15px 13px; - margin-top: 20px; - background-color: #f6f9fc; - - .modal-warning-icon { - display: flex; - width: 50px; - height: 100%; - - .mdi { - margin-left: auto; - margin-right: auto; - } - } - - .modal-warning-details { - .modal-warning-title { - color: #646f79; - font: 500 13px/18px var(--base-font); - margin-bottom: 5px; - } - - .modal-warning-description { - color: #134478; - font: 600 11px/13px var(--base-font); - margin-bottom: 5px; - } - - .modal-warning-phone { - color: #404040; - font: 600 13px/18px var(--base-font); - } - } - } - } - } - - &.modal-2fa-setup { - .modal-section { - overflow: visible; - } - - .modal-body { - overflow: visible; - - .phone-control { - margin-bottom: 10px; - } - - .modal-text { - text-align: left; - } - } - } - - &.modal-voucher-create { - .modal-window { - width: 760px; - - .modal-body { - .modal-section { - padding: 25px 80px; - } - } - } - } - - &.modal-feature-contact { - .modal-close { - top: 15px; - color: #646f79; - } - - .modal-header { - padding: 15px 20px; - } - - .modal-section { - .icon-wrapper { - display: flex; - justify-content: center; - margin-bottom: 15px; - - .icon { - border-radius: var(--border-radius); - border: 1px solid #d4d9dd; - background: #fff; - display: flex; - justify-content: center; - align-items: center; - height: 48px; - width: 50px; - - .mdi { - font-size: 22px; - line-height: 22px; - color: #004195; - } - } - } - - .title { - font: 600 16px/24px var(--base-font); - color: #2b303a; - margin-bottom: 5px; - } - - .description { - font: 400 13px/18px var(--base-font); - color: #414141; - margin-bottom: 24px; - } - - .contact-row { - display: flex; - flex-wrap: wrap; - gap: 8px; - - .contact-item { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; - border-radius: var(--border-radius); - border: 1px dashed #d4d9dd; - background: #fff; - padding: 20px; - - .icon { - margin-bottom: 10px; - - .mdi { - font-size: 18px; - line-height: 18px; - color: #134478; - } - } - - .title { - font: 600 14px/1 var(--base-font); - color: #282b39; - margin-bottom: 5px; - } - - .description { - font: 400 14px/20px var(--base-font); - color: #282b39; - margin-bottom: 0; - } - } - } - } - - .modal-footer { - .button { - line-height: 1; - padding: 8px 12px; - } - } - } - @media screen and (max-width: 1800px) { .modal-footer { padding: 25px; @@ -827,18 +532,6 @@ font: 700 12px/26px var(--base-font); } } - - &.modal-auth { - .modal-title { - font: 700 24px var(--base-font); - } - - .modal-subtitle { - font: 400 16px var(--base-font); - padding: 0 10px 20px; - margin: 0 40px; - } - } } @media screen and (max-width: 1000px) { @@ -848,34 +541,5 @@ top: 20px; right: 20px; } - - &.modal-auth { - padding: 0; - - .modal-footer { - margin: 0 -25px 0; - padding: 25px 25px 0 !important; - - .footer-text { - font: 500 14px/26px var(--base-font); - margin: 0 0 30px; - } - - .modal-footer-link { - font: 700 11px/20px var(--base-font); - padding-left: 20px; - margin-bottom: 15px; - - span { - width: 20px; - margin-left: -20px; - } - - &:last-of-type { - margin-bottom: 0; - } - } - } - } } } diff --git a/react/assets/forus-webshop/scss/includes/blocks/block-auth-widget.scss b/react/assets/forus-webshop/scss/includes/blocks/block-auth-widget.scss deleted file mode 100644 index ecf177975..000000000 --- a/react/assets/forus-webshop/scss/includes/blocks/block-auth-widget.scss +++ /dev/null @@ -1,177 +0,0 @@ -.block.block-auth-widget { - .auth-title { - font: 600 18px/20px var(--base-font); - color: #333; - margin: 0 0 5px; - } - - .auth-subtitle { - cursor: pointer; - font: 400 14px/20px var(--base-font); - color: #333; - margin-bottom: 10px; - } - - .auth-form { - margin: 0 0 30px; - display: flex; - flex-direction: row; - - .auth-form-input { - flex-grow: 1; - padding-right: 20px; - } - - .button { - box-shadow: none; - width: 175px; - text-align: center; - - p &:hover { - box-shadow: none; - } - } - } - - .auth-digid { - border: 1px solid #e7e7e7; - border-left: none; - border-right: none; - padding: 18px 0px; - margin: 0 0 30px; - - .auth-digid-link { - color: #3661ff; - font: 600 14px/20px var(--base-font); - display: inline-flex; - flex-direction: row; - - .mdi { - font-size: 1.5em; - height: 20px; - line-height: 20px; - display: flex; - flex-direction: row; - justify-content: center; - justify-items: center; - transition: .4s; - transform: translate(0, 0); - margin: 1px 0 -1px; - } - - &:hover { - .mdi { - transform: translate(2px, 0); - } - } - } - } - - .auth-digid-form { - padding: 10px; - - .auth-title { - margin: 0 0 20px; - } - - .auth-subtitle { - margin: 0 0 20px; - - &:last-child { - margin-bottom: 0; - } - } - } - - .auth-digid-message { - display: flex; - flex-direction: column; - align-content: center; - justify-items: center; - align-items: center; - justify-content: center; - text-align: center; - padding: 10px 0; - - .digid-icon { - color: #3661ff; - width: 140px; - height: 140px; - border-radius: 140px; - background: #fff; - text-align: center; - line-height: 140px; - font-size: 80px; - margin: 0 0 20px; - } - - .digid-title { - color: #282b39; - font: 600 21px/20px var(--base-font); - margin: 0 0 20px; - } - - .digid-message { - color: #646f79; - font: 500 14px/20px var(--base-font); - } - } - - .auth-qr_code { - display: flex; - flex-direction: column; - - .qr_code-container { - display: flex; - flex-direction: row; - font: 400 14px/20px var(--base-font); - - .qr_code-description { - flex-grow: 1; - - a { - color: #3661ff; - text-decoration: underline; - font: 600 14px var(--base-font); - } - } - - .qr_code-block { - width: 175px; - min-width: 175px; - - .block-qr-code { - .qr_code { - padding: 10px; - width: 100%; - height: auto; - border: 2px dashed #000; - } - } - } - } - } - - @media screen and (max-width: 1000px) { - .auth-title { - font-size: 16px; - font-weight: 700; - margin: 0 0 10px; - } - - .auth-subtitle { - font-size: 13px; - font-weight: 400; - line-height: 18px; - margin: 0 0 15px; - } - - .auth-form { - margin: 0 0 10px; - - .button { - width: auto; - } - } - } -} \ No newline at end of file diff --git a/react/assets/forus-webshop/scss/includes/blocks/block-file-uploader.scss b/react/assets/forus-webshop/scss/includes/blocks/block-file-uploader.scss index d5192646f..510995003 100644 --- a/react/assets/forus-webshop/scss/includes/blocks/block-file-uploader.scss +++ b/react/assets/forus-webshop/scss/includes/blocks/block-file-uploader.scss @@ -326,6 +326,140 @@ } } + &.block-file-uploader-group { + flex-direction: column-reverse; + gap: 16px; + padding: 18px 20px; + border: 1px solid var(--border-color); + border-radius: var(--border-radius); + box-shadow: var(--box-shadow); + background: #fbfbfb; + + .droparea-icon, + .droparea-title, + .droparea-hidden-input { + display: none; + } + + .uploader-droparea { + display: flex; + padding: 0; + background: none; + border: none; + flex-direction: row; + justify-content: flex-start; + align-items: center; + gap: 18px; + + .droparea-button { + .button { + padding: 10px 20px; + gap: 10px; + font: 600 15px/22px var(--base-font); + border-radius: var(--button-border-radius); + } + } + + .droparea-max-limit { + color: #5c6170; + font-size: 14px; + font-weight: 500; + line-height: 20px; + font-family: var(--base-font), serif; + } + } + + .uploader-files { + gap: 10px; + + .uploader-files-title { + display: flex; + align-items: center; + font: 700 18px/24px var(--base-font); + gap: 10px; + + .uploader-files-title-count { + padding: 2px 10px; + background: #ffffff; + border: 1px solid var(--border-color); + border-radius: var(--border-radius); + font: 600 14px/20px var(--base-font); + color: #222633; + } + } + + .file-item { + .file-item-container { + padding: 9px 12px; + border: 1px solid var(--border-color); + border-radius: var(--border-radius); + box-shadow: var(--box-shadow); + align-items: center; + background: #fff; + } + + .file-item-name { + font: 600 13px/22px var(--base-font); + color: #2a2f3a; + width: auto; + flex: 1 1 auto; + } + + .file-item-progress { + flex: 1 1 35%; + padding-left: 12px; + align-items: center; + gap: 10px; + flex-direction: row; + min-width: 160px; + + .file-item-progress-container { + background-color: var(--border-color); + flex: 1 1 auto; + border-radius: 999px; + + progress[value] { + height: 6px; + width: 100%; + display: block; + border-radius: 999px; + + &::-webkit-progress-bar { + background-color: var(--border-color); + border-radius: 999px; + } + + &::-webkit-progress-value { + background-color: var(--color-primary); + border-radius: 999px; + } + + &::-moz-progress-bar { + background-color: var(--color-primary); + border-radius: 999px; + } + } + } + + .file-item-progress-value { + font: 600 13px/20px var(--base-font); + color: #5c6170; + } + } + + .file-item-action { + display: flex; + align-items: center; + padding-left: 12px; + + .mdi { + font-size: 18px; + } + } + } + } + } + @media (max-width: 991px) { .uploader-droparea { border: none; @@ -337,5 +471,21 @@ display: none; } } + + &.block-file-uploader-group { + .uploader-droparea { + flex-direction: column; + align-items: stretch; + + .droparea-button { + width: 100%; + + .button { + width: 100%; + justify-content: center; + } + } + } + } } } diff --git a/react/assets/forus-webshop/scss/includes/blocks/map.scss b/react/assets/forus-webshop/scss/includes/blocks/block-map.scss similarity index 100% rename from react/assets/forus-webshop/scss/includes/blocks/map.scss rename to react/assets/forus-webshop/scss/includes/blocks/block-map.scss diff --git a/react/assets/forus-webshop/scss/includes/blocks/block-map_card.scss b/react/assets/forus-webshop/scss/includes/blocks/block-map_card.scss deleted file mode 100644 index a469d2592..000000000 --- a/react/assets/forus-webshop/scss/includes/blocks/block-map_card.scss +++ /dev/null @@ -1,90 +0,0 @@ -.block.block-map_card { - box-shadow: var(--box-shadow); - border: 1px solid var(--border-color); - border-radius: var(--border-radius); - background: #fff; - margin-bottom: 30px; - cursor: default; - - .map_card-header, - .map_card-footer { - border-bottom: 1px solid var(--border-color); - background: #ffffff; - padding: 20px 25px; - font: var(--heading-pane-font); - color: var(--tc); - margin: 0 0 0; - - .map_card-title { - font: inherit; - margin: 0; - - &:last-child { - margin-bottom: 0; - } - } - - .map_card-subtitle { - color: #646f79; - font: 400 16px var(--base-font); - margin-bottom: 5px; - - &:last-child { - margin-bottom: 0; - } - } - - &:last-child { - border-bottom-width: 0; - } - } - - .map_card-header { - border-top-left-radius: inherit; - border-top-right-radius: inherit; - } - - .map_card-footer { - border-bottom-left-radius: inherit; - border-bottom-right-radius: inherit; - } - - .map_card-iframe { - border-bottom-left-radius: inherit; - border-bottom-right-radius: inherit; - border-bottom: 1px solid var(--border-color); - position: relative; - height: 550px; - overflow: hidden; - - iframe { - border-bottom-left-radius: inherit; - border-bottom-right-radius: inherit; - @include fill_parent(); - width: 100%; - height: 100%; - } - - .map { - border-bottom-left-radius: inherit; - border-bottom-right-radius: inherit; - @include fill_parent(); - width: 100%; - height: 100%; - } - - &:last-child { - border-bottom-width: 0; - } - } - - @media screen and (max-width: 1000px) { - .map_card-header { - padding: 15px 20px; - - .map_card-title { - font-size: 16px; - } - } - } -} \ No newline at end of file diff --git a/react/assets/forus-webshop/scss/includes/blocks/block-mobile-menu.scss b/react/assets/forus-webshop/scss/includes/blocks/block-mobile-menu.scss index 08fd2d902..710ef19ab 100644 --- a/react/assets/forus-webshop/scss/includes/blocks/block-mobile-menu.scss +++ b/react/assets/forus-webshop/scss/includes/blocks/block-mobile-menu.scss @@ -1,5 +1,3 @@ -$footer_base_font: 'Open Sans', arial, sans-serif; - .block.block-mobile-menu { --item-height: 44px; --item-line-height: 18px; diff --git a/react/assets/forus-webshop/scss/includes/blocks/block-sessions.scss b/react/assets/forus-webshop/scss/includes/blocks/block-sessions.scss index 480cc4d7f..e85e4300e 100644 --- a/react/assets/forus-webshop/scss/includes/blocks/block-sessions.scss +++ b/react/assets/forus-webshop/scss/includes/blocks/block-sessions.scss @@ -3,7 +3,6 @@ flex-direction: column; .session-item { - flex-direction: column; display: flex; padding: 20px; flex-direction: row; diff --git a/react/assets/forus-webshop/scss/includes/blocks/block-sign_up.scss b/react/assets/forus-webshop/scss/includes/blocks/block-sign_up.scss index 852a6e528..50acdff71 100644 --- a/react/assets/forus-webshop/scss/includes/blocks/block-sign_up.scss +++ b/react/assets/forus-webshop/scss/includes/blocks/block-sign_up.scss @@ -88,7 +88,7 @@ .sign_up-step { flex-grow: 1; text-align: right; - font: 500 14px/30px var(--base-font); + font: 600 14px/30px var(--base-font); color: #525252; border: none; margin-left: 1px; @@ -130,18 +130,20 @@ } &.sign_up-step-active { - color: var(--color-primary); + color: #000; + font-weight: 700; .sign_up-step-border:before { content: ''; display: block; @include fill_parent(); - background-color: var(--color-primary); + background-color: #9E9E9E; } } &.sign_up-step-done { color: var(--sign_up_accent_color); + font-weight: 700; .sign_up-step-border:before { background-color: var(--sign_up_accent_color); @@ -489,71 +491,104 @@ } } - .sign_up-request-preview { + .preview-item-info { display: flex; - flex-direction: column; + flex-direction: row; + gap: 10px; + align-items: flex-start; - .preview-item { + .preview-item-icon { + display: flex; + flex: 0 0 26px; + font: 600 14px/20px var(--base-font); + border: 1px solid #9e9e9e; + border-radius: 10px; + flex-direction: row; + justify-content: center; + padding: 0 5px; + } + + .preview-item-title { + display: flex; + flex: 1 1 auto; + font: 700 18px/20px var(--base-font); + padding: 1px 0; + } + + .preview-item-subtitle { display: flex; + flex: 1 1 auto; + font: 700 16px/20px var(--base-font); + } + + .preview-item-description { + font: 400 16px/20px var(--base-font); + margin-bottom: 0; + } + + &.preview-item-info-vertical { flex-direction: column; - gap: 15px; - padding: 20px 25px; - border-bottom: 1px solid var(--border-color); + } + } - .preview-item-info { - display: flex; - flex-direction: row; - gap: 10px; - align-items: flex-start; + .preview-item-panel { + border: 1px solid var(--border-color); + border-radius: var(--border-radius); + background-color: #fbfbfb; + margin-bottom: 10px; - .preview-item-icon { - display: flex; - flex: 0 0 26px; - font: 600 14px/20px var(--base-font); - border: 1px solid #9e9e9e; - border-radius: 10px; - flex-direction: row; - justify-content: center; - padding: 0 5px; - } + &:last-child { + margin-bottom: 0; + } + } - .preview-item-title { - display: flex; - flex: 1 1 auto; - font: 700 18px/20px var(--base-font); - padding: 1px 0; - } + .preview-item-values { + padding: 15px 20px; + display: flex; + flex-direction: column; + gap: 10px; + + .preview-item-values-item { + display: flex; + flex-direction: row; + justify-content: flex-start; + gap: 20px; + + .preview-item-values-item-title, + .preview-item-values-item-label { + display: flex; + flex: 0 0 250px; + font: 500 13px/20px var(--base-font); } - .preview-item-panel { - border: 1px solid var(--border-color); - border-radius: var(--border-radius); - background-color: #fbfbfb; + .preview-item-values-item-title { + font: 700 14px/20px var(--base-font); } - .preview-item-values { - padding: 15px 20px; + .preview-item-values-item-value { display: flex; - flex-direction: column; - gap: 10px; + flex: 1 1 auto; + font: 700 13px/20px var(--base-font); + } + } + } - .preview-item-values-item { - display: flex; - flex-direction: row; - justify-content: flex-start; - gap: 20px; + .sign_up-request-preview { + display: flex; + flex-direction: column; - .preview-item-values-item-label { - display: flex; - flex: 0 0 250px; - font: 500 13px/20px var(--base-font); - } + .preview-item { + display: flex; + flex-direction: column; + gap: 15px; + padding: 20px 25px; + border-bottom: 1px solid var(--border-color); - .preview-item-values-item-value { - display: flex; - flex: 1 1 auto; - font: 700 13px/20px var(--base-font); - } + .preview-item-panel { + margin-bottom: 5px; + + &:last-child { + margin-bottom: 0; } } @@ -1110,23 +1145,24 @@ } } - .sign_up-request-preview { - .preview-item { - padding: 15px 15px; - - .preview-item-values { - gap: 15px; + .preview-item-values { + gap: 15px; - .preview-item-values-item { - flex-direction: column; - gap: 5px; + .preview-item-values-item { + flex-direction: column; + gap: 5px; - .preview-item-values-item-label { - flex: 0 0 auto; - color: #595959; - } - } + .preview-item-values-item-label, + .preview-item-values-item-title { + flex: 0 0 auto; + color: #595959; } + } + } + + .sign_up-request-preview { + .preview-item { + padding: 15px 15px; .preview-item-files { .preview-item-files-title { diff --git a/react/assets/forus-webshop/scss/includes/blocks/vouchers.scss b/react/assets/forus-webshop/scss/includes/blocks/block-vouchers.scss similarity index 100% rename from react/assets/forus-webshop/scss/includes/blocks/vouchers.scss rename to react/assets/forus-webshop/scss/includes/blocks/block-vouchers.scss diff --git a/react/assets/forus-webshop/scss/includes/blocks/_block.scss b/react/assets/forus-webshop/scss/includes/blocks/block.scss similarity index 100% rename from react/assets/forus-webshop/scss/includes/blocks/_block.scss rename to react/assets/forus-webshop/scss/includes/blocks/block.scss diff --git a/react/assets/forus-webshop/scss/includes/blocks/cards.scss b/react/assets/forus-webshop/scss/includes/blocks/cards.scss deleted file mode 100644 index e690fbc87..000000000 --- a/react/assets/forus-webshop/scss/includes/blocks/cards.scss +++ /dev/null @@ -1,148 +0,0 @@ -.block { - &.block-cards { - position: relative; - z-index: 3; - width: calc(100% + 30px); - margin: 0 -16px 70px; - float: left; - @include cf(); - - .card-item { - width: 50%; - padding: 0 15px; - margin-bottom: 20px; - float: left; - - .card-item-inner { - border-radius: 6px; - overflow: hidden; - box-shadow: 0 10px 50px rgba(0, 0, 0, .2); - background-color: #ffffff; - position: relative; - height: 200px; - transform: translate(0, 0); - transition: transform .4s; - cursor: pointer; - display: block; - - .card-icon { - position: absolute; - width: 340px; - height: 340px; - background: #f9fbf0; - border-radius: 340px; - left: 0px; - top: 50%; - transform: translate(-50%, -50%); - - img { - display: block; - width: 110px; - height: 110px; - position: absolute; - top: 50%; - right: 30px; - transform: translate(0, -50%); - } - } - - .card-content { - position: absolute; - left: 200px; - right: 100px; - top: 50%; - transform: translate(0, -50%); - } - - .card-title { - font: 700 18px/24px var(--base-font); - color: #282b39; - margin-bottom: 5px; - - .mdi { - font-size: 1em; - line-height: inherit; - color: var(--color-default); - vertical-align: baseline; - position: relative; - margin-left: 0; - transition: .4s; - } - } - - .card-description { - font: 600 14px/25px var(--base-font); - color: #646f79; - } - - &:hover { - transform: translate(0, -10px); - - .card-title { - .mdi { - margin-left: 10px; - color: #4697fd; - } - } - } - } - - &:nth-child(even) { - .card-item-inner { - .card-icon { - background: #f2fafd; - } - } - } - } - } - @media screen and (max-width: 1700px) { - &.block-cards { - margin: 0 -16px 0; - } - } - @media screen and (max-width: 1000px) { - &.block-cards { - padding: 0 25px; - width: 100%; - margin: 0 0 30px; - - .card-item { - width: 100%; - padding: 0; - - .card-item-inner { - height: 160px; - - .card-icon { - width: 320px; - height: 320px; - margin-left: -40px; - - img { - width: 70px; - height: 70px; - } - } - - .card-content { - left: 145px; - right: 30px; - - .card-title { - font: 700 14px/22px var(--base-font); - } - - .card-description { - font: 600 12px/20px var(--base-font); - } - } - } - - &:last-child { - margin: 0 0 0; - } - } - } - } -} \ No newline at end of file diff --git a/react/assets/forus-webshop/scss/includes/blocks/fund-add-records.scss b/react/assets/forus-webshop/scss/includes/blocks/fund-add-records.scss deleted file mode 100644 index fe07d31ae..000000000 --- a/react/assets/forus-webshop/scss/includes/blocks/fund-add-records.scss +++ /dev/null @@ -1,149 +0,0 @@ -.block.block-fund-add-records { - padding: 0 30px; - cursor: default; - - .block-title { - font: 500 36px/36px var(--base-font); - margin: 0 0 30px; - text-align: center; - color: #191A1C; - } - - .block-icon { - text-align: center; - font-size: 96px; - padding: 40px 0 30px; - color: var(--color-primary); - } - - .block-description { - font: 400 18px/26px var(--base-font); - text-align: center; - color: #191A1C; - margin: 0 0 40px; - - strong, a { - font-weight: 600; - } - - a { - color: #3561FF; - text-decoration: underline; - } - } - - .request-progress { - width: 100%; - display: flex; - margin: 0 0 30px; - - .request-step { - flex-grow: 1; - text-align: right; - border-top: 6px solid #EBEDF0; - font: 500 14px/30px var(--base-font); - color: #DADADA; - - &.request-step-active { - border-top-color: #BDCBFF; - color: #315EFD; - } - - &.request-step-done { - border-top-color: #3561FF; - color: #3561FF; - } - } - } - - .request-pane { - background: #FFFFFF; - border: 1px solid #EBEDF0; - box-sizing: border-box; - border-radius: 5px; - - .request-pane-header { - border-bottom: 1px solid #EBEDF0; - font: 500 18px/34px var(--base-font); - padding: 15px 40px; - text-align: center; - } - - .request-pane-body { - padding: 30px 30px; - - .request-pane-heading { - font: 500 21px/30px var(--base-font); - margin: 0 0 20px; - } - - .request-pane-text { - font: 400 16px/28px var(--base-font); - margin: 0 0 20px; - } - - .request-pane-list { - margin: 0 0 20px; - - li { - font: 400 16px/28px var(--base-font); - vertical-align: middle; - position: relative; - padding-left: 15px; - - &:before { - content: ''; - display: inline-block; - width: 6px; - height: 6px; - background: #007377; - border-radius: 6px; - line-height: 26px; - position: absolute; - left: 0; - top: 10px; - } - } - } - - .request-pane-heading, - .request-pane-text, - .request-pane-list { - &:last-child { - margin-bottom: 0; - } - } - - .request-pane-info { - border: 1px solid #EBEDF0; - padding: 15px 20px; - border-radius: 8px; - background: #f4f5f7; - - .request-pane-text { - margin-bottom: 0; - font: 400 14px/24px var(--base-font); - } - - .request-pane-list { - margin-bottom: 0; - - li { - font: 400 14px/24px var(--base-font); - } - } - } - } - - .request-pane-footer { - padding: 15px 40px; - } - } - - - .block-wrapper { - width: 750px; - max-width: 100%; - margin: 0 auto 40px; - } -} \ No newline at end of file diff --git a/react/assets/forus-webshop/scss/includes/blocks/fund_criteria.scss b/react/assets/forus-webshop/scss/includes/blocks/fund_criteria.scss deleted file mode 100644 index 12adcc870..000000000 --- a/react/assets/forus-webshop/scss/includes/blocks/fund_criteria.scss +++ /dev/null @@ -1,133 +0,0 @@ -.block.block-fund_criteria { - .criteria-item { - border-radius: var(--border-radius); - overflow: hidden; - display: block; - margin-bottom: 15px; - box-shadow: 0 5px 30px rgba(0, 0, 0, 0.05); - cursor: default; - - .criteria-header { - font: 700 13px/30px var(--base-font); - background-color: #8ca3a6; - color: #fff; - padding: 10px 20px; - } - - .criteria-body { - background-color: #fff; - - .criteria-section { - padding: 20px; - border-bottom: 1px solid #d4d9dd; - position: relative; - @include cf(); - - .criteria-details { - float: left; - } - - .criteria-label { - font: 400 13px/13px var(--base-font); - color: var(--color-default); - @include ellipsis(); - margin-bottom: 6px; - } - - .criteria-value { - font: 700 16px/20px var(--base-font); - color: #282b39; - @include ellipsis(); - } - - .criteria-value-empty { - font: 400 16px/20px var(--base-font); - color: #9ca6af; - @include ellipsis(); - } - - .criteria-validations { - float: right; - position: absolute; - right: 20px; - top: 50%; - transform: translate(0, -50%); - - .criteria-validation-validate { - font: 600 13px var(--base-font); - color: orange; - transition: color .4s; - - .mdi { - background: none; - color: orange; - font-size: 1.5em; - transition: color .4s, background-color .4s; - } - - &:hover { - color: lighten(orange, 20); - - .mdi { - background: none; - color: lighten(orange, 20); - } - } - } - - .criteria-validation-add { - font: 600 13px var(--base-font); - color: var(--color-default); - transition: color .4s; - - .mdi { - background: var(--color-default); - transition: background-color .4s; - } - - &:hover { - color: var(--color-primary-light); - - .mdi { - background: var(--color-primary-light); - } - } - } - - .criteria-validation-valid { - font: 600 13px var(--base-font); - color: var(--color-default); - - .mdi { - background: #00d291; - } - } - - .mdi { - margin-right: 5px; - color: #fff; - width: 18px; - height: 18px; - border-radius: 18px; - float: left; - display: block; - text-align: center; - line-height: 18px; - font-weight: 700; - transition: color .4s; - } - } - - &:last-child { - border-bottom: none; - } - } - } - - &.active { - .criteria-header { - background-color: #305dfa; - } - } - } -} diff --git a/react/assets/forus-webshop/scss/includes/blocks/phone-number.scss b/react/assets/forus-webshop/scss/includes/blocks/phone-number.scss deleted file mode 100644 index 3d813521d..000000000 --- a/react/assets/forus-webshop/scss/includes/blocks/phone-number.scss +++ /dev/null @@ -1,28 +0,0 @@ -.block { - - &.block-phone-number { - margin: 0 auto 20px; - - .pincode-number { - width: 50px; - } - } - @media screen and (max-width: 1700px) { - - &.block-phone-number { - .pincode-number { - width: 45px; - } - } - } - @media screen and (max-width: 1000px) { - &.block-phone-number { - width: calc(30px * 10 + 10px * 1); - - .pincode-number { - margin-right: 5px; - width: 30px; - } - } - } -} \ No newline at end of file diff --git a/react/assets/forus-webshop/scss/includes/blocks/record_categories.scss b/react/assets/forus-webshop/scss/includes/blocks/record_categories.scss deleted file mode 100644 index 4cea99715..000000000 --- a/react/assets/forus-webshop/scss/includes/blocks/record_categories.scss +++ /dev/null @@ -1,57 +0,0 @@ -.block { - - &.block-record_categories { - margin-bottom: 30px; - - .record_category-item { - border-radius: var(--border-radius); - background: #fff; - padding: 20px; - width: 100%; - display: block; - margin-bottom: 15px; - box-shadow: 0 5px 20px rgba(0, 0, 0, 0.1); - position: relative; - transition: box-shadow .4s; - - .category-title { - font: 700 18px/30px var(--base-font); - color: #282b39; - transition: color .4s; - } - - .category-subtitle { - font: 400 14px/20px var(--base-font); - color: #646f79; - } - - .category-icon { - float: right; - position: absolute; - top: 50%; - right: 20px; - transform: translate(0, -50%); - - img { - display: block; - width: 50px; - } - } - - &:hover { - box-shadow: 0 5px 25px rgba(0, 0, 0, 0.25); - - .category-title { - color: var(--color-default); - } - } - } - } - @media screen and (max-width: 1000px) { - &.block-record_categories { - .button { - width: 100%; - } - } - } -} \ No newline at end of file diff --git a/react/assets/forus-webshop/scss/includes/blocks/records.scss b/react/assets/forus-webshop/scss/includes/blocks/records.scss deleted file mode 100644 index e0958fb5a..000000000 --- a/react/assets/forus-webshop/scss/includes/blocks/records.scss +++ /dev/null @@ -1,134 +0,0 @@ -.block { - - &.block-records { - margin-bottom: 30px; - - .record-item { - border-radius: var(--border-radius); - background: #fff; - padding: 20px; - width: 100%; - display: block; - margin-bottom: 15px; - box-shadow: 0 5px 20px rgba(0, 0, 0, 0.1); - position: relative; - transition: box-shadow .4s; - @include cf(); - - .record-details { - float: left; - - .record-type { - font: 400 13px var(--base-font); - color: var(--color-default); - } - - .record-value { - font: 700 16px var(--base-font); - color: #282b39; - } - } - - .record-validations { - float: right; - @include cf(); - - .record-validation-count { - height: 80px; - margin: -20px 0; - padding: 20px; - border-right: 1px solid #d4d9dd; - color: #00d291; - font: 400 13px var(--base-font); - text-align: center; - float: left; - - strong { - display: block; - font-weight: 700; - } - } - - .record-validation-request { - float: right; - display: block; - padding: 10px 0px 10px 20px; - color: var(--color-default); - font: 600 13px/20px var(--base-font); - transition: .4s; - - .mdi { - color: #fff; - display: block; - width: 20px; - height: 20px; - float: left; - background: #00d291; - border-radius: 20px; - margin-right: 5px; - text-align: center; - font-size: 1.2em; - } - - &:hover { - color: var(--color-primary-light); - } - } - } - } - } - @media screen and (max-width: 1000px) { - &.block.block-records { - .record-item { - .record-details { - width: calc(100% + 40px); - float: left; - margin: -20px -20px 0; - padding: 20px; - border-bottom: 1px solid #eee; - - .record-value { - @include ellipsis(); - } - } - - .record-validations { - width: 100%; - margin: 0 -20px -20px; - padding: 10px 20px; - width: calc(100% + 40px); - - .record-validation-count { - width: calc(50% + 20px); - margin: 0; - padding: 20px; - height: auto; - margin: -10px 0 -10px -20px; - - strong { - display: inline; - margin-right: 3px; - } - } - - .record-validation-request { - padding: 20px; - text-align: center; - height: auto; - width: calc(50% + 20px); - margin: -10px -20px -10px 0; - font: 600 13px/20px var(--base-font); - - .mdi { - display: none; - } - } - } - } - - .button { - width: 100%; - } - } - } -} \ No newline at end of file diff --git a/react/assets/forus-webshop/scss/includes/blocks/validations.scss b/react/assets/forus-webshop/scss/includes/blocks/validations.scss deleted file mode 100644 index 2df8eb78b..000000000 --- a/react/assets/forus-webshop/scss/includes/blocks/validations.scss +++ /dev/null @@ -1,140 +0,0 @@ -.block { - - &.block-validations { - margin-bottom: 30px; - - .validation-record-details { - padding: 20px 25px; - background: #fff; - box-shadow: 0 5px 20px rgba(0, 0, 0, 0.1); - border-radius: var(--border-radius); - overflow: hidden; - margin-bottom: 15px; - - .record-type { - font: 500 13px/20px var(--base-font); - color: var(--color-default); - margin-top: -5px; - } - - .record-value { - font: 700 16px/30px var(--base-font); - color: #282b39; - margin-bottom: 10px; - } - - .record-validation-count { - color: #00d291; - font: 400 13px var(--base-font); - text-align: center; - position: absolute; - right: 20px; - top: 20px; - - strong { - display: block; - font-weight: 700; - } - } - - .button { - padding-top: 7px; - padding-bottom: 7px; - text-align: center; - } - } - - .validation-card { - background: #fff; - box-shadow: 0 5px 20px rgba(0, 0, 0, 0.1); - border-radius: var(--border-radius); - overflow: hidden; - margin-bottom: 15px; - } - - .validation-header { - border-bottom: 1px solid #d4d9dd; - padding: 20px 25px; - font: 700 22px var(--base-font); - color: #282b39; - position: relative; - } - - .validation-body { - padding: 0 25px; - width: 100%; - display: block; - position: relative; - transition: box-shadow .4s; - } - - .validation-item { - border-bottom: 1px solid #d4d9dd; - background: #fff; - margin: 0 -25px; - padding: 20px 25px; - @include cf(); - - .validation-image { - float: left; - width: 50px; - height: 50px; - border-radius: 50px; - overflow: hidden; - border: 1px solid #d5e7ff; - margin-right: 15px; - - img { - display: block; - width: 100%; - } - } - - .validation-name { - padding: 10px 0; - font: 700 18px/30px var(--base-font); - color: #282b39; - float: left; - } - - .validation-date { - color: var(--color-primary); - font: 700 14px/30px var(--base-font); - padding: 10px 0; - float: right; - } - - &:last-child { - border-bottom: none; - } - } - } - @media screen and (max-width: 1000px) { - &.block-validations { - .validation-header { - font: 700 16px var(--base-font); - padding: 15px 20px; - } - - .validation-body { - padding: 0 20px; - } - - .validation-item { - margin: 0 -20px 0; - padding: 20px; - - .validation-name { - font: 700 16px/30px var(--base-font); - @include ellipsis(); - } - - .validation-date { - width: 100%; - text-align: center; - padding: 0; - } - } - } - } -} \ No newline at end of file diff --git a/react/assets/forus-webshop/scss/includes/blocks/validators.scss b/react/assets/forus-webshop/scss/includes/blocks/validators.scss deleted file mode 100644 index d18b1f054..000000000 --- a/react/assets/forus-webshop/scss/includes/blocks/validators.scss +++ /dev/null @@ -1,128 +0,0 @@ -.block { - - &.block-validators { - margin-bottom: 30px; - - .block-card { - background: #fff; - box-shadow: 0 5px 20px rgba(0, 0, 0, 0.1); - border-radius: var(--border-radius); - overflow: hidden; - margin-bottom: 15px; - } - - .block-header { - border-bottom: 1px solid #d4d9dd; - padding: 20px 25px; - font: 700 22px var(--heading-font-family); - color: var(--tc); - position: relative; - } - - .block-body { - padding: 0 25px; - width: 100%; - display: block; - position: relative; - transition: box-shadow .4s; - } - - .validator-item { - border-bottom: 1px solid #d4d9dd; - background: #fff; - margin: 0 -25px; - padding: 20px 25px; - @include cf(); - - .validator-image { - float: left; - width: 50px; - height: 50px; - border-radius: 50px; - overflow: hidden; - border: 1px solid #d5e7ff; - margin-right: 15px; - - img { - display: block; - width: 100%; - } - } - - .validator-name { - padding: 10px 0; - font: 700 18px/30px var(--base-font); - color: #282b39; - float: left; - } - - .validator-state { - float: right; - padding: 13px 0; - - .validator-send { - font: 600 13px/24px var(--base-font); - color: var(--color-default); - display: block; - cursor: pointer; - - .mdi { - line-height: 24px; - font-size: 1.6em; - float: right; - color: #2987fd; - margin-left: 5px; - position: relative; - transform: translate(0); - transition: .4s; - } - - &:hover { - .mdi { - transform: translate(5px); - } - } - } - } - - &:last-child { - border-bottom: none; - } - } - } - @media screen and (max-width: 1000px) { - &.block-validators { - .block-header { - font: 700 16px var(--heading-font-family); - padding: 15px 20px; - } - - .block-body { - padding: 0 20px; - - .validator-item { - margin: 0 -20px 0; - padding: 20px; - border-bottom: 1px solid #eee; - - .validator-name { - font: 700 16px/30px var(--base-font); - @include ellipsis(); - } - - .validator-state { - padding: 0 20px 0; - float: left; - width: calc(100% + 40px); - margin: 0 -20px; - text-align: center; - - .validator-send { - display: inline-block; - } - } - } - } - } - } -} \ No newline at end of file diff --git a/react/assets/forus-webshop/scss/includes/components/_modals.scss b/react/assets/forus-webshop/scss/includes/modals/modal.scss similarity index 100% rename from react/assets/forus-webshop/scss/includes/components/_modals.scss rename to react/assets/forus-webshop/scss/includes/modals/modal.scss diff --git a/react/assets/forus-webshop/scss/includes/sections/_section.scss b/react/assets/forus-webshop/scss/includes/sections/section.scss similarity index 100% rename from react/assets/forus-webshop/scss/includes/sections/_section.scss rename to react/assets/forus-webshop/scss/includes/sections/section.scss diff --git a/react/assets/forus-webshop/scss/webshop.scss b/react/assets/forus-webshop/scss/webshop.scss index cc0d3199e..a2a2c9a9c 100644 --- a/react/assets/forus-webshop/scss/webshop.scss +++ b/react/assets/forus-webshop/scss/webshop.scss @@ -26,7 +26,6 @@ @import 'includes/components/ui-controls'; @import 'includes/components/label'; @import 'includes/components/map-card'; -@import 'includes/components/modals'; @import 'includes/components/tooltip'; @import 'includes/components/triangle'; @import 'includes/components/printables'; @@ -36,7 +35,7 @@ @import 'includes/components/frame-director'; // SECTIONS -@import 'includes/sections/_section'; +@import 'includes/sections/section'; @import 'includes/sections/section-faq'; @import 'includes/sections/section-cms'; @import 'includes/sections/section-map'; @@ -47,28 +46,19 @@ @import 'includes/sections/section-voucher-details'; // BLOCKS -@import 'includes/blocks/_block'; +@import 'includes/blocks/block'; @import 'includes/blocks/block-faq'; @import 'includes/blocks/block-skip-links'; @import 'includes/blocks/block-fund'; -@import 'includes/blocks/cards'; -@import 'includes/blocks/fund_criteria'; -@import 'includes/blocks/map'; -@import 'includes/blocks/phone-number'; +@import 'includes/blocks/block-map'; @import 'includes/blocks/block-product'; -@import 'includes/blocks/record_categories'; -@import 'includes/blocks/records'; @import 'includes/blocks/block-transactions'; -@import 'includes/blocks/validations'; -@import 'includes/blocks/validators'; @import 'includes/blocks/block-voucher'; @import 'includes/blocks/block-voucher-share-options'; -@import 'includes/blocks/vouchers'; -@import 'includes/blocks/fund-add-records'; +@import 'includes/blocks/block-vouchers'; @import 'includes/blocks/block-profile'; @import 'includes/blocks/block-preferences'; @import 'includes/blocks/block-file-uploader'; -@import 'includes/blocks/block-auth-widget'; @import 'includes/blocks/block-push-notifications'; @import 'includes/blocks/block-page-loading-bar'; @import 'includes/blocks/block-user-emails'; @@ -114,7 +104,6 @@ @import 'includes/blocks/block-reimbursement'; @import 'includes/blocks/block-reservations'; @import 'includes/blocks/block-reservation'; -@import 'includes/blocks/block-map_card'; @import 'includes/blocks/block-cms-funds'; @import 'includes/blocks/block-announcement'; @import 'includes/blocks/block-empty'; @@ -149,6 +138,8 @@ @import 'includes/blocks/block-product-category-filter'; @import 'includes/blocks/block-product-categories'; +// MODALS +@import 'includes/modals/modal'; @import 'includes/modals/modal-file-preview'; @import 'includes/modals/modal-photo-cropper'; @import 'includes/modals/modal-physical-cards'; diff --git a/react/src/dashboard/components/elements/fund-criteria-editor/FundCriteriaEditor.tsx b/react/src/dashboard/components/elements/fund-criteria-editor/FundCriteriaEditor.tsx index ef8f3d119..2e79f7b04 100644 --- a/react/src/dashboard/components/elements/fund-criteria-editor/FundCriteriaEditor.tsx +++ b/react/src/dashboard/components/elements/fund-criteria-editor/FundCriteriaEditor.tsx @@ -25,8 +25,6 @@ export default function FundCriteriaEditor({ recordTypes, onSaveCriteria, className, - bodyClassName, - footerClassName, }: { fund: Fund; organization: Organization; @@ -35,8 +33,6 @@ export default function FundCriteriaEditor({ recordTypes: Array; onSaveCriteria?: (criteria: Array) => void; className?: string; - bodyClassName?: string; - footerClassName?: string; }) { const translate = useTranslate(); @@ -148,8 +144,8 @@ export default function FundCriteriaEditor({ }, [criteria]); return ( -
-
+
+
{criteriaList?.map((item, index) => ( 0) && ( -
+
{fund.criteria_editable && (
diff --git a/react/src/dashboard/components/elements/resource-states/PrevalidationRequestStateLabels.tsx b/react/src/dashboard/components/elements/resource-states/PrevalidationRequestStateLabels.tsx new file mode 100644 index 000000000..60fd751d8 --- /dev/null +++ b/react/src/dashboard/components/elements/resource-states/PrevalidationRequestStateLabels.tsx @@ -0,0 +1,23 @@ +import React from 'react'; +import TableEmptyValue from '../table-empty-value/TableEmptyValue'; +import useTranslate from '../../../hooks/useTranslate'; +import Label from '../image_cropper/Label'; +import PrevalidationRequest from '../../../props/models/PrevalidationRequest'; + +export default function PrevalidationRequestStateLabels({ request }: { request: PrevalidationRequest }) { + const translate = useTranslate(); + + if (request.state === 'success') { + return ; + } + + if (request.state === 'pending') { + return ; + } + + if (request.state === 'fail') { + return ; + } + + return ; +} diff --git a/react/src/dashboard/components/modals/ModalPrevalidationRequestsUpload.tsx b/react/src/dashboard/components/modals/ModalPrevalidationRequestsUpload.tsx new file mode 100644 index 000000000..efc7cc961 --- /dev/null +++ b/react/src/dashboard/components/modals/ModalPrevalidationRequestsUpload.tsx @@ -0,0 +1,792 @@ +import React, { Fragment, useCallback, useMemo, useRef, useState } from 'react'; +import { ModalState } from '../../modules/modals/context/ModalContext'; +import Fund from '../../props/models/Fund'; +import { useFileService } from '../../services/FileService'; +import { fileSize } from '../../helpers/string'; +import Papa from 'papaparse'; +import { uniqueId, isEmpty } from 'lodash'; +import usePushSuccess from '../../hooks/usePushSuccess'; +import usePushDanger from '../../hooks/usePushDanger'; +import { ResponseError } from '../../props/ApiResponses'; +import ModalDuplicatesPicker from './ModalDuplicatesPicker'; +import useOpenModal from '../../hooks/useOpenModal'; +import CSVProgressBar from '../elements/csv-progress-bar/CSVProgressBar'; +import useTranslate from '../../hooks/useTranslate'; +import classNames from 'classnames'; +import { fileToText } from '../../helpers/utils'; +import { useFundService } from '../../services/FundService'; +import usePushApiError from '../../hooks/usePushApiError'; +import FormGroupInfo from '../elements/forms/elements/FormGroupInfo'; +import TranslateHtml from '../elements/translate-html/TranslateHtml'; +import SelectControl from '../elements/select-control/SelectControl'; +import SelectControlOptionsFund from '../elements/select-control/templates/SelectControlOptionsFund'; +import { usePrevalidationRequestService } from '../../services/PrevalidationRequestService'; +import { ProfileRecordType } from '../../props/models/Sponsor/SponsorIdentity'; +import RecordType from '../../props/models/RecordType'; +import useBeforeUnload from '../../hooks/useBeforeUnload'; + +type CSVErrorProp = { + emptyHeader?: string | string[]; + emptyBody?: string | string[]; + invalidRecordTypes?: string | string[]; + missingRecordTypes?: string | string[]; + missingBsn?: string | string[]; + invalidRows?: string | string[]; +}; + +type CSVWarningProp = { + optionalRecordTypes?: string | string[]; +}; + +type RowDataPropData = { [key: string]: string }; + +enum Steps { + select_fund, + upload_csv, +} + +enum CSVProgress { + initial, + validated, + uploading, + uploaded, +} + +type ProcessingMode = 'validate' | 'upload' | null; + +export default function ModalPrevalidationRequestsUpload({ + funds, + fundId, + modal, + className, + recordTypes, + onCompleted, +}: { + funds: Array; + fundId: number; + modal: ModalState; + className?: string; + recordTypes?: Array; + onCompleted: () => void; +}) { + const translate = useTranslate(); + const openModal = useOpenModal(); + const pushDanger = usePushDanger(); + const pushSuccess = usePushSuccess(); + const pushApiError = usePushApiError(); + + const fileService = useFileService(); + const fundService = useFundService(); + const prevalidationRequestService = usePrevalidationRequestService(); + + const [fund, setFund] = useState(funds?.find((fund) => fund.id == fundId) || funds[0]); + const [step, setStep] = useState(Steps.select_fund); + const [data, setData] = useState>(null); + const [changed, setChanged] = useState(false); + const [csvFile, setCsvFile] = useState(null); + const [hideModal, setHideModal] = useState(false); + const [isDragOver, setIsDragOver] = useState(false); + const [dataChunkSize] = useState(50); + const [progressBar, setProgressBar] = useState(null); + + const [csvErrors, setCsvErrors] = useState({}); + const [csvWarnings, setCsvWarnings] = useState({}); + const [csvIsValid, setCsvIsValid] = useState(false); + const [csvProgress, setCsvProgress] = useState(CSVProgress.initial); + + const [progressStatus, setProgressStatus] = useState(''); + const [acceptedFiles] = useState(['.csv']); + const [processingMode, setProcessingMode] = useState(null); + + const abortRef = useRef(false); + const processedRef = useRef<{ processed: number; total: number }>({ processed: 0, total: 0 }); + const cancelPhaseRef = useRef(null); + const closeAfterCancelRef = useRef(false); + const inputRef = useRef(null); + + const criteriaRecordTypeKeys = useMemo(() => { + return recordTypes?.filter((recordType) => recordType.criteria)?.map((recordType) => recordType.key); + }, [recordTypes]); + + const fundRecordKey = useMemo(() => { + return fund.csv_required_keys_except_prefill.filter((key) => key.endsWith('_eligible'))?.[0]; + }, [fund.csv_required_keys_except_prefill]); + + const fundRecordKeyValue = useMemo(() => { + return fund.criteria?.filter((criteria) => { + return criteria.record_type_key == fundRecordKey && criteria.operator == '='; + })[0]?.value; + }, [fund.criteria, fundRecordKey]); + + const closeModal = useCallback(() => { + if (changed) { + onCompleted(); + } + + modal.close(); + }, [changed, modal, onCompleted]); + + const downloadExampleCsv = useCallback(() => { + fileService.downloadFile( + (fund.key || 'fund') + '_sample.csv', + fundService.sampleCSVForPrevalidationRequest(fund), + ); + }, [fileService, fund, fundService]); + + const reset = useCallback((abortRefValue = true) => { + abortRef.current = abortRefValue; + + setHideModal(false); + setCsvFile(null); + setCsvErrors({}); + setCsvIsValid(false); + setCsvProgress(CSVProgress.initial); + }, []); + + const filterSelectedFiles = useCallback( + (files: FileList) => { + return [...files].filter((file) => { + return acceptedFiles.includes('.' + file.name.split('.')[file.name.split('.').length - 1]); + }); + }, + [acceptedFiles], + ); + + const showInvalidRows = useCallback( + (errors = {}, rows = [], rowIndex = 0) => { + const items = Object.keys(errors) + .map(function (key) { + const keyData = key.split('.'); + const keyDataId = keyData[1]; + const fieldKey = keyData[2]; + const index = parseInt(keyDataId, 10) + 1 + rowIndex; + + return [index, errors[key], fieldKey]; + }) + .sort((a, b) => a[0] - b[0]); + + const uniqueRows = items.reduce((arr, item) => { + return arr.includes(item[0]) ? arr : [...arr, item[0]]; + }, []); + + const message = [ + `${uniqueRows.length} van ${rows.length}`, + `rij(en) uit het bulkbestand zijn niet geimporteerd,`, + `bekijk het bestand bij welke rij(en) het mis gaat.`, + ].join(' '); + + pushDanger('Waarschuwing', message); + + setHideModal(true); + + openModal((modal) => ( + ({ + value: `Rij: ${item[0]}: ${item[2]} - ${item[1]}`, + _uid: uniqueId('rand_'), + label: item?.[fund.csv_primary_key], + }))} + onConfirm={() => { + reset(); + }} + onCancel={() => { + reset(); + }} + /> + )); + }, + [fund?.csv_primary_key, openModal, pushDanger, reset], + ); + + const parseCsvFile = useCallback( + async (file: File): Promise>> => { + return await new Promise(function (complete) { + try { + Papa.parse(file, { complete }); + } catch (e) { + pushDanger(e); + complete(null); + } + }); + }, + [pushDanger], + ); + + const uploadFile = useCallback( + async (file?: File) => { + const results = await parseCsvFile(file); + + if (!results) { + return reset(); + } + + results.data = results.data.filter((item) => !!item); + + const data = (results.data = results.data.filter((item) => !!item)); + const header = data.length > 0 ? data[0] : []; + + const body = (data.length > 0 ? data.slice(1) : []).filter((row) => { + return Array.isArray(row) && row.filter((item) => !!item).length > 0; + }); + + const csvErrors: CSVErrorProp = {}; + const csvWarnings: CSVWarningProp = {}; + + if (header.length == 0) { + csvErrors.emptyHeader = 'Het .csv bestand is leeg, controleer het bestand'; + } + + if (header.filter((item) => item === 'bsn').length == 0) { + csvErrors.missingBsn = 'In het .csv bestand ontbreken persoonsgegevens: BSN'; + } + + if (body.length == 0) { + csvErrors.emptyBody = 'Het .csv bestand heeft kolomnamen maar geen inhoud, controleer de inhoud.'; + } + + // append eligibility key + if (fund && fundRecordKey && fundRecordKeyValue && header.indexOf(fundRecordKey) === -1) { + header.unshift(fundRecordKey); + body.forEach((row) => row.unshift(fundRecordKeyValue)); + } + + const invalidRecordTypes = header.filter((recordTypeKey: ProfileRecordType & 'bsn') => { + return recordTypeKey !== 'bsn' && criteriaRecordTypeKeys.indexOf(recordTypeKey) == -1; + }); + + const missingRecordTypes = fund.csv_required_keys_except_prefill.filter((recordTypeKey: string) => { + return header.indexOf(recordTypeKey) == -1; + }); + + const optionalRecordTypes = header.filter((recordTypeKey) => { + return ( + recordTypeKey !== 'bsn' && + fund.csv_required_keys_except_prefill.indexOf(recordTypeKey) == -1 && + fund.csv_required_keys_by_groups.indexOf(recordTypeKey) == -1 + ); + }); + + if (invalidRecordTypes.length > 0) { + csvErrors.invalidRecordTypes = `Het .csv bestand heeft de volgende ongeldige persoonsgegevens: '${invalidRecordTypes.join( + "', '", + )}'`; + } + + if (missingRecordTypes.length > 0) { + csvErrors.missingRecordTypes = `In het .csv bestand ontbreken persoonsgegevens die verplicht zijn voor dit fonds '${ + fund.name + }': '${missingRecordTypes.join("', '")}'`; + } + + if (optionalRecordTypes.length > 0) { + csvWarnings.optionalRecordTypes = [ + `In het .csv bestand zijn persoonsgegevens toegevoegd die optioneel zijn voor "${fund.name}" fonds. `, + 'Controleer of deze persoonsgegevens echt nodig zijn voor de toekenning. ', + `De volgende persoonsgegevens zijn optioneel: "${optionalRecordTypes.join("', '")}".`, + ]; + } + + const parsedData = body.reduce(function (result, val) { + const row = {}; + + header.forEach((hVal, hKey) => { + if (val[hKey] && val[hKey] != '') { + row[hVal] = val[hKey]; + } + }); + + return isEmpty(row) ? result : [...result, row]; + }, []) as RowDataPropData[]; + + setCsvFile(file); + + setCsvErrors(csvErrors); + setCsvWarnings(csvWarnings); + + setData(parsedData); + setCsvIsValid(Object.keys(csvErrors).length === 0); + setCsvProgress(CSVProgress.validated); + }, + [criteriaRecordTypeKeys, fund, fundRecordKey, fundRecordKeyValue, parseCsvFile, reset], + ); + + const updateProgressBarValue = useCallback((progress: number, status?: string) => { + setProgressBar(progress); + setProgressStatus(progress < 100 ? status || 'Aan het uploaden...' : 'Klaar!'); + }, []); + + const notifyCanceled = useCallback(() => { + const { processed, total } = processedRef.current; + const phase = cancelPhaseRef.current; + + if (phase === 'validate') { + pushSuccess('Validatie geannuleerd', `Gevalideerd: ${processed} van ${total}. Geen uploads uitgevoerd.`); + } else if (phase === 'upload') { + pushSuccess('Upload geannuleerd', `Geüpload: ${processed} van ${total}.`); + } else { + pushSuccess('Upload geannuleerd', `Verwerkt: ${processed} van ${total}.`); + } + }, [pushSuccess]); + + const finalizeCancel = useCallback(() => { + setProcessingMode(null); + setCsvProgress(CSVProgress.validated); + setProgressBar(0); + setProgressStatus(''); + setHideModal(false); + notifyCanceled(); + cancelPhaseRef.current = null; + + if (closeAfterCancelRef.current) { + closeAfterCancelRef.current = false; + modal.close(); + } + }, [modal, notifyCanceled]); + + const requestCancel = useCallback(() => { + if (processingMode) { + cancelPhaseRef.current = processingMode; + abortRef.current = true; + closeAfterCancelRef.current = true; + return; + } + + setStep(Steps.select_fund); + }, [processingMode]); + + useBeforeUnload(!!processingMode); + + const chunkList = useCallback((arr: Array, len: number) => { + const chunks = []; + const n = arr.length; + + let i = 0; + + while (i < n) { + chunks.push(arr.slice(i, (i += len))); + } + + return chunks; + }, []); + + const startValidationToServer = useCallback((): Promise => { + return new Promise((resolve) => { + setCsvProgress(CSVProgress.uploading); + setProcessingMode('validate'); + processedRef.current = { processed: 0, total: data.length }; + + const submitData = chunkList(JSON.parse(JSON.stringify(data)), dataChunkSize); + const chunksCount = submitData.length; + const errors = {}; + + let currentChunkNth = 0; + + updateProgressBarValue(0, 'Aan het valideren...'); + + const resolveIfFinished = () => { + if (abortRef.current) { + abortRef.current = false; + finalizeCancel(); + return resolve(false); + } + + if (currentChunkNth == chunksCount) { + setProcessingMode(null); + + if (Object.keys(errors).length > 0) { + showInvalidRows(errors, data); + setCsvProgress(CSVProgress.validated); + setProgressBar(0); + setProgressStatus(''); + return resolve(false); + } + + return resolve(true); + } + + validateChunk(submitData[currentChunkNth]); + }; + + const validateChunk = (data: Array<{ [key: string]: string }>) => { + prevalidationRequestService + .storeBatchValidate(fund.organization_id, data, fund.id) + .then(() => { + currentChunkNth++; + processedRef.current = { + processed: Math.min(currentChunkNth * dataChunkSize, processedRef.current.total), + total: processedRef.current.total, + }; + updateProgressBarValue((currentChunkNth / chunksCount) * 100, 'Aan het valideren...'); + resolveIfFinished(); + }) + .catch((err: ResponseError) => { + if (err.status == 422 && err.data.errors) { + Object.keys(err.data.errors).forEach(function (key) { + const keyData = key.split('.'); + keyData[1] = (parseInt(keyData[1], 10) + currentChunkNth * dataChunkSize).toString(); + errors[keyData.join('.')] = err.data.errors[key]; + }); + } else { + setProcessingMode(null); + pushApiError(err, 'Onbekende error.'); + return resolve(false); + } + + currentChunkNth++; + processedRef.current = { + processed: Math.min(currentChunkNth * dataChunkSize, processedRef.current.total), + total: processedRef.current.total, + }; + updateProgressBarValue((currentChunkNth / chunksCount) * 100, 'Aan het valideren...'); + resolveIfFinished(); + }); + }; + + validateChunk(submitData[currentChunkNth]); + }); + }, [ + chunkList, + data, + dataChunkSize, + updateProgressBarValue, + prevalidationRequestService, + fund.organization_id, + fund.id, + pushApiError, + showInvalidRows, + finalizeCancel, + ]); + + const startUploadingToServer = useCallback((): Promise => { + return new Promise((resolve, reject) => { + setCsvProgress(CSVProgress.uploading); + setProcessingMode('upload'); + processedRef.current = { processed: 0, total: data.length }; + + const submitData = chunkList(JSON.parse(JSON.stringify(data)), dataChunkSize); + const chunksCount = submitData.length; + + let currentChunkNth = 0; + + updateProgressBarValue(0, 'Aan het uploaden...'); + + const uploadChunk = async function (data: Array<{ [key: string]: string }>) { + prevalidationRequestService + .storeBatch(fund.organization_id, data, fund.id, { + name: csvFile.name, + content: await fileToText(csvFile), + total: data.length, + chunk: currentChunkNth, + chunks: chunksCount, + chunkSize: dataChunkSize, + }) + .then(() => { + setChanged(true); + + currentChunkNth++; + processedRef.current = { + processed: Math.min(currentChunkNth * dataChunkSize, processedRef.current.total), + total: processedRef.current.total, + }; + updateProgressBarValue((currentChunkNth / chunksCount) * 100, 'Aan het uploaden...'); + + if (currentChunkNth == chunksCount) { + setTimeout(() => { + setProgressBar(100); + setCsvProgress(CSVProgress.uploaded); + onCompleted?.(); + setProcessingMode(null); + resolve(null); + }, 0); + } else { + if (abortRef.current) { + abortRef.current = false; + finalizeCancel(); + return resolve(false); + } + + uploadChunk(submitData[currentChunkNth]); + } + }) + .catch((err: ResponseError) => { + if (err.status == 422 && err.data.errors) { + showInvalidRows(err.data.errors, data, currentChunkNth * 100); + + return err.data?.errors?.data + ? pushDanger(err.data.errors.data[0]) + : pushDanger('Onbekende error.'); + } + + pushApiError(err, 'Onbekende error.'); + setProcessingMode(null); + reject(); + }); + }; + + uploadChunk(submitData[currentChunkNth]).then(); + }); + }, [ + chunkList, + data, + dataChunkSize, + updateProgressBarValue, + prevalidationRequestService, + fund.organization_id, + fund.id, + csvFile, + onCompleted, + pushApiError, + showInvalidRows, + pushDanger, + finalizeCancel, + ]); + + const onConfirmUpload = useCallback(async () => { + pushSuccess('Inladen...', 'Inladen van gegevens voor controle op dubbele waarden!', { + icon: 'download-outline', + }); + + const validated = await startValidationToServer(); + + if (!validated) { + return; + } + + setProgressBar(0); + updateProgressBarValue(0, 'Aan het uploaden...'); + startUploadingToServer().then(); + }, [pushSuccess, startUploadingToServer, startValidationToServer, updateProgressBarValue]); + + const onDragEvent = useCallback((e: React.DragEvent, isDragOver: boolean) => { + e?.preventDefault(); + e?.stopPropagation(); + + setIsDragOver(isDragOver); + }, []); + + return ( +
+
+
+ +
Upload CSV-bestand
+
+ {step == Steps.select_fund && ( +
+
+
{translate('modals.modal_voucher_create.labels.fund')}
+ + }> + { + setFund(funds.find((fund) => fund.id === fund_id)); + }} + options={funds} + allowSearch={false} + optionsComponent={SelectControlOptionsFund} + /> + +
+
+ )} + + {step == Steps.upload_csv && ( +
onDragEvent(e, true)} + onDragEnter={(e) => onDragEvent(e, true)} + onDragLeave={(e) => onDragEvent(e, false)} + onDragEnd={(e) => onDragEvent(e, false)} + onDrop={(e) => { + onDragEvent(e, false); + uploadFile(filterSelectedFiles(e.dataTransfer.files)?.[0]).then(); + }}> +
+ { + uploadFile(filterSelectedFiles(e.target.files)?.[0]).then(); + e.target.value = null; + }} + /> + + {csvProgress <= CSVProgress.validated && ( +
inputRef.current.click()}> +
+
+
+
+ {translate('csv_upload.labels.upload')} +
+ {translate('csv_upload.labels.swipe')} +
+
+ )} + +
+ {csvProgress <= CSVProgress.validated && ( + + )} + {csvProgress <= CSVProgress.validated && ( + + )} +
+ + {csvProgress >= CSVProgress.uploading && ( +
+
+ {csvProgress == CSVProgress.uploading && ( +
+ )} + {csvProgress == CSVProgress.uploaded && ( +
+ )} +
+ +
+ )} + + {csvFile && csvProgress < CSVProgress.uploading && ( +
+
+
+
+ {csvIsValid ? ( +
+ ) : ( +
+ )} +
+
+
{csvFile.name}
+
{fileSize(csvFile.size)}
+
+
reset(false)} + /> +
+
+ + {Object.keys(csvErrors).length === 0 && Object.keys(csvWarnings).length > 0 && ( +
+ {Object.keys(csvWarnings).map((key) => ( +
{csvWarnings[key]}
+ ))} +
+ )} + + {Object.keys(csvErrors).length > 0 && ( +
+ {Object.keys(csvErrors).map((key) => ( +
{csvErrors[key]}
+ ))} +
+ )} +
+ )} +
+
+ )} +
+ +
+ {csvProgress < CSVProgress.uploading && ( + + )} + +
+ +
+ {/* Cancel button */} + + + {/* Confirm selected fund button */} + {step == Steps.select_fund && ( + + )} + + {/* Upload selected CSV or cancel button */} + {step == Steps.upload_csv && ( + + {csvProgress} + {csvProgress != CSVProgress.validated} + {csvIsValid} + {csvProgress < CSVProgress.uploaded ? ( + + ) : ( + + )} + + )} +
+
+
+
+ ); +} diff --git a/react/src/dashboard/components/pages/feature/Feature.tsx b/react/src/dashboard/components/pages/feature/Feature.tsx index 3735f6e79..d08b09e6c 100644 --- a/react/src/dashboard/components/pages/feature/Feature.tsx +++ b/react/src/dashboard/components/pages/feature/Feature.tsx @@ -248,7 +248,7 @@ export default function Feature() { /> )} - {feature.key === 'subsidy_funds' && ( + {feature.key === 'product_funds' && ( setFund({ ...fund, criteria })} onSaveCriteria={saveCriteria} - bodyClassName={'collapsable-body'} - footerClassName={'collapsable-footer'} />
); diff --git a/react/src/dashboard/components/pages/person-prevalidations/PrevalidationRequests.tsx b/react/src/dashboard/components/pages/person-prevalidations/PrevalidationRequests.tsx new file mode 100644 index 000000000..6fe03ac49 --- /dev/null +++ b/react/src/dashboard/components/pages/person-prevalidations/PrevalidationRequests.tsx @@ -0,0 +1,474 @@ +import React, { useState, useCallback, useEffect } from 'react'; +import { useFundService } from '../../../services/FundService'; +import Fund from '../../../props/models/Fund'; +import useTranslate from '../../../hooks/useTranslate'; +import LoadingCard from '../../elements/loading-card/LoadingCard'; +import { hasPermission } from '../../../helpers/utils'; +import useSetProgress from '../../../hooks/useSetProgress'; +import SelectControl from '../../elements/select-control/SelectControl'; +import SelectControlOptionsFund from '../../elements/select-control/templates/SelectControlOptionsFund'; +import useActiveOrganization from '../../../hooks/useActiveOrganization'; +import useOpenModal from '../../../hooks/useOpenModal'; +import usePaginatorService from '../../../modules/paginator/services/usePaginatorService'; +import { PaginationData } from '../../../props/ApiResponses'; +import PrevalidationRequest from '../../../props/models/PrevalidationRequest'; +import useConfigurableTable from '../vouchers/hooks/useConfigurableTable'; +import useFilterNext from '../../../modules/filter_next/useFilterNext'; +import ClickOutside from '../../elements/click-outside/ClickOutside'; +import FilterItemToggle from '../../elements/tables/elements/FilterItemToggle'; +import DatePickerControl from '../../elements/forms/controls/DatePickerControl'; +import { dateFormat, dateParse } from '../../../helpers/dates'; +import LoaderTableCard from '../../elements/loader-table-card/LoaderTableCard'; +import TableTopScroller from '../../elements/tables/TableTopScroller'; +import { strLimit } from '../../../helpers/string'; +import TableEmptyValue from '../../elements/table-empty-value/TableEmptyValue'; +import Paginator from '../../../modules/paginator/components/Paginator'; +import { createEnumParam, NumberParam, StringParam } from 'use-query-params'; +import EmptyCard from '../../elements/empty-card/EmptyCard'; +import { Permission } from '../../../props/models/Organization'; +import { usePrevalidationRequestService } from '../../../services/PrevalidationRequestService'; +import ModalPrevalidationRequestsUpload from '../../modals/ModalPrevalidationRequestsUpload'; +import RecordType from '../../../props/models/RecordType'; +import { useRecordTypeService } from '../../../services/RecordTypeService'; +import PrevalidationRequestStateLabels from '../../elements/resource-states/PrevalidationRequestStateLabels'; +import TableRowActions from '../../elements/tables/TableRowActions'; +import usePushSuccess from '../../../hooks/usePushSuccess'; +import usePushApiError from '../../../hooks/usePushApiError'; +import { DashboardRoutes } from '../../../modules/state_router/RouterBuilder'; +import { useNavigateState } from '../../../modules/state_router/Router'; +import ModalDangerZone from '../../modals/ModalDangerZone'; + +export default function PrevalidationRequests() { + const translate = useTranslate(); + const openModal = useOpenModal(); + const setProgress = useSetProgress(); + const pushApiError = usePushApiError(); + const pushSuccess = usePushSuccess(); + const navigateState = useNavigateState(); + const activeOrganization = useActiveOrganization(); + + const fundService = useFundService(); + const paginatorService = usePaginatorService(); + const recordTypeService = useRecordTypeService(); + const prevalidationRequestService = usePrevalidationRequestService(); + + const [funds, setFunds] = useState>([]); + const [paginatorKey] = useState('prevalidation_requests'); + + const [recordTypes, setRecordTypes] = useState>(null); + const [prevalidationRequests, setPrevalidationRequests] = useState< + PaginationData & { meta: { failed_count?: number } } + >(null); + + const [states] = useState([ + { key: null, name: translate('prevalidation_requests.states.all') }, + { key: 'pending', name: translate('prevalidation_requests.states.pending') }, + { key: 'success', name: translate('prevalidation_requests.states.success') }, + { key: 'fail', name: translate('prevalidation_requests.states.fail') }, + ]); + + const [filterValues, filterValuesActive, filterUpdate, filter] = useFilterNext<{ + q?: string; + to?: string; + from?: string; + state?: string; + fund_id?: number; + page?: number; + per_page?: number; + }>( + { + q: '', + fund_id: null, + state: null, + from: null, + to: null, + page: 1, + per_page: paginatorService.getPerPage(paginatorKey, 10), + }, + { + queryParams: { + q: StringParam, + fund_id: NumberParam, + state: createEnumParam(['pending', 'success', 'fail']), + from: StringParam, + to: StringParam, + per_page: NumberParam, + page: NumberParam, + }, + }, + ); + + const { headElement, configsElement } = useConfigurableTable(prevalidationRequestService.getColumns()); + + const fetchPrevalidationRequests = useCallback(() => { + if (activeOrganization?.allow_prevalidation_requests) { + setProgress(0); + + prevalidationRequestService + .list(activeOrganization.id, { ...filterValuesActive }) + .then((res) => setPrevalidationRequests(res.data)) + .finally(() => setProgress(100)); + } + }, [ + activeOrganization?.allow_prevalidation_requests, + activeOrganization.id, + setProgress, + prevalidationRequestService, + filterValuesActive, + ]); + + const fetchFunds = useCallback(() => { + setProgress(0); + + fundService + .list(activeOrganization?.id, { state: 'active_paused_and_closed', per_page: 100 }) + .then((res) => { + setFunds(res.data.data.filter((fund) => hasPermission(fund.organization, Permission.VALIDATE_RECORDS))); + }) + .finally(() => setProgress(100)); + }, [setProgress, fundService, activeOrganization?.id]); + + const uploadPrevalidationRequests = useCallback( + (funds: Array, fundId: number, onCreate?: () => void) => { + openModal((modal) => ( + + )); + }, + [openModal, recordTypes], + ); + + const resubmitRequest = useCallback( + (request: PrevalidationRequest) => { + prevalidationRequestService + .resubmit(activeOrganization?.id, request.id) + .then(() => { + pushSuccess('Gelukt!', 'Verzoek opnieuw verzonden.'); + fetchPrevalidationRequests(); + }) + .catch(pushApiError); + }, + [activeOrganization?.id, fetchPrevalidationRequests, prevalidationRequestService, pushApiError, pushSuccess], + ); + + const resubmitFailedRequest = useCallback(() => { + prevalidationRequestService + .resubmitFailed(activeOrganization?.id) + .then(() => { + pushSuccess('Gelukt!', 'Verzoek opnieuw verzonden.'); + fetchPrevalidationRequests(); + }) + .catch(pushApiError); + }, [activeOrganization?.id, fetchPrevalidationRequests, prevalidationRequestService, pushApiError, pushSuccess]); + + const deleteRequest = useCallback( + (request: PrevalidationRequest) => { + openModal((modal) => ( + { + prevalidationRequestService + .destroy(activeOrganization?.id, request.id) + .then(() => { + pushSuccess('Gelukt!', 'Verzoek verwijderd.'); + fetchPrevalidationRequests(); + modal.close(); + }) + .catch(pushApiError); + }, + text: translate('modals.danger_zone.remove_prevalidation_request.buttons.confirm'), + }} + /> + )); + }, + [ + openModal, + translate, + activeOrganization?.id, + fetchPrevalidationRequests, + prevalidationRequestService, + pushApiError, + pushSuccess, + ], + ); + + const fetchRecordTypes = useCallback(() => { + setProgress(0); + + recordTypeService + .list() + .then((res) => setRecordTypes(res.data)) + .finally(() => setProgress(100)); + }, [recordTypeService, setProgress]); + + useEffect(() => { + fetchRecordTypes(); + }, [fetchRecordTypes]); + + useEffect(() => { + fetchPrevalidationRequests(); + }, [fetchPrevalidationRequests]); + + useEffect(() => { + fetchFunds(); + }, [fetchFunds]); + + useEffect(() => { + if (!activeOrganization?.allow_prevalidation_requests) { + navigateState(DashboardRoutes.ORGANIZATIONS); + } + }, [activeOrganization?.allow_prevalidation_requests, navigateState]); + + if (funds?.length === 0) { + return ; + } + + if (!prevalidationRequests) { + return ; + } + + return ( +
+
+
+ {translate('prevalidation_requests.header.title')} ({prevalidationRequests?.meta?.total}) +
+
+
+ {prevalidationRequests.meta.failed_count > 0 && ( + + )} + + + +
+ filter.update({ fund_id })} + optionsComponent={SelectControlOptionsFund} + dusk="prevalidationsSelectFund" + /> +
+ + {filter.show && ( +
filter.resetFilters()}> + + Wis filters +
+ )} + + {!filter.show && ( +
+
+ filter.update({ q: e.target.value })} + /> +
+
+ )} + +
+ filter.setShow(false)}> + {filter.show && ( +
+
+ +
+ +
+ + filter.update({ q: e.target.value })} + /> + + + + filter.update({ state })} + /> + + + + filter.update({ from: dateFormat(from) })} + /> + + + + filter.update({ to: dateFormat(to) })} + /> + +
+
+ )} + + +
+
+
+
+
+ + +
+
+ {configsElement} + + + + {headElement} + + + {prevalidationRequests.data.map((row) => ( + + + + + + + + + + + ))} + +
{row.bsn} +
+ {row.fund ? strLimit(row.fund?.name, 32) : } +
+ +
+ {row.fund ? ( + strLimit(row.fund?.implementation?.name, 32) + ) : ( + + )} +
+
+ {row.employee?.email || 'Onbekend'} + + + + {row.state === 'fail' && row.failed_reason ? ( + row.failed_reason_locale + ) : ( + + )} + + {row.state === 'fail' ? ( + ( +
+
{ + resubmitRequest(row); + close(); + }}> + {' '} + {translate( + 'prevalidation_requests.buttons.resubmit', + )} +
+
{ + deleteRequest(row); + close(); + }}> + {' '} + {translate('prevalidation_requests.buttons.delete')} +
+
+ )} + /> + ) : ( + + )} +
+
+
+
+ + {prevalidationRequests?.meta.total > 0 && ( +
+ +
+ )} +
+
+ ); +} diff --git a/react/src/dashboard/hooks/useBeforeUnload.tsx b/react/src/dashboard/hooks/useBeforeUnload.tsx new file mode 100644 index 000000000..9ca589be6 --- /dev/null +++ b/react/src/dashboard/hooks/useBeforeUnload.tsx @@ -0,0 +1,18 @@ +import { useEffect } from 'react'; + +export default function useBeforeUnload(enabled: boolean) { + useEffect(() => { + if (!enabled) { + return; + } + + const handleBeforeUnload = (event: BeforeUnloadEvent) => { + event.preventDefault(); + event.returnValue = ''; + }; + + window.addEventListener('beforeunload', handleBeforeUnload); + + return () => window.removeEventListener('beforeunload', handleBeforeUnload); + }, [enabled]); +} diff --git a/react/src/dashboard/i18n/i18n-nl.js b/react/src/dashboard/i18n/i18n-nl.js index 6f7a7ced5..3bcacab2b 100644 --- a/react/src/dashboard/i18n/i18n-nl.js +++ b/react/src/dashboard/i18n/i18n-nl.js @@ -74,7 +74,6 @@ export default { 'validation-request': 'Validatie verzoek', 'restore-email': 'Inloggen via e-mail', }, - // MENU = menu-validator.pug, menu-provider.pug, menu-sponsor.pug menu: { organizational: 'Organisatie', implementation: 'Webshop', @@ -102,7 +101,6 @@ export default { components, - // MEAPP LANDINGSPAGE = index.pug meapp_index: { navbar: { municipality: 'GEMEENTE', @@ -141,7 +139,6 @@ export default { app: 'De app bewaart een profiel van de gebruiker, dit profiel maakt het mogelijk dat de gegevens hergebruikt kunnen worden voor het mee doen aan andere regelingen.', }, }, - // PROVIDER HOME = home-provider.pug home_provider: { header: { default: { @@ -277,7 +274,6 @@ export default { }, }, }, - // SPONSOR HOME = home-sponsor.pug home_sponsor: { header: { title: 'Gemeentelijk dashboard', @@ -336,10 +332,8 @@ export default { }, }, }, - // VALIDATOR HOME = home-validator.pug // DON'T TRANSLATE , THE VALIDATOR WILL NOT HAVE A LANDINGSPAGE - // CSV-VALIDATION = csv-validation.pug csv_validation: { header: { title: 'Aanvragers toevoegen', @@ -350,7 +344,6 @@ export default { upload: 'Upload .csv bestand', }, }, - // FINANCIAL DASHBOARD = financial-dashboard-transaction.pug financial_dashboard: { header: { title: 'Financiele statistieken', @@ -432,7 +425,6 @@ export default { show_notifications: 'Show +{{ count }} notifications', }, - // EDIT IMPLEMENTATION = implementation-edit.pug implementation_edit: { header: { title: 'Website instellingen', @@ -521,7 +513,6 @@ export default { }, }, - // EDIT FUNDS = funds-edit.pug funds_edit: { header: { title_add: 'Fonds toevoegen', @@ -550,7 +541,6 @@ export default { }, }, - // PRE CHECK FUNDS = funds-pre-check.pug funds_pre_check: { header: { title: 'Regelingencheck', @@ -569,7 +559,6 @@ export default { }, }, - // SHOW FUNDS = funds-show.pug funds_show: { titles: { top_ups: 'Bekijk aanvullingen', @@ -629,12 +618,10 @@ export default { }, }, - // FUNDS = funds.pug funds_pug: { title: 'Fondsen', }, - // HOME = home.pug home: { buttons: { login: 'Log in', @@ -642,7 +629,6 @@ export default { }, }, - // EDIT OFFICES = offices-edits.pug offices_edit: { header: { title_add: 'Vestiging toevoegen', @@ -672,7 +658,6 @@ export default { }, }, - // OFFICES = offices.pug offices: { buttons: { adjust: 'Bewerk', @@ -707,7 +692,6 @@ export default { }, }, - // ORGANIZATION PROVIDERS = provider-organizations.pug provider_organizations: { header: { title: 'Aanbieders', @@ -766,7 +750,6 @@ export default { }, }, - // ORGANIZATION VALIDATORS = organization-validators.pug organization_validators: { labels: { address: 'Adres', @@ -780,7 +763,6 @@ export default { }, }, - //EDIT ORGANIZATIONS = organization-edit.pug organization_edit: { header: { title_add: 'Organisatie aanmaken', @@ -822,7 +804,6 @@ export default { }, }, - // ORGANIZATIONS = organizations.pug organizations: { header: { title: 'Kies een organisatie om in te loggen', @@ -840,7 +821,6 @@ export default { }, }, - // SHOW PRODUCTS = product-show.pug //TRANSLATION NOT FINISHED -> PAGE NOT DONE products_show: { header: { @@ -869,7 +849,6 @@ export default { }, }, - // PRODUCTS = product.pug products: { offers: 'Aanbod', add: 'Voeg aanbod toe', @@ -904,7 +883,6 @@ export default { }, }, - // PRODUCTS = product.pug sponsor_products: { offers: 'Aanbod', labels: { @@ -976,7 +954,6 @@ export default { }, }, - // PROVIDER IDENTITIES = provider-identities.pug provider_identities: { labels: { address: 'Adres', @@ -990,7 +967,6 @@ export default { }, }, - // EDIT PROVIDER IDENTITIES = provider-identity-edit.pug provider_identity_edit: { buttons: { adjust: 'Beoordelaar aanpassen', @@ -1003,7 +979,6 @@ export default { }, }, - // SIGN UP FORM FOR PROVIDERS = provider-sign-up.pug sign_up_provider: { header: { main_header: 'Aanmelden als aanbieder', @@ -1227,7 +1202,6 @@ export default { title: 'Fondsen', }, }, - // SIGN UP FORM FOR SPONSORS = sponsor-sign-up.pug sign_up_sponsor: { header: { main_header: 'Aanmelden als sponsor', @@ -1361,7 +1335,6 @@ export default { description: 'Aanmelden voor een fonds is alleen mogelijk via onze website op een vaste computer.', }, }, - // SIGN UP FORM FOR VALIDATORS = validator-sign-up.pug sign_up_validator: { header: { main_header: 'Aanmelden als beoordelaar', @@ -1500,7 +1473,6 @@ export default { }, }, - // Organization-employees.pug organization_employees: { labels: { email: 'E-mailadres', @@ -1532,7 +1504,6 @@ export default { }, }, - // Organization-employees.pug implementation_funds: { labels: { name: 'Naam', @@ -1546,7 +1517,6 @@ export default { }, }, - // RESERVATION = modals/modal-reservation-create.pug reservation_create: { tooltips: { product: [ @@ -1557,7 +1527,6 @@ export default { }, }, - // VALIDATION REQUEST - validation-request.pug validation_request: { buttons: { accept: 'Accepteren', @@ -1573,7 +1542,6 @@ export default { iban_confirmation: 'IBAN verkeerde bevestiging', }, - // OVERVIEW VALIDATIONS REQUESTS = validation-requests.pug validation_requests: { labels: { id: 'ID', @@ -1748,10 +1716,8 @@ export default { }, }, - // EMPTY BLOCK = empty-block.pug // No translations needed - // FUND CARD FOR PROVIDERS = fund-card-provider.pug fund_card_provider_finances: { status: { hold: 'Wachten', @@ -1800,13 +1766,9 @@ export default { }, }, - // PROVIDER MENU = menu-provider.pug // No translations needed - // PROVIDER MENU = menu-sponsor.pug // No translations needed - // VALIDATOR MENU = menu-validator.pug // No translations needed - // ADDING FUNDS MODAL - modal-funds-add.pug modal_funds_add: { header: { title: 'Budget toevoegen aan fonds', @@ -1849,7 +1811,6 @@ export default { }, }, - // SELECT PHOTO = photo-selector.pug photo_selector: { labels: { image: 'Afbeelding', @@ -1859,7 +1820,6 @@ export default { }, }, - // PRE VALIDATED TABLE = prevalidated_table.pug prevalidated_table: { header: { title: 'Klaarzetten', @@ -1892,13 +1852,9 @@ export default { }, }, - // PROGRESS BAR = progress-bar.pug // No translations needed - // SCHEDULE CONTROL = schedule-controle.pug // No translations needed - // PAGINATOR LOADER = paginator-loader.pug - paginator_loader: { buttons: { load: 'Laad meer activatie codes', @@ -1919,7 +1875,6 @@ export default { }, }, - // MENU = langing/navbar.pug topnavbar: { items: { funds: 'Fondsen', @@ -1937,7 +1892,6 @@ export default { funds: 'Fondsen', }, }, - // AUTHENTICATION POPUP = popup-auth.pug popup_auth: { header: { title: 'Inloggen op het dashboard', diff --git a/react/src/dashboard/i18n/nl/i18n-modals-danger_zone.js b/react/src/dashboard/i18n/nl/i18n-modals-danger_zone.js index 28d3b9850..956a3befa 100644 --- a/react/src/dashboard/i18n/nl/i18n-modals-danger_zone.js +++ b/react/src/dashboard/i18n/nl/i18n-modals-danger_zone.js @@ -16,6 +16,7 @@ import recreate_bi_connection from './modals/danger-zone/recreate-bi-connection' import remove_reservation_field from './modals/danger-zone/remove-reservation-field'; import remove_mollie_connection from './modals/danger-zone/remove-mollie-connection'; import exclude_pre_check_fund from './modals/danger-zone/exclude_pre_check_fund'; +import remove_prevalidation_request from './modals/danger-zone/remove-prevalidation-request'; export default { remove_provider_application, @@ -36,4 +37,5 @@ export default { remove_reservation_field, remove_mollie_connection, exclude_pre_check_fund, + remove_prevalidation_request, }; diff --git a/react/src/dashboard/i18n/nl/i18n-pages.js b/react/src/dashboard/i18n/nl/i18n-pages.js index fba76d806..86bb6d537 100644 --- a/react/src/dashboard/i18n/nl/i18n-pages.js +++ b/react/src/dashboard/i18n/nl/i18n-pages.js @@ -39,6 +39,7 @@ import product_funds from './pages/product-funds'; import reimbursement_categories from './pages/reimbursement-categories'; import provider_organization_funds from './pages/provider-organization-funds'; import transaction_bulks from './pages/transaction-bulks'; +import prevalidation_requests from './pages/prevalidation-requests'; export default { vouchers, @@ -82,4 +83,5 @@ export default { reimbursement_categories, provider_organization_funds, transaction_bulks, + prevalidation_requests, }; diff --git a/react/src/dashboard/i18n/nl/modals/danger-zone/remove-prevalidation-request.js b/react/src/dashboard/i18n/nl/modals/danger-zone/remove-prevalidation-request.js new file mode 100644 index 000000000..f39ac0c62 --- /dev/null +++ b/react/src/dashboard/i18n/nl/modals/danger-zone/remove-prevalidation-request.js @@ -0,0 +1,8 @@ +export default { + title: 'Gegevens verwijderen', + description: 'Weet je zeker dat je deze gegevens wilt verwijderen?', + buttons: { + cancel: 'Annuleren', + confirm: 'Bevestigen', + }, +}; diff --git a/react/src/dashboard/i18n/nl/pages/prevalidation-requests.js b/react/src/dashboard/i18n/nl/pages/prevalidation-requests.js new file mode 100644 index 000000000..0240a2b29 --- /dev/null +++ b/react/src/dashboard/i18n/nl/pages/prevalidation-requests.js @@ -0,0 +1,39 @@ +export default { + header: { + title: 'Klaarzetten met BRP', + }, + labels: { + bsn: 'BSN', + fund: 'Fonds', + employee: 'Medewerker', + failed_reason: 'Reden van mislukking', + created_at: 'Datum', + search: 'Zoeken', + state: 'Status', + from: 'Van', + to: 'Tot', + }, + buttons: { + upload: 'Upload .csv bestand', + resubmit: 'Opnieuw verzenden', + delete: 'Verwijderen', + resubmit_failed: 'Mislukte verzoeken opnieuw verzenden', + }, + states: { + pending: 'In behandeling', + success: 'Gelukt', + fail: 'Mislukt', + all: 'Alle', + }, + tooltips: { + bsn: 'BSN', + fund: 'Fonds', + employee: 'Medewerker', + state: 'Status', + failed_reason: 'Reden van mislukking', + }, + empty: { + title: 'Geen aanvragers klaargezet', + description: 'Er zijn nog geen aanvragers klaargezet voor dit fonds.', + }, +}; diff --git a/react/src/dashboard/layout/elements/aside/LayoutAsideSponsor.tsx b/react/src/dashboard/layout/elements/aside/LayoutAsideSponsor.tsx index ffa69167a..a9f426b95 100644 --- a/react/src/dashboard/layout/elements/aside/LayoutAsideSponsor.tsx +++ b/react/src/dashboard/layout/elements/aside/LayoutAsideSponsor.tsx @@ -77,6 +77,20 @@ export default function LayoutAsideSponsor({ organization }: { organization: Org false, ), }, + { + id: 'prevalidation_requests', + name: 'Klaarzetten met BRP', + state: DashboardRoutes.PREVALIDATION_REQUESTS, + dusk: 'csvPrevalidationRequestsPage', + stateParams: { organizationId: organization?.id }, + show: + organization.allow_prevalidation_requests && + hasPermission( + organization, + [Permission.VALIDATE_RECORDS, Permission.MANAGE_VALIDATORS], + false, + ), + }, { id: 'fund_requests', name: 'Aanvragen', diff --git a/react/src/dashboard/modules/state_router/RouterBuilder.tsx b/react/src/dashboard/modules/state_router/RouterBuilder.tsx index 754bd99b2..f14fc0d7a 100644 --- a/react/src/dashboard/modules/state_router/RouterBuilder.tsx +++ b/react/src/dashboard/modules/state_router/RouterBuilder.tsx @@ -98,6 +98,7 @@ export enum DashboardRoutes { ORGANIZATION_NOTIFICATIONS = 'organization-notifications', FEEDBACK = 'feedback', CSV_VALIDATION = 'csv-validation', + PREVALIDATION_REQUESTS = 'prevalidation-requests', PREFERENCE_EMAILS = 'preferences-emails', PREFERENCE_NOTIFICATIONS = 'preferences-notifications', SECURITY_2FA = 'security-2fa', diff --git a/react/src/dashboard/props/models/Fund.tsx b/react/src/dashboard/props/models/Fund.tsx index 62f4392f4..a8940df90 100644 --- a/react/src/dashboard/props/models/Fund.tsx +++ b/react/src/dashboard/props/models/Fund.tsx @@ -117,6 +117,8 @@ export default interface Fund { faq?: Array; csv_primary_key: string; csv_required_keys: Array; + csv_required_keys_except_prefill: Array; + csv_required_keys_by_groups: Array; formulas?: Array; budget?: FundVoucherStatistics & { used_active_vouchers?: string; diff --git a/react/src/dashboard/props/models/FundCriteriaGroup.tsx b/react/src/dashboard/props/models/FundCriteriaGroup.tsx new file mode 100644 index 000000000..d35e98784 --- /dev/null +++ b/react/src/dashboard/props/models/FundCriteriaGroup.tsx @@ -0,0 +1,7 @@ +export default interface FundCriteriaGroup { + id?: number; + title: string; + description_html?: string; + order: number; + required: boolean; +} diff --git a/react/src/dashboard/props/models/FundCriterion.tsx b/react/src/dashboard/props/models/FundCriterion.tsx index 18add2eba..a03293db3 100644 --- a/react/src/dashboard/props/models/FundCriterion.tsx +++ b/react/src/dashboard/props/models/FundCriterion.tsx @@ -21,5 +21,7 @@ export default interface FundCriterion { has_record?: boolean; is_valid?: boolean; fund_criteria_step_id?: number; + fund_criteria_group_id?: number; + fill_type?: 'manual' | 'prefill'; rules?: Array; } diff --git a/react/src/dashboard/props/models/Organization.tsx b/react/src/dashboard/props/models/Organization.tsx index d3969f353..daebcd86f 100644 --- a/react/src/dashboard/props/models/Organization.tsx +++ b/react/src/dashboard/props/models/Organization.tsx @@ -121,6 +121,7 @@ export default interface Organization { allow_profiles_relations?: boolean; allow_profiles_households?: boolean; allow_2fa_restrictions?: boolean; + allow_prevalidation_requests?: boolean; allow_reservation_custom_fields: boolean; auth_2fa_funds_policy: 'optional' | 'required' | 'restrict_features'; auth_2fa_funds_remember_ip: boolean; diff --git a/react/src/dashboard/props/models/PrevalidationRequest.tsx b/react/src/dashboard/props/models/PrevalidationRequest.tsx new file mode 100644 index 000000000..400db8994 --- /dev/null +++ b/react/src/dashboard/props/models/PrevalidationRequest.tsx @@ -0,0 +1,18 @@ +import Fund from './Fund'; + +export default interface PrevalidationRequest { + id: number; + fund_id: number; + state: string; + bsn: string; + identity_address: string; + failed_reason?: string; + failed_reason_locale?: string; + fund?: Fund; + employee: { + id: number; + email?: string; + identity_address: string; + organization_id: number; + }; +} diff --git a/react/src/dashboard/router/routes.tsx b/react/src/dashboard/router/routes.tsx index a540e53be..bb298ce42 100644 --- a/react/src/dashboard/router/routes.tsx +++ b/react/src/dashboard/router/routes.tsx @@ -103,6 +103,7 @@ import ImplementationPreCheck from '../components/pages/implementation-pre-check import ImplementationTranslations from '../components/pages/implementations-edit/ImplementationTranslations'; import ImplementationAnnouncements from '../components/pages/implementations-edit/ImplementationAnnouncements'; import ImplementationTermsAndPrivacy from '../components/pages/implementations-edit/ImplementationTermsAndPrivacy'; +import PrevalidationRequests from '../components/pages/person-prevalidations/PrevalidationRequests'; const router = new RouterBuilder(); @@ -649,6 +650,11 @@ router.state(DashboardRoutes.CSV_VALIDATION, , { altPath: `/organizations/:organizationId/csv-validations`, }); +router.state(DashboardRoutes.PREVALIDATION_REQUESTS, , { + path: `/organisaties/:organizationId/prevalidation-requests`, + altPath: `/organizations/:organizationId/prevalidation-requests`, +}); + router.state(DashboardRoutes.PREFERENCE_EMAILS, , { path: `/voorkeuren/emails`, altPath: `/preferences/emails`, diff --git a/react/src/dashboard/services/FeaturesService.ts b/react/src/dashboard/services/FeaturesService.ts index 843913ddf..e28bbff97 100644 --- a/react/src/dashboard/services/FeaturesService.ts +++ b/react/src/dashboard/services/FeaturesService.ts @@ -100,9 +100,9 @@ export class FeatureService { labels: ['Aanvragen', 'Integratie'], }, { - key: 'subsidy_funds', + key: 'product_funds', name: 'Product fonds', - description: 'Een digitaal tegoed voor een specifiek product of dienst. ', + description: 'Een digitaal tegoed voor een specifiek product of dienst.', overview_description: 'Voorzie deelnemers van een digitaal tegoed voor een specifiek product of dienst.', labels: ['Financieel'], @@ -176,10 +176,10 @@ export class FeatureService { physical_cards: ['bi_tools', 'auth_2_fa'], voucher_records: ['auth_2_fa', 'digid'], email_connection: ['bi_tools', 'auth_2_fa'], - external_funds: ['budget_funds', 'subsidy_funds'], + external_funds: ['budget_funds', 'product_funds'], voucher_top_up: ['voucher_records', 'budget_funds'], - budget_funds: ['subsidy_funds', 'external_funds'], - subsidy_funds: ['budget_funds', 'external_funds'], + budget_funds: ['product_funds', 'external_funds'], + product_funds: ['budget_funds', 'external_funds'], }[feature] || []; return additionalFeatures.reduce((list: Array, item: string) => { diff --git a/react/src/dashboard/services/FundService.ts b/react/src/dashboard/services/FundService.ts index 926a56eb9..d877de4f5 100644 --- a/react/src/dashboard/services/FundService.ts +++ b/react/src/dashboard/services/FundService.ts @@ -242,6 +242,12 @@ export class FundService { return Papa.unparse([fund.csv_required_keys.filter((key) => !key.endsWith('_eligible'))]); } + public sampleCSVForPrevalidationRequest(fund: Fund): string { + return Papa.unparse([ + ['bsn', ...fund.csv_required_keys_except_prefill.filter((key) => !key.endsWith('_eligible'))], + ]); + } + public topUp(company_id: number, fund_id: number): Promise> { return this.apiRequest.post(`${this.prefix}/${company_id}/funds/${fund_id}/top-up`); } diff --git a/react/src/dashboard/services/PrevalidationRequestService.ts b/react/src/dashboard/services/PrevalidationRequestService.ts new file mode 100644 index 000000000..cafcb241b --- /dev/null +++ b/react/src/dashboard/services/PrevalidationRequestService.ts @@ -0,0 +1,77 @@ +import { useState } from 'react'; +import ApiRequestService from './ApiRequestService'; +import ApiResponse, { ApiResponseSingle } from '../props/ApiResponses'; +import { ConfigurableTableColumn } from '../components/pages/vouchers/hooks/useConfigurableTable'; +import PrevalidationRequest from '../props/models/PrevalidationRequest'; + +export class PrevalidationRequestService { + /** + * @param apiRequest + */ + public constructor(protected apiRequest: ApiRequestService = new ApiRequestService()) {} + + /** + * Url prefix + * + * @param data + */ + public prefix = '/platform/organizations'; + + public list(organization_id: number, filters: object = {}): Promise> { + return this.apiRequest.get(`${this.prefix}/${organization_id}/prevalidation-requests`, filters); + } + + public storeBatch( + organization_id: number, + data: Array<{ [key: string]: string }>, + fund_id: number = null, + file?: object, + ): Promise { + return this.apiRequest.post(`${this.prefix}/${organization_id}/prevalidation-requests/collection`, { + data: data, + fund_id: fund_id, + file, + }); + } + + public storeBatchValidate( + organization_id: number, + data: Array<{ [key: string]: string }>, + fund_id: number = null, + ): Promise> { + return this.apiRequest.post(`${this.prefix}/${organization_id}/prevalidation-requests/collection/validate`, { + data: data, + fund_id: fund_id, + }); + } + + public resubmitFailed(organization_id: number): Promise> { + return this.apiRequest.get(`${this.prefix}/${organization_id}/prevalidation-requests/resubmit-failed`); + } + + public resubmit(organization_id: number, id: number): Promise> { + return this.apiRequest.get(`${this.prefix}/${organization_id}/prevalidation-requests/${id}/resubmit`); + } + + public destroy(organization_id: number, id: number): Promise> { + return this.apiRequest.delete(`${this.prefix}/${organization_id}/prevalidation-requests/${id}`); + } + + public getColumns(): Array { + const list = ['bsn', 'fund', 'employee', 'state', 'failed_reason'].filter((item) => item); + + return list.map((key) => ({ + key, + label: `prevalidation_requests.labels.${key}`, + tooltip: { + key: key, + title: `prevalidation_requests.labels.${key}`, + description: `prevalidation_requests.tooltips.${key}`, + }, + })); + } +} + +export function usePrevalidationRequestService(): PrevalidationRequestService { + return useState(new PrevalidationRequestService())[0]; +} diff --git a/react/src/webshop/components/elements/file-uploader/FileUploader.tsx b/react/src/webshop/components/elements/file-uploader/FileUploader.tsx index 9f4c8d091..532863099 100644 --- a/react/src/webshop/components/elements/file-uploader/FileUploader.tsx +++ b/react/src/webshop/components/elements/file-uploader/FileUploader.tsx @@ -68,7 +68,7 @@ export default function FileUploader({ | 'product_reservation_custom_field'; title?: string; files?: Array; - template?: 'default' | 'compact' | 'inline'; + template?: 'default' | 'compact' | 'inline' | 'group'; hideInlineTitle?: boolean; allowMultiple?: boolean; maxFiles?: number; @@ -298,6 +298,7 @@ export default function FileUploader({ className={classNames('block', 'block-file-uploader', { 'block-file-uploader-compact': template === 'compact', 'block-file-uploader-inline': template === 'inline', + 'block-file-uploader-group': template === 'group', })} data-dusk="fileUploader"> {translate('global.file_uploader.max_size')}
)} - {(template === 'inline' || template === 'compact') && effectiveMaxFiles && ( + {(template === 'inline' || template === 'compact' || template === 'group') && effectiveMaxFiles && (
{translate('global.file_uploader.max_files', { count: effectiveMaxFiles })}
@@ -365,7 +366,7 @@ export default function FileUploader({ {fileItems.length > 0 && (
- {template === 'inline' && !hideInlineTitle && ( + {(template === 'inline' || template === 'group') && !hideInlineTitle && (
{translate('global.file_uploader.attachments')}
{fileItems.length}
diff --git a/react/src/webshop/components/elements/file-uploader/FileUploaderItemView.tsx b/react/src/webshop/components/elements/file-uploader/FileUploaderItemView.tsx index f10898d53..9bf169d4a 100644 --- a/react/src/webshop/components/elements/file-uploader/FileUploaderItemView.tsx +++ b/react/src/webshop/components/elements/file-uploader/FileUploaderItemView.tsx @@ -18,7 +18,7 @@ export default function FileUploaderItemView({ removeFile, }: { item: FileUploaderItem; - template?: 'default' | 'compact' | 'inline'; + template?: 'default' | 'compact' | 'inline' | 'group'; hidePreviewButton?: boolean; hideDownloadButton?: boolean; readOnly?: boolean; @@ -65,6 +65,16 @@ export default function FileUploaderItemView({ [fileService], ); + const progressValue = useMemo(() => { + const value = Number(item.progress); + + if (!Number.isFinite(value)) { + return 0; + } + + return Math.max(0, Math.min(100, Math.round(value))); + }, [item.progress]); + return (
{name}
- +
+ {template === 'group' &&
{progressValue}%
}
{item.has_preview && !hidePreviewButton && ( diff --git a/react/src/webshop/components/pages/fund-requests-show/elements/FundRequestRecordsBlock.tsx b/react/src/webshop/components/pages/fund-requests-show/elements/FundRequestRecordsBlock.tsx index ba5ad1a66..773ec5e22 100644 --- a/react/src/webshop/components/pages/fund-requests-show/elements/FundRequestRecordsBlock.tsx +++ b/react/src/webshop/components/pages/fund-requests-show/elements/FundRequestRecordsBlock.tsx @@ -1,4 +1,4 @@ -import React, { Dispatch, Fragment, SetStateAction } from 'react'; +import React, { Dispatch, Fragment, SetStateAction, useMemo } from 'react'; import FundRequest from '../../../../../dashboard/props/models/FundRequest'; import useTranslate from '../../../../../dashboard/hooks/useTranslate'; import FundRequestRecordsBlockItem from './FundRequestRecordsBlockItem'; @@ -26,6 +26,17 @@ export default function FundRequestRecordsBlock({ }) { const translate = useTranslate(); + const visibleRecordTypeKeys = useMemo(() => { + return ( + fundRequest?.fund?.criteria + ?.filter( + (criterion) => + !['children_same_address_nth', 'partner_same_address_nth'].includes(criterion.record_type_key), + ) + .map((criterion) => criterion.record_type_key) || [] + ); + }, [fundRequest?.fund?.criteria]); + return (
@@ -41,20 +52,22 @@ export default function FundRequestRecordsBlock({ className="fund-request-records" aria-labelledby="fund-request-records-title" aria-describedby="fund-request-records-subtitle"> - {fundRequest?.records.map((record) => ( - - ))} + {fundRequest?.records + .filter((record) => visibleRecordTypeKeys.includes(record.record_type_key)) + .map((record) => ( + + ))}
); diff --git a/react/src/webshop/components/pages/funds-request/FundRequest.tsx b/react/src/webshop/components/pages/funds-request/FundRequest.tsx index 6c77f49a6..3de6b63c3 100644 --- a/react/src/webshop/components/pages/funds-request/FundRequest.tsx +++ b/react/src/webshop/components/pages/funds-request/FundRequest.tsx @@ -43,6 +43,8 @@ import { orderBy, sortBy } from 'lodash'; import FundRequestHelpBlock from './elements/FundRequestHelpBlock'; import FundRequestStepPhysicalCardRequestAddress from './elements/steps/FundRequestStepPhysicalCardRequestAddress'; import { WebshopRoutes } from '../../../modules/state_router/RouterBuilder'; +import FundCriteriaGroup from '../../../../dashboard/props/models/FundCriteriaGroup'; +import FundRequestPersonBsnApiWarning from './elements/FundRequestPersonBsnApiWarning'; export type LocalCriterion = FundCriterion & { input_value?: string; @@ -57,10 +59,18 @@ export type LocalCriterion = FundCriterion & { requested?: boolean; }; -type FundCriteriaStepLocal = FundCriteriaStep & { +export type FundCriteriaStepLocal = FundCriteriaStep & { uid?: string; uploaderTemplate: 'inline' | 'default'; criteria: Array; + groups: Array }>; +}; + +export type Prefills = { + person: Array<{ record_type_key: string; value: string }>; + partner?: Array<{ record_type_key: string; value: string }>; + children?: Array>; + error?: { key: string; message: string }; }; export default function FundRequest() { @@ -110,12 +120,14 @@ export default function FundRequest() { const [criteriaStepKeys, setCriteriaStepKeys] = useState([]); const [pendingCriteria, setPendingCriteria] = useState>([]); + const [personPrefills, setPersonPrefills] = useState(null); const [fund, setFund] = useState(null); const [vouchers, setVouchers] = useState>(null); const [recordTypes, setRecordTypes] = useState>(null); const [fundRequests, setFundRequests] = useState>(null); const [personApiRecordsFetch, setPersonApiRecordsFetch] = useState(false); + const [prefillsError, setPrefillsError] = useState<{ key: string; message: string }>(null); const bsnIsKnown = useMemo(() => !!authIdentity?.bsn, [authIdentity]); const emailSetupShow = useMemo(() => !authIdentity?.email, [authIdentity]); @@ -143,6 +155,16 @@ export default function FundRequest() { }, {}); }, [pendingCriteria]); + const hasPersonBsnApi = useMemo( + () => + bsnIsKnown && + fund && + authIdentity && + fund.allow_fund_request_prefill && + fund.organization.has_person_bsn_api, + [authIdentity, bsnIsKnown, fund], + ); + const shouldRequestRecord = useShouldRequestRecord(recordTypesByKey, recordValuesByType); const criteriaSteps = useMemo>(() => { @@ -153,14 +175,42 @@ export default function FundRequest() { const fundSteps = fund.criteria_steps.map((step) => step.id); const hasOrders = pendingCriteria.filter((item) => item.order !== null).length > 0; + const prefillGuards = { + children_same_address_nth: (p: Prefills) => p.children?.length, + partner_same_address_nth: (p: Prefills) => p.partner?.length, + }; + const customSteps = fund.criteria_steps.map( (step): FundCriteriaStepLocal => ({ ...step, uid: `criteria_step_${step.id}`, uploaderTemplate: 'inline', + groups: fund.criteria_groups + .map((group) => ({ + ...group, + criteria: orderBy( + pendingCriteria + .filter((criterion) => criterion.fund_criteria_step_id == step.id) + .filter((criterion) => criterion.fund_criteria_group_id === group.id) + .map((criterion) => ({ ...criterion, requested: shouldRequestRecord(criterion) })) + .filter((item) => item.requested), + 'order', + ), + })) + .filter((group) => group.criteria.length > 0), criteria: orderBy( pendingCriteria .filter((criterion) => criterion.fund_criteria_step_id == step.id) + .filter((criterion) => criterion.fund_criteria_group_id === null) + .filter((criterion) => { + if (criterion.fill_type !== 'prefill' || !personPrefills) { + return true; + } + + const guard = prefillGuards[criterion.record_type_key]; + + return guard ? !!guard(personPrefills) : true; + }) .map((criterion) => ({ ...criterion, requested: shouldRequestRecord(criterion) })), 'order', ), @@ -178,15 +228,20 @@ export default function FundRequest() { order: 1000, criteria: [{ ...criterion, requested: shouldRequestRecord(criterion) }], uploaderTemplate: 'default', + groups: [], }), ); const combinedSteps = [...customSteps, ...stepLessCriteria].filter( - (step) => step.criteria.filter((criterion) => criterion.requested).length > 0, + (step) => + step.criteria.filter((criterion) => criterion.requested).length > 0 || + step.groups + .map((group) => group.criteria.filter((criterion) => criterion.requested).length > 0) + .filter((group) => group).length > 0, ); return sortBy(combinedSteps, 'order'); - }, [fund, pendingCriteria, recordTypesByKey, shouldRequestRecord]); + }, [fund, pendingCriteria, personPrefills, recordTypesByKey, shouldRequestRecord]); const setStepByName = useCallback( (stepName: string) => { @@ -480,33 +535,37 @@ export default function FundRequest() { }, [authIdentity, fund, fundRequestService, setProgress]); const checkPersonBsnApiRecords = useCallback(() => { - if ( - !bsnIsKnown || - !fund || - !authIdentity || - !fund.allow_fund_request_prefill || - !fund.organization.has_person_bsn_api || - personApiRecordsFetch - ) { + if (!hasPersonBsnApi || personApiRecordsFetch) { return; } setPersonApiRecordsFetch(true); fundService.getPersonPrefills(fund.id).then((res) => { + if (res.data.error?.key) { + setPrefillsError(res.data.error); + return; + } + + setPersonPrefills(res.data); + setPendingCriteria((criteria) => { return [ ...criteria.map((criterion) => { - criterion.input_value = - res.data.filter((item) => item.record_type_key === criterion.record_type_key)[0]?.value || - criterion.input_value; + if (criterion.fill_type === 'prefill') { + const prefillItem = res.data.person.filter( + (item) => item.record_type_key === criterion.record_type_key, + )[0]; + + criterion.input_value = prefillItem?.value || criterion.input_value; + } return criterion; }), ]; }); }); - }, [bsnIsKnown, fund, fundService, authIdentity, personApiRecordsFetch]); + }, [hasPersonBsnApi, personApiRecordsFetch, fundService, fund]); useEffect(() => { fetchFund(); @@ -552,8 +611,10 @@ export default function FundRequest() { // The user has to sign-in first const voucher = getFirstActiveFundVoucher(fund, vouchers); const pendingRequests = fundRequests.filter((request) => request.state === 'pending'); - const pendingCriteria = fund.criteria.filter((criterion) => !criterion.is_valid || !criterion.has_record); const invalidCriteria = fund.criteria.filter((criterion) => !criterion.is_valid); + const pendingCriteria = fund.criteria + .filter((criterion) => !criterion.is_valid || !criterion.has_record) + .map((criterion) => ({ ...criterion, requested: true })); // Voucher already received, go to the voucher if (voucher) { @@ -612,11 +673,21 @@ export default function FundRequest() { useEffect(() => { const removedData = {}; + const addedData = []; const criteria = pendingCriteria .map((item) => { const defaultValue = fundService.getCriterionControlDefaultValue(item.record_type, item.operator); + if (shouldRequestRecord(item) && !item.requested && personPrefills && item.fill_type === 'prefill') { + addedData.push(item.record_type_key); + const prefillItem = personPrefills.person.filter( + (prefill) => prefill.record_type_key === item.record_type_key, + )[0]; + + item.input_value = prefillItem?.value || item.input_value; + } + if (!shouldRequestRecord(item) && item.input_value != defaultValue) { removedData[item.record_type_key] = { input_value: item.input_value, @@ -633,6 +704,8 @@ export default function FundRequest() { delete item.is_checked; } + item.requested = shouldRequestRecord(item); + return { ...item }; }) .map((item) => { @@ -643,10 +716,10 @@ export default function FundRequest() { return { ...item }; }); - if (Object.keys(removedData).length > 0) { + if (Object.keys(removedData).length > 0 || addedData.length > 0) { setPendingCriteria([...criteria]); } - }, [fundService, pendingCriteria, shouldRequestRecord]); + }, [fundService, pendingCriteria, personPrefills, shouldRequestRecord]); useEffect(() => { if (autoSubmit && steps?.[step] == 'confirm_criteria' && !autoSubmitted) { @@ -655,7 +728,17 @@ export default function FundRequest() { } }, [autoSubmit, autoSubmitted, step, steps, submitConfirmCriteria]); - if (!fund || !vouchers || !fundRequests || (steps[step] == 'confirm_criteria' && autoSubmit)) { + if (prefillsError) { + return ; + } + + if ( + !fund || + !vouchers || + !fundRequests || + (steps[step] == 'confirm_criteria' && autoSubmit) || + (hasPersonBsnApi && !personPrefills) + ) { return ; } @@ -705,8 +788,10 @@ export default function FundRequest() { submitInProgress={submitInProgress} setSubmitInProgress={setSubmitInProgress} criteria={criterionStep.criteria.filter((item) => item.requested)} + groups={criterionStep.groups} uploaderTemplate={criterionStep.uploaderTemplate} formDataBuild={formDataBuild} + prefills={personPrefills} setCriterion={(id, update) => { setPendingCriteria((criteria) => { const criterion = criteria.find((item) => item.id == id); @@ -718,7 +803,7 @@ export default function FundRequest() { return [...criteria]; }); }} - recordTypes={recordTypes} + recordTypesByKey={recordTypesByKey} progress={ } bsnWarning={} + prefills={personPrefills} + recordTypesByKey={recordTypesByKey} /> )} diff --git a/react/src/webshop/components/pages/funds-request/elements/FundRequestPersonBsnApiWarning.tsx b/react/src/webshop/components/pages/funds-request/elements/FundRequestPersonBsnApiWarning.tsx new file mode 100644 index 000000000..ebca4dfb6 --- /dev/null +++ b/react/src/webshop/components/pages/funds-request/elements/FundRequestPersonBsnApiWarning.tsx @@ -0,0 +1,73 @@ +import React, { useMemo } from 'react'; +import Fund from '../../../../props/models/Fund'; +import TranslateHtml from '../../../../../dashboard/components/elements/translate-html/TranslateHtml'; +import BlockShowcase from '../../../elements/block-showcase/BlockShowcase'; +import BlockLoader from '../../../elements/block-loader/BlockLoader'; +import useAssetUrl from '../../../../hooks/useAssetUrl'; +import useTranslate from '../../../../../dashboard/hooks/useTranslate'; +import StateNavLink from '../../../../modules/state_router/StateNavLink'; +import { WebshopRoutes } from '../../../../modules/state_router/RouterBuilder'; + +export default function FundRequestPersonBsnApiWarning({ + fund, + prefillsError, +}: { + fund: Fund; + prefillsError: { key: string; message: string }; +}) { + const assetUrl = useAssetUrl(); + const translate = useTranslate(); + + const errorKey = useMemo( + () => + ({ + not_found: 'not_found', + connection_error: 'connection_error', + taken_by_partner: 'taken_by_partner', + not_filled_required_criteria: 'not_filled_required_criteria', + })[prefillsError?.key] || 'connection_error', + [prefillsError?.key], + ); + + return ( + }> +
+
+
+
+

+ {translate(`fund_request.cards.${errorKey}.title`)} +

+
+
+

+ {translate(`fund_request.cards.${errorKey}.heading`)} +

+

+ +

+
+ icon sign-up error +
+

+ {translate(`fund_request.cards.${errorKey}.contacts`, { + name: fund.organization.name, + })} +

+
+ + {translate('fund_request.cards.back')} + +
+
+
+
+
+
+
+
+
+ ); +} diff --git a/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepCriteria.tsx b/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepCriteria.tsx index fe95e65a7..9268f4b45 100644 --- a/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepCriteria.tsx +++ b/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepCriteria.tsx @@ -1,25 +1,19 @@ -import React, { Fragment, useCallback, useMemo } from 'react'; +import React, { Fragment, useCallback, useMemo, useState } from 'react'; import Fund from '../../../../../props/models/Fund'; import useTranslate from '../../../../../../dashboard/hooks/useTranslate'; -import { LocalCriterion } from '../../FundRequest'; -import Markdown from '../../../../elements/markdown/Markdown'; -import SelectControl from '../../../../../../dashboard/components/elements/select-control/SelectControl'; -import UIControlCheckbox from '../../../../../../dashboard/components/elements/forms/ui-controls/UIControlCheckbox'; -import UIControlStep from '../../../../../../dashboard/components/elements/forms/ui-controls/UIControlStep'; -import UIControlDate from '../../../../../../dashboard/components/elements/forms/ui-controls/UIControlDate'; -import { dateFormat, dateParse } from '../../../../../../dashboard/helpers/dates'; -import UIControlNumber from '../../../../../../dashboard/components/elements/forms/ui-controls/UIControlNumber'; -import UIControlText from '../../../../../../dashboard/components/elements/forms/ui-controls/UIControlText'; -import FormError from '../../../../../../dashboard/components/elements/forms/errors/FormError'; -import FileUploader from '../../../../elements/file-uploader/FileUploader'; +import { LocalCriterion, Prefills } from '../../FundRequest'; import RecordType from '../../../../../../dashboard/props/models/RecordType'; import { ResponseError } from '../../../../../../dashboard/props/ApiResponses'; import { useFundRequestService } from '../../../../../services/FundRequestService'; import { uniq } from 'lodash'; import useSetProgress from '../../../../../../dashboard/hooks/useSetProgress'; import SignUpFooter from '../../../../elements/sign-up/SignUpFooter'; -import classNames from 'classnames'; -import FormLabel from '../../../../elements/forms/FormLabel'; +import FundRequestStepCriterion from './FundRequestStepCriterion'; +import FundCriteriaGroup from '../../../../../../dashboard/props/models/FundCriteriaGroup'; +import FormError from '../../../../../../dashboard/components/elements/forms/errors/FormError'; +import Markdown from '../../../../elements/markdown/Markdown'; +import FundRequestCriteriaPartner from './criteria/FundRequestCriteriaPartner'; +import FundRequestCriteriaChildren from './criteria/FundRequestCriteriaChildren'; export default function FundRequestStepCriteria({ fund, @@ -31,12 +25,14 @@ export default function FundRequestStepCriteria({ progress, bsnWarning, criteria, - recordTypes, + recordTypesByKey, submitInProgress, setSubmitInProgress, uploaderTemplate, formDataBuild, setCriterion, + groups, + prefills, }: { fund: Fund; step: number; @@ -47,21 +43,30 @@ export default function FundRequestStepCriteria({ progress: React.ReactElement; bsnWarning: React.ReactElement; criteria: Array; - recordTypes: Array; + recordTypesByKey: { [_key: string]: RecordType }; submitInProgress: boolean; uploaderTemplate: 'default' | 'inline'; setSubmitInProgress: React.Dispatch>; formDataBuild: (criteria: Array) => object; setCriterion: (index: number, update: Partial) => void; + groups: Array }>; + prefills: Prefills; }) { const translate = useTranslate(); const setProgress = useSetProgress(); const fundRequestService = useFundRequestService(); - const recordTypesByKey = useMemo(() => { - return recordTypes?.reduce((acc, type) => ({ ...acc, [type.key]: type }), {}); - }, [recordTypes]); + const [errors, setErrors] = useState({}); + + const hasPrefills = useMemo(() => { + return ( + criteria.filter((criterion) => criterion.fill_type === 'prefill').length > 0 || + groups + .map((group) => group.criteria.filter((criterion) => criterion.fill_type === 'prefill').length > 0) + .filter((group) => group).length > 0 + ); + }, [criteria, groups]); // Submit or Validate record criteria const validateCriteria = useCallback( @@ -83,10 +88,14 @@ export default function FundRequestStepCriteria({ // Submit criteria record const validateStepCriteria = useCallback( - (criteria: Array) => { + (criteria: Array, groups: Array }>) => { + const items: Array = [ + ...criteria, + ...groups.reduce((list, group) => [...list, ...group.criteria], []), + ]; setProgress(0); - validateCriteria(criteria) + validateCriteria(items) .then((errors) => { const indexes = uniq( Object.keys(errors || {}) @@ -94,8 +103,15 @@ export default function FundRequestStepCriteria({ .map((errorKey) => parseInt(errorKey.split('.')[1])), ); - if (indexes.length === 0) { - criteria.forEach((item) => setCriterion(item.id, { errors: {} })); + const groupIndexes = uniq( + Object.keys(errors || {}) + .filter((err) => err.startsWith('criteria_groups.')) + .map((errorKey) => parseInt(errorKey.split('.')[1])), + ); + + if (indexes.length === 0 && groupIndexes.length === 0) { + items.forEach((item) => setCriterion(item.id, { errors: {} })); + setErrors({}); return onNextStep(); } @@ -114,35 +130,24 @@ export default function FundRequestStepCriteria({ }; }, {}); - return [...list, { id: criteria[index].id, errors: errorsList }]; + return [...list, { id: items[index].id, errors: errorsList }]; }, []); - criteria.forEach((item) => { + items.forEach((item) => { setCriterion(item.id, { errors: errorsList.find((errItem) => errItem.id == item.id)?.errors || {}, }); }); + + setErrors(errors); }) .catch((err: ResponseError) => { console.error(err); + setErrors({}); }) .finally(() => setProgress(100)); }, - [onNextStep, setProgress, setCriterion, validateCriteria], - ); - - const isLabelRequired = useCallback( - (criteria: LocalCriterion) => { - return !criteria.optional && fund.criteria_label_requirement_show !== 'optional'; - }, - [fund.criteria_label_requirement_show], - ); - - const isLabelOptional = useCallback( - (criteria: LocalCriterion) => { - return criteria.optional && fund.criteria_label_requirement_show !== 'required'; - }, - [fund.criteria_label_requirement_show], + [onNextStep, setProgress, setCriterion, validateCriteria, setErrors], ); return ( @@ -153,198 +158,155 @@ export default function FundRequestStepCriteria({ className="sign_up-pane" onSubmit={(e) => { e.preventDefault(); - validateStepCriteria(criteria); + validateStepCriteria(criteria, groups); }}>

{title}

- {criteria.map((criterion, index) => ( -
- {uploaderTemplate === 'inline' ? ( - - {(criterion.title || - criterion.title_default || - (criterion.description && criterion.description !== '_')) && ( -
-
-
- {criterion.title || criterion.title_default} -
-
+
+ {hasPrefills && ( + +
+ {translate('fund_request.prefills.title')} +
- {criterion.extra_description && criterion.extra_description !== '_' && ( -
- -
- )} + {fund.help_enabled && ( +
{translate('fund_request.prefills.subtitle')}
+ )} +
+ )} + + {groups.map((group, index) => ( + +
+
{group.title}
+ {group.description_html && ( + + )} -
- {criterion.description && criterion.description !== '_' && ( - - )} + {group.required && ( +
+
+
+ {translate('form.required')} +
)} - - ) : ( - -
-
- {criterion.description && criterion.description !== '_' && ( - - )} +
+ + + {group.criteria.filter((criterion) => criterion.fill_type === 'prefill').length > 0 && ( +
+
+ {group.criteria + .filter((criterion) => criterion.fill_type === 'prefill') + .map((criterion) => ( +
+
+ {criterion.title || criterion.title_default} +
+
+ {criterion.input_value || '-'} +
+
+ ))}
- - {!criterion.description && criterion.description !== '_' && ( -
{criterion.title_default}
- )}
- - )} - -
- - {uploaderTemplate !== 'inline' && recordTypesByKey?.[criterion?.record_type?.key]?.name} - - - {criterion.control_type == 'select_control' && ( - { - setCriterion(criterion.id, { input_value: input_value }); - }} - dusk="selectControl" - placeholder={translate( - 'fund_request.sign_up.fund_request_step_criteria.make_a_choice', - )} - multiline={true} - /> - )} - - {criterion.control_type == 'ui_control_checkbox' && ( - { - setCriterion(criterion.id, { - is_checked: checked, - input_value: checked ? criterion.value : null, - }); - }} - /> - )} - - {criterion.control_type == 'ui_control_step' && ( - { - setCriterion(criterion.id, { input_value: value.toFixed() }); - }} - name={criterion.record_type.key} - min={0} - max={32} - dataDusk="controlStep" - /> - )} - - {criterion.control_type == 'ui_control_date' && ( - { - setCriterion(criterion.id, { - input_value: date ? dateFormat(date, 'dd-MM-yyyy') : '', - }); - }} - id={`criterion_${criterion.id}`} - dataDusk="controlDate" - /> )} - {criterion.control_type == 'ui_control_number' && ( - { - setCriterion(criterion.id, { input_value: (value || '').toString() }); - }} - /> - )} + {group.criteria + .filter((criterion) => criterion.fill_type === 'manual') + .map((criterion, index) => ( + + ))} + + ))} + + {criteria.length > 0 && ( + + {criteria.filter((criterion) => criterion.fill_type === 'prefill').length > 0 && ( + + {criteria + .filter((criterion) => criterion.fill_type === 'prefill') + .filter((criterion) => criterion.record_type_key === 'partner_same_address_nth') + .length > 0 && + prefills.partner.length > 0 && ( + + )} - {criterion.control_type == 'ui_control_text' && ( - { - setCriterion(criterion.id, { input_value: e.target.value }); - }} - /> - )} + {criteria + .filter((criterion) => criterion.fill_type === 'prefill') + .filter( + (criterion) => criterion.record_type_key === 'children_same_address_nth', + ).length > 0 && + prefills.children.length > 0 && ( + + )} - {criterion.control_type == 'ui_control_currency' && ( - { - setCriterion(criterion.id, { input_value: (value || '').toString() }); - }} - /> + {criteria + .filter((criterion) => criterion.fill_type === 'prefill') + .filter( + (criterion) => + !['children_same_address_nth', 'partner_same_address_nth'].includes( + criterion.record_type_key, + ), + ).length > 0 && ( +
+
+ {criteria + .filter((criterion) => criterion.fill_type === 'prefill') + .filter( + (criterion) => + ![ + 'children_same_address_nth', + 'partner_same_address_nth', + ].includes(criterion.record_type_key), + ) + .map((criterion) => ( +
+
+ {criterion.title || criterion.title_default} +
+
+ {criterion.input_value || '-'} +
+
+ ))} +
+
+ )} +
)} - -
- {criterion.show_attachment && ( - { - setCriterion(criterion.id, { - files, - files_uid: files.map((file) => file.uid), - }); - }} - /> - )} - - -
- ))} + {criteria + .filter((criterion) => criterion.fill_type === 'manual') + .map((criterion, index) => ( + + ))} +
+ )} +
- {bsnWarning} diff --git a/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepCriterion.tsx b/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepCriterion.tsx new file mode 100644 index 000000000..d5c81ac09 --- /dev/null +++ b/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestStepCriterion.tsx @@ -0,0 +1,236 @@ +import React, { Fragment, useCallback } from 'react'; +import Fund from '../../../../../props/models/Fund'; +import useTranslate from '../../../../../../dashboard/hooks/useTranslate'; +import { LocalCriterion } from '../../FundRequest'; +import Markdown from '../../../../elements/markdown/Markdown'; +import SelectControl from '../../../../../../dashboard/components/elements/select-control/SelectControl'; +import UIControlCheckbox from '../../../../../../dashboard/components/elements/forms/ui-controls/UIControlCheckbox'; +import UIControlStep from '../../../../../../dashboard/components/elements/forms/ui-controls/UIControlStep'; +import UIControlDate from '../../../../../../dashboard/components/elements/forms/ui-controls/UIControlDate'; +import { dateFormat, dateParse } from '../../../../../../dashboard/helpers/dates'; +import UIControlNumber from '../../../../../../dashboard/components/elements/forms/ui-controls/UIControlNumber'; +import UIControlText from '../../../../../../dashboard/components/elements/forms/ui-controls/UIControlText'; +import FormError from '../../../../../../dashboard/components/elements/forms/errors/FormError'; +import FileUploader from '../../../../elements/file-uploader/FileUploader'; +import RecordType from '../../../../../../dashboard/props/models/RecordType'; +import classNames from 'classnames'; +import FormLabel from '../../../../elements/forms/FormLabel'; + +export default function FundRequestStepCriterion({ + fund, + criterion, + recordTypesByKey, + uploaderTemplate, + setCriterion, + isGroup = false, +}: { + fund: Fund; + criterion: LocalCriterion; + recordTypesByKey: { [_key: string]: RecordType }; + uploaderTemplate: 'default' | 'inline'; + setCriterion: (index: number, update: Partial) => void; + isGroup?: boolean; +}) { + const translate = useTranslate(); + const fileUploaderTemplate: 'default' | 'inline' | 'group' = isGroup ? 'group' : uploaderTemplate; + + const isLabelRequired = useCallback( + (criteria: LocalCriterion) => { + return !criteria.optional && fund.criteria_label_requirement_show !== 'optional'; + }, + [fund.criteria_label_requirement_show], + ); + + const isLabelOptional = useCallback( + (criteria: LocalCriterion) => { + return criteria.optional && fund.criteria_label_requirement_show !== 'required'; + }, + [fund.criteria_label_requirement_show], + ); + + return ( + + {!(isGroup && criterion.control_type == 'ui_control_checkbox') && ( + + {uploaderTemplate === 'inline' ? ( + + {(criterion.title || + criterion.title_default || + (criterion.description && criterion.description !== '_')) && ( +
+
+
+ {criterion.title || criterion.title_default} +
+
+ + {criterion.extra_description && criterion.extra_description !== '_' && ( +
+ +
+ )} + +
+ {criterion.description && criterion.description !== '_' && ( + + )} +
+
+ )} +
+ ) : ( + +
+
+ {criterion.description && criterion.description !== '_' && ( + + )} +
+ + {!criterion.description && criterion.description !== '_' && ( +
{criterion.title_default}
+ )} +
+
+ )} +
+ )} + +
+ {!(isGroup && criterion.control_type == 'ui_control_checkbox') && ( + + {uploaderTemplate !== 'inline' && recordTypesByKey?.[criterion?.record_type?.key]?.name} + + )} + + {criterion.control_type == 'select_control' && ( + { + setCriterion(criterion.id, { input_value: input_value }); + }} + dusk="selectControl" + placeholder={translate('fund_request.sign_up.fund_request_step_criteria.make_a_choice')} + multiline={true} + /> + )} + + {criterion.control_type == 'ui_control_checkbox' && ( + { + setCriterion(criterion.id, { + is_checked: checked, + input_value: checked ? criterion.value : null, + }); + }} + /> + )} + + {criterion.control_type == 'ui_control_step' && ( + { + setCriterion(criterion.id, { input_value: value.toFixed() }); + }} + name={criterion.record_type.key} + min={0} + max={32} + dataDusk="controlStep" + /> + )} + + {criterion.control_type == 'ui_control_date' && ( + { + setCriterion(criterion.id, { + input_value: date ? dateFormat(date, 'dd-MM-yyyy') : '', + }); + }} + id={`criterion_${criterion.id}`} + dataDusk="controlDate" + /> + )} + + {criterion.control_type == 'ui_control_number' && ( + { + setCriterion(criterion.id, { input_value: (value || '').toString() }); + }} + /> + )} + + {criterion.control_type == 'ui_control_text' && ( + { + setCriterion(criterion.id, { input_value: e.target.value }); + }} + /> + )} + + {criterion.control_type == 'ui_control_currency' && ( + { + setCriterion(criterion.id, { input_value: (value || '').toString() }); + }} + /> + )} + + +
+ {criterion.show_attachment && + (criterion.control_type !== 'ui_control_checkbox' || criterion.input_value === criterion.value) && ( + { + setCriterion(criterion.id, { + files, + files_uid: files.map((file) => file.uid), + }); + }} + /> + )} + + +
+ ); +} diff --git a/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestValuesOverview.tsx b/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestValuesOverview.tsx index fca0e285a..da6117476 100644 --- a/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestValuesOverview.tsx +++ b/react/src/webshop/components/pages/funds-request/elements/steps/FundRequestValuesOverview.tsx @@ -1,11 +1,15 @@ -import React, { Fragment, useCallback } from 'react'; +import React, { Fragment, useCallback, useMemo } from 'react'; import FileUploader from '../../../../elements/file-uploader/FileUploader'; -import { LocalCriterion } from '../../FundRequest'; +import { FundCriteriaStepLocal, LocalCriterion, Prefills } from '../../FundRequest'; import useTranslate from '../../../../../../dashboard/hooks/useTranslate'; -import FundCriteriaStep from '../../../../../../dashboard/props/models/FundCriteriaStep'; import SignUpFooter from '../../../../elements/sign-up/SignUpFooter'; import FundRequestHelpBlock from '../FundRequestHelpBlock'; import Fund from '../../../../../props/models/Fund'; +import FileModel from '../../../../../../dashboard/props/models/File'; +import Markdown from '../../../../elements/markdown/Markdown'; +import FundRequestCriteriaPartner from './criteria/FundRequestCriteriaPartner'; +import FundRequestCriteriaChildren from './criteria/FundRequestCriteriaChildren'; +import RecordType from '../../../../../../dashboard/props/models/RecordType'; export default function FundRequestValuesOverview({ fund, @@ -17,6 +21,8 @@ export default function FundRequestValuesOverview({ onPrevStep, progress, bsnWarning, + prefills, + recordTypesByKey, }: { fund: Fund; address: { @@ -29,25 +35,46 @@ export default function FundRequestValuesOverview({ onSubmitRequest: () => void; contactInformation: string; emailSetupShow: boolean; - criteriaSteps: Array< - FundCriteriaStep & { uid?: string; uploaderTemplate: 'inline' | 'default'; criteria: Array } - >; + criteriaSteps: Array; onPrevStep: () => void; progress: React.ReactElement; bsnWarning: React.ReactElement; + prefills: Prefills; + recordTypesByKey: { [_key: string]: RecordType }; }) { const translate = useTranslate(); - const criterionValue = useCallback((criterion: LocalCriterion) => { - if (criterion.record_type.type === 'select' || criterion.record_type.type === 'select_number') { - return ( - criterion.record_type?.options?.find((item) => item?.value === criterion.input_value)?.name || - criterion.input_value + const groupFiles = useMemo<{ [key: number]: Array }>(() => { + return criteriaSteps + ?.reduce((acc, step) => [...acc, ...step.groups], []) + .reduce( + (acc, group) => ({ + ...acc, + [group.id]: group.criteria + .filter((item) => item.requested) + .reduce((list, item) => [...list, ...item.files], []), + }), + {}, ); - } + }, [criteriaSteps]); - return criterion.input_value; - }, []); + const criterionValue = useCallback( + (criterion: LocalCriterion, inGroup: boolean = false) => { + if (criterion.record_type.type === 'select' || criterion.record_type.type === 'select_number') { + return ( + criterion.record_type?.options?.find((item) => item?.value === criterion.input_value)?.name || + criterion.input_value + ); + } + + if (inGroup && criterion.record_type.type === 'bool' && criterion.record_type.control_type === 'checkbox') { + return criterion.input_value || translate('fund_request.options.no'); + } + + return criterion.input_value; + }, + [translate], + ); return ( @@ -77,45 +104,145 @@ export default function FundRequestValuesOverview({
{index + 1}
{step.title}
-
-
+ + {step.groups.map((group) => ( + + {group.criteria.filter((item) => item.requested).length > 0 && ( + +
+
{group.title}
+ {group.description_html && ( + + )} +
+ +
+
+ {group.criteria + .filter((item) => item.requested) + .map((criterion) => ( +
+
+ {criterion.title || criterion.title_default} +
+
+ {criterionValue(criterion, true)} +
+
+ ))} +
+ + {groupFiles?.[group.id].length > 0 && ( +
+
+ Attachments +
+ {groupFiles[group.id].length} +
+
+ +
+ )} +
+
+ )} +
+ ))} + + {step.criteria + .filter((criterion) => criterion.fill_type === 'prefill') + .filter((criterion) => criterion.record_type_key === 'partner_same_address_nth') + .length > 0 && + prefills.partner.length > 0 && ( + + )} + + {step.criteria + .filter((criterion) => criterion.fill_type === 'prefill') + .filter((criterion) => criterion.record_type_key === 'children_same_address_nth') + .length > 0 && + prefills.children.length > 0 && ( + + )} + + {step.criteria + .filter((item) => item.requested) + .filter( + (criterion) => + !( + criterion.fill_type === 'prefill' && + ['children_same_address_nth', 'partner_same_address_nth'].includes( + criterion.record_type_key, + ) + ), + ).length > 0 && ( +
+
+ {step.criteria + .filter((item) => item.requested) + .filter( + (criterion) => + !( + criterion.fill_type === 'prefill' && + [ + 'children_same_address_nth', + 'partner_same_address_nth', + ].includes(criterion.record_type_key) + ), + ) + .map((criterion) => ( +
+
+ {criterion.title || criterion.title_default} +
+
+ {criterionValue(criterion)} +
+
+ ))} +
+ {step.criteria .filter((item) => item.requested) - .map((criterion) => ( -
-
- {criterion.title || criterion.title_default} -
-
- {criterionValue(criterion)} + .reduce((list, item) => [...list, ...item.files], []).length > 0 && ( +
+
+ Attachments +
+ { + step.criteria + .filter((item) => item.requested) + .reduce((list, item) => [...list, ...item.files], []) + .length + }
- ))} -
- {step.criteria - .filter((item) => item.requested) - .reduce((list, item) => [...list, ...item.files], []).length > 0 && ( -
-
- Attachments -
- { - step.criteria - .filter((item) => item.requested) - .reduce((list, item) => [...list, ...item.files], []).length - } -
+ item.requested) + .reduce((list, item) => [...list, ...item.files], [])} + readOnly={true} + />
- item.requested) - .reduce((list, item) => [...list, ...item.files], [])} - readOnly={true} - /> -
- )} -
+ )} +
+ )}
))} diff --git a/react/src/webshop/components/pages/funds-request/elements/steps/criteria/FundRequestCriteriaChildren.tsx b/react/src/webshop/components/pages/funds-request/elements/steps/criteria/FundRequestCriteriaChildren.tsx new file mode 100644 index 000000000..2f8fc7a17 --- /dev/null +++ b/react/src/webshop/components/pages/funds-request/elements/steps/criteria/FundRequestCriteriaChildren.tsx @@ -0,0 +1,55 @@ +import React, { Fragment, useCallback } from 'react'; +import useTranslate from '../../../../../../../dashboard/hooks/useTranslate'; +import RecordType from '../../../../../../../dashboard/props/models/RecordType'; +import { Prefills } from '../../../FundRequest'; +import { upperFirst } from 'lodash'; + +export default function FundRequestCriteriaChildren({ + prefills, + recordTypesByKey, +}: { + prefills: Prefills; + recordTypesByKey: { [_key: string]: RecordType }; +}) { + const translate = useTranslate(); + + const splitChildLabel = useCallback((text?: string) => { + const match = text ? text.match(/^(Kind\s+\d+)\s+(.+)$/) : null; + return match ? { child: match[1], value: upperFirst(match[2]) } : null; + }, []); + + return ( + +
+
{translate('fund_request.prefills.children')}
+
+ + {prefills.children.map((childObject, index) => ( +
+
+ {childObject + .filter((child) => !child.record_type_key.endsWith('_bsn')) + .map((child, index) => ( + + {index === 0 && ( +
+
+ {splitChildLabel(recordTypesByKey[child.record_type_key]?.name)?.child} +
+
+ )} + +
+
+ {splitChildLabel(recordTypesByKey[child.record_type_key]?.name)?.value} +
+
{child.value || '-'}
+
+
+ ))} +
+
+ ))} +
+ ); +} diff --git a/react/src/webshop/components/pages/funds-request/elements/steps/criteria/FundRequestCriteriaPartner.tsx b/react/src/webshop/components/pages/funds-request/elements/steps/criteria/FundRequestCriteriaPartner.tsx new file mode 100644 index 000000000..d160e7bdb --- /dev/null +++ b/react/src/webshop/components/pages/funds-request/elements/steps/criteria/FundRequestCriteriaPartner.tsx @@ -0,0 +1,43 @@ +import React, { Fragment, useCallback } from 'react'; +import useTranslate from '../../../../../../../dashboard/hooks/useTranslate'; +import RecordType from '../../../../../../../dashboard/props/models/RecordType'; +import { Prefills } from '../../../FundRequest'; +import { upperFirst } from 'lodash'; + +export default function FundRequestCriteriaPartner({ + prefills, + recordTypesByKey, +}: { + prefills: Prefills; + recordTypesByKey: { [_key: string]: RecordType }; +}) { + const translate = useTranslate(); + + const splitPartnerLabel = useCallback((text?: string) => { + const match = text ? text.match(/^(Partner)\s+(.+)$/) : null; + return match ? { partner: match[1], value: upperFirst(match[2]) } : null; + }, []); + + return ( + +
+
{translate('fund_request.prefills.partner')}
+
+ +
+
+ {prefills.partner + .filter((partner) => !partner.record_type_key.endsWith('_bsn')) + .map((partner, index) => ( +
+
+ {splitPartnerLabel(recordTypesByKey[partner.record_type_key]?.name)?.value} +
+
{partner.value || '-'}
+
+ ))} +
+
+
+ ); +} diff --git a/react/src/webshop/i18n/nl/directives/fund-criterion.mjs b/react/src/webshop/i18n/nl/directives/fund-criterion.mjs index b7c7f83a3..dfa548d11 100644 --- a/react/src/webshop/i18n/nl/directives/fund-criterion.mjs +++ b/react/src/webshop/i18n/nl/directives/fund-criterion.mjs @@ -1,5 +1,4 @@ export default { - // CRITERIA FOR FUNDS = fund-criterion.pug labels: { general: { location: 'Groningen', diff --git a/react/src/webshop/i18n/nl/directives/google-map.mjs b/react/src/webshop/i18n/nl/directives/google-map.mjs index 7cc643a3c..6be613475 100644 --- a/react/src/webshop/i18n/nl/directives/google-map.mjs +++ b/react/src/webshop/i18n/nl/directives/google-map.mjs @@ -1,5 +1,4 @@ export default { - // GOOGLE MAPS = google-map.pug cancel: 'Annuleren', no_data: 'Geen data', diff --git a/react/src/webshop/i18n/nl/modals/modal-auth.mjs b/react/src/webshop/i18n/nl/modals/modal-auth.mjs index a84c01888..8d3c501c8 100644 --- a/react/src/webshop/i18n/nl/modals/modal-auth.mjs +++ b/react/src/webshop/i18n/nl/modals/modal-auth.mjs @@ -1,5 +1,4 @@ export default { - // AUTHENTICATION POPUP = popup-auth.pug header: { title: 'E-mail verstuurd', title_sr: 'Start aanmelden', diff --git a/react/src/webshop/i18n/nl/pages/error-page.mjs b/react/src/webshop/i18n/nl/pages/error-page.mjs index 84124b9de..0d819fb1c 100644 --- a/react/src/webshop/i18n/nl/pages/error-page.mjs +++ b/react/src/webshop/i18n/nl/pages/error-page.mjs @@ -1,5 +1,4 @@ export default { - // error-page.pug 404: { title: 'Pagina niet gevonden', button: 'Terug naar home', diff --git a/react/src/webshop/i18n/nl/pages/fund-activate.mjs b/react/src/webshop/i18n/nl/pages/fund-activate.mjs index e62f06397..d3050154e 100644 --- a/react/src/webshop/i18n/nl/pages/fund-activate.mjs +++ b/react/src/webshop/i18n/nl/pages/fund-activate.mjs @@ -1,5 +1,4 @@ export default { - // PAGE = fund-activate.pug header: { title: 'Bevestig uw inkomen', vergoedingen: { diff --git a/react/src/webshop/i18n/nl/pages/fund-request-clarification.mjs b/react/src/webshop/i18n/nl/pages/fund-request-clarification.mjs index 61bdce21d..a6085a052 100644 --- a/react/src/webshop/i18n/nl/pages/fund-request-clarification.mjs +++ b/react/src/webshop/i18n/nl/pages/fund-request-clarification.mjs @@ -1,5 +1,4 @@ export default { - // FUND REQUEST VALIDATION CLARIFICATION = fund-request-clarification.pug block_title: '{{ fund_name }} aanvulverzoek', labels: { question: 'Vraag', diff --git a/react/src/webshop/i18n/nl/pages/fund-request.mjs b/react/src/webshop/i18n/nl/pages/fund-request.mjs index f3eca749b..aba64e7c9 100644 --- a/react/src/webshop/i18n/nl/pages/fund-request.mjs +++ b/react/src/webshop/i18n/nl/pages/fund-request.mjs @@ -87,7 +87,6 @@ export default { send: 'Verzenden', }, - // VALIDATION REQUEST FOR FUNDS = fund_request.pug approved_request_exists: 'Er bestaat al een goedgekeurde aanvraag. Neem contact op met de beheerder.', fund_not_active: 'Het fonds waar u voor zich probeert aan te melden is niet actief.', bsn_record_is_mandatory: 'Een BSN is verplicht voor het doen van een aanvraag.', @@ -232,4 +231,45 @@ export default { kindpakket_2018_eligible: 'Ja, ik verklaar dat ik recht heb op kindpakket.', }, }, + options: { + no: 'Nee', + }, + prefills: { + title: 'Controleer of de gegevens correct zijn.', + subtitle: 'Als uw informatie niet correct is, kunt u onderaan op de knop klikken.', + children: 'Kinderen', + child: 'Kind', + partner: 'Gegevens van uw partner', + }, + cards: { + back: 'Terug', + + taken_by_partner: { + title: 'Dit tegoed is al geactiveerd', + heading: 'Aanvraag mislukt', + description: + 'U krijgt deze melding omdat het tegoed is geactiveerd door een
familielid of voogd.

De tegoeden zijn beschikbaar in het account van de persoon die
deze als eerste heeft geactiveerd.', + contacts: 'Neem voor vragen contact op met {{name}}.', + }, + not_filled_required_criteria: { + title: 'Ontbrekende gegevens', + heading: 'Aanvraag mislukt', + description: + 'U krijgt deze melding omdat een aantal gegevens van u niet zijn gevonden in het externe systeem. Hierdoor kan uw aanvraag niet volledig beoordeeld worden.', + contacts: 'Neem voor vragen contact op met {{name}}.', + }, + connection_error: { + title: 'Technische storing', + heading: 'Aanvraag mislukt', + description: + 'U krijgt deze melding omdat er sprake is van een technische storing. U kunt het op een later moment opnieuw proberen.', + contacts: 'Neem voor vragen contact op met {{name}}.', + }, + not_found: { + title: 'Uw gegevens zijn niet gevonden', + heading: 'Aanvraag mislukt', + description: 'U krijgt deze melding omdat uw gegevens niet gevonden zijn in het externe systeem.', + contacts: 'Neem voor vragen contact op met {{name}}.', + }, + }, }; diff --git a/react/src/webshop/i18n/nl/pages/fund.mjs b/react/src/webshop/i18n/nl/pages/fund.mjs index dfd21f2ea..a1fcc4612 100644 --- a/react/src/webshop/i18n/nl/pages/fund.mjs +++ b/react/src/webshop/i18n/nl/pages/fund.mjs @@ -1,5 +1,4 @@ export default { - // APPLY FOR FUNDS = fund-apply.pug header: { title: '{{fund_name}} aanmelden', criteria: 'Voorwaarden ({{ nth }})', diff --git a/react/src/webshop/i18n/nl/pages/funds.mjs b/react/src/webshop/i18n/nl/pages/funds.mjs index a95c613ce..6a39b3f35 100644 --- a/react/src/webshop/i18n/nl/pages/funds.mjs +++ b/react/src/webshop/i18n/nl/pages/funds.mjs @@ -1,5 +1,4 @@ export default { - // FUNDS = funds.pug header: { title: 'Aanvragen', subtitle: '', diff --git a/react/src/webshop/i18n/nl/pages/home.mjs b/react/src/webshop/i18n/nl/pages/home.mjs index 89316f4ec..eb9981061 100644 --- a/react/src/webshop/i18n/nl/pages/home.mjs +++ b/react/src/webshop/i18n/nl/pages/home.mjs @@ -1,5 +1,4 @@ export default { - // HOME = home.pug header: { title: '{{implementation}}', subtitle: diff --git a/react/src/webshop/i18n/nl/pages/record-validations.mjs b/react/src/webshop/i18n/nl/pages/record-validations.mjs index 42039dd27..4348e064a 100644 --- a/react/src/webshop/i18n/nl/pages/record-validations.mjs +++ b/react/src/webshop/i18n/nl/pages/record-validations.mjs @@ -1,5 +1,4 @@ export default { - // VALIDATIONS OF THE RECORDS = record-validations.pug header: { title: 'Mijn persoonsgegevens', }, diff --git a/react/src/webshop/i18n/nl/pages/records-create.mjs b/react/src/webshop/i18n/nl/pages/records-create.mjs index 404af9496..2d22647ac 100644 --- a/react/src/webshop/i18n/nl/pages/records-create.mjs +++ b/react/src/webshop/i18n/nl/pages/records-create.mjs @@ -1,5 +1,4 @@ export default { - // CREATE A RECORD = record.create.pug header: { title: 'Persoonsgegevens aanmaken', }, diff --git a/react/src/webshop/i18n/nl/pages/records-validate.mjs b/react/src/webshop/i18n/nl/pages/records-validate.mjs index 60f631f4f..42d8d05f1 100644 --- a/react/src/webshop/i18n/nl/pages/records-validate.mjs +++ b/react/src/webshop/i18n/nl/pages/records-validate.mjs @@ -1,5 +1,4 @@ export default { - // VALIDATE A RECORD = record-validate.pug header: { title: 'Mijn persoonsgegevens', }, diff --git a/react/src/webshop/i18n/nl/pages/records.mjs b/react/src/webshop/i18n/nl/pages/records.mjs index ceb3694c7..53f77015d 100644 --- a/react/src/webshop/i18n/nl/pages/records.mjs +++ b/react/src/webshop/i18n/nl/pages/records.mjs @@ -1,5 +1,4 @@ export default { - // RECORDS = records.pug header: { title: 'Persoonsgegevens', }, diff --git a/react/src/webshop/i18n/nl/pages/signup.mjs b/react/src/webshop/i18n/nl/pages/signup.mjs index 69be0429f..d0d84b295 100644 --- a/react/src/webshop/i18n/nl/pages/signup.mjs +++ b/react/src/webshop/i18n/nl/pages/signup.mjs @@ -1,5 +1,4 @@ export default { - // SIGNUP = sign-up.pug items: { title: 'Inloggen', page_title: 'Inloggen{{pageTitleSuffix}}', diff --git a/react/src/webshop/i18n/translated/ar.json b/react/src/webshop/i18n/translated/ar.json index 756bdb2eb..238a0ecd1 100644 --- a/react/src/webshop/i18n/translated/ar.json +++ b/react/src/webshop/i18n/translated/ar.json @@ -1087,6 +1087,43 @@ "subtitle": "تحتوي هذه الصفحة على معلومات حول الطلب. يمكن الاطلاع على الحالة والبيانات المكتملة وأي أسئلة إضافية هنا.", "modal": { "title": "سؤال إضافي" + }, + "cards": { + "back": "رجوع", + "connection_error": { + "contacts": "للأسئلة، اتصل على {{name}}.", + "description": "تظهر لك هذه الرسالة بسبب وجود خطأ فني. يمكنك المحاولة مرة أخرى في وقت لاحق.", + "heading": "فشل الطلب", + "title": "عطل فني" + }, + "not_filled_required_criteria": { + "contacts": "للأسئلة، اتصل على {{name}}.", + "description": "تتلقى هذه الرسالة لأن بعض التفاصيل الخاصة بك لم يتم العثور عليها في النظام الخارجي. ونتيجة لذلك، لا يمكن تقييم طلبك بشكل كامل.", + "heading": "فشل الطلب", + "title": "البيانات المفقودة" + }, + "not_found": { + "contacts": "للأسئلة، اتصل على {{name}}.", + "description": "تظهر لك هذه الرسالة لأن بياناتك لم يتم العثور عليها في النظام الخارجي.", + "heading": "فشل الطلب", + "title": "لم يتم العثور على بياناتك" + }, + "taken_by_partner": { + "contacts": "للأسئلة، اتصل على {{name}}.", + "description": "ستصلك هذه الرسالة لأن الرصيد تم تفعيله من قبل أحد أفراد العائلة أو ولي الأمر
.

يتوفر الرصيد في حساب الشخص الذي قام
بتفعيله أولاً.", + "heading": "فشل الطلب", + "title": "تم تفعيل هذا الرصيد بالفعل" + } + }, + "options": { + "no": "لا يوجد" + }, + "prefills": { + "child": "الطفل", + "children": "الأطفال", + "partner": "تفاصيل شريكك", + "subtitle": "إذا كانت معلوماتك غير صحيحة، يمكنك النقر على الزر الموجود في الأسفل.", + "title": "تحقق من صحة البيانات." } }, "fund_requests": { diff --git a/react/src/webshop/i18n/translated/de.json b/react/src/webshop/i18n/translated/de.json index b08299dd0..9a80d9e87 100644 --- a/react/src/webshop/i18n/translated/de.json +++ b/react/src/webshop/i18n/translated/de.json @@ -664,6 +664,43 @@ "subtitle": "Diese Seite enthält Informationen über die Bewerbung. Der Status, die ausgefüllten Daten und eventuelle Zusatzfragen können hier eingesehen werden.", "modal": { "title": "Zusätzliche Frage" + }, + "cards": { + "back": "Zurück", + "connection_error": { + "contacts": "Bei Fragen wenden Sie sich bitte an {{name}}.", + "description": "Sie erhalten diese Meldung, weil ein technischer Fehler aufgetreten ist. Sie können es zu einem späteren Zeitpunkt erneut versuchen.", + "heading": "Anfrage fehlgeschlagen", + "title": "Technisches Versagen" + }, + "not_filled_required_criteria": { + "contacts": "Bei Fragen wenden Sie sich bitte an {{name}}.", + "description": "Sie erhalten diese Meldung, weil einige Ihrer Angaben im externen System nicht gefunden wurden. Aus diesem Grund kann Ihre Bewerbung nicht vollständig geprüft werden.", + "heading": "Anfrage fehlgeschlagen", + "title": "Fehlende Daten" + }, + "not_found": { + "contacts": "Bei Fragen wenden Sie sich bitte an {{name}}.", + "description": "Sie erhalten diese Meldung, weil Ihre Daten im externen System nicht gefunden wurden.", + "heading": "Anfrage fehlgeschlagen", + "title": "Ihre Angaben wurden nicht gefunden" + }, + "taken_by_partner": { + "contacts": "Bei Fragen wenden Sie sich bitte an {{name}}.", + "description": "Sie erhalten diese Meldung, weil das Guthaben von einem
Familienmitglied oder Erziehungsberechtigten aktiviert wurde.

Das Guthaben ist auf dem Konto der Person verfügbar, die
es zuerst aktiviert hat.", + "heading": "Anfrage fehlgeschlagen", + "title": "Dieser Kredit ist bereits aktiviert worden" + } + }, + "options": { + "no": "Nein" + }, + "prefills": { + "child": "Kind", + "children": "Kinder", + "partner": "Angaben zu Ihrem Partner", + "subtitle": "Wenn Ihre Angaben nicht korrekt sind, können Sie auf die Schaltfläche am unteren Rand klicken.", + "title": "Prüfen Sie, ob die Daten korrekt sind." } }, "fund_requests": { diff --git a/react/src/webshop/i18n/translated/en-US.json b/react/src/webshop/i18n/translated/en-US.json index 7dc508832..7b48340c8 100644 --- a/react/src/webshop/i18n/translated/en-US.json +++ b/react/src/webshop/i18n/translated/en-US.json @@ -842,6 +842,43 @@ "subtitle": "This page contains information about the application. The status, completed data and any additional questions can be viewed here.", "modal": { "title": "Additional question" + }, + "cards": { + "back": "Back", + "connection_error": { + "contacts": "For questions, contact {{name}}.", + "description": "You are receiving this message because there is a technical error. You can try again at a later time.", + "heading": "Application failed", + "title": "Technical failure" + }, + "not_filled_required_criteria": { + "contacts": "For questions, contact {{name}}.", + "description": "You are receiving this message because some of your information was not found in the external system. As a result, your application cannot be fully evaluated.", + "heading": "Application failed", + "title": "Missing data" + }, + "not_found": { + "contacts": "For questions, contact {{name}}.", + "description": "You get this message because your data was not found in the external system.", + "heading": "Application failed", + "title": "Your information was not found" + }, + "taken_by_partner": { + "contacts": "For questions, contact {{name}}.", + "description": "You get this message because the credit was activated by a
family member or guardian.

The credit is available in the account of the person who
activated it first.", + "heading": "Application failed", + "title": "This credit has already been activated" + } + }, + "options": { + "no": "No" + }, + "prefills": { + "child": "Child", + "children": "Children", + "partner": "Details of your partner", + "subtitle": "If your information is incorrect, you can click the button at the bottom.", + "title": "Check that the data is correct." } }, "fund_requests": { diff --git a/react/src/webshop/i18n/translated/fr.json b/react/src/webshop/i18n/translated/fr.json index 7cd2ee46b..0f1f38f90 100644 --- a/react/src/webshop/i18n/translated/fr.json +++ b/react/src/webshop/i18n/translated/fr.json @@ -664,6 +664,43 @@ "subtitle": "Cette page contient des informations sur la demande. L'état d'avancement, les données complétées et les éventuelles questions complémentaires peuvent être consultés ici.", "modal": { "title": "Question complémentaire" + }, + "cards": { + "back": "Retour", + "connection_error": { + "contacts": "Pour toute question, veuillez contacter {{name}}.", + "description": "Vous recevez ce message en raison d'une erreur technique. Vous pouvez réessayer ultérieurement.", + "heading": "Échec de la demande", + "title": "Défaillance technique" + }, + "not_filled_required_criteria": { + "contacts": "Pour toute question, veuillez contacter {{name}}.", + "description": "Vous recevez ce message parce que certaines de vos données n'ont pas été trouvées dans le système externe. Par conséquent, votre demande ne peut pas être évaluée dans son intégralité.", + "heading": "Échec de la demande", + "title": "Données manquantes" + }, + "not_found": { + "contacts": "Pour toute question, veuillez contacter {{name}}.", + "description": "Vous obtenez ce message parce que vos données n'ont pas été trouvées dans le système externe.", + "heading": "Échec de la demande", + "title": "Vos coordonnées n'ont pas été trouvées" + }, + "taken_by_partner": { + "contacts": "Pour toute question, veuillez contacter {{name}}.", + "description": "Vous recevez ce message parce que le crédit a été activé par un membre de la famille ou un tuteur
.

Le crédit est disponible sur le compte de la personne qui l'a activé en premier (
).", + "heading": "Échec de la demande", + "title": "Ce crédit a déjà été activé" + } + }, + "options": { + "no": "Non" + }, + "prefills": { + "child": "Enfant", + "children": "Les enfants", + "partner": "Coordonnées de votre partenaire", + "subtitle": "Si vos informations sont incorrectes, vous pouvez cliquer sur le bouton en bas de page.", + "title": "Vérifier que les données sont correctes." } }, "fund_requests": { diff --git a/react/src/webshop/i18n/translated/pl.json b/react/src/webshop/i18n/translated/pl.json index 1a8cc1cc7..6d823e992 100644 --- a/react/src/webshop/i18n/translated/pl.json +++ b/react/src/webshop/i18n/translated/pl.json @@ -664,6 +664,43 @@ "subtitle": "Ta strona zawiera informacje o aplikacji. Można tu sprawdzić status, wypełnione dane i wszelkie dodatkowe pytania.", "modal": { "title": "Pytanie dodatkowe" + }, + "cards": { + "back": "Powrót", + "connection_error": { + "contacts": "W razie pytań prosimy o kontakt pod adresem {{name}}.", + "description": "Otrzymujesz ten komunikat, ponieważ wystąpił błąd techniczny. Możesz spróbować ponownie w późniejszym czasie.", + "heading": "Żądanie nie powiodło się", + "title": "Awaria techniczna" + }, + "not_filled_required_criteria": { + "contacts": "W razie pytań prosimy o kontakt pod adresem {{name}}.", + "description": "Otrzymujesz tę wiadomość, ponieważ niektóre z Twoich danych nie zostały znalezione w systemie zewnętrznym. W rezultacie aplikacja nie może zostać w pełni oceniona.", + "heading": "Żądanie nie powiodło się", + "title": "Brakujące dane" + }, + "not_found": { + "contacts": "W razie pytań prosimy o kontakt pod adresem {{name}}.", + "description": "Ten komunikat pojawia się, ponieważ dane nie zostały znalezione w systemie zewnętrznym.", + "heading": "Żądanie nie powiodło się", + "title": "Twoje dane nie zostały znalezione" + }, + "taken_by_partner": { + "contacts": "W razie pytań prosimy o kontakt pod adresem {{name}}.", + "description": "Otrzymujesz tę wiadomość, ponieważ kredyt został aktywowany przez członka rodziny lub opiekuna
.

Kredyt jest dostępny na koncie osoby, która
aktywowała go jako pierwsza.", + "heading": "Żądanie nie powiodło się", + "title": "Ten kredyt został już aktywowany" + } + }, + "options": { + "no": "Nie" + }, + "prefills": { + "child": "Dziecko", + "children": "Dzieci", + "partner": "Szczegóły dotyczące partnera", + "subtitle": "Jeśli informacje są nieprawidłowe, możesz kliknąć przycisk na dole.", + "title": "Sprawdź, czy dane są prawidłowe." } }, "fund_requests": { diff --git a/react/src/webshop/i18n/translated/ru.json b/react/src/webshop/i18n/translated/ru.json index 4cd6c3ab6..b006a46ea 100644 --- a/react/src/webshop/i18n/translated/ru.json +++ b/react/src/webshop/i18n/translated/ru.json @@ -664,6 +664,43 @@ "subtitle": "Эта страница содержит информацию о заявке. Здесь можно просмотреть статус, заполненные данные и дополнительные вопросы.", "modal": { "title": "Дополнительный вопрос" + }, + "cards": { + "back": "Назад", + "connection_error": { + "contacts": "По вопросам обращайтесь по адресу {{name}}.", + "description": "Вы получили это сообщение из-за технической ошибки. Вы можете повторить попытку позже.", + "heading": "Запрос не прошел", + "title": "Технический сбой" + }, + "not_filled_required_criteria": { + "contacts": "По вопросам обращайтесь по адресу {{name}}.", + "description": "Вы получили это сообщение, потому что некоторые ваши данные не были найдены во внешней системе. В результате ваше заявление не может быть полностью рассмотрено.", + "heading": "Запрос не прошел", + "title": "Отсутствующие данные" + }, + "not_found": { + "contacts": "По вопросам обращайтесь по адресу {{name}}.", + "description": "Вы получаете это сообщение, потому что ваши данные не были найдены во внешней системе.", + "heading": "Запрос не прошел", + "title": "Ваши данные не найдены" + }, + "taken_by_partner": { + "contacts": "По вопросам обращайтесь по адресу {{name}}.", + "description": "Вы получаете это сообщение, потому что кредит был активирован членом семьи или опекуном
.

Кредит доступен на счете того, кто
активировал его первым.", + "heading": "Запрос не прошел", + "title": "Этот кредит уже активирован" + } + }, + "options": { + "no": "Нет" + }, + "prefills": { + "child": "Ребенок", + "children": "Дети", + "partner": "Подробная информация о вашем партнере", + "subtitle": "Если ваша информация неверна, вы можете нажать кнопку внизу.", + "title": "Проверьте правильность данных." } }, "fund_requests": { diff --git a/react/src/webshop/i18n/translated/tr.json b/react/src/webshop/i18n/translated/tr.json index b4796978b..fd1da64a4 100644 --- a/react/src/webshop/i18n/translated/tr.json +++ b/react/src/webshop/i18n/translated/tr.json @@ -1066,6 +1066,43 @@ "subtitle": "Bu sayfa başvuru hakkında bilgi içerir. Durum, tamamlanan veriler ve ek sorular buradan görüntülenebilir.", "modal": { "title": "Ek soru" + }, + "cards": { + "back": "Geri", + "connection_error": { + "contacts": "Sorularınız için {{name}} ile iletişime geçebilirsiniz.", + "description": "Teknik bir hata olduğu için bu mesajı alıyorsunuz. Daha sonra tekrar deneyebilirsiniz.", + "heading": "İstek başarısız oldu", + "title": "Teknik arıza" + }, + "not_filled_required_criteria": { + "contacts": "Sorularınız için {{name}} ile iletişime geçebilirsiniz.", + "description": "Bazı bilgileriniz harici sistemde bulunamadığı için bu mesajı alıyorsunuz. Sonuç olarak, başvurunuz tam olarak değerlendirilememektedir.", + "heading": "İstek başarısız oldu", + "title": "Eksik veri" + }, + "not_found": { + "contacts": "Sorularınız için {{name}} ile iletişime geçebilirsiniz.", + "description": "Verileriniz harici sistemde bulunamadığı için bu mesajı alırsınız.", + "heading": "İstek başarısız oldu", + "title": "Bilgileriniz bulunamadı" + }, + "taken_by_partner": { + "contacts": "Sorularınız için {{name}} ile iletişime geçebilirsiniz.", + "description": "Bu mesajı alıyorsunuz çünkü kredi bir
aile üyesi veya vasisi tarafından etkinleştirildi.

Kredi
ilk etkinleştiren kişinin hesabında kullanılabilir.", + "heading": "İstek başarısız oldu", + "title": "Bu kredi zaten etkinleştirildi" + } + }, + "options": { + "no": "Hayır" + }, + "prefills": { + "child": "Çocuk", + "children": "Çocuklar", + "partner": "Partnerinizin detayları", + "subtitle": "Bilgileriniz yanlışsa, alttaki düğmeye tıklayabilirsiniz.", + "title": "Verilerin doğru olup olmadığını kontrol edin." } }, "fund": { diff --git a/react/src/webshop/i18n/translated/uk.json b/react/src/webshop/i18n/translated/uk.json index 3ea8e8a17..91bb206c1 100644 --- a/react/src/webshop/i18n/translated/uk.json +++ b/react/src/webshop/i18n/translated/uk.json @@ -664,6 +664,43 @@ "subtitle": "Ця сторінка містить інформацію про заявку. Статус, заповнені дані та будь-які додаткові питання можна переглянути тут.", "modal": { "title": "Додаткове запитання" + }, + "cards": { + "back": "Назад", + "connection_error": { + "contacts": "З питаннями звертайтеся за адресою: {{name}}.", + "description": "Ви отримали це повідомлення через технічну помилку. Ви можете спробувати пізніше.", + "heading": "Запит не вдалося виконати", + "title": "Технічна несправність" + }, + "not_filled_required_criteria": { + "contacts": "З питаннями звертайтеся за адресою: {{name}}.", + "description": "Ви отримали це повідомлення, тому що деякі з ваших даних не були знайдені в зовнішній системі. Внаслідок цього ваша заявка не може бути оцінена в повному обсязі.", + "heading": "Запит не вдалося виконати", + "title": "Відсутні дані" + }, + "not_found": { + "contacts": "З питаннями звертайтеся за адресою: {{name}}.", + "description": "Ви отримуєте це повідомлення, тому що ваші дані не були знайдені в зовнішній системі.", + "heading": "Запит не вдалося виконати", + "title": "Ваші дані не знайдено" + }, + "taken_by_partner": { + "contacts": "З питаннями звертайтеся за адресою: {{name}}.", + "description": "Ви отримали це повідомлення, тому що кредит був активований
членом сім'ї або опікуном.

Кредит доступний в акаунті особи, яка
активувала його першою.", + "heading": "Запит не вдалося виконати", + "title": "Цей кредит вже активовано" + } + }, + "options": { + "no": "Ні." + }, + "prefills": { + "child": "Дитинко.", + "children": "Діти", + "partner": "Інформація про вашого партнера", + "subtitle": "Якщо ваша інформація невірна, ви можете натиснути кнопку внизу.", + "title": "Перевірте правильність даних." } }, "fund_requests": { diff --git a/react/src/webshop/props/models/Fund.ts b/react/src/webshop/props/models/Fund.ts index a0662edf6..d6bc9c986 100644 --- a/react/src/webshop/props/models/Fund.ts +++ b/react/src/webshop/props/models/Fund.ts @@ -1,5 +1,6 @@ import FundBase from '../../../dashboard/props/models/Fund'; import FundCriteriaStep from '../../../dashboard/props/models/FundCriteriaStep'; +import FundCriteriaGroup from '../../../dashboard/props/models/FundCriteriaGroup'; export default interface Fund extends FundBase { received?: boolean; @@ -11,6 +12,7 @@ export default interface Fund extends FundBase { auto_validation?: boolean; bsn_confirmation_time?: number; criteria_steps?: Array; + criteria_groups?: Array; email_required?: boolean; contact_info_enabled?: boolean; contact_info_required?: boolean; diff --git a/react/src/webshop/services/FundService.ts b/react/src/webshop/services/FundService.ts index dff3efcde..4cb7a9918 100644 --- a/react/src/webshop/services/FundService.ts +++ b/react/src/webshop/services/FundService.ts @@ -5,6 +5,7 @@ import { format } from 'date-fns'; import Fund from '../props/models/Fund'; import Voucher from '../../dashboard/props/models/Voucher'; import RecordType from '../../dashboard/props/models/RecordType'; +import { Prefills } from '../components/pages/funds-request/FundRequest'; export class FundService { /** @@ -58,7 +59,7 @@ export class FundService { return this.apiRequest.post(`${this.prefix}/redeem`, { code }); } - public getPersonPrefills(id: number): Promise>> { + public getPersonPrefills(id: number): Promise> { return this.apiRequest.get(`${this.prefix}/${id}/prefills`); } diff --git a/translations/cache/cache.json b/translations/cache/cache.json index 3b363afec..ff5286ac1 100644 --- a/translations/cache/cache.json +++ b/translations/cache/cache.json @@ -1267,6 +1267,74 @@ "fund_request.buttons.send", "Verzenden" ], + [ + "fund_request.cards.back", + "Terug" + ], + [ + "fund_request.cards.connection_error.contacts", + "Neem voor vragen contact op met {{name}}." + ], + [ + "fund_request.cards.connection_error.description", + "U krijgt deze melding omdat er sprake is van een technische storing. U kunt het op een later moment opnieuw proberen." + ], + [ + "fund_request.cards.connection_error.heading", + "Aanvraag mislukt" + ], + [ + "fund_request.cards.connection_error.title", + "Technische storing" + ], + [ + "fund_request.cards.not_filled_required_criteria.contacts", + "Neem voor vragen contact op met {{name}}." + ], + [ + "fund_request.cards.not_filled_required_criteria.description", + "U krijgt deze melding omdat een aantal gegevens van u niet zijn gevonden in het externe systeem. Hierdoor kan uw aanvraag niet volledig beoordeeld worden." + ], + [ + "fund_request.cards.not_filled_required_criteria.heading", + "Aanvraag mislukt" + ], + [ + "fund_request.cards.not_filled_required_criteria.title", + "Ontbrekende gegevens" + ], + [ + "fund_request.cards.not_found.contacts", + "Neem voor vragen contact op met {{name}}." + ], + [ + "fund_request.cards.not_found.description", + "U krijgt deze melding omdat uw gegevens niet gevonden zijn in het externe systeem." + ], + [ + "fund_request.cards.not_found.heading", + "Aanvraag mislukt" + ], + [ + "fund_request.cards.not_found.title", + "Uw gegevens zijn niet gevonden" + ], + [ + "fund_request.cards.taken_by_partner.contacts", + "Neem voor vragen contact op met {{name}}." + ], + [ + "fund_request.cards.taken_by_partner.description", + "U krijgt deze melding omdat het tegoed is geactiveerd door een
familielid of voogd.

De tegoeden zijn beschikbaar in het account van de persoon die
deze als eerste heeft geactiveerd." + ], + [ + "fund_request.cards.taken_by_partner.heading", + "Aanvraag mislukt" + ], + [ + "fund_request.cards.taken_by_partner.title", + "Dit tegoed is al geactiveerd" + ], [ "fund_request.clarifications.info_requested", "Extra vraag gesteld" @@ -1351,6 +1419,30 @@ "fund_request.not_requester", "U bent niet de eigenaar van deze aanvraag." ], + [ + "fund_request.options.no", + "Nee" + ], + [ + "fund_request.prefills.child", + "Kind" + ], + [ + "fund_request.prefills.children", + "Kinderen" + ], + [ + "fund_request.prefills.partner", + "Gegevens van uw partner" + ], + [ + "fund_request.prefills.subtitle", + "Als uw informatie niet correct is, kunt u onderaan op de knop klikken." + ], + [ + "fund_request.prefills.title", + "Controleer of de gegevens correct zijn." + ], [ "fund_request.received.title", "Ontvangen"