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() {
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"