ended search

This commit is contained in:
maximus 2022-10-05 15:49:07 +03:00
parent 18cc0084af
commit 5e46d6a098
22 changed files with 735 additions and 433 deletions

View File

@ -2,5 +2,5 @@ REACT_APP_CMS_BASE_URL=http://scipaper.ru
REACT_APP_CMS_APP_NAME=scipaper REACT_APP_CMS_APP_NAME=scipaper
REACT_APP_OPENID_PROVIDER_URL=http://auth.techpal.ru/auth/realms/master/protocol/openid-connect/auth?client_id=techpal&response_type=code REACT_APP_OPENID_PROVIDER_URL=http://auth.techpal.ru/auth/realms/master/protocol/openid-connect/auth?client_id=techpal&response_type=code
REACT_APP_INTEGRATOR_URL=http://scipaper.ru REACT_APP_INTEGRATOR_URL=http://scipaper.ru
REACT_APP_INTEGRATOR_API_VERSION=/api/v1 REACT_APP_INTEGRATOR_API_VERSION=/v1
REACT_APP_GRAPHQL_URL=/graphql REACT_APP_GRAPHQL_URL=/graphql

540
package-lock.json generated Executable file → Normal file
View File

@ -70,6 +70,7 @@
"postcss": "^8.4.14", "postcss": "^8.4.14",
"prop-types": "^15.8.1", "prop-types": "^15.8.1",
"react-test-renderer": "^18.2.0", "react-test-renderer": "^18.2.0",
"tailwind-scrollbar": "^2.0.1",
"webpack": "^5.74.0" "webpack": "^5.74.0"
} }
}, },
@ -4059,6 +4060,11 @@
"@jridgewell/sourcemap-codec": "^1.4.10" "@jridgewell/sourcemap-codec": "^1.4.10"
} }
}, },
"node_modules/@juggle/resize-observer": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz",
"integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA=="
},
"node_modules/@leichtgewicht/ip-codec": { "node_modules/@leichtgewicht/ip-codec": {
"version": "2.0.4", "version": "2.0.4",
"resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz",
@ -4409,6 +4415,26 @@
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
"integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="
}, },
"node_modules/@rsuite/icon-font": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@rsuite/icon-font/-/icon-font-4.0.0.tgz",
"integrity": "sha512-rZTgpTH3H3HLczCA2rnkWfoMKm0ZXoRzsrkVujfP/FfslnKUMvO6w56pa8pCvhWGpNEPUsLS2ULnFGpTEcup/Q=="
},
"node_modules/@rsuite/icons": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rsuite/icons/-/icons-1.0.2.tgz",
"integrity": "sha512-Y7vJNDQpJnFlyYSUXQ2iQ9Meg7+ZKcrIenhpYDdM3c7vYDE/L7pml+hrK28jk6QfV/QkVv5B504D+l7aM6AAJQ==",
"dependencies": {
"@rsuite/icon-font": "^4.0.0",
"classnames": "^2.2.5",
"insert-css": "^2.0.0",
"lodash": "^4.17.20"
},
"peerDependencies": {
"react": ">=16.8.0",
"react-dom": ">=16.8.0"
}
},
"node_modules/@rushstack/eslint-patch": { "node_modules/@rushstack/eslint-patch": {
"version": "1.1.4", "version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.4.tgz", "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.4.tgz",
@ -11196,6 +11222,11 @@
"@types/node": "*" "@types/node": "*"
} }
}, },
"node_modules/@types/chai": {
"version": "4.3.3",
"resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz",
"integrity": "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g=="
},
"node_modules/@types/connect": { "node_modules/@types/connect": {
"version": "3.4.35", "version": "3.4.35",
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
@ -11361,9 +11392,9 @@
"integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="
}, },
"node_modules/@types/lodash": { "node_modules/@types/lodash": {
"version": "4.14.182", "version": "4.14.186",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.186.tgz",
"integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==" "integrity": "sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw=="
}, },
"node_modules/@types/mdast": { "node_modules/@types/mdast": {
"version": "3.0.10", "version": "3.0.10",
@ -11495,6 +11526,25 @@
"@types/react": "*" "@types/react": "*"
} }
}, },
"node_modules/@types/react-virtualized": {
"version": "9.21.21",
"resolved": "https://registry.npmjs.org/@types/react-virtualized/-/react-virtualized-9.21.21.tgz",
"integrity": "sha512-Exx6I7p4Qn+BBA1SRyj/UwQlZ0I0Pq7g7uhAp0QQ4JWzZunqEqNBGTmCmMmS/3N9wFgAGWuBD16ap7k8Y14VPA==",
"dependencies": {
"@types/prop-types": "*",
"@types/react": "^17"
}
},
"node_modules/@types/react-virtualized/node_modules/@types/react": {
"version": "17.0.50",
"resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.50.tgz",
"integrity": "sha512-ZCBHzpDb5skMnc1zFXAXnL3l1FAdi+xZvwxK+PkglMmBrwjpp9nKaWuEvrGnSifCJmBFGxZOOFuwC6KH/s0NuA==",
"dependencies": {
"@types/prop-types": "*",
"@types/scheduler": "*",
"csstype": "^3.0.2"
}
},
"node_modules/@types/resolve": { "node_modules/@types/resolve": {
"version": "1.17.1", "version": "1.17.1",
"resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
@ -13675,16 +13725,6 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/bindings": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
"integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
"dev": true,
"optional": true,
"dependencies": {
"file-uri-to-path": "1.0.0"
}
},
"node_modules/bluebird": { "node_modules/bluebird": {
"version": "3.7.2", "version": "3.7.2",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
@ -14646,7 +14686,6 @@
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.0.tgz", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.0.tgz",
"integrity": "sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA==", "integrity": "sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA==",
"dev": true,
"engines": { "engines": {
"node": ">=6" "node": ">=6"
} }
@ -15980,6 +16019,18 @@
"node": ">=10" "node": ">=10"
} }
}, },
"node_modules/date-fns": {
"version": "2.29.3",
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz",
"integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==",
"engines": {
"node": ">=0.11"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/date-fns"
}
},
"node_modules/debug": { "node_modules/debug": {
"version": "4.3.4", "version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
@ -16400,6 +16451,45 @@
"utila": "~0.4" "utila": "~0.4"
} }
}, },
"node_modules/dom-helpers": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
"integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
"dependencies": {
"@babel/runtime": "^7.8.7",
"csstype": "^3.0.2"
}
},
"node_modules/dom-helpers/node_modules/@babel/runtime": {
"version": "7.19.0",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz",
"integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==",
"dependencies": {
"regenerator-runtime": "^0.13.4"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/dom-lib": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/dom-lib/-/dom-lib-3.1.3.tgz",
"integrity": "sha512-66NzehAJZM5HrH/2FW6C0tgaMIywDF5I9n7PWgvdSciohlYQbCFcSf5XA6hhIqQdFbfrnZDD8NGLo9pDRzO5hQ==",
"dependencies": {
"@babel/runtime": "^7.16.0"
}
},
"node_modules/dom-lib/node_modules/@babel/runtime": {
"version": "7.19.0",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz",
"integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==",
"dependencies": {
"regenerator-runtime": "^0.13.4"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/dom-serializer": { "node_modules/dom-serializer": {
"version": "1.4.1", "version": "1.4.1",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
@ -18359,13 +18449,6 @@
"node": ">=12" "node": ">=12"
} }
}, },
"node_modules/file-uri-to-path": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
"integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
"dev": true,
"optional": true
},
"node_modules/filelist": { "node_modules/filelist": {
"version": "1.0.4", "version": "1.0.4",
"resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
@ -19023,19 +19106,6 @@
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
}, },
"node_modules/fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"hasInstallScript": true,
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/function-bind": { "node_modules/function-bind": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
@ -20573,6 +20643,11 @@
"resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz",
"integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q=="
}, },
"node_modules/insert-css": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/insert-css/-/insert-css-2.0.0.tgz",
"integrity": "sha512-xGq5ISgcUP5cvGkS2MMFLtPDBtrtQPSFfC6gA6U8wHKqfjTIMZLZNxOItQnoSjdOzlXOLU/yD32RKC4SvjNbtA=="
},
"node_modules/internal-slot": { "node_modules/internal-slot": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
@ -27258,13 +27333,6 @@
"multicast-dns": "cli.js" "multicast-dns": "cli.js"
} }
}, },
"node_modules/nan": {
"version": "2.16.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz",
"integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==",
"dev": true,
"optional": true
},
"node_modules/nanoclone": { "node_modules/nanoclone": {
"version": "0.2.1", "version": "0.2.1",
"resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz", "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz",
@ -30320,6 +30388,11 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
}, },
"node_modules/react-lifecycles-compat": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
"integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
},
"node_modules/react-loading-skeleton": { "node_modules/react-loading-skeleton": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/react-loading-skeleton/-/react-loading-skeleton-3.1.0.tgz", "resolved": "https://registry.npmjs.org/react-loading-skeleton/-/react-loading-skeleton-3.1.0.tgz",
@ -32522,6 +32595,23 @@
"integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
"dev": true "dev": true
}, },
"node_modules/react-virtualized": {
"version": "9.22.3",
"resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.3.tgz",
"integrity": "sha512-MKovKMxWTcwPSxE1kK1HcheQTWfuCxAuBoSTf2gwyMM21NdX/PXUhnoP8Uc5dRKd+nKm8v41R36OellhdCpkrw==",
"dependencies": {
"@babel/runtime": "^7.7.2",
"clsx": "^1.0.4",
"dom-helpers": "^5.1.3",
"loose-envify": "^1.4.0",
"prop-types": "^15.7.2",
"react-lifecycles-compat": "^3.0.4"
},
"peerDependencies": {
"react": "^15.3.0 || ^16.0.0-alpha",
"react-dom": "^15.3.0 || ^16.0.0-alpha"
}
},
"node_modules/read-cache": { "node_modules/read-cache": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
@ -35295,6 +35385,78 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/rsuite": {
"version": "5.19.0",
"resolved": "https://registry.npmjs.org/rsuite/-/rsuite-5.19.0.tgz",
"integrity": "sha512-KQD48UT2HJec+VNzcsrGlo65+OMas7kOjJnxkwR3GsiIugw2aQ9o2JUBmoaJFxhbAnwv1hjJ73ZgW3MH3Wo/Pw==",
"dependencies": {
"@babel/runtime": "^7.18.9",
"@juggle/resize-observer": "^3.3.1",
"@rsuite/icons": "^1.0.2",
"@types/chai": "^4.3.3",
"@types/lodash": "^4.14.184",
"@types/prop-types": "^15.7.4",
"@types/react-virtualized": "^9.21.11",
"classnames": "^2.3.1",
"date-fns": "^2.29.2",
"dom-lib": "^3.1.2",
"lodash": "^4.17.11",
"prop-types": "^15.8.1",
"react-virtualized": "^9.22.3",
"rsuite-table": "^5.7.1",
"schema-typed": "^2.0.3"
},
"peerDependencies": {
"react": ">=16.8.0",
"react-dom": ">=16.8.0"
}
},
"node_modules/rsuite-table": {
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/rsuite-table/-/rsuite-table-5.7.2.tgz",
"integrity": "sha512-JwfxAR8lXVXM9PRQGJMbayciMcVFpHWExAhfY53h6JYKC7LfPeBx/Z6k4P7PO0grFkVGBdFW3ZgHxhCD1ur/eA==",
"dependencies": {
"@babel/runtime": "^7.12.5",
"@juggle/resize-observer": "^3.3.1",
"@rsuite/icons": "^1.0.0",
"classnames": "^2.3.1",
"dom-lib": "^3.1.3",
"lodash": "^4.17.21",
"react-is": "^17.0.2"
},
"peerDependencies": {
"prop-types": "^15.7.2",
"react": ">=16.8.0",
"react-dom": ">=16.8.0"
}
},
"node_modules/rsuite-table/node_modules/@babel/runtime": {
"version": "7.19.0",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz",
"integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==",
"dependencies": {
"regenerator-runtime": "^0.13.4"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/rsuite-table/node_modules/react-is": {
"version": "17.0.2",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
"integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
},
"node_modules/rsuite/node_modules/@babel/runtime": {
"version": "7.19.0",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz",
"integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==",
"dependencies": {
"regenerator-runtime": "^0.13.4"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/rsvp": { "node_modules/rsvp": {
"version": "4.8.5", "version": "4.8.5",
"resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz",
@ -35737,6 +35899,25 @@
"loose-envify": "^1.1.0" "loose-envify": "^1.1.0"
} }
}, },
"node_modules/schema-typed": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/schema-typed/-/schema-typed-2.0.3.tgz",
"integrity": "sha512-4KckVnJjTtVugYpSAoQrcH4quE4yIVTvI/nHEqtwdceBr/ZCuH2LfV8/gaZFrYU7cwwyufLKaswt28aqQ1T9ww==",
"dependencies": {
"@babel/runtime": "^7.16.0"
}
},
"node_modules/schema-typed/node_modules/@babel/runtime": {
"version": "7.19.0",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz",
"integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==",
"dependencies": {
"regenerator-runtime": "^0.13.4"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/schema-utils": { "node_modules/schema-utils": {
"version": "3.1.1", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
@ -37181,6 +37362,18 @@
"integrity": "sha512-k8uzYIkIVwmT+TcglpdN50pS2y1BDcUnBPK9iJeGu0Pl1lOI8pD6wtzgw91Pjpe+RxtTncw32tLxs/R0yNL2Mg==", "integrity": "sha512-k8uzYIkIVwmT+TcglpdN50pS2y1BDcUnBPK9iJeGu0Pl1lOI8pD6wtzgw91Pjpe+RxtTncw32tLxs/R0yNL2Mg==",
"dev": true "dev": true
}, },
"node_modules/tailwind-scrollbar": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/tailwind-scrollbar/-/tailwind-scrollbar-2.0.1.tgz",
"integrity": "sha512-OcR7qHBbux4k+k6bWqnEQFYFooLK/F4dhkBz6nvswIoaA9ancZ5h20e0tyV7ifSWLDCUBtpG+1NHRA8HMRH/wg==",
"dev": true,
"engines": {
"node": ">=12.13.0"
},
"peerDependencies": {
"tailwindcss": "3.x"
}
},
"node_modules/tailwindcss": { "node_modules/tailwindcss": {
"version": "3.1.7", "version": "3.1.7",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.7.tgz", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.7.tgz",
@ -38777,25 +38970,6 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/watchpack-chokidar2/node_modules/fsevents": {
"version": "1.2.13",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
"integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
"deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.",
"dev": true,
"hasInstallScript": true,
"optional": true,
"os": [
"darwin"
],
"dependencies": {
"bindings": "^1.5.0",
"nan": "^2.12.1"
},
"engines": {
"node": ">= 4.0"
}
},
"node_modules/watchpack-chokidar2/node_modules/glob-parent": { "node_modules/watchpack-chokidar2/node_modules/glob-parent": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
@ -42793,6 +42967,11 @@
"@jridgewell/sourcemap-codec": "^1.4.10" "@jridgewell/sourcemap-codec": "^1.4.10"
} }
}, },
"@juggle/resize-observer": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz",
"integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA=="
},
"@leichtgewicht/ip-codec": { "@leichtgewicht/ip-codec": {
"version": "2.0.4", "version": "2.0.4",
"resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz",
@ -43032,6 +43211,22 @@
} }
} }
}, },
"@rsuite/icon-font": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@rsuite/icon-font/-/icon-font-4.0.0.tgz",
"integrity": "sha512-rZTgpTH3H3HLczCA2rnkWfoMKm0ZXoRzsrkVujfP/FfslnKUMvO6w56pa8pCvhWGpNEPUsLS2ULnFGpTEcup/Q=="
},
"@rsuite/icons": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@rsuite/icons/-/icons-1.0.2.tgz",
"integrity": "sha512-Y7vJNDQpJnFlyYSUXQ2iQ9Meg7+ZKcrIenhpYDdM3c7vYDE/L7pml+hrK28jk6QfV/QkVv5B504D+l7aM6AAJQ==",
"requires": {
"@rsuite/icon-font": "^4.0.0",
"classnames": "^2.2.5",
"insert-css": "^2.0.0",
"lodash": "^4.17.20"
}
},
"@rushstack/eslint-patch": { "@rushstack/eslint-patch": {
"version": "1.1.4", "version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.4.tgz", "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.4.tgz",
@ -48209,6 +48404,11 @@
"@types/node": "*" "@types/node": "*"
} }
}, },
"@types/chai": {
"version": "4.3.3",
"resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz",
"integrity": "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g=="
},
"@types/connect": { "@types/connect": {
"version": "3.4.35", "version": "3.4.35",
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
@ -48374,9 +48574,9 @@
"integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="
}, },
"@types/lodash": { "@types/lodash": {
"version": "4.14.182", "version": "4.14.186",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.186.tgz",
"integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==" "integrity": "sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw=="
}, },
"@types/mdast": { "@types/mdast": {
"version": "3.0.10", "version": "3.0.10",
@ -48508,6 +48708,27 @@
"@types/react": "*" "@types/react": "*"
} }
}, },
"@types/react-virtualized": {
"version": "9.21.21",
"resolved": "https://registry.npmjs.org/@types/react-virtualized/-/react-virtualized-9.21.21.tgz",
"integrity": "sha512-Exx6I7p4Qn+BBA1SRyj/UwQlZ0I0Pq7g7uhAp0QQ4JWzZunqEqNBGTmCmMmS/3N9wFgAGWuBD16ap7k8Y14VPA==",
"requires": {
"@types/prop-types": "*",
"@types/react": "^17"
},
"dependencies": {
"@types/react": {
"version": "17.0.50",
"resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.50.tgz",
"integrity": "sha512-ZCBHzpDb5skMnc1zFXAXnL3l1FAdi+xZvwxK+PkglMmBrwjpp9nKaWuEvrGnSifCJmBFGxZOOFuwC6KH/s0NuA==",
"requires": {
"@types/prop-types": "*",
"@types/scheduler": "*",
"csstype": "^3.0.2"
}
}
}
},
"@types/resolve": { "@types/resolve": {
"version": "1.17.1", "version": "1.17.1",
"resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
@ -50209,16 +50430,6 @@
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
}, },
"bindings": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
"integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
"dev": true,
"optional": true,
"requires": {
"file-uri-to-path": "1.0.0"
}
},
"bluebird": { "bluebird": {
"version": "3.7.2", "version": "3.7.2",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
@ -50974,8 +51185,7 @@
"clsx": { "clsx": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.0.tgz", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.0.tgz",
"integrity": "sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA==", "integrity": "sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA=="
"dev": true
}, },
"cnbuilder": { "cnbuilder": {
"version": "3.1.0", "version": "3.1.0",
@ -51997,6 +52207,11 @@
} }
} }
}, },
"date-fns": {
"version": "2.29.3",
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz",
"integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA=="
},
"debug": { "debug": {
"version": "4.3.4", "version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
@ -52314,6 +52529,43 @@
"utila": "~0.4" "utila": "~0.4"
} }
}, },
"dom-helpers": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
"integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
"requires": {
"@babel/runtime": "^7.8.7",
"csstype": "^3.0.2"
},
"dependencies": {
"@babel/runtime": {
"version": "7.19.0",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz",
"integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==",
"requires": {
"regenerator-runtime": "^0.13.4"
}
}
}
},
"dom-lib": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/dom-lib/-/dom-lib-3.1.3.tgz",
"integrity": "sha512-66NzehAJZM5HrH/2FW6C0tgaMIywDF5I9n7PWgvdSciohlYQbCFcSf5XA6hhIqQdFbfrnZDD8NGLo9pDRzO5hQ==",
"requires": {
"@babel/runtime": "^7.16.0"
},
"dependencies": {
"@babel/runtime": {
"version": "7.19.0",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz",
"integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==",
"requires": {
"regenerator-runtime": "^0.13.4"
}
}
}
},
"dom-serializer": { "dom-serializer": {
"version": "1.4.1", "version": "1.4.1",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
@ -53824,13 +54076,6 @@
} }
} }
}, },
"file-uri-to-path": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
"integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
"dev": true,
"optional": true
},
"filelist": { "filelist": {
"version": "1.0.4", "version": "1.0.4",
"resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
@ -54343,12 +54588,6 @@
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
}, },
"fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"optional": true
},
"function-bind": { "function-bind": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
@ -55466,6 +55705,11 @@
"resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz",
"integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q=="
}, },
"insert-css": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/insert-css/-/insert-css-2.0.0.tgz",
"integrity": "sha512-xGq5ISgcUP5cvGkS2MMFLtPDBtrtQPSFfC6gA6U8wHKqfjTIMZLZNxOItQnoSjdOzlXOLU/yD32RKC4SvjNbtA=="
},
"internal-slot": { "internal-slot": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
@ -60412,13 +60656,6 @@
"thunky": "^1.0.2" "thunky": "^1.0.2"
} }
}, },
"nan": {
"version": "2.16.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz",
"integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==",
"dev": true,
"optional": true
},
"nanoclone": { "nanoclone": {
"version": "0.2.1", "version": "0.2.1",
"resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz", "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz",
@ -62513,6 +62750,11 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
}, },
"react-lifecycles-compat": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
"integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
},
"react-loading-skeleton": { "react-loading-skeleton": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/react-loading-skeleton/-/react-loading-skeleton-3.1.0.tgz", "resolved": "https://registry.npmjs.org/react-loading-skeleton/-/react-loading-skeleton-3.1.0.tgz",
@ -64090,6 +64332,19 @@
} }
} }
}, },
"react-virtualized": {
"version": "9.22.3",
"resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.3.tgz",
"integrity": "sha512-MKovKMxWTcwPSxE1kK1HcheQTWfuCxAuBoSTf2gwyMM21NdX/PXUhnoP8Uc5dRKd+nKm8v41R36OellhdCpkrw==",
"requires": {
"@babel/runtime": "^7.7.2",
"clsx": "^1.0.4",
"dom-helpers": "^5.1.3",
"loose-envify": "^1.4.0",
"prop-types": "^15.7.2",
"react-lifecycles-compat": "^3.0.4"
}
},
"read-cache": { "read-cache": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
@ -66054,6 +66309,66 @@
} }
} }
}, },
"rsuite": {
"version": "https://registry.npmjs.org/rsuite/-/rsuite-5.19.0.tgz",
"integrity": "sha512-KQD48UT2HJec+VNzcsrGlo65+OMas7kOjJnxkwR3GsiIugw2aQ9o2JUBmoaJFxhbAnwv1hjJ73ZgW3MH3Wo/Pw==",
"requires": {
"@babel/runtime": "^7.18.9",
"@juggle/resize-observer": "^3.3.1",
"@rsuite/icons": "^1.0.2",
"@types/chai": "^4.3.3",
"@types/lodash": "^4.14.184",
"@types/prop-types": "^15.7.4",
"@types/react-virtualized": "^9.21.11",
"classnames": "^2.3.1",
"date-fns": "^2.29.2",
"dom-lib": "^3.1.2",
"lodash": "^4.17.11",
"prop-types": "^15.8.1",
"react-virtualized": "^9.22.3",
"rsuite-table": "^5.7.1",
"schema-typed": "^2.0.3"
},
"dependencies": {
"@babel/runtime": {
"version": "7.19.0",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz",
"integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==",
"requires": {
"regenerator-runtime": "^0.13.4"
}
}
}
},
"rsuite-table": {
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/rsuite-table/-/rsuite-table-5.7.2.tgz",
"integrity": "sha512-JwfxAR8lXVXM9PRQGJMbayciMcVFpHWExAhfY53h6JYKC7LfPeBx/Z6k4P7PO0grFkVGBdFW3ZgHxhCD1ur/eA==",
"requires": {
"@babel/runtime": "^7.12.5",
"@juggle/resize-observer": "^3.3.1",
"@rsuite/icons": "^1.0.0",
"classnames": "^2.3.1",
"dom-lib": "^3.1.3",
"lodash": "^4.17.21",
"react-is": "^17.0.2"
},
"dependencies": {
"@babel/runtime": {
"version": "7.19.0",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz",
"integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==",
"requires": {
"regenerator-runtime": "^0.13.4"
}
},
"react-is": {
"version": "17.0.2",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
"integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
}
}
},
"rsvp": { "rsvp": {
"version": "4.8.5", "version": "4.8.5",
"resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz",
@ -66388,6 +66703,24 @@
"loose-envify": "^1.1.0" "loose-envify": "^1.1.0"
} }
}, },
"schema-typed": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/schema-typed/-/schema-typed-2.0.3.tgz",
"integrity": "sha512-4KckVnJjTtVugYpSAoQrcH4quE4yIVTvI/nHEqtwdceBr/ZCuH2LfV8/gaZFrYU7cwwyufLKaswt28aqQ1T9ww==",
"requires": {
"@babel/runtime": "^7.16.0"
},
"dependencies": {
"@babel/runtime": {
"version": "7.19.0",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz",
"integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==",
"requires": {
"regenerator-runtime": "^0.13.4"
}
}
}
},
"schema-utils": { "schema-utils": {
"version": "3.1.1", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
@ -67542,6 +67875,12 @@
"integrity": "sha512-k8uzYIkIVwmT+TcglpdN50pS2y1BDcUnBPK9iJeGu0Pl1lOI8pD6wtzgw91Pjpe+RxtTncw32tLxs/R0yNL2Mg==", "integrity": "sha512-k8uzYIkIVwmT+TcglpdN50pS2y1BDcUnBPK9iJeGu0Pl1lOI8pD6wtzgw91Pjpe+RxtTncw32tLxs/R0yNL2Mg==",
"dev": true "dev": true
}, },
"tailwind-scrollbar": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/tailwind-scrollbar/-/tailwind-scrollbar-2.0.1.tgz",
"integrity": "sha512-OcR7qHBbux4k+k6bWqnEQFYFooLK/F4dhkBz6nvswIoaA9ancZ5h20e0tyV7ifSWLDCUBtpG+1NHRA8HMRH/wg==",
"dev": true
},
"tailwindcss": { "tailwindcss": {
"version": "3.1.7", "version": "3.1.7",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.7.tgz", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.7.tgz",
@ -68762,17 +69101,6 @@
} }
} }
}, },
"fsevents": {
"version": "1.2.13",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
"integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
"dev": true,
"optional": true,
"requires": {
"bindings": "^1.5.0",
"nan": "^2.12.1"
}
},
"glob-parent": { "glob-parent": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",

View File

@ -110,6 +110,7 @@
"postcss": "^8.4.14", "postcss": "^8.4.14",
"prop-types": "^15.8.1", "prop-types": "^15.8.1",
"react-test-renderer": "^18.2.0", "react-test-renderer": "^18.2.0",
"tailwind-scrollbar": "^2.0.1",
"webpack": "^5.74.0" "webpack": "^5.74.0"
} }
} }

