diff --git a/package.json b/package.json index 917d7ed..0077e89 100644 --- a/package.json +++ b/package.json @@ -20,9 +20,11 @@ "jquery": "^3.4.1", "lodash": "^4.17.11", "mini-css-extract-plugin": "^0.7.0", + "moment": "^2.24.0", "node-sass": "^4.12.0", "prop-types": "^15.7.2", "react": "^16.8.6", + "react-big-calendar": "^0.22.0", "react-dom": "^16.8.6", "sass-loader": "^7.1.0", "url-loader": "^2.0.0", diff --git a/votrfront/css/main.scss b/votrfront/css/main.scss index 1b89976..8011efc 100644 --- a/votrfront/css/main.scss +++ b/votrfront/css/main.scss @@ -22,6 +22,7 @@ $table-condensed-cell-padding: 4px; @import "votr-bootstrap"; @import "layout"; @import "forms"; +@import "~react-big-calendar/lib/css/react-big-calendar"; html, body { @@ -87,6 +88,25 @@ a, .btn.btn-link { margin-bottom: $line-height-computed; } +.skusky-calendar-menu { + margin-left: 10px; +} + +/* "html" = specificity tie breaker */ +/* must win vs ".rbc-calendar", ".rbc-event", ".rbc-event.rbc-selected" */ +html .skusky-calendar { + height: 90vh; + .rbc-event { + cursor: inherit; /* there is no onClick event - for now */ + } + .skusky-calendar-registered { + background-color: #337ab7; + } + .skusky-calendar-unregistered { + background-color: #999999; + } +} + .loading { background-image: url(spinner.svg); background-repeat: no-repeat; diff --git a/votrfront/js/MojeSkuskyPage.js b/votrfront/js/MojeSkuskyPage.js index b3dc7e4..6236063 100644 --- a/votrfront/js/MojeSkuskyPage.js +++ b/votrfront/js/MojeSkuskyPage.js @@ -8,6 +8,9 @@ import { CacheRequester, Loading, RequestCache, sendRpc } from './ajax'; import { PageLayout, PageTitle } from './layout'; import { Link, queryConsumer } from './router'; import { sortAs, SortableTable } from './sorting'; +import { Calendar, momentLocalizer } from 'react-big-calendar'; +import moment from 'moment'; + // TODO: Oddelit Aktualne terminy hodnotenia vs Stare terminy hodnotenia @@ -177,10 +180,97 @@ function convertToICAL(terminy) { return lines.map((l) => l.replace(/\n/g, "\\n")).join("\r\n"); } +function MojeSkuskyMenuLink(props) { + return ({props.label}); +} + +export function MojeSkuskyMenu() { + return queryConsumer(query => { + var {action, kalendar, zapisnyListKey} = query; + return( +
+
+
+ + +
+
+
) + }); +} + +function convertToEvents(terminy){ + return terminy.map((termin, i) => { + return {id: i, + title: `${termin.nazov_predmetu} (${termin.cas}${termin.miestnost ? ", " + termin.miestnost : ""})`, + start: moment(termin.datum+" "+termin.cas, 'DD.MM.YYYY HH:mm').toDate(), + end: moment(termin.datum+" "+termin.cas, 'DD.MM.YYYY HH:mm').add(3,"hours").toDate(), + prihlaseny: termin.datum_prihlasenia && !termin.datum_odhlasenia}; + }) +} + +function defaultDate(eventList) { + var today = new Date(); + + if (eventList.length) { + var lastExamDate = _.maxBy(eventList, 'start').start; + if (lastExamDate < today) return lastExamDate; + } + + return today; +} + +export function KalendarUdalosti(props) { + const localizer = momentLocalizer(moment) + + return ( + { + return { + className: event.prihlaseny ? "skusky-calendar-registered" : "skusky-calendar-unregistered" + }; + } + } + //remove start and end times (we need only one included in title) + formats={{ + eventTimeRangeFormat: ({ start, end }, culture, local) => {} + }} + /> + ) +} + export function MojeSkuskyPageContent() { return queryConsumer(query => { var cache = new CacheRequester(); - var {zapisnyListKey} = query; + var {zapisnyListKey, kalendar} = query; var vidim = cache.get('get_vidim_terminy_hodnotenia', zapisnyListKey); @@ -213,14 +303,18 @@ export function MojeSkuskyPageContent() { } return - + {kalendar == 1? + + : + + } {terminy.length && } ; }); @@ -288,6 +382,7 @@ export function MojeSkuskyPage() {
Moje skúšky +
diff --git a/webpack.config.js b/webpack.config.js index 1ac8e78..dc2290c 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,5 +1,6 @@ const fs = require('fs'); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); +const webpack = require('webpack'); const bootstrapPath = __dirname + '/node_modules/bootstrap-sass/assets/stylesheets'; @@ -93,6 +94,7 @@ module.exports = function (env, args) { new MiniCssExtractPlugin({ filename: 'style.css' }), new StatusFilePlugin(mode == 'development' ? 'dev' : 'prod'), new CleanMapFilesPlugin(), + new webpack.ContextReplacementPlugin(/moment[/\\]locale$/, /sk/), ], module: { rules: [ diff --git a/yarn.lock b/yarn.lock index 74c899f..e223e05 100644 --- a/yarn.lock +++ b/yarn.lock @@ -673,6 +673,13 @@ "@babel/plugin-transform-react-jsx-self" "^7.0.0" "@babel/plugin-transform-react-jsx-source" "^7.0.0" +"@babel/runtime@^7.1.5", "@babel/runtime@^7.6.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.3.tgz#0811944f73a6c926bb2ad35e918dcc1bfab279f1" + integrity sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w== + dependencies: + regenerator-runtime "^0.13.2" + "@babel/runtime@^7.4.5": version "7.4.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.5.tgz#582bb531f5f9dc67d2fcb682979894f75e253f12" @@ -713,6 +720,24 @@ lodash "^4.17.11" to-fast-properties "^2.0.0" +"@restart/hooks@^0.3.12": + version "0.3.20" + resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.3.20.tgz#e7179ab41e5f346b2feca091261fbdad77e8bc19" + integrity sha512-Q1eeEqcxHQ4oqty7C5Me8/hzWwdCRR643nR/6EHxv8BVxLVYHe4IoWAHg8MIGkE4VtSm3/JnNhkoLJhCkLx5aw== + +"@types/prop-types@*": + version "15.7.3" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" + integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== + +"@types/react@^16.9.11": + version "16.9.19" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.19.tgz#c842aa83ea490007d29938146ff2e4d9e4360c40" + integrity sha512-LJV97//H+zqKWMms0kvxaKYJDG05U2TtQB3chRLF8MPNs+MQh/H1aGlyDUxjaHvu08EAGerdX2z4LTBc7ns77A== + dependencies: + "@types/prop-types" "*" + csstype "^2.2.0" + "@webassemblyjs/ast@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" @@ -1399,6 +1424,11 @@ clone-deep@^2.0.1: kind-of "^6.0.0" shallow-clone "^1.0.0" +clsx@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.0.4.tgz#0c0171f6d5cb2fe83848463c15fcc26b4df8c2ec" + integrity sha512-1mQ557MIZTrL/140j+JVdRM6e31/OA4vTYxXgqIIZlndyfjHpyawKZia1Im05Vp9BWmImkcNrNtFYQMyFcgJDg== + code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" @@ -1611,6 +1641,11 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== +csstype@^2.2.0, csstype@^2.6.7: + version "2.6.8" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.8.tgz#0fb6fc2417ffd2816a418c9336da74d7f07db431" + integrity sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA== + currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -1630,6 +1665,11 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +date-arithmetic@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/date-arithmetic/-/date-arithmetic-4.1.0.tgz#e5d6434e9deb71f79760a37b729e4a515e730ddf" + integrity sha512-QWxYLR5P/6GStZcdem+V1xoto6DMadYWpMXU82ES3/RfR3Wdwr3D0+be7mgOJ+Ov0G9D5Dmb9T17sNLQYj9XOg== + date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" @@ -1730,6 +1770,14 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +dom-helpers@^5.1.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.1.3.tgz#7233248eb3a2d1f74aafca31e52c5299cc8ce821" + integrity sha512-nZD1OtwfWGRBWlpANxacBEZrEuLa16o1nh7YopFWeoF68Zt8GGEmzHu6Xv4F3XaFIC+YXtTLrzgqKxFgLEe4jw== + dependencies: + "@babel/runtime" "^7.6.3" + csstype "^2.6.7" + domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" @@ -2407,7 +2455,7 @@ interpret@^1.1.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== -invariant@^2.2.2: +invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -2758,6 +2806,11 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" +lodash-es@^4.17.11: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78" + integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ== + lodash.tail@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" @@ -2853,6 +2906,11 @@ mem@^4.0.0: mimic-fn "^2.0.0" p-is-promise "^2.0.0" +memoize-one@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-4.1.0.tgz#a2387c58c03fff27ca390c31b764a79addf3f906" + integrity sha512-2GApq0yI/b22J2j9rhbrAlsHb0Qcz+7yWxeLG8h+95sl1XPUgeLimQSOdur4Vw7cUhrBHwaUZxWFZueojqNRzA== + memory-fs@^0.4.0, memory-fs@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" @@ -3017,6 +3075,11 @@ mixin-object@^2.0.1: dependencies: minimist "0.0.8" +moment@^2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" + integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== + move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -3507,6 +3570,11 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" +popper.js@^1.15.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" + integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -3722,6 +3790,24 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" +react-big-calendar@^0.22.0: + version "0.22.1" + resolved "https://registry.yarnpkg.com/react-big-calendar/-/react-big-calendar-0.22.1.tgz#7b523cee4c423410a05e4499a720e8dae12ebec6" + integrity sha512-Pd0x0W4vjs5oDzPl3kvIlJok4ESO7p/+jpxKil0xkJ5sfsYlB/lZMCht7htEy9/WInnnJQGcXx+tLIcEzDbV8g== + dependencies: + "@babel/runtime" "^7.1.5" + clsx "^1.0.4" + date-arithmetic "^4.0.1" + dom-helpers "^5.1.0" + invariant "^2.2.4" + lodash "^4.17.11" + lodash-es "^4.17.11" + memoize-one "^4.0.3" + prop-types "^15.6.2" + react-overlays "^2.0.0-0" + uncontrollable "^7.0.0" + warning "^4.0.2" + react-dom@^16.8.6: version "16.8.6" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.8.6.tgz#71d6303f631e8b0097f56165ef608f051ff6e10f" @@ -3737,6 +3823,24 @@ react-is@^16.8.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== +react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + +react-overlays@^2.0.0-0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-2.1.0.tgz#3671cadab085a519c90a51b9b1402a70281e31d4" + integrity sha512-tHPGTZosbQSo82yb9x4YCsmJJtspKvAPL5kXVnyoB2Z5UoAU3VetIuh2VblfVT408us5nLJd9uDtwI3xWDHS6w== + dependencies: + "@babel/runtime" "^7.4.5" + "@restart/hooks" "^0.3.12" + dom-helpers "^5.1.0" + popper.js "^1.15.0" + prop-types "^15.7.2" + uncontrollable "^7.0.0" + warning "^4.0.3" + react@^16.8.6: version "16.8.6" resolved "https://registry.yarnpkg.com/react/-/react-16.8.6.tgz#ad6c3a9614fd3a4e9ef51117f54d888da01f2bbe" @@ -4557,6 +4661,16 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +uncontrollable@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.1.1.tgz#f67fed3ef93637126571809746323a9db815d556" + integrity sha512-EcPYhot3uWTS3w00R32R2+vS8Vr53tttrvMj/yA1uYRhf8hbTG2GyugGqWDY0qIskxn0uTTojVd6wPYW9ZEf8Q== + dependencies: + "@babel/runtime" "^7.6.3" + "@types/react" "^16.9.11" + invariant "^2.2.4" + react-lifecycles-compat "^3.0.4" + unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -4709,6 +4823,13 @@ vm-browserify@0.0.4: dependencies: indexof "0.0.1" +warning@^4.0.2, warning@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + watchpack@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"