🚧 Commence l'ajout de calendrier #8
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace App\Http\Controllers;
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
use DateInterval;
|
||||||
use DateTime;
|
use DateTime;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\Auth;
|
use Illuminate\Support\Facades\Auth;
|
||||||
@ -47,6 +48,7 @@ class PageController extends Controller
|
|||||||
$user = Auth::user();
|
$user = Auth::user();
|
||||||
|
|
||||||
return view('pages.index', [
|
return view('pages.index', [
|
||||||
|
'start_date'=> min((new DateTime())->sub(new DateInterval('P1Y')), $user->created_at),
|
||||||
'checkword' => $user->checkword,
|
'checkword' => $user->checkword,
|
||||||
'pages' => $pages,
|
'pages' => $pages,
|
||||||
]);
|
]);
|
||||||
|
67
public/css/app.css
vendored
67
public/css/app.css
vendored
@ -12385,6 +12385,73 @@ select {
|
|||||||
.ease-in {
|
.ease-in {
|
||||||
transition-timing-function: cubic-bezier(0.4, 0, 1, 1);
|
transition-timing-function: cubic-bezier(0.4, 0, 1, 1);
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
* react-calendar-heatmap styles
|
||||||
|
*
|
||||||
|
* All of the styles in this file are optional and configurable!
|
||||||
|
* The github and gitlab color scales are provided for reference.
|
||||||
|
*/
|
||||||
|
@media all and (max-width: 768px) {
|
||||||
|
svg.react-calendar-heatmap {
|
||||||
|
transform: rotate(90deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.react-calendar-heatmap text {
|
||||||
|
font-size: 10px;
|
||||||
|
fill: #aaa;
|
||||||
|
}
|
||||||
|
.react-calendar-heatmap .react-calendar-heatmap-small-text {
|
||||||
|
font-size: 5px;
|
||||||
|
}
|
||||||
|
.react-calendar-heatmap rect:hover {
|
||||||
|
stroke: #555;
|
||||||
|
stroke-width: 1px;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Default color scale
|
||||||
|
*/
|
||||||
|
.react-calendar-heatmap .color-empty {
|
||||||
|
fill: #eeeeee;
|
||||||
|
}
|
||||||
|
.react-calendar-heatmap .color-filled {
|
||||||
|
fill: #8cc665;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Github color scale
|
||||||
|
*/
|
||||||
|
.react-calendar-heatmap .color-github-0 {
|
||||||
|
fill: #eeeeee;
|
||||||
|
}
|
||||||
|
.react-calendar-heatmap .color-github-1 {
|
||||||
|
fill: #d6e685;
|
||||||
|
}
|
||||||
|
.react-calendar-heatmap .color-github-2 {
|
||||||
|
fill: #8cc665;
|
||||||
|
}
|
||||||
|
.react-calendar-heatmap .color-github-3 {
|
||||||
|
fill: #44a340;
|
||||||
|
}
|
||||||
|
.react-calendar-heatmap .color-github-4 {
|
||||||
|
fill: #1e6823;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Gitlab color scale
|
||||||
|
*/
|
||||||
|
.react-calendar-heatmap .color-gitlab-0 {
|
||||||
|
fill: #ededed;
|
||||||
|
}
|
||||||
|
.react-calendar-heatmap .color-gitlab-1 {
|
||||||
|
fill: #acd5f2;
|
||||||
|
}
|
||||||
|
.react-calendar-heatmap .color-gitlab-2 {
|
||||||
|
fill: #7fa8d1;
|
||||||
|
}
|
||||||
|
.react-calendar-heatmap .color-gitlab-3 {
|
||||||
|
fill: #49729b;
|
||||||
|
}
|
||||||
|
.react-calendar-heatmap .color-gitlab-4 {
|
||||||
|
fill: #254e77;
|
||||||
|
}
|
||||||
.hover\:border-gray-300:hover {
|
.hover\:border-gray-300:hover {
|
||||||
--tw-border-opacity: 1;
|
--tw-border-opacity: 1;
|
||||||
border-color: rgb(209 213 219 / var(--tw-border-opacity));
|
border-color: rgb(209 213 219 / var(--tw-border-opacity));
|
||||||
|
524
public/js/app.js
vendored
524
public/js/app.js
vendored
@ -36044,6 +36044,387 @@ __webpack_require__(/*! ./components/user/First */ "./resources/js/components/us
|
|||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ "./resources/js/components/calendar/CalendarHeatmap.tsx":
|
||||||
|
/*!**************************************************************!*\
|
||||||
|
!*** ./resources/js/components/calendar/CalendarHeatmap.tsx ***!
|
||||||
|
\**************************************************************/
|
||||||
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
__webpack_require__.r(__webpack_exports__);
|
||||||
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
||||||
|
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
||||||
|
/* harmony export */ });
|
||||||
|
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||||||
|
/* harmony import */ var _constants_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constants.js */ "./resources/js/components/calendar/constants.js");
|
||||||
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils */ "./resources/js/utils.ts");
|
||||||
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
||||||
|
|
||||||
|
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
||||||
|
|
||||||
|
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
||||||
|
|
||||||
|
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
||||||
|
|
||||||
|
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
||||||
|
|
||||||
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var SQUARE_SIZE = 10;
|
||||||
|
var MONTH_LABEL_GUTTER_SIZE = 4;
|
||||||
|
var CSS_PSEUDO_NAMESPACE = 'react-calendar-heatmap-';
|
||||||
|
|
||||||
|
function CalendarHeatmap(_ref) {
|
||||||
|
var values = _ref.values,
|
||||||
|
startDate = _ref.startDate,
|
||||||
|
endDate = _ref.endDate,
|
||||||
|
gutterSize = _ref.gutterSize,
|
||||||
|
horizontal = _ref.horizontal,
|
||||||
|
showMonthLabels = _ref.showMonthLabels,
|
||||||
|
showWeekdayLabels = _ref.showWeekdayLabels,
|
||||||
|
showOutOfRangeDays = _ref.showOutOfRangeDays,
|
||||||
|
tooltipDataAttrs = _ref.tooltipDataAttrs,
|
||||||
|
onClick = _ref.onClick,
|
||||||
|
onMouseOver = _ref.onMouseOver,
|
||||||
|
onMouseLeave = _ref.onMouseLeave,
|
||||||
|
transformDayElement = _ref.transformDayElement;
|
||||||
|
var cachedValues = {};
|
||||||
|
|
||||||
|
for (var i in values) {
|
||||||
|
var value = values[i];
|
||||||
|
var date = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.convertToDate)(value.date);
|
||||||
|
var index = Math.floor((date.getTime() - getStartDateWithEmptyDays().getTime()) / _constants_js__WEBPACK_IMPORTED_MODULE_1__.MILLISECONDS_IN_ONE_DAY);
|
||||||
|
cachedValues[index] = {
|
||||||
|
date: value.date,
|
||||||
|
event: value.event,
|
||||||
|
className: classForValue(value.id),
|
||||||
|
title: titleForValue(value.id),
|
||||||
|
tooltipDataAttrs: getTooltipDataAttrsForValue(value.id)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function getDateDifferenceInDays() {
|
||||||
|
var timeDiff = getEndDate().getTime() - (0,_utils__WEBPACK_IMPORTED_MODULE_2__.convertToDate)(startDate).getTime();
|
||||||
|
return Math.ceil(timeDiff / _constants_js__WEBPACK_IMPORTED_MODULE_1__.MILLISECONDS_IN_ONE_DAY);
|
||||||
|
}
|
||||||
|
|
||||||
|
function classForValue(value) {
|
||||||
|
return value ? 'color-filled' : 'color-empty';
|
||||||
|
}
|
||||||
|
|
||||||
|
function titleForValue(value) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSquareSizeWithGutter() {
|
||||||
|
return SQUARE_SIZE + gutterSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getMonthLabelSize() {
|
||||||
|
if (!showMonthLabels) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (horizontal) {
|
||||||
|
return SQUARE_SIZE + MONTH_LABEL_GUTTER_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 2 * (SQUARE_SIZE + MONTH_LABEL_GUTTER_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getWeekdayLabelSize() {
|
||||||
|
if (!showWeekdayLabels) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (horizontal) {
|
||||||
|
return 30;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SQUARE_SIZE * 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getStartDate() {
|
||||||
|
return (0,_utils__WEBPACK_IMPORTED_MODULE_2__.shiftDate)(getEndDate(), -getDateDifferenceInDays() + 1); // +1 because endDate is inclusive
|
||||||
|
}
|
||||||
|
|
||||||
|
function getEndDate() {
|
||||||
|
return (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getBeginningTimeForDate)((0,_utils__WEBPACK_IMPORTED_MODULE_2__.convertToDate)(endDate));
|
||||||
|
}
|
||||||
|
|
||||||
|
function getStartDateWithEmptyDays() {
|
||||||
|
return (0,_utils__WEBPACK_IMPORTED_MODULE_2__.shiftDate)(getStartDate(), -getNumEmptyDaysAtStart());
|
||||||
|
}
|
||||||
|
|
||||||
|
function getNumEmptyDaysAtStart() {
|
||||||
|
return getStartDate().getDay();
|
||||||
|
}
|
||||||
|
|
||||||
|
function getNumEmptyDaysAtEnd() {
|
||||||
|
return _constants_js__WEBPACK_IMPORTED_MODULE_1__.DAYS_IN_WEEK - 1 - getEndDate().getDay();
|
||||||
|
}
|
||||||
|
|
||||||
|
function getWeekCount() {
|
||||||
|
var numDaysRoundedToWeek = getDateDifferenceInDays() + getNumEmptyDaysAtStart() + getNumEmptyDaysAtEnd();
|
||||||
|
return Math.ceil(numDaysRoundedToWeek / _constants_js__WEBPACK_IMPORTED_MODULE_1__.DAYS_IN_WEEK);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getWeekWidth() {
|
||||||
|
return _constants_js__WEBPACK_IMPORTED_MODULE_1__.DAYS_IN_WEEK * getSquareSizeWithGutter();
|
||||||
|
}
|
||||||
|
|
||||||
|
function getWidth() {
|
||||||
|
return getWeekCount() * getSquareSizeWithGutter() - (gutterSize - getWeekdayLabelSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
function getHeight() {
|
||||||
|
return getWeekWidth() + (getMonthLabelSize() - gutterSize) + getWeekdayLabelSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
function getValueForIndex(index) {
|
||||||
|
if (cachedValues[index]) {
|
||||||
|
console.log(index, cachedValues);
|
||||||
|
return cachedValues[index].event;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getClassNameForIndex(index) {
|
||||||
|
if (cachedValues[index]) {
|
||||||
|
return cachedValues[index].className;
|
||||||
|
}
|
||||||
|
|
||||||
|
return classForValue(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTitleForIndex(index) {
|
||||||
|
if (cachedValues[index]) {
|
||||||
|
return cachedValues[index].title;
|
||||||
|
}
|
||||||
|
|
||||||
|
return titleForValue ? titleForValue(null) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTooltipDataAttrsForIndex(index) {
|
||||||
|
if (cachedValues[index]) {
|
||||||
|
return cachedValues[index].tooltipDataAttrs;
|
||||||
|
}
|
||||||
|
|
||||||
|
return getTooltipDataAttrsForValue({
|
||||||
|
date: null,
|
||||||
|
count: null
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTooltipDataAttrsForValue(value) {
|
||||||
|
if (typeof tooltipDataAttrs === 'function') {
|
||||||
|
return tooltipDataAttrs(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
return tooltipDataAttrs;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTransformForWeek(weekIndex) {
|
||||||
|
if (horizontal) {
|
||||||
|
return "translate(".concat(weekIndex * getSquareSizeWithGutter(), ", 0)");
|
||||||
|
}
|
||||||
|
|
||||||
|
return "translate(0, ".concat(weekIndex * getSquareSizeWithGutter(), ")");
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTransformForWeekdayLabels() {
|
||||||
|
if (horizontal) {
|
||||||
|
return "translate(".concat(SQUARE_SIZE, ", ").concat(getMonthLabelSize(), ")");
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTransformForMonthLabels() {
|
||||||
|
if (horizontal) {
|
||||||
|
return "translate(".concat(getWeekdayLabelSize(), ", 0)");
|
||||||
|
}
|
||||||
|
|
||||||
|
return "translate(".concat(getWeekWidth() + MONTH_LABEL_GUTTER_SIZE, ", ").concat(getWeekdayLabelSize(), ")");
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTransformForAllWeeks() {
|
||||||
|
if (horizontal) {
|
||||||
|
return "translate(".concat(getWeekdayLabelSize(), ", ").concat(getMonthLabelSize(), ")");
|
||||||
|
}
|
||||||
|
|
||||||
|
return "translate(0, ".concat(getWeekdayLabelSize(), ")");
|
||||||
|
}
|
||||||
|
|
||||||
|
function getViewBox() {
|
||||||
|
if (horizontal) {
|
||||||
|
return "0 0 ".concat(getWidth(), " ").concat(getHeight());
|
||||||
|
}
|
||||||
|
|
||||||
|
return "0 0 ".concat(getHeight(), " ").concat(getWidth());
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSquareCoordinates(dayIndex) {
|
||||||
|
if (horizontal) {
|
||||||
|
return [0, dayIndex * getSquareSizeWithGutter()];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [dayIndex * getSquareSizeWithGutter(), 0];
|
||||||
|
}
|
||||||
|
|
||||||
|
function getWeekdayLabelCoordinates(dayIndex) {
|
||||||
|
if (horizontal) {
|
||||||
|
return [0, (dayIndex + 1) * SQUARE_SIZE + dayIndex * gutterSize];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [dayIndex * SQUARE_SIZE + dayIndex * gutterSize, SQUARE_SIZE];
|
||||||
|
}
|
||||||
|
|
||||||
|
function getMonthLabelCoordinates(weekIndex) {
|
||||||
|
if (horizontal) {
|
||||||
|
return [weekIndex * getSquareSizeWithGutter(), getMonthLabelSize() - MONTH_LABEL_GUTTER_SIZE];
|
||||||
|
}
|
||||||
|
|
||||||
|
var verticalOffset = -2;
|
||||||
|
return [0, (weekIndex + 1) * getSquareSizeWithGutter() + verticalOffset];
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleClick(value) {
|
||||||
|
if (onClick) {
|
||||||
|
onClick(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleMouseOver(e, value) {
|
||||||
|
if (onMouseOver) {
|
||||||
|
onMouseOver(e, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleMouseLeave(e, value) {
|
||||||
|
if (onMouseLeave) {
|
||||||
|
onMouseLeave(e, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderSquare(dayIndex, index) {
|
||||||
|
var indexOutOfRange = index < getNumEmptyDaysAtStart() || index >= getNumEmptyDaysAtStart() + getDateDifferenceInDays();
|
||||||
|
|
||||||
|
if (indexOutOfRange && !showOutOfRangeDays) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var _getSquareCoordinates = getSquareCoordinates(dayIndex),
|
||||||
|
_getSquareCoordinates2 = _slicedToArray(_getSquareCoordinates, 2),
|
||||||
|
x = _getSquareCoordinates2[0],
|
||||||
|
y = _getSquareCoordinates2[1];
|
||||||
|
|
||||||
|
var value = getValueForIndex(index);
|
||||||
|
var rect = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("rect", Object.assign({
|
||||||
|
key: index,
|
||||||
|
width: SQUARE_SIZE,
|
||||||
|
height: SQUARE_SIZE,
|
||||||
|
x: x,
|
||||||
|
y: y,
|
||||||
|
className: getClassNameForIndex(index),
|
||||||
|
onClick: function onClick() {
|
||||||
|
return handleClick(value);
|
||||||
|
},
|
||||||
|
onMouseOver: function onMouseOver(e) {
|
||||||
|
return handleMouseOver(e, value);
|
||||||
|
},
|
||||||
|
onMouseLeave: function onMouseLeave(e) {
|
||||||
|
return handleMouseLeave(e, value);
|
||||||
|
}
|
||||||
|
}, getTooltipDataAttrsForIndex(index)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("title", null, getTitleForIndex(index)));
|
||||||
|
return transformDayElement ? transformDayElement(rect, value, index) : rect;
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderWeek(weekIndex) {
|
||||||
|
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("g", {
|
||||||
|
key: weekIndex,
|
||||||
|
transform: getTransformForWeek(weekIndex),
|
||||||
|
className: "".concat(CSS_PSEUDO_NAMESPACE, "week")
|
||||||
|
}, (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getRange)(_constants_js__WEBPACK_IMPORTED_MODULE_1__.DAYS_IN_WEEK).map(function (dayIndex) {
|
||||||
|
return renderSquare(dayIndex, weekIndex * _constants_js__WEBPACK_IMPORTED_MODULE_1__.DAYS_IN_WEEK + dayIndex);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderAllWeeks() {
|
||||||
|
return (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getRange)(getWeekCount()).map(function (weekIndex) {
|
||||||
|
return renderWeek(weekIndex);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderMonthLabels() {
|
||||||
|
if (!showMonthLabels) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var weekRange = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getRange)(getWeekCount() - 1); // don't render for last week, because label will be cut off
|
||||||
|
|
||||||
|
return weekRange.map(function (weekIndex) {
|
||||||
|
var endOfWeek = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.shiftDate)(getStartDateWithEmptyDays(), (weekIndex + 1) * _constants_js__WEBPACK_IMPORTED_MODULE_1__.DAYS_IN_WEEK);
|
||||||
|
|
||||||
|
var _getMonthLabelCoordin = getMonthLabelCoordinates(weekIndex),
|
||||||
|
_getMonthLabelCoordin2 = _slicedToArray(_getMonthLabelCoordin, 2),
|
||||||
|
x = _getMonthLabelCoordin2[0],
|
||||||
|
y = _getMonthLabelCoordin2[1];
|
||||||
|
|
||||||
|
return endOfWeek.getDate() >= 1 && endOfWeek.getDate() <= _constants_js__WEBPACK_IMPORTED_MODULE_1__.DAYS_IN_WEEK ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("text", {
|
||||||
|
key: weekIndex,
|
||||||
|
x: x,
|
||||||
|
y: y,
|
||||||
|
className: "".concat(CSS_PSEUDO_NAMESPACE, "month-label")
|
||||||
|
}, _constants_js__WEBPACK_IMPORTED_MODULE_1__.MONTH_LABELS[endOfWeek.getMonth()]) : null;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderWeekdayLabels() {
|
||||||
|
if (!showWeekdayLabels) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _constants_js__WEBPACK_IMPORTED_MODULE_1__.DAY_LABELS.map(function (weekdayLabel, dayIndex) {
|
||||||
|
var _getWeekdayLabelCoord = getWeekdayLabelCoordinates(dayIndex),
|
||||||
|
_getWeekdayLabelCoord2 = _slicedToArray(_getWeekdayLabelCoord, 2),
|
||||||
|
x = _getWeekdayLabelCoord2[0],
|
||||||
|
y = _getWeekdayLabelCoord2[1];
|
||||||
|
|
||||||
|
var cssClasses = "".concat(horizontal ? '' : "".concat(CSS_PSEUDO_NAMESPACE, "small-text"), " ").concat(CSS_PSEUDO_NAMESPACE, "weekday-label"); // eslint-disable-next-line no-bitwise
|
||||||
|
|
||||||
|
return dayIndex & 1 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("text", {
|
||||||
|
key: "".concat(x).concat(y),
|
||||||
|
x: x,
|
||||||
|
y: y,
|
||||||
|
className: cssClasses
|
||||||
|
}, weekdayLabel) : null;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("svg", {
|
||||||
|
className: "react-calendar-heatmap",
|
||||||
|
viewBox: getViewBox()
|
||||||
|
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("g", {
|
||||||
|
transform: getTransformForMonthLabels(),
|
||||||
|
className: "".concat(CSS_PSEUDO_NAMESPACE, "month-labels")
|
||||||
|
}, renderMonthLabels()), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("g", {
|
||||||
|
transform: getTransformForAllWeeks(),
|
||||||
|
className: "".concat(CSS_PSEUDO_NAMESPACE, "all-weeks")
|
||||||
|
}, renderAllWeeks()), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("g", {
|
||||||
|
transform: getTransformForWeekdayLabels(),
|
||||||
|
className: "".concat(CSS_PSEUDO_NAMESPACE, "weekday-labels")
|
||||||
|
}, renderWeekdayLabels()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CalendarHeatmap);
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
/***/ "./resources/js/components/pages/App.tsx":
|
/***/ "./resources/js/components/pages/App.tsx":
|
||||||
/*!***********************************************!*\
|
/*!***********************************************!*\
|
||||||
!*** ./resources/js/components/pages/App.tsx ***!
|
!*** ./resources/js/components/pages/App.tsx ***!
|
||||||
@ -36059,15 +36440,16 @@ __webpack_require__.r(__webpack_exports__);
|
|||||||
/* harmony import */ var _List__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./List */ "./resources/js/components/pages/List.tsx");
|
/* harmony import */ var _List__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./List */ "./resources/js/components/pages/List.tsx");
|
||||||
/* harmony import */ var _Prompt__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Prompt */ "./resources/js/components/pages/Prompt.tsx");
|
/* harmony import */ var _Prompt__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Prompt */ "./resources/js/components/pages/Prompt.tsx");
|
||||||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
|
||||||
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/Alert/Alert.js");
|
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/Alert/Alert.js");
|
||||||
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/AlertTitle/AlertTitle.js");
|
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/AlertTitle/AlertTitle.js");
|
||||||
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/Button/Button.js");
|
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/Button/Button.js");
|
||||||
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/Divider/Divider.js");
|
/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/Divider/Divider.js");
|
||||||
/* harmony import */ var storage_encryption__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! storage-encryption */ "./node_modules/storage-encryption/build/index.js");
|
/* harmony import */ var storage_encryption__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! storage-encryption */ "./node_modules/storage-encryption/build/index.js");
|
||||||
/* harmony import */ var storage_encryption__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(storage_encryption__WEBPACK_IMPORTED_MODULE_4__);
|
/* harmony import */ var storage_encryption__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(storage_encryption__WEBPACK_IMPORTED_MODULE_4__);
|
||||||
/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react-router-dom */ "./node_modules/react-router/esm/react-router.js");
|
/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react-router-dom */ "./node_modules/react-router/esm/react-router.js");
|
||||||
/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! react-router-dom */ "./node_modules/react-router-dom/esm/react-router-dom.js");
|
/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! react-router-dom */ "./node_modules/react-router-dom/esm/react-router-dom.js");
|
||||||
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../utils */ "./resources/js/utils.ts");
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../utils */ "./resources/js/utils.ts");
|
||||||
|
/* harmony import */ var _calendar_CalendarHeatmap__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../calendar/CalendarHeatmap */ "./resources/js/components/calendar/CalendarHeatmap.tsx");
|
||||||
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
||||||
|
|
||||||
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
||||||
@ -36101,6 +36483,7 @@ var __rest = undefined && undefined.__rest || function (s, e) {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var app = document.getElementById('app');
|
var app = document.getElementById('app');
|
||||||
var word = "shikiryu"; // FIXME should be in db and ≠between users
|
var word = "shikiryu"; // FIXME should be in db and ≠between users
|
||||||
|
|
||||||
@ -36110,12 +36493,14 @@ var getPageContentUrl,
|
|||||||
postUrl,
|
postUrl,
|
||||||
removeUrl,
|
removeUrl,
|
||||||
checkword,
|
checkword,
|
||||||
|
startDate,
|
||||||
csrf = "";
|
csrf = "";
|
||||||
|
|
||||||
if (app) {
|
if (app) {
|
||||||
getPageContentUrl = "" + app.getAttribute('data-url');
|
getPageContentUrl = "" + app.getAttribute('data-url');
|
||||||
pages = JSON.parse("" + app.getAttribute('data-list'));
|
pages = JSON.parse("" + app.getAttribute('data-list'));
|
||||||
postUrl = "" + app.getAttribute('data-post');
|
postUrl = "" + app.getAttribute('data-post');
|
||||||
|
startDate = "" + app.getAttribute('data-start');
|
||||||
removeUrl = "" + app.getAttribute('data-remove');
|
removeUrl = "" + app.getAttribute('data-remove');
|
||||||
csrf = "" + app.getAttribute('data-csrf');
|
csrf = "" + app.getAttribute('data-csrf');
|
||||||
checkword = "" + app.getAttribute('data-checkword');
|
checkword = "" + app.getAttribute('data-checkword');
|
||||||
@ -36132,7 +36517,7 @@ function App() {
|
|||||||
passphrase = _React$useState4[0],
|
passphrase = _React$useState4[0],
|
||||||
setPassphrase = _React$useState4[1];
|
setPassphrase = _React$useState4[1];
|
||||||
|
|
||||||
var history = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_6__.useHistory)();
|
var history = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_7__.useHistory)();
|
||||||
|
|
||||||
var _React$useState5 = react__WEBPACK_IMPORTED_MODULE_3__.useState(checkPassphrase()),
|
var _React$useState5 = react__WEBPACK_IMPORTED_MODULE_3__.useState(checkPassphrase()),
|
||||||
_React$useState6 = _slicedToArray(_React$useState5, 2),
|
_React$useState6 = _slicedToArray(_React$useState5, 2),
|
||||||
@ -36192,16 +36577,16 @@ function App() {
|
|||||||
|
|
||||||
var Error = function Error() {
|
var Error = function Error() {
|
||||||
if (error) {
|
if (error) {
|
||||||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__["default"], {
|
||||||
severity: "error"
|
severity: "error"
|
||||||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__["default"], null, "Erreur"), "La phrase de passe ne correspond pas.");
|
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], null, "Erreur"), "La phrase de passe ne correspond pas.");
|
||||||
}
|
}
|
||||||
|
|
||||||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement("div", null);
|
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement("div", null);
|
||||||
};
|
};
|
||||||
|
|
||||||
var LoadButton = function LoadButton() {
|
var LoadButton = function LoadButton() {
|
||||||
return allLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(react__WEBPACK_IMPORTED_MODULE_3__.Fragment, null) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
return allLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(react__WEBPACK_IMPORTED_MODULE_3__.Fragment, null) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], {
|
||||||
variant: "outlined",
|
variant: "outlined",
|
||||||
size: "small",
|
size: "small",
|
||||||
sx: {
|
sx: {
|
||||||
@ -36214,8 +36599,8 @@ function App() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
var AuthButton = function AuthButton() {
|
var AuthButton = function AuthButton() {
|
||||||
var history = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_6__.useHistory)();
|
var history = (0,react_router_dom__WEBPACK_IMPORTED_MODULE_7__.useHistory)();
|
||||||
return user ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement("p", null, "Bienvenue !", " ", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
return user ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement("p", null, "Bienvenue !", " ", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], {
|
||||||
variant: "outlined",
|
variant: "outlined",
|
||||||
size: "small",
|
size: "small",
|
||||||
sx: {
|
sx: {
|
||||||
@ -36226,7 +36611,7 @@ function App() {
|
|||||||
return history.push("/diary/public");
|
return history.push("/diary/public");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, "Fermer mon carnet \xE0 clef")) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement("p", null, "Votre carnet est ferm\xE9.", " ", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_10__.Link, {
|
}, "Fermer mon carnet \xE0 clef")) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement("p", null, "Votre carnet est ferm\xE9.", " ", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_11__.Link, {
|
||||||
to: "/diary/public/pages"
|
to: "/diary/public/pages"
|
||||||
}, "Voir vos pages"));
|
}, "Voir vos pages"));
|
||||||
};
|
};
|
||||||
@ -36251,10 +36636,10 @@ function App() {
|
|||||||
var children = _a.children,
|
var children = _a.children,
|
||||||
rest = __rest(_a, ["children"]);
|
rest = __rest(_a, ["children"]);
|
||||||
|
|
||||||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_6__.Route, Object.assign({}, rest, {
|
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_7__.Route, Object.assign({}, rest, {
|
||||||
render: function render(_ref) {
|
render: function render(_ref) {
|
||||||
var location = _ref.location;
|
var location = _ref.location;
|
||||||
return user ? children : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_6__.Redirect, {
|
return user ? children : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_7__.Redirect, {
|
||||||
to: {
|
to: {
|
||||||
pathname: "/diary/public/pass",
|
pathname: "/diary/public/pass",
|
||||||
state: {
|
state: {
|
||||||
@ -36273,10 +36658,40 @@ function App() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getCalendarValuesFromPagesList(pages) {
|
||||||
|
return pages.map(function (page) {
|
||||||
|
var _page$date$split = page.date.split(" "),
|
||||||
|
_page$date$split2 = _slicedToArray(_page$date$split, 1),
|
||||||
|
date = _page$date$split2[0];
|
||||||
|
|
||||||
|
var splittedDate = date.split("/").map(function (part) {
|
||||||
|
return parseInt(part, 10);
|
||||||
|
});
|
||||||
|
return {
|
||||||
|
id: page.id,
|
||||||
|
date: new Date(splittedDate[2], splittedDate[1] - 1, splittedDate[0]),
|
||||||
|
event: page.id
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function ListPage() {
|
function ListPage() {
|
||||||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement("div", {
|
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement("div", {
|
||||||
className: "col-md-12"
|
className: "col-md-12"
|
||||||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(_List__WEBPACK_IMPORTED_MODULE_1__["default"], {
|
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(_calendar_CalendarHeatmap__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||||||
|
values: getCalendarValuesFromPagesList(listPages),
|
||||||
|
startDate: startDate,
|
||||||
|
endDate: new Date(),
|
||||||
|
showMonthLabels: true,
|
||||||
|
showWeekdayLabels: true,
|
||||||
|
showOutOfRangeDays: true,
|
||||||
|
horizontal: true,
|
||||||
|
gutterSize: 4,
|
||||||
|
onClick: function onClick(value) {
|
||||||
|
return alert(value);
|
||||||
|
},
|
||||||
|
tooltipDataAttrs: {}
|
||||||
|
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(_List__WEBPACK_IMPORTED_MODULE_1__["default"], {
|
||||||
pages: listPages,
|
pages: listPages,
|
||||||
url: getPageContentUrl,
|
url: getPageContentUrl,
|
||||||
passphrase: passphrase,
|
passphrase: passphrase,
|
||||||
@ -36284,7 +36699,7 @@ function App() {
|
|||||||
removeUrl: removeUrl,
|
removeUrl: removeUrl,
|
||||||
loadPages: loadPages,
|
loadPages: loadPages,
|
||||||
setAllLoaded: setAllLoaded
|
setAllLoaded: setAllLoaded
|
||||||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__["default"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(_Form__WEBPACK_IMPORTED_MODULE_0__["default"], {
|
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(_Form__WEBPACK_IMPORTED_MODULE_0__["default"], {
|
||||||
setListPages: setListPages,
|
setListPages: setListPages,
|
||||||
csrf: csrf,
|
csrf: csrf,
|
||||||
url: postUrl,
|
url: postUrl,
|
||||||
@ -36292,20 +36707,20 @@ function App() {
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(AuthButton, null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(LoadButton, null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(Error, null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__["default"], {
|
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(AuthButton, null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(LoadButton, null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(Error, null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], {
|
||||||
sx: {
|
sx: {
|
||||||
height: "20px",
|
height: "20px",
|
||||||
mb: "20px",
|
mb: "20px",
|
||||||
mt: "10px"
|
mt: "10px"
|
||||||
}
|
}
|
||||||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_6__.Switch, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_6__.Route, {
|
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_7__.Switch, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_7__.Route, {
|
||||||
path: "/diary/public/pass"
|
path: "/diary/public/pass"
|
||||||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(PromptPage, null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(PrivateRoute, {
|
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(PromptPage, null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(PrivateRoute, {
|
||||||
path: "/diary/public/pages"
|
path: "/diary/public/pages"
|
||||||
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(ListPage, null))));
|
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(ListPage, null))));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,react_router_dom__WEBPACK_IMPORTED_MODULE_6__.withRouter)(App));
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,react_router_dom__WEBPACK_IMPORTED_MODULE_7__.withRouter)(App));
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
@ -36542,6 +36957,10 @@ function PageForm(_ref) {
|
|||||||
}));
|
}));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function updateContent(value) {
|
||||||
|
setContent(value);
|
||||||
|
}
|
||||||
|
|
||||||
if (isPassphraseSet) {
|
if (isPassphraseSet) {
|
||||||
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement("form", {
|
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement("form", {
|
||||||
action: url,
|
action: url,
|
||||||
@ -36559,7 +36978,7 @@ function PageForm(_ref) {
|
|||||||
size: "small"
|
size: "small"
|
||||||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement(_uiw_react_md_editor__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement(_uiw_react_md_editor__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
||||||
value: content,
|
value: content,
|
||||||
onChange: setContent
|
onChange: updateContent
|
||||||
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
||||||
variant: "contained",
|
variant: "contained",
|
||||||
type: "submit"
|
type: "submit"
|
||||||
@ -37435,7 +37854,12 @@ function MobileMenu(_ref) {
|
|||||||
"use strict";
|
"use strict";
|
||||||
__webpack_require__.r(__webpack_exports__);
|
__webpack_require__.r(__webpack_exports__);
|
||||||
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
||||||
/* harmony export */ "isAllLoadedLocally": () => (/* binding */ isAllLoadedLocally)
|
/* harmony export */ "isAllLoadedLocally": () => (/* binding */ isAllLoadedLocally),
|
||||||
|
/* harmony export */ "shiftDate": () => (/* binding */ shiftDate),
|
||||||
|
/* harmony export */ "getBeginningTimeForDate": () => (/* binding */ getBeginningTimeForDate),
|
||||||
|
/* harmony export */ "convertToDate": () => (/* binding */ convertToDate),
|
||||||
|
/* harmony export */ "dateNDaysAgo": () => (/* binding */ dateNDaysAgo),
|
||||||
|
/* harmony export */ "getRange": () => (/* binding */ getRange)
|
||||||
/* harmony export */ });
|
/* harmony export */ });
|
||||||
var isAllLoadedLocally = function isAllLoadedLocally(pages) {
|
var isAllLoadedLocally = function isAllLoadedLocally(pages) {
|
||||||
for (var i in pages) {
|
for (var i in pages) {
|
||||||
@ -37448,6 +37872,40 @@ var isAllLoadedLocally = function isAllLoadedLocally(pages) {
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
/** CALENDAR **/
|
||||||
|
// returns a new date shifted a certain number of days (can be negative)
|
||||||
|
|
||||||
|
|
||||||
|
var shiftDate = function shiftDate(date, numDays) {
|
||||||
|
var newDate = new Date(date);
|
||||||
|
newDate.setDate(newDate.getDate() + numDays);
|
||||||
|
return newDate;
|
||||||
|
};
|
||||||
|
|
||||||
|
var getBeginningTimeForDate = function getBeginningTimeForDate(date) {
|
||||||
|
return new Date(date.getFullYear(), date.getMonth(), date.getDate());
|
||||||
|
}; // obj can be a parseable string, a millisecond timestamp, or a Date object
|
||||||
|
|
||||||
|
|
||||||
|
var convertToDate = function convertToDate(obj) {
|
||||||
|
return obj instanceof Date ? obj : new Date(obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
var dateNDaysAgo = function dateNDaysAgo(numDaysAgo) {
|
||||||
|
return shiftDate(new Date(), -numDaysAgo);
|
||||||
|
};
|
||||||
|
|
||||||
|
var getRange = function getRange(count) {
|
||||||
|
var arr = [];
|
||||||
|
|
||||||
|
for (var idx = 0; idx < count; idx += 1) {
|
||||||
|
arr.push(idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
return arr;
|
||||||
|
};
|
||||||
|
/** END CALENDAR **/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -37487,6 +37945,28 @@ window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
|
|||||||
// forceTLS: true
|
// forceTLS: true
|
||||||
// });
|
// });
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ "./resources/js/components/calendar/constants.js":
|
||||||
|
/*!*******************************************************!*\
|
||||||
|
!*** ./resources/js/components/calendar/constants.js ***!
|
||||||
|
\*******************************************************/
|
||||||
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
__webpack_require__.r(__webpack_exports__);
|
||||||
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
||||||
|
/* harmony export */ "MILLISECONDS_IN_ONE_DAY": () => (/* binding */ MILLISECONDS_IN_ONE_DAY),
|
||||||
|
/* harmony export */ "DAYS_IN_WEEK": () => (/* binding */ DAYS_IN_WEEK),
|
||||||
|
/* harmony export */ "MONTH_LABELS": () => (/* binding */ MONTH_LABELS),
|
||||||
|
/* harmony export */ "DAY_LABELS": () => (/* binding */ DAY_LABELS)
|
||||||
|
/* harmony export */ });
|
||||||
|
var MILLISECONDS_IN_ONE_DAY = 24 * 60 * 60 * 1000;
|
||||||
|
var DAYS_IN_WEEK = 7;
|
||||||
|
var MONTH_LABELS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
|
||||||
|
var DAY_LABELS = ['', 'Mon', '', 'Wed', '', 'Fri', ''];
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
/***/ "./node_modules/boolbase/index.js":
|
/***/ "./node_modules/boolbase/index.js":
|
||||||
|
79
resources/css/app.css
vendored
79
resources/css/app.css
vendored
@ -1,3 +1,82 @@
|
|||||||
@import 'tailwindcss/base';
|
@import 'tailwindcss/base';
|
||||||
@import 'tailwindcss/components';
|
@import 'tailwindcss/components';
|
||||||
@import 'tailwindcss/utilities';
|
@import 'tailwindcss/utilities';
|
||||||
|
|
||||||
|
/*
|
||||||
|
* react-calendar-heatmap styles
|
||||||
|
*
|
||||||
|
* All of the styles in this file are optional and configurable!
|
||||||
|
* The github and gitlab color scales are provided for reference.
|
||||||
|
*/
|
||||||
|
|
||||||
|
@media all and (max-width: 768px) {
|
||||||
|
svg.react-calendar-heatmap {
|
||||||
|
transform: rotate(90deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-calendar-heatmap text {
|
||||||
|
font-size: 10px;
|
||||||
|
fill: #aaa;
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-calendar-heatmap .react-calendar-heatmap-small-text {
|
||||||
|
font-size: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-calendar-heatmap rect:hover {
|
||||||
|
stroke: #555;
|
||||||
|
stroke-width: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Default color scale
|
||||||
|
*/
|
||||||
|
|
||||||
|
.react-calendar-heatmap .color-empty {
|
||||||
|
fill: #eeeeee;
|
||||||
|
}
|
||||||
|
|
||||||
|
.react-calendar-heatmap .color-filled {
|
||||||
|
fill: #8cc665;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Github color scale
|
||||||
|
*/
|
||||||
|
|
||||||
|
.react-calendar-heatmap .color-github-0 {
|
||||||
|
fill: #eeeeee;
|
||||||
|
}
|
||||||
|
.react-calendar-heatmap .color-github-1 {
|
||||||
|
fill: #d6e685;
|
||||||
|
}
|
||||||
|
.react-calendar-heatmap .color-github-2 {
|
||||||
|
fill: #8cc665;
|
||||||
|
}
|
||||||
|
.react-calendar-heatmap .color-github-3 {
|
||||||
|
fill: #44a340;
|
||||||
|
}
|
||||||
|
.react-calendar-heatmap .color-github-4 {
|
||||||
|
fill: #1e6823;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Gitlab color scale
|
||||||
|
*/
|
||||||
|
|
||||||
|
.react-calendar-heatmap .color-gitlab-0 {
|
||||||
|
fill: #ededed;
|
||||||
|
}
|
||||||
|
.react-calendar-heatmap .color-gitlab-1 {
|
||||||
|
fill: #acd5f2;
|
||||||
|
}
|
||||||
|
.react-calendar-heatmap .color-gitlab-2 {
|
||||||
|
fill: #7fa8d1;
|
||||||
|
}
|
||||||
|
.react-calendar-heatmap .color-gitlab-3 {
|
||||||
|
fill: #49729b;
|
||||||
|
}
|
||||||
|
.react-calendar-heatmap .color-gitlab-4 {
|
||||||
|
fill: #254e77;
|
||||||
|
}
|
||||||
|
335
resources/js/components/calendar/CalendarHeatmap.tsx
Normal file
335
resources/js/components/calendar/CalendarHeatmap.tsx
Normal file
@ -0,0 +1,335 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { DAYS_IN_WEEK, MILLISECONDS_IN_ONE_DAY, DAY_LABELS, MONTH_LABELS } from './constants.js';
|
||||||
|
import {
|
||||||
|
shiftDate,
|
||||||
|
getBeginningTimeForDate,
|
||||||
|
convertToDate,
|
||||||
|
getRange,
|
||||||
|
} from "../../utils";
|
||||||
|
import {CalendarHeatmapProp} from "./CalendarHeatmapProp";
|
||||||
|
|
||||||
|
const SQUARE_SIZE = 10;
|
||||||
|
const MONTH_LABEL_GUTTER_SIZE = 4;
|
||||||
|
const CSS_PSEUDO_NAMESPACE = 'react-calendar-heatmap-';
|
||||||
|
|
||||||
|
function CalendarHeatmap({
|
||||||
|
values, startDate, endDate, gutterSize, horizontal,
|
||||||
|
showMonthLabels, showWeekdayLabels, showOutOfRangeDays, tooltipDataAttrs,
|
||||||
|
onClick, onMouseOver, onMouseLeave, transformDayElement
|
||||||
|
}: CalendarHeatmapProp) {
|
||||||
|
|
||||||
|
const cachedValues = {};
|
||||||
|
for (const i in values) {
|
||||||
|
const value = values[i];
|
||||||
|
const date = convertToDate(value.date);
|
||||||
|
const index = Math.floor((date.getTime() - getStartDateWithEmptyDays().getTime()) / MILLISECONDS_IN_ONE_DAY);
|
||||||
|
cachedValues[index] = {
|
||||||
|
date: value.date,
|
||||||
|
event: value.event,
|
||||||
|
className: classForValue(value.id),
|
||||||
|
title: titleForValue(value.id),
|
||||||
|
tooltipDataAttrs: getTooltipDataAttrsForValue(value.id),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function getDateDifferenceInDays() {
|
||||||
|
const timeDiff = getEndDate().getTime() - convertToDate(startDate).getTime();
|
||||||
|
return Math.ceil(timeDiff / MILLISECONDS_IN_ONE_DAY);
|
||||||
|
}
|
||||||
|
|
||||||
|
function classForValue(value) {
|
||||||
|
return value ? 'color-filled' : 'color-empty';
|
||||||
|
}
|
||||||
|
|
||||||
|
function titleForValue(value) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSquareSizeWithGutter() {
|
||||||
|
return SQUARE_SIZE + gutterSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getMonthLabelSize() {
|
||||||
|
if (!showMonthLabels) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (horizontal) {
|
||||||
|
return SQUARE_SIZE + MONTH_LABEL_GUTTER_SIZE;
|
||||||
|
}
|
||||||
|
return 2 * (SQUARE_SIZE + MONTH_LABEL_GUTTER_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getWeekdayLabelSize() {
|
||||||
|
if (!showWeekdayLabels) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (horizontal) {
|
||||||
|
return 30;
|
||||||
|
}
|
||||||
|
return SQUARE_SIZE * 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getStartDate() {
|
||||||
|
return shiftDate(getEndDate(), -getDateDifferenceInDays() + 1); // +1 because endDate is inclusive
|
||||||
|
}
|
||||||
|
|
||||||
|
function getEndDate(): Date {
|
||||||
|
return getBeginningTimeForDate(convertToDate(endDate));
|
||||||
|
}
|
||||||
|
|
||||||
|
function getStartDateWithEmptyDays() {
|
||||||
|
return shiftDate(getStartDate(), -getNumEmptyDaysAtStart());
|
||||||
|
}
|
||||||
|
|
||||||
|
function getNumEmptyDaysAtStart() {
|
||||||
|
return getStartDate().getDay();
|
||||||
|
}
|
||||||
|
|
||||||
|
function getNumEmptyDaysAtEnd() {
|
||||||
|
return DAYS_IN_WEEK - 1 - getEndDate().getDay();
|
||||||
|
}
|
||||||
|
|
||||||
|
function getWeekCount() {
|
||||||
|
const numDaysRoundedToWeek =
|
||||||
|
getDateDifferenceInDays() + getNumEmptyDaysAtStart() + getNumEmptyDaysAtEnd();
|
||||||
|
return Math.ceil(numDaysRoundedToWeek / DAYS_IN_WEEK);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getWeekWidth() {
|
||||||
|
return DAYS_IN_WEEK * getSquareSizeWithGutter();
|
||||||
|
}
|
||||||
|
|
||||||
|
function getWidth() {
|
||||||
|
return (
|
||||||
|
getWeekCount() * getSquareSizeWithGutter() -
|
||||||
|
(gutterSize - getWeekdayLabelSize())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getHeight() {
|
||||||
|
return (
|
||||||
|
getWeekWidth() +
|
||||||
|
(getMonthLabelSize() - gutterSize) +
|
||||||
|
getWeekdayLabelSize()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getValueForIndex(index) {
|
||||||
|
if (cachedValues[index]) {
|
||||||
|
console.log(index, cachedValues);
|
||||||
|
return cachedValues[index].event;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getClassNameForIndex(index) {
|
||||||
|
if (cachedValues[index]) {
|
||||||
|
return cachedValues[index].className;
|
||||||
|
}
|
||||||
|
return classForValue(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTitleForIndex(index) {
|
||||||
|
if (cachedValues[index]) {
|
||||||
|
return cachedValues[index].title;
|
||||||
|
}
|
||||||
|
return titleForValue ? titleForValue(null) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTooltipDataAttrsForIndex(index) {
|
||||||
|
if (cachedValues[index]) {
|
||||||
|
return cachedValues[index].tooltipDataAttrs;
|
||||||
|
}
|
||||||
|
return getTooltipDataAttrsForValue({ date: null, count: null });
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTooltipDataAttrsForValue(value) {
|
||||||
|
if (typeof tooltipDataAttrs === 'function') {
|
||||||
|
return tooltipDataAttrs(value);
|
||||||
|
}
|
||||||
|
return tooltipDataAttrs;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTransformForWeek(weekIndex) {
|
||||||
|
if (horizontal) {
|
||||||
|
return `translate(${weekIndex * getSquareSizeWithGutter()}, 0)`;
|
||||||
|
}
|
||||||
|
return `translate(0, ${weekIndex * getSquareSizeWithGutter()})`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTransformForWeekdayLabels() {
|
||||||
|
if (horizontal) {
|
||||||
|
return `translate(${SQUARE_SIZE}, ${getMonthLabelSize()})`;
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTransformForMonthLabels() {
|
||||||
|
if (horizontal) {
|
||||||
|
return `translate(${getWeekdayLabelSize()}, 0)`;
|
||||||
|
}
|
||||||
|
return `translate(${getWeekWidth() + MONTH_LABEL_GUTTER_SIZE}, ${getWeekdayLabelSize()})`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTransformForAllWeeks() {
|
||||||
|
if (horizontal) {
|
||||||
|
return `translate(${getWeekdayLabelSize()}, ${getMonthLabelSize()})`;
|
||||||
|
}
|
||||||
|
return `translate(0, ${getWeekdayLabelSize()})`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getViewBox() {
|
||||||
|
if (horizontal) {
|
||||||
|
return `0 0 ${getWidth()} ${getHeight()}`;
|
||||||
|
}
|
||||||
|
return `0 0 ${getHeight()} ${getWidth()}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSquareCoordinates(dayIndex) {
|
||||||
|
if (horizontal) {
|
||||||
|
return [0, dayIndex * getSquareSizeWithGutter()];
|
||||||
|
}
|
||||||
|
return [dayIndex * getSquareSizeWithGutter(), 0];
|
||||||
|
}
|
||||||
|
|
||||||
|
function getWeekdayLabelCoordinates(dayIndex) {
|
||||||
|
if (horizontal) {
|
||||||
|
return [0, (dayIndex + 1) * SQUARE_SIZE + dayIndex * gutterSize];
|
||||||
|
}
|
||||||
|
return [dayIndex * SQUARE_SIZE + dayIndex * gutterSize, SQUARE_SIZE];
|
||||||
|
}
|
||||||
|
|
||||||
|
function getMonthLabelCoordinates(weekIndex) {
|
||||||
|
if (horizontal) {
|
||||||
|
return [
|
||||||
|
weekIndex * getSquareSizeWithGutter(),
|
||||||
|
getMonthLabelSize() - MONTH_LABEL_GUTTER_SIZE,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
const verticalOffset = -2;
|
||||||
|
return [0, (weekIndex + 1) * getSquareSizeWithGutter() + verticalOffset];
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleClick(value) {
|
||||||
|
if (onClick) {
|
||||||
|
onClick(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleMouseOver(e, value) {
|
||||||
|
if (onMouseOver) {
|
||||||
|
onMouseOver(e, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleMouseLeave(e, value) {
|
||||||
|
if (onMouseLeave) {
|
||||||
|
onMouseLeave(e, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderSquare(dayIndex, index) {
|
||||||
|
const indexOutOfRange =
|
||||||
|
index < getNumEmptyDaysAtStart() ||
|
||||||
|
index >= getNumEmptyDaysAtStart() + getDateDifferenceInDays();
|
||||||
|
if (indexOutOfRange && !showOutOfRangeDays) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
const [x, y] = getSquareCoordinates(dayIndex);
|
||||||
|
const value = getValueForIndex(index);
|
||||||
|
const rect = (
|
||||||
|
<rect
|
||||||
|
key={index}
|
||||||
|
width={SQUARE_SIZE}
|
||||||
|
height={SQUARE_SIZE}
|
||||||
|
x={x}
|
||||||
|
y={y}
|
||||||
|
className={getClassNameForIndex(index)}
|
||||||
|
onClick={() => handleClick(value)}
|
||||||
|
onMouseOver={(e) => handleMouseOver(e, value)}
|
||||||
|
onMouseLeave={(e) => handleMouseLeave(e, value)}
|
||||||
|
{...getTooltipDataAttrsForIndex(index)}
|
||||||
|
>
|
||||||
|
<title>{getTitleForIndex(index)}</title>
|
||||||
|
</rect>
|
||||||
|
);
|
||||||
|
return transformDayElement ? transformDayElement(rect, value as string, index) : rect;
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderWeek(weekIndex) {
|
||||||
|
return (
|
||||||
|
<g
|
||||||
|
key={weekIndex}
|
||||||
|
transform={getTransformForWeek(weekIndex)}
|
||||||
|
className={`${CSS_PSEUDO_NAMESPACE}week`}
|
||||||
|
>
|
||||||
|
{getRange(DAYS_IN_WEEK).map((dayIndex) =>
|
||||||
|
renderSquare(dayIndex, weekIndex * DAYS_IN_WEEK + dayIndex),
|
||||||
|
)}
|
||||||
|
</g>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderAllWeeks() {
|
||||||
|
return getRange(getWeekCount()).map((weekIndex) => renderWeek(weekIndex));
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderMonthLabels() {
|
||||||
|
if (!showMonthLabels) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
const weekRange = getRange(getWeekCount() - 1); // don't render for last week, because label will be cut off
|
||||||
|
return weekRange.map((weekIndex) => {
|
||||||
|
const endOfWeek = shiftDate(getStartDateWithEmptyDays(), (weekIndex + 1) * DAYS_IN_WEEK);
|
||||||
|
const [x, y] = getMonthLabelCoordinates(weekIndex);
|
||||||
|
return endOfWeek.getDate() >= 1 && endOfWeek.getDate() <= DAYS_IN_WEEK ? (
|
||||||
|
<text key={weekIndex} x={x} y={y} className={`${CSS_PSEUDO_NAMESPACE}month-label`}>
|
||||||
|
{MONTH_LABELS[endOfWeek.getMonth()]}
|
||||||
|
</text>
|
||||||
|
) : null;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderWeekdayLabels() {
|
||||||
|
if (!showWeekdayLabels) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return DAY_LABELS.map((weekdayLabel, dayIndex) => {
|
||||||
|
const [x, y] = getWeekdayLabelCoordinates(dayIndex);
|
||||||
|
const cssClasses = `${
|
||||||
|
horizontal ? '' : `${CSS_PSEUDO_NAMESPACE}small-text`
|
||||||
|
} ${CSS_PSEUDO_NAMESPACE}weekday-label`;
|
||||||
|
// eslint-disable-next-line no-bitwise
|
||||||
|
return dayIndex & 1 ? (
|
||||||
|
<text key={`${x}${y}`} x={x} y={y} className={cssClasses}>
|
||||||
|
{weekdayLabel}
|
||||||
|
</text>
|
||||||
|
) : null;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<svg className="react-calendar-heatmap" viewBox={getViewBox()}>
|
||||||
|
<g
|
||||||
|
transform={getTransformForMonthLabels()}
|
||||||
|
className={`${CSS_PSEUDO_NAMESPACE}month-labels`}
|
||||||
|
>
|
||||||
|
{renderMonthLabels()}
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform={getTransformForAllWeeks()}
|
||||||
|
className={`${CSS_PSEUDO_NAMESPACE}all-weeks`}
|
||||||
|
>
|
||||||
|
{renderAllWeeks()}
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform={getTransformForWeekdayLabels()}
|
||||||
|
className={`${CSS_PSEUDO_NAMESPACE}weekday-labels`}
|
||||||
|
>
|
||||||
|
{renderWeekdayLabels()}
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default CalendarHeatmap;
|
19
resources/js/components/calendar/CalendarHeatmapProp.ts
Normal file
19
resources/js/components/calendar/CalendarHeatmapProp.ts
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import {CalendarHeatmapValuesProp} from "./CalendarHeatmapValuesProp";
|
||||||
|
import {ReactEventHandler} from "react";
|
||||||
|
|
||||||
|
export interface CalendarHeatmapProp {
|
||||||
|
values: CalendarHeatmapValuesProp[]; // array of objects with date and arbitrary metadata
|
||||||
|
startDate: Date; // start of date range
|
||||||
|
endDate: Date; // end of date range
|
||||||
|
gutterSize: number; // size of space between squares
|
||||||
|
horizontal: boolean; // whether to orient horizontally or vertically
|
||||||
|
showMonthLabels: boolean; // whether to show month labels
|
||||||
|
showWeekdayLabels: boolean; // whether to show weekday labels
|
||||||
|
showOutOfRangeDays: boolean; // whether to render squares for extra days in week after endDate, and before start date
|
||||||
|
tooltipDataAttrs: object; // data attributes to add to square for setting 3rd party tooltips, e.g. { 'data-toggle': 'tooltip' } for bootstrap tooltips
|
||||||
|
onClick: (v:string) => void; // callback function when a square is clicked
|
||||||
|
onMouseOver?: (e:ReactEventHandler, v:string) => void; // callback function when mouse pointer is over a square
|
||||||
|
onMouseLeave?: (e:ReactEventHandler, v:string) => void; // callback function when mouse pointer is left a square
|
||||||
|
transformDayElement?: (element:JSX.Element, v:string, i:number) => void; // function to further transform the svg element for a single day
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,5 @@
|
|||||||
|
export interface CalendarHeatmapValuesProp {
|
||||||
|
id: string;
|
||||||
|
date: Date;
|
||||||
|
event: string;
|
||||||
|
}
|
22
resources/js/components/calendar/constants.js
vendored
Normal file
22
resources/js/components/calendar/constants.js
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
const MILLISECONDS_IN_ONE_DAY = 24 * 60 * 60 * 1000;
|
||||||
|
|
||||||
|
const DAYS_IN_WEEK = 7;
|
||||||
|
|
||||||
|
const MONTH_LABELS = [
|
||||||
|
'Jan',
|
||||||
|
'Feb',
|
||||||
|
'Mar',
|
||||||
|
'Apr',
|
||||||
|
'May',
|
||||||
|
'Jun',
|
||||||
|
'Jul',
|
||||||
|
'Aug',
|
||||||
|
'Sep',
|
||||||
|
'Oct',
|
||||||
|
'Nov',
|
||||||
|
'Dec',
|
||||||
|
];
|
||||||
|
|
||||||
|
const DAY_LABELS = ['', 'Mon', '', 'Wed', '', 'Fri', ''];
|
||||||
|
|
||||||
|
export { MILLISECONDS_IN_ONE_DAY, DAYS_IN_WEEK, MONTH_LABELS, DAY_LABELS };
|
@ -14,6 +14,8 @@ import {
|
|||||||
} from "react-router-dom";
|
} from "react-router-dom";
|
||||||
import {IList} from "../../interfaces/IList";
|
import {IList} from "../../interfaces/IList";
|
||||||
import {isAllLoadedLocally} from "../../utils";
|
import {isAllLoadedLocally} from "../../utils";
|
||||||
|
import CalendarHeatmap from "../calendar/CalendarHeatmap";
|
||||||
|
import {CalendarHeatmapValuesProp} from "../calendar/CalendarHeatmapValuesProp";
|
||||||
|
|
||||||
const app = document.getElementById('app');
|
const app = document.getElementById('app');
|
||||||
const word = "shikiryu"; // FIXME should be in db and ≠between users
|
const word = "shikiryu"; // FIXME should be in db and ≠between users
|
||||||
@ -24,12 +26,14 @@ let getPageContentUrl,
|
|||||||
postUrl,
|
postUrl,
|
||||||
removeUrl,
|
removeUrl,
|
||||||
checkword,
|
checkword,
|
||||||
|
startDate,
|
||||||
csrf = "";
|
csrf = "";
|
||||||
|
|
||||||
if (app) {
|
if (app) {
|
||||||
getPageContentUrl = "" + app.getAttribute('data-url');
|
getPageContentUrl = "" + app.getAttribute('data-url');
|
||||||
pages = JSON.parse("" + app.getAttribute('data-list')) as IList[];
|
pages = JSON.parse("" + app.getAttribute('data-list')) as IList[];
|
||||||
postUrl = "" + app.getAttribute('data-post');
|
postUrl = "" + app.getAttribute('data-post');
|
||||||
|
startDate = "" + app.getAttribute('data-start');
|
||||||
removeUrl = "" + app.getAttribute('data-remove');
|
removeUrl = "" + app.getAttribute('data-remove');
|
||||||
csrf = "" + app.getAttribute('data-csrf');
|
csrf = "" + app.getAttribute('data-csrf');
|
||||||
checkword = "" + app.getAttribute('data-checkword');
|
checkword = "" + app.getAttribute('data-checkword');
|
||||||
@ -157,9 +161,33 @@ function App() {
|
|||||||
return (<Prompt open={true} setOpen={updatePassphrase}/>);
|
return (<Prompt open={true} setOpen={updatePassphrase}/>);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getCalendarValuesFromPagesList(pages: IList[]): CalendarHeatmapValuesProp[] {
|
||||||
|
return pages.map(page => {
|
||||||
|
const [date, ] = page.date.split(" ");
|
||||||
|
const splittedDate = date.split("/").map(part => { return parseInt(part, 10);});
|
||||||
|
return {
|
||||||
|
id: page.id,
|
||||||
|
date: new Date(splittedDate[2] as number, splittedDate[1] - 1, splittedDate[0] as number),
|
||||||
|
event: page.id
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function ListPage() {
|
function ListPage() {
|
||||||
return (
|
return (
|
||||||
<div className="col-md-12">
|
<div className="col-md-12">
|
||||||
|
<CalendarHeatmap
|
||||||
|
values={getCalendarValuesFromPagesList(listPages)}
|
||||||
|
startDate={startDate}
|
||||||
|
endDate={new Date()}
|
||||||
|
showMonthLabels={true}
|
||||||
|
showWeekdayLabels={true}
|
||||||
|
showOutOfRangeDays={true}
|
||||||
|
horizontal={true}
|
||||||
|
gutterSize={4}
|
||||||
|
onClick={(value) => alert(value)}
|
||||||
|
tooltipDataAttrs={{}}
|
||||||
|
/>
|
||||||
<Pages
|
<Pages
|
||||||
pages={listPages}
|
pages={listPages}
|
||||||
url={getPageContentUrl}
|
url={getPageContentUrl}
|
||||||
|
@ -6,7 +6,7 @@ let encryptStorage = new EncryptStorage('test'); // TODO la clef doit venir de l
|
|||||||
|
|
||||||
export default function PageForm({setListPages, csrf, url, passphrase}) {
|
export default function PageForm({setListPages, csrf, url, passphrase}) {
|
||||||
const isPassphraseSet = passphrase !== null;
|
const isPassphraseSet = passphrase !== null;
|
||||||
const [content, setContent] = React.useState("");
|
const [content, setContent] = React.useState<string>("");
|
||||||
const onSubmit = async (event: React.FormEvent<HTMLFormElement>) => {
|
const onSubmit = async (event: React.FormEvent<HTMLFormElement>) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
encryptStorage = new EncryptStorage(passphrase);
|
encryptStorage = new EncryptStorage(passphrase);
|
||||||
@ -56,6 +56,9 @@ export default function PageForm({setListPages, csrf, url, passphrase}) {
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
function updateContent(value: string|undefined): void {
|
||||||
|
setContent(value as string);
|
||||||
|
}
|
||||||
|
|
||||||
if (isPassphraseSet) {
|
if (isPassphraseSet) {
|
||||||
return (
|
return (
|
||||||
@ -73,7 +76,7 @@ export default function PageForm({setListPages, csrf, url, passphrase}) {
|
|||||||
/>
|
/>
|
||||||
<MDEditor
|
<MDEditor
|
||||||
value={content}
|
value={content}
|
||||||
onChange={setContent}
|
onChange={updateContent}
|
||||||
/>
|
/>
|
||||||
<Button variant="contained" type={"submit"}>
|
<Button variant="contained" type={"submit"}>
|
||||||
Enregistrer
|
Enregistrer
|
||||||
|
@ -11,4 +11,36 @@ const isAllLoadedLocally = function(pages: IList[]) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
export { isAllLoadedLocally };
|
/** CALENDAR **/
|
||||||
|
// returns a new date shifted a certain number of days (can be negative)
|
||||||
|
const shiftDate = function(date, numDays) {
|
||||||
|
const newDate = new Date(date);
|
||||||
|
newDate.setDate(newDate.getDate() + numDays);
|
||||||
|
return newDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
const getBeginningTimeForDate = function(date: Date): Date {
|
||||||
|
return new Date(date.getFullYear(), date.getMonth(), date.getDate());
|
||||||
|
}
|
||||||
|
|
||||||
|
// obj can be a parseable string, a millisecond timestamp, or a Date object
|
||||||
|
const convertToDate = function(obj): Date {
|
||||||
|
return obj instanceof Date ? obj : new Date(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
const dateNDaysAgo = function(numDaysAgo) {
|
||||||
|
return shiftDate(new Date(), -numDaysAgo);
|
||||||
|
}
|
||||||
|
|
||||||
|
const getRange = function(count) {
|
||||||
|
const arr: number[] = [];
|
||||||
|
for (let idx = 0; idx < count; idx += 1) {
|
||||||
|
arr.push(idx);
|
||||||
|
}
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** END CALENDAR **/
|
||||||
|
|
||||||
|
|
||||||
|
export { isAllLoadedLocally, shiftDate, getBeginningTimeForDate, convertToDate, dateNDaysAgo, getRange };
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
<div class="bg-white overflow-hidden shadow-sm sm:rounded-lg">
|
<div class="bg-white overflow-hidden shadow-sm sm:rounded-lg">
|
||||||
<div class="p-6 bg-white border-b border-gray-200">
|
<div class="p-6 bg-white border-b border-gray-200">
|
||||||
<div id="app"
|
<div id="app"
|
||||||
|
data-start="{{ $start_date->format('Y-m-d') }}"
|
||||||
data-list="{{json_encode($pages)}}"
|
data-list="{{json_encode($pages)}}"
|
||||||
data-url="{{ route('pages.show', ['page' => 'replace_me']) }}"
|
data-url="{{ route('pages.show', ['page' => 'replace_me']) }}"
|
||||||
data-post="{{ route('pages.store') }}"
|
data-post="{{ route('pages.store') }}"
|
||||||
|
Loading…
Reference in New Issue
Block a user