View File

@ -0,0 +1,24 @@
.loader {
position: relative;
background: #096DD9;
transform: rotateX(65deg) rotate(45deg);
color: #003A8C;
animation: layers1 1s linear infinite alternate;
}
.loader:after {
content: '';
position: absolute;
inset: 0;
background: rgba(24, 144, 255, 0.7);
animation: layerTr 1s linear infinite alternate;
}
@keyframes layers1 {
0% { box-shadow: 0px 0px 0 0px }
90% , 100% { box-shadow: 8px 8px 0 -4px }
}
@keyframes layerTr {
0% { transform: translate(0, 0) scale(1) }
100% { transform: translate(-10px, -10px) scale(1) }
}

View File

@ -0,0 +1,10 @@
import classNames from "classnames"
import "./Loader.css"
type Props = {
className: string,
}
export const Loader = ({className}:Props)=>{
return (<div className="flex "><span className={classNames(className, "loader")}></span></div>)
}

View File

@ -8,11 +8,11 @@ import "react-loading-skeleton/dist/skeleton.css";
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* Components */ /* Components */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
import Typography from "./typography/Typography"; import Typography from "../../typography/Typography";
import SkeletonCard from "./SkeletonCard"; import SkeletonCard from "../../SkeletonCard";
import AspectRatio from "./AspectRatio"; import AspectRatio from "../../AspectRatio";
import Card from "./Card"; import Card from "../../Card";
import Link from "./typography/Link"; import Link from "../../typography/Link";
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* Icons */ /* Icons */

