diff --git a/packages/customWidgets/calendar-web/package.json b/packages/customWidgets/calendar-web/package.json
index a34df76e1f..589b124f98 100644
--- a/packages/customWidgets/calendar-web/package.json
+++ b/packages/customWidgets/calendar-web/package.json
@@ -67,5 +67,8 @@
"react-big-calendar": "0.19.2",
"react-dnd": "2.6.0",
"react-dnd-html5-backend": "^5.0.1"
+ },
+ "patchedDependencies": {
+ "react-big-calendar@0.19.2": "patches/react-big-calendar@0.19.2.patch"
}
}
diff --git a/packages/pluggableWidgets/calendar-web/.eslintrc.json b/packages/pluggableWidgets/calendar-web/.eslintrc.json
new file mode 100644
index 0000000000..4c04d85747
--- /dev/null
+++ b/packages/pluggableWidgets/calendar-web/.eslintrc.json
@@ -0,0 +1,4 @@
+{
+ "root": true,
+ "extends": ["@mendix/eslint-config-web-widgets/widget-ts"]
+}
diff --git a/packages/pluggableWidgets/calendar-web/.prettierrc.js b/packages/pluggableWidgets/calendar-web/.prettierrc.js
new file mode 100644
index 0000000000..0892704ab0
--- /dev/null
+++ b/packages/pluggableWidgets/calendar-web/.prettierrc.js
@@ -0,0 +1 @@
+module.exports = require("@mendix/prettier-config-web-widgets");
diff --git a/packages/pluggableWidgets/calendar-web/CHANGELOG.md b/packages/pluggableWidgets/calendar-web/CHANGELOG.md
new file mode 100644
index 0000000000..2fa9989a52
--- /dev/null
+++ b/packages/pluggableWidgets/calendar-web/CHANGELOG.md
@@ -0,0 +1,11 @@
+# Changelog
+
+All notable changes to this widget will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## [Unreleased]
+
+### Added
+
+- initial version of calendar widget.
diff --git a/packages/pluggableWidgets/calendar-web/README.md b/packages/pluggableWidgets/calendar-web/README.md
new file mode 100644
index 0000000000..1728bf4413
--- /dev/null
+++ b/packages/pluggableWidgets/calendar-web/README.md
@@ -0,0 +1,3 @@
+
+
+Please see [Calendar](https://docs.mendix.com/appstore/widgets/) in the Mendix documentation for details.
diff --git a/packages/pluggableWidgets/calendar-web/cypress.config.cjs b/packages/pluggableWidgets/calendar-web/cypress.config.cjs
new file mode 100644
index 0000000000..f5388c3dfd
--- /dev/null
+++ b/packages/pluggableWidgets/calendar-web/cypress.config.cjs
@@ -0,0 +1 @@
+module.exports = require("@mendix/run-e2e/cypress.config.cjs");
diff --git a/packages/pluggableWidgets/calendar-web/jest.config.js b/packages/pluggableWidgets/calendar-web/jest.config.js
new file mode 100644
index 0000000000..4b623cc8e0
--- /dev/null
+++ b/packages/pluggableWidgets/calendar-web/jest.config.js
@@ -0,0 +1,9 @@
+const { join } = require("path");
+const base = require("@mendix/pluggable-widgets-tools/test-config/jest.config");
+
+module.exports = {
+ ...base,
+ moduleNameMapper: {
+ ...base.moduleNameMapper
+ }
+};
diff --git a/packages/pluggableWidgets/calendar-web/package.json b/packages/pluggableWidgets/calendar-web/package.json
new file mode 100644
index 0000000000..d35e205836
--- /dev/null
+++ b/packages/pluggableWidgets/calendar-web/package.json
@@ -0,0 +1,66 @@
+{
+ "name": "@mendix/calendar-web",
+ "widgetName": "Calendar",
+ "version": "1.0.0",
+ "description": "Calendar",
+ "copyright": "© Mendix Technology BV 2025. All rights reserved.",
+ "license": "Apache-2.0",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/mendix/web-widgets.git"
+ },
+ "config": {
+ "mendixHost": "http://localhost:8080",
+ "developmentPort": 3000
+ },
+ "mxpackage": {
+ "name": "Calendar",
+ "type": "widget",
+ "mpkName": "com.mendix.widget.web.calendar.mpk"
+ },
+ "marketplace": {
+ "minimumMXVersion": "9.24.0",
+ "appNumber": 224259,
+ "appName": "Calendar",
+ "reactReady": true
+ },
+ "testProject": {
+ "githubUrl": "https://github.com/mendix/testProjects",
+ "branchName": "calendar-web"
+ },
+ "packagePath": "com.mendix.widget.web",
+ "scripts": {
+ "start": "pluggable-widgets-tools start:server",
+ "dev": "pluggable-widgets-tools start:web",
+ "build": "pluggable-widgets-tools build:web",
+ "format": "pluggable-widgets-tools format",
+ "lint": "eslint --ext .jsx,.js,.ts,.tsx src/",
+ "test": "jest --projects jest.config.js",
+ "e2e": "echo \"Skipping this e2e test\"",
+ "e2edev": "run-e2e dev --with-preps",
+ "release": "pluggable-widgets-tools release:web",
+ "create-gh-release": "rui-create-gh-release",
+ "create-translation": "rui-create-translation",
+ "publish-marketplace": "rui-publish-marketplace",
+ "verify": "rui-verify-package-format",
+ "update-changelog": "rui-update-changelog-widget"
+ },
+ "devDependencies": {
+ "@mendix/automation-utils": "workspace:*",
+ "@mendix/eslint-config-web-widgets": "workspace:*",
+ "@mendix/pluggable-widgets-tools": "10.16.0",
+ "@mendix/prettier-config-web-widgets": "workspace:*",
+ "@mendix/run-e2e": "workspace:^*",
+ "@mendix/widget-plugin-component-kit": "workspace:*",
+ "@mendix/widget-plugin-hooks": "workspace:*",
+ "@mendix/widget-plugin-platform": "workspace:*",
+ "@mendix/widget-plugin-test-utils": "workspace:*",
+ "@types/react-big-calendar": "^1.16.1",
+ "cross-env": "^7.0.3"
+ },
+ "dependencies": {
+ "classnames": "^2.3.2",
+ "date-fns": "^4.1.0",
+ "react-big-calendar": "^1.17.1"
+ }
+}
diff --git a/packages/pluggableWidgets/calendar-web/src/Calendar.editorConfig.ts b/packages/pluggableWidgets/calendar-web/src/Calendar.editorConfig.ts
new file mode 100644
index 0000000000..a250a466e3
--- /dev/null
+++ b/packages/pluggableWidgets/calendar-web/src/Calendar.editorConfig.ts
@@ -0,0 +1,43 @@
+import {
+ StructurePreviewProps,
+ container,
+ rowLayout,
+ structurePreviewPalette,
+ text
+} from "@mendix/widget-plugin-platform/preview/structure-preview-api";
+import { Properties, hidePropertyIn, hidePropertiesIn } from "@mendix/pluggable-widgets-tools";
+import { CalendarPreviewProps } from "../typings/CalendarProps";
+
+export function getProperties(values: CalendarPreviewProps, defaultProperties: Properties): Properties {
+ if (values.heightUnit === "percentageOfWidth") {
+ hidePropertyIn(defaultProperties, values, "height");
+ } else {
+ hidePropertiesIn(defaultProperties, values, [
+ "minHeight",
+ "minHeightUnit",
+ "maxHeight",
+ "maxHeightUnit",
+ "OverflowY"
+ ]);
+ }
+
+ if (values.minHeightUnit === "none") {
+ hidePropertyIn(defaultProperties, values, "minHeight");
+ }
+
+ if (values.maxHeightUnit === "none") {
+ hidePropertiesIn(defaultProperties, values, ["maxHeight", "OverflowY"]);
+ }
+
+ return defaultProperties;
+}
+
+export function getPreview(_values: CalendarPreviewProps, isDarkMode: boolean): StructurePreviewProps {
+ const palette = structurePreviewPalette[isDarkMode ? "dark" : "light"];
+
+ return rowLayout({ columnSize: "grow", borders: true, backgroundColor: palette.background.containerFill })(
+ container()(),
+ rowLayout({ grow: 2, padding: 8 })(text({ fontColor: palette.text.primary, grow: 10 })("calendar")),
+ container()()
+ );
+}
diff --git a/packages/pluggableWidgets/calendar-web/src/Calendar.editorPreview.tsx b/packages/pluggableWidgets/calendar-web/src/Calendar.editorPreview.tsx
new file mode 100644
index 0000000000..2b1fb66d78
--- /dev/null
+++ b/packages/pluggableWidgets/calendar-web/src/Calendar.editorPreview.tsx
@@ -0,0 +1,33 @@
+import classNames from "classnames";
+import { ReactElement, createElement } from "react";
+import { Calendar, dateFnsLocalizer } from "react-big-calendar";
+import * as dateFns from "date-fns";
+import "react-big-calendar/lib/css/react-big-calendar.css";
+import { CalendarPreviewProps } from "typings/CalendarProps";
+
+const localizer = dateFnsLocalizer({
+ format: dateFns.format,
+ parse: dateFns.parse,
+ startOfWeek: dateFns.startOfWeek,
+ getDay: dateFns.getDay,
+ locales: {}
+});
+
+export function preview(_props: CalendarPreviewProps): ReactElement {
+ return (
+
+
+
+ );
+}
diff --git a/packages/pluggableWidgets/calendar-web/src/Calendar.icon.dark.png b/packages/pluggableWidgets/calendar-web/src/Calendar.icon.dark.png
new file mode 100644
index 0000000000..3798dd6bef
Binary files /dev/null and b/packages/pluggableWidgets/calendar-web/src/Calendar.icon.dark.png differ
diff --git a/packages/pluggableWidgets/calendar-web/src/Calendar.icon.png b/packages/pluggableWidgets/calendar-web/src/Calendar.icon.png
new file mode 100644
index 0000000000..0bf35d34a1
Binary files /dev/null and b/packages/pluggableWidgets/calendar-web/src/Calendar.icon.png differ
diff --git a/packages/pluggableWidgets/calendar-web/src/Calendar.tile.dark.png b/packages/pluggableWidgets/calendar-web/src/Calendar.tile.dark.png
new file mode 100644
index 0000000000..891a0c25c2
Binary files /dev/null and b/packages/pluggableWidgets/calendar-web/src/Calendar.tile.dark.png differ
diff --git a/packages/pluggableWidgets/calendar-web/src/Calendar.tile.png b/packages/pluggableWidgets/calendar-web/src/Calendar.tile.png
new file mode 100644
index 0000000000..be48898821
Binary files /dev/null and b/packages/pluggableWidgets/calendar-web/src/Calendar.tile.png differ
diff --git a/packages/pluggableWidgets/calendar-web/src/Calendar.tsx b/packages/pluggableWidgets/calendar-web/src/Calendar.tsx
new file mode 100644
index 0000000000..2a12d74590
--- /dev/null
+++ b/packages/pluggableWidgets/calendar-web/src/Calendar.tsx
@@ -0,0 +1,67 @@
+import classnames from "classnames";
+import { CSSProperties, ReactElement, createElement } from "react";
+import { CalendarContainerProps } from "../typings/CalendarProps";
+import { Calendar, dateFnsLocalizer } from "react-big-calendar";
+import * as dateFns from "date-fns";
+import "react-big-calendar/lib/css/react-big-calendar.css";
+
+const localizer = dateFnsLocalizer({
+ format: dateFns.format,
+ parse: dateFns.parse,
+ startOfWeek: dateFns.startOfWeek,
+ getDay: dateFns.getDay,
+ locales: {}
+});
+
+function getHeightScale(height: number, heightUnit: "pixels" | "percentageOfParent" | "percentageOfView"): string {
+ return `${height}${heightUnit === "pixels" ? "px" : heightUnit === "percentageOfView" ? "vh" : "%"}`;
+}
+
+export function constructWrapperStyle(props: CalendarContainerProps): CSSProperties {
+ const { widthUnit, heightUnit, minHeightUnit, maxHeightUnit, width, height, minHeight, maxHeight, OverflowY } =
+ props;
+
+ const wrapperStyle: Pick =
+ {};
+
+ wrapperStyle.width = `${width}${widthUnit === "pixels" ? "px" : "%"}`;
+ if (heightUnit === "percentageOfWidth") {
+ wrapperStyle.height = "auto";
+
+ if (minHeightUnit !== "none") {
+ wrapperStyle.minHeight = getHeightScale(minHeight, minHeightUnit);
+ }
+
+ if (maxHeightUnit !== "none") {
+ wrapperStyle.maxHeight = getHeightScale(maxHeight, maxHeightUnit);
+ wrapperStyle.overflowY = OverflowY;
+ }
+ } else {
+ wrapperStyle.height = getHeightScale(height, heightUnit);
+ }
+
+ return wrapperStyle;
+}
+
+export default function MxCalendar(props: CalendarContainerProps): ReactElement {
+ const { class: className } = props;
+ const wrapperStyle = constructWrapperStyle(props);
+ console.log("wrapperStyle", wrapperStyle);
+ return (
+
+
+
+ );
+}
diff --git a/packages/pluggableWidgets/calendar-web/src/Calendar.xml b/packages/pluggableWidgets/calendar-web/src/Calendar.xml
new file mode 100644
index 0000000000..0370acc2eb
--- /dev/null
+++ b/packages/pluggableWidgets/calendar-web/src/Calendar.xml
@@ -0,0 +1,182 @@
+
+
+ Calendar
+ Calendar
+ https://docs.mendix.com/appstore/widgets/calendar
+
+
+
+
+
+ Events
+
+
+
+ Title attribute
+
+
+
+
+
+
+ All day attribute
+
+
+
+
+
+
+ Start attribute
+
+
+
+
+
+
+ End attribute
+
+
+
+
+
+
+ Color attribute
+
+ Attribute containing a valid html color eg: red #FF0000
+ rgb(250,10,20) rgba(10,10,10, 0.5)
+
+
+
+
+
+
+
+
+
+
+ View
+ Standard has Day, Week and Month
+
+ Standard
+ Custom
+
+
+
+ Initial selected view
+ Work week and agenda are only available in custom views
+
+ Day
+ Week
+ Month
+ (Work week)
+ (Agenda)
+
+
+
+ Start date attribute
+ The start date that should be shown in the view
+
+
+
+
+
+ Editable
+
+
+ Default
+ Never
+
+
+
+ Enable create
+
+
+
+
+
+ Event data attribute
+ The attribute to store received raw data
+
+
+
+
+
+ On click action
+
+
+
+ On create action
+ The create event is triggered when a time slot is selected, and the 'Enable create' property is set to 'true'
+
+
+ On change action
+ The change event is triggered on moving/dragging an item or changing the start or end time of by resizing an item
+
+
+
+
+ Width unit
+
+
+ Pixels
+ Percentage
+
+
+
+ Width
+
+
+
+ Height unit
+
+
+ Auto
+ Pixels
+ Percentage
+ Viewport
+
+
+
+ Height
+
+
+
+ Minimum Height unit
+
+
+ None
+ Pixels
+ Percentage
+ Viewport
+
+
+
+ Minimum height
+
+
+
+ Maximum Height unit
+
+
+ None
+ Pixels
+ Percentage
+ Viewport
+
+
+
+ Maximum height
+
+
+
+ Vertical Overflow
+
+
+ Auto
+ Scroll
+ Hidden
+
+
+
+
+
diff --git a/packages/pluggableWidgets/calendar-web/src/__tests__/AppEvents.spec.tsx b/packages/pluggableWidgets/calendar-web/src/__tests__/AppEvents.spec.tsx
new file mode 100644
index 0000000000..84583314e5
--- /dev/null
+++ b/packages/pluggableWidgets/calendar-web/src/__tests__/AppEvents.spec.tsx
@@ -0,0 +1,28 @@
+import { actionValue } from "@mendix/widget-plugin-test-utils";
+import "@testing-library/jest-dom";
+import { render } from "@testing-library/react";
+// import { mount } from "enzyme";
+import { createElement } from "react";
+import { EventsContainerProps } from "../../typings/EventsProps";
+import Events from "../Events";
+
+describe("App events (load)", () => {
+ let defaultProps: EventsContainerProps;
+ beforeEach(() => {
+ defaultProps = {
+ name: "app events",
+ class: "app-events",
+ onComponentLoad: actionValue(),
+ componentLoadDelay: 0,
+ onEventChangeDelay: 0,
+ componentLoadRepeat: false,
+ componentLoadRepeatInterval: 0
+ };
+ });
+ it("render app events", async () => {
+ const component = render();
+ const renderedDiv = await component.container.querySelector(".widget-events");
+
+ expect(renderedDiv).toBeEmptyDOMElement();
+ });
+});
diff --git a/packages/pluggableWidgets/calendar-web/src/assets/Events.icon.active.svg b/packages/pluggableWidgets/calendar-web/src/assets/Events.icon.active.svg
new file mode 100644
index 0000000000..549a748d04
--- /dev/null
+++ b/packages/pluggableWidgets/calendar-web/src/assets/Events.icon.active.svg
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/packages/pluggableWidgets/calendar-web/src/assets/Events.icon.dark.active.svg b/packages/pluggableWidgets/calendar-web/src/assets/Events.icon.dark.active.svg
new file mode 100644
index 0000000000..2cde472fd8
--- /dev/null
+++ b/packages/pluggableWidgets/calendar-web/src/assets/Events.icon.dark.active.svg
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/packages/pluggableWidgets/calendar-web/src/assets/Events.icon.dark.svg b/packages/pluggableWidgets/calendar-web/src/assets/Events.icon.dark.svg
new file mode 100644
index 0000000000..e32ab55af4
--- /dev/null
+++ b/packages/pluggableWidgets/calendar-web/src/assets/Events.icon.dark.svg
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/packages/pluggableWidgets/calendar-web/src/assets/Events.icon.svg b/packages/pluggableWidgets/calendar-web/src/assets/Events.icon.svg
new file mode 100644
index 0000000000..15cba120d4
--- /dev/null
+++ b/packages/pluggableWidgets/calendar-web/src/assets/Events.icon.svg
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/packages/pluggableWidgets/calendar-web/src/assets/icons.tsx b/packages/pluggableWidgets/calendar-web/src/assets/icons.tsx
new file mode 100644
index 0000000000..450c681871
--- /dev/null
+++ b/packages/pluggableWidgets/calendar-web/src/assets/icons.tsx
@@ -0,0 +1,15 @@
+import { ReactElement, createElement } from "react";
+export function EventsIcon({ isActive }: { isActive?: boolean }): ReactElement {
+ return (
+
+
+
+ );
+}
diff --git a/packages/pluggableWidgets/calendar-web/src/package.xml b/packages/pluggableWidgets/calendar-web/src/package.xml
new file mode 100644
index 0000000000..c5b8f383d1
--- /dev/null
+++ b/packages/pluggableWidgets/calendar-web/src/package.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/pluggableWidgets/calendar-web/tsconfig.json b/packages/pluggableWidgets/calendar-web/tsconfig.json
new file mode 100644
index 0000000000..a2a5b87e60
--- /dev/null
+++ b/packages/pluggableWidgets/calendar-web/tsconfig.json
@@ -0,0 +1,31 @@
+{
+ "include": ["./src", "./typings"],
+ "compilerOptions": {
+ "baseUrl": "./",
+ "noEmitOnError": true,
+ "sourceMap": true,
+ "module": "esnext",
+ "target": "es6",
+ "lib": ["esnext", "dom"],
+ "types": ["jest", "node"],
+ "moduleResolution": "node",
+ "declaration": false,
+ "noLib": false,
+ "forceConsistentCasingInFileNames": true,
+ "noFallthroughCasesInSwitch": true,
+ "strict": true,
+ "strictFunctionTypes": false,
+ "skipLibCheck": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "jsx": "react",
+ "jsxFactory": "createElement",
+ "allowSyntheticDefaultImports": true,
+ "esModuleInterop": true,
+ "useUnknownInCatchVariables": false,
+ "exactOptionalPropertyTypes": false,
+ "paths": {
+ "react-hot-loader/root": ["./hot-typescript.ts"]
+ }
+ }
+}
diff --git a/packages/pluggableWidgets/calendar-web/typings/CalendarProps.d.ts b/packages/pluggableWidgets/calendar-web/typings/CalendarProps.d.ts
new file mode 100644
index 0000000000..f4f25daa62
--- /dev/null
+++ b/packages/pluggableWidgets/calendar-web/typings/CalendarProps.d.ts
@@ -0,0 +1,90 @@
+/**
+ * This file was generated from Calendar.xml
+ * WARNING: All changes made to this file will be overwritten
+ * @author Mendix Widgets Framework Team
+ */
+import { CSSProperties } from "react";
+import { ActionValue, EditableValue, ListValue, ListAttributeValue } from "mendix";
+
+export type ViewEnum = "standard" | "custom";
+
+export type DefaultViewEnum = "day" | "week" | "month" | "work_week" | "agenda";
+
+export type EditableEnum = "default" | "never";
+
+export type WidthUnitEnum = "pixels" | "percentage";
+
+export type HeightUnitEnum = "percentageOfWidth" | "pixels" | "percentageOfParent" | "percentageOfView";
+
+export type MinHeightUnitEnum = "none" | "pixels" | "percentageOfParent" | "percentageOfView";
+
+export type MaxHeightUnitEnum = "none" | "pixels" | "percentageOfParent" | "percentageOfView";
+
+export type OverflowYEnum = "auto" | "scroll" | "hidden";
+
+export interface CalendarContainerProps {
+ name: string;
+ class: string;
+ style?: CSSProperties;
+ tabIndex?: number;
+ databaseDataSource?: ListValue;
+ titleAttribute?: ListAttributeValue;
+ allDayAttribute?: ListAttributeValue;
+ startAttribute?: ListAttributeValue;
+ endAttribute?: ListAttributeValue;
+ eventColor?: ListAttributeValue;
+ view: ViewEnum;
+ defaultView: DefaultViewEnum;
+ startDateAttribute?: EditableValue;
+ editable: EditableEnum;
+ enableCreate: boolean;
+ eventDataAttribute?: EditableValue;
+ onClickEvent?: ActionValue;
+ onCreateEvent?: ActionValue;
+ onChange?: ActionValue;
+ widthUnit: WidthUnitEnum;
+ width: number;
+ heightUnit: HeightUnitEnum;
+ height: number;
+ minHeightUnit: MinHeightUnitEnum;
+ minHeight: number;
+ maxHeightUnit: MaxHeightUnitEnum;
+ maxHeight: number;
+ OverflowY: OverflowYEnum;
+}
+
+export interface CalendarPreviewProps {
+ /**
+ * @deprecated Deprecated since version 9.18.0. Please use class property instead.
+ */
+ className: string;
+ class: string;
+ style: string;
+ styleObject?: CSSProperties;
+ readOnly: boolean;
+ renderMode?: "design" | "xray" | "structure";
+ databaseDataSource: {} | { caption: string } | { type: string } | null;
+ titleAttribute: string;
+ allDayAttribute: string;
+ startAttribute: string;
+ endAttribute: string;
+ eventColor: string;
+ view: ViewEnum;
+ defaultView: DefaultViewEnum;
+ startDateAttribute: string;
+ editable: EditableEnum;
+ enableCreate: boolean;
+ eventDataAttribute: string;
+ onClickEvent: {} | null;
+ onCreateEvent: {} | null;
+ onChange: {} | null;
+ widthUnit: WidthUnitEnum;
+ width: number | null;
+ heightUnit: HeightUnitEnum;
+ height: number | null;
+ minHeightUnit: MinHeightUnitEnum;
+ minHeight: number | null;
+ maxHeightUnit: MaxHeightUnitEnum;
+ maxHeight: number | null;
+ OverflowY: OverflowYEnum;
+}
diff --git a/packages/pluggableWidgets/calendar-web/typings/declare-svg.ts b/packages/pluggableWidgets/calendar-web/typings/declare-svg.ts
new file mode 100644
index 0000000000..e6958d5a9f
--- /dev/null
+++ b/packages/pluggableWidgets/calendar-web/typings/declare-svg.ts
@@ -0,0 +1,4 @@
+declare module "*.svg" {
+ const content: string;
+ export = content;
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 63f9126e5a..12bff07c02 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -741,6 +741,52 @@ importers:
specifier: workspace:*
version: link:../../shared/widget-plugin-test-utils
+ packages/pluggableWidgets/calendar-web:
+ dependencies:
+ classnames:
+ specifier: ^2.3.2
+ version: 2.3.2
+ date-fns:
+ specifier: ^4.1.0
+ version: 4.1.0
+ react-big-calendar:
+ specifier: ^1.17.1
+ version: 1.17.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ devDependencies:
+ '@mendix/automation-utils':
+ specifier: workspace:*
+ version: link:../../../automation/utils
+ '@mendix/eslint-config-web-widgets':
+ specifier: workspace:*
+ version: link:../../shared/eslint-config-web-widgets
+ '@mendix/pluggable-widgets-tools':
+ specifier: 10.16.0
+ version: 10.16.0(@jest/types@29.6.3)(@swc/core@1.7.26)(@types/babel__core@7.20.3)(@types/node@20.12.12)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.25.8)(@babel/preset-env@7.23.2(@babel/core@7.25.8))(@types/react@18.2.36)(react@18.2.0)(typescript@5.0.4))(react@18.2.0)(tslib@2.7.0)
+ '@mendix/prettier-config-web-widgets':
+ specifier: workspace:*
+ version: link:../../shared/prettier-config-web-widgets
+ '@mendix/run-e2e':
+ specifier: workspace:^*
+ version: link:../../../automation/run-e2e
+ '@mendix/widget-plugin-component-kit':
+ specifier: workspace:*
+ version: link:../../shared/widget-plugin-component-kit
+ '@mendix/widget-plugin-hooks':
+ specifier: workspace:*
+ version: link:../../shared/widget-plugin-hooks
+ '@mendix/widget-plugin-platform':
+ specifier: workspace:*
+ version: link:../../shared/widget-plugin-platform
+ '@mendix/widget-plugin-test-utils':
+ specifier: workspace:*
+ version: link:../../shared/widget-plugin-test-utils
+ '@types/react-big-calendar':
+ specifier: ^1.16.1
+ version: 1.16.1
+ cross-env:
+ specifier: ^7.0.3
+ version: 7.0.3
+
packages/pluggableWidgets/carousel-web:
dependencies:
'@types/react-test-renderer':
@@ -2881,12 +2927,14 @@ packages:
'@babel/plugin-proposal-async-generator-functions@7.20.7':
resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==}
engines: {node: '>=6.9.0'}
+ deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.
peerDependencies:
'@babel/core': ^7.0.0-0
'@babel/plugin-proposal-class-properties@7.18.6':
resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==}
engines: {node: '>=6.9.0'}
+ deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.
peerDependencies:
'@babel/core': ^7.0.0-0
@@ -2899,36 +2947,42 @@ packages:
'@babel/plugin-proposal-nullish-coalescing-operator@7.18.6':
resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==}
engines: {node: '>=6.9.0'}
+ deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.
peerDependencies:
'@babel/core': ^7.0.0-0
'@babel/plugin-proposal-numeric-separator@7.18.6':
resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==}
engines: {node: '>=6.9.0'}
+ deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.
peerDependencies:
'@babel/core': ^7.0.0-0
'@babel/plugin-proposal-object-rest-spread@7.20.7':
resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==}
engines: {node: '>=6.9.0'}
+ deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.
peerDependencies:
'@babel/core': ^7.0.0-0
'@babel/plugin-proposal-optional-catch-binding@7.18.6':
resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==}
engines: {node: '>=6.9.0'}
+ deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead.
peerDependencies:
'@babel/core': ^7.0.0-0
'@babel/plugin-proposal-optional-chaining@7.21.0':
resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==}
engines: {node: '>=6.9.0'}
+ deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.
peerDependencies:
'@babel/core': ^7.0.0-0
'@babel/plugin-proposal-private-methods@7.18.6':
resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==}
engines: {node: '>=6.9.0'}
+ deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.
peerDependencies:
'@babel/core': ^7.0.0-0
@@ -3684,6 +3738,7 @@ packages:
'@humanwhocodes/config-array@0.5.0':
resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==}
engines: {node: '>=10.10.0'}
+ deprecated: Use @eslint/config-array instead
'@humanwhocodes/module-importer@1.0.1':
resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
@@ -3691,6 +3746,7 @@ packages:
'@humanwhocodes/object-schema@1.2.1':
resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
+ deprecated: Use @eslint/object-schema instead
'@humanwhocodes/object-schema@2.0.3':
resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==}
@@ -4566,6 +4622,9 @@ packages:
'@types/react-big-calendar@0.20.20':
resolution: {integrity: sha512-XVKERX7vh5MqUkIPaWKkHBYmurbCYs0OTEBdcxChgKbXqeXviGz7+6Yzff4uI/dy/uBgaD3igQSLcJDgiZhdcQ==}
+ '@types/react-big-calendar@1.16.1':
+ resolution: {integrity: sha512-pDHFcVWx+BvZbX6U39R4l8c9930vKnfx+09lf4W8r8HuxBDLzGk7Q63ncBmqqnQImEFNDKfwa6MDyu90cfzJ2A==}
+
'@types/react-color@2.17.6':
resolution: {integrity: sha512-5CEKnrpvgZz8v5UYbpLgBeK+V6K7KdszksSDK6mNjL/8wrsqQfIyKB45CQOAEYtRgn+tWqTeqbUtvFWjXDpURQ==}
@@ -5245,6 +5304,7 @@ packages:
babel-eslint@10.1.0:
resolution: {integrity: sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==}
engines: {node: '>=6'}
+ deprecated: babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.
peerDependencies:
eslint: '>= 4.12.1'
@@ -5536,6 +5596,10 @@ packages:
resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
engines: {node: '>=0.8'}
+ clsx@1.2.1:
+ resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==}
+ engines: {node: '>=6'}
+
clsx@2.1.0:
resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==}
engines: {node: '>=6'}
@@ -5969,6 +6033,9 @@ packages:
date-arithmetic@3.1.0:
resolution: {integrity: sha512-ynlmvduDVuzwDDYW3OF4RHCikdzegg0vWQtzwjiVKPs/RjZ93b/7AxIwhfZKxSQQFA8l9lwhkyeDVQyrzbPUwA==}
+ date-arithmetic@4.1.0:
+ resolution: {integrity: sha512-QWxYLR5P/6GStZcdem+V1xoto6DMadYWpMXU82ES3/RfR3Wdwr3D0+be7mgOJ+Ov0G9D5Dmb9T17sNLQYj9XOg==}
+
date-fns@2.30.0:
resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==}
engines: {node: '>=0.11'}
@@ -5976,6 +6043,9 @@ packages:
date-fns@3.6.0:
resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==}
+ date-fns@4.1.0:
+ resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==}
+
date-format@4.0.14:
resolution: {integrity: sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==}
engines: {node: '>=4.0'}
@@ -6496,6 +6566,7 @@ packages:
eslint@7.32.0:
resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==}
engines: {node: ^10.12.0 || >=12.0.0}
+ deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options.
hasBin: true
eslint@8.57.0:
@@ -6897,6 +6968,9 @@ packages:
resolution: {integrity: sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==}
engines: {node: '>=16'}
+ globalize@0.1.1:
+ resolution: {integrity: sha512-5e01v8eLGfuQSOvx2MsDMOWS0GFtCx1wPzQSmcHw4hkxFzrQDBO3Xwg/m8Hr/7qXMrHeOIE29qWVzyv06u1TZA==}
+
globals@11.12.0:
resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
engines: {node: '>=4'}
@@ -7976,6 +8050,10 @@ packages:
resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
engines: {node: '>=10'}
+ luxon@3.5.0:
+ resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==}
+ engines: {node: '>=12'}
+
lz-string@1.5.0:
resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
hasBin: true
@@ -8064,6 +8142,9 @@ packages:
memoize-one@5.2.1:
resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==}
+ memoize-one@6.0.0:
+ resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==}
+
mendix-client@7.15.8:
resolution: {integrity: sha512-RazCdCHoLVNKUUeKDkSkIL6Lxx6fUaa4iiy+Ltp9ra8mLQhwyNqD33TIN7YZJ3HDjHc3eWh9cjiZWwh6Jg/cQg==}
@@ -8261,6 +8342,9 @@ packages:
engines: {node: '>= 14.0.0'}
hasBin: true
+ moment-timezone@0.5.47:
+ resolution: {integrity: sha512-UbNt/JAWS0m/NJOebR0QMRHBk0hu03r5dx9GK8Cs0AS3I81yDcOc9k+DytPItgVvBP7J6Mf6U2n3BPAacAV9oA==}
+
moment@2.29.4:
resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==}
@@ -9148,6 +9232,12 @@ packages:
react: ^18.0.0
react-dom: ^18.0.0
+ react-big-calendar@1.17.1:
+ resolution: {integrity: sha512-LltUAMSGODWQBKx4013bRe6R0jaINV9hrs970+F860KedpozwRGGMT66esV9mA3mAhfSKoazF/QH1WCyLkXYZA==}
+ peerDependencies:
+ react: ^18.0.0
+ react-dom: ^18.0.0
+
react-color@2.19.3:
resolution: {integrity: sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==}
peerDependencies:
@@ -9547,6 +9637,7 @@ packages:
rollup-plugin-terser@7.0.2:
resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==}
+ deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser
peerDependencies:
rollup: ^2.79.2
@@ -13199,7 +13290,7 @@ snapshots:
dependencies:
'@types/istanbul-lib-coverage': 2.0.6
'@types/istanbul-reports': 3.0.4
- '@types/node': 20.12.12
+ '@types/node': 22.7.5
'@types/yargs': 15.0.19
chalk: 4.1.2
@@ -14729,7 +14820,7 @@ snapshots:
'@types/node-forge@1.3.11':
dependencies:
- '@types/node': 20.12.12
+ '@types/node': 22.7.5
'@types/node@20.12.12':
dependencies:
@@ -14769,6 +14860,12 @@ snapshots:
'@types/prop-types': 15.7.9
'@types/react': 18.2.36
+ '@types/react-big-calendar@1.16.1':
+ dependencies:
+ '@types/date-arithmetic': 3.1.2
+ '@types/prop-types': 15.7.9
+ '@types/react': 18.2.36
+
'@types/react-color@2.17.6':
dependencies:
'@types/react': 18.2.36
@@ -15992,7 +16089,7 @@ snapshots:
chrome-launcher@0.15.2:
dependencies:
- '@types/node': 20.12.12
+ '@types/node': 22.7.5
escape-string-regexp: 4.0.0
is-wsl: 2.2.0
lighthouse-logger: 1.4.2
@@ -16003,7 +16100,7 @@ snapshots:
chromium-edge-launcher@0.2.0:
dependencies:
- '@types/node': 20.12.12
+ '@types/node': 22.7.5
escape-string-regexp: 4.0.0
is-wsl: 2.2.0
lighthouse-logger: 1.4.2
@@ -16054,6 +16151,8 @@ snapshots:
clone@1.0.4: {}
+ clsx@1.2.1: {}
+
clsx@2.1.0: {}
co@4.6.0: {}
@@ -16685,12 +16784,16 @@ snapshots:
date-arithmetic@3.1.0: {}
+ date-arithmetic@4.1.0: {}
+
date-fns@2.30.0:
dependencies:
- '@babel/runtime': 7.22.5
+ '@babel/runtime': 7.25.7
date-fns@3.6.0: {}
+ date-fns@4.1.0: {}
+
date-format@4.0.14: {}
dayjs@1.11.13: {}
@@ -17870,6 +17973,8 @@ snapshots:
kind-of: 6.0.3
which: 4.0.0
+ globalize@0.1.1: {}
+
globals@11.12.0: {}
globals@13.20.0:
@@ -19399,6 +19504,8 @@ snapshots:
dependencies:
yallist: 4.0.0
+ luxon@3.5.0: {}
+
lz-string@1.5.0: {}
magic-string@0.16.0:
@@ -19536,6 +19643,8 @@ snapshots:
memoize-one@5.2.1: {}
+ memoize-one@6.0.0: {}
+
mendix-client@7.15.8:
dependencies:
'@types/big.js': 6.2.2
@@ -19910,6 +20019,10 @@ snapshots:
yargs-parser: 20.2.4
yargs-unparser: 2.0.0
+ moment-timezone@0.5.47:
+ dependencies:
+ moment: 2.30.1
+
moment@2.29.4: {}
moment@2.30.1: {}
@@ -21074,6 +21187,27 @@ snapshots:
uncontrollable: 4.1.0(react@18.2.0)
warning: 2.1.0
+ react-big-calendar@1.17.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ dependencies:
+ '@babel/runtime': 7.25.7
+ clsx: 1.2.1
+ date-arithmetic: 4.1.0
+ dayjs: 1.11.13
+ dom-helpers: 5.2.1
+ globalize: 0.1.1
+ invariant: 2.2.4
+ lodash: 4.17.21
+ lodash-es: 4.17.21
+ luxon: 3.5.0
+ memoize-one: 6.0.0
+ moment: 2.30.1
+ moment-timezone: 0.5.47
+ prop-types: 15.8.1
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-overlays: 5.2.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ uncontrollable: 7.2.1(react@18.2.0)
+
react-color@2.19.3(react@18.2.0):
dependencies:
'@icons/material': 0.2.4(react@18.2.0)
@@ -21329,7 +21463,7 @@ snapshots:
react-overlays@5.2.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
- '@babel/runtime': 7.22.5
+ '@babel/runtime': 7.25.7
'@popperjs/core': 2.11.8
'@restart/hooks': 0.4.9(react@18.2.0)
'@types/warning': 3.0.0