diff --git a/assets/admin/components/playlist/playlist-campaign-manager.jsx b/assets/admin/components/playlist/playlist-campaign-manager.jsx index 6467a622..b80c3998 100644 --- a/assets/admin/components/playlist/playlist-campaign-manager.jsx +++ b/assets/admin/components/playlist/playlist-campaign-manager.jsx @@ -1,7 +1,6 @@ import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { useNavigate, useLocation } from "react-router-dom"; -import set from "lodash.set"; import dayjs from "dayjs"; import { useDispatch } from "react-redux"; import idFromUrl from "../util/helpers/id-from-url"; @@ -281,7 +280,7 @@ function PlaylistCampaignManager({ */ const handleInput = ({ target }) => { const localFormStateObject = { ...formStateObject }; - set(localFormStateObject, target.id, target.value); + localFormStateObject[target.id] = target.value; setFormStateObject(localFormStateObject); }; diff --git a/assets/admin/components/screen/screen-manager.jsx b/assets/admin/components/screen/screen-manager.jsx index ecac836c..8e4a28a1 100644 --- a/assets/admin/components/screen/screen-manager.jsx +++ b/assets/admin/components/screen/screen-manager.jsx @@ -1,6 +1,5 @@ import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; -import set from "lodash.set"; import { useNavigate } from "react-router-dom"; import { usePostV2ScreensMutation, @@ -96,7 +95,7 @@ function ScreenManager({ const handleInput = ({ target }) => { let localFormStateObject = { ...formStateObject }; localFormStateObject = JSON.parse(JSON.stringify(localFormStateObject)); - set(localFormStateObject, target.id, target.value); + localFormStateObject[target.id] = target.value; setFormStateObject(localFormStateObject); }; diff --git a/assets/admin/components/slide/content/contacts/contact-form.jsx b/assets/admin/components/slide/content/contacts/contact-form.jsx index 2e1cff04..764c4bb9 100644 --- a/assets/admin/components/slide/content/contacts/contact-form.jsx +++ b/assets/admin/components/slide/content/contacts/contact-form.jsx @@ -1,4 +1,3 @@ -import set from "lodash.set"; import { Col, Row } from "react-bootstrap"; import { useTranslation } from "react-i18next"; import FileSelector from "../file-selector"; @@ -28,7 +27,7 @@ function ContactForm({ */ const onInput = ({ target }) => { const localContact = { ...contact }; - set(localContact, target.name, target.value); + localContact[target.name] = target.value; onChange(localContact); }; diff --git a/assets/admin/components/slide/content/feed-selector.jsx b/assets/admin/components/slide/content/feed-selector.jsx index 6cc901da..ccd9491e 100644 --- a/assets/admin/components/slide/content/feed-selector.jsx +++ b/assets/admin/components/slide/content/feed-selector.jsx @@ -2,7 +2,6 @@ import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { Spinner } from "react-bootstrap"; import { useDispatch } from "react-redux"; -import set from "lodash.set"; import { enhancedApi, useGetV2FeedSourcesQuery, @@ -100,12 +99,12 @@ function FeedSelector({ const configuration = { ...value.configuration }; if (target !== null) { - set(configuration, target.id, target.value); + configuration[target.id] = target.value; } if (targets !== null) { targets.forEach(({ id, value: targetValue }) => { - set(configuration, id, targetValue); + configuration[id] = targetValue; }); } diff --git a/assets/admin/components/slide/slide-manager.jsx b/assets/admin/components/slide/slide-manager.jsx index b7a72593..63e20dd4 100644 --- a/assets/admin/components/slide/slide-manager.jsx +++ b/assets/admin/components/slide/slide-manager.jsx @@ -1,7 +1,5 @@ import { useEffect, useState, useContext } from "react"; import { useTranslation } from "react-i18next"; -import get from "lodash.get"; -import set from "lodash.set"; import { ulid } from "ulid"; import { useDispatch } from "react-redux"; import dayjs from "dayjs"; @@ -155,7 +153,7 @@ function SlideManager({ */ const handleInput = ({ target }) => { const localFormStateObject = { ...formStateObject }; - set(localFormStateObject, target.id, target.value); + localFormStateObject[target.id] = target.value; setFormStateObject(localFormStateObject); }; @@ -208,7 +206,7 @@ function SlideManager({ const value = target.type === "number" ? target.valueAsNumber : target.value; const localFormStateObject = { ...formStateObject }; - set(localFormStateObject.content, target.id, value); + localFormStateObject.content[target.id] = value; setFormStateObject(localFormStateObject); }; @@ -353,12 +351,12 @@ function SlideManager({ // It is an already added temp file. if (entry.tempId) { newField.push(entry.tempId); - set(localMediaData, entry.tempId, entry); + localMediaData[entry.tempId] = entry; } // It is a new temp file. else { if (!Array.isArray(localFormStateObject.content[fieldId])) { - set(localFormStateObject.content, fieldId, []); + localFormStateObject.content[fieldId] = []; } // Create a tempId for the media. @@ -369,7 +367,7 @@ function SlideManager({ const newEntry = { ...entry }; newEntry.tempId = tempId; - set(localMediaData, tempId, newEntry); + localMediaData[tempId] = newEntry; } } // Previously selected file. @@ -383,7 +381,7 @@ function SlideManager({ if ( !Object.prototype.hasOwnProperty.call(localMediaData, entry["@id"]) ) { - set(localMediaData, entry["@id"], entry); + localMediaData[entry["@id"]] = entry; localFormStateObject.media.push(entry["@id"]); } @@ -391,10 +389,8 @@ function SlideManager({ }); } - set(localFormStateObject.content, fieldId, newField); - set(localFormStateObject, "media", [ - ...new Set([...localFormStateObject.media]), - ]); + localFormStateObject.content[fieldId] = newField; + localFormStateObject.media = [...new Set([...localFormStateObject.media])]; setFormStateObject(localFormStateObject); setMediaData(localMediaData); @@ -406,7 +402,7 @@ function SlideManager({ // Setup submittingMedia list. mediaFields.forEach((fieldName) => { - const fieldData = get(formStateObject.content, fieldName); + const fieldData = formStateObject.content[fieldName]; if (fieldData) { if (Array.isArray(fieldData)) { @@ -548,33 +544,25 @@ function SlideManager({ /** Submitted media is successful. */ useEffect(() => { - if (submitting) { - if (isSaveMediaSuccess) { - const newSubmittingMedia = [...submittingMedia]; - const submittedMedia = newSubmittingMedia.shift(); - - const newFormStateObject = { ...formStateObject }; - newFormStateObject.media.push(savedMediaData["@id"]); - - // Replace TEMP-- id with real id. - set( - newFormStateObject.content, - submittedMedia.fieldName, - get(newFormStateObject.content, submittedMedia.fieldName).map( - (mediaId) => - mediaId === submittedMedia.tempId - ? savedMediaData["@id"] - : mediaId, - ), + if (submitting && isSaveMediaSuccess) { + const newSubmittingMedia = [...submittingMedia]; + const submittedMedia = newSubmittingMedia.shift(); + + const newFormStateObject = { ...formStateObject }; + newFormStateObject.media.push(savedMediaData["@id"]); + + // Replace TEMP-- id with real id. + newFormStateObject.content[submittedMedia.fieldName] = + newFormStateObject.content[submittedMedia.fieldName].map((mediaId) => + mediaId === submittedMedia.tempId ? savedMediaData["@id"] : mediaId, ); - const newMediaData = { ...mediaData }; - newMediaData[savedMediaData["@id"]] = savedMediaData; - setMediaData(newMediaData); + const newMediaData = { ...mediaData }; + newMediaData[savedMediaData["@id"]] = savedMediaData; + setMediaData(newMediaData); - // Save new list. - setSubmittingMedia(newSubmittingMedia); - } + // Save the new list. + setSubmittingMedia(newSubmittingMedia); } }, [isSaveMediaSuccess]); diff --git a/assets/admin/components/util/table/table-body.jsx b/assets/admin/components/util/table/table-body.jsx index 63497d7d..25162e8f 100644 --- a/assets/admin/components/util/table/table-body.jsx +++ b/assets/admin/components/util/table/table-body.jsx @@ -1,5 +1,4 @@ import { Fragment } from "react"; -import get from "lodash.get"; import useModal from "../../../context/modal-context/modal-context-hook"; /** @@ -23,7 +22,7 @@ function TableBody({ columns, data }) { return column.content(item); } - let cellData = get(item, column.path); + let cellData = item[column.path]; if (column.dataFunction) { cellData = column.dataFunction(cellData); diff --git a/assets/client/data-sync/pull-strategy.js b/assets/client/data-sync/pull-strategy.js index 4a52c484..ca1b96d2 100644 --- a/assets/client/data-sync/pull-strategy.js +++ b/assets/client/data-sync/pull-strategy.js @@ -1,4 +1,3 @@ -import cloneDeep from "lodash.clonedeep"; import isPublished from "../util/isPublished"; import logger from "../logger/logger"; import ApiHelper from "./api-helper"; @@ -136,7 +135,7 @@ class PullStrategy { async getSlidesForRegions(regions) { return new Promise((resolve, reject) => { const promises = []; - const regionData = cloneDeep(regions); + const regionData = structuredClone(regions); // @TODO: Fix eslint-raised issues. // eslint-disable-next-line guard-for-in,no-restricted-syntax @@ -200,7 +199,7 @@ class PullStrategy { return; } - const newScreen = cloneDeep(screen); + const newScreen = structuredClone(screen); newScreen.hasActiveCampaign = false; @@ -304,7 +303,7 @@ class PullStrategy { const dataEntrySlidesData = dataEntryPlaylist.slidesData; for (const slideKey of Object.keys(dataEntrySlidesData)) { - const slide = cloneDeep(dataEntrySlidesData[slideKey]); + const slide = structuredClone(dataEntrySlidesData[slideKey]); let previousSlide = null; @@ -315,7 +314,7 @@ class PullStrategy { this.lastestScreenData.regionData[regionKey][playlistKey] .slidesData[slideKey] ) { - previousSlide = cloneDeep( + previousSlide = structuredClone( this.lastestScreenData.regionData[regionKey][playlistKey] .slidesData[slideKey], ); diff --git a/assets/client/service/schedule-service.js b/assets/client/service/schedule-service.js index a69c8cb4..7cdfdfbe 100644 --- a/assets/client/service/schedule-service.js +++ b/assets/client/service/schedule-service.js @@ -1,4 +1,3 @@ -import cloneDeep from "lodash.clonedeep"; import sha256 from "crypto-js/sha256"; import Md5 from "crypto-js/md5"; import Base64 from "crypto-js/enc-base64"; @@ -214,7 +213,7 @@ class ScheduleService { return; } - const newSlide = cloneDeep(slide); + const newSlide = structuredClone(slide); // Execution id is the product of region, playlist and slide id, to ensure uniqueness in the client. const executionId = Md5(regionId + playlist["@id"] + slide["@id"]); diff --git a/assets/tests/template/template-calendar.spec.js b/assets/tests/template/template-calendar.spec.js index e4234b18..815d909c 100644 --- a/assets/tests/template/template-calendar.spec.js +++ b/assets/tests/template/template-calendar.spec.js @@ -1,8 +1,10 @@ import { test, expect } from "@playwright/test"; -// Fixed time since calendar template filters events older than now. +// Fixed time since the calendar template filters events older than now. const fixTime = async (page) => { const newDate = new Date(); + newDate.setMonth(8); + newDate.setDate(15); newDate.setHours(6); newDate.setMinutes(0); await page.clock.install({ time: newDate }); diff --git a/docker-compose.override.yml b/docker-compose.override.yml index efb2d29e..a8471c4e 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -36,7 +36,7 @@ services: playwright: # https://playwright.dev/docs/docker # This Playwright version should match the one in `package.json`. - image: mcr.microsoft.com/playwright:v1.53.2 + image: mcr.microsoft.com/playwright:v1.57.0 networks: - app depends_on: diff --git a/package-lock.json b/package-lock.json index d959cccb..3386a566 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,11 +25,6 @@ "html-react-parser": "^1.3.0", "i18next": "^21.6.14", "jwt-decode": "^3.1.2", - "lodash.clonedeep": "^4.5.0", - "lodash.get": "^4.4.2", - "lodash.last": "^3.0.0", - "lodash.set": "^4.3.2", - "lodash.uniqwith": "^4.5.0", "pino": "^9.1.0", "qrcode": "^1.5.4", "query-string": "^7.1.1", @@ -58,7 +53,7 @@ "ulid": "^2.3.0" }, "devDependencies": { - "@playwright/test": "1.53.2", + "@playwright/test": "1.57.0", "@rtk-query/codegen-openapi": "^2.0.0", "@vitejs/plugin-react": "^4.6.0", "esbuild": "^0.25.8", @@ -1741,13 +1736,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.53.2", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.53.2.tgz", - "integrity": "sha512-tEB2U5z74ebBeyfGNZ3Jfg29AnW+5HlWhvHtb/Mqco9pFdZU1ZLNdVb2UtB5CvmiilNr2ZfVH/qMmAROG/XTzw==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.57.0.tgz", + "integrity": "sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.53.2" + "playwright": "1.57.0" }, "bin": { "playwright": "cli.js" @@ -4308,9 +4303,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { @@ -4631,37 +4626,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "license": "MIT" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", - "license": "MIT" - }, - "node_modules/lodash.last": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash.last/-/lodash.last-3.0.0.tgz", - "integrity": "sha512-14mq7rSkCxG4XMy9lF2FbIOqqgF0aH0NfPuQ3LPR3vIh0kHnUvIYP70dqa1Hf47zyXfQ8FzAg0MYOQeSuE1R7A==", - "license": "MIT" - }, - "node_modules/lodash.set": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", - "integrity": "sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg==", - "license": "MIT" - }, - "node_modules/lodash.uniqwith": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniqwith/-/lodash.uniqwith-4.5.0.tgz", - "integrity": "sha512-7lYL8bLopMoy4CTICbxygAUq6CdRJ36vFc80DucPueUee+d5NBRxz3FdT9Pes/HEx5mPoT9jwnsEJWz1N7uq7Q==", - "license": "MIT" - }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -5336,13 +5300,13 @@ "license": "MIT" }, "node_modules/playwright": { - "version": "1.53.2", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.2.tgz", - "integrity": "sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.57.0.tgz", + "integrity": "sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.53.2" + "playwright-core": "1.57.0" }, "bin": { "playwright": "cli.js" @@ -5355,9 +5319,9 @@ } }, "node_modules/playwright-core": { - "version": "1.53.2", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.53.2.tgz", - "integrity": "sha512-ox/OytMy+2w1jcYEYlOo1Hhp8hZkLCximMTUTMBXjGUA1KoFfiSZ+DU+3a739jsPY0yoKH2TFy9S2fsJas8yAw==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.57.0.tgz", + "integrity": "sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==", "dev": true, "license": "Apache-2.0", "bin": { diff --git a/package.json b/package.json index 0c7f7692..f6348af4 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "build": "vite build" }, "devDependencies": { - "@playwright/test": "1.53.2", + "@playwright/test": "1.57.0", "@rtk-query/codegen-openapi": "^2.0.0", "@vitejs/plugin-react": "^4.6.0", "esbuild": "^0.25.8", @@ -37,11 +37,6 @@ "html-react-parser": "^1.3.0", "i18next": "^21.6.14", "jwt-decode": "^3.1.2", - "lodash.clonedeep": "^4.5.0", - "lodash.get": "^4.4.2", - "lodash.last": "^3.0.0", - "lodash.set": "^4.3.2", - "lodash.uniqwith": "^4.5.0", "pino": "^9.1.0", "qrcode": "^1.5.4", "query-string": "^7.1.1",