View File

@ -20,7 +20,7 @@ const categories = [
}, },
{ id: 3, title: "Fundamental", count: 5617813, icon: <SVGFundamental /> }, { id: 3, title: "Fundamental", count: 5617813, icon: <SVGFundamental /> },
{ id: 4, title: "Humanitarian", count: 5617813, icon: <SVGHumanitarian /> }, { id: 4, title: "Humanitarian", count: 5617813, icon: <SVGHumanitarian /> },
{ id: 5, title: "Argicultural", count: 5617813, icon: <SVGAgricultural /> }, { id: 5, title: "Agricultural", count: 5617813, icon: <SVGAgricultural /> },
{ id: 6, title: "Social", count: 5617813, icon: <SVGSocials /> }, { id: 6, title: "Social", count: 5617813, icon: <SVGSocials /> },
]; ];

View File

@ -1,11 +1,11 @@
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* Components */ /* Components */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
import Heading from "./typography/Heading"; import Heading from "../../typography/Heading";
import SkeletonCard from "./SkeletonCard"; import SkeletonCard from "../../SkeletonCard";
import { Button } from "./Button/Button"; import { Button } from "../../Button/Button";
import Avatar from "./Avatar"; import Avatar from "../../Avatar";
import Card from "./Card"; import Card from "../../Card";
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* Swiper */ /* Swiper */
@ -21,7 +21,7 @@ import "swiper/css";
/* Icons */ /* Icons */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
import { ReactComponent as SVGCaretRight } from "assets/svg/caret-right.svg"; import { ReactComponent as SVGCaretRight } from "assets/svg/caret-right.svg";
import Link from "./typography/Link"; import Link from "../../typography/Link";
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* Variables */ /* Variables */

