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_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_API_VERSION=/api/v1
REACT_APP_INTEGRATOR_API_VERSION=/v1
REACT_APP_GRAPHQL_URL=/graphql

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

@ -70,6 +70,7 @@
"postcss": "^8.4.14",
"prop-types": "^15.8.1",
"react-test-renderer": "^18.2.0",
"tailwind-scrollbar": "^2.0.1",
"webpack": "^5.74.0"
}
},
@ -4059,6 +4060,11 @@
"@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": {
"version": "2.0.4",
"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",
"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": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.4.tgz",
@ -11196,6 +11222,11 @@
"@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": {
"version": "3.4.35",
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
@ -11361,9 +11392,9 @@
"integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="
},
"node_modules/@types/lodash": {
"version": "4.14.182",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz",
"integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q=="
"version": "4.14.186",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.186.tgz",
"integrity": "sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw=="
},
"node_modules/@types/mdast": {
"version": "3.0.10",
@ -11495,6 +11526,25 @@
"@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": {
"version": "1.17.1",
"resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
@ -13675,16 +13725,6 @@
"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": {
"version": "3.7.2",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
@ -14646,7 +14686,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.0.tgz",
"integrity": "sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA==",
"dev": true,
"engines": {
"node": ">=6"
}
@ -15980,6 +16019,18 @@
"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": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
@ -16400,6 +16451,45 @@
"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": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
@ -18359,13 +18449,6 @@
"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": {
"version": "1.0.4",
"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",
"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": {
"version": "1.1.1",
"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",
"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": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
@ -27258,13 +27333,6 @@
"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": {
"version": "0.2.1",
"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",
"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": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/react-loading-skeleton/-/react-loading-skeleton-3.1.0.tgz",
@ -32522,6 +32595,23 @@
"integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
"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": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
@ -35295,6 +35385,78 @@
"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": {
"version": "4.8.5",
"resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz",
@ -35737,6 +35899,25 @@
"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": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
@ -37181,6 +37362,18 @@
"integrity": "sha512-k8uzYIkIVwmT+TcglpdN50pS2y1BDcUnBPK9iJeGu0Pl1lOI8pD6wtzgw91Pjpe+RxtTncw32tLxs/R0yNL2Mg==",
"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": {
"version": "3.1.7",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.7.tgz",
@ -38777,25 +38970,6 @@
"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": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
@ -42793,6 +42967,11 @@
"@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": {
"version": "2.0.4",
"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": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.4.tgz",
@ -48209,6 +48404,11 @@
"@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": {
"version": "3.4.35",
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
@ -48374,9 +48574,9 @@
"integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="
},
"@types/lodash": {
"version": "4.14.182",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz",
"integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q=="
"version": "4.14.186",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.186.tgz",
"integrity": "sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw=="
},
"@types/mdast": {
"version": "3.0.10",
@ -48508,6 +48708,27 @@
"@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": {
"version": "1.17.1",
"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",
"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": {
"version": "3.7.2",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
@ -50974,8 +51185,7 @@
"clsx": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.0.tgz",
"integrity": "sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA==",
"dev": true
"integrity": "sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA=="
},
"cnbuilder": {
"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": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
@ -52314,6 +52529,43 @@
"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": {
"version": "1.4.1",
"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": {
"version": "1.0.4",
"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",
"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": {
"version": "1.1.1",
"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",
"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": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
@ -60412,13 +60656,6 @@
"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": {
"version": "0.2.1",
"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",
"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": {
"version": "3.1.0",
"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": {
"version": "1.0.0",
"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": {
"version": "4.8.5",
"resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz",
@ -66388,6 +66703,24 @@
"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": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
@ -67542,6 +67875,12 @@
"integrity": "sha512-k8uzYIkIVwmT+TcglpdN50pS2y1BDcUnBPK9iJeGu0Pl1lOI8pD6wtzgw91Pjpe+RxtTncw32tLxs/R0yNL2Mg==",
"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": {
"version": "3.1.7",
"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": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",

View File

@ -110,6 +110,7 @@
"postcss": "^8.4.14",
"prop-types": "^15.8.1",
"react-test-renderer": "^18.2.0",
"tailwind-scrollbar": "^2.0.1",
"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 */
/* -------------------------------------------------------------------------- */
import Typography from "./typography/Typography";
import SkeletonCard from "./SkeletonCard";
import AspectRatio from "./AspectRatio";
import Card from "./Card";
import Link from "./typography/Link";
import Typography from "../../typography/Typography";
import SkeletonCard from "../../SkeletonCard";
import AspectRatio from "../../AspectRatio";
import Card from "../../Card";
import Link from "../../typography/Link";
/* -------------------------------------------------------------------------- */
/* Icons */

View File

@ -20,7 +20,7 @@ const categories = [
},
{ id: 3, title: "Fundamental", count: 5617813, icon: <SVGFundamental /> },
{ 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 /> },
];

View File

@ -1,11 +1,11 @@
/* -------------------------------------------------------------------------- */
/* Components */
/* -------------------------------------------------------------------------- */
import Heading from "./typography/Heading";
import SkeletonCard from "./SkeletonCard";
import { Button } from "./Button/Button";
import Avatar from "./Avatar";
import Card from "./Card";
import Heading from "../../typography/Heading";
import SkeletonCard from "../../SkeletonCard";
import { Button } from "../../Button/Button";
import Avatar from "../../Avatar";
import Card from "../../Card";
/* -------------------------------------------------------------------------- */
/* Swiper */
@ -21,7 +21,7 @@ import "swiper/css";
/* Icons */
/* -------------------------------------------------------------------------- */
import { ReactComponent as SVGCaretRight } from "assets/svg/caret-right.svg";
import Link from "./typography/Link";
import Link from "../../typography/Link";
/* -------------------------------------------------------------------------- */
/* 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);
return (
<div
<form
className={classNames(
"border border-gray-200 rounded flex items-center p-1 m-4",
focused ? "border-gray-900" : "border-gray-300",
@ -46,7 +46,7 @@ const Inputgroup = ({ children, className }: Props) => {
}
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 classNames from "classnames";
import "../index.css";
import { Combobox, Transition } from "@headlessui/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 */
/* -------------------------------------------------------------------------- */
@ -16,11 +17,7 @@ type Hint = {
};
type Props<T> = {
onChange: (query: string) => void;
onSelected: (value: Hint) => void;
IsEmptyItems: () => React.ReactNode;
hints: Hint[];
displayValueResolver?: (element: T) => any;
disabled?: boolean;
inGroup?: boolean;
className?: string;
@ -51,7 +48,7 @@ const inputStyle = `
const inputList = `
absolute z-10 mt-1 w-full max-h-56
bg-white shadow-lg
rounded py-1
rounded
overflow-hidden
focus:outline-none
text-base
@ -69,70 +66,73 @@ const inputInGroup = [
/* Component implementation */
/* -------------------------------------------------------------------------- */
export default function SearchBar<T>({
onChange,
export default function SearchInput<T>({
onSelected,
hints,
displayValueResolver,
disabled,
inGroup = false,
className,
maxScrollSize = 140,
elementScrollSize = 36,
placeHolder = "Search...",
IsEmptyItems,
...props
}: Props<T>) {
const [selected, setSelected] = useState<any>(hints);
const [query, setQuery] = useState("");
const store = useSearchStoreImplementation();
const {
search,
changeSearchRequest,
searchRequest,
searchResults,
isLoading,
isFailed,
} = useSearchViewModel(store);
const [inputValue, setInputValue] = useState("");
const changeInputValue = (value: string) => {
setInputValue(value);
changeSearchRequest(value);
};
useEffect(() => {
onChange(query);
}, [query, onChange]);
const handleSelected = (value: Hint) => {
setSelected(value);
onSelected && onSelected(value);
};
if (searchRequest !== "") {
search();
}
}, [searchRequest, changeSearchRequest]);
return (
<div>
<Combobox value={selected} {...props} onChange={handleSelected}>
<Combobox value={inputValue} onChange={setInputValue}>
<div className="relative">
<div className="relative w-full bg-white text-left focus:outline-none sm:text-sm">
<Combobox.Input
autoComplete="off"
className={classNames([
[`${inputStyle}`],
{ [`${inputInGroup}`]: inGroup },
className,
])}
onChange={(event) => setQuery(event.target.value)}
onChange={(event) => changeInputValue(event.target.value)}
placeholder={placeHolder}
displayValue={(value: T) =>
displayValueResolver ? displayValueResolver(value) : value
}
displayValue={() => inputValue}
/>
</div>
<div>
{query.length > 0 && (
<div className={`${inputList}`}>
{searchRequest !== "" && !isFailed && !isLoading && (
<Transition
as={Fragment}
as="div"
className={`${inputList}`}
leave="transition ease-in duration-100"
leaveFrom="opacity-100"
leaveTo="opacity-0"
afterLeave={() => setQuery("")}
>
<Combobox.Options>
{hints.length === 0 && query !== "" ? IsEmptyItems() : null}
{/* <Scrollbar
style={{
height: hints.length * elementScrollSize,
maxHeight: maxScrollSize,
}}
> */}
{hints.map((item: any, id: number) => (
{searchResults === undefined ||
(searchResults.data.length === 0 && searchRequest !== "") ? (
<div>Nothing found</div>
) : null}
{searchResults !== undefined &&
searchResults.data.map((result) => (
<Combobox.Option
key={id}
key={result.id}
className={({ active, selected }) =>
classNames(
active
@ -144,18 +144,26 @@ export default function SearchBar<T>({
: "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>
))}
{/* </Scrollbar> */}
</Combobox.Options>
</Transition>
)}
{isLoading && (
<div className={classNames(`${inputList}`, "mt-3")}>
<div className="w-full flex text-center py-2 items-center justify-center">
<Loader className="w-5 h-5"/></div>
</div>
)}
</div>
</div>
</Combobox>
</div>
);

View File

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

View File

@ -1,41 +1,22 @@
import React from "react";
import BaseLayout from "components/BaseLayout";
import MainSection from "components/MainSection";
import FeaturedArticlesCards from "components/FeaturedArticlesCards";
import FeaturedAuthorsCards from "components/FeaturedAuthorsCards";
import { FeaturedArticlesCategories } from "components/parts/FeaturedArticlesCategories";
import FeaturedArticlesCards from "components/MainPage/sections/FeaturedArticlesCards";
import FeaturedAuthorsCards from "components/MainPage/sections/FeaturedAuthorsCards";
import { FeaturedArticlesCategories } from "components/MainPage/sections/FeaturedArticlesCategories";
import { BottomBarAcceptCookies } from "components/containers/modal/BottomBarAcceptCookies";
import { SearchView } from "../searchResults/view/searchView";
import MainSection from "components/MainPage/sections/MainSection";
type Props = {
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) {
return (
<div>
<BaseLayout>
{/* <MainSection hintsValues={hintsValues} options={options}></MainSection> */}
<SearchView />
{/* <SearchSection options={options }></SearchSection> */}
<MainSection></MainSection>
<FeaturedArticlesCategories></FeaturedArticlesCategories>
<FeaturedArticlesCards></FeaturedArticlesCards>
<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 = {
searchRequest: "",
searchResults: undefined,
failure: undefined,
isFailed: false,
isLoading: false,
searchRequest: "",
};
const searchResultReducer = (
@ -31,13 +31,6 @@ const searchResultReducer = (
isLoading: true,
isFailed: false,
};
case actionTypes.GET_SEARCH_RESULTS_FAILURE:
return {
...state,
isFailed: true,
failure: action.payload,
isLoading: false,
};
case actionTypes.GET_SEARCH_RESULTS_SUCCESS:
return {
...state,
@ -45,6 +38,13 @@ const searchResultReducer = (
isLoading: false,
isFailed: false,
};
case actionTypes.GET_SEARCH_RESULTS_FAILURE:
return {
...state,
isFailed: true,
failure: action.payload,
isLoading: false,
};
default:
return state;
}

View File

@ -10,7 +10,8 @@ const searchEndpoint = "/papers/search";
async function search(request: string): Promise<SearchResults> {
try {
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;
return create({ data: dto.data });

View File

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

View File

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

View File

@ -1,21 +1,92 @@
import classNames from "classnames";
import React, { useState, useEffect } from "react";
import { useSearchViewModel } from "searchResults/controller/searchResultsViewModel";
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 { searchResults, search } = useSearchViewModel(store);
const [query, setQuery] = useState("");
const {
search,
changeSearchRequest,
searchRequest,
searchResults,
isLoading,
isFailed,
} = useSearchViewModel(store);
const changeInputValue = (value: string) => {
setValue(value);
changeSearchRequest(value)
}
useEffect(() => {
if (searchRequest !== "") {
search();
}
}, [searchRequest, changeSearchRequest]);
return (
<div>
<div className={classNames("relative", className)}>
<input
type="text"
className="border border-1"
className="w-full m-0 p-2 focus:outline-none"
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>
);
}
};

View File

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