diff --git a/.docker/frankenphp/Caddyfile b/.docker/frankenphp/Caddyfile index 293ab18e..f26b6f22 100644 --- a/.docker/frankenphp/Caddyfile +++ b/.docker/frankenphp/Caddyfile @@ -51,15 +51,6 @@ # Disable Topics tracking if not enabled explicitly: https://github.com/jkarlin/topics header ?Permissions-Policy "browsing-topics=()" - # Set a strict CSP and nosniff for all static assets not handled by PHP. - # ? means "set only if not already present", so PHP responses carrying a Nelmio CSP are left untouched. - header ?Content-Security-Policy "default-src 'self'; script-src 'none'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; sandbox;" - header ?X-Content-Type-Options "nosniff" - - # SVG files get a slightly different CSP because they can embed resources and must not be framed. - @svg path *.svg *.svg.gz *.svg.br - header @svg Content-Security-Policy "default-src 'self'; script-src 'none'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; frame-ancestors 'none'; sandbox;" - # Prevent PHP execution in the media upload directory @php_in_media path_regexp (?i)^/media/.*\.(php[3-8]?|phar|phtml|pht|phps)$ respond @php_in_media 403 diff --git a/Dockerfile b/Dockerfile index 049de283..e848acc1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -193,7 +193,7 @@ RUN a2dissite 000-default.conf && \ a2enmod proxy_fcgi setenvif && \ a2enconf php${PHP_VERSION}-fpm && \ a2enconf docker-php && \ - a2enmod rewrite headers + a2enmod rewrite # Install composer and yarn dependencies for Part-DB USER www-data diff --git a/VERSION b/VERSION index ccc99d02..371a952d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.12.3 +2.12.2 diff --git a/assets/controllers/common/dirty_form_controller.js b/assets/controllers/common/dirty_form_controller.js index 8e560a3f..aad2e6b0 100644 --- a/assets/controllers/common/dirty_form_controller.js +++ b/assets/controllers/common/dirty_form_controller.js @@ -19,7 +19,8 @@ import {Controller} from "@hotwired/stimulus"; import {visit} from "@hotwired/turbo"; -import {ConfirmSwal} from "../../helpers/swal"; +import * as bootbox from "bootbox"; +import "../../css/components/bootbox_extensions.css"; import "../../css/components/dirty_form.css"; /** @@ -206,10 +207,11 @@ export default class extends Controller { } _confirmNavigation(onConfirm) { - ConfirmSwal.fire({ - titleText: this.confirmTitleValue, - text: this.confirmMessageValue, - }).then(({isConfirmed}) => { if (isConfirmed) onConfirm(); }); + bootbox.confirm({ + title: this.confirmTitleValue, + message: this.confirmMessageValue, + callback: (result) => { if (result) onConfirm(); } + }); } _handleLinkClick(event) { diff --git a/assets/controllers/elements/collection_type_controller.js b/assets/controllers/elements/collection_type_controller.js index caeb4122..647ed5e5 100644 --- a/assets/controllers/elements/collection_type_controller.js +++ b/assets/controllers/elements/collection_type_controller.js @@ -19,7 +19,8 @@ import {Controller} from "@hotwired/stimulus"; -import {AlertSwal, ConfirmSwal} from "../../helpers/swal"; +import * as bootbox from "bootbox"; +import "../../css/components/bootbox_extensions.css"; import accept from "attr-accept"; export default class extends Controller { @@ -61,7 +62,7 @@ export default class extends Controller { if(!prototype) { console.warn("Prototype is not set, we cannot create a new element. This is most likely due to missing permissions."); - AlertSwal.fire({"text": "You do not have the permissions to create a new element. (No protoype element is set)"}); + bootbox.alert("You do not have the permissions to create a new element. (No protoype element is set)"); return; } @@ -225,10 +226,8 @@ export default class extends Controller { } if(this.deleteMessageValue) { - ConfirmSwal.fire({ - text: this.deleteMessageValue, - }).then(({isConfirmed}) => { - if (isConfirmed) { + bootbox.confirm(this.deleteMessageValue, (result) => { + if (result) { del(); } }); diff --git a/assets/controllers/elements/datatables/datatables_controller.js b/assets/controllers/elements/datatables/datatables_controller.js index 4b84a834..d945004b 100644 --- a/assets/controllers/elements/datatables/datatables_controller.js +++ b/assets/controllers/elements/datatables/datatables_controller.js @@ -38,7 +38,9 @@ import 'datatables.net-colreorder-bs5'; import 'datatables.net-responsive-bs5'; import '../../../js/lib/datatables'; -import 'datatables.net-select-bs5'; +//import 'datatables.net-select-bs5'; +//Use the local version containing the fix for the select extension +import '../../../js/lib/dataTables.select.mjs'; const EVENT_DT_LOADED = 'dt:loaded'; diff --git a/assets/controllers/elements/datatables/parts_controller.js b/assets/controllers/elements/datatables/parts_controller.js index cfa386cc..c43fa276 100644 --- a/assets/controllers/elements/datatables/parts_controller.js +++ b/assets/controllers/elements/datatables/parts_controller.js @@ -20,7 +20,7 @@ import DatatablesController from "./datatables_controller.js"; import TomSelect from "tom-select"; -import {ConfirmSwal} from "../../../helpers/swal"; +import * as bootbox from "bootbox"; /** * This is the datatables controller for parts lists @@ -146,17 +146,15 @@ export default class extends DatatablesController { bubbles: true, //This line is important, otherwise Turbo will not receive the event }); - ConfirmSwal.fire({ - titleText: title, - text: message, - icon: "warning" - }).then(({isConfirmed}) => { - //If the dialog was confirmed, then submit the form. - if (isConfirmed) { - that._confirmed = true; - form.dispatchEvent(that._our_event); - } else { - that._confirmed = false; + const confirm = bootbox.confirm({ + message: message, title: title, callback: function (result) { + //If the dialog was confirmed, then submit the form. + if (result) { + that._confirmed = true; + form.dispatchEvent(that._our_event); + } else { + that._confirmed = false; + } } }); } diff --git a/assets/controllers/elements/delete_btn_controller.js b/assets/controllers/elements/delete_btn_controller.js index e1b37bcc..9ab15f7d 100644 --- a/assets/controllers/elements/delete_btn_controller.js +++ b/assets/controllers/elements/delete_btn_controller.js @@ -19,7 +19,8 @@ import {Controller} from "@hotwired/stimulus"; -import {ConfirmSwal} from "../../helpers/swal"; +import * as bootbox from "bootbox"; +import "../../css/components/bootbox_extensions.css"; export default class extends Controller { @@ -47,33 +48,32 @@ export default class extends Controller const submitter = event.submitter; const that = this; - ConfirmSwal.fire({ - titleText: title, - html: message, //Message contains a
tag and no user injectable HTML - }).then(({isConfirmed}) => { - //If the dialog was confirmed, then submit the form. - if (isConfirmed) { - //Set a flag to prevent the dialog from popping up again and allowing turbo to submit the form - that._confirmed = true; + const confirm = bootbox.confirm({ + message: message, title: title, callback: function (result) { + //If the dialog was confirmed, then submit the form. + if (result) { + //Set a flag to prevent the dialog from popping up again and allowing turbo to submit the form + that._confirmed = true; - //Create a submit button in the form and click it to submit the form - //Before a submit event was dispatched, but this caused weird issues on Firefox causing the delete request being posted twice (and the second time was returning 404). See https://github.com/Part-DB/Part-DB-server/issues/273 - const submit_btn = document.createElement('button'); - submit_btn.type = 'submit'; - submit_btn.style.display = 'none'; + //Create a submit button in the form and click it to submit the form + //Before a submit event was dispatched, but this caused weird issues on Firefox causing the delete request being posted twice (and the second time was returning 404). See https://github.com/Part-DB/Part-DB-server/issues/273 + const submit_btn = document.createElement('button'); + submit_btn.type = 'submit'; + submit_btn.style.display = 'none'; - //If the clicked button has a value, set it on the submit button - if (submitter.value) { - submit_btn.value = submitter.value; + //If the clicked button has a value, set it on the submit button + if (submitter.value) { + submit_btn.value = submitter.value; + } + if (submitter.name) { + submit_btn.name = submitter.name; + } + form.appendChild(submit_btn); + submit_btn.click(); + } else { + that._confirmed = false; } - if (submitter.name) { - submit_btn.name = submitter.name; - } - form.appendChild(submit_btn); - submit_btn.click(); - } else { - that._confirmed = false; } }); } -} +} \ No newline at end of file diff --git a/assets/controllers/elements/link_confirm_controller.js b/assets/controllers/elements/link_confirm_controller.js index be226517..3d59b492 100644 --- a/assets/controllers/elements/link_confirm_controller.js +++ b/assets/controllers/elements/link_confirm_controller.js @@ -19,7 +19,8 @@ import {Controller} from "@hotwired/stimulus"; -import {ConfirmSwal} from "../../helpers/swal"; +import * as bootbox from "bootbox"; +import "../../css/components/bootbox_extensions.css"; export default class extends Controller { @@ -52,19 +53,20 @@ export default class extends Controller const that = this; - ConfirmSwal.fire({ - titleText: this.titleValue, - text: this.messageValue, - }).then(({isConfirmed}) => { - if (isConfirmed) { - //Set a flag to prevent the dialog from popping up again and allowing turbo to submit the form - that._confirmed = true; + bootbox.confirm({ + title: this.titleValue, + message: this.messageValue, + callback: (result) => { + if (result) { + //Set a flag to prevent the dialog from popping up again and allowing turbo to submit the form + that._confirmed = true; - //Click the link - that.element.click(); - } else { - that._confirmed = false; + //Click the link + that.element.click(); + } else { + that._confirmed = false; + } } }); } -} +} \ No newline at end of file diff --git a/assets/controllers/elements/password_strength_estimate_controller.js b/assets/controllers/elements/password_strength_estimate_controller.js index 9ad2da1c..d9cfbc87 100644 --- a/assets/controllers/elements/password_strength_estimate_controller.js +++ b/assets/controllers/elements/password_strength_estimate_controller.js @@ -19,14 +19,12 @@ import {Controller} from "@hotwired/stimulus"; -import { ZxcvbnFactory } from '@zxcvbn-ts/core'; +import { zxcvbn, zxcvbnOptions } from '@zxcvbn-ts/core'; import * as zxcvbnCommonPackage from '@zxcvbn-ts/language-common'; import * as zxcvbnEnPackage from '@zxcvbn-ts/language-en'; import * as zxcvbnDePackage from '@zxcvbn-ts/language-de'; import * as zxcvbnFrPackage from '@zxcvbn-ts/language-fr'; import * as zxcvbnJaPackage from '@zxcvbn-ts/language-ja'; -import * as zxcvbnItPackage from '@zxcvbn-ts/language-it'; -import * as zxcvbnPlPackage from '@zxcvbn-ts/language-pl'; import {trans} from '../../translator.js'; /* stimulusFetch: 'lazy' */ @@ -36,8 +34,6 @@ export default class extends Controller { static targets = ["badge", "warning"] - _zxcvbnFactory; - _getTranslations() { //Get the current locale const locale = document.documentElement.lang; @@ -47,10 +43,6 @@ export default class extends Controller { return zxcvbnFrPackage.translations; } else if (locale.includes('ja')) { return zxcvbnJaPackage.translations; - } else if (locale.includes('it')) { - return zxcvbnItPackage.translations; - } else if (locale.includes('pl')) { - return zxcvbnPlPackage.translations; } //Fallback to english @@ -64,39 +56,34 @@ export default class extends Controller { //Configure zxcvbn const options = { graphs: zxcvbnCommonPackage.adjacencyGraphs, - useLevenshtein: true, dictionary: { ...zxcvbnCommonPackage.dictionary, // We could use the english dictionary here too, but it is very big. So we just use the common words - ...zxcvbnEnPackage.dictionary, - ...zxcvbnDePackage.dictionary, - - "partdb": ['part-db', 'partdb', 'part_db', 'part-db-symfony', 'partdb-symfony', 'part_db_symfony'], + //...zxcvbnEnPackage.dictionary, }, translations: this._getTranslations(), }; - - this._zxcvbnFactory = new ZxcvbnFactory(options); + zxcvbnOptions.setOptions(options); //Add event listener to the password input field this._passwordInput.addEventListener('input', this._onPasswordInput.bind(this)); } - async _onPasswordInput() { + _onPasswordInput() { //Retrieve the password const password = this._passwordInput.value; //Estimate the password strength - const result = await this._zxcvbnFactory.checkAsync(password); + const result = zxcvbn(password); //Update the badge this.badgeTarget.parentElement.classList.remove("d-none"); - this._setBadgeToLevel(result.score, result.crackTimes.onlineNoThrottlingXPerSecond.display); + this._setBadgeToLevel(result.score); this.warningTarget.innerHTML = result.feedback.warning; } - _setBadgeToLevel(level, time = null) { + _setBadgeToLevel(level) { let text, classes; switch (level) { @@ -131,11 +118,5 @@ export default class extends Controller { //Re-add the classes this.badgeTarget.classList.add("badge"); this.badgeTarget.classList.add(...classes.split(" ")); - - if (time) { - this.badgeTarget.setAttribute("title", trans("user.password_strength.crack_time", {"%time%": time})); - } else { - this.badgeTarget.removeAttribute("title"); - } } } diff --git a/assets/controllers/pages/reelCalculator_controller.js b/assets/controllers/pages/reelCalculator_controller.js index e0b2c4ba..a134bf9b 100644 --- a/assets/controllers/pages/reelCalculator_controller.js +++ b/assets/controllers/pages/reelCalculator_controller.js @@ -18,7 +18,7 @@ */ import {Controller} from "@hotwired/stimulus"; -import {AlertSwal} from "../../helpers/swal"; +import * as bootbox from "bootbox"; export default class extends Controller { @@ -35,12 +35,12 @@ export default class extends Controller { const part_distance = document.getElementById('reel_part_distance').value; if (dia_inner == "" || dia_outer == "" || tape_thickness == "") { - AlertSwal.fire({title: this.errorMissingValuesValue}); + bootbox.alert(this.errorMissingValuesValue); return; } if (dia_outer**dia_outer < dia_inner**dia_inner) { - AlertSwal.fire({title: this.errorOuterGreaterInnerValue}); + bootbox.alert(this.errorOuterGreaterInnerValue); return; } @@ -61,12 +61,12 @@ export default class extends Controller { return; } - const parts_per_meter = 1 / (part_distance / 1000); + var parts_per_meter = 1 / (part_distance / 1000); document.getElementById('result_parts_per_meter').textContent = parts_per_meter.toFixed(2) + ' 1/m'; - const parts_amount = (length / 1000) * parts_per_meter; + var parts_amount = (length/1000) * parts_per_meter; - document.getElementById('result_amount').textContent = Math.floor(parts_amount).toString(); + document.getElementById('result_amount').textContent = Math.floor(parts_amount); } -} +} \ No newline at end of file diff --git a/assets/themes/brite.js b/assets/css/components/bootbox_extensions.css similarity index 58% rename from assets/themes/brite.js rename to assets/css/components/bootbox_extensions.css index 41b82e93..42bbd78d 100644 --- a/assets/themes/brite.js +++ b/assets/css/components/bootbox_extensions.css @@ -1,7 +1,7 @@ /* * This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony). * - * Copyright (C) 2019 - 2026 Jan Böhmer (https://github.com/jbtronics) + * Copyright (C) 2019 - 2022 Jan Böhmer (https://github.com/jbtronics) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published @@ -17,4 +17,30 @@ * along with this program. If not, see . */ -import "bootswatch/dist/brite/bootstrap.css"; +.modal-body > .bootbox-close-button { + position: absolute; + top: 0; + right: 0; + padding: 0.5rem 0.75rem; + z-index: 1; +} +.modal .bootbox-close-button { + font-weight: 100; +} + +button.bootbox-close-button { + padding: 0; + background-color: transparent; + border: 0; + -webkit-appearance: none; +} + +.bootbox-close-button { + /* float: right; */ + font-size: 1.40625rem; + font-weight: 600; + line-height: 1; + color: #000; + text-shadow: none; + opacity: .5; +} \ No newline at end of file diff --git a/assets/css/components/swal.css b/assets/css/components/swal.css deleted file mode 100644 index 4c2302a9..00000000 --- a/assets/css/components/swal.css +++ /dev/null @@ -1,50 +0,0 @@ -/* - * This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony). - * - * Copyright (C) 2019 - 2026 Jan Böhmer (https://github.com/jbtronics) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -/** - * Respect the dark mode of Bootstrap 5 set via data-bs-theme="dark" on the element. This is done by overriding the CSS variables of the bootstrap-5 theme of SweetAlert2. - */ - -html[data-bs-theme="dark"] [data-swal2-theme='bootstrap-5'] { - /* POPUP */ - --swal2-background: #212529; - --swal2-color: #fff; - --swal2-border: 1px solid #495057; - - /* INPUT */ - --swal2-input-background: #2b3035; - --swal2-input-border: 1px solid #495057; - --swal2-input-focus-border: 1px solid #86b7fe; - --swal2-input-focus-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075), 0 0 0 0.25rem rgba(13, 110, 253, 0.25); - - /* VALIDATION MESSAGE */ - --swal2-validation-message-background: #2c0b0e; - --swal2-validation-message-color: #ea868f; - - /* FOOTER */ - --swal2-footer-border-color: #495057; - --swal2-footer-background: #343a40; - --swal2-footer-color: #adb5bd; - - /* CLOSE BUTTON */ - --swal2-close-button-color: #fff; - - /* TOASTS */ - --swal2-toast-border: 1px solid #495057; -} diff --git a/assets/helpers/swal.js b/assets/helpers/swal.js deleted file mode 100644 index e370a9ed..00000000 --- a/assets/helpers/swal.js +++ /dev/null @@ -1,44 +0,0 @@ -/* - * This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony). - * - * Copyright (C) 2019 - 2022 Jan Böhmer (https://github.com/jbtronics) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -import Swal from 'sweetalert2'; -import 'sweetalert2/themes/bootstrap-5.css'; -import '../css/components/swal.css' -import { trans } from '../translator'; - -const BaseSwal = Swal.mixin({ - position: "top", - theme: "bootstrap-5", - confirmButtonText: trans('dialog.btn.ok'), - cancelButtonText: trans('dialog.btn.cancel'), - denyButtonText: trans('dialog.btn.deny'), -}); - -const ConfirmSwal = BaseSwal.mixin({ - showCancelButton: true, - showCloseButton: true, - icon: "warning", -}); - -const AlertSwal = BaseSwal.mixin({ - showCloseButton: true, - icon: "info", -}); - -export { ConfirmSwal, AlertSwal, BaseSwal, BaseSwal as default,}; diff --git a/assets/js/app.js b/assets/js/app.js index 355fe919..4dd39581 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -30,21 +30,21 @@ import '../css/app/images.css'; // start the Stimulus application import '../stimulus_bootstrap'; -import $ from 'jquery'; +// Need jQuery? Install it with "yarn add jquery", then uncomment to require it. +const $ = require('jquery'); //Only include javascript import '@fortawesome/fontawesome-free/css/all.css' -import 'bootstrap'; +require('bootstrap'); import "./error_handler"; import "./tab_remember"; import "./register_events"; import "./tristate_checkboxes"; -// Expose jQuery globally so legacy plugins and Bootstrap's jQuery integration -// can find it on window at runtime. -global.$ = global.jQuery = $; +//Define jquery globally +global.$ = global.jQuery = require("jquery"); //Use the local WASM file for the ZXing library import { diff --git a/assets/js/error_handler.js b/assets/js/error_handler.js index 67695fb9..7f047af9 100644 --- a/assets/js/error_handler.js +++ b/assets/js/error_handler.js @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -import Swal from "../helpers/swal"; +import * as bootbox from "bootbox"; /** * If this class is imported the user is shown an error dialog if he calls an page via Turbo and an error is responded. @@ -40,6 +40,21 @@ class ErrorHandlerHelper { _showAlert(statusText, statusCode, location, responseHTML) { const httpStatusToText = { + '200': 'OK', + '201': 'Created', + '202': 'Accepted', + '203': 'Non-Authoritative Information', + '204': 'No Content', + '205': 'Reset Content', + '206': 'Partial Content', + '300': 'Multiple Choices', + '301': 'Moved Permanently', + '302': 'Found', + '303': 'See Other', + '304': 'Not Modified', + '305': 'Use Proxy', + '306': 'Unused', + '307': 'Temporary Redirect', '400': 'Bad Request', '401': 'Unauthorized', '402': 'Payment Required', @@ -68,67 +83,49 @@ class ErrorHandlerHelper { '505': 'HTTP Version Not Supported', }; - const userFriendlyMessages = { - '400': 'The request was invalid or malformed.', - '401': 'You need to log in to access this resource.', - '403': 'You don\'t have permission to access this resource.', - '404': 'The requested page or resource could not be found.', - '408': 'The request timed out. Please check your connection and try again.', - '409': 'There was a conflict with the current state of the resource.', - '429': 'Too many requests sent. Please wait a moment and try again.', - '500': 'An internal server error occurred. This is not your fault.', - '502': 'The server received an invalid response from an upstream service.', - '503': 'The service is temporarily unavailable. Please try again later.', - '504': 'The server did not respond in time. Please try again later.', - }; - + //If the statusText is empty, we use the status code as text if (!statusText) { - statusText = httpStatusToText[String(statusCode)] ?? 'Unknown Error'; + statusText = httpStatusToText[statusCode]; } - const title = `${statusText} (HTTP ${statusCode})`; - const friendlyMsg = userFriendlyMessages[String(statusCode)] - ?? 'An unexpected error occurred. Please try again or contact the administrator.'; + //Create error text + const title = statusText + ' (Status ' + statusCode + ')'; - const short_location = location.length > 80 - ? location.substring(0, 80) + '…' - : location; + let trimString = function (string, length) { + return string.length > length ? + string.substring(0, length) + '...' : + string; + }; - const msg = ` -

${friendlyMsg}

-

If this error keeps happening, please contact your administrator.

- -
- -
`; + const short_location = trimString(location, 50); - const footer = `Error while loading: ${short_location}`; + const alert = bootbox.alert( + { + size: 'large', + message: function() { + let url = location; + let msg = `Error calling ${short_location}.
`; + msg += 'Try to reload the page or contact the administrator if this error persists.'; - Swal.fire({ - icon: 'error', - title: title, - html: msg, - footer: footer, - width: '90%', - confirmButtonText: 'Reload page', - showCancelButton: true, - cancelButtonText: 'Close', - showCloseButton: true, - reverseButtons: true, - didOpen: () => { - const dstFrame = document.getElementById('error-iframe'); - //@ts-ignore - const dstDoc = dstFrame.contentDocument || dstFrame.contentWindow.document; - dstDoc.write(responseHTML); - dstDoc.close(); - }, - }).then((result) => { - document.getElementById('content').classList.remove('loading-content'); - if (result.isConfirmed) { - window.location.reload(); - } + msg += '

' + 'View details' + ""; + msg += "
"; + + return msg; + }, + title: title, + callback: function () { + //Remove blur + $('#content').removeClass('loading-content'); + } + + }); + + alert.init(function (){ + var dstFrame = document.getElementById('error-iframe'); + //@ts-ignore + var dstDoc = dstFrame.contentDocument || dstFrame.contentWindow.document; + dstDoc.write(responseHTML) + dstDoc.close(); }); } @@ -174,4 +171,4 @@ class ErrorHandlerHelper { } } -export default new ErrorHandlerHelper(); +export default new ErrorHandlerHelper(); \ No newline at end of file diff --git a/assets/js/lib/dataTables.select.mjs b/assets/js/lib/dataTables.select.mjs new file mode 100644 index 00000000..bba97692 --- /dev/null +++ b/assets/js/lib/dataTables.select.mjs @@ -0,0 +1,1538 @@ +/********************* + * This is the fixed version of the select extension for DataTables with the fix for the issue with the select extension + * (https://github.com/DataTables/Select/issues/51) + * We use this instead of the yarn version until the PR (https://github.com/DataTables/Select/pull/52) is merged and released + * /*******************/ + + +/*! Select for DataTables 2.0.0 + * © SpryMedia Ltd - datatables.net/license/mit + */ + +import jQuery from 'jquery'; +import DataTable from 'datatables.net'; + +// Allow reassignment of the $ variable +let $ = jQuery; + + +// Version information for debugger +DataTable.select = {}; + +DataTable.select.version = '2.0.0'; + +DataTable.select.init = function (dt) { + var ctx = dt.settings()[0]; + + if (!DataTable.versionCheck('2')) { + throw 'Warning: Select requires DataTables 2 or newer'; + } + + if (ctx._select) { + return; + } + + var savedSelected = dt.state.loaded(); + + var selectAndSave = function (e, settings, data) { + if (data === null || data.select === undefined) { + return; + } + + // Clear any currently selected rows, before restoring state + // None will be selected on first initialisation + if (dt.rows({ selected: true }).any()) { + dt.rows().deselect(); + } + if (data.select.rows !== undefined) { + dt.rows(data.select.rows).select(); + } + + if (dt.columns({ selected: true }).any()) { + dt.columns().deselect(); + } + if (data.select.columns !== undefined) { + dt.columns(data.select.columns).select(); + } + + if (dt.cells({ selected: true }).any()) { + dt.cells().deselect(); + } + if (data.select.cells !== undefined) { + for (var i = 0; i < data.select.cells.length; i++) { + dt.cell(data.select.cells[i].row, data.select.cells[i].column).select(); + } + } + + dt.state.save(); + }; + + dt.on('stateSaveParams', function (e, settings, data) { + data.select = {}; + data.select.rows = dt.rows({ selected: true }).ids(true).toArray(); + data.select.columns = dt.columns({ selected: true })[0]; + data.select.cells = dt.cells({ selected: true })[0].map(function (coords) { + return { row: dt.row(coords.row).id(true), column: coords.column }; + }); + }) + .on('stateLoadParams', selectAndSave) + .one('init', function () { + selectAndSave(undefined, undefined, savedSelected); + }); + + var init = ctx.oInit.select; + var defaults = DataTable.defaults.select; + var opts = init === undefined ? defaults : init; + + // Set defaults + var items = 'row'; + var style = 'api'; + var blurable = false; + var toggleable = true; + var info = true; + var selector = 'td, th'; + var className = 'selected'; + var headerCheckbox = true; + var setStyle = false; + + ctx._select = { + infoEls: [] + }; + + // Initialisation customisations + if (opts === true) { + style = 'os'; + setStyle = true; + } + else if (typeof opts === 'string') { + style = opts; + setStyle = true; + } + else if ($.isPlainObject(opts)) { + if (opts.blurable !== undefined) { + blurable = opts.blurable; + } + + if (opts.toggleable !== undefined) { + toggleable = opts.toggleable; + } + + if (opts.info !== undefined) { + info = opts.info; + } + + if (opts.items !== undefined) { + items = opts.items; + } + + if (opts.style !== undefined) { + style = opts.style; + setStyle = true; + } + else { + style = 'os'; + setStyle = true; + } + + if (opts.selector !== undefined) { + selector = opts.selector; + } + + if (opts.className !== undefined) { + className = opts.className; + } + + if (opts.headerCheckbox !== undefined) { + headerCheckbox = opts.headerCheckbox; + } + } + + dt.select.selector(selector); + dt.select.items(items); + dt.select.style(style); + dt.select.blurable(blurable); + dt.select.toggleable(toggleable); + dt.select.info(info); + ctx._select.className = className; + + // If the init options haven't enabled select, but there is a selectable + // class name, then enable + if (!setStyle && $(dt.table().node()).hasClass('selectable')) { + dt.select.style('os'); + } + + // Insert a checkbox into the header if needed - might need to wait + // for init complete, or it might already be done + if (headerCheckbox) { + initCheckboxHeader(dt); + + dt.on('init', function () { + initCheckboxHeader(dt); + }); + } +}; + +/* + +Select is a collection of API methods, event handlers, event emitters and +buttons (for the `Buttons` extension) for DataTables. It provides the following +features, with an overview of how they are implemented: + +## Selection of rows, columns and cells. Whether an item is selected or not is + stored in: + +* rows: a `_select_selected` property which contains a boolean value of the + DataTables' `aoData` object for each row +* columns: a `_select_selected` property which contains a boolean value of the + DataTables' `aoColumns` object for each column +* cells: a `_selected_cells` property which contains an array of boolean values + of the `aoData` object for each row. The array is the same length as the + columns array, with each element of it representing a cell. + +This method of using boolean flags allows Select to operate when nodes have not +been created for rows / cells (DataTables' defer rendering feature). + +## API methods + +A range of API methods are available for triggering selection and de-selection +of rows. Methods are also available to configure the selection events that can +be triggered by an end user (such as which items are to be selected). To a large +extent, these of API methods *is* Select. It is basically a collection of helper +functions that can be used to select items in a DataTable. + +Configuration of select is held in the object `_select` which is attached to the +DataTables settings object on initialisation. Select being available on a table +is not optional when Select is loaded, but its default is for selection only to +be available via the API - so the end user wouldn't be able to select rows +without additional configuration. + +The `_select` object contains the following properties: + +``` +{ + items:string - Can be `rows`, `columns` or `cells`. Defines what item + will be selected if the user is allowed to activate row + selection using the mouse. + style:string - Can be `none`, `single`, `multi` or `os`. Defines the + interaction style when selecting items + blurable:boolean - If row selection can be cleared by clicking outside of + the table + toggleable:boolean - If row selection can be cancelled by repeated clicking + on the row + info:boolean - If the selection summary should be shown in the table + information elements + infoEls:element[] - List of HTML elements with info elements for a table +} +``` + +In addition to the API methods, Select also extends the DataTables selector +options for rows, columns and cells adding a `selected` option to the selector +options object, allowing the developer to select only selected items or +unselected items. + +## Mouse selection of items + +Clicking on items can be used to select items. This is done by a simple event +handler that will select the items using the API methods. + + */ + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Local functions + */ + +/** + * Add one or more cells to the selection when shift clicking in OS selection + * style cell selection. + * + * Cell range is more complicated than row and column as we want to select + * in the visible grid rather than by index in sequence. For example, if you + * click first in cell 1-1 and then shift click in 2-2 - cells 1-2 and 2-1 + * should also be selected (and not 1-3, 1-4. etc) + * + * @param {DataTable.Api} dt DataTable + * @param {object} idx Cell index to select to + * @param {object} last Cell index to select from + * @private + */ +function cellRange(dt, idx, last) { + var indexes; + var columnIndexes; + var rowIndexes; + var selectColumns = function (start, end) { + if (start > end) { + var tmp = end; + end = start; + start = tmp; + } + + var record = false; + return dt + .columns(':visible') + .indexes() + .filter(function (i) { + if (i === start) { + record = true; + } + + if (i === end) { + // not else if, as start might === end + record = false; + return true; + } + + return record; + }); + }; + + var selectRows = function (start, end) { + var indexes = dt.rows({ search: 'applied' }).indexes(); + + // Which comes first - might need to swap + if (indexes.indexOf(start) > indexes.indexOf(end)) { + var tmp = end; + end = start; + start = tmp; + } + + var record = false; + return indexes.filter(function (i) { + if (i === start) { + record = true; + } + + if (i === end) { + record = false; + return true; + } + + return record; + }); + }; + + if (!dt.cells({ selected: true }).any() && !last) { + // select from the top left cell to this one + columnIndexes = selectColumns(0, idx.column); + rowIndexes = selectRows(0, idx.row); + } + else { + // Get column indexes between old and new + columnIndexes = selectColumns(last.column, idx.column); + rowIndexes = selectRows(last.row, idx.row); + } + + indexes = dt.cells(rowIndexes, columnIndexes).flatten(); + + if (!dt.cells(idx, { selected: true }).any()) { + // Select range + dt.cells(indexes).select(); + } + else { + // Deselect range + dt.cells(indexes).deselect(); + } +} + +/** + * Disable mouse selection by removing the selectors + * + * @param {DataTable.Api} dt DataTable to remove events from + * @private + */ +function disableMouseSelection(dt) { + var ctx = dt.settings()[0]; + var selector = ctx._select.selector; + + $(dt.table().container()) + .off('mousedown.dtSelect', selector) + .off('mouseup.dtSelect', selector) + .off('click.dtSelect', selector); + + $('body').off('click.dtSelect' + _safeId(dt.table().node())); +} + +/** + * Attach mouse listeners to the table to allow mouse selection of items + * + * @param {DataTable.Api} dt DataTable to remove events from + * @private + */ +function enableMouseSelection(dt) { + var container = $(dt.table().container()); + var ctx = dt.settings()[0]; + var selector = ctx._select.selector; + var matchSelection; + + container + .on('mousedown.dtSelect', selector, function (e) { + // Disallow text selection for shift clicking on the table so multi + // element selection doesn't look terrible! + if (e.shiftKey || e.metaKey || e.ctrlKey) { + container + .css('-moz-user-select', 'none') + .one('selectstart.dtSelect', selector, function () { + return false; + }); + } + + if (window.getSelection) { + matchSelection = window.getSelection(); + } + }) + .on('mouseup.dtSelect', selector, function () { + // Allow text selection to occur again, Mozilla style (tested in FF + // 35.0.1 - still required) + container.css('-moz-user-select', ''); + }) + .on('click.dtSelect', selector, function (e) { + var items = dt.select.items(); + var idx; + + // If text was selected (click and drag), then we shouldn't change + // the row's selected state + if (matchSelection) { + var selection = window.getSelection(); + + // If the element that contains the selection is not in the table, we can ignore it + // This can happen if the developer selects text from the click event + if ( + !selection.anchorNode || + $(selection.anchorNode).closest('table')[0] === dt.table().node() + ) { + if (selection !== matchSelection) { + return; + } + } + } + + var ctx = dt.settings()[0]; + var container = dt.table().container(); + + // Ignore clicks inside a sub-table + if ($(e.target).closest('div.dt-container')[0] != container) { + return; + } + + var cell = dt.cell($(e.target).closest('td, th')); + + // Check the cell actually belongs to the host DataTable (so child + // rows, etc, are ignored) + if (!cell.any()) { + return; + } + + var event = $.Event('user-select.dt'); + eventTrigger(dt, event, [items, cell, e]); + + if (event.isDefaultPrevented()) { + return; + } + + var cellIndex = cell.index(); + if (items === 'row') { + idx = cellIndex.row; + typeSelect(e, dt, ctx, 'row', idx); + } + else if (items === 'column') { + idx = cell.index().column; + typeSelect(e, dt, ctx, 'column', idx); + } + else if (items === 'cell') { + idx = cell.index(); + typeSelect(e, dt, ctx, 'cell', idx); + } + + ctx._select_lastCell = cellIndex; + }); + + // Blurable + $('body').on('click.dtSelect' + _safeId(dt.table().node()), function (e) { + if (ctx._select.blurable) { + // If the click was inside the DataTables container, don't blur + if ($(e.target).parents().filter(dt.table().container()).length) { + return; + } + + // Ignore elements which have been removed from the DOM (i.e. paging + // buttons) + if ($(e.target).parents('html').length === 0) { + return; + } + + // Don't blur in Editor form + if ($(e.target).parents('div.DTE').length) { + return; + } + + var event = $.Event('select-blur.dt'); + eventTrigger(dt, event, [e.target, e]); + + if (event.isDefaultPrevented()) { + return; + } + + clear(ctx, true); + } + }); +} + +/** + * Trigger an event on a DataTable + * + * @param {DataTable.Api} api DataTable to trigger events on + * @param {boolean} selected true if selected, false if deselected + * @param {string} type Item type acting on + * @param {boolean} any Require that there are values before + * triggering + * @private + */ +function eventTrigger(api, type, args, any) { + if (any && !api.flatten().length) { + return; + } + + if (typeof type === 'string') { + type = type + '.dt'; + } + + args.unshift(api); + + $(api.table().node()).trigger(type, args); +} + +/** + * Update the information element of the DataTable showing information about the + * items selected. This is done by adding tags to the existing text + * + * @param {DataTable.Api} api DataTable to update + * @private + */ +function info(api, node) { + if (api.select.style() === 'api' || api.select.info() === false) { + return; + } + + var rows = api.rows({ selected: true }).flatten().length; + var columns = api.columns({ selected: true }).flatten().length; + var cells = api.cells({ selected: true }).flatten().length; + + var add = function (el, name, num) { + el.append( + $('').append( + api.i18n( + 'select.' + name + 's', + { _: '%d ' + name + 's selected', 0: '', 1: '1 ' + name + ' selected' }, + num + ) + ) + ); + }; + + var el = $(node); + var output = $(''); + + add(output, 'row', rows); + add(output, 'column', columns); + add(output, 'cell', cells); + + var existing = el.children('span.select-info'); + + if (existing.length) { + existing.remove(); + } + + if (output.text() !== '') { + el.append(output); + } +} + +/** + * Add a checkbox to the header for checkbox columns, allowing all rows to + * be selected, deselected or just to show the state. + * + * @param {*} dt API + */ +function initCheckboxHeader( dt ) { + // Find any checkbox column(s) + dt.columns('.dt-select').every(function () { + var header = this.header(); + + if (! $('input', header).length) { + // If no checkbox yet, insert one + var input = $('') + .attr({ + class: 'dt-select-checkbox', + type: 'checkbox', + 'aria-label': dt.i18n('select.aria.headerCheckbox') || 'Select all rows' + }) + .appendTo(header) + .on('change', function () { + if (this.checked) { + dt.rows({search: 'applied'}).select(); + } + else { + dt.rows({selected: true}).deselect(); + } + }) + .on('click', function (e) { + e.stopPropagation(); + }); + + // Update the header checkbox's state when the selection in the + // table changes + dt.on('draw select deselect', function (e, pass, type) { + if (type === 'row' || ! type) { + var count = dt.rows({selected: true}).count(); + var search = dt.rows({search: 'applied', selected: true}).count(); + var available = dt.rows({search: 'applied'}).count(); + + if (search && search <= count && search === available) { + input + .prop('checked', true) + .prop('indeterminate', false); + } + else if (search === 0 && count === 0) { + input + .prop('checked', false) + .prop('indeterminate', false); + } + else { + input + .prop('checked', false) + .prop('indeterminate', true); + } + } + }); + } + }); +} + +/** + * Initialisation of a new table. Attach event handlers and callbacks to allow + * Select to operate correctly. + * + * This will occur _after_ the initial DataTables initialisation, although + * before Ajax data is rendered, if there is ajax data + * + * @param {DataTable.settings} ctx Settings object to operate on + * @private + */ +function init(ctx) { + var api = new DataTable.Api(ctx); + ctx._select_init = true; + + // Row callback so that classes can be added to rows and cells if the item + // was selected before the element was created. This will happen with the + // `deferRender` option enabled. + // + // This method of attaching to `aoRowCreatedCallback` is a hack until + // DataTables has proper events for row manipulation If you are reviewing + // this code to create your own plug-ins, please do not do this! + ctx.aoRowCreatedCallback.push(function (row, data, index) { + var i, ien; + var d = ctx.aoData[index]; + + // Row + if (d._select_selected) { + $(row).addClass(ctx._select.className); + } + + // Cells and columns - if separated out, we would need to do two + // loops, so it makes sense to combine them into a single one + for (i = 0, ien = ctx.aoColumns.length; i < ien; i++) { + if ( + ctx.aoColumns[i]._select_selected || + (d._selected_cells && d._selected_cells[i]) + ) { + $(d.anCells[i]).addClass(ctx._select.className); + } + } + } + ); + + // On Ajax reload we want to reselect all rows which are currently selected, + // if there is an rowId (i.e. a unique value to identify each row with) + api.on('preXhr.dt.dtSelect', function (e, settings) { + if (settings !== api.settings()[0]) { + // Not triggered by our DataTable! + return; + } + + // note that column selection doesn't need to be cached and then + // reselected, as they are already selected + var rows = api + .rows({ selected: true }) + .ids(true) + .filter(function (d) { + return d !== undefined; + }); + + var cells = api + .cells({ selected: true }) + .eq(0) + .map(function (cellIdx) { + var id = api.row(cellIdx.row).id(true); + return id ? { row: id, column: cellIdx.column } : undefined; + }) + .filter(function (d) { + return d !== undefined; + }); + + // On the next draw, reselect the currently selected items + api.one('draw.dt.dtSelect', function () { + api.rows(rows).select(); + + // `cells` is not a cell index selector, so it needs a loop + if (cells.any()) { + cells.each(function (id) { + api.cells(id.row, id.column).select(); + }); + } + }); + }); + + // Update the table information element with selected item summary + api.on('info.dt', function (e, ctx, node) { + // Store the info node for updating on select / deselect + if (!ctx._select.infoEls.includes(node)) { + ctx._select.infoEls.push(node); + } + + info(api, node); + }); + + api.on('select.dtSelect.dt deselect.dtSelect.dt', function () { + ctx._select.infoEls.forEach(function (el) { + info(api, el); + }); + + api.state.save(); + }); + + // Clean up and release + api.on('destroy.dtSelect', function () { + // Remove class directly rather than calling deselect - which would trigger events + $(api.rows({ selected: true }).nodes()).removeClass(api.settings()[0]._select.className); + + disableMouseSelection(api); + api.off('.dtSelect'); + $('body').off('.dtSelect' + _safeId(api.table().node())); + }); +} + +/** + * Add one or more items (rows or columns) to the selection when shift clicking + * in OS selection style + * + * @param {DataTable.Api} dt DataTable + * @param {string} type Row or column range selector + * @param {object} idx Item index to select to + * @param {object} last Item index to select from + * @private + */ +function rowColumnRange(dt, type, idx, last) { + // Add a range of rows from the last selected row to this one + var indexes = dt[type + 's']({ search: 'applied' }).indexes(); + var idx1 = indexes.indexOf(last); + var idx2 = indexes.indexOf(idx); + + if (!dt[type + 's']({ selected: true }).any() && idx1 === -1) { + // select from top to here - slightly odd, but both Windows and Mac OS + // do this + indexes.splice(indexes.indexOf(idx) + 1, indexes.length); + } + else { + // reverse so we can shift click 'up' as well as down + if (idx1 > idx2) { + var tmp = idx2; + idx2 = idx1; + idx1 = tmp; + } + + indexes.splice(idx2 + 1, indexes.length); + indexes.splice(0, idx1); + } + + if (!dt[type](idx, { selected: true }).any()) { + // Select range + dt[type + 's'](indexes).select(); + } + else { + // Deselect range - need to keep the clicked on row selected + indexes.splice(indexes.indexOf(idx), 1); + dt[type + 's'](indexes).deselect(); + } +} + +/** + * Clear all selected items + * + * @param {DataTable.settings} ctx Settings object of the host DataTable + * @param {boolean} [force=false] Force the de-selection to happen, regardless + * of selection style + * @private + */ +function clear(ctx, force) { + if (force || ctx._select.style === 'single') { + var api = new DataTable.Api(ctx); + + api.rows({ selected: true }).deselect(); + api.columns({ selected: true }).deselect(); + api.cells({ selected: true }).deselect(); + } +} + +/** + * Select items based on the current configuration for style and items. + * + * @param {object} e Mouse event object + * @param {DataTables.Api} dt DataTable + * @param {DataTable.settings} ctx Settings object of the host DataTable + * @param {string} type Items to select + * @param {int|object} idx Index of the item to select + * @private + */ +function typeSelect(e, dt, ctx, type, idx) { + var style = dt.select.style(); + var toggleable = dt.select.toggleable(); + var isSelected = dt[type](idx, { selected: true }).any(); + + if (isSelected && !toggleable) { + return; + } + + if (style === 'os') { + if (e.ctrlKey || e.metaKey) { + // Add or remove from the selection + dt[type](idx).select(!isSelected); + } + else if (e.shiftKey) { + if (type === 'cell') { + cellRange(dt, idx, ctx._select_lastCell || null); + } + else { + rowColumnRange( + dt, + type, + idx, + ctx._select_lastCell ? ctx._select_lastCell[type] : null + ); + } + } + else { + // No cmd or shift click - deselect if selected, or select + // this row only + var selected = dt[type + 's']({ selected: true }); + + if (isSelected && selected.flatten().length === 1) { + dt[type](idx).deselect(); + } + else { + selected.deselect(); + dt[type](idx).select(); + } + } + } + else if (style == 'multi+shift') { + if (e.shiftKey) { + if (type === 'cell') { + cellRange(dt, idx, ctx._select_lastCell || null); + } + else { + rowColumnRange( + dt, + type, + idx, + ctx._select_lastCell ? ctx._select_lastCell[type] : null + ); + } + } + else { + dt[type](idx).select(!isSelected); + } + } + else { + dt[type](idx).select(!isSelected); + } +} + +function _safeId(node) { + return node.id.replace(/[^a-zA-Z0-9\-\_]/g, '-'); +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * DataTables selectors + */ + +// row and column are basically identical just assigned to different properties +// and checking a different array, so we can dynamically create the functions to +// reduce the code size +$.each( + [ + { type: 'row', prop: 'aoData' }, + { type: 'column', prop: 'aoColumns' } + ], + function (i, o) { + DataTable.ext.selector[o.type].push(function (settings, opts, indexes) { + var selected = opts.selected; + var data; + var out = []; + + if (selected !== true && selected !== false) { + return indexes; + } + + for (var i = 0, ien = indexes.length; i < ien; i++) { + data = settings[o.prop][indexes[i]]; + + if ( + data && ( + (selected === true && data._select_selected === true) || + (selected === false && !data._select_selected) + ) + ) { + out.push(indexes[i]); + } + } + + return out; + }); + } +); + +DataTable.ext.selector.cell.push(function (settings, opts, cells) { + var selected = opts.selected; + var rowData; + var out = []; + + if (selected === undefined) { + return cells; + } + + for (var i = 0, ien = cells.length; i < ien; i++) { + rowData = settings.aoData[cells[i].row]; + + if ( + rowData && ( + (selected === true && + rowData._selected_cells && + rowData._selected_cells[cells[i].column] === true) || + (selected === false && + (!rowData._selected_cells || !rowData._selected_cells[cells[i].column])) + ) + ) { + out.push(cells[i]); + } + } + + return out; +}); + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * DataTables API + * + * For complete documentation, please refer to the docs/api directory or the + * DataTables site + */ + +// Local variables to improve compression +var apiRegister = DataTable.Api.register; +var apiRegisterPlural = DataTable.Api.registerPlural; + +apiRegister('select()', function () { + return this.iterator('table', function (ctx) { + DataTable.select.init(new DataTable.Api(ctx)); + }); +}); + +apiRegister('select.blurable()', function (flag) { + if (flag === undefined) { + return this.context[0]._select.blurable; + } + + return this.iterator('table', function (ctx) { + ctx._select.blurable = flag; + }); +}); + +apiRegister('select.toggleable()', function (flag) { + if (flag === undefined) { + return this.context[0]._select.toggleable; + } + + return this.iterator('table', function (ctx) { + ctx._select.toggleable = flag; + }); +}); + +apiRegister('select.info()', function (flag) { + if (flag === undefined) { + return this.context[0]._select.info; + } + + return this.iterator('table', function (ctx) { + ctx._select.info = flag; + }); +}); + +apiRegister('select.items()', function (items) { + if (items === undefined) { + return this.context[0]._select.items; + } + + return this.iterator('table', function (ctx) { + ctx._select.items = items; + + eventTrigger(new DataTable.Api(ctx), 'selectItems', [items]); + }); +}); + +// Takes effect from the _next_ selection. None disables future selection, but +// does not clear the current selection. Use the `deselect` methods for that +apiRegister('select.style()', function (style) { + if (style === undefined) { + return this.context[0]._select.style; + } + + return this.iterator('table', function (ctx) { + if (!ctx._select) { + DataTable.select.init(new DataTable.Api(ctx)); + } + + if (!ctx._select_init) { + init(ctx); + } + + ctx._select.style = style; + + // Add / remove mouse event handlers. They aren't required when only + // API selection is available + var dt = new DataTable.Api(ctx); + disableMouseSelection(dt); + + if (style !== 'api') { + enableMouseSelection(dt); + } + + eventTrigger(new DataTable.Api(ctx), 'selectStyle', [style]); + }); +}); + +apiRegister('select.selector()', function (selector) { + if (selector === undefined) { + return this.context[0]._select.selector; + } + + return this.iterator('table', function (ctx) { + disableMouseSelection(new DataTable.Api(ctx)); + + ctx._select.selector = selector; + + if (ctx._select.style !== 'api') { + enableMouseSelection(new DataTable.Api(ctx)); + } + }); +}); + +apiRegister('select.last()', function (set) { + let ctx = this.context[0]; + + if (set) { + ctx._select_lastCell = set; + return this; + } + + return ctx._select_lastCell; +}); + +apiRegisterPlural('rows().select()', 'row().select()', function (select) { + var api = this; + + if (select === false) { + return this.deselect(); + } + + this.iterator('row', function (ctx, idx) { + clear(ctx); + + // There is a good amount of knowledge of DataTables internals in + // this function. It _could_ be done without that, but it would hurt + // performance (or DT would need new APIs for this work) + var dtData = ctx.aoData[idx]; + var dtColumns = ctx.aoColumns; + + $(dtData.nTr).addClass(ctx._select.className); + dtData._select_selected = true; + + for (var i=0 ; i 0); + }); + + this.disable(); + }, + destroy: function (dt, node, config) { + dt.off(config._eventNamespace); + } + }, + showSelected: { + text: i18n('showSelected', 'Show only selected'), + className: 'buttons-show-selected', + action: function (e, dt) { + if (dt.search.fixed('dt-select')) { + // Remove existing function + dt.search.fixed('dt-select', null); + + this.active(false); + } + else { + // Use a fixed filtering function to match on selected rows + // This needs to reference the internal aoData since that is + // where Select stores its reference for the selected state + var dataSrc = dt.settings()[0].aoData; + + dt.search.fixed('dt-select', function (text, data, idx) { + // _select_selected is set by Select on the data object for the row + return dataSrc[idx]._select_selected; + }); + + this.active(true); + } + + dt.draw(); + } + } +}); + +$.each(['Row', 'Column', 'Cell'], function (i, item) { + var lc = item.toLowerCase(); + + DataTable.ext.buttons['select' + item + 's'] = { + text: i18n('select' + item + 's', 'Select ' + lc + 's'), + className: 'buttons-select-' + lc + 's', + action: function () { + this.select.items(lc); + }, + init: function (dt) { + var that = this; + + dt.on('selectItems.dt.DT', function (e, ctx, items) { + that.active(items === lc); + }); + } + }; +}); + +DataTable.type('select-checkbox', { + className: 'dt-select', + detect: function (data) { + // Rendering function will tell us if it is a checkbox type + return data === 'select-checkbox' ? data : false; + }, + order: { + pre: function (d) { + return d === 'X' ? -1 : 0; + } + } +}); + +$.extend(true, DataTable.defaults.oLanguage, { + select: { + aria: { + rowCheckbox: 'Select row' + } + } +}); + +DataTable.render.select = function (valueProp, nameProp) { + var valueFn = valueProp ? DataTable.util.get(valueProp) : null; + var nameFn = nameProp ? DataTable.util.get(nameProp) : null; + + return function (data, type, row, meta) { + var dtRow = meta.settings.aoData[meta.row]; + var selected = dtRow._select_selected; + var ariaLabel = meta.settings.oLanguage.select.aria.rowCheckbox; + + if (type === 'display') { + return $('') + .attr({ + 'aria-label': ariaLabel, + class: 'dt-select-checkbox', + name: nameFn ? nameFn(row) : null, + type: 'checkbox', + value: valueFn ? valueFn(row) : null, + checked: selected + })[0]; + } + else if (type === 'type') { + return 'select-checkbox'; + } + else if (type === 'filter') { + return ''; + } + + return selected ? 'X' : ''; + } +} + +// Legacy checkbox ordering +DataTable.ext.order['select-checkbox'] = function (settings, col) { + return this.api() + .column(col, { order: 'index' }) + .nodes() + .map(function (td) { + if (settings._select.items === 'row') { + return $(td).parent().hasClass(settings._select.className); + } + else if (settings._select.items === 'cell') { + return $(td).hasClass(settings._select.className); + } + return false; + }); +}; + +$.fn.DataTable.select = DataTable.select; + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Initialisation + */ + +// DataTables creation - check if select has been defined in the options. Note +// this required that the table be in the document! If it isn't then something +// needs to trigger this method unfortunately. The next major release of +// DataTables will rework the events and address this. +$(document).on('preInit.dt.dtSelect', function (e, ctx) { + if (e.namespace !== 'dt') { + return; + } + + DataTable.select.init(new DataTable.Api(ctx)); +}); + + +export default DataTable; diff --git a/assets/js/register_events.js b/assets/js/register_events.js index 1c6ed09b..547742ea 100644 --- a/assets/js/register_events.js +++ b/assets/js/register_events.js @@ -19,14 +19,15 @@ 'use strict'; -import {Dropdown, Modal, Tooltip} from "bootstrap"; +import {Dropdown} from "bootstrap"; import ClipboardJS from "clipboard"; +import {Modal} from "bootstrap"; class RegisterEventHelper { constructor() { this.registerTooltips(); this.configureDropdowns(); - + // Only register special character input if enabled in configuration const keybindingsEnabled = document.body.dataset.keybindingsSpecialCharacters !== 'false'; if (keybindingsEnabled) { @@ -39,6 +40,8 @@ class RegisterEventHelper { }); this.registerModalDropRemovalOnFormSubmit(); + + } registerModalDropRemovalOnFormSubmit() { @@ -80,17 +83,11 @@ class RegisterEventHelper { registerTooltips() { const handler = () => { - document.querySelectorAll('.tooltip').forEach(el => el.remove()); - + $(".tooltip").remove(); //Exclude dropdown buttons from tooltips, otherwise we run into endless errors from bootstrap (bootstrap.esm.js:614 Bootstrap doesn't allow more than one instance per element. Bound instance: bs.dropdown.) - const tooltipSelector = 'a[title], label[title], button[title]:not([data-bs-toggle="dropdown"]), p[title], span[title], h6[title], h3[title], i[title], small[title]'; - document.querySelectorAll(tooltipSelector).forEach(el => { - const existing = Tooltip.getInstance(el); - if (existing) { - existing.dispose(); - } - new Tooltip(el, {container: 'body', placement: 'auto', boundary: 'window'}); - }); + $('a[title], label[title], button[title]:not([data-bs-toggle="dropdown"]), p[title], span[title], h6[title], h3[title], i[title], small[title]') + //@ts-ignore + .tooltip("hide").tooltip({container: "body", placement: "auto", boundary: 'window'}); }; this.registerLoadHandler(handler); @@ -98,240 +95,242 @@ class RegisterEventHelper { } registerSpecialCharInput() { - const keydownHandler = function(event) { - let use_special_char = event.altKey; - - let greek_char = ""; - if (use_special_char){ - //Use the key property to determine the greek letter (as it is independent of the keyboard layout) - switch(event.key) { - //Greek letters - case "a": //Alpha (lowercase) - greek_char = "α"; - break; - case "A": //Alpha (uppercase) - greek_char = "Α"; - break; - case "b": //Beta (lowercase) - greek_char = "β"; - break; - case "B": //Beta (uppercase) - greek_char = "Β"; - break; - case "g": //Gamma (lowercase) - greek_char = "γ"; - break; - case "G": //Gamma (uppercase) - greek_char = "Γ"; - break; - case "d": //Delta (lowercase) - greek_char = "δ"; - break; - case "D": //Delta (uppercase) - greek_char = "Δ"; - break; - case "e": //Epsilon (lowercase) - greek_char = "ε"; - break; - case "E": //Epsilon (uppercase) - greek_char = "Ε"; - break; - case "z": //Zeta (lowercase) - greek_char = "ζ"; - break; - case "Z": //Zeta (uppercase) - greek_char = "Ζ"; - break; - case "h": //Eta (lowercase) - greek_char = "η"; - break; - case "H": //Eta (uppercase) - greek_char = "Η"; - break; - case "q": //Theta (lowercase) - greek_char = "θ"; - break; - case "Q": //Theta (uppercase) - greek_char = "Θ"; - break; - case "i": //Iota (lowercase) - greek_char = "ι"; - break; - case "I": //Iota (uppercase) - greek_char = "Ι"; - break; - case "k": //Kappa (lowercase) - greek_char = "κ"; - break; - case "K": //Kappa (uppercase) - greek_char = "Κ"; - break; - case "l": //Lambda (lowercase) - greek_char = "λ"; - break; - case "L": //Lambda (uppercase) - greek_char = "Λ"; - break; - case "m": //Mu (lowercase) - greek_char = "μ"; - break; - case "M": //Mu (uppercase) - greek_char = "Μ"; - break; - case "n": //Nu (lowercase) - greek_char = "ν"; - break; - case "N": //Nu (uppercase) - greek_char = "Ν"; - break; - case "x": //Xi (lowercase) - greek_char = "ξ"; - break; - case "X": //Xi (uppercase) - greek_char = "Ξ"; - break; - case "o": //Omicron (lowercase) - greek_char = "ο"; - break; - case "O": //Omicron (uppercase) - greek_char = "Ο"; - break; - case "p": //Pi (lowercase) - greek_char = "π"; - break; - case "P": //Pi (uppercase) - greek_char = "Π"; - break; - case "r": //Rho (lowercase) - greek_char = "ρ"; - break; - case "R": //Rho (uppercase) - greek_char = "Ρ"; - break; - case "s": //Sigma (lowercase) - greek_char = "σ"; - break; - case "S": //Sigma (uppercase) - greek_char = "Σ"; - break; - case "t": //Tau (lowercase) - greek_char = "τ"; - break; - case "T": //Tau (uppercase) - greek_char = "Τ"; - break; - case "u": //Upsilon (lowercase) - greek_char = "υ"; - break; - case "U": //Upsilon (uppercase) - greek_char = "Υ"; - break; - case "f": //Phi (lowercase) - greek_char = "φ"; - break; - case "F": //Phi (uppercase) - greek_char = "Φ"; - break; - case "c": //Chi (lowercase) - greek_char = "χ"; - break; - case "C": //Chi (uppercase) - greek_char = "Χ"; - break; - case "y": //Psi (lowercase) - greek_char = "ψ"; - break; - case "Y": //Psi (uppercase) - greek_char = "Ψ"; - break; - case "w": //Omega (lowercase) - greek_char = "ω"; - break; - case "W": //Omega (uppercase) - greek_char = "Ω"; - break; - } - - //Use keycodes for special characters as the shift char on the number keys are layout dependent - switch (event.keyCode) { - case 49: //1 key - //Product symbol on shift, sum on no shift - greek_char = event.shiftKey ? "∏" : "∑"; - break; - case 50: //2 key - //Integral on no shift, partial derivative on shift - greek_char = event.shiftKey ? "∂" : "∫"; - break; - case 51: //3 key - //Less than or equal on no shift, greater than or equal on shift - greek_char = event.shiftKey ? "≥" : "≤"; - break; - case 52: //4 key - //Empty set on shift, infinity on no shift - greek_char = event.shiftKey ? "∅" : "∞"; - break; - case 53: //5 key - //Not equal on shift, approx equal on no shift - greek_char = event.shiftKey ? "≠" : "≈"; - break; - case 54: //6 key - //Element of on no shift, not element of on shift - greek_char = event.shiftKey ? "∉" : "∈"; - break; - case 55: //7 key - //And on shift, or on no shift - greek_char = event.shiftKey ? "∧" : "∨"; - break; - case 56: //8 key - //Proportional to on shift, angle on no shift - greek_char = event.shiftKey ? "∝" : "∠"; - break; - case 57: //9 key - //Cube root on shift, square root on no shift - greek_char = event.shiftKey ? "∛" : "√"; - break; - case 48: //0 key - //Minus-Plus on shift, plus-minus on no shift - greek_char = event.shiftKey ? "∓" : "±"; - break; - - //Special characters - case 219: //hyphen (or ß on german layout) - //Copyright on no shift, TM on shift - greek_char = event.shiftKey ? "™" : "©"; - break; - case 191: //forward slash (or # on german layout) - //Generic currency on no shift, paragraph on shift - greek_char = event.shiftKey ? "¶" : "¤"; - break; - - //Currency symbols - case 192: //: or (ö on german layout) - //Euro on no shift, pound on shift - greek_char = event.shiftKey ? "£" : "€"; - break; - case 221: //; or (ä on german layout) - //Yen on no shift, dollar on shift - greek_char = event.shiftKey ? "$" : "¥"; - break; - } - - if(greek_char=="") return; - - const txt = event.currentTarget; - const caretPos = txt.selectionStart; - const textAreaTxt = txt.value; - txt.value = textAreaTxt.substring(0, caretPos) + greek_char + textAreaTxt.substring(caretPos); - } - }; - this.registerLoadHandler(() => { - document.querySelectorAll('input[type=text], input[type=search]').forEach(input => { - input.removeEventListener('keydown', keydownHandler); - input.addEventListener('keydown', keydownHandler); + //@ts-ignore + $("input[type=text], input[type=search]").unbind("keydown").keydown(function (event) { + let use_special_char = event.altKey; + + let greek_char = ""; + if (use_special_char){ + //Use the key property to determine the greek letter (as it is independent of the keyboard layout) + switch(event.key) { + //Greek letters + case "a": //Alpha (lowercase) + greek_char = "\u03B1"; + break; + case "A": //Alpha (uppercase) + greek_char = "\u0391"; + break; + case "b": //Beta (lowercase) + greek_char = "\u03B2"; + break; + case "B": //Beta (uppercase) + greek_char = "\u0392"; + break; + case "g": //Gamma (lowercase) + greek_char = "\u03B3"; + break; + case "G": //Gamma (uppercase) + greek_char = "\u0393"; + break; + case "d": //Delta (lowercase) + greek_char = "\u03B4"; + break; + case "D": //Delta (uppercase) + greek_char = "\u0394"; + break; + case "e": //Epsilon (lowercase) + greek_char = "\u03B5"; + break; + case "E": //Epsilon (uppercase) + greek_char = "\u0395"; + break; + case "z": //Zeta (lowercase) + greek_char = "\u03B6"; + break; + case "Z": //Zeta (uppercase) + greek_char = "\u0396"; + break; + case "h": //Eta (lowercase) + greek_char = "\u03B7"; + break; + case "H": //Eta (uppercase) + greek_char = "\u0397"; + break; + case "q": //Theta (lowercase) + greek_char = "\u03B8"; + break; + case "Q": //Theta (uppercase) + greek_char = "\u0398"; + break; + case "i": //Iota (lowercase) + greek_char = "\u03B9"; + break; + case "I": //Iota (uppercase) + greek_char = "\u0399"; + break; + case "k": //Kappa (lowercase) + greek_char = "\u03BA"; + break; + case "K": //Kappa (uppercase) + greek_char = "\u039A"; + break; + case "l": //Lambda (lowercase) + greek_char = "\u03BB"; + break; + case "L": //Lambda (uppercase) + greek_char = "\u039B"; + break; + case "m": //Mu (lowercase) + greek_char = "\u03BC"; + break; + case "M": //Mu (uppercase) + greek_char = "\u039C"; + break; + case "n": //Nu (lowercase) + greek_char = "\u03BD"; + break; + case "N": //Nu (uppercase) + greek_char = "\u039D"; + break; + case "x": //Xi (lowercase) + greek_char = "\u03BE"; + break; + case "X": //Xi (uppercase) + greek_char = "\u039E"; + break; + case "o": //Omicron (lowercase) + greek_char = "\u03BF"; + break; + case "O": //Omicron (uppercase) + greek_char = "\u039F"; + break; + case "p": //Pi (lowercase) + greek_char = "\u03C0"; + break; + case "P": //Pi (uppercase) + greek_char = "\u03A0"; + break; + case "r": //Rho (lowercase) + greek_char = "\u03C1"; + break; + case "R": //Rho (uppercase) + greek_char = "\u03A1"; + break; + case "s": //Sigma (lowercase) + greek_char = "\u03C3"; + break; + case "S": //Sigma (uppercase) + greek_char = "\u03A3"; + break; + case "t": //Tau (lowercase) + greek_char = "\u03C4"; + break; + case "T": //Tau (uppercase) + greek_char = "\u03A4"; + break; + case "u": //Upsilon (lowercase) + greek_char = "\u03C5"; + break; + case "U": //Upsilon (uppercase) + greek_char = "\u03A5"; + break; + case "f": //Phi (lowercase) + greek_char = "\u03C6"; + break; + case "F": //Phi (uppercase) + greek_char = "\u03A6"; + break; + case "c": //Chi (lowercase) + greek_char = "\u03C7"; + break; + case "C": //Chi (uppercase) + greek_char = "\u03A7"; + break; + case "y": //Psi (lowercase) + greek_char = "\u03C8"; + break; + case "Y": //Psi (uppercase) + greek_char = "\u03A8"; + break; + case "w": //Omega (lowercase) + greek_char = "\u03C9"; + break; + case "W": //Omega (uppercase) + greek_char = "\u03A9"; + break; + } + + //Use keycodes for special characters as the shift char on the number keys are layout dependent + switch (event.keyCode) { + case 49: //1 key + //Product symbol on shift, sum on no shift + greek_char = event.shiftKey ? "\u220F" : "\u2211"; + break; + case 50: //2 key + //Integral on no shift, partial derivative on shift + greek_char = event.shiftKey ? "\u2202" : "\u222B"; + break; + case 51: //3 key + //Less than or equal on no shift, greater than or equal on shift + greek_char = event.shiftKey ? "\u2265" : "\u2264"; + break; + case 52: //4 key + //Empty set on shift, infinity on no shift + greek_char = event.shiftKey ? "\u2205" : "\u221E"; + break; + case 53: //5 key + //Not equal on shift, approx equal on no shift + greek_char = event.shiftKey ? "\u2260" : "\u2248"; + break; + case 54: //6 key + //Element of on no shift, not element of on shift + greek_char = event.shiftKey ? "\u2209" : "\u2208"; + break; + case 55: //7 key + //And on shift, or on no shift + greek_char = event.shiftKey ? "\u2227" : "\u2228"; + break; + case 56: //8 key + //Proportional to on shift, angle on no shift + greek_char = event.shiftKey ? "\u221D" : "\u2220"; + break; + case 57: //9 key + //Cube root on shift, square root on no shift + greek_char = event.shiftKey ? "\u221B" : "\u221A"; + break; + case 48: //0 key + //Minus-Plus on shift, plus-minus on no shift + greek_char = event.shiftKey ? "\u2213" : "\u00B1"; + break; + + //Special characters + case 219: //hyphen (or ß on german layout) + //Copyright on no shift, TM on shift + greek_char = event.shiftKey ? "\u2122" : "\u00A9"; + break; + case 191: //forward slash (or # on german layout) + //Generic currency on no shift, paragraph on shift + greek_char = event.shiftKey ? "\u00B6" : "\u00A4"; + break; + + //Currency symbols + case 192: //: or (ö on german layout) + //Euro on no shift, pound on shift + greek_char = event.shiftKey ? "\u00A3" : "\u20AC"; + break; + case 221: //; or (ä on german layout) + //Yen on no shift, dollar on shift + greek_char = event.shiftKey ? "\u0024" : "\u00A5"; + break; + + + } + + if(greek_char=="") return; + + let $txt = $(this); + //@ts-ignore + let caretPos = $txt[0].selectionStart; + let textAreaTxt = $txt.val().toString(); + $txt.val(textAreaTxt.substring(0, caretPos) + greek_char + textAreaTxt.substring(caretPos) ); + + } }); - }); + //@ts-ignore + this.greek_once = true; + }) } } -export default new RegisterEventHelper(); +export default new RegisterEventHelper(); \ No newline at end of file diff --git a/composer.json b/composer.json index 10c9b702..f08f824d 100644 --- a/composer.json +++ b/composer.json @@ -57,10 +57,9 @@ "scheb/2fa-trusted-device": "^v7.11.0", "shivas/versioning-bundle": "^4.0", "spatie/db-dumper": "^3.3.1", - "symfony/ai-bundle": "^0.10.0", - "symfony/ai-lm-studio-platform": "^v0.10.0", - "symfony/ai-ollama-platform": "^0.10.0", - "symfony/ai-open-router-platform": "^0.10.0", + "symfony/ai-bundle": "^0.9.0", + "symfony/ai-lm-studio-platform": "^0.9.0", + "symfony/ai-open-router-platform": "^0.9.0", "symfony/apache-pack": "^1.0", "symfony/asset": "7.4.*", "symfony/console": "7.4.*", diff --git a/composer.lock b/composer.lock index ca50c2c6..71918b0f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6a79fa73091c2e15bce035c85c2d61ed", + "content-hash": "1307bf553d1543704e3c03398dec06c7", "packages": [ { "name": "amphp/amp", - "version": "v3.1.2", + "version": "v3.1.1", "source": { "type": "git", "url": "https://github.com/amphp/amp.git", - "reference": "2f3ebed5a4f663968a0590dbb7654a8b32cb63cb" + "reference": "fa0ab33a6f47a82929c38d03ca47ebb71086a93f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/2f3ebed5a4f663968a0590dbb7654a8b32cb63cb", - "reference": "2f3ebed5a4f663968a0590dbb7654a8b32cb63cb", + "url": "https://api.github.com/repos/amphp/amp/zipball/fa0ab33a6f47a82929c38d03ca47ebb71086a93f", + "reference": "fa0ab33a6f47a82929c38d03ca47ebb71086a93f", "shasum": "" }, "require": { @@ -27,7 +27,7 @@ "require-dev": { "amphp/php-cs-fixer-config": "^2", "phpunit/phpunit": "^9", - "psalm/phar": "6.16.1" + "psalm/phar": "5.23.1" }, "type": "library", "autoload": { @@ -77,7 +77,7 @@ ], "support": { "issues": "https://github.com/amphp/amp/issues", - "source": "https://github.com/amphp/amp/tree/v3.1.2" + "source": "https://github.com/amphp/amp/tree/v3.1.1" }, "funding": [ { @@ -85,7 +85,7 @@ "type": "github" } ], - "time": "2026-06-21T13:59:44+00:00" + "time": "2025-08-27T21:42:00+00:00" }, { "name": "amphp/byte-stream", @@ -976,16 +976,16 @@ }, { "name": "api-platform/doctrine-common", - "version": "v4.3.14", + "version": "v4.3.13", "source": { "type": "git", "url": "https://github.com/api-platform/doctrine-common.git", - "reference": "e4dee10c45bd701c5984321bc98adc0c3760ec48" + "reference": "a342c7e4cd4a7545d355b8eaae6d2f46de4f8936" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/doctrine-common/zipball/e4dee10c45bd701c5984321bc98adc0c3760ec48", - "reference": "e4dee10c45bd701c5984321bc98adc0c3760ec48", + "url": "https://api.github.com/repos/api-platform/doctrine-common/zipball/a342c7e4cd4a7545d355b8eaae6d2f46de4f8936", + "reference": "a342c7e4cd4a7545d355b8eaae6d2f46de4f8936", "shasum": "" }, "require": { @@ -1060,22 +1060,22 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/doctrine-common/tree/v4.3.14" + "source": "https://github.com/api-platform/doctrine-common/tree/v4.3.13" }, - "time": "2026-06-16T14:59:18+00:00" + "time": "2026-06-05T09:05:29+00:00" }, { "name": "api-platform/doctrine-orm", - "version": "v4.3.14", + "version": "v4.3.13", "source": { "type": "git", "url": "https://github.com/api-platform/doctrine-orm.git", - "reference": "6af3eeefc7d483b83e56bcbdbff0dd0dde3c7fc1" + "reference": "7d8851966a55d2f53e4d86b281ba543fa14e953b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/doctrine-orm/zipball/6af3eeefc7d483b83e56bcbdbff0dd0dde3c7fc1", - "reference": "6af3eeefc7d483b83e56bcbdbff0dd0dde3c7fc1", + "url": "https://api.github.com/repos/api-platform/doctrine-orm/zipball/7d8851966a55d2f53e4d86b281ba543fa14e953b", + "reference": "7d8851966a55d2f53e4d86b281ba543fa14e953b", "shasum": "" }, "require": { @@ -1149,13 +1149,13 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/doctrine-orm/tree/v4.3.14" + "source": "https://github.com/api-platform/doctrine-orm/tree/v4.3.13" }, - "time": "2026-06-16T13:14:05+00:00" + "time": "2026-06-13T04:46:03+00:00" }, { "name": "api-platform/documentation", - "version": "v4.3.14", + "version": "v4.3.13", "source": { "type": "git", "url": "https://github.com/api-platform/documentation.git", @@ -1212,13 +1212,13 @@ ], "description": "API Platform documentation controller.", "support": { - "source": "https://github.com/api-platform/documentation/tree/v4.3.14" + "source": "https://github.com/api-platform/documentation/tree/v4.3.13" }, "time": "2026-04-30T12:21:24+00:00" }, { "name": "api-platform/http-cache", - "version": "v4.3.14", + "version": "v4.3.13", "source": { "type": "git", "url": "https://github.com/api-platform/http-cache.git", @@ -1292,13 +1292,13 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/http-cache/tree/v4.3.14" + "source": "https://github.com/api-platform/http-cache/tree/v4.3.13" }, "time": "2026-06-09T14:20:49+00:00" }, { "name": "api-platform/hydra", - "version": "v4.3.14", + "version": "v4.3.13", "source": { "type": "git", "url": "https://github.com/api-platform/hydra.git", @@ -1379,22 +1379,22 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/hydra/tree/v4.3.14" + "source": "https://github.com/api-platform/hydra/tree/v4.3.13" }, "time": "2026-06-13T05:11:46+00:00" }, { "name": "api-platform/json-api", - "version": "v4.3.14", + "version": "v4.3.13", "source": { "type": "git", "url": "https://github.com/api-platform/json-api.git", - "reference": "30f70ddc6d865e9c36d99c0255bb1f407c4d4258" + "reference": "dbff4fd044b131c63fe7540da796e01cda2814d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/json-api/zipball/30f70ddc6d865e9c36d99c0255bb1f407c4d4258", - "reference": "30f70ddc6d865e9c36d99c0255bb1f407c4d4258", + "url": "https://api.github.com/repos/api-platform/json-api/zipball/dbff4fd044b131c63fe7540da796e01cda2814d2", + "reference": "dbff4fd044b131c63fe7540da796e01cda2814d2", "shasum": "" }, "require": { @@ -1461,13 +1461,13 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/json-api/tree/v4.3.14" + "source": "https://github.com/api-platform/json-api/tree/v4.3.13" }, - "time": "2026-06-17T18:14:46+00:00" + "time": "2026-06-13T05:11:46+00:00" }, { "name": "api-platform/json-schema", - "version": "v4.3.14", + "version": "v4.3.13", "source": { "type": "git", "url": "https://github.com/api-platform/json-schema.git", @@ -1542,13 +1542,13 @@ "swagger" ], "support": { - "source": "https://github.com/api-platform/json-schema/tree/v4.3.14" + "source": "https://github.com/api-platform/json-schema/tree/v4.3.13" }, "time": "2026-06-13T05:06:55+00:00" }, { "name": "api-platform/jsonld", - "version": "v4.3.14", + "version": "v4.3.13", "source": { "type": "git", "url": "https://github.com/api-platform/jsonld.git", @@ -1622,13 +1622,13 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/jsonld/tree/v4.3.14" + "source": "https://github.com/api-platform/jsonld/tree/v4.3.13" }, "time": "2026-06-13T05:11:46+00:00" }, { "name": "api-platform/metadata", - "version": "v4.3.14", + "version": "v4.3.13", "source": { "type": "git", "url": "https://github.com/api-platform/metadata.git", @@ -1720,22 +1720,22 @@ "swagger" ], "support": { - "source": "https://github.com/api-platform/metadata/tree/v4.3.14" + "source": "https://github.com/api-platform/metadata/tree/v4.3.13" }, "time": "2026-06-13T05:03:21+00:00" }, { "name": "api-platform/openapi", - "version": "v4.3.14", + "version": "v4.3.13", "source": { "type": "git", "url": "https://github.com/api-platform/openapi.git", - "reference": "c72470132f2eb35a4f8f252e60342f0f7c487704" + "reference": "07c9e5c7325f810cea0cc1821ff564dbae6e57d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/openapi/zipball/c72470132f2eb35a4f8f252e60342f0f7c487704", - "reference": "c72470132f2eb35a4f8f252e60342f0f7c487704", + "url": "https://api.github.com/repos/api-platform/openapi/zipball/07c9e5c7325f810cea0cc1821ff564dbae6e57d5", + "reference": "07c9e5c7325f810cea0cc1821ff564dbae6e57d5", "shasum": "" }, "require": { @@ -1811,22 +1811,22 @@ "swagger" ], "support": { - "source": "https://github.com/api-platform/openapi/tree/v4.3.14" + "source": "https://github.com/api-platform/openapi/tree/v4.3.13" }, - "time": "2026-06-16T10:01:53+00:00" + "time": "2026-06-13T05:11:46+00:00" }, { "name": "api-platform/serializer", - "version": "v4.3.14", + "version": "v4.3.13", "source": { "type": "git", "url": "https://github.com/api-platform/serializer.git", - "reference": "8a6e6a719a401be470b958ba1ae63f4eb0b22992" + "reference": "69042d5861779066b54bca1f6356bf5fe0eed466" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/serializer/zipball/8a6e6a719a401be470b958ba1ae63f4eb0b22992", - "reference": "8a6e6a719a401be470b958ba1ae63f4eb0b22992", + "url": "https://api.github.com/repos/api-platform/serializer/zipball/69042d5861779066b54bca1f6356bf5fe0eed466", + "reference": "69042d5861779066b54bca1f6356bf5fe0eed466", "shasum": "" }, "require": { @@ -1905,13 +1905,13 @@ "serializer" ], "support": { - "source": "https://github.com/api-platform/serializer/tree/v4.3.14" + "source": "https://github.com/api-platform/serializer/tree/v4.3.13" }, - "time": "2026-06-19T08:12:49+00:00" + "time": "2026-06-13T05:11:46+00:00" }, { "name": "api-platform/state", - "version": "v4.3.14", + "version": "v4.3.13", "source": { "type": "git", "url": "https://github.com/api-platform/state.git", @@ -2002,22 +2002,22 @@ "swagger" ], "support": { - "source": "https://github.com/api-platform/state/tree/v4.3.14" + "source": "https://github.com/api-platform/state/tree/v4.3.13" }, "time": "2026-06-13T05:11:46+00:00" }, { "name": "api-platform/symfony", - "version": "v4.3.14", + "version": "v4.3.13", "source": { "type": "git", "url": "https://github.com/api-platform/symfony.git", - "reference": "8b20ef6262b2d557e2c286df48b78e66e7f8c000" + "reference": "358668b0de7c4a214d477a30fe83deab2a5da96c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/symfony/zipball/8b20ef6262b2d557e2c286df48b78e66e7f8c000", - "reference": "8b20ef6262b2d557e2c286df48b78e66e7f8c000", + "url": "https://api.github.com/repos/api-platform/symfony/zipball/358668b0de7c4a214d477a30fe83deab2a5da96c", + "reference": "358668b0de7c4a214d477a30fe83deab2a5da96c", "shasum": "" }, "require": { @@ -2131,13 +2131,13 @@ "symfony" ], "support": { - "source": "https://github.com/api-platform/symfony/tree/v4.3.14" + "source": "https://github.com/api-platform/symfony/tree/v4.3.13" }, - "time": "2026-06-17T18:14:46+00:00" + "time": "2026-06-13T05:21:29+00:00" }, { "name": "api-platform/validator", - "version": "v4.3.14", + "version": "v4.3.13", "source": { "type": "git", "url": "https://github.com/api-platform/validator.git", @@ -2207,7 +2207,7 @@ "validator" ], "support": { - "source": "https://github.com/api-platform/validator/tree/v4.3.14" + "source": "https://github.com/api-platform/validator/tree/v4.3.13" }, "time": "2026-05-07T11:45:31+00:00" }, @@ -4635,22 +4635,22 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.12.1", + "version": "7.11.1", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "d34627490fbc03bf5c5d7cfed81f2faa19519425" + "reference": "5af96f374e0ab4ebd747b8310888c99d3adb0a8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d34627490fbc03bf5c5d7cfed81f2faa19519425", - "reference": "d34627490fbc03bf5c5d7cfed81f2faa19519425", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/5af96f374e0ab4ebd747b8310888c99d3adb0a8c", + "reference": "5af96f374e0ab4ebd747b8310888c99d3adb0a8c", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/promises": "^2.5", - "guzzlehttp/psr7": "^2.12.1", + "guzzlehttp/psr7": "^2.11", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.5 || ^3.0", @@ -4663,7 +4663,7 @@ "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", "guzzle/client-integration-tests": "3.0.2", - "guzzlehttp/test-server": "^0.5.1", + "guzzlehttp/test-server": "^0.5", "php-http/message-factory": "^1.1", "phpunit/phpunit": "^8.5.52 || ^9.6.34", "psr/log": "^1.1 || ^2.0 || ^3.0" @@ -4743,7 +4743,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.12.1" + "source": "https://github.com/guzzle/guzzle/tree/7.11.1" }, "funding": [ { @@ -4759,7 +4759,7 @@ "type": "tidelift" } ], - "time": "2026-06-18T14:12:49+00:00" + "time": "2026-06-07T22:54:06+00:00" }, { "name": "guzzlehttp/promises", @@ -4847,16 +4847,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "2.12.1", + "version": "2.11.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "172ef2f4e9824c1e058b7f30be8ae25a02c0f2b7" + "reference": "bbb5e61349fa5cb822b3e87842b951088b76b81f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/172ef2f4e9824c1e058b7f30be8ae25a02c0f2b7", - "reference": "172ef2f4e9824c1e058b7f30be8ae25a02c0f2b7", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/bbb5e61349fa5cb822b3e87842b951088b76b81f", + "reference": "bbb5e61349fa5cb822b3e87842b951088b76b81f", "shasum": "" }, "require": { @@ -4946,7 +4946,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.12.1" + "source": "https://github.com/guzzle/psr7/tree/2.11.0" }, "funding": [ { @@ -4962,7 +4962,7 @@ "type": "tidelift" } ], - "time": "2026-06-18T09:49:37+00:00" + "time": "2026-06-02T12:30:48+00:00" }, { "name": "hshn/base64-encoded-file", @@ -9997,16 +9997,16 @@ }, { "name": "sabberworm/php-css-parser", - "version": "v9.4.0", + "version": "v9.3.0", "source": { "type": "git", "url": "https://github.com/MyIntervals/PHP-CSS-Parser.git", - "reference": "fd3bf9fb173e0df649bc4e3e0d088a1b2417c08f" + "reference": "88dbd0f7f91abbfe4402d0a3071e9ff4d81ed949" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/fd3bf9fb173e0df649bc4e3e0d088a1b2417c08f", - "reference": "fd3bf9fb173e0df649bc4e3e0d088a1b2417c08f", + "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/88dbd0f7f91abbfe4402d0a3071e9ff4d81ed949", + "reference": "88dbd0f7f91abbfe4402d0a3071e9ff4d81ed949", "shasum": "" }, "require": { @@ -10017,15 +10017,15 @@ "require-dev": { "php-parallel-lint/php-parallel-lint": "1.4.0", "phpstan/extension-installer": "1.4.3", - "phpstan/phpstan": "1.12.33 || 2.2.2", - "phpstan/phpstan-phpunit": "1.4.2 || 2.0.16", - "phpstan/phpstan-strict-rules": "1.6.2 || 2.0.11", + "phpstan/phpstan": "1.12.32 || 2.1.32", + "phpstan/phpstan-phpunit": "1.4.2 || 2.0.8", + "phpstan/phpstan-strict-rules": "1.6.2 || 2.0.7", "phpunit/phpunit": "8.5.52", "rawr/phpunit-data-provider": "3.3.1", - "rector/rector": "1.2.10 || 2.4.6", - "rector/type-perfect": "1.0.0 || 2.1.3", + "rector/rector": "1.2.10 || 2.2.8", + "rector/type-perfect": "1.0.0 || 2.1.0", "squizlabs/php_codesniffer": "4.0.1", - "thecodingmachine/phpstan-safe-rule": "1.2.0 || 1.4.3" + "thecodingmachine/phpstan-safe-rule": "1.2.0 || 1.4.1" }, "suggest": { "ext-mbstring": "for parsing UTF-8 CSS" @@ -10033,7 +10033,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "9.5.x-dev" + "dev-main": "9.4.x-dev" } }, "autoload": { @@ -10071,9 +10071,9 @@ ], "support": { "issues": "https://github.com/MyIntervals/PHP-CSS-Parser/issues", - "source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v9.4.0" + "source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v9.3.0" }, - "time": "2026-06-18T15:10:53+00:00" + "time": "2026-03-03T17:31:43+00:00" }, { "name": "sabre/uri", @@ -10733,21 +10733,21 @@ }, { "name": "symfony/ai-bundle", - "version": "v0.10.0", + "version": "v0.9.0", "source": { "type": "git", "url": "https://github.com/symfony/ai-bundle.git", - "reference": "5f6d218ca26a4ac3c2b743e4bfae769c41c556c0" + "reference": "77fd1b513174770acf49abd68effa995fa518f7c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ai-bundle/zipball/5f6d218ca26a4ac3c2b743e4bfae769c41c556c0", - "reference": "5f6d218ca26a4ac3c2b743e4bfae769c41c556c0", + "url": "https://api.github.com/repos/symfony/ai-bundle/zipball/77fd1b513174770acf49abd68effa995fa518f7c", + "reference": "77fd1b513174770acf49abd68effa995fa518f7c", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/ai-platform": "^0.10", + "symfony/ai-platform": "^0.9", "symfony/clock": "^7.3|^8.0", "symfony/config": "^7.3|^8.0", "symfony/console": "^7.3|^8.0", @@ -10762,74 +10762,74 @@ "phpstan/phpstan-phpunit": "^2.0", "phpstan/phpstan-strict-rules": "^2.0", "phpunit/phpunit": "^11.5.53", - "symfony/ai-agent": "^0.10", - "symfony/ai-ai-ml-api-platform": "^0.10", - "symfony/ai-albert-platform": "^0.10", - "symfony/ai-amazee-ai-platform": "^0.10", - "symfony/ai-anthropic-platform": "^0.10", - "symfony/ai-azure-platform": "^0.10", - "symfony/ai-azure-search-store": "^0.10", - "symfony/ai-bedrock-platform": "^0.10", - "symfony/ai-cache-message-store": "^0.10", - "symfony/ai-cache-platform": "^0.10", - "symfony/ai-cache-store": "^0.10", - "symfony/ai-cartesia-platform": "^0.10", - "symfony/ai-cerebras-platform": "^0.10", - "symfony/ai-chat": "^0.10", - "symfony/ai-chroma-db-store": "^0.10", - "symfony/ai-click-house-store": "^0.10", - "symfony/ai-cloudflare-message-store": "^0.10", - "symfony/ai-cloudflare-store": "^0.10", - "symfony/ai-cohere-platform": "^0.10", - "symfony/ai-decart-platform": "^0.10", - "symfony/ai-deep-seek-platform": "^0.10", - "symfony/ai-docker-model-runner-platform": "^0.10", - "symfony/ai-doctrine-message-store": "^0.10", - "symfony/ai-elasticsearch-store": "^0.10", - "symfony/ai-eleven-labs-platform": "^0.10", - "symfony/ai-failover-platform": "^0.10", - "symfony/ai-gemini-platform": "^0.10", - "symfony/ai-generic-platform": "^0.10", - "symfony/ai-hugging-face-platform": "^0.10", - "symfony/ai-lm-studio-platform": "^0.10", - "symfony/ai-manticore-search-store": "^0.10", - "symfony/ai-maria-db-store": "^0.10", - "symfony/ai-meilisearch-message-store": "^0.10", - "symfony/ai-meilisearch-store": "^0.10", - "symfony/ai-meta-platform": "^0.10", - "symfony/ai-milvus-store": "^0.10", - "symfony/ai-mistral-platform": "^0.10", - "symfony/ai-mongo-db-message-store": "^0.10", - "symfony/ai-mongo-db-store": "^0.10", - "symfony/ai-neo4j-store": "^0.10", - "symfony/ai-ollama-platform": "^0.10", - "symfony/ai-open-ai-platform": "^0.10", - "symfony/ai-open-responses-platform": "^0.10", - "symfony/ai-open-router-platform": "^0.10", - "symfony/ai-open-search-store": "^0.10", - "symfony/ai-ovh-platform": "^0.10", - "symfony/ai-perplexity-platform": "^0.10", - "symfony/ai-pinecone-store": "^0.10", - "symfony/ai-pogocache-message-store": "^0.10", - "symfony/ai-postgres-store": "^0.10", - "symfony/ai-qdrant-store": "^0.10", - "symfony/ai-redis-message-store": "^0.10", - "symfony/ai-redis-store": "^0.10", - "symfony/ai-replicate-platform": "^0.10", - "symfony/ai-s3vectors-store": "^0.10", - "symfony/ai-scaleway-platform": "^0.10", - "symfony/ai-session-message-store": "^0.10", - "symfony/ai-sqlite-store": "^0.10", - "symfony/ai-store": "^0.10", - "symfony/ai-supabase-store": "^0.10", - "symfony/ai-surreal-db-message-store": "^0.10", - "symfony/ai-surreal-db-store": "^0.10", - "symfony/ai-transformers-php-platform": "^0.10", - "symfony/ai-typesense-store": "^0.10", - "symfony/ai-vektor-store": "^0.10", - "symfony/ai-vertex-ai-platform": "^0.10", - "symfony/ai-voyage-platform": "^0.10", - "symfony/ai-weaviate-store": "^0.10", + "symfony/ai-agent": "^0.9", + "symfony/ai-ai-ml-api-platform": "^0.9", + "symfony/ai-albert-platform": "^0.9", + "symfony/ai-amazee-ai-platform": "^0.9", + "symfony/ai-anthropic-platform": "^0.9", + "symfony/ai-azure-platform": "^0.9", + "symfony/ai-azure-search-store": "^0.9", + "symfony/ai-bedrock-platform": "^0.9", + "symfony/ai-cache-message-store": "^0.9", + "symfony/ai-cache-platform": "^0.9", + "symfony/ai-cache-store": "^0.9", + "symfony/ai-cartesia-platform": "^0.9", + "symfony/ai-cerebras-platform": "^0.9", + "symfony/ai-chat": "^0.9", + "symfony/ai-chroma-db-store": "^0.9", + "symfony/ai-click-house-store": "^0.9", + "symfony/ai-cloudflare-message-store": "^0.9", + "symfony/ai-cloudflare-store": "^0.9", + "symfony/ai-cohere-platform": "^0.9", + "symfony/ai-decart-platform": "^0.9", + "symfony/ai-deep-seek-platform": "^0.9", + "symfony/ai-docker-model-runner-platform": "^0.9", + "symfony/ai-doctrine-message-store": "^0.9", + "symfony/ai-elasticsearch-store": "^0.9", + "symfony/ai-eleven-labs-platform": "^0.9", + "symfony/ai-failover-platform": "^0.9", + "symfony/ai-gemini-platform": "^0.9", + "symfony/ai-generic-platform": "^0.9", + "symfony/ai-hugging-face-platform": "^0.9", + "symfony/ai-lm-studio-platform": "^0.9", + "symfony/ai-manticore-search-store": "^0.9", + "symfony/ai-maria-db-store": "^0.9", + "symfony/ai-meilisearch-message-store": "^0.9", + "symfony/ai-meilisearch-store": "^0.9", + "symfony/ai-meta-platform": "^0.9", + "symfony/ai-milvus-store": "^0.9", + "symfony/ai-mistral-platform": "^0.9", + "symfony/ai-mongo-db-message-store": "^0.9", + "symfony/ai-mongo-db-store": "^0.9", + "symfony/ai-neo4j-store": "^0.9", + "symfony/ai-ollama-platform": "^0.9", + "symfony/ai-open-ai-platform": "^0.9", + "symfony/ai-open-responses-platform": "^0.9", + "symfony/ai-open-router-platform": "^0.9", + "symfony/ai-open-search-store": "^0.9", + "symfony/ai-ovh-platform": "^0.9", + "symfony/ai-perplexity-platform": "^0.9", + "symfony/ai-pinecone-store": "^0.9", + "symfony/ai-pogocache-message-store": "^0.9", + "symfony/ai-postgres-store": "^0.9", + "symfony/ai-qdrant-store": "^0.9", + "symfony/ai-redis-message-store": "^0.9", + "symfony/ai-redis-store": "^0.9", + "symfony/ai-replicate-platform": "^0.9", + "symfony/ai-s3vectors-store": "^0.9", + "symfony/ai-scaleway-platform": "^0.9", + "symfony/ai-session-message-store": "^0.9", + "symfony/ai-sqlite-store": "^0.9", + "symfony/ai-store": "^0.9", + "symfony/ai-supabase-store": "^0.9", + "symfony/ai-surreal-db-message-store": "^0.9", + "symfony/ai-surreal-db-store": "^0.9", + "symfony/ai-transformers-php-platform": "^0.9", + "symfony/ai-typesense-store": "^0.9", + "symfony/ai-vektor-store": "^0.9", + "symfony/ai-vertex-ai-platform": "^0.9", + "symfony/ai-voyage-platform": "^0.9", + "symfony/ai-weaviate-store": "^0.9", "symfony/expression-language": "^7.3|^8.0", "symfony/security-core": "^7.3|^8.0", "symfony/translation": "^7.3|^8.0", @@ -10867,7 +10867,7 @@ ], "description": "Integration bundle for Symfony AI components", "support": { - "source": "https://github.com/symfony/ai-bundle/tree/v0.10.0" + "source": "https://github.com/symfony/ai-bundle/tree/v0.9.0" }, "funding": [ { @@ -10887,25 +10887,25 @@ "type": "tidelift" } ], - "time": "2026-06-16T07:10:08+00:00" + "time": "2026-05-16T08:40:45+00:00" }, { "name": "symfony/ai-generic-platform", - "version": "v0.10.0", + "version": "v0.9.0", "source": { "type": "git", "url": "https://github.com/symfony/ai-generic-platform.git", - "reference": "a099d8a35ea9f7254a159b9c17bc7a4927f9ebb2" + "reference": "8887d12b8ea97d079c5c97de4aebb19f42c58dc5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ai-generic-platform/zipball/a099d8a35ea9f7254a159b9c17bc7a4927f9ebb2", - "reference": "a099d8a35ea9f7254a159b9c17bc7a4927f9ebb2", + "url": "https://api.github.com/repos/symfony/ai-generic-platform/zipball/8887d12b8ea97d079c5c97de4aebb19f42c58dc5", + "reference": "8887d12b8ea97d079c5c97de4aebb19f42c58dc5", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/ai-platform": "^0.10", + "symfony/ai-platform": "^0.9", "symfony/http-client": "^7.3|^8.0" }, "require-dev": { @@ -10952,7 +10952,7 @@ "platform" ], "support": { - "source": "https://github.com/symfony/ai-generic-platform/tree/v0.10.0" + "source": "https://github.com/symfony/ai-generic-platform/tree/v0.9.0" }, "funding": [ { @@ -10972,26 +10972,26 @@ "type": "tidelift" } ], - "time": "2026-06-16T07:10:08+00:00" + "time": "2026-05-16T01:01:33+00:00" }, { "name": "symfony/ai-lm-studio-platform", - "version": "v0.10.0", + "version": "v0.9.0", "source": { "type": "git", "url": "https://github.com/symfony/ai-lm-studio-platform.git", - "reference": "b6c4a3a5bedf2fd613953447602945c104e75a30" + "reference": "9e53e56c8c3a04dddb955088b40904e747ec3981" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ai-lm-studio-platform/zipball/b6c4a3a5bedf2fd613953447602945c104e75a30", - "reference": "b6c4a3a5bedf2fd613953447602945c104e75a30", + "url": "https://api.github.com/repos/symfony/ai-lm-studio-platform/zipball/9e53e56c8c3a04dddb955088b40904e747ec3981", + "reference": "9e53e56c8c3a04dddb955088b40904e747ec3981", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/ai-generic-platform": "^0.10", - "symfony/ai-platform": "^0.10", + "symfony/ai-generic-platform": "^0.9", + "symfony/ai-platform": "^0.9", "symfony/http-client": "^7.3|^8.0" }, "require-dev": { @@ -11039,7 +11039,7 @@ "platform" ], "support": { - "source": "https://github.com/symfony/ai-lm-studio-platform/tree/v0.10.0" + "source": "https://github.com/symfony/ai-lm-studio-platform/tree/v0.9.0" }, "funding": [ { @@ -11059,112 +11059,26 @@ "type": "tidelift" } ], - "time": "2026-06-15T22:48:31+00:00" - }, - { - "name": "symfony/ai-ollama-platform", - "version": "v0.10.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/ai-ollama-platform.git", - "reference": "1542f19b78362cafc034c219f5bc9a5a239a0ffb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/ai-ollama-platform/zipball/1542f19b78362cafc034c219f5bc9a5a239a0ffb", - "reference": "1542f19b78362cafc034c219f5bc9a5a239a0ffb", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/ai-platform": "^0.10", - "symfony/http-client": "^7.3|^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^2.1", - "phpstan/phpstan-phpunit": "^2.0", - "phpstan/phpstan-strict-rules": "^2.0", - "phpunit/phpunit": "^11.5.53" - }, - "type": "symfony-ai-platform", - "extra": { - "thanks": { - "url": "https://github.com/symfony/ai", - "name": "symfony/ai" - } - }, - "autoload": { - "psr-4": { - "Symfony\\AI\\Platform\\Bridge\\Ollama\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christopher Hertel", - "email": "mail@christopher-hertel.de" - }, - { - "name": "Oskar Stark", - "email": "oskarstark@googlemail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Ollama platform bridge for Symfony AI", - "keywords": [ - "Bridge", - "ai", - "local", - "ollama", - "platform" - ], - "support": { - "source": "https://github.com/symfony/ai-ollama-platform/tree/v0.10.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-06-15T22:48:31+00:00" + "time": "2026-05-16T01:01:33+00:00" }, { "name": "symfony/ai-open-router-platform", - "version": "v0.10.0", + "version": "v0.9.0", "source": { "type": "git", "url": "https://github.com/symfony/ai-open-router-platform.git", - "reference": "cfadb7858fca98b28b968b032b1bbeb5c9cc985b" + "reference": "7e2b560c86f618cd5d33f9f0c581d83bebc9802f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ai-open-router-platform/zipball/cfadb7858fca98b28b968b032b1bbeb5c9cc985b", - "reference": "cfadb7858fca98b28b968b032b1bbeb5c9cc985b", + "url": "https://api.github.com/repos/symfony/ai-open-router-platform/zipball/7e2b560c86f618cd5d33f9f0c581d83bebc9802f", + "reference": "7e2b560c86f618cd5d33f9f0c581d83bebc9802f", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/ai-generic-platform": "^0.10", - "symfony/ai-platform": "^0.10", + "symfony/ai-generic-platform": "^0.9", + "symfony/ai-platform": "^0.9", "symfony/http-client": "^7.3|^8.0" }, "require-dev": { @@ -11212,7 +11126,7 @@ "platform" ], "support": { - "source": "https://github.com/symfony/ai-open-router-platform/tree/v0.10.0" + "source": "https://github.com/symfony/ai-open-router-platform/tree/v0.9.0" }, "funding": [ { @@ -11232,20 +11146,20 @@ "type": "tidelift" } ], - "time": "2026-06-16T08:09:36+00:00" + "time": "2026-05-16T01:01:33+00:00" }, { "name": "symfony/ai-platform", - "version": "v0.10.0", + "version": "v0.9.0", "source": { "type": "git", "url": "https://github.com/symfony/ai-platform.git", - "reference": "8100507aa9c46f3ad56d0272e8e46b558f451052" + "reference": "fb55ebdf20bbe30af6752a0ce6a25abc56b2b625" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ai-platform/zipball/8100507aa9c46f3ad56d0272e8e46b558f451052", - "reference": "8100507aa9c46f3ad56d0272e8e46b558f451052", + "url": "https://api.github.com/repos/symfony/ai-platform/zipball/fb55ebdf20bbe30af6752a0ce6a25abc56b2b625", + "reference": "fb55ebdf20bbe30af6752a0ce6a25abc56b2b625", "shasum": "" }, "require": { @@ -11344,7 +11258,7 @@ "voyage" ], "support": { - "source": "https://github.com/symfony/ai-platform/tree/v0.10.0" + "source": "https://github.com/symfony/ai-platform/tree/v0.9.0" }, "funding": [ { @@ -11364,7 +11278,7 @@ "type": "tidelift" } ], - "time": "2026-06-16T06:39:24+00:00" + "time": "2026-05-15T19:15:50+00:00" }, { "name": "symfony/apache-pack", @@ -17558,16 +17472,16 @@ }, { "name": "symplify/easy-coding-standard", - "version": "13.2.3", + "version": "13.2.2", "source": { "type": "git", "url": "https://github.com/ecsphp/ecs.git", - "reference": "94f56bce0420d4e837a85c4b2c6501293a5974eb" + "reference": "3da31a9c267ead69664eb1258aaea62bf9b66f79" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ecsphp/ecs/zipball/94f56bce0420d4e837a85c4b2c6501293a5974eb", - "reference": "94f56bce0420d4e837a85c4b2c6501293a5974eb", + "url": "https://api.github.com/repos/ecsphp/ecs/zipball/3da31a9c267ead69664eb1258aaea62bf9b66f79", + "reference": "3da31a9c267ead69664eb1258aaea62bf9b66f79", "shasum": "" }, "require": { @@ -17602,22 +17516,22 @@ "static analysis" ], "support": { - "source": "https://github.com/ecsphp/ecs/tree/13.2.3" + "source": "https://github.com/ecsphp/ecs/tree/13.2.2" }, - "time": "2026-06-15T22:08:41+00:00" + "time": "2026-06-13T19:45:53+00:00" }, { "name": "tecnickcom/tc-lib-barcode", - "version": "2.10.0", + "version": "2.7.0", "source": { "type": "git", "url": "https://github.com/tecnickcom/tc-lib-barcode.git", - "reference": "3d7b04b0a905b1bcd7ce65e364ab228c3a11a463" + "reference": "4e53047a4ba4ed592ae677b3729ce9bfeae1cfbb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tecnickcom/tc-lib-barcode/zipball/3d7b04b0a905b1bcd7ce65e364ab228c3a11a463", - "reference": "3d7b04b0a905b1bcd7ce65e364ab228c3a11a463", + "url": "https://api.github.com/repos/tecnickcom/tc-lib-barcode/zipball/4e53047a4ba4ed592ae677b3729ce9bfeae1cfbb", + "reference": "4e53047a4ba4ed592ae677b3729ce9bfeae1cfbb", "shasum": "" }, "require": { @@ -17626,11 +17540,12 @@ "ext-gd": "*", "ext-pcre": "*", "php": ">=8.2", - "tecnickcom/tc-lib-color": "^2.11" + "tecnickcom/tc-lib-color": "^2.7" }, "require-dev": { "pdepend/pdepend": "^2.16", - "phpunit/phpunit": "^11.5 || ^12.5 || ^13.2" + "phpcompatibility/php-compatibility": "^10.0.0@dev", + "phpunit/phpunit": "^13.1 || ^12.5 || ^11.5" }, "type": "library", "autoload": { @@ -17702,20 +17617,20 @@ "type": "github" } ], - "time": "2026-06-17T18:04:27+00:00" + "time": "2026-05-22T07:09:18+00:00" }, { "name": "tecnickcom/tc-lib-color", - "version": "2.11.0", + "version": "2.8.0", "source": { "type": "git", "url": "https://github.com/tecnickcom/tc-lib-color.git", - "reference": "b7b326913c21fd695c4a189e3632c0d001b51c86" + "reference": "6947cc9fffe23a21642279b8ab73a43f3311c5f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tecnickcom/tc-lib-color/zipball/b7b326913c21fd695c4a189e3632c0d001b51c86", - "reference": "b7b326913c21fd695c4a189e3632c0d001b51c86", + "url": "https://api.github.com/repos/tecnickcom/tc-lib-color/zipball/6947cc9fffe23a21642279b8ab73a43f3311c5f9", + "reference": "6947cc9fffe23a21642279b8ab73a43f3311c5f9", "shasum": "" }, "require": { @@ -17724,7 +17639,8 @@ }, "require-dev": { "pdepend/pdepend": "^2.16", - "phpunit/phpunit": "^11.5 || ^12.5 || ^13.2" + "phpcompatibility/php-compatibility": "^10.0.0@dev", + "phpunit/phpunit": "^13.1 || ^12.5 || ^11.5" }, "type": "library", "autoload": { @@ -17769,7 +17685,7 @@ "type": "github" } ], - "time": "2026-06-17T17:58:21+00:00" + "time": "2026-05-22T06:55:57+00:00" }, { "name": "thecodingmachine/safe", @@ -18886,16 +18802,16 @@ }, { "name": "webmozart/assert", - "version": "2.4.1", + "version": "2.4.0", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "2ccb7c2e821038c03a3e6e1700c570c158c55f70" + "reference": "9007ea6f45ecf352a9422b36644e4bfc039b9155" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/2ccb7c2e821038c03a3e6e1700c570c158c55f70", - "reference": "2ccb7c2e821038c03a3e6e1700c570c158c55f70", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/9007ea6f45ecf352a9422b36644e4bfc039b9155", + "reference": "9007ea6f45ecf352a9422b36644e4bfc039b9155", "shasum": "" }, "require": { @@ -18946,9 +18862,9 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/2.4.1" + "source": "https://github.com/webmozarts/assert/tree/2.4.0" }, - "time": "2026-06-15T15:31:57+00:00" + "time": "2026-05-20T13:07:01+00:00" }, { "name": "willdurand/negotiation", @@ -19777,16 +19693,16 @@ }, { "name": "phpstan/phpstan-symfony", - "version": "2.0.20", + "version": "2.0.19", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-symfony.git", - "reference": "53f1a6462dbe71fad36ce054caf5e1b725b740fd" + "reference": "546071ed7f80a89ec30909346eb7cc741800740a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/53f1a6462dbe71fad36ce054caf5e1b725b740fd", - "reference": "53f1a6462dbe71fad36ce054caf5e1b725b740fd", + "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/546071ed7f80a89ec30909346eb7cc741800740a", + "reference": "546071ed7f80a89ec30909346eb7cc741800740a", "shasum": "" }, "require": { @@ -19845,9 +19761,9 @@ ], "support": { "issues": "https://github.com/phpstan/phpstan-symfony/issues", - "source": "https://github.com/phpstan/phpstan-symfony/tree/2.0.20" + "source": "https://github.com/phpstan/phpstan-symfony/tree/2.0.19" }, - "time": "2026-06-16T09:17:35+00:00" + "time": "2026-05-29T12:52:44+00:00" }, { "name": "phpunit/php-code-coverage", @@ -20308,21 +20224,21 @@ }, { "name": "rector/rector", - "version": "2.5.1", + "version": "2.4.5", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "34a9124ece04df818e6b4be4ecd0a4e23f4c0c64" + "reference": "cbd86024be5014d3c14d9f0b3f7aae8ecbffd62c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/34a9124ece04df818e6b4be4ecd0a4e23f4c0c64", - "reference": "34a9124ece04df818e6b4be4ecd0a4e23f4c0c64", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/cbd86024be5014d3c14d9f0b3f7aae8ecbffd62c", + "reference": "cbd86024be5014d3c14d9f0b3f7aae8ecbffd62c", "shasum": "" }, "require": { "php": "^7.4|^8.0", - "phpstan/phpstan": "^2.2.2" + "phpstan/phpstan": "^2.1.56" }, "conflict": { "rector/rector-doctrine": "*", @@ -20356,7 +20272,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/2.5.1" + "source": "https://github.com/rectorphp/rector/tree/2.4.5" }, "funding": [ { @@ -20364,7 +20280,7 @@ "type": "github" } ], - "time": "2026-06-21T10:28:27+00:00" + "time": "2026-05-26T21:03:22+00:00" }, { "name": "roave/security-advisories", @@ -20372,12 +20288,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "bfdbd26a02c71b3b00586f056c8cf5efea22a27a" + "reference": "810e1d8cfbc718df8dacf74b62b7b9a1780b9698" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/bfdbd26a02c71b3b00586f056c8cf5efea22a27a", - "reference": "bfdbd26a02c71b3b00586f056c8cf5efea22a27a", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/810e1d8cfbc718df8dacf74b62b7b9a1780b9698", + "reference": "810e1d8cfbc718df8dacf74b62b7b9a1780b9698", "shasum": "" }, "conflict": { @@ -20478,14 +20394,13 @@ "bytefury/crater": "<6.0.2", "cachethq/cachet": "<2.5.1", "cadmium-org/cadmium-cms": "<=0.4.9", - "cakephp/authentication": "<3.3.6|>=4,<4.1.1", "cakephp/cakephp": "<3.10.3|>=4,<4.0.10|>=4.1,<4.1.4|>=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10|>=5.2.10,<5.2.12|==5.3", "cakephp/database": ">=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10", "cardgate/magento2": "<2.0.33", "cardgate/woocommerce": "<=3.1.15", - "cart2quote/module-quotation": ">=4.1.6,<4.4.6|>=5,<5.4.4", + "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", "cart2quote/module-quotation-encoded": ">=4.1.6,<=4.4.5|>=5,<5.4.4", - "cartalyst/sentry": "<2.1.7", + "cartalyst/sentry": "<=2.1.6", "catfan/medoo": "<1.7.5", "causal/oidc": "<4", "cecil/cecil": "<7.47.1", @@ -20523,13 +20438,12 @@ "coreshop/core-shop": "<4.1.9|==5", "corveda/phpsandbox": "<1.3.5", "cosenary/instagram": "<=2.3", - "cotonti/cotonti": "<=1", "couleurcitron/tarteaucitron-wp": "<0.3", "cpsit/typo3-mailqueue": "<0.4.5|>=0.5,<0.5.2", "craftcms/aws-s3": ">=2.0.2,<=2.2.4", "craftcms/azure-blob": ">=2.0.0.0-beta1,<=2.1", - "craftcms/cms": "<4.18|>=5,<5.10", - "craftcms/commerce": ">=4,<=4.11.1|>=5,<=5.6.4", + "craftcms/cms": "<4.17.12|>=5,<5.9.18", + "craftcms/commerce": ">=4,<4.11|>=5,<5.6", "craftcms/composer": ">=4.0.0.0-RC1-dev,<=4.10|>=5.0.0.0-RC1-dev,<=5.5.1", "craftcms/craft": ">=3.5,<=4.16.17|>=5.0.0.0-RC1-dev,<=5.8.21", "craftcms/google-cloud": ">=2.0.0.0-beta1,<=2.2", @@ -20584,7 +20498,7 @@ "drupal/commerce_alphabank_redirect": "<1.0.3", "drupal/commerce_eurobank_redirect": "<2.1.1", "drupal/config_split": "<1.10|>=2,<2.0.2", - "drupal/core": ">=6,<6.38|>=7,<7.103|>=8,<10.5.10|>=10.6,<10.6.9|>=11,<11.2.12|>=11.3,<11.3.10", + "drupal/core": ">=6,<6.38|>=7,<7.103|>=8,<10.5.9|>=10.6,<10.6.7|>=11,<11.2.11|>=11.3,<11.3.7", "drupal/core-recommended": ">=7,<7.102|>=8,<10.2.11|>=10.3,<10.3.9|>=11,<11.0.8", "drupal/currency": "<3.5", "drupal/drupal": ">=5,<5.11|>=6,<6.38|>=7,<7.102|>=8,<10.2.11|>=10.3,<10.3.9|>=11,<11.0.8", @@ -20657,7 +20571,6 @@ "fenom/fenom": "<=2.12.1", "filament/actions": ">=3.2,<3.2.123|>=4,<=4.11.3|>=5,<=5.6.3", "filament/filament": ">=4,<4.3.1", - "filament/forms": ">=3,<=3.3.52", "filament/infolists": ">=3,<3.2.115", "filament/tables": ">=3,<=3.3.50|>=4,<4.8.5|>=5,<5.3.5", "filegator/filegator": "<7.8", @@ -20705,10 +20618,10 @@ "georgringer/news": "<10.0.4|>=11,<11.4.4|>=12,<12.3.2|>=13,<13.0.2|>=14,<14.0.3", "geshi/geshi": "<=1.0.9.1", "getformwork/formwork": "<=2.3.3", - "getgrav/grav": "<=2.0.0.0-RC8", + "getgrav/grav": "<=2.0.0.0-RC1", "getgrav/grav-plugin-api": "<1.0.0.0-beta15", "getgrav/grav-plugin-form": "<9.1", - "getkirby/cms": "<=4.9.3|>=5,<=5.4.3", + "getkirby/cms": "<=4.9|>=5,<=5.4", "getkirby/kirby": "<3.9.8.3-dev|>=3.10,<3.10.1.2-dev|>=4,<4.7.1", "getkirby/panel": "<2.5.14", "getkirby/starterkit": "<=3.7.0.2", @@ -20725,10 +20638,10 @@ "gregwar/rst": "<1.0.3", "grumpydictator/firefly-iii": "<=6.6.2", "gugoan/economizzer": "<=0.9.0.0-beta1", - "guzzlehttp/guzzle": "<7.12.1", + "guzzlehttp/guzzle": "<6.5.8|>=7,<7.4.5", "guzzlehttp/guzzle-services": "<1.5.4", "guzzlehttp/oauth-subscriber": "<0.8.1", - "guzzlehttp/psr7": "<2.12.1", + "guzzlehttp/psr7": "<2.10.2", "haffner/jh_captcha": "<=2.1.3|>=3,<=3.0.2", "handcraftedinthealps/goodby-csv": "<1.4.3", "harvesthq/chosen": "<1.8.7", @@ -20783,7 +20696,6 @@ "jasig/phpcas": "<1.3.3", "jbartels/wec-map": "<3.0.3", "jcbrand/converse.js": "<3.3.3", - "jleehr/canto-saas-api": "<=2", "joedolson/my-calendar": "<3.7.7", "joelbutcher/socialstream": "<5.6|>=6,<6.2", "johnbillion/query-monitor": "<3.20.4", @@ -20827,7 +20739,7 @@ "lara-zeus/artemis": ">=1,<=1.0.6", "lara-zeus/dynamic-dashboard": ">=3,<=3.0.1", "laravel/fortify": "<1.11.1", - "laravel/framework": "<12.61.1|>=13,<13.12", + "laravel/framework": "<12.60|>=13,<13.10", "laravel/laravel": ">=5.4,<5.4.22", "laravel/passport": ">=13,<13.7.1", "laravel/pulse": "<1.3.1", @@ -20918,7 +20830,6 @@ "movim/moxl": ">=0.8,<=0.10", "movingbytes/social-network": "<=1.2.1", "mpdf/mpdf": "<=7.1.7", - "mtdowling/jmespath.php": "<2.9.1", "munkireport/comment": "<4", "munkireport/managedinstalls": "<2.6", "munkireport/munki_facts": "<1.5", @@ -21005,7 +20916,7 @@ "phenx/php-svg-lib": "<0.5.2", "php-censor/php-censor": "<2.0.13|>=2.1,<2.1.5", "php-mod/curl": "<2.3.2", - "phpbb/phpbb": "<3.3.16|==4.0.0.0-alpha1", + "phpbb/phpbb": "<3.3.11", "phpems/phpems": ">=6,<=6.1.3", "phpfastcache/phpfastcache": "<6.1.5|>=7,<7.1.2|>=8,<8.0.7", "phpmailer/phpmailer": "<6.5", @@ -21017,7 +20928,7 @@ "phpoffice/phpexcel": "<=1.8.2", "phpoffice/phpspreadsheet": "<=1.30.4|>=2,<=2.1.15|>=2.2,<=2.4.4|>=3,<=3.10.4|>=4,<=5.6", "phppgadmin/phppgadmin": "<=7.13", - "phpseclib/phpseclib": "<=2.0.54|>=3,<=3.0.53", + "phpseclib/phpseclib": "<=2.0.53|>=3,<=3.0.51", "phpservermon/phpservermon": "<3.6", "phpsysinfo/phpsysinfo": "<3.4.3", "phpunit/phpunit": "<8.5.52|>=9,<9.6.33|>=10,<10.5.62|>=11,<11.5.50|>=12,<12.5.8|>=12.5.21,<12.5.22|>=13.1.5,<13.1.6", @@ -21033,7 +20944,7 @@ "pimcore/demo": "<10.3", "pimcore/ecommerce-framework-bundle": "<1.0.10", "pimcore/perspective-editor": "<1.5.1", - "pimcore/pimcore": "<=12.3.8", + "pimcore/pimcore": "<=12.3.6", "pimcore/web2print-tools-bundle": "<=5.2.1|>=6.0.0.0-RC1-dev,<=6.1", "piwik/piwik": "<1.11", "pixelfed/pixelfed": "<0.12.5", @@ -21057,8 +20968,8 @@ "prestashop/ps_linklist": "<3.1", "privatebin/privatebin": "<1.4|>=1.5,<1.7.4|>=1.7.7,<2.0.3", "processwire/processwire": "<=3.0.255", - "propel/propel": ">=2.0.0.0-alpha1,<2.0.0.0-alpha8", - "propel/propel1": ">=1,<1.7.2", + "propel/propel": ">=2.0.0.0-alpha1,<=2.0.0.0-alpha7", + "propel/propel1": ">=1,<=1.7.1", "psy/psysh": "<=0.11.22|>=0.12,<=0.12.18", "pterodactyl/panel": "<1.12.3", "ptheofan/yii2-statemachine": ">=2.0.0.0-RC1-dev,<=2", @@ -21121,7 +21032,7 @@ "silverstripe/assets": "<2.4.5|>=3,<3.1.3", "silverstripe/cms": "<4.11.3", "silverstripe/comments": ">=1.3,<3.1.1", - "silverstripe/forum": "<0.6.2|>=0.7,<0.7.4", + "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", "silverstripe/framework": "<5.3.23", "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.8.2|>=4,<4.3.7|>=5,<5.1.3", "silverstripe/hybridsessions": ">=1,<2.4.1|>=2.5,<2.5.1", @@ -21165,7 +21076,6 @@ "spencer14420/sp-php-email-handler": "<1", "spipu/html2pdf": "<5.2.8", "spiral/roadrunner": "<2025.1", - "spomky-labs/otphp": "<11.4.3", "spoon/library": "<1.4.1", "spoonity/tcpdf": "<6.2.22", "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", @@ -21239,9 +21149,7 @@ "symfony/twig-bridge": ">=2,<4.4.51|>=5,<5.4.31|>=6,<6.3.8|>=6.4.24,<6.4.40", "symfony/twilio-notifier": ">=6.4,<6.4.40|>=7,<7.4.12|>=8,<8.0.12", "symfony/ux-autocomplete": "<2.36|>=3,<3.1", - "symfony/ux-icons": ">=2.17,<2.36.1|>=3,<3.2", "symfony/ux-live-component": "<2.36|>=3,<3.1", - "symfony/ux-toolkit": ">=2.32,<2.36.1|>=3,<3.2", "symfony/ux-twig-component": "<2.25.1", "symfony/validator": "<5.4.43|>=6,<6.4.11|>=7,<7.1.4", "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", @@ -21343,9 +21251,6 @@ "web-auth/webauthn-lib": ">=4.5,<4.9|>=5.2,<5.2.4", "web-auth/webauthn-symfony-bundle": ">=5.2,<5.2.4", "web-feet/coastercms": "==5.5", - "web-token/jwt-experimental": "<=4.1.6", - "web-token/jwt-framework": "<=4.2.99", - "web-token/jwt-library": "<3.4.10|>=4,<4.0.7|>=4.1,<4.1.7", "web-tp3/wec_map": "<3.0.3", "webbuilders-group/silverstripe-kapost-bridge": "<0.4", "webcoast/deferred-image-processing": "<1.0.2", @@ -21471,7 +21376,7 @@ "type": "tidelift" } ], - "time": "2026-06-19T21:28:22+00:00" + "time": "2026-06-12T20:48:39+00:00" }, { "name": "sebastian/cli-parser", diff --git a/config/packages/ai_ollama_platform.yaml b/config/packages/ai_ollama_platform.yaml deleted file mode 100644 index df551d4a..00000000 --- a/config/packages/ai_ollama_platform.yaml +++ /dev/null @@ -1,5 +0,0 @@ -ai: - platform: - ollama: - endpoint: '%env(string:settings:ai_ollama:endpoint)%' - api_key: '%env(string:settings:ai_ollama:apiKey)%' diff --git a/config/parameters.yaml b/config/parameters.yaml index e654a9b5..b1aa5314 100644 --- a/config/parameters.yaml +++ b/config/parameters.yaml @@ -53,7 +53,6 @@ parameters: # Themes commented here by default, are not really usable, because of display problems. Enable them at your own risk! partdb.available_themes: - bootstrap - - brite - cerulean - cosmo - cyborg diff --git a/config/reference.php b/config/reference.php index 961d8ea5..71b08412 100644 --- a/config/reference.php +++ b/config/reference.php @@ -2874,8 +2874,8 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param; * enable_translation?: bool|Param, // Enable translation for the system prompt // Default: false * translation_domain?: string|Param, // The translation domain for the system prompt // Default: null * }, - * tools?: bool|array{ // Tools are opt-in: set to true to inject all services tagged with "ai.tool", or configure an explicit list of tools. When the option is omitted (or set to null or false), no tools are registered. - * enabled?: bool|Param, // Default: false + * tools?: bool|array{ + * enabled?: bool|Param, // Default: true * services?: list +# Set Content-Security-Policy for svg files (and compressed variants), to block embedded javascript in there - # Set a strict CSP for all static assets not handled by PHP. - # PHP responses already carry their own CSP via NelmioSecurityBundle, so setifempty leaves those untouched. - Header always setifempty Content-Security-Policy "default-src 'self'; script-src 'none'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; sandbox;" - Header always setifempty X-Content-Type-Options "nosniff" - - # SVG files get a slightly different CSP because they can embed resources and must not be framed. - Header always set Content-Security-Policy "default-src 'self'; script-src 'none'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; frame-ancestors 'none'; sandbox;" + Header set Content-Security-Policy "default-src 'self'; script-src 'none'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; frame-ancestors 'none';" - + \ No newline at end of file diff --git a/public/kicad/footprints.txt b/public/kicad/footprints.txt index 08380de1..a0b41279 100644 --- a/public/kicad/footprints.txt +++ b/public/kicad/footprints.txt @@ -1,4 +1,4 @@ -# Generated on Mon Jun 22 07:31:48 UTC 2026 +# Generated on Mon Jun 15 07:28:00 UTC 2026 # This file contains all footprints available in the offical KiCAD library Audio_Module:Reverb_BTDR-1H Audio_Module:Reverb_BTDR-1V @@ -8293,7 +8293,6 @@ Converter_DCDC:Converter_DCDC_Hamamatsu_C11204-1_THT Converter_DCDC:Converter_DCDC_MeanWell_NID30_THT Converter_DCDC:Converter_DCDC_MeanWell_NID60_THT Converter_DCDC:Converter_DCDC_MeanWell_NSD10_THT -Converter_DCDC:Converter_DCDC_MeanWell_SMU02x-xxN_THT Converter_DCDC:Converter_DCDC_Murata_CRE1xxxxxx3C_THT Converter_DCDC:Converter_DCDC_Murata_CRE1xxxxxxDC_THT Converter_DCDC:Converter_DCDC_Murata_CRE1xxxxxxSC_THT @@ -13031,6 +13030,8 @@ Package_SON:WSON-6-1EP_2x2mm_P0.65mm_EP1x1.6mm Package_SON:WSON-6-1EP_2x2mm_P0.65mm_EP1x1.6mm_ThermalVias Package_SON:WSON-6-1EP_3x3mm_P0.95mm Package_SON:WSON-6_1.5x1.5mm_P0.5mm +Package_SON:WSON-8-1EP_2x2mm_P0.5mm_EP0.9x1.6mm +Package_SON:WSON-8-1EP_2x2mm_P0.5mm_EP0.9x1.6mm_ThermalVias Package_SON:WSON-8-1EP_3x2.5mm_P0.5mm_EP1.2x1.5mm_PullBack Package_SON:WSON-8-1EP_3x2.5mm_P0.5mm_EP1.2x1.5mm_PullBack_ThermalVias Package_SON:WSON-8-1EP_3x3mm_P0.5mm_EP1.2x2mm diff --git a/public/kicad/symbols.txt b/public/kicad/symbols.txt index a24a1785..b07fbf28 100644 --- a/public/kicad/symbols.txt +++ b/public/kicad/symbols.txt @@ -1,4 +1,4 @@ -# Generated on Mon Jun 22 07:32:26 UTC 2026 +# Generated on Mon Jun 15 07:28:38 UTC 2026 # This file contains all symbols available in the offical KiCAD library 4xxx:14528 4xxx:14529 @@ -4954,7 +4954,6 @@ Converter_DCDC:RPMH15-1.5 Converter_DCDC:RPMH24-1.5 Converter_DCDC:RPMH3.3-1.5 Converter_DCDC:RPMH5.0-1.5 -Converter_DCDC:SMU02L-24N Converter_DCDC:TBA1-0310 Converter_DCDC:TBA1-0311 Converter_DCDC:TBA1-0510 @@ -6143,7 +6142,6 @@ Device:SparkGap Device:Speaker Device:Speaker_Crystal Device:Speaker_Ultrasound -Device:Thermal_Jumper Device:Thermistor Device:Thermistor_NTC Device:Thermistor_NTC_3Wire @@ -19299,7 +19297,6 @@ Regulator_Switching:LT1373HVCN8 Regulator_Switching:LT1373HVCS8 Regulator_Switching:LT1377CN8 Regulator_Switching:LT1377CS8 -Regulator_Switching:LT1931 Regulator_Switching:LT1945 Regulator_Switching:LT3430 Regulator_Switching:LT3430-1 @@ -22519,7 +22516,6 @@ Transistor_FET_Other:Q_NMOS_Depletion_GDS Transistor_FET_Other:Q_NMOS_Depletion_GSD Transistor_FET_Other:Q_NMOS_Depletion_SDG Transistor_FET_Other:Q_NMOS_Depletion_SGD -Transistor_FET_Other:SP010N70T8 Transistor_FET_Other:VNB35N07xx-E Transistor_FET_Other:VNP10N07 Transistor_FET_Other:VNP35N07xx-E diff --git a/src/Controller/AttachmentFileController.php b/src/Controller/AttachmentFileController.php index 7f48e661..01aeab11 100644 --- a/src/Controller/AttachmentFileController.php +++ b/src/Controller/AttachmentFileController.php @@ -93,8 +93,6 @@ class AttachmentFileController extends AbstractController //Set header content disposition, so that the file will be downloaded $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, $attachment->getFilename()); - $this->setAttachmentCSPHeaders($response); - return $response; } @@ -114,16 +112,6 @@ class AttachmentFileController extends AbstractController //Set header content disposition, so that the file will be downloaded $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_INLINE, $attachment->getFilename()); - $this->setAttachmentCSPHeaders($response); - - return $response; - } - - private function setAttachmentCSPHeaders(Response $response): Response - { - //Set an CSP that disallow to run any scripts, styles or images from the attachment render page, as it is not used anywhere else for now and can be a security risk if used without proper precautions, so it should be opt-in - $response->headers->set('Content-Security-Policy', "default-src 'self'; script-src 'none'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; sandbox;"); - return $response; } diff --git a/src/Services/AI/AIPlatforms.php b/src/Services/AI/AIPlatforms.php index 318819a2..2f4d6317 100644 --- a/src/Services/AI/AIPlatforms.php +++ b/src/Services/AI/AIPlatforms.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace App\Services\AI; use App\Settings\AISettings\LMStudioSettings; -use App\Settings\AISettings\OllamaSettings; use App\Settings\AISettings\OpenRouterSettings; use Symfony\Contracts\Translation\TranslatableInterface; use Symfony\Contracts\Translation\TranslatorInterface; @@ -33,7 +32,6 @@ enum AIPlatforms: string implements TranslatableInterface { case OPENROUTER = 'openrouter'; case LMSTUDIO = 'lmstudio'; - case OLLAMA = 'ollama'; /** * Returns the name attribute of the service tag for this platform, which is used to register the platform in the AIPlatformRegistry @@ -54,7 +52,6 @@ enum AIPlatforms: string implements TranslatableInterface return match ($this) { self::LMSTUDIO => LMStudioSettings::class, self::OPENROUTER => OpenRouterSettings::class, - self::OLLAMA => OllamaSettings::class, }; } diff --git a/src/Services/Attachments/AttachmentSubmitHandler.php b/src/Services/Attachments/AttachmentSubmitHandler.php index 1b90091f..2e40f1f5 100644 --- a/src/Services/Attachments/AttachmentSubmitHandler.php +++ b/src/Services/Attachments/AttachmentSubmitHandler.php @@ -543,10 +543,8 @@ class AttachmentSubmitHandler return $attachment; } - $guessed_mime_type = $this->mimeTypes->guessMimeType($path); - //Check if the file is an SVG - if ($guessed_mime_type === "image/svg+xml" || $attachment->getExtension() === "svg") { + if ($attachment->getExtension() === "svg") { $this->SVGSanitizer->sanitizeFile($path); } diff --git a/src/Settings/AISettings/AISettings.php b/src/Settings/AISettings/AISettings.php index 9f145c7f..732eb597 100644 --- a/src/Settings/AISettings/AISettings.php +++ b/src/Settings/AISettings/AISettings.php @@ -40,7 +40,4 @@ class AISettings #[EmbeddedSettings] public ?LMStudioSettings $lmstudio = null; - - #[EmbeddedSettings] - public ?OllamaSettings $ollama = null; } diff --git a/src/Settings/AISettings/OllamaSettings.php b/src/Settings/AISettings/OllamaSettings.php deleted file mode 100644 index dd17d5e2..00000000 --- a/src/Settings/AISettings/OllamaSettings.php +++ /dev/null @@ -1,58 +0,0 @@ -. - */ - -declare(strict_types=1); - - -namespace App\Settings\AISettings; - -use App\Form\Type\APIKeyType; -use App\Services\AI\AIPlatformSettingsInterface; -use App\Settings\SettingsIcon; -use Jbtronics\SettingsBundle\Metadata\EnvVarMode; -use Jbtronics\SettingsBundle\Settings\Settings; -use Jbtronics\SettingsBundle\Settings\SettingsParameter; -use Jbtronics\SettingsBundle\Settings\SettingsTrait; -use Symfony\Component\Form\Extension\Core\Type\UrlType; -use Symfony\Component\Translation\StaticMessage; -use Symfony\Component\Translation\TranslatableMessage as TM; - -#[Settings(name: 'ai_ollama', label: new TM("settings.ai.ollama"))] -#[SettingsIcon("fa-robot")] -class OllamaSettings implements AIPlatformSettingsInterface -{ - use SettingsTrait; - - #[SettingsParameter(label: new TM("settings.ai.ollama.endpoint"), - formType: UrlType::class, - formOptions: ["attr" => ["placeholder" => new StaticMessage("http://localhost:11434")]], - envVar: "AI_OLLAMA_ENDPOINT", envVarMode: EnvVarMode::OVERWRITE)] - public ?string $endpoint = null; - - #[SettingsParameter(label: new TM("settings.ai.ollama.apiKey"), - formType: APIKeyType::class, - envVar: "AI_OLLAMA_API_KEY", envVarMode: EnvVarMode::OVERWRITE)] - public ?string $apiKey = null; - - public function isAIPlatformEnabled(): bool - { - return $this->endpoint !== null && $this->endpoint !== ""; - } -} diff --git a/symfony.lock b/symfony.lock index 94af6e6a..f8f88675 100644 --- a/symfony.lock +++ b/symfony.lock @@ -411,18 +411,6 @@ "config/packages/ai_lm_studio_platform.yaml" ] }, - "symfony/ai-ollama-platform": { - "version": "0.10", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "main", - "version": "0.1", - "ref": "2f0ac0a8bc59c4e46b47a962a3ad7fe8104457d6" - }, - "files": [ - "config/packages/ai_ollama_platform.yaml" - ] - }, "symfony/ai-open-router-platform": { "version": "0.8", "recipe": { diff --git a/translations/frontend.cs.xlf b/translations/frontend.cs.xlf index 6417033b..4ba1f913 100644 --- a/translations/frontend.cs.xlf +++ b/translations/frontend.cs.xlf @@ -55,23 +55,5 @@ Jdi! - - - dialog.btn.ok - OK - - - - - dialog.btn.cancel - Zrušit - - - - - dialog.btn.deny - Ne - - diff --git a/translations/frontend.da.xlf b/translations/frontend.da.xlf index 817c703f..4b6a15b9 100644 --- a/translations/frontend.da.xlf +++ b/translations/frontend.da.xlf @@ -55,23 +55,5 @@ Kom nu! - - - dialog.btn.ok - OK - - - - - dialog.btn.cancel - Annuller - - - - - dialog.btn.deny - Nej - - diff --git a/translations/frontend.de.xlf b/translations/frontend.de.xlf index 6a4e7786..9ebd0d32 100644 --- a/translations/frontend.de.xlf +++ b/translations/frontend.de.xlf @@ -55,23 +55,5 @@ Los! - - - dialog.btn.ok - OK - - - - - dialog.btn.cancel - Abbrechen - - - - - dialog.btn.deny - Nein - - diff --git a/translations/frontend.el.xlf b/translations/frontend.el.xlf index fff724d2..bab41358 100644 --- a/translations/frontend.el.xlf +++ b/translations/frontend.el.xlf @@ -7,23 +7,5 @@ Αναζήτηση - - - dialog.btn.ok - OK - - - - - dialog.btn.cancel - Ακύρωση - - - - - dialog.btn.deny - Όχι - - \ No newline at end of file diff --git a/translations/frontend.en.xlf b/translations/frontend.en.xlf index 7f68558a..91617f79 100644 --- a/translations/frontend.en.xlf +++ b/translations/frontend.en.xlf @@ -55,29 +55,5 @@ Go! - - - user.password_strength.crack_time - Estimated time to crack: %time% - - - - - dialog.btn.ok - OK - - - - - dialog.btn.cancel - Cancel - - - - - dialog.btn.deny - No - - diff --git a/translations/frontend.es.xlf b/translations/frontend.es.xlf index 02c52715..7d339959 100644 --- a/translations/frontend.es.xlf +++ b/translations/frontend.es.xlf @@ -55,23 +55,5 @@ ¡Vamos! - - - dialog.btn.ok - OK - - - - - dialog.btn.cancel - Cancelar - - - - - dialog.btn.deny - No - - diff --git a/translations/frontend.fr.xlf b/translations/frontend.fr.xlf index 2a459052..5ebfca51 100644 --- a/translations/frontend.fr.xlf +++ b/translations/frontend.fr.xlf @@ -55,23 +55,5 @@ Rechercher ! - - - dialog.btn.ok - OK - - - - - dialog.btn.cancel - Annuler - - - - - dialog.btn.deny - Non - - diff --git a/translations/frontend.hu.xlf b/translations/frontend.hu.xlf index 7724ce66..c303dedc 100644 --- a/translations/frontend.hu.xlf +++ b/translations/frontend.hu.xlf @@ -55,23 +55,5 @@ Indítás! - - - dialog.btn.ok - OK - - - - - dialog.btn.cancel - Mégse - - - - - dialog.btn.deny - Nem - - diff --git a/translations/frontend.it.xlf b/translations/frontend.it.xlf index c13ab47a..f163e3e2 100644 --- a/translations/frontend.it.xlf +++ b/translations/frontend.it.xlf @@ -55,23 +55,5 @@ Cerca! - - - dialog.btn.ok - OK - - - - - dialog.btn.cancel - Annulla - - - - - dialog.btn.deny - No - - diff --git a/translations/frontend.ja.xlf b/translations/frontend.ja.xlf index d8612e5b..90ffdf5f 100644 --- a/translations/frontend.ja.xlf +++ b/translations/frontend.ja.xlf @@ -19,23 +19,5 @@ 検索 - - - dialog.btn.ok - OK - - - - - dialog.btn.cancel - キャンセル - - - - - dialog.btn.deny - いいえ - - \ No newline at end of file diff --git a/translations/frontend.nl.xlf b/translations/frontend.nl.xlf index 4c90e933..d14f5a81 100644 --- a/translations/frontend.nl.xlf +++ b/translations/frontend.nl.xlf @@ -55,23 +55,5 @@ Ga! - - - dialog.btn.ok - OK - - - - - dialog.btn.cancel - Annuleren - - - - - dialog.btn.deny - Nee - - diff --git a/translations/frontend.pl.xlf b/translations/frontend.pl.xlf index e748286c..fface684 100644 --- a/translations/frontend.pl.xlf +++ b/translations/frontend.pl.xlf @@ -55,23 +55,5 @@ Idź! - - - dialog.btn.ok - OK - - - - - dialog.btn.cancel - Anuluj - - - - - dialog.btn.deny - Nie - - diff --git a/translations/frontend.pt_BR.xlf b/translations/frontend.pt_BR.xlf index 9053c8c3..fb2f2335 100644 --- a/translations/frontend.pt_BR.xlf +++ b/translations/frontend.pt_BR.xlf @@ -55,23 +55,5 @@ Vá! - - - dialog.btn.ok - OK - - - - - dialog.btn.cancel - Cancelar - - - - - dialog.btn.deny - Não - - diff --git a/translations/frontend.ru.xlf b/translations/frontend.ru.xlf index 6e1879d8..f4665a74 100644 --- a/translations/frontend.ru.xlf +++ b/translations/frontend.ru.xlf @@ -55,23 +55,5 @@ Поехали! - - - dialog.btn.ok - ОК - - - - - dialog.btn.cancel - Отмена - - - - - dialog.btn.deny - Нет - - diff --git a/translations/frontend.uk.xlf b/translations/frontend.uk.xlf index a28941fa..fee1b03e 100644 --- a/translations/frontend.uk.xlf +++ b/translations/frontend.uk.xlf @@ -55,23 +55,5 @@ Почати! - - - dialog.btn.ok - ОК - - - - - dialog.btn.cancel - Скасувати - - - - - dialog.btn.deny - Ні - - diff --git a/translations/frontend.zh.xlf b/translations/frontend.zh.xlf index 7425b1e8..8bb063b8 100644 --- a/translations/frontend.zh.xlf +++ b/translations/frontend.zh.xlf @@ -55,23 +55,5 @@ GO! - - - dialog.btn.ok - 确定 - - - - - dialog.btn.cancel - 取消 - - - - - dialog.btn.deny - - - diff --git a/translations/messages.en.xlf b/translations/messages.en.xlf index af33ee97..117e529b 100644 --- a/translations/messages.en.xlf +++ b/translations/messages.en.xlf @@ -490,7 +490,7 @@ The user will have to set up all two-factor authentication methods again and pri entity.delete.confirm_title - Do you really want to delete %name%? + You really want to delete %name%? @@ -13619,24 +13619,6 @@ Buerklin-API Authentication server: Host URL - - - settings.ai.ollama - Ollama - - - - - settings.ai.ollama.endpoint - Endpoint URL - - - - - settings.ai.ollama.apiKey - API Key - - browser_plugin.recent_pages.title diff --git a/webpack.config.js b/webpack.config.js index 259803fa..60ea145f 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -119,14 +119,7 @@ Encore // requires WebpackEncoreBundle 1.4 or higher .enableIntegrityHashes(Encore.isProduction()) - // Force all jquery imports to the UMD build so webpack always receives the - // jQuery function directly instead of an ESM namespace object. Without this, - // webpack's ESM interop wraps jquery.module.js in a namespace - // { default, jQuery, $ } which has no .fn, crashing Bootstrap's - // defineJQueryPlugin when it tries to access $.fn.alert. - .addAliases({ - 'jquery': path.resolve(__dirname, 'node_modules/jquery/dist/jquery.js') - }) + // uncomment if you're having problems with a jQuery plugin .autoProvidejQuery() @@ -149,7 +142,7 @@ Encore ; //These are all the themes that are available in bootswatch -const AVAILABLE_THEMES = ['bootstrap', 'brite', 'cerulean', 'cosmo', 'cyborg', 'darkly', 'flatly', 'journal', +const AVAILABLE_THEMES = ['bootstrap', 'cerulean', 'cosmo', 'cyborg', 'darkly', 'flatly', 'journal', 'litera', 'lumen', 'lux', 'materia', 'minty', 'morph', 'pulse', 'quartz', 'sandstone', 'simplex', 'sketchy', 'slate', 'solar', 'spacelab', 'superhero', 'united', 'vapor', 'yeti', 'zephyr']; diff --git a/yarn.lock b/yarn.lock index 7589ce13..732fbf6f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1887,11 +1887,11 @@ integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== "@types/node@*": - version "26.0.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-26.0.0.tgz#d4aece9e9412e9f2008d59bc2d74f5279316b665" - integrity sha512-vf2YFi1iY9lHGwNJMs01biZFbKJkrZR1T6/MlzjhJLPdntOHLhTrDSnSVcdtvjihi4VQNlrFRIxLsDBlQpAipA== + version "25.9.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-25.9.3.tgz#11dfe7a33e68fa5c560f0aa76cc5595621ef26b9" + integrity sha512-603BddQMv3pUcr4U2dhujk83N2tTDVr/34wII2B6bJy6g+8WD6yUb11jszNs0gdi4PesVWl7ABt8nYMVpnLUcg== dependencies: - undici-types "~8.3.0" + undici-types ">=7.24.0 <7.24.7" "@types/trusted-types@^2.0.7": version "2.0.7" @@ -2071,66 +2071,37 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -"@zxcvbn-ts/core@^4.1.2": - version "4.1.2" - resolved "https://registry.yarnpkg.com/@zxcvbn-ts/core/-/core-4.1.2.tgz#2d280f3d1a558201cf34080c4d7de335afd4cc4a" - integrity sha512-RQmxWB3AMI+HGQErQdUv6Aq32aQhp6xOxrfgCP0+T9MsLZoP3xtLHuT8O8VojsUxdmQVZfJlYkYb1A0wOwIS+Q== +"@zxcvbn-ts/core@^3.0.2": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@zxcvbn-ts/core/-/core-3.0.4.tgz#c5bde72235eb6c273cec78b672bb47c0d7045cad" + integrity sha512-aQeiT0F09FuJaAqNrxynlAwZ2mW/1MdXakKWNmGM1Qp/VaY6CnB/GfnMS2T8gB2231Esp1/maCWd8vTG4OuShw== dependencies: fastest-levenshtein "1.0.16" -"@zxcvbn-ts/dictionary-compression@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@zxcvbn-ts/dictionary-compression/-/dictionary-compression-3.0.1.tgz#f357ad46e08fff8ba92f6f163d6b38b9533fc849" - integrity sha512-p3KyPzxGc3vWSap5hHA6SllbUCmh7s+NtpGyC3qEWrxYJT9t9TUAzjPm48Okipo+UUyPQfDlIvTcs9JRShBFiQ== +"@zxcvbn-ts/language-common@^3.0.3": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@zxcvbn-ts/language-common/-/language-common-3.0.4.tgz#fa1d2a42f8c8a589555859795da90d6b8027b7c4" + integrity sha512-viSNNnRYtc7ULXzxrQIVUNwHAPSXRtoIwy/Tq4XQQdIknBzw4vz36lQLF6mvhMlTIlpjoN/Z1GFu/fwiAlUSsw== -"@zxcvbn-ts/language-common@^4.1.2": - version "4.1.2" - resolved "https://registry.yarnpkg.com/@zxcvbn-ts/language-common/-/language-common-4.1.2.tgz#c38c52500865d3a2ab7fa1193d747dafc4f2b995" - integrity sha512-uJlBzhC9/KjPImqdnc1/lPxmdn4xKbkruN5p1mASWkXA0gli+GZ5LrVL+dqscA8Pcf4OfudE56TtCWeHljJOvA== - dependencies: - "@zxcvbn-ts/dictionary-compression" "^3.0.1" +"@zxcvbn-ts/language-de@^3.0.1": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@zxcvbn-ts/language-de/-/language-de-3.0.2.tgz#fbd0d1be9454e308bbd63bf5487d4c17670094f0" + integrity sha512-CPl2314qWtnJl4EkeEqFbL4unP6yEAHO976ER+df8CQcKsF4FxdZYEahkleWU66dhNI2VKnmJKNMzq8QtHQKcw== -"@zxcvbn-ts/language-de@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@zxcvbn-ts/language-de/-/language-de-4.1.1.tgz#c6a91f43119fdedefe35b7049c8e4f7af9dd88fa" - integrity sha512-ig4zeCxg4yp5VU4/Iuq5CCHLJtbmHjczK87HKw/K2jYkpk1s7C4jRi+n3XgcPNRP71nvTxGhpPWWlsziCnm5xA== - dependencies: - "@zxcvbn-ts/dictionary-compression" "^3.0.1" +"@zxcvbn-ts/language-en@^3.0.1": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@zxcvbn-ts/language-en/-/language-en-3.0.2.tgz#162ada6b2b556444efd5a7700e70845cfde6d6ec" + integrity sha512-Zp+zL+I6Un2Bj0tRXNs6VUBq3Djt+hwTwUz4dkt2qgsQz47U0/XthZ4ULrT/RxjwJRl5LwiaKOOZeOtmixHnjg== -"@zxcvbn-ts/language-en@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@zxcvbn-ts/language-en/-/language-en-4.1.1.tgz#20ca499affb4d6972d777ec04bb0c786d33add73" - integrity sha512-6UdzuBd3Uex8TKubohcn+uXRVAH34Zjs2eCfT4hQVo9zeTy7AkQRQfdV4OnHR5hQfW/XBrK/AGTZk7VBWh7wwQ== - dependencies: - "@zxcvbn-ts/dictionary-compression" "^3.0.1" +"@zxcvbn-ts/language-fr@^3.0.1": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@zxcvbn-ts/language-fr/-/language-fr-3.0.2.tgz#79c5f0475fd388502f04f5560456db37dc0dde35" + integrity sha512-Tj9jS/Z8mNBAD21pn8Mp4O86CPrwImysO1fM3DG+fsfk8W79/MDzqpFDBHiqpu69Uo3LPPctMHEEteakFWt4Qg== -"@zxcvbn-ts/language-fr@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@zxcvbn-ts/language-fr/-/language-fr-4.1.1.tgz#7d1eccaad7b4dbfe31efe018e9239893bdc33bc8" - integrity sha512-5LW8KMiXLWKG6fTv/BdQbe76sa2EjYmvd59sM3Re+hZMGYEPOdjnAT5qFChQ2Zj8WIaU3P197Y6A0X8OgfoiqQ== - dependencies: - "@zxcvbn-ts/dictionary-compression" "^3.0.1" - -"@zxcvbn-ts/language-it@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@zxcvbn-ts/language-it/-/language-it-4.1.1.tgz#b6fda40099e85a4fc1c5d14d75c9de8a304dd061" - integrity sha512-YxKCBO1rKuCMPYRyOxfUZA+3ju8OO8W9Qx8h/vHrHvuGIavK7L+fgXTUrhjHU8M+zE0pQZxS4wOdfgLFZaP57w== - dependencies: - "@zxcvbn-ts/dictionary-compression" "^3.0.1" - -"@zxcvbn-ts/language-ja@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@zxcvbn-ts/language-ja/-/language-ja-4.1.1.tgz#acd36abe4f6083dceda22771148d0948e0e421d9" - integrity sha512-ZDFUZfm7hlmuiHOMLq7p85wE3Pa7s1WXixU6X+POTuRTjGwXi4LMtiS9wli7zXTEvxSUMdVWBx5ZgyIF6D0S8A== - dependencies: - "@zxcvbn-ts/dictionary-compression" "^3.0.1" - -"@zxcvbn-ts/language-pl@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@zxcvbn-ts/language-pl/-/language-pl-4.1.1.tgz#627d4c365a69e3f78d3e2b6e9667d1b57b6cc1ff" - integrity sha512-hF6Qu9cyHx7sSEzNOQrJQntq8geoincsGvlOC0wkD43LnUVSTR49MKxdsifsemlQgtxR7aUKDgK/e/RFHOljoQ== - dependencies: - "@zxcvbn-ts/dictionary-compression" "^3.0.1" +"@zxcvbn-ts/language-ja@^3.0.1": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@zxcvbn-ts/language-ja/-/language-ja-3.0.2.tgz#299bb6f5465f99405577491b1b31352058540c76" + integrity sha512-YjQyt+eMe3EdpeJiSt81AMF8HfEXXCary/VRoG+0erZBzRjfJ1U3JdSiu9wFFxiEF8Cb5FEmTQ6nQPyraezH6Q== acorn-import-phases@^1.0.3: version "1.0.4" @@ -2252,9 +2223,9 @@ base64-js@^1.1.2, base64-js@^1.3.0: integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== baseline-browser-mapping@^2.10.12: - version "2.10.38" - resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.38.tgz#c84d093c4bf7325c5053c279d90f153c66526042" - integrity sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw== + version "2.10.37" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.37.tgz#3e636475b6b293244e2b23e2c71a2ab9d9e6ba7d" + integrity sha512-girxaJ7WZssDOFhzCGZTDKoTa1gk6A1TbflaYTpykLJ4UU9Fz9kx1aREM8JCuoVHbL8X8T/mJg7w2oYSq72Oig== big.js@^5.2.2: version "5.2.2" @@ -2271,6 +2242,11 @@ boolbase@^1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== +bootbox@^6.0.0: + version "6.0.4" + resolved "https://registry.yarnpkg.com/bootbox/-/bootbox-6.0.4.tgz#005f12d712da5d5723a13a0495e5fc4ad2cc1472" + integrity sha512-LoOT8WbiH6YjlhIxzJ3nZHK1p9tlcoa6QNILSGJMx9ihydzFk+DVzNVWNpHk8MZLOkizey1XhFu1dhoqk77xVg== + bootstrap@^5.1.3: version "5.3.8" resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.8.tgz#6401a10057a22752d21f4e19055508980656aeed" @@ -2531,13 +2507,13 @@ commander@^8.3.0: resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== -compression-webpack-plugin@^12.0.0: - version "12.0.0" - resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-12.0.0.tgz#6842bb3720407afb0686500411c765c37f37164d" - integrity sha512-LR4mS19Jqq41XfA3xVMLrtzVNzqJbUHdzPeLRfQoLiAS9s87f0021fDuU89xxVQFcB6d20ufBkv4j1rQ4OowHw== +compression-webpack-plugin@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-11.1.0.tgz#ee340d2029cf99ccecdea9ad1410b377d15b48b3" + integrity sha512-zDOQYp10+upzLxW+VRSjEpRRwBXJdsb5lBMlRxx1g8hckIFBpe3DTI0en2w7h+beuq89576RVzfiXrkdPGrHhA== dependencies: schema-utils "^4.2.0" - serialize-javascript "^7.0.3" + serialize-javascript "^6.0.2" consola@^3.2.3: version "3.4.2" @@ -2901,9 +2877,9 @@ domhandler@^5.0.2, domhandler@^5.0.3: domelementtype "^2.3.0" dompurify@^3.0.3: - version "3.4.11" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.4.11.tgz#29c8ba496475f279ef4015784068452fb14a0680" - integrity sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw== + version "3.4.10" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.4.10.tgz#96704295b4d8aeefcc8c7a90caa579b0ad69e46a" + integrity sha512-0xzNv0e7oYC6yyuOGZIABPM4qtg3QxLFniDNPP4ZP90wR8Yq3zgwpRbrNiT4N3IKqDbbYFEJLV+JWEs19aZ//w== optionalDependencies: "@types/trusted-types" "^2.0.7" @@ -2926,9 +2902,9 @@ domutils@^3.0.1: domhandler "^5.0.3" electron-to-chromium@^1.5.328: - version "1.5.376" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.376.tgz#16a9d4b72cb16c416aa73a879d92b047b96797ac" - integrity sha512-cUVA7/RvbFTEuw/i3obUwDTRIXojaxkResf+ibByPFxjc6XK3VNtcQXV0NSbAlJ0FMjcJGgftVVB4Qo184EXvA== + version "1.5.372" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.372.tgz#ae8ac69942a37b231773b8fb01759f73733599e3" + integrity sha512-M3yhbAlilnwqC8D21t28UCDGHyitShTmmLRU/H+b74P6Ski16Nb9HONYEaVpMj/pwC7BEo5B95FpjODLCWbtfA== emoji-regex@^8.0.0: version "8.0.0" @@ -3451,10 +3427,10 @@ jest-worker@^30.0.5: merge-stream "^2.0.0" supports-color "^8.1.1" -jquery@>=1.7, jquery@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-4.0.0.tgz#95c33ac29005ff72ec444c5ba1cf457e61404fbb" - integrity sha512-TXCHVR3Lb6TZdtw1l3RTLf8RBWVGexdxL6AC8/e0xZKEpBflBsjh9/8LXw+dkNFuOyW9B7iB3O1sP7hS0Kiacg== +jquery@>=1.7, jquery@^3.5.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.7.1.tgz#083ef98927c9a6a74d05a6af02806566d16274de" + integrity sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg== js-md5@^0.8.3: version "0.8.3" @@ -4081,9 +4057,9 @@ ms@^2.1.3: integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== nanoid@^3.3.12: - version "3.3.14" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.14.tgz#02d7e019f05dd8eeee2779c6f42206c06542ab33" - integrity sha512-U9kYi5bpVMEI31yC8iw4bJJp0avcHXA0W8/wNfLfnvJYzihQo2ZRPYPvpAAd570HAcCBjCTN7vnr+v4StKl1IQ== + version "3.3.12" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.12.tgz#ab3d912e217a6d0a514f00a72a16543a28982c05" + integrity sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ== neo-async@^2.6.2: version "2.6.2" @@ -4103,9 +4079,9 @@ node-notifier@^9.0.0: which "^2.0.2" node-releases@^2.0.36: - version "2.0.48" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.48.tgz#4da73d040ada751fc9959d993f27de48792e3b7d" - integrity sha512-1uz8041X6LoI6ZSdZacM9lVY28vuzDlSKitnpbSNK0RfKoIJkX29NBPVEFXhnuSuEOA9Ww0xnPJ+ILWbGAv8DA== + version "2.0.47" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.47.tgz#521bb2786da8eb140b748841c0b3b3a75334ffc4" + integrity sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og== nth-check@^2.0.1: version "2.1.1" @@ -4506,6 +4482,13 @@ property-information@^7.0.0: resolved "https://registry.yarnpkg.com/property-information/-/property-information-7.2.0.tgz#0809b34264e995c0bfcd3227028a1e35210af80a" integrity sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg== +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + readable-stream@~2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" @@ -4714,6 +4697,11 @@ restructure@^3.0.0: resolved "https://registry.yarnpkg.com/restructure/-/restructure-3.0.2.tgz#e6b2fad214f78edee21797fa8160fef50eb9b49a" integrity sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw== +safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -4745,14 +4733,21 @@ semver@^6.3.1: integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.3.2, semver@^7.3.4, semver@^7.6.3: - version "7.8.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.8.5.tgz#39b646037dd50c14fb451e7e4cac58ed8b863f69" - integrity sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA== + version "7.8.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.8.4.tgz#c73eceebae0616934be8dff28a7fd70757c8e696" + integrity sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA== + +serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" serialize-javascript@^7.0.3: - version "7.0.6" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-7.0.6.tgz#f2f20c8af0757e4d8fa329d0210636da0682ddef" - integrity sha512-ATTK5Q4gFVg0YDp1my2vqygyvhcklD/UV5GIlYHooGTn/NogJqIzpetkD6E5kmuVULqz/S9inUL25XcAgDRJQg== + version "7.0.5" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-7.0.5.tgz#c798cc0552ffbb08981914a42a8756e339d0d5b1" + integrity sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw== setimmediate@^1.0.5: version "1.0.5" @@ -4911,11 +4906,6 @@ svgo@^4.0.1: picocolors "^1.1.1" sax "^1.5.0" -sweetalert2@^11.26.25: - version "11.26.25" - resolved "https://registry.yarnpkg.com/sweetalert2/-/sweetalert2-11.26.25.tgz#ba24ffb79c67648ac51f834620baa15866a56e35" - integrity sha512-+hunCOJdJ6FLj04T9YSLvvZXRjsvIkTeTKP2e4VF8CaBias961BTnWiSFAy7F/CM5eq3QK2Rraoc5Gzftslvkg== - tagged-tag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/tagged-tag/-/tagged-tag-1.0.0.tgz#a0b5917c2864cba54841495abfa3f6b13edcf4d6" @@ -4997,9 +4987,9 @@ trough@^2.0.0: integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== ts-loader@^9.2.6: - version "9.6.1" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.6.1.tgz#4a5e87a24c2f9f0e6f1fee3e844e4591f2628e55" - integrity sha512-8FMHnmxtpncUAu0ZjkqpXnOTlwc9eY95esH8WVN94guTPPdkg2ofVdiVM5j8L2lmjiGerXd56zXb/D2JyVQPLg== + version "9.6.0" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.6.0.tgz#50dfdea9c63ff9c5f4e89b04c1e3ce0d5d2946a1" + integrity sha512-dsJO0S+T7grTDWTc4a0nTygXGjKncVUpx8Y+af8EvI/D5WgTJby5UEk5eoMCB9EcLQmnvitqh99MqtjtHgAwFQ== dependencies: chalk "^4.1.0" enhanced-resolve "^5.0.0" @@ -5024,10 +5014,10 @@ typescript@^6.0.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-6.0.3.tgz#90251dc007916e972786cb94d74d15b185577d21" integrity sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw== -undici-types@~8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-8.3.0.tgz#44e9fc9f3244648cdea35e4f9bb2d681e9410809" - integrity sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ== +"undici-types@>=7.24.0 <7.24.7": + version "7.24.6" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.24.6.tgz#61275b485d7fd4e9d269c7cf04ec2873c9cc0f91" + integrity sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.1"