View File

@ -0,0 +1,27 @@
/* -------------------------------------------------------------------------- */
/* Imports */
/* -------------------------------------------------------------------------- */
import React from "react";
import {SearchBar} from "../../search/SearchBar";
export default function MainSection() {
return (
<section className="bg-main bg-center bg-cover bg-origin-border bg-no-repeat min-h-[100vh] py-32 px-2 sm:px-6 md:px-6 lg:px-0 items-center">
<div className="m-auto text-center font-bold text-4xl ">
Scientific Library with Free Access
</div>
<div className="flex flex-row items-center justify-center space-x-3 pt-2">
<div className=" text-2xl text-gray-400">Search</div>
<div className=" text-3xl text-blue-500">320 455</div>
<div className=" text-2xl text-gray-400">Items</div>
</div>
<div className="max-w-xl m-auto pt-16 ">
<SearchBar />
<div className="mt-7 pr-1 text-right font-semibold text-sm">
Advanced Search
</div>
</div>
</section>
);
}

View File

@ -1,210 +0,0 @@
<<<<<<< Updated upstream
/* -------------------------------------------------------------------------- */
/* Imports */
/* -------------------------------------------------------------------------- */
import React from "react";
import Inputgroup from "./Inputgroup";
import Select from "./Select";
import { useState } from "react";
import { Button } from "./Button/Button";
import { SVGSearch } from "../components/icons";
import SearchBar from "components/SearchBar";
type Props<T, H> = {
className?: string;
options: T[];
hintsValues: H[];
displayValueResolver?: (element: T) => any;
};
/* -------------------------------------------------------------------------- */
/* Component implementation */
/* -------------------------------------------------------------------------- */
export default function MainSection<T, H>({
className,
options,
hintsValues,
displayValueResolver,
...props
}: Props<T, H>) {
const [value, setValue] = useState(options[0]); // Category
const [hints, setHints] = useState<any[]>([]); //Response list
const [onSelected, setOnSelected] = useState(""); // Selected item from response list
const [query, setQuery] = useState(""); // Query
const onChange = (query: string) => {
console.log(query)
setQuery(query);
setHints(hintsValues);
};
const onClick = () => {
console.log(displayValueResolver ? displayValueResolver(value) : value);
console.log(onSelected);
console.log(query);
};
const searchResolver = (item: any) => {
setOnSelected(item.caption);
console.log(onSelected);
};
//empty items message
const IsEmptyItems = () => {
return <p className="text-blue-500">Nothing Found</p>;
};
return (
<section className="bg-main bg-center bg-cover bg-origin-border bg-no-repeat max-h-[100vh] py-32 px-2 sm:px-6 md:px-6 lg:px-0">
<div className="m-auto text-center font-bold text-4xl ">
Scientific Library with Free Access
</div>
<div className="flex flex-row items-center justify-center space-x-3 pt-2">
<div className=" text-2xl text-gray-400">Search</div>
<div className=" text-3xl text-blue-500">320 455</div>
<div className=" text-2xl text-gray-400">Items</div>
</div>
<div className="max-w-xl m-auto pt-16">
<Inputgroup className="m-0 p-0">
<div className="flex items-center w-full divide-x-2 divide-solid divide-gray-200">
<div className="flex w-1/3">
<Select
inGroup={true}
className="w-full top-0"
options={options}
value={value}
onChange={setValue}
displayValueResolver={(value: any) => value?.name ?? ""}
/>
</div>
<div className="w-full">
<SearchBar
className="w-full"
hints={hints}
onChange={onChange}
onSelected={searchResolver}
inGroup={true}
IsEmptyItems={IsEmptyItems}
displayValueResolver={(value: any) => value.caption}
/>
</div>
</div>
<div className="pr-0.5">
<Button onClick={onClick}>
<Button.Icon>
<SVGSearch className="fill-white stroke-white w-4 "></SVGSearch>
</Button.Icon>
</Button>
</div>
</Inputgroup>
<div className="mt-7 pr-1 text-right font-semibold text-sm">
Advanced Search
</div>
</div>
</section>
);
}
=======
/* -------------------------------------------------------------------------- */
/* Imports */
/* -------------------------------------------------------------------------- */
import React from "react";
import Inputgroup from "./Inputgroup";
import Select from "./Select";
import { useState } from "react";
import { Button } from "./Button/Button";
import { SVGSearch } from "../components/icons";
import SearchBar from "components/SearchBar";
type Props<T, H> = {
className?: string;
options: T[];
hintsValues: H[];
displayValueResolver?: (element: T) => any;
};
/* -------------------------------------------------------------------------- */
/* Component implementation */
/* -------------------------------------------------------------------------- */
export default function MainSection<T, H>({
className,
options,
hintsValues,
displayValueResolver,
...props
}: Props<T, H>) {
const [value, setValue] = useState(options[0]); // Category
const [hints, setHints] = useState<any[]>([]); //Response list
const [onSelected, setOnSelected] = useState(""); // Selected item from response list
// const [query, setQuery] = useState(""); // Query
const onChange = (query: string) => {
// setQuery(query);
setHints(hintsValues);
console.log(query);
};
const onClick = () => {
console.log(displayValueResolver ? displayValueResolver(value) : value);
console.log(onSelected);
};
const searchResolver = (item: any) => {
setOnSelected(item.caption);
console.log(onSelected);
};
//empty items message
const IsEmptyItems = () => {
return <p className="text-blue-500">Nothing Found</p>;
};
return (
<section className="bg-main bg-center bg-cover bg-origin-border bg-no-repeat min-h-[100vh] py-32 px-2 sm:px-6 md:px-6 lg:px-0">
<div className="m-auto text-center font-bold text-4xl ">
Scientific Library with Free Access
</div>
<div className="flex flex-row items-center justify-center space-x-3 pt-2">
<div className=" text-2xl text-gray-400">Search</div>
<div className=" text-3xl text-blue-500">320 455</div>
<div className=" text-2xl text-gray-400">Items</div>
</div>
<div className="max-w-xl m-auto pt-16">
<Inputgroup className="m-0 p-0">
<div className="flex items-center w-full divide-x-2 divide-solid divide-gray-200">
<div className="flex w-1/3">
<Select
inGroup={true}
className="w-full top-0"
options={options}
value={value}
onChange={setValue}
displayValueResolver={(value: any) => value?.name ?? ""}
/>
</div>
<div className="w-full">
<SearchBar
className="w-full"
hints={hints}
onChange={onChange}
onSelected={searchResolver}
inGroup={true}
IsEmptyItems={IsEmptyItems}
displayValueResolver={(value: any) => value.caption}
/>
</div>
</div>
<div className="pr-0.5">
<Button onClick={onClick}>
<Button.Icon>
<SVGSearch className="fill-white stroke-white w-4 "></SVGSearch>
</Button.Icon>
</Button>
</div>
</Inputgroup>
<div className="mt-7 pr-1 text-right font-semibold text-sm">
Advanced Search
</div>
</div>
</section>
);
}
>>>>>>> Stashed changes

View File

@ -20,7 +20,7 @@ const Inputgroup = ({ children, className }: Props) => {
const arrChildren = React.Children.toArray(children); const arrChildren = React.Children.toArray(children);
return ( return (
<div <form
className={classNames( className={classNames(
"border border-gray-200 rounded flex items-center p-1 m-4", "border border-gray-200 rounded flex items-center p-1 m-4",
focused ? "border-gray-900" : "border-gray-300", focused ? "border-gray-900" : "border-gray-300",
@ -46,7 +46,7 @@ const Inputgroup = ({ children, className }: Props) => {
} }
return e; return e;
})} })}
</div> </form>
); );
}; };

View File

@ -0,0 +1,49 @@
import React, { useState, useEffect } from "react";
import Inputgroup from "./Inputgroup";
import SearchInput from "./SearchInput";
import { Button } from "components/Button/Button";
import { SVGSearch } from "components/icons";
import { useSearchStoreImplementation } from "searchResults/data/searchStoreImplementation";
import { useSearchViewModel } from "searchResults/controller/searchResultsViewModel";
import Link from "components/typography/Link";
type Props = {
className?: string;
};
/* ------------------------------- Categories ------------------------------- */
export function SearchBar({ className }: Props) {
const [onSelected, setOnSelected] = useState(""); // Selected item from response list
const searchResolver = (item: any) => {
setOnSelected(item.caption);
console.log(onSelected);
};
return (
//TOdO Need to add dropdown with categories
<Inputgroup className="m-0 p-0 bg-white">
<div className="flex items-center w-full divide-x-2 divide-solid divide-gray-200">
{/* <div className="flex w-1/3">
</div> */}
<div className="w-full">
<SearchInput
onSelected={searchResolver}
className="w-full"
inGroup={true}
/>
</div>
</div>
<div className="pr-0.5">
<Link to="/search-results">
<Button onClick={()=>{}}>
<Button.Icon>
<SVGSearch className="fill-white stroke-white w-4 "></SVGSearch>
</Button.Icon>
</Button></Link>
</div>
</Inputgroup>
);
}

View File

@ -3,10 +3,11 @@
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
import React from "react"; import React from "react";
import classNames from "classnames"; import classNames from "classnames";
import "../index.css";
import { Combobox, Transition } from "@headlessui/react"; import { Combobox, Transition } from "@headlessui/react";
import { Fragment, useEffect, useState } from "react"; import { Fragment, useEffect, useState } from "react";
import { useSearchStoreImplementation } from "searchResults/data/searchStoreImplementation";
import { useSearchViewModel } from "searchResults/controller/searchResultsViewModel";
import { Loader } from "components/Loader/Loader";
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* Component props */ /* Component props */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
@ -16,11 +17,7 @@ type Hint = {
}; };
type Props<T> = { type Props<T> = {
onChange: (query: string) => void;
onSelected: (value: Hint) => void; onSelected: (value: Hint) => void;
IsEmptyItems: () => React.ReactNode;
hints: Hint[];
displayValueResolver?: (element: T) => any;
disabled?: boolean; disabled?: boolean;
inGroup?: boolean; inGroup?: boolean;
className?: string; className?: string;
@ -51,7 +48,7 @@ const inputStyle = `
const inputList = ` const inputList = `
absolute z-10 mt-1 w-full max-h-56 absolute z-10 mt-1 w-full max-h-56
bg-white shadow-lg bg-white shadow-lg
rounded py-1 rounded
overflow-hidden overflow-hidden
focus:outline-none focus:outline-none
text-base text-base
@ -69,70 +66,73 @@ const inputInGroup = [
/* Component implementation */ /* Component implementation */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
export default function SearchBar<T>({ export default function SearchInput<T>({
onChange,
onSelected, onSelected,
hints,
displayValueResolver,
disabled, disabled,
inGroup = false, inGroup = false,
className, className,
maxScrollSize = 140, maxScrollSize = 140,
elementScrollSize = 36, elementScrollSize = 36,
placeHolder = "Search...", placeHolder = "Search...",
IsEmptyItems,
...props ...props
}: Props<T>) { }: Props<T>) {
const [selected, setSelected] = useState<any>(hints); const store = useSearchStoreImplementation();
const [query, setQuery] = useState(""); const {
search,
changeSearchRequest,
searchRequest,
searchResults,
isLoading,
isFailed,
} = useSearchViewModel(store);
const [inputValue, setInputValue] = useState("");
const changeInputValue = (value: string) => {
setInputValue(value);
changeSearchRequest(value);
};
useEffect(() => { useEffect(() => {
onChange(query); if (searchRequest !== "") {
}, [query, onChange]); search();
}
const handleSelected = (value: Hint) => { }, [searchRequest, changeSearchRequest]);
setSelected(value);
onSelected && onSelected(value);
};
return ( return (
<div> <div>
<Combobox value={selected} {...props} onChange={handleSelected}> <Combobox value={inputValue} onChange={setInputValue}>
<div className="relative"> <div className="relative">
<div className="relative w-full bg-white text-left focus:outline-none sm:text-sm"> <div className="relative w-full bg-white text-left focus:outline-none sm:text-sm">
<Combobox.Input <Combobox.Input
autoComplete="off"
className={classNames([ className={classNames([
[`${inputStyle}`], [`${inputStyle}`],
{ [`${inputInGroup}`]: inGroup }, { [`${inputInGroup}`]: inGroup },
className, className,
])} ])}
onChange={(event) => setQuery(event.target.value)} onChange={(event) => changeInputValue(event.target.value)}
placeholder={placeHolder} placeholder={placeHolder}
displayValue={(value: T) => displayValue={() => inputValue}
displayValueResolver ? displayValueResolver(value) : value
}
/> />
</div> </div>
<div>
{query.length > 0 && ( {searchRequest !== "" && !isFailed && !isLoading && (
<div className={`${inputList}`}>
<Transition <Transition
as={Fragment} as="div"
leave="transition ease-in duration-100" className={`${inputList}`}
leaveFrom="opacity-100" leave="transition ease-in duration-100"
leaveTo="opacity-0" leaveFrom="opacity-100"
afterLeave={() => setQuery("")} leaveTo="opacity-0"
> >
<Combobox.Options> <Combobox.Options>
{hints.length === 0 && query !== "" ? IsEmptyItems() : null} {searchResults === undefined ||
{/* <Scrollbar (searchResults.data.length === 0 && searchRequest !== "") ? (
style={{ <div>Nothing found</div>
height: hints.length * elementScrollSize, ) : null}
maxHeight: maxScrollSize, {searchResults !== undefined &&
}} searchResults.data.map((result) => (
> */}
{hints.map((item: any, id: number) => (
<Combobox.Option <Combobox.Option
key={id} key={result.id}
className={({ active, selected }) => className={({ active, selected }) =>
classNames( classNames(
active active
@ -144,17 +144,25 @@ export default function SearchBar<T>({
: "font-normal " : "font-normal "
) )
} }
value={item} value={result.title}
onClick={() => {
if (result.title != undefined) {
changeInputValue(result.title);
}
}}
> >
<div>{item.caption}</div> <div>{result.title}</div>
</Combobox.Option> </Combobox.Option>
))} ))}
{/* </Scrollbar> */} </Combobox.Options>
</Combobox.Options> </Transition>
</Transition> )}
</div> {isLoading && (
)} <div className={classNames(`${inputList}`, "mt-3")}>
</div> <div className="w-full flex text-center py-2 items-center justify-center">
<Loader className="w-5 h-5"/></div>
</div>
)}
</div> </div>
</Combobox> </Combobox>
</div> </div>

View File

@ -15,6 +15,7 @@ import CookiesPolicy from "pages/Information/CookiesPolicy";
import AccountSettings from "pages/Information/AccountSettings"; import AccountSettings from "pages/Information/AccountSettings";
import { store } from "store/store"; import { store } from "store/store";
import { Provider } from "react-redux"; import { Provider } from "react-redux";
import { SearchResultsPage } from "pages/SearchResultsPage";
const rootElement = document.getElementById("root"); const rootElement = document.getElementById("root");
if (!rootElement) throw new Error("Failed to find the root element"); if (!rootElement) throw new Error("Failed to find the root element");
@ -34,6 +35,7 @@ root.render(
<Route path="/account"> <Route path="/account">
<Route path="settings" element={<AccountSettings />} /> <Route path="settings" element={<AccountSettings />} />
</Route> </Route>
<Route path="/search-resilts" element={<SearchResultsPage />}></Route>
</Routes> </Routes>
</BrowserRouter> </BrowserRouter>
</React.StrictMode> </React.StrictMode>

View File

@ -1,41 +1,22 @@
import React from "react"; import React from "react";
import BaseLayout from "components/BaseLayout"; import BaseLayout from "components/BaseLayout";
import MainSection from "components/MainSection"; import FeaturedArticlesCards from "components/MainPage/sections/FeaturedArticlesCards";
import FeaturedArticlesCards from "components/FeaturedArticlesCards"; import FeaturedAuthorsCards from "components/MainPage/sections/FeaturedAuthorsCards";
import FeaturedAuthorsCards from "components/FeaturedAuthorsCards"; import { FeaturedArticlesCategories } from "components/MainPage/sections/FeaturedArticlesCategories";
import { FeaturedArticlesCategories } from "components/parts/FeaturedArticlesCategories";
import { BottomBarAcceptCookies } from "components/containers/modal/BottomBarAcceptCookies"; import { BottomBarAcceptCookies } from "components/containers/modal/BottomBarAcceptCookies";
import { SearchView } from "../searchResults/view/searchView"; import MainSection from "components/MainPage/sections/MainSection";
type Props = { type Props = {
className?: string; className?: string;
}; };
const options = [
{ name: "All" },
{ name: "Wade Cooper" },
{ name: "Arlene Mccoy" },
{ name: "Devon Webb" },
{ name: "Tom Cook" },
{ name: "Tanya Fox" },
{ name: "Hellen Schmidt" },
];
const hintsValues = [
{ id: "1", caption: "Wade Cooper" },
{ id: "2", caption: "Arlene Mccoy" },
{ id: "3", caption: "Devon Webb" },
{ id: "4", caption: "Tom Cook" },
{ id: "5", caption: "Tanya Fox" },
{ id: "6", caption: "Hellen Schmidt" },
];
export default function MainPage({ className }: Props) { export default function MainPage({ className }: Props) {
return ( return (
<div> <div>
<BaseLayout> <BaseLayout>
{/* <MainSection hintsValues={hintsValues} options={options}></MainSection> */} {/* <SearchSection options={options }></SearchSection> */}
<SearchView /> <MainSection></MainSection>
<FeaturedArticlesCategories></FeaturedArticlesCategories> <FeaturedArticlesCategories></FeaturedArticlesCategories>
<FeaturedArticlesCards></FeaturedArticlesCards> <FeaturedArticlesCards></FeaturedArticlesCards>
<FeaturedAuthorsCards></FeaturedAuthorsCards> <FeaturedAuthorsCards></FeaturedAuthorsCards>

View File

@ -0,0 +1,5 @@
import React from "react";
export const SearchResultsPage = () =>{
return <div>Search results page</div>
}

View File

@ -8,11 +8,11 @@ type SearchStoreState = Omit<
>; >;
const ININTIAL_STATE: SearchStoreState = { const ININTIAL_STATE: SearchStoreState = {
searchRequest: "",
searchResults: undefined, searchResults: undefined,
failure: undefined, failure: undefined,
isFailed: false, isFailed: false,
isLoading: false, isLoading: false,
searchRequest: "",
}; };
const searchResultReducer = ( const searchResultReducer = (
@ -31,13 +31,6 @@ const searchResultReducer = (
isLoading: true, isLoading: true,
isFailed: false, isFailed: false,
}; };
case actionTypes.GET_SEARCH_RESULTS_FAILURE:
return {
...state,
isFailed: true,
failure: action.payload,
isLoading: false,
};
case actionTypes.GET_SEARCH_RESULTS_SUCCESS: case actionTypes.GET_SEARCH_RESULTS_SUCCESS:
return { return {
...state, ...state,
@ -45,6 +38,13 @@ const searchResultReducer = (
isLoading: false, isLoading: false,
isFailed: false, isFailed: false,
}; };
case actionTypes.GET_SEARCH_RESULTS_FAILURE:
return {
...state,
isFailed: true,
failure: action.payload,
isLoading: false,
};
default: default:
return state; return state;
} }

View File

@ -10,7 +10,8 @@ const searchEndpoint = "/papers/search";
async function search(request: string): Promise<SearchResults> { async function search(request: string): Promise<SearchResults> {
try { try {
const response = await integratorApiClient.get<SearchResultsDTO>( const response = await integratorApiClient.get<SearchResultsDTO>(
searchEndpoint + `&query=&page=1` // searchEndpoint + `?query=` + request + `&page=1`
"https://run.mocky.io/v3/89c8421d-86b1-4af7-850e-b71def846cfe"
); );
const dto = response.data; const dto = response.data;
return create({ data: dto.data }); return create({ data: dto.data });

View File

@ -1,29 +1,33 @@
import React from "react"; import React from "react";
import { SearchResultsStore } from "searchResults/domain/searchStore"; import { SearchResultsStore } from "searchResults/domain/searchStore";
import { RootState, useAppDispatch, useAppSelector } from "store"; import { RootState, useAppDispatch, useAppSelector } from "store";
import { SearchAction } from "./actions/searchActions"; import { changeSearchRequestAction, SearchAction } from "./actions/searchActions";
import { SearchStoreState } from "./searchReducer"; import { SearchStoreState } from "./searchReducer";
const searchSelector = (state: RootState): SearchStoreState => const searchSelector = (state: RootState): SearchStoreState =>
state.searchResults; state.searchResults;
const useSearchStoreImplementation = (): SearchResultsStore => { const useSearchStoreImplementation = (): SearchResultsStore => {
const { searchResults, failure, isFailed, isLoading, request } = const { searchResults, failure, isFailed, isLoading, searchRequest } =
useAppSelector(searchSelector); useAppSelector(searchSelector);
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
const search = React.useCallback( const search = React.useCallback(
(query: string) => SearchAction(request)(dispatch), (searchRequest: string) => SearchAction(searchRequest)(dispatch),
[dispatch] [dispatch]
); );
const changeSearchRequest = React.useCallback(
(searchRequest: string) => changeSearchRequestAction(searchRequest)(dispatch), [dispatch]
)
return { return {
request,
isLoading, isLoading,
isFailed, isFailed,
searchResults, searchResults,
failure, failure,
searchRequest,
changeSearchRequest: changeSearchRequest,
search: search, search: search,
}; };
}; };

View File

@ -6,7 +6,7 @@ type ChangeRequestStore = Pick<
"changeSearchRequest" | "searchRequest" "changeSearchRequest" | "searchRequest"
>; >;
const debouncedTask = debounce((task) => Promise.resolve(task()), 100); const debouncedTask = debounce((task) => Promise.resolve(task()), 200);
const changeSearchRequestUseCase = (store: ChangeRequestStore) => { const changeSearchRequestUseCase = (store: ChangeRequestStore) => {
return debouncedTask(() => store.changeSearchRequest(store.searchRequest)); return debouncedTask(() => store.changeSearchRequest(store.searchRequest));

View File

@ -1,21 +1,92 @@
import classNames from "classnames";
import React, { useState, useEffect } from "react"; import React, { useState, useEffect } from "react";
import { useSearchViewModel } from "searchResults/controller/searchResultsViewModel"; import { useSearchViewModel } from "searchResults/controller/searchResultsViewModel";
import { useSearchStoreImplementation } from "searchResults/data/searchStoreImplementation"; import { useSearchStoreImplementation } from "searchResults/data/searchStoreImplementation";
export function SearchView() { const searchDropDownStyle = `
absolute
top-12 left-0
right-0
bg-white
w-full
max-h-[200px]
overflow-y-scroll
shadow-md
scrollbar-thin
scrollbar-thumb-gray-500
scrollbar-track-inherit
scrollbar-thumb-rounded
`
type Props = {
className?: string;
};
export const SearchView = ({ className }: Props) => {
const [value, setValue] = useState('');
const store = useSearchStoreImplementation(); const store = useSearchStoreImplementation();
const { searchResults, search } = useSearchViewModel(store); const {
const [query, setQuery] = useState(""); search,
changeSearchRequest,
searchRequest,
searchResults,
isLoading,
isFailed,
} = useSearchViewModel(store);
const changeInputValue = (value: string) => {
setValue(value);
changeSearchRequest(value)
}
useEffect(() => {
if (searchRequest !== "") {
search();
}
}, [searchRequest, changeSearchRequest]);
return ( return (
<div> <div className={classNames("relative", className)}>
<input <input
type="text" type="text"
className="border border-1" className="w-full m-0 p-2 focus:outline-none"
placeholder="Search..." placeholder="Search..."
onChange={() => search()} onChange={e => changeInputValue(e.target.value)}
value={value}
/> />
{/* <div>{searchResults}</div> */} <div
className={classNames(
searchDropDownStyle,
{ "py-2": searchRequest != "" }
)}
>
<ul className="list-none w-full">
{isLoading && <p className="text-center">Is loading...</p>}
{isFailed && searchRequest != "" && (
<p className="text-center">
Sorry... Something went wrong from our side
</p>
)}
{!isLoading &&
!isFailed &&
searchResults != undefined &&
searchRequest != "" &&
searchResults.data.map((result) => (
<li
className="py-1.5 px-3 hover:bg-blue-100 transition-colors cursor-pointer"
onClick={() => {
if (result.title != undefined) {
changeInputValue(result.title)
}
}}
>
{result.title}
</li>
))}
</ul>
</div>
</div> </div>
); );
} };

View File

@ -93,6 +93,7 @@ module.exports = {
}); });
}, },
require("@tailwindcss/line-clamp"), require("@tailwindcss/line-clamp"),
require("tailwind-scrollbar")({ nocompatible: true }),
], ],
theme: { theme: {
extend: { extend: {