diff --git a/.github/workflows/assets_artifact_build.yml b/.github/workflows/assets_artifact_build.yml index 447f95bf..3c7b2522 100644 --- a/.github/workflows/assets_artifact_build.yml +++ b/.github/workflows/assets_artifact_build.yml @@ -60,7 +60,7 @@ jobs: ${{ runner.os }}-yarn- - name: Setup node - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version: '20' @@ -80,13 +80,13 @@ jobs: run: zip -r /tmp/partdb_assets.zip public/build/ vendor/ - name: Upload assets artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: Only dependencies and built assets path: /tmp/partdb_assets.zip - name: Upload full artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: Full Part-DB including dependencies and built assets path: /tmp/partdb_with_assets.zip diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index c7c0965b..fee987ae 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -104,7 +104,7 @@ jobs: run: composer install --prefer-dist --no-progress - name: Setup node - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version: '20' diff --git a/assets/controllers/elements/ckeditor_controller.js b/assets/controllers/elements/ckeditor_controller.js index 46e78fd5..b7c87dab 100644 --- a/assets/controllers/elements/ckeditor_controller.js +++ b/assets/controllers/elements/ckeditor_controller.js @@ -106,6 +106,15 @@ export default class extends Controller { editor_div.classList.add(...new_classes.split(",")); } + // Automatic synchronization of source input + editor.model.document.on("change:data", () => { + editor.updateSourceElement(); + + // Dispatch the input event for further treatment + const event = new Event("input"); + this.element.dispatchEvent(event); + }); + //This return is important! Otherwise we get mysterious errors in the console //See: https://github.com/ckeditor/ckeditor5/issues/5897#issuecomment-628471302 return editor; diff --git a/assets/controllers/elements/ipn_suggestion_controller.js b/assets/controllers/elements/ipn_suggestion_controller.js new file mode 100644 index 00000000..c8b543cb --- /dev/null +++ b/assets/controllers/elements/ipn_suggestion_controller.js @@ -0,0 +1,250 @@ +import { Controller } from "@hotwired/stimulus"; +import "../../css/components/autocomplete_bootstrap_theme.css"; + +export default class extends Controller { + static targets = ["input"]; + static values = { + partId: Number, + partCategoryId: Number, + partDescription: String, + suggestions: Object, + commonSectionHeader: String, // Dynamic header for common Prefixes + partIncrementHeader: String, // Dynamic header for new possible part increment + suggestUrl: String, + }; + + connect() { + this.configureAutocomplete(); + this.watchCategoryChanges(); + this.watchDescriptionChanges(); + } + + templates = { + commonSectionHeader({ title, html }) { + return html` +
+
+ ${title} +
+
+
+ `; + }, + partIncrementHeader({ title, html }) { + return html` +
+
+ ${title} +
+
+
+ `; + }, + list({ html }) { + return html` + + `; + }, + item({ suggestion, description, html }) { + return html` +
  • +
    +
    +
    + + + +
    +
    +
    ${suggestion}
    +
    ${description}
    +
    +
    +
    +
  • + `; + }, + }; + + configureAutocomplete() { + const inputField = this.inputTarget; + const commonPrefixes = this.suggestionsValue.commonPrefixes || []; + const prefixesPartIncrement = this.suggestionsValue.prefixesPartIncrement || []; + const commonHeader = this.commonSectionHeaderValue; + const partIncrementHeader = this.partIncrementHeaderValue; + + if (!inputField || (!commonPrefixes.length && !prefixesPartIncrement.length)) return; + + // Check whether the panel should be created at the update + if (this.isPanelInitialized) { + const existingPanel = inputField.parentNode.querySelector(".aa-Panel"); + if (existingPanel) { + // Only remove the panel in the update phase + + existingPanel.remove(); + } + } + + // Create panel + const panel = document.createElement("div"); + panel.classList.add("aa-Panel"); + panel.style.display = "none"; + + // Create panel layout + const panelLayout = document.createElement("div"); + panelLayout.classList.add("aa-PanelLayout", "aa-Panel--scrollable"); + + // Section for prefixes part increment + if (prefixesPartIncrement.length) { + const partIncrementSection = document.createElement("section"); + partIncrementSection.classList.add("aa-Source"); + + const partIncrementHeaderHtml = this.templates.partIncrementHeader({ + title: partIncrementHeader, + html: String.raw, + }); + partIncrementSection.innerHTML += partIncrementHeaderHtml; + + const partIncrementList = document.createElement("ul"); + partIncrementList.classList.add("aa-List"); + partIncrementList.setAttribute("role", "listbox"); + + prefixesPartIncrement.forEach((prefix) => { + const itemHTML = this.templates.item({ + suggestion: prefix.title, + description: prefix.description, + html: String.raw, + }); + partIncrementList.innerHTML += itemHTML; + }); + + partIncrementSection.appendChild(partIncrementList); + panelLayout.appendChild(partIncrementSection); + } + + // Section for common prefixes + if (commonPrefixes.length) { + const commonSection = document.createElement("section"); + commonSection.classList.add("aa-Source"); + + const commonSectionHeader = this.templates.commonSectionHeader({ + title: commonHeader, + html: String.raw, + }); + commonSection.innerHTML += commonSectionHeader; + + const commonList = document.createElement("ul"); + commonList.classList.add("aa-List"); + commonList.setAttribute("role", "listbox"); + + commonPrefixes.forEach((prefix) => { + const itemHTML = this.templates.item({ + suggestion: prefix.title, + description: prefix.description, + html: String.raw, + }); + commonList.innerHTML += itemHTML; + }); + + commonSection.appendChild(commonList); + panelLayout.appendChild(commonSection); + } + + panel.appendChild(panelLayout); + inputField.parentNode.appendChild(panel); + + inputField.addEventListener("focus", () => { + panel.style.display = "block"; + }); + + inputField.addEventListener("blur", () => { + setTimeout(() => { + panel.style.display = "none"; + }, 100); + }); + + // Selection of an item + panelLayout.addEventListener("mousedown", (event) => { + const target = event.target.closest("li"); + + if (target) { + inputField.value = target.dataset.suggestion; + panel.style.display = "none"; + } + }); + + this.isPanelInitialized = true; + }; + + watchCategoryChanges() { + const categoryField = document.querySelector('[data-ipn-suggestion="categoryField"]'); + const descriptionField = document.querySelector('[data-ipn-suggestion="descriptionField"]'); + this.previousCategoryId = Number(this.partCategoryIdValue); + + if (categoryField) { + categoryField.addEventListener("change", () => { + const categoryId = Number(categoryField.value); + const description = String(descriptionField?.value ?? ''); + + // Check whether the category has changed compared to the previous ID + if (categoryId !== this.previousCategoryId) { + this.fetchNewSuggestions(categoryId, description); + this.previousCategoryId = categoryId; + } + }); + } + } + + watchDescriptionChanges() { + const categoryField = document.querySelector('[data-ipn-suggestion="categoryField"]'); + const descriptionField = document.querySelector('[data-ipn-suggestion="descriptionField"]'); + this.previousDescription = String(this.partDescriptionValue); + + if (descriptionField) { + descriptionField.addEventListener("input", () => { + const categoryId = Number(categoryField.value); + const description = String(descriptionField?.value ?? ''); + + // Check whether the description has changed compared to the previous one + if (description !== this.previousDescription) { + this.fetchNewSuggestions(categoryId, description); + this.previousDescription = description; + } + }); + } + } + + fetchNewSuggestions(categoryId, description) { + const baseUrl = this.suggestUrlValue; + const partId = this.partIdValue; + const truncatedDescription = description.length > 150 ? description.substring(0, 150) : description; + const encodedDescription = this.base64EncodeUtf8(truncatedDescription); + const url = `${baseUrl}?partId=${partId}&categoryId=${categoryId}` + (description !== '' ? `&description=${encodedDescription}` : ''); + + fetch(url, { + method: "GET", + headers: { + "Content-Type": "application/json", + "Accept": "application/json", + }, + }) + .then((response) => { + if (!response.ok) { + throw new Error(`Error when calling up the IPN-suggestions: ${response.status}`); + } + return response.json(); + }) + .then((data) => { + this.suggestionsValue = data; + this.configureAutocomplete(); + }) + .catch((error) => { + console.error("Errors when loading the new IPN-suggestions:", error); + }); + }; + + base64EncodeUtf8(text) { + const utf8Bytes = new TextEncoder().encode(text); + return btoa(String.fromCharCode(...utf8Bytes)); + }; +} diff --git a/composer.lock b/composer.lock index 72e83e0f..28b0e8ef 100644 --- a/composer.lock +++ b/composer.lock @@ -968,7 +968,7 @@ }, { "name": "api-platform/doctrine-common", - "version": "v4.2.2", + "version": "v4.2.3", "source": { "type": "git", "url": "https://github.com/api-platform/doctrine-common.git", @@ -1052,22 +1052,22 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/doctrine-common/tree/v4.2.2" + "source": "https://github.com/api-platform/doctrine-common/tree/v4.2.3" }, "time": "2025-08-27T12:34:14+00:00" }, { "name": "api-platform/doctrine-orm", - "version": "v4.2.2", + "version": "v4.2.3", "source": { "type": "git", "url": "https://github.com/api-platform/doctrine-orm.git", - "reference": "d35d97423f7b399117ee033ecc886b3ed9dc2e23" + "reference": "f30b580379ea16f6de3e27ecf8e474335af011f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/doctrine-orm/zipball/d35d97423f7b399117ee033ecc886b3ed9dc2e23", - "reference": "d35d97423f7b399117ee033ecc886b3ed9dc2e23", + "url": "https://api.github.com/repos/api-platform/doctrine-orm/zipball/f30b580379ea16f6de3e27ecf8e474335af011f9", + "reference": "f30b580379ea16f6de3e27ecf8e474335af011f9", "shasum": "" }, "require": { @@ -1139,13 +1139,13 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/doctrine-orm/tree/v4.2.2" + "source": "https://github.com/api-platform/doctrine-orm/tree/v4.2.3" }, - "time": "2025-10-07T13:54:25+00:00" + "time": "2025-10-31T11:51:24+00:00" }, { "name": "api-platform/documentation", - "version": "v4.2.2", + "version": "v4.2.3", "source": { "type": "git", "url": "https://github.com/api-platform/documentation.git", @@ -1202,13 +1202,13 @@ ], "description": "API Platform documentation controller.", "support": { - "source": "https://github.com/api-platform/documentation/tree/v4.2.2" + "source": "https://github.com/api-platform/documentation/tree/v4.2.3" }, "time": "2025-08-19T08:04:29+00:00" }, { "name": "api-platform/http-cache", - "version": "v4.2.2", + "version": "v4.2.3", "source": { "type": "git", "url": "https://github.com/api-platform/http-cache.git", @@ -1282,22 +1282,22 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/http-cache/tree/v4.2.2" + "source": "https://github.com/api-platform/http-cache/tree/v4.2.3" }, "time": "2025-09-16T12:51:08+00:00" }, { "name": "api-platform/hydra", - "version": "v4.2.2", + "version": "v4.2.3", "source": { "type": "git", "url": "https://github.com/api-platform/hydra.git", - "reference": "bfbe928e6a3999433ef11afc267e591152b17cc3" + "reference": "3ffe1232babfbba29ffbf52af1080aef5a015c65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/hydra/zipball/bfbe928e6a3999433ef11afc267e591152b17cc3", - "reference": "bfbe928e6a3999433ef11afc267e591152b17cc3", + "url": "https://api.github.com/repos/api-platform/hydra/zipball/3ffe1232babfbba29ffbf52af1080aef5a015c65", + "reference": "3ffe1232babfbba29ffbf52af1080aef5a015c65", "shasum": "" }, "require": { @@ -1369,13 +1369,13 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/hydra/tree/v4.2.2" + "source": "https://github.com/api-platform/hydra/tree/v4.2.3" }, - "time": "2025-10-07T13:39:38+00:00" + "time": "2025-10-24T09:59:50+00:00" }, { "name": "api-platform/json-api", - "version": "v4.2.2", + "version": "v4.2.3", "source": { "type": "git", "url": "https://github.com/api-platform/json-api.git", @@ -1451,22 +1451,22 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/json-api/tree/v4.2.2" + "source": "https://github.com/api-platform/json-api/tree/v4.2.3" }, "time": "2025-09-16T12:49:22+00:00" }, { "name": "api-platform/json-schema", - "version": "v4.2.2", + "version": "v4.2.3", "source": { "type": "git", "url": "https://github.com/api-platform/json-schema.git", - "reference": "ec81bdd09375067d7d2555c10ec3dfc697874327" + "reference": "aa8fe10d527e0ecb946ee4b873cfa97e02fb13c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/json-schema/zipball/ec81bdd09375067d7d2555c10ec3dfc697874327", - "reference": "ec81bdd09375067d7d2555c10ec3dfc697874327", + "url": "https://api.github.com/repos/api-platform/json-schema/zipball/aa8fe10d527e0ecb946ee4b873cfa97e02fb13c3", + "reference": "aa8fe10d527e0ecb946ee4b873cfa97e02fb13c3", "shasum": "" }, "require": { @@ -1532,13 +1532,13 @@ "swagger" ], "support": { - "source": "https://github.com/api-platform/json-schema/tree/v4.2.2" + "source": "https://github.com/api-platform/json-schema/tree/v4.2.3" }, - "time": "2025-10-07T09:45:59+00:00" + "time": "2025-10-31T08:51:19+00:00" }, { "name": "api-platform/jsonld", - "version": "v4.2.2", + "version": "v4.2.3", "source": { "type": "git", "url": "https://github.com/api-platform/jsonld.git", @@ -1612,22 +1612,22 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/jsonld/tree/v4.2.2" + "source": "https://github.com/api-platform/jsonld/tree/v4.2.3" }, "time": "2025-09-25T19:30:56+00:00" }, { "name": "api-platform/metadata", - "version": "v4.2.2", + "version": "v4.2.3", "source": { "type": "git", "url": "https://github.com/api-platform/metadata.git", - "reference": "5aeba910cb6352068664ca11cd9ee0dc208894c0" + "reference": "4a7676a1787b71730e1bcce83fc8987df745cb2c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/metadata/zipball/5aeba910cb6352068664ca11cd9ee0dc208894c0", - "reference": "5aeba910cb6352068664ca11cd9ee0dc208894c0", + "url": "https://api.github.com/repos/api-platform/metadata/zipball/4a7676a1787b71730e1bcce83fc8987df745cb2c", + "reference": "4a7676a1787b71730e1bcce83fc8987df745cb2c", "shasum": "" }, "require": { @@ -1710,13 +1710,13 @@ "swagger" ], "support": { - "source": "https://github.com/api-platform/metadata/tree/v4.2.2" + "source": "https://github.com/api-platform/metadata/tree/v4.2.3" }, - "time": "2025-10-08T08:36:37+00:00" + "time": "2025-10-31T08:55:46+00:00" }, { "name": "api-platform/openapi", - "version": "v4.2.2", + "version": "v4.2.3", "source": { "type": "git", "url": "https://github.com/api-platform/openapi.git", @@ -1800,22 +1800,22 @@ "swagger" ], "support": { - "source": "https://github.com/api-platform/openapi/tree/v4.2.2" + "source": "https://github.com/api-platform/openapi/tree/v4.2.3" }, "time": "2025-09-30T12:06:50+00:00" }, { "name": "api-platform/serializer", - "version": "v4.2.2", + "version": "v4.2.3", "source": { "type": "git", "url": "https://github.com/api-platform/serializer.git", - "reference": "58c1378af6429049ee62951b838f6b645706c3a3" + "reference": "50255df8751ffa81aea0eb0455bd248e9c8c2aa7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/serializer/zipball/58c1378af6429049ee62951b838f6b645706c3a3", - "reference": "58c1378af6429049ee62951b838f6b645706c3a3", + "url": "https://api.github.com/repos/api-platform/serializer/zipball/50255df8751ffa81aea0eb0455bd248e9c8c2aa7", + "reference": "50255df8751ffa81aea0eb0455bd248e9c8c2aa7", "shasum": "" }, "require": { @@ -1893,22 +1893,22 @@ "serializer" ], "support": { - "source": "https://github.com/api-platform/serializer/tree/v4.2.2" + "source": "https://github.com/api-platform/serializer/tree/v4.2.3" }, - "time": "2025-10-03T08:13:34+00:00" + "time": "2025-10-31T14:00:01+00:00" }, { "name": "api-platform/state", - "version": "v4.2.2", + "version": "v4.2.3", "source": { "type": "git", "url": "https://github.com/api-platform/state.git", - "reference": "7dc3dfbafa4627cc789bd8bcd4da46e6c37f6b26" + "reference": "5a74ea2ca36d0651bf637b0da6c10db4383172bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/state/zipball/7dc3dfbafa4627cc789bd8bcd4da46e6c37f6b26", - "reference": "7dc3dfbafa4627cc789bd8bcd4da46e6c37f6b26", + "url": "https://api.github.com/repos/api-platform/state/zipball/5a74ea2ca36d0651bf637b0da6c10db4383172bf", + "reference": "5a74ea2ca36d0651bf637b0da6c10db4383172bf", "shasum": "" }, "require": { @@ -1989,22 +1989,22 @@ "swagger" ], "support": { - "source": "https://github.com/api-platform/state/tree/v4.2.2" + "source": "https://github.com/api-platform/state/tree/v4.2.3" }, - "time": "2025-10-09T08:33:56+00:00" + "time": "2025-10-31T10:04:25+00:00" }, { "name": "api-platform/symfony", - "version": "v4.2.2", + "version": "v4.2.3", "source": { "type": "git", "url": "https://github.com/api-platform/symfony.git", - "reference": "44bb117df1cd5695203ec6a97999cabc85257780" + "reference": "a07233f9a1cb20dcb141056ac767c28c62c74269" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/symfony/zipball/44bb117df1cd5695203ec6a97999cabc85257780", - "reference": "44bb117df1cd5695203ec6a97999cabc85257780", + "url": "https://api.github.com/repos/api-platform/symfony/zipball/a07233f9a1cb20dcb141056ac767c28c62c74269", + "reference": "a07233f9a1cb20dcb141056ac767c28c62c74269", "shasum": "" }, "require": { @@ -2019,6 +2019,7 @@ "api-platform/state": "^4.2@beta", "api-platform/validator": "^4.1.11", "php": ">=8.2", + "symfony/asset": "^6.4 || ^7.0", "symfony/finder": "^6.4 || ^7.0", "symfony/property-access": "^6.4 || ^7.0", "symfony/property-info": "^6.4 || ^7.1", @@ -2118,22 +2119,22 @@ "symfony" ], "support": { - "source": "https://github.com/api-platform/symfony/tree/v4.2.2" + "source": "https://github.com/api-platform/symfony/tree/v4.2.3" }, - "time": "2025-10-09T08:33:56+00:00" + "time": "2025-10-31T08:55:46+00:00" }, { "name": "api-platform/validator", - "version": "v4.2.2", + "version": "v4.2.3", "source": { "type": "git", "url": "https://github.com/api-platform/validator.git", - "reference": "9986e84b27e3de7f87c7c23f238430a572f87f67" + "reference": "bb8697d3676f9034865dfbf96df9e55734aecad5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/validator/zipball/9986e84b27e3de7f87c7c23f238430a572f87f67", - "reference": "9986e84b27e3de7f87c7c23f238430a572f87f67", + "url": "https://api.github.com/repos/api-platform/validator/zipball/bb8697d3676f9034865dfbf96df9e55734aecad5", + "reference": "bb8697d3676f9034865dfbf96df9e55734aecad5", "shasum": "" }, "require": { @@ -2194,9 +2195,9 @@ "validator" ], "support": { - "source": "https://github.com/api-platform/validator/tree/v4.2.2" + "source": "https://github.com/api-platform/validator/tree/v4.2.3" }, - "time": "2025-09-29T15:36:04+00:00" + "time": "2025-10-31T11:51:24+00:00" }, { "name": "beberlei/assert", @@ -2732,16 +2733,16 @@ }, { "name": "doctrine/collections", - "version": "2.3.0", + "version": "2.4.0", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "2eb07e5953eed811ce1b309a7478a3b236f2273d" + "reference": "9acfeea2e8666536edff3d77c531261c63680160" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/2eb07e5953eed811ce1b309a7478a3b236f2273d", - "reference": "2eb07e5953eed811ce1b309a7478a3b236f2273d", + "url": "https://api.github.com/repos/doctrine/collections/zipball/9acfeea2e8666536edff3d77c531261c63680160", + "reference": "9acfeea2e8666536edff3d77c531261c63680160", "shasum": "" }, "require": { @@ -2750,11 +2751,11 @@ "symfony/polyfill-php84": "^1.30" }, "require-dev": { - "doctrine/coding-standard": "^12", + "doctrine/coding-standard": "^14", "ext-json": "*", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^10.5" + "phpstan/phpstan": "^2.1.30", + "phpstan/phpstan-phpunit": "^2.0.7", + "phpunit/phpunit": "^10.5.58 || ^11.5.42 || ^12.4" }, "type": "library", "autoload": { @@ -2798,7 +2799,7 @@ ], "support": { "issues": "https://github.com/doctrine/collections/issues", - "source": "https://github.com/doctrine/collections/tree/2.3.0" + "source": "https://github.com/doctrine/collections/tree/2.4.0" }, "funding": [ { @@ -2814,7 +2815,7 @@ "type": "tidelift" } ], - "time": "2025-03-22T10:17:19+00:00" + "time": "2025-10-25T09:18:13+00:00" }, { "name": "doctrine/common", @@ -3783,16 +3784,16 @@ }, { "name": "doctrine/orm", - "version": "3.5.2", + "version": "3.5.3", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "5a541b8b3a327ab1ea5f93b1615b4ff67a34e109" + "reference": "1220edf9535303feb6dbfcf171beeef842fc9e1c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/5a541b8b3a327ab1ea5f93b1615b4ff67a34e109", - "reference": "5a541b8b3a327ab1ea5f93b1615b4ff67a34e109", + "url": "https://api.github.com/repos/doctrine/orm/zipball/1220edf9535303feb6dbfcf171beeef842fc9e1c", + "reference": "1220edf9535303feb6dbfcf171beeef842fc9e1c", "shasum": "" }, "require": { @@ -3812,15 +3813,14 @@ "symfony/var-exporter": "^6.3.9 || ^7.0" }, "require-dev": { - "doctrine/coding-standard": "^13.0", + "doctrine/coding-standard": "^14.0", "phpbench/phpbench": "^1.0", "phpdocumentor/guides-cli": "^1.4", "phpstan/extension-installer": "^1.4", - "phpstan/phpstan": "2.0.3", + "phpstan/phpstan": "2.1.22", "phpstan/phpstan-deprecation-rules": "^2", - "phpunit/phpunit": "^10.4.0", + "phpunit/phpunit": "^10.5.0 || ^11.5", "psr/log": "^1 || ^2 || ^3", - "squizlabs/php_codesniffer": "3.12.0", "symfony/cache": "^5.4 || ^6.2 || ^7.0" }, "suggest": { @@ -3867,9 +3867,9 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/3.5.2" + "source": "https://github.com/doctrine/orm/tree/3.5.3" }, - "time": "2025-08-08T17:00:40+00:00" + "time": "2025-10-27T22:06:52+00:00" }, { "name": "doctrine/persistence", @@ -3966,26 +3966,26 @@ }, { "name": "doctrine/sql-formatter", - "version": "1.5.2", + "version": "1.5.3", "source": { "type": "git", "url": "https://github.com/doctrine/sql-formatter.git", - "reference": "d6d00aba6fd2957fe5216fe2b7673e9985db20c8" + "reference": "a8af23a8e9d622505baa2997465782cbe8bb7fc7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/d6d00aba6fd2957fe5216fe2b7673e9985db20c8", - "reference": "d6d00aba6fd2957fe5216fe2b7673e9985db20c8", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/a8af23a8e9d622505baa2997465782cbe8bb7fc7", + "reference": "a8af23a8e9d622505baa2997465782cbe8bb7fc7", "shasum": "" }, "require": { "php": "^8.1" }, "require-dev": { - "doctrine/coding-standard": "^12", - "ergebnis/phpunit-slow-test-detector": "^2.14", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.5" + "doctrine/coding-standard": "^14", + "ergebnis/phpunit-slow-test-detector": "^2.20", + "phpstan/phpstan": "^2.1.31", + "phpunit/phpunit": "^10.5.58" }, "bin": [ "bin/sql-formatter" @@ -4015,22 +4015,22 @@ ], "support": { "issues": "https://github.com/doctrine/sql-formatter/issues", - "source": "https://github.com/doctrine/sql-formatter/tree/1.5.2" + "source": "https://github.com/doctrine/sql-formatter/tree/1.5.3" }, - "time": "2025-01-24T11:45:48+00:00" + "time": "2025-10-26T09:35:14+00:00" }, { "name": "dompdf/dompdf", - "version": "v3.1.3", + "version": "v3.1.4", "source": { "type": "git", "url": "https://github.com/dompdf/dompdf.git", - "reference": "baed300e4fb8226359c04395518059a136e2a2e2" + "reference": "db712c90c5b9868df3600e64e68da62e78a34623" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dompdf/dompdf/zipball/baed300e4fb8226359c04395518059a136e2a2e2", - "reference": "baed300e4fb8226359c04395518059a136e2a2e2", + "url": "https://api.github.com/repos/dompdf/dompdf/zipball/db712c90c5b9868df3600e64e68da62e78a34623", + "reference": "db712c90c5b9868df3600e64e68da62e78a34623", "shasum": "" }, "require": { @@ -4079,9 +4079,9 @@ "homepage": "https://github.com/dompdf/dompdf", "support": { "issues": "https://github.com/dompdf/dompdf/issues", - "source": "https://github.com/dompdf/dompdf/tree/v3.1.3" + "source": "https://github.com/dompdf/dompdf/tree/v3.1.4" }, - "time": "2025-10-14T13:10:17+00:00" + "time": "2025-10-29T12:43:30+00:00" }, { "name": "dompdf/php-font-lib", @@ -5765,16 +5765,16 @@ }, { "name": "league/csv", - "version": "9.27.0", + "version": "9.27.1", "source": { "type": "git", "url": "https://github.com/thephpleague/csv.git", - "reference": "cb491b1ba3c42ff2bcd0113814f4256b42bae845" + "reference": "26de738b8fccf785397d05ee2fc07b6cd8749797" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/csv/zipball/cb491b1ba3c42ff2bcd0113814f4256b42bae845", - "reference": "cb491b1ba3c42ff2bcd0113814f4256b42bae845", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/26de738b8fccf785397d05ee2fc07b6cd8749797", + "reference": "26de738b8fccf785397d05ee2fc07b6cd8749797", "shasum": "" }, "require": { @@ -5852,7 +5852,7 @@ "type": "github" } ], - "time": "2025-10-16T08:22:09+00:00" + "time": "2025-10-25T08:35:20+00:00" }, { "name": "league/html-to-markdown", @@ -6977,25 +6977,28 @@ }, { "name": "nelmio/cors-bundle", - "version": "2.5.0", + "version": "2.6.0", "source": { "type": "git", "url": "https://github.com/nelmio/NelmioCorsBundle.git", - "reference": "3a526fe025cd20e04a6a11370cf5ab28dbb5a544" + "reference": "530217472204881cacd3671909f634b960c7b948" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nelmio/NelmioCorsBundle/zipball/3a526fe025cd20e04a6a11370cf5ab28dbb5a544", - "reference": "3a526fe025cd20e04a6a11370cf5ab28dbb5a544", + "url": "https://api.github.com/repos/nelmio/NelmioCorsBundle/zipball/530217472204881cacd3671909f634b960c7b948", + "reference": "530217472204881cacd3671909f634b960c7b948", "shasum": "" }, "require": { "psr/log": "^1.0 || ^2.0 || ^3.0", - "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0" + "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0 || ^8.0" }, "require-dev": { - "mockery/mockery": "^1.3.6", - "symfony/phpunit-bridge": "^5.4 || ^6.0 || ^7.0" + "phpstan/phpstan": "^1.11.5", + "phpstan/phpstan-deprecation-rules": "^1.2.0", + "phpstan/phpstan-phpunit": "^1.4", + "phpstan/phpstan-symfony": "^1.4.4", + "phpunit/phpunit": "^8" }, "type": "symfony-bundle", "extra": { @@ -7033,9 +7036,9 @@ ], "support": { "issues": "https://github.com/nelmio/NelmioCorsBundle/issues", - "source": "https://github.com/nelmio/NelmioCorsBundle/tree/2.5.0" + "source": "https://github.com/nelmio/NelmioCorsBundle/tree/2.6.0" }, - "time": "2024-06-24T21:25:28+00:00" + "time": "2025-10-23T06:57:22+00:00" }, { "name": "nelmio/security-bundle", @@ -7113,25 +7116,25 @@ }, { "name": "nette/schema", - "version": "v1.3.2", + "version": "v1.3.3", "source": { "type": "git", "url": "https://github.com/nette/schema.git", - "reference": "da801d52f0354f70a638673c4a0f04e16529431d" + "reference": "2befc2f42d7c715fd9d95efc31b1081e5d765004" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/da801d52f0354f70a638673c4a0f04e16529431d", - "reference": "da801d52f0354f70a638673c4a0f04e16529431d", + "url": "https://api.github.com/repos/nette/schema/zipball/2befc2f42d7c715fd9d95efc31b1081e5d765004", + "reference": "2befc2f42d7c715fd9d95efc31b1081e5d765004", "shasum": "" }, "require": { "nette/utils": "^4.0", - "php": "8.1 - 8.4" + "php": "8.1 - 8.5" }, "require-dev": { "nette/tester": "^2.5.2", - "phpstan/phpstan-nette": "^1.0", + "phpstan/phpstan-nette": "^2.0@stable", "tracy/tracy": "^2.8" }, "type": "library", @@ -7141,6 +7144,9 @@ } }, "autoload": { + "psr-4": { + "Nette\\": "src" + }, "classmap": [ "src/" ] @@ -7169,9 +7175,9 @@ ], "support": { "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.3.2" + "source": "https://github.com/nette/schema/tree/v1.3.3" }, - "time": "2024-10-06T23:10:23+00:00" + "time": "2025-10-30T22:57:59+00:00" }, { "name": "nette/utils", @@ -8468,16 +8474,16 @@ }, { "name": "phpoffice/phpspreadsheet", - "version": "5.1.0", + "version": "5.2.0", "source": { "type": "git", "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", - "reference": "fd26e45a814e94ae2aad0df757d9d1739c4bf2e0" + "reference": "3b8994b3aac4b61018bc04fc8c441f4fd68c18eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/fd26e45a814e94ae2aad0df757d9d1739c4bf2e0", - "reference": "fd26e45a814e94ae2aad0df757d9d1739c4bf2e0", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/3b8994b3aac4b61018bc04fc8c441f4fd68c18eb", + "reference": "3b8994b3aac4b61018bc04fc8c441f4fd68c18eb", "shasum": "" }, "require": { @@ -8507,7 +8513,7 @@ "dealerdirect/phpcodesniffer-composer-installer": "dev-main", "dompdf/dompdf": "^2.0 || ^3.0", "friendsofphp/php-cs-fixer": "^3.2", - "mitoteam/jpgraph": "^10.3", + "mitoteam/jpgraph": "^10.5", "mpdf/mpdf": "^8.1.1", "phpcompatibility/php-compatibility": "^9.3", "phpstan/phpstan": "^1.1 || ^2.0", @@ -8519,7 +8525,7 @@ }, "suggest": { "dompdf/dompdf": "Option for rendering PDF with PDF Writer", - "ext-intl": "PHP Internationalization Functions", + "ext-intl": "PHP Internationalization Functions, regquired for NumberFormat Wizard", "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", "mpdf/mpdf": "Option for rendering PDF with PDF Writer", "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer" @@ -8568,9 +8574,9 @@ ], "support": { "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", - "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/5.1.0" + "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/5.2.0" }, - "time": "2025-09-04T05:34:49+00:00" + "time": "2025-10-26T15:54:22+00:00" }, { "name": "phpstan/phpdoc-parser", @@ -9481,16 +9487,16 @@ }, { "name": "s9e/text-formatter", - "version": "2.19.0", + "version": "2.19.1", "source": { "type": "git", "url": "https://github.com/s9e/TextFormatter.git", - "reference": "d65a4f61cbe494937afb3150dc73b6e757d400d3" + "reference": "47c8324f370cc23e72190f00a4ffb18f50516452" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/s9e/TextFormatter/zipball/d65a4f61cbe494937afb3150dc73b6e757d400d3", - "reference": "d65a4f61cbe494937afb3150dc73b6e757d400d3", + "url": "https://api.github.com/repos/s9e/TextFormatter/zipball/47c8324f370cc23e72190f00a4ffb18f50516452", + "reference": "47c8324f370cc23e72190f00a4ffb18f50516452", "shasum": "" }, "require": { @@ -9518,7 +9524,7 @@ }, "type": "library", "extra": { - "version": "2.19.0" + "version": "2.19.1" }, "autoload": { "psr-4": { @@ -9550,9 +9556,9 @@ ], "support": { "issues": "https://github.com/s9e/TextFormatter/issues", - "source": "https://github.com/s9e/TextFormatter/tree/2.19.0" + "source": "https://github.com/s9e/TextFormatter/tree/2.19.1" }, - "time": "2025-04-26T09:27:34+00:00" + "time": "2025-10-26T07:38:53+00:00" }, { "name": "sabberworm/php-css-parser", @@ -10128,20 +10134,20 @@ }, { "name": "spomky-labs/pki-framework", - "version": "1.3.0", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/Spomky-Labs/pki-framework.git", - "reference": "eced5b5ce70518b983ff2be486e902bbd15135ae" + "reference": "bf6f55a9d9eb25b7781640221cb54f5c727850d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Spomky-Labs/pki-framework/zipball/eced5b5ce70518b983ff2be486e902bbd15135ae", - "reference": "eced5b5ce70518b983ff2be486e902bbd15135ae", + "url": "https://api.github.com/repos/Spomky-Labs/pki-framework/zipball/bf6f55a9d9eb25b7781640221cb54f5c727850d7", + "reference": "bf6f55a9d9eb25b7781640221cb54f5c727850d7", "shasum": "" }, "require": { - "brick/math": "^0.10|^0.11|^0.12|^0.13", + "brick/math": "^0.10|^0.11|^0.12|^0.13|^0.14", "ext-mbstring": "*", "php": ">=8.1" }, @@ -10149,7 +10155,7 @@ "ekino/phpstan-banned-code": "^1.0|^2.0|^3.0", "ext-gmp": "*", "ext-openssl": "*", - "infection/infection": "^0.28|^0.29", + "infection/infection": "^0.28|^0.29|^0.31", "php-parallel-lint/php-parallel-lint": "^1.3", "phpstan/extension-installer": "^1.3|^2.0", "phpstan/phpstan": "^1.8|^2.0", @@ -10159,8 +10165,8 @@ "phpunit/phpunit": "^10.1|^11.0|^12.0", "rector/rector": "^1.0|^2.0", "roave/security-advisories": "dev-latest", - "symfony/string": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0", + "symfony/string": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0", "symplify/easy-coding-standard": "^12.0" }, "suggest": { @@ -10221,7 +10227,7 @@ ], "support": { "issues": "https://github.com/Spomky-Labs/pki-framework/issues", - "source": "https://github.com/Spomky-Labs/pki-framework/tree/1.3.0" + "source": "https://github.com/Spomky-Labs/pki-framework/tree/1.4.0" }, "funding": [ { @@ -10233,7 +10239,7 @@ "type": "patreon" } ], - "time": "2025-06-13T08:35:04+00:00" + "time": "2025-10-22T08:24:34+00:00" }, { "name": "symfony/apache-pack", @@ -10332,16 +10338,16 @@ }, { "name": "symfony/cache", - "version": "v7.3.4", + "version": "v7.3.5", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "bf8afc8ffd4bfd3d9c373e417f041d9f1e5b863f" + "reference": "4a55feb59664f49042a0824c0f955e2f4c1412ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/bf8afc8ffd4bfd3d9c373e417f041d9f1e5b863f", - "reference": "bf8afc8ffd4bfd3d9c373e417f041d9f1e5b863f", + "url": "https://api.github.com/repos/symfony/cache/zipball/4a55feb59664f49042a0824c0f955e2f4c1412ad", + "reference": "4a55feb59664f49042a0824c0f955e2f4c1412ad", "shasum": "" }, "require": { @@ -10410,7 +10416,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v7.3.4" + "source": "https://github.com/symfony/cache/tree/v7.3.5" }, "funding": [ { @@ -10430,7 +10436,7 @@ "type": "tidelift" } ], - "time": "2025-09-11T10:12:26+00:00" + "time": "2025-10-16T13:55:38+00:00" }, { "name": "symfony/cache-contracts", @@ -10663,16 +10669,16 @@ }, { "name": "symfony/console", - "version": "v7.3.4", + "version": "v7.3.5", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "2b9c5fafbac0399a20a2e82429e2bd735dcfb7db" + "reference": "cdb80fa5869653c83cfe1a9084a673b6daf57ea7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/2b9c5fafbac0399a20a2e82429e2bd735dcfb7db", - "reference": "2b9c5fafbac0399a20a2e82429e2bd735dcfb7db", + "url": "https://api.github.com/repos/symfony/console/zipball/cdb80fa5869653c83cfe1a9084a673b6daf57ea7", + "reference": "cdb80fa5869653c83cfe1a9084a673b6daf57ea7", "shasum": "" }, "require": { @@ -10737,7 +10743,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.3.4" + "source": "https://github.com/symfony/console/tree/v7.3.5" }, "funding": [ { @@ -10757,7 +10763,7 @@ "type": "tidelift" } ], - "time": "2025-09-22T15:31:00+00:00" + "time": "2025-10-14T15:46:26+00:00" }, { "name": "symfony/css-selector", @@ -10977,16 +10983,16 @@ }, { "name": "symfony/doctrine-bridge", - "version": "v7.3.4", + "version": "v7.3.5", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "21cd48c34a47a0d0e303a590a67c3450fde55888" + "reference": "e7d308bd44ff8673a259e2727d13af6a93a5d83e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/21cd48c34a47a0d0e303a590a67c3450fde55888", - "reference": "21cd48c34a47a0d0e303a590a67c3450fde55888", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/e7d308bd44ff8673a259e2727d13af6a93a5d83e", + "reference": "e7d308bd44ff8673a259e2727d13af6a93a5d83e", "shasum": "" }, "require": { @@ -11066,7 +11072,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v7.3.4" + "source": "https://github.com/symfony/doctrine-bridge/tree/v7.3.5" }, "funding": [ { @@ -11086,7 +11092,7 @@ "type": "tidelift" } ], - "time": "2025-09-24T09:56:23+00:00" + "time": "2025-09-27T09:00:46+00:00" }, { "name": "symfony/dom-crawler", @@ -11618,16 +11624,16 @@ }, { "name": "symfony/finder", - "version": "v7.3.2", + "version": "v7.3.5", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe" + "reference": "9f696d2f1e340484b4683f7853b273abff94421f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/2a6614966ba1074fa93dae0bc804227422df4dfe", - "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe", + "url": "https://api.github.com/repos/symfony/finder/zipball/9f696d2f1e340484b4683f7853b273abff94421f", + "reference": "9f696d2f1e340484b4683f7853b273abff94421f", "shasum": "" }, "require": { @@ -11662,7 +11668,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.3.2" + "source": "https://github.com/symfony/finder/tree/v7.3.5" }, "funding": [ { @@ -11682,35 +11688,35 @@ "type": "tidelift" } ], - "time": "2025-07-15T13:41:35+00:00" + "time": "2025-10-15T18:45:57+00:00" }, { "name": "symfony/flex", - "version": "v2.8.2", + "version": "v2.9.0", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "f356aa35f3cf3d2f46c31d344c1098eb2d260426" + "reference": "94b37978c9982dc41c5b6a4147892d2d3d1b9ce6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/f356aa35f3cf3d2f46c31d344c1098eb2d260426", - "reference": "f356aa35f3cf3d2f46c31d344c1098eb2d260426", + "url": "https://api.github.com/repos/symfony/flex/zipball/94b37978c9982dc41c5b6a4147892d2d3d1b9ce6", + "reference": "94b37978c9982dc41c5b6a4147892d2d3d1b9ce6", "shasum": "" }, "require": { "composer-plugin-api": "^2.1", - "php": ">=8.0" + "php": ">=8.1" }, "conflict": { "composer/semver": "<1.7.2" }, "require-dev": { "composer/composer": "^2.1", - "symfony/dotenv": "^5.4|^6.0", - "symfony/filesystem": "^5.4|^6.0", - "symfony/phpunit-bridge": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0" + "symfony/dotenv": "^6.4|^7.4|^8.0", + "symfony/filesystem": "^6.4|^7.4|^8.0", + "symfony/phpunit-bridge": "^6.4|^7.4|^8.0", + "symfony/process": "^6.4|^7.4|^8.0" }, "type": "composer-plugin", "extra": { @@ -11734,7 +11740,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v2.8.2" + "source": "https://github.com/symfony/flex/tree/v2.9.0" }, "funding": [ { @@ -11754,20 +11760,20 @@ "type": "tidelift" } ], - "time": "2025-08-22T07:17:23+00:00" + "time": "2025-10-31T15:22:50+00:00" }, { "name": "symfony/form", - "version": "v7.3.4", + "version": "v7.3.5", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "7b3eee0f4d4dfd1ff1be70a27474197330c61736" + "reference": "c8032766d5b198865d00b7d4471fc787a0a7f5e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/7b3eee0f4d4dfd1ff1be70a27474197330c61736", - "reference": "7b3eee0f4d4dfd1ff1be70a27474197330c61736", + "url": "https://api.github.com/repos/symfony/form/zipball/c8032766d5b198865d00b7d4471fc787a0a7f5e4", + "reference": "c8032766d5b198865d00b7d4471fc787a0a7f5e4", "shasum": "" }, "require": { @@ -11835,7 +11841,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v7.3.4" + "source": "https://github.com/symfony/form/tree/v7.3.5" }, "funding": [ { @@ -11855,20 +11861,20 @@ "type": "tidelift" } ], - "time": "2025-09-22T15:31:00+00:00" + "time": "2025-10-10T11:54:12+00:00" }, { "name": "symfony/framework-bundle", - "version": "v7.3.4", + "version": "v7.3.5", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "b13e7cec5a144c8dba6f4233a2c53c00bc29e140" + "reference": "ebd42b1fc2652b96d33520195ea0f6e55c36f09d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/b13e7cec5a144c8dba6f4233a2c53c00bc29e140", - "reference": "b13e7cec5a144c8dba6f4233a2c53c00bc29e140", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/ebd42b1fc2652b96d33520195ea0f6e55c36f09d", + "reference": "ebd42b1fc2652b96d33520195ea0f6e55c36f09d", "shasum": "" }, "require": { @@ -11993,7 +11999,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v7.3.4" + "source": "https://github.com/symfony/framework-bundle/tree/v7.3.5" }, "funding": [ { @@ -12013,7 +12019,7 @@ "type": "tidelift" } ], - "time": "2025-09-17T05:51:54+00:00" + "time": "2025-10-16T16:16:53+00:00" }, { "name": "symfony/http-client", @@ -12195,16 +12201,16 @@ }, { "name": "symfony/http-foundation", - "version": "v7.3.4", + "version": "v7.3.5", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "c061c7c18918b1b64268771aad04b40be41dd2e6" + "reference": "ce31218c7cac92eab280762c4375fb70a6f4f897" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/c061c7c18918b1b64268771aad04b40be41dd2e6", - "reference": "c061c7c18918b1b64268771aad04b40be41dd2e6", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ce31218c7cac92eab280762c4375fb70a6f4f897", + "reference": "ce31218c7cac92eab280762c4375fb70a6f4f897", "shasum": "" }, "require": { @@ -12254,7 +12260,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.3.4" + "source": "https://github.com/symfony/http-foundation/tree/v7.3.5" }, "funding": [ { @@ -12274,20 +12280,20 @@ "type": "tidelift" } ], - "time": "2025-09-16T08:38:17+00:00" + "time": "2025-10-24T21:42:11+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.3.4", + "version": "v7.3.5", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "b796dffea7821f035047235e076b60ca2446e3cf" + "reference": "24fd3f123532e26025f49f1abefcc01a69ef15ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b796dffea7821f035047235e076b60ca2446e3cf", - "reference": "b796dffea7821f035047235e076b60ca2446e3cf", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/24fd3f123532e26025f49f1abefcc01a69ef15ab", + "reference": "24fd3f123532e26025f49f1abefcc01a69ef15ab", "shasum": "" }, "require": { @@ -12372,7 +12378,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.3.4" + "source": "https://github.com/symfony/http-kernel/tree/v7.3.5" }, "funding": [ { @@ -12392,20 +12398,20 @@ "type": "tidelift" } ], - "time": "2025-09-27T12:32:17+00:00" + "time": "2025-10-28T10:19:01+00:00" }, { "name": "symfony/intl", - "version": "v7.3.4", + "version": "v7.3.5", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "e6db84864655885d9dac676a9d7dde0d904fda54" + "reference": "9eccaaa94ac6f9deb3620c9d47a057d965baeabf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/e6db84864655885d9dac676a9d7dde0d904fda54", - "reference": "e6db84864655885d9dac676a9d7dde0d904fda54", + "url": "https://api.github.com/repos/symfony/intl/zipball/9eccaaa94ac6f9deb3620c9d47a057d965baeabf", + "reference": "9eccaaa94ac6f9deb3620c9d47a057d965baeabf", "shasum": "" }, "require": { @@ -12462,7 +12468,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v7.3.4" + "source": "https://github.com/symfony/intl/tree/v7.3.5" }, "funding": [ { @@ -12482,20 +12488,20 @@ "type": "tidelift" } ], - "time": "2025-09-08T14:11:30+00:00" + "time": "2025-10-01T06:11:17+00:00" }, { "name": "symfony/mailer", - "version": "v7.3.4", + "version": "v7.3.5", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "ab97ef2f7acf0216955f5845484235113047a31d" + "reference": "fd497c45ba9c10c37864e19466b090dcb60a50ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/ab97ef2f7acf0216955f5845484235113047a31d", - "reference": "ab97ef2f7acf0216955f5845484235113047a31d", + "url": "https://api.github.com/repos/symfony/mailer/zipball/fd497c45ba9c10c37864e19466b090dcb60a50ba", + "reference": "fd497c45ba9c10c37864e19466b090dcb60a50ba", "shasum": "" }, "require": { @@ -12546,7 +12552,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.3.4" + "source": "https://github.com/symfony/mailer/tree/v7.3.5" }, "funding": [ { @@ -12566,7 +12572,7 @@ "type": "tidelift" } ], - "time": "2025-09-17T05:51:54+00:00" + "time": "2025-10-24T14:27:20+00:00" }, { "name": "symfony/mime", @@ -12658,16 +12664,16 @@ }, { "name": "symfony/monolog-bridge", - "version": "v7.3.4", + "version": "v7.3.5", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "7acf2abe23e5019451399ba69fc8ed3d61d4d8f0" + "reference": "c66a65049c75f3ddf03d73c8c9ed61405779ce47" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/7acf2abe23e5019451399ba69fc8ed3d61d4d8f0", - "reference": "7acf2abe23e5019451399ba69fc8ed3d61d4d8f0", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/c66a65049c75f3ddf03d73c8c9ed61405779ce47", + "reference": "c66a65049c75f3ddf03d73c8c9ed61405779ce47", "shasum": "" }, "require": { @@ -12716,7 +12722,7 @@ "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v7.3.4" + "source": "https://github.com/symfony/monolog-bridge/tree/v7.3.5" }, "funding": [ { @@ -12736,7 +12742,7 @@ "type": "tidelift" } ], - "time": "2025-09-24T16:45:39+00:00" + "time": "2025-10-14T19:16:15+00:00" }, { "name": "symfony/monolog-bundle", @@ -14026,23 +14032,23 @@ }, { "name": "symfony/property-info", - "version": "v7.3.4", + "version": "v7.3.5", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "7b6db23f23d13ada41e1cb484748a8ec028fbace" + "reference": "0b346ed259dc5da43535caf243005fe7d4b0f051" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/7b6db23f23d13ada41e1cb484748a8ec028fbace", - "reference": "7b6db23f23d13ada41e1cb484748a8ec028fbace", + "url": "https://api.github.com/repos/symfony/property-info/zipball/0b346ed259dc5da43535caf243005fe7d4b0f051", + "reference": "0b346ed259dc5da43535caf243005fe7d4b0f051", "shasum": "" }, "require": { "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/string": "^6.4|^7.0", - "symfony/type-info": "~7.2.8|^7.3.1" + "symfony/type-info": "^7.3.5" }, "conflict": { "phpdocumentor/reflection-docblock": "<5.2", @@ -14092,7 +14098,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v7.3.4" + "source": "https://github.com/symfony/property-info/tree/v7.3.5" }, "funding": [ { @@ -14112,7 +14118,7 @@ "type": "tidelift" } ], - "time": "2025-09-15T13:55:54+00:00" + "time": "2025-10-05T22:12:41+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -14551,16 +14557,16 @@ }, { "name": "symfony/security-core", - "version": "v7.3.4", + "version": "v7.3.5", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "68b9d3ca57615afde6152a1e1441fa035bea43f8" + "reference": "772a7c1eddd8bf8a977a67e6e8adc59650c604eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/68b9d3ca57615afde6152a1e1441fa035bea43f8", - "reference": "68b9d3ca57615afde6152a1e1441fa035bea43f8", + "url": "https://api.github.com/repos/symfony/security-core/zipball/772a7c1eddd8bf8a977a67e6e8adc59650c604eb", + "reference": "772a7c1eddd8bf8a977a67e6e8adc59650c604eb", "shasum": "" }, "require": { @@ -14618,7 +14624,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v7.3.4" + "source": "https://github.com/symfony/security-core/tree/v7.3.5" }, "funding": [ { @@ -14638,7 +14644,7 @@ "type": "tidelift" } ], - "time": "2025-09-24T14:32:13+00:00" + "time": "2025-10-24T14:27:20+00:00" }, { "name": "symfony/security-csrf", @@ -14712,16 +14718,16 @@ }, { "name": "symfony/security-http", - "version": "v7.3.4", + "version": "v7.3.5", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "1cf54d0648ebab23bf9b8972617b79f1995e13a9" + "reference": "e79a63fd5dec6e5b1ba31227e98d860a4f8ba95c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/1cf54d0648ebab23bf9b8972617b79f1995e13a9", - "reference": "1cf54d0648ebab23bf9b8972617b79f1995e13a9", + "url": "https://api.github.com/repos/symfony/security-http/zipball/e79a63fd5dec6e5b1ba31227e98d860a4f8ba95c", + "reference": "e79a63fd5dec6e5b1ba31227e98d860a4f8ba95c", "shasum": "" }, "require": { @@ -14780,7 +14786,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v7.3.4" + "source": "https://github.com/symfony/security-http/tree/v7.3.5" }, "funding": [ { @@ -14800,20 +14806,20 @@ "type": "tidelift" } ], - "time": "2025-09-09T17:06:44+00:00" + "time": "2025-10-13T09:30:10+00:00" }, { "name": "symfony/serializer", - "version": "v7.3.4", + "version": "v7.3.5", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "0df5af266c6fe9a855af7db4fea86e13b9ca3ab1" + "reference": "ba2e50a5f2870c93f0f47ca1a4e56e4bbe274035" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/0df5af266c6fe9a855af7db4fea86e13b9ca3ab1", - "reference": "0df5af266c6fe9a855af7db4fea86e13b9ca3ab1", + "url": "https://api.github.com/repos/symfony/serializer/zipball/ba2e50a5f2870c93f0f47ca1a4e56e4bbe274035", + "reference": "ba2e50a5f2870c93f0f47ca1a4e56e4bbe274035", "shasum": "" }, "require": { @@ -14883,7 +14889,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v7.3.4" + "source": "https://github.com/symfony/serializer/tree/v7.3.5" }, "funding": [ { @@ -14903,7 +14909,7 @@ "type": "tidelift" } ], - "time": "2025-09-15T13:39:02+00:00" + "time": "2025-10-08T11:26:21+00:00" }, { "name": "symfony/service-contracts", @@ -14990,16 +14996,16 @@ }, { "name": "symfony/stimulus-bundle", - "version": "v2.30.0", + "version": "v2.31.0", "source": { "type": "git", "url": "https://github.com/symfony/stimulus-bundle.git", - "reference": "668b9efe9d0ab8b4e50091263171609e0459c0c8" + "reference": "c5ea8ee2ccd45447b7f4b6b82f704ee5e76127f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stimulus-bundle/zipball/668b9efe9d0ab8b4e50091263171609e0459c0c8", - "reference": "668b9efe9d0ab8b4e50091263171609e0459c0c8", + "url": "https://api.github.com/repos/symfony/stimulus-bundle/zipball/c5ea8ee2ccd45447b7f4b6b82f704ee5e76127f0", + "reference": "c5ea8ee2ccd45447b7f4b6b82f704ee5e76127f0", "shasum": "" }, "require": { @@ -15039,7 +15045,7 @@ "symfony-ux" ], "support": { - "source": "https://github.com/symfony/stimulus-bundle/tree/v2.30.0" + "source": "https://github.com/symfony/stimulus-bundle/tree/v2.31.0" }, "funding": [ { @@ -15059,7 +15065,7 @@ "type": "tidelift" } ], - "time": "2025-08-27T15:25:48+00:00" + "time": "2025-09-24T13:27:42+00:00" }, { "name": "symfony/stopwatch", @@ -15596,16 +15602,16 @@ }, { "name": "symfony/type-info", - "version": "v7.3.4", + "version": "v7.3.5", "source": { "type": "git", "url": "https://github.com/symfony/type-info.git", - "reference": "d34eaeb57f39c8a9c97eb72a977c423207dfa35b" + "reference": "8b36f41421160db56914f897b57eaa6a830758b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/type-info/zipball/d34eaeb57f39c8a9c97eb72a977c423207dfa35b", - "reference": "d34eaeb57f39c8a9c97eb72a977c423207dfa35b", + "url": "https://api.github.com/repos/symfony/type-info/zipball/8b36f41421160db56914f897b57eaa6a830758b3", + "reference": "8b36f41421160db56914f897b57eaa6a830758b3", "shasum": "" }, "require": { @@ -15655,7 +15661,7 @@ "type" ], "support": { - "source": "https://github.com/symfony/type-info/tree/v7.3.4" + "source": "https://github.com/symfony/type-info/tree/v7.3.5" }, "funding": [ { @@ -15675,7 +15681,7 @@ "type": "tidelift" } ], - "time": "2025-09-11T15:33:27+00:00" + "time": "2025-10-16T12:30:12+00:00" }, { "name": "symfony/uid", @@ -15753,16 +15759,16 @@ }, { "name": "symfony/ux-translator", - "version": "v2.30.0", + "version": "v2.31.0", "source": { "type": "git", "url": "https://github.com/symfony/ux-translator.git", - "reference": "9616091db206df4caa7d8dce2e48941512b1a94a" + "reference": "b4b323fdc846d2d67feb7f8ca5ef5a05238f6639" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-translator/zipball/9616091db206df4caa7d8dce2e48941512b1a94a", - "reference": "9616091db206df4caa7d8dce2e48941512b1a94a", + "url": "https://api.github.com/repos/symfony/ux-translator/zipball/b4b323fdc846d2d67feb7f8ca5ef5a05238f6639", + "reference": "b4b323fdc846d2d67feb7f8ca5ef5a05238f6639", "shasum": "" }, "require": { @@ -15810,7 +15816,7 @@ "symfony-ux" ], "support": { - "source": "https://github.com/symfony/ux-translator/tree/v2.30.0" + "source": "https://github.com/symfony/ux-translator/tree/v2.31.0" }, "funding": [ { @@ -15830,20 +15836,20 @@ "type": "tidelift" } ], - "time": "2025-08-27T15:25:48+00:00" + "time": "2025-10-16T07:24:06+00:00" }, { "name": "symfony/ux-turbo", - "version": "v2.30.0", + "version": "v2.31.0", "source": { "type": "git", "url": "https://github.com/symfony/ux-turbo.git", - "reference": "c5e88c7e16713e84a2a35f36276ccdb05c2c78d8" + "reference": "06d5e4cf4573efe4faf648f3810a28c63684c706" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-turbo/zipball/c5e88c7e16713e84a2a35f36276ccdb05c2c78d8", - "reference": "c5e88c7e16713e84a2a35f36276ccdb05c2c78d8", + "url": "https://api.github.com/repos/symfony/ux-turbo/zipball/06d5e4cf4573efe4faf648f3810a28c63684c706", + "reference": "06d5e4cf4573efe4faf648f3810a28c63684c706", "shasum": "" }, "require": { @@ -15856,7 +15862,7 @@ "require-dev": { "dbrekelmans/bdi": "dev-main", "doctrine/doctrine-bundle": "^2.4.3", - "doctrine/orm": "^2.8 | 3.0", + "doctrine/orm": "^2.8|^3.0", "php-webdriver/webdriver": "^1.15", "phpstan/phpstan": "^2.1.17", "symfony/asset-mapper": "^6.4|^7.0|^8.0", @@ -15913,7 +15919,7 @@ "turbo-stream" ], "support": { - "source": "https://github.com/symfony/ux-turbo/tree/v2.30.0" + "source": "https://github.com/symfony/ux-turbo/tree/v2.31.0" }, "funding": [ { @@ -15933,20 +15939,20 @@ "type": "tidelift" } ], - "time": "2025-08-27T15:25:48+00:00" + "time": "2025-10-16T07:24:06+00:00" }, { "name": "symfony/validator", - "version": "v7.3.4", + "version": "v7.3.5", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "5e29a348b5fac2227b6938a54db006d673bb813a" + "reference": "724086992fb7c7882d05c9d2219d70401ab9fdda" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/5e29a348b5fac2227b6938a54db006d673bb813a", - "reference": "5e29a348b5fac2227b6938a54db006d673bb813a", + "url": "https://api.github.com/repos/symfony/validator/zipball/724086992fb7c7882d05c9d2219d70401ab9fdda", + "reference": "724086992fb7c7882d05c9d2219d70401ab9fdda", "shasum": "" }, "require": { @@ -16015,7 +16021,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v7.3.4" + "source": "https://github.com/symfony/validator/tree/v7.3.5" }, "funding": [ { @@ -16035,20 +16041,20 @@ "type": "tidelift" } ], - "time": "2025-09-24T06:32:27+00:00" + "time": "2025-10-24T14:27:20+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.3.4", + "version": "v7.3.5", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "b8abe7daf2730d07dfd4b2ee1cecbf0dd2fbdabb" + "reference": "476c4ae17f43a9a36650c69879dcf5b1e6ae724d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/b8abe7daf2730d07dfd4b2ee1cecbf0dd2fbdabb", - "reference": "b8abe7daf2730d07dfd4b2ee1cecbf0dd2fbdabb", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/476c4ae17f43a9a36650c69879dcf5b1e6ae724d", + "reference": "476c4ae17f43a9a36650c69879dcf5b1e6ae724d", "shasum": "" }, "require": { @@ -16102,7 +16108,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.3.4" + "source": "https://github.com/symfony/var-dumper/tree/v7.3.5" }, "funding": [ { @@ -16122,7 +16128,7 @@ "type": "tidelift" } ], - "time": "2025-09-11T10:12:26+00:00" + "time": "2025-09-27T09:00:46+00:00" }, { "name": "symfony/var-exporter", @@ -16366,16 +16372,16 @@ }, { "name": "symfony/yaml", - "version": "v7.3.3", + "version": "v7.3.5", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "d4f4a66866fe2451f61296924767280ab5732d9d" + "reference": "90208e2fc6f68f613eae7ca25a2458a931b1bacc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/d4f4a66866fe2451f61296924767280ab5732d9d", - "reference": "d4f4a66866fe2451f61296924767280ab5732d9d", + "url": "https://api.github.com/repos/symfony/yaml/zipball/90208e2fc6f68f613eae7ca25a2458a931b1bacc", + "reference": "90208e2fc6f68f613eae7ca25a2458a931b1bacc", "shasum": "" }, "require": { @@ -16418,7 +16424,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.3.3" + "source": "https://github.com/symfony/yaml/tree/v7.3.5" }, "funding": [ { @@ -16438,20 +16444,20 @@ "type": "tidelift" } ], - "time": "2025-08-27T11:34:33+00:00" + "time": "2025-09-27T09:00:46+00:00" }, { "name": "symplify/easy-coding-standard", - "version": "12.6.0", + "version": "12.6.2", "source": { "type": "git", "url": "https://github.com/easy-coding-standard/easy-coding-standard.git", - "reference": "781e6124dc7e14768ae999a8f5309566bbe62004" + "reference": "7a6798aa424f0ecafb1542b6f5207c5a99704d3d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/781e6124dc7e14768ae999a8f5309566bbe62004", - "reference": "781e6124dc7e14768ae999a8f5309566bbe62004", + "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/7a6798aa424f0ecafb1542b6f5207c5a99704d3d", + "reference": "7a6798aa424f0ecafb1542b6f5207c5a99704d3d", "shasum": "" }, "require": { @@ -16487,7 +16493,7 @@ ], "support": { "issues": "https://github.com/easy-coding-standard/easy-coding-standard/issues", - "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.6.0" + "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.6.2" }, "funding": [ { @@ -16499,7 +16505,7 @@ "type": "github" } ], - "time": "2025-09-10T14:21:58+00:00" + "time": "2025-10-29T08:51:50+00:00" }, { "name": "tecnickcom/tc-lib-barcode", @@ -16727,16 +16733,16 @@ }, { "name": "twig/cssinliner-extra", - "version": "v3.21.0", + "version": "v3.22.0", "source": { "type": "git", "url": "https://github.com/twigphp/cssinliner-extra.git", - "reference": "378d29b61d6406c456e3a4afbd15bbeea0b72ea8" + "reference": "9bcbf04ca515e98fcde479fdceaa1d9d9e76173e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/cssinliner-extra/zipball/378d29b61d6406c456e3a4afbd15bbeea0b72ea8", - "reference": "378d29b61d6406c456e3a4afbd15bbeea0b72ea8", + "url": "https://api.github.com/repos/twigphp/cssinliner-extra/zipball/9bcbf04ca515e98fcde479fdceaa1d9d9e76173e", + "reference": "9bcbf04ca515e98fcde479fdceaa1d9d9e76173e", "shasum": "" }, "require": { @@ -16780,7 +16786,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/cssinliner-extra/tree/v3.21.0" + "source": "https://github.com/twigphp/cssinliner-extra/tree/v3.22.0" }, "funding": [ { @@ -16792,20 +16798,20 @@ "type": "tidelift" } ], - "time": "2025-01-31T20:45:36+00:00" + "time": "2025-07-29T08:07:07+00:00" }, { "name": "twig/extra-bundle", - "version": "v3.21.0", + "version": "v3.22.0", "source": { "type": "git", "url": "https://github.com/twigphp/twig-extra-bundle.git", - "reference": "62d1cf47a1aa009cbd07b21045b97d3d5cb79896" + "reference": "6d253f0fe28a83a045497c8fb3ea9bfe84e82cf4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/62d1cf47a1aa009cbd07b21045b97d3d5cb79896", - "reference": "62d1cf47a1aa009cbd07b21045b97d3d5cb79896", + "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/6d253f0fe28a83a045497c8fb3ea9bfe84e82cf4", + "reference": "6d253f0fe28a83a045497c8fb3ea9bfe84e82cf4", "shasum": "" }, "require": { @@ -16815,7 +16821,7 @@ "twig/twig": "^3.2|^4.0" }, "require-dev": { - "league/commonmark": "^1.0|^2.0", + "league/commonmark": "^2.7", "symfony/phpunit-bridge": "^6.4|^7.0", "twig/cache-extra": "^3.0", "twig/cssinliner-extra": "^3.0", @@ -16854,7 +16860,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.21.0" + "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.22.0" }, "funding": [ { @@ -16866,11 +16872,11 @@ "type": "tidelift" } ], - "time": "2025-02-19T14:29:33+00:00" + "time": "2025-09-15T05:57:37+00:00" }, { "name": "twig/html-extra", - "version": "v3.21.0", + "version": "v3.22.0", "source": { "type": "git", "url": "https://github.com/twigphp/html-extra.git", @@ -16922,7 +16928,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/html-extra/tree/v3.21.0" + "source": "https://github.com/twigphp/html-extra/tree/v3.22.0" }, "funding": [ { @@ -16938,16 +16944,16 @@ }, { "name": "twig/inky-extra", - "version": "v3.21.0", + "version": "v3.22.0", "source": { "type": "git", "url": "https://github.com/twigphp/inky-extra.git", - "reference": "aacd79d94534b4a7fd6533cb5c33c4ee97239a0d" + "reference": "631f42c7123240d9c2497903679ec54bb25f2f52" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/inky-extra/zipball/aacd79d94534b4a7fd6533cb5c33c4ee97239a0d", - "reference": "aacd79d94534b4a7fd6533cb5c33c4ee97239a0d", + "url": "https://api.github.com/repos/twigphp/inky-extra/zipball/631f42c7123240d9c2497903679ec54bb25f2f52", + "reference": "631f42c7123240d9c2497903679ec54bb25f2f52", "shasum": "" }, "require": { @@ -16992,7 +16998,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/inky-extra/tree/v3.21.0" + "source": "https://github.com/twigphp/inky-extra/tree/v3.22.0" }, "funding": [ { @@ -17004,20 +17010,20 @@ "type": "tidelift" } ], - "time": "2025-01-31T20:45:36+00:00" + "time": "2025-07-29T08:07:07+00:00" }, { "name": "twig/intl-extra", - "version": "v3.21.0", + "version": "v3.22.0", "source": { "type": "git", "url": "https://github.com/twigphp/intl-extra.git", - "reference": "05bc5d46b9df9e62399eae53e7c0b0633298b146" + "reference": "7393fc911c7315db18a805d3a541ac7bb9e4fdc0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/05bc5d46b9df9e62399eae53e7c0b0633298b146", - "reference": "05bc5d46b9df9e62399eae53e7c0b0633298b146", + "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/7393fc911c7315db18a805d3a541ac7bb9e4fdc0", + "reference": "7393fc911c7315db18a805d3a541ac7bb9e4fdc0", "shasum": "" }, "require": { @@ -17056,7 +17062,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/intl-extra/tree/v3.21.0" + "source": "https://github.com/twigphp/intl-extra/tree/v3.22.0" }, "funding": [ { @@ -17068,20 +17074,20 @@ "type": "tidelift" } ], - "time": "2025-01-31T20:45:36+00:00" + "time": "2025-09-15T06:05:04+00:00" }, { "name": "twig/markdown-extra", - "version": "v3.21.0", + "version": "v3.22.0", "source": { "type": "git", "url": "https://github.com/twigphp/markdown-extra.git", - "reference": "f4616e1dd375209dacf6026f846e6b537d036ce4" + "reference": "fb6f952082e3a7d62a75c8be2c8c47242d3925fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/markdown-extra/zipball/f4616e1dd375209dacf6026f846e6b537d036ce4", - "reference": "f4616e1dd375209dacf6026f846e6b537d036ce4", + "url": "https://api.github.com/repos/twigphp/markdown-extra/zipball/fb6f952082e3a7d62a75c8be2c8c47242d3925fb", + "reference": "fb6f952082e3a7d62a75c8be2c8c47242d3925fb", "shasum": "" }, "require": { @@ -17091,7 +17097,7 @@ }, "require-dev": { "erusev/parsedown": "dev-master as 1.x-dev", - "league/commonmark": "^1.0|^2.0", + "league/commonmark": "^2.7", "league/html-to-markdown": "^4.8|^5.0", "michelf/php-markdown": "^1.8|^2.0", "symfony/phpunit-bridge": "^6.4|^7.0" @@ -17128,7 +17134,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/markdown-extra/tree/v3.21.0" + "source": "https://github.com/twigphp/markdown-extra/tree/v3.22.0" }, "funding": [ { @@ -17140,11 +17146,11 @@ "type": "tidelift" } ], - "time": "2025-01-31T20:45:36+00:00" + "time": "2025-09-15T05:57:37+00:00" }, { "name": "twig/string-extra", - "version": "v3.21.0", + "version": "v3.22.0", "source": { "type": "git", "url": "https://github.com/twigphp/string-extra.git", @@ -17195,7 +17201,7 @@ "unicode" ], "support": { - "source": "https://github.com/twigphp/string-extra/tree/v3.21.0" + "source": "https://github.com/twigphp/string-extra/tree/v3.22.0" }, "funding": [ { @@ -17211,16 +17217,16 @@ }, { "name": "twig/twig", - "version": "v3.21.1", + "version": "v3.22.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "285123877d4dd97dd7c11842ac5fb7e86e60d81d" + "reference": "4509984193026de413baf4ba80f68590a7f2c51d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/285123877d4dd97dd7c11842ac5fb7e86e60d81d", - "reference": "285123877d4dd97dd7c11842ac5fb7e86e60d81d", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/4509984193026de413baf4ba80f68590a7f2c51d", + "reference": "4509984193026de413baf4ba80f68590a7f2c51d", "shasum": "" }, "require": { @@ -17274,7 +17280,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.21.1" + "source": "https://github.com/twigphp/Twig/tree/v3.22.0" }, "funding": [ { @@ -17286,7 +17292,7 @@ "type": "tidelift" } ], - "time": "2025-05-03T07:21:55+00:00" + "time": "2025-10-29T15:56:47+00:00" }, { "name": "ua-parser/uap-php", @@ -17603,28 +17609,28 @@ }, { "name": "webmozart/assert", - "version": "1.11.0", + "version": "1.12.1", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + "reference": "9be6926d8b485f55b9229203f962b51ed377ba68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68", + "reference": "9be6926d8b485f55b9229203f962b51ed377ba68", "shasum": "" }, "require": { "ext-ctype": "*", + "ext-date": "*", + "ext-filter": "*", "php": "^7.2 || ^8.0" }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" + "suggest": { + "ext-intl": "", + "ext-simplexml": "", + "ext-spl": "" }, "type": "library", "extra": { @@ -17655,9 +17661,9 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.11.0" + "source": "https://github.com/webmozarts/assert/tree/1.12.1" }, - "time": "2022-06-03T18:03:27+00:00" + "time": "2025-10-29T15:56:20+00:00" }, { "name": "willdurand/negotiation", @@ -17788,20 +17794,20 @@ }, { "name": "doctrine/doctrine-fixtures-bundle", - "version": "4.2.0", + "version": "4.3.0", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineFixturesBundle.git", - "reference": "cd58d7738fe1fea1dbfd3e3f3bb421ee92d45e10" + "reference": "11941deb6f2899b91e8b8680b07ffe63899d864b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/cd58d7738fe1fea1dbfd3e3f3bb421ee92d45e10", - "reference": "cd58d7738fe1fea1dbfd3e3f3bb421ee92d45e10", + "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/11941deb6f2899b91e8b8680b07ffe63899d864b", + "reference": "11941deb6f2899b91e8b8680b07ffe63899d864b", "shasum": "" }, "require": { - "doctrine/data-fixtures": "^2.0", + "doctrine/data-fixtures": "^2.2", "doctrine/doctrine-bundle": "^2.2 || ^3.0", "doctrine/orm": "^2.14.0 || ^3.0", "doctrine/persistence": "^2.4 || ^3.0 || ^4.0", @@ -17854,7 +17860,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineFixturesBundle/issues", - "source": "https://github.com/doctrine/DoctrineFixturesBundle/tree/4.2.0" + "source": "https://github.com/doctrine/DoctrineFixturesBundle/tree/4.3.0" }, "funding": [ { @@ -17870,7 +17876,7 @@ "type": "tidelift" } ], - "time": "2025-10-12T16:50:54+00:00" + "time": "2025-10-20T06:18:40+00:00" }, { "name": "ekino/phpstan-banned-code", @@ -18070,16 +18076,16 @@ }, { "name": "nikic/php-parser", - "version": "v5.6.1", + "version": "v5.6.2", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2" + "reference": "3a454ca033b9e06b63282ce19562e892747449bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2", - "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/3a454ca033b9e06b63282ce19562e892747449bb", + "reference": "3a454ca033b9e06b63282ce19562e892747449bb", "shasum": "" }, "require": { @@ -18122,9 +18128,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.2" }, - "time": "2025-08-13T20:13:15+00:00" + "time": "2025-10-21T19:32:17+00:00" }, { "name": "phar-io/manifest", @@ -18874,16 +18880,16 @@ }, { "name": "phpunit/phpunit", - "version": "11.5.42", + "version": "11.5.43", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "1c6cb5dfe412af3d0dfd414cfd110e3b9cfdbc3c" + "reference": "c6b89b6cf4324a8b4cb86e1f5dfdd6c9e0371924" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1c6cb5dfe412af3d0dfd414cfd110e3b9cfdbc3c", - "reference": "1c6cb5dfe412af3d0dfd414cfd110e3b9cfdbc3c", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c6b89b6cf4324a8b4cb86e1f5dfdd6c9e0371924", + "reference": "c6b89b6cf4324a8b4cb86e1f5dfdd6c9e0371924", "shasum": "" }, "require": { @@ -18955,7 +18961,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.42" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.43" }, "funding": [ { @@ -18979,20 +18985,20 @@ "type": "tidelift" } ], - "time": "2025-09-28T12:09:13+00:00" + "time": "2025-10-30T08:39:39+00:00" }, { "name": "rector/rector", - "version": "2.2.3", + "version": "2.2.7", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "d27f976a332a87b5d03553c2e6f04adbe5da034f" + "reference": "022038537838bc8a4e526af86c2d6e38eaeff7ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/d27f976a332a87b5d03553c2e6f04adbe5da034f", - "reference": "d27f976a332a87b5d03553c2e6f04adbe5da034f", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/022038537838bc8a4e526af86c2d6e38eaeff7ef", + "reference": "022038537838bc8a4e526af86c2d6e38eaeff7ef", "shasum": "" }, "require": { @@ -19031,7 +19037,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/2.2.3" + "source": "https://github.com/rectorphp/rector/tree/2.2.7" }, "funding": [ { @@ -19039,7 +19045,7 @@ "type": "github" } ], - "time": "2025-10-11T21:50:23+00:00" + "time": "2025-10-29T15:46:12+00:00" }, { "name": "roave/security-advisories", @@ -19047,18 +19053,18 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "7a8f128281289412092c450a5eb3df5cabbc89e1" + "reference": "d2e1583e5f89f53f7882861c1639c14c9a154585" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/7a8f128281289412092c450a5eb3df5cabbc89e1", - "reference": "7a8f128281289412092c450a5eb3df5cabbc89e1", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/d2e1583e5f89f53f7882861c1639c14c9a154585", + "reference": "d2e1583e5f89f53f7882861c1639c14c9a154585", "shasum": "" }, "conflict": { "3f/pygmentize": "<1.2", "adaptcms/adaptcms": "<=1.3", - "admidio/admidio": "<4.3.12", + "admidio/admidio": "<=4.3.16", "adodb/adodb-php": "<=5.22.9", "aheinze/cockpit": "<2.2", "aimeos/ai-admin-graphql": ">=2022.04.1,<2022.10.10|>=2023.04.1,<2023.10.6|>=2024.04.1,<2024.07.2", @@ -19161,6 +19167,7 @@ "clickstorm/cs-seo": ">=6,<6.8|>=7,<7.5|>=8,<8.4|>=9,<9.3", "co-stack/fal_sftp": "<0.2.6", "cockpit-hq/cockpit": "<2.11.4", + "code16/sharp": "<9.11.1", "codeception/codeception": "<3.1.3|>=4,<4.1.22", "codeigniter/framework": "<3.1.10", "codeigniter4/framework": "<4.6.2", @@ -19219,30 +19226,39 @@ "dompdf/dompdf": "<2.0.4", "doublethreedigital/guest-entries": "<3.1.2", "drupal-pattern-lab/unified-twig-extensions": "<=0.1", + "drupal/access_code": "<2.0.5", + "drupal/acquia_dam": "<1.1.5", "drupal/admin_audit_trail": "<1.0.5", "drupal/ai": "<1.0.5", "drupal/alogin": "<2.0.6", "drupal/cache_utility": "<1.2.1", + "drupal/civictheme": "<1.12", "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.102|>=8,<10.3.14|>=10.4,<10.4.5|>=11,<11.0.13|>=11.1,<11.1.5", "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", "drupal/formatter_suite": "<2.1", "drupal/gdpr": "<3.0.1|>=3.1,<3.1.2", "drupal/google_tag": "<1.8|>=2,<2.0.8", "drupal/ignition": "<1.0.4", + "drupal/json_field": "<1.5", "drupal/lightgallery": "<1.6", "drupal/link_field_display_mode_formatter": "<1.6", "drupal/matomo": "<1.24", "drupal/oauth2_client": "<4.1.3", "drupal/oauth2_server": "<2.1", "drupal/obfuscate": "<2.0.1", + "drupal/plausible_tracking": "<1.0.2", "drupal/quick_node_block": "<2", "drupal/rapidoc_elements_field_formatter": "<1.0.1", + "drupal/reverse_proxy_header": "<1.1.2", + "drupal/simple_oauth": ">=6,<6.0.7", "drupal/spamspan": "<3.2.1", "drupal/tfa": "<1.10", + "drupal/umami_analytics": "<1.0.1", "duncanmcclean/guest-entries": "<3.1.2", "dweeves/magmi": "<=0.7.24", "ec-cube/ec-cube": "<2.4.4|>=2.11,<=2.17.1|>=3,<=3.0.18.0-patch4|>=4,<=4.1.2", @@ -19466,7 +19482,7 @@ "luyadev/yii-helpers": "<1.2.1", "macropay-solutions/laravel-crud-wizard-free": "<3.4.17", "maestroerror/php-heic-to-jpg": "<1.0.5", - "magento/community-edition": "<=2.4.5.0-patch14|==2.4.6|>=2.4.6.0-patch1,<=2.4.6.0-patch12|>=2.4.7.0-beta1,<=2.4.7.0-patch7|>=2.4.8.0-beta1,<=2.4.8.0-patch2|>=2.4.9.0-alpha1,<=2.4.9.0-alpha2|==2.4.9", + "magento/community-edition": "<2.4.6.0-patch13|>=2.4.7.0-beta1,<2.4.7.0-patch8|>=2.4.8.0-beta1,<2.4.8.0-patch3|>=2.4.9.0-alpha1,<2.4.9.0-alpha3|==2.4.9", "magento/core": "<=1.9.4.5", "magento/magento1ce": "<1.9.4.3-dev", "magento/magento1ee": ">=1,<1.14.4.3-dev", @@ -19487,7 +19503,7 @@ "maximebf/debugbar": "<1.19", "mdanter/ecc": "<2", "mediawiki/abuse-filter": "<1.39.9|>=1.40,<1.41.3|>=1.42,<1.42.2", - "mediawiki/cargo": "<3.6.1", + "mediawiki/cargo": "<3.8.3", "mediawiki/core": "<1.39.5|==1.40", "mediawiki/data-transfer": ">=1.39,<1.39.11|>=1.41,<1.41.3|>=1.42,<1.42.2", "mediawiki/matomo": "<2.4.3", @@ -19512,7 +19528,7 @@ "mojo42/jirafeau": "<4.4", "mongodb/mongodb": ">=1,<1.9.2", "monolog/monolog": ">=1.8,<1.12", - "moodle/moodle": "<4.3.12|>=4.4,<4.4.8|>=4.5.0.0-beta,<4.5.4", + "moodle/moodle": "<4.4.11|>=4.5.0.0-beta,<4.5.7|>=5.0.0.0-beta,<5.0.3", "moonshine/moonshine": "<=3.12.5", "mos/cimage": "<0.7.19", "movim/moxl": ">=0.8,<=0.10", @@ -19646,8 +19662,8 @@ "prestashop/ps_emailsubscription": "<2.6.1", "prestashop/ps_facetedsearch": "<3.4.1", "prestashop/ps_linklist": "<3.1", - "privatebin/privatebin": "<1.4|>=1.5,<1.7.4", - "processwire/processwire": "<=3.0.229", + "privatebin/privatebin": "<1.4|>=1.5,<1.7.4|>=1.7.7,<2.0.2", + "processwire/processwire": "<=3.0.246", "propel/propel": ">=2.0.0.0-alpha1,<=2.0.0.0-alpha7", "propel/propel1": ">=1,<=1.7.1", "pterodactyl/panel": "<=1.11.10", @@ -19690,8 +19706,8 @@ "setasign/fpdi": "<2.6.4", "sfroemken/url_redirect": "<=1.2.1", "sheng/yiicms": "<1.2.1", - "shopware/core": "<6.5.8.18-dev|>=6.6,<6.6.10.3-dev|>=6.7,<6.7.2.1-dev", - "shopware/platform": "<=6.6.10.4|>=6.7.0.0-RC1-dev,<6.7.0.0-RC2-dev", + "shopware/core": "<6.6.10.7-dev|>=6.7,<6.7.3.1-dev", + "shopware/platform": "<6.6.10.7-dev|>=6.7,<6.7.3.1-dev", "shopware/production": "<=6.3.5.2", "shopware/shopware": "<=5.7.17|>=6.7,<6.7.2.1-dev", "shopware/storefront": "<=6.4.8.1|>=6.5.8,<6.5.8.7-dev", @@ -19744,15 +19760,16 @@ "spatie/image-optimizer": "<1.7.3", "spencer14420/sp-php-email-handler": "<1", "spipu/html2pdf": "<5.2.8", + "spiral/roadrunner": "<2025.1", "spoon/library": "<1.4.1", "spoonity/tcpdf": "<6.2.22", "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", "ssddanbrown/bookstack": "<24.05.1", - "starcitizentools/citizen-skin": ">=1.9.4,<3.4", + "starcitizentools/citizen-skin": ">=1.9.4,<3.9", "starcitizentools/short-description": ">=4,<4.0.1", "starcitizentools/tabber-neue": ">=1.9.1,<2.7.2|>=3,<3.1.1", "starcitizenwiki/embedvideo": "<=4", - "statamic/cms": "<=5.16", + "statamic/cms": "<=5.22", "stormpath/sdk": "<9.9.99", "studio-42/elfinder": "<=2.1.64", "studiomitte/friendlycaptcha": "<0.1.4", @@ -20019,7 +20036,7 @@ "type": "tidelift" } ], - "time": "2025-10-17T18:06:27+00:00" + "time": "2025-10-30T18:07:16+00:00" }, { "name": "sebastian/cli-parser", @@ -21133,16 +21150,16 @@ }, { "name": "symfony/debug-bundle", - "version": "v7.3.4", + "version": "v7.3.5", "source": { "type": "git", "url": "https://github.com/symfony/debug-bundle.git", - "reference": "30f922edd53dd85238f1f26dbb68a044109f8f0e" + "reference": "0aee008fb501677fa5b62ea5f65cabcf041629ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/30f922edd53dd85238f1f26dbb68a044109f8f0e", - "reference": "30f922edd53dd85238f1f26dbb68a044109f8f0e", + "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/0aee008fb501677fa5b62ea5f65cabcf041629ef", + "reference": "0aee008fb501677fa5b62ea5f65cabcf041629ef", "shasum": "" }, "require": { @@ -21184,7 +21201,7 @@ "description": "Provides a tight integration of the Symfony VarDumper component and the ServerLogCommand from MonologBridge into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/debug-bundle/tree/v7.3.4" + "source": "https://github.com/symfony/debug-bundle/tree/v7.3.5" }, "funding": [ { @@ -21204,7 +21221,7 @@ "type": "tidelift" } ], - "time": "2025-09-10T12:00:31+00:00" + "time": "2025-10-13T11:49:56+00:00" }, { "name": "symfony/maker-bundle", @@ -21390,16 +21407,16 @@ }, { "name": "symfony/web-profiler-bundle", - "version": "v7.3.4", + "version": "v7.3.5", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "f305fa4add690bb7d6b14ab61f37c3bd061a3dd7" + "reference": "c2ed11cc0e9093fe0425ad52498d26a458842e0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/f305fa4add690bb7d6b14ab61f37c3bd061a3dd7", - "reference": "f305fa4add690bb7d6b14ab61f37c3bd061a3dd7", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/c2ed11cc0e9093fe0425ad52498d26a458842e0c", + "reference": "c2ed11cc0e9093fe0425ad52498d26a458842e0c", "shasum": "" }, "require": { @@ -21455,7 +21472,7 @@ "dev" ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.3.4" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.3.5" }, "funding": [ { @@ -21475,7 +21492,7 @@ "type": "tidelift" } ], - "time": "2025-09-25T08:03:55+00:00" + "time": "2025-10-06T13:36:11+00:00" }, { "name": "theseer/tokenizer", diff --git a/config/permissions.yaml b/config/permissions.yaml index 8cbd60c3..7acee7f0 100644 --- a/config/permissions.yaml +++ b/config/permissions.yaml @@ -24,7 +24,7 @@ perms: # Here comes a list with all Permission names (they have a perm_[name] co label: "perm.read" # If a part can be read by a user, he can also see all the datastructures (except devices) alsoSet: ['storelocations.read', 'footprints.read', 'categories.read', 'suppliers.read', 'manufacturers.read', - 'currencies.read', 'attachment_types.read', 'measurement_units.read'] + 'currencies.read', 'attachment_types.read', 'measurement_units.read', 'part_custom_states.read'] apiTokenRole: ROLE_API_READ_ONLY edit: label: "perm.edit" @@ -133,6 +133,10 @@ perms: # Here comes a list with all Permission names (they have a perm_[name] co <<: *PART_CONTAINING label: "perm.measurement_units" + part_custom_states: + <<: *PART_CONTAINING + label: "perm.part_custom_states" + tools: label: "perm.part.tools" operations: diff --git a/config/services.yaml b/config/services.yaml index 17611cea..b48b3eff 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -231,6 +231,16 @@ services: tags: - { name: 'doctrine.fixtures.purger_factory', alias: 'reset_autoincrement_purger' } + App\Repository\PartRepository: + arguments: + $translator: '@translator' + tags: ['doctrine.repository_service'] + + App\EventSubscriber\UserSystem\PartUniqueIpnSubscriber: + tags: + - { name: doctrine.event_listener, event: onFlush, connection: default } + + # We are needing this service inside a migration, where only the container is injected. So we need to define it as public, to access it from the container. App\Services\UserSystem\PermissionPresetsHelper: public: true diff --git a/docs/configuration.md b/docs/configuration.md index d4b21781..4bb46d08 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -116,6 +116,16 @@ bundled with Part-DB. Set `DATABASE_MYSQL_SSL_VERIFY_CERT` if you want to accept value should be handled as confidential data and not shared publicly. * `SHOW_PART_IMAGE_OVERLAY`: Set to 0 to disable the part image overlay, which appears if you hover over an image in the part image gallery +* `IPN_SUGGEST_REGEX`: A global regular expression, that part IPNs have to fullfill. Enforce your own format for your users. +* `IPN_SUGGEST_REGEX_HELP`: Define your own user help text for the Regex format specification. +* `IPN_AUTO_APPEND_SUFFIX`: When enabled, an incremental suffix will be added to the user input when entering an existing +* IPN again upon saving. +* `IPN_SUGGEST_PART_DIGITS`: Defines the fixed number of digits used as the increment at the end of an IPN (Internal Part Number). + IPN prefixes, maintained within part categories and their hierarchy, form the foundation for suggesting complete IPNs. + These suggestions become accessible during IPN input of a part. The constant specifies the digits used to calculate and assign + unique increments for parts within a category hierarchy, ensuring consistency and uniqueness in IPN generation. +* `IPN_USE_DUPLICATE_DESCRIPTION`: When enabled, the part’s description is used to find existing parts with the same + description and to determine the next available IPN by incrementing their numeric suffix for the suggestion list. ### E-Mail settings (all env only) @@ -136,7 +146,7 @@ bundled with Part-DB. Set `DATABASE_MYSQL_SSL_VERIFY_CERT` if you want to accept * `TABLE_PARTS_DEFAULT_COLUMNS`: The columns in parts tables, which are visible by default (when loading table for first time). Also specify the default order of the columns. This is a comma separated list of column names. Available columns - are: `name`, `id`, `ipn`, `description`, `category`, `footprint`, `manufacturer`, `storage_location`, `amount`, `minamount`, `partUnit`, `addedDate`, `lastModified`, `needs_review`, `favorite`, `manufacturing_status`, `manufacturer_product_number`, `mass`, `tags`, `attachments`, `edit`. + are: `name`, `id`, `ipn`, `description`, `category`, `footprint`, `manufacturer`, `storage_location`, `amount`, `minamount`, `partUnit`, `partCustomState`, `addedDate`, `lastModified`, `needs_review`, `favorite`, `manufacturing_status`, `manufacturer_product_number`, `mass`, `tags`, `attachments`, `edit`. ### History/Eventlog-related settings diff --git a/migrations/Version20250321075747.php b/migrations/Version20250321075747.php new file mode 100644 index 00000000..14bcb8a9 --- /dev/null +++ b/migrations/Version20250321075747.php @@ -0,0 +1,605 @@ +addSql(<<<'SQL' + CREATE TABLE part_custom_states ( + id INT AUTO_INCREMENT NOT NULL, + parent_id INT DEFAULT NULL, + id_preview_attachment INT DEFAULT NULL, + name VARCHAR(255) NOT NULL, + comment LONGTEXT NOT NULL, + not_selectable TINYINT(1) NOT NULL, + alternative_names LONGTEXT DEFAULT NULL, + last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, + datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, + INDEX IDX_F552745D727ACA70 (parent_id), + INDEX IDX_F552745DEA7100A1 (id_preview_attachment), + INDEX part_custom_state_name (name), + PRIMARY KEY(id) + ) + DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` + SQL); + $this->addSql(<<<'SQL' + ALTER TABLE part_custom_states ADD CONSTRAINT FK_F552745D727ACA70 FOREIGN KEY (parent_id) REFERENCES part_custom_states (id) + SQL); + $this->addSql(<<<'SQL' + ALTER TABLE part_custom_states ADD CONSTRAINT FK_F552745DEA7100A1 FOREIGN KEY (id_preview_attachment) REFERENCES attachments (id) ON DELETE SET NULL + SQL); + + $this->addSql(<<<'SQL' + ALTER TABLE parts ADD id_part_custom_state INT DEFAULT NULL AFTER id_part_unit + SQL); + $this->addSql(<<<'SQL' + ALTER TABLE parts ADD CONSTRAINT FK_6940A7FEA3ED1215 FOREIGN KEY (id_part_custom_state) REFERENCES part_custom_states (id) + SQL); + $this->addSql(<<<'SQL' + CREATE INDEX IDX_6940A7FEA3ED1215 ON parts (id_part_custom_state) + SQL); + } + + public function mySQLDown(Schema $schema): void + { + $this->addSql(<<<'SQL' + ALTER TABLE parts DROP FOREIGN KEY FK_6940A7FEA3ED1215 + SQL); + $this->addSql(<<<'SQL' + DROP INDEX IDX_6940A7FEA3ED1215 ON parts + SQL); + $this->addSql(<<<'SQL' + ALTER TABLE parts DROP id_part_custom_state + SQL); + + $this->addSql(<<<'SQL' + ALTER TABLE part_custom_states DROP FOREIGN KEY FK_F552745D727ACA70 + SQL); + $this->addSql(<<<'SQL' + ALTER TABLE part_custom_states DROP FOREIGN KEY FK_F552745DEA7100A1 + SQL); + $this->addSql(<<<'SQL' + DROP TABLE part_custom_states + SQL); + } + + public function sqLiteUp(Schema $schema): void + { + $this->addSql(<<<'SQL' + CREATE TABLE "part_custom_states" ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + parent_id INTEGER DEFAULT NULL, + id_preview_attachment INTEGER DEFAULT NULL, + name VARCHAR(255) NOT NULL, + comment CLOB NOT NULL, + not_selectable BOOLEAN NOT NULL, + alternative_names CLOB DEFAULT NULL, + last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, + datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, + CONSTRAINT FK_F552745D727ACA70 FOREIGN KEY (parent_id) REFERENCES "part_custom_states" (id) NOT DEFERRABLE INITIALLY IMMEDIATE, + CONSTRAINT FK_F5AF83CFEA7100A1 FOREIGN KEY (id_preview_attachment) REFERENCES "attachments" (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE + ) + SQL); + $this->addSql(<<<'SQL' + CREATE INDEX IDX_F552745D727ACA70 ON "part_custom_states" (parent_id) + SQL); + $this->addSql(<<<'SQL' + CREATE INDEX part_custom_state_name ON "part_custom_states" (name) + SQL); + + $this->addSql(<<<'SQL' + CREATE TEMPORARY TABLE __temp__parts AS + SELECT + id, + id_preview_attachment, + id_category, + id_footprint, + id_part_unit, + id_manufacturer, + order_orderdetails_id, + built_project_id, + datetime_added, + name, + last_modified, + needs_review, + tags, + mass, + description, + comment, + visible, + favorite, + minamount, + manufacturer_product_url, + manufacturer_product_number, + manufacturing_status, + order_quantity, + manual_order, + ipn, + provider_reference_provider_key, + provider_reference_provider_id, + provider_reference_provider_url, + provider_reference_last_updated, + eda_info_reference_prefix, + eda_info_value, + eda_info_invisible, + eda_info_exclude_from_bom, + eda_info_exclude_from_board, + eda_info_exclude_from_sim, + eda_info_kicad_symbol, + eda_info_kicad_footprint + FROM parts + SQL); + + $this->addSql(<<<'SQL' + DROP TABLE parts + SQL); + + $this->addSql(<<<'SQL' + CREATE TABLE parts ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + id_preview_attachment INTEGER DEFAULT NULL, + id_category INTEGER NOT NULL, + id_footprint INTEGER DEFAULT NULL, + id_part_unit INTEGER DEFAULT NULL, + id_manufacturer INTEGER DEFAULT NULL, + id_part_custom_state INTEGER DEFAULT NULL, + order_orderdetails_id INTEGER DEFAULT NULL, + built_project_id INTEGER DEFAULT NULL, + datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, + name VARCHAR(255) NOT NULL, + last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, + needs_review BOOLEAN NOT NULL, + tags CLOB NOT NULL, + mass DOUBLE PRECISION DEFAULT NULL, + description CLOB NOT NULL, + comment CLOB NOT NULL, + visible BOOLEAN NOT NULL, + favorite BOOLEAN NOT NULL, + minamount DOUBLE PRECISION NOT NULL, + manufacturer_product_url CLOB NOT NULL, + manufacturer_product_number VARCHAR(255) NOT NULL, + manufacturing_status VARCHAR(255) DEFAULT NULL, + order_quantity INTEGER NOT NULL, + manual_order BOOLEAN NOT NULL, + ipn VARCHAR(100) DEFAULT NULL, + provider_reference_provider_key VARCHAR(255) DEFAULT NULL, + provider_reference_provider_id VARCHAR(255) DEFAULT NULL, + provider_reference_provider_url VARCHAR(255) DEFAULT NULL, + provider_reference_last_updated DATETIME DEFAULT NULL, + eda_info_reference_prefix VARCHAR(255) DEFAULT NULL, + eda_info_value VARCHAR(255) DEFAULT NULL, + eda_info_invisible BOOLEAN DEFAULT NULL, + eda_info_exclude_from_bom BOOLEAN DEFAULT NULL, + eda_info_exclude_from_board BOOLEAN DEFAULT NULL, + eda_info_exclude_from_sim BOOLEAN DEFAULT NULL, + eda_info_kicad_symbol VARCHAR(255) DEFAULT NULL, + eda_info_kicad_footprint VARCHAR(255) DEFAULT NULL, + CONSTRAINT FK_6940A7FEEA7100A1 FOREIGN KEY (id_preview_attachment) REFERENCES attachments (id) ON UPDATE NO ACTION ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE, + CONSTRAINT FK_6940A7FE5697F554 FOREIGN KEY (id_category) REFERENCES categories (id) ON UPDATE NO ACTION ON DELETE NO ACTION NOT DEFERRABLE INITIALLY IMMEDIATE, + CONSTRAINT FK_6940A7FE7E371A10 FOREIGN KEY (id_footprint) REFERENCES footprints (id) ON UPDATE NO ACTION ON DELETE NO ACTION NOT DEFERRABLE INITIALLY IMMEDIATE, + CONSTRAINT FK_6940A7FE2626CEF9 FOREIGN KEY (id_part_unit) REFERENCES measurement_units (id) ON UPDATE NO ACTION ON DELETE NO ACTION NOT DEFERRABLE INITIALLY IMMEDIATE, + CONSTRAINT FK_6940A7FE1ECB93AE FOREIGN KEY (id_manufacturer) REFERENCES manufacturers (id) ON UPDATE NO ACTION ON DELETE NO ACTION NOT DEFERRABLE INITIALLY IMMEDIATE, + CONSTRAINT FK_6940A7FEA3ED1215 FOREIGN KEY (id_part_custom_state) REFERENCES "part_custom_states" (id) ON UPDATE NO ACTION ON DELETE NO ACTION NOT DEFERRABLE INITIALLY IMMEDIATE, + CONSTRAINT FK_6940A7FE81081E9B FOREIGN KEY (order_orderdetails_id) REFERENCES orderdetails (id) ON UPDATE NO ACTION ON DELETE NO ACTION NOT DEFERRABLE INITIALLY IMMEDIATE, + CONSTRAINT FK_6940A7FEE8AE70D9 FOREIGN KEY (built_project_id) REFERENCES projects (id) ON UPDATE NO ACTION ON DELETE NO ACTION NOT DEFERRABLE INITIALLY IMMEDIATE + ) + SQL); + + $this->addSql(<<<'SQL' + INSERT INTO parts ( + id, + id_preview_attachment, + id_category, + id_footprint, + id_part_unit, + id_manufacturer, + order_orderdetails_id, + built_project_id, + datetime_added, + name, + last_modified, + needs_review, + tags, + mass, + description, + comment, + visible, + favorite, + minamount, + manufacturer_product_url, + manufacturer_product_number, + manufacturing_status, + order_quantity, + manual_order, + ipn, + provider_reference_provider_key, + provider_reference_provider_id, + provider_reference_provider_url, + provider_reference_last_updated, + eda_info_reference_prefix, + eda_info_value, + eda_info_invisible, + eda_info_exclude_from_bom, + eda_info_exclude_from_board, + eda_info_exclude_from_sim, + eda_info_kicad_symbol, + eda_info_kicad_footprint) + SELECT + id, + id_preview_attachment, + id_category, + id_footprint, + id_part_unit, + id_manufacturer, + order_orderdetails_id, + built_project_id, + datetime_added, + name, + last_modified, + needs_review, + tags, + mass, + description, + comment, + visible, + favorite, + minamount, + manufacturer_product_url, + manufacturer_product_number, + manufacturing_status, + order_quantity, + manual_order, + ipn, + provider_reference_provider_key, + provider_reference_provider_id, + provider_reference_provider_url, + provider_reference_last_updated, + eda_info_reference_prefix, + eda_info_value, + eda_info_invisible, + eda_info_exclude_from_bom, + eda_info_exclude_from_board, + eda_info_exclude_from_sim, + eda_info_kicad_symbol, + eda_info_kicad_footprint + FROM __temp__parts + SQL); + + $this->addSql(<<<'SQL' + DROP TABLE __temp__parts + SQL); + + $this->addSql(<<<'SQL' + CREATE INDEX parts_idx_name ON parts (name) + SQL); + $this->addSql(<<<'SQL' + CREATE INDEX parts_idx_ipn ON parts (ipn) + SQL); + $this->addSql(<<<'SQL' + CREATE INDEX parts_idx_datet_name_last_id_needs ON parts (datetime_added, name, last_modified, id, needs_review) + SQL); + $this->addSql(<<<'SQL' + CREATE UNIQUE INDEX UNIQ_6940A7FEE8AE70D9 ON parts (built_project_id) + SQL); + $this->addSql(<<<'SQL' + CREATE UNIQUE INDEX UNIQ_6940A7FE81081E9B ON parts (order_orderdetails_id) + SQL); + $this->addSql(<<<'SQL' + CREATE UNIQUE INDEX UNIQ_6940A7FE3D721C14 ON parts (ipn) + SQL); + $this->addSql(<<<'SQL' + CREATE INDEX IDX_6940A7FEEA7100A1 ON parts (id_preview_attachment) + SQL); + $this->addSql(<<<'SQL' + CREATE INDEX IDX_6940A7FE7E371A10 ON parts (id_footprint) + SQL); + $this->addSql(<<<'SQL' + CREATE INDEX IDX_6940A7FE5697F554 ON parts (id_category) + SQL); + $this->addSql(<<<'SQL' + CREATE INDEX IDX_6940A7FE2626CEF9 ON parts (id_part_unit) + SQL); + $this->addSql(<<<'SQL' + CREATE INDEX IDX_6940A7FE1ECB93AE ON parts (id_manufacturer) + SQL); + $this->addSql(<<<'SQL' + CREATE INDEX IDX_6940A7FEA3ED1215 ON parts (id_part_custom_state) + SQL); + } + + public function sqLiteDown(Schema $schema): void + { + $this->addSql(<<<'SQL' + CREATE TEMPORARY TABLE __temp__parts AS + SELECT + id, + id_preview_attachment, + id_category, + id_footprint, + id_part_unit, + id_manufacturer, + order_orderdetails_id, + built_project_id, + datetime_added, + name, + last_modified, + needs_review, + tags, + mass, + description, + comment, + visible, + favorite, + minamount, + manufacturer_product_url, + manufacturer_product_number, + manufacturing_status, + order_quantity, + manual_order, + ipn, + provider_reference_provider_key, + provider_reference_provider_id, + provider_reference_provider_url, + provider_reference_last_updated, + eda_info_reference_prefix, + eda_info_value, + eda_info_invisible, + eda_info_exclude_from_bom, + eda_info_exclude_from_board, + eda_info_exclude_from_sim, + eda_info_kicad_symbol, + eda_info_kicad_footprint + FROM "parts" + SQL); + $this->addSql(<<<'SQL' + DROP TABLE "parts" + SQL); + $this->addSql(<<<'SQL' + CREATE TABLE "parts" ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + id_preview_attachment INTEGER DEFAULT NULL, + id_category INTEGER NOT NULL, + id_footprint INTEGER DEFAULT NULL, + id_part_unit INTEGER DEFAULT NULL, + id_manufacturer INTEGER DEFAULT NULL, + order_orderdetails_id INTEGER DEFAULT NULL, + built_project_id INTEGER DEFAULT NULL, + datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, + name VARCHAR(255) NOT NULL, + last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, + needs_review BOOLEAN NOT NULL, + tags CLOB NOT NULL, + mass DOUBLE PRECISION DEFAULT NULL, + description CLOB NOT NULL, + comment CLOB NOT NULL, + visible BOOLEAN NOT NULL, + favorite BOOLEAN NOT NULL, + minamount DOUBLE PRECISION NOT NULL, + manufacturer_product_url CLOB NOT NULL, + manufacturer_product_number VARCHAR(255) NOT NULL, + manufacturing_status VARCHAR(255) DEFAULT NULL, + order_quantity INTEGER NOT NULL, + manual_order BOOLEAN NOT NULL, + ipn VARCHAR(100) DEFAULT NULL, + provider_reference_provider_key VARCHAR(255) DEFAULT NULL, + provider_reference_provider_id VARCHAR(255) DEFAULT NULL, + provider_reference_provider_url VARCHAR(255) DEFAULT NULL, + provider_reference_last_updated DATETIME DEFAULT NULL, + eda_info_reference_prefix VARCHAR(255) DEFAULT NULL, + eda_info_value VARCHAR(255) DEFAULT NULL, + eda_info_invisible BOOLEAN DEFAULT NULL, + eda_info_exclude_from_bom BOOLEAN DEFAULT NULL, + eda_info_exclude_from_board BOOLEAN DEFAULT NULL, + eda_info_exclude_from_sim BOOLEAN DEFAULT NULL, + eda_info_kicad_symbol VARCHAR(255) DEFAULT NULL, + eda_info_kicad_footprint VARCHAR(255) DEFAULT NULL, + CONSTRAINT FK_6940A7FEEA7100A1 FOREIGN KEY (id_preview_attachment) REFERENCES "attachments" (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE, + CONSTRAINT FK_6940A7FE5697F554 FOREIGN KEY (id_category) REFERENCES "categories" (id) NOT DEFERRABLE INITIALLY IMMEDIATE, + CONSTRAINT FK_6940A7FE7E371A10 FOREIGN KEY (id_footprint) REFERENCES "footprints" (id) NOT DEFERRABLE INITIALLY IMMEDIATE, + CONSTRAINT FK_6940A7FE2626CEF9 FOREIGN KEY (id_part_unit) REFERENCES "measurement_units" (id) NOT DEFERRABLE INITIALLY IMMEDIATE, + CONSTRAINT FK_6940A7FE1ECB93AE FOREIGN KEY (id_manufacturer) REFERENCES "manufacturers" (id) NOT DEFERRABLE INITIALLY IMMEDIATE, + CONSTRAINT FK_6940A7FE81081E9B FOREIGN KEY (order_orderdetails_id) REFERENCES "orderdetails" (id) NOT DEFERRABLE INITIALLY IMMEDIATE, + CONSTRAINT FK_6940A7FEE8AE70D9 FOREIGN KEY (built_project_id) REFERENCES projects (id) NOT DEFERRABLE INITIALLY IMMEDIATE + ) + SQL); + $this->addSql(<<<'SQL' + INSERT INTO "parts" ( + id, + id_preview_attachment, + id_category, + id_footprint, + id_part_unit, + id_manufacturer, + order_orderdetails_id, + built_project_id, + datetime_added, + name, + last_modified, + needs_review, + tags, + mass, + description, + comment, + visible, + favorite, + minamount, + manufacturer_product_url, + manufacturer_product_number, + manufacturing_status, + order_quantity, + manual_order, + ipn, + provider_reference_provider_key, + provider_reference_provider_id, + provider_reference_provider_url, + provider_reference_last_updated, + eda_info_reference_prefix, + eda_info_value, + eda_info_invisible, + eda_info_exclude_from_bom, + eda_info_exclude_from_board, + eda_info_exclude_from_sim, + eda_info_kicad_symbol, + eda_info_kicad_footprint + ) SELECT + id, + id_preview_attachment, + id_category, + id_footprint, + id_part_unit, + id_manufacturer, + order_orderdetails_id, + built_project_id, + datetime_added, + name, + last_modified, + needs_review, + tags, + mass, + description, + comment, + visible, + favorite, + minamount, + manufacturer_product_url, + manufacturer_product_number, + manufacturing_status, + order_quantity, + manual_order, + ipn, + provider_reference_provider_key, + provider_reference_provider_id, + provider_reference_provider_url, + provider_reference_last_updated, + eda_info_reference_prefix, + eda_info_value, + eda_info_invisible, + eda_info_exclude_from_bom, + eda_info_exclude_from_board, + eda_info_exclude_from_sim, + eda_info_kicad_symbol, + eda_info_kicad_footprint + FROM __temp__parts + SQL); + + $this->addSql(<<<'SQL' + DROP TABLE __temp__parts + SQL); + $this->addSql(<<<'SQL' + CREATE UNIQUE INDEX UNIQ_6940A7FE3D721C14 ON "parts" (ipn) + SQL); + $this->addSql(<<<'SQL' + CREATE INDEX IDX_6940A7FEEA7100A1 ON "parts" (id_preview_attachment) + SQL); + $this->addSql(<<<'SQL' + CREATE INDEX IDX_6940A7FE5697F554 ON "parts" (id_category) + SQL); + $this->addSql(<<<'SQL' + CREATE INDEX IDX_6940A7FE7E371A10 ON "parts" (id_footprint) + SQL); + $this->addSql(<<<'SQL' + CREATE INDEX IDX_6940A7FE2626CEF9 ON "parts" (id_part_unit) + SQL); + $this->addSql(<<<'SQL' + CREATE INDEX IDX_6940A7FE1ECB93AE ON "parts" (id_manufacturer) + SQL); + $this->addSql(<<<'SQL' + CREATE UNIQUE INDEX UNIQ_6940A7FE81081E9B ON "parts" (order_orderdetails_id) + SQL); + $this->addSql(<<<'SQL' + CREATE UNIQUE INDEX UNIQ_6940A7FEE8AE70D9 ON "parts" (built_project_id) + SQL); + $this->addSql(<<<'SQL' + CREATE INDEX parts_idx_datet_name_last_id_needs ON "parts" (datetime_added, name, last_modified, id, needs_review) + SQL); + $this->addSql(<<<'SQL' + CREATE INDEX parts_idx_name ON "parts" (name) + SQL); + $this->addSql(<<<'SQL' + CREATE INDEX parts_idx_ipn ON "parts" (ipn) + SQL); + + $this->addSql(<<<'SQL' + DROP TABLE "part_custom_states" + SQL); + } + + public function postgreSQLUp(Schema $schema): void + { + $this->addSql(<<<'SQL' + CREATE TABLE "part_custom_states" ( + id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + parent_id INT DEFAULT NULL, + id_preview_attachment INT DEFAULT NULL, PRIMARY KEY(id), + name VARCHAR(255) NOT NULL, + comment TEXT NOT NULL, + not_selectable BOOLEAN NOT NULL, + alternative_names TEXT DEFAULT NULL, + last_modified TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL, + datetime_added TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL + ) + SQL); + $this->addSql(<<<'SQL' + CREATE INDEX IDX_F552745D727ACA70 ON "part_custom_states" (parent_id) + SQL); + $this->addSql(<<<'SQL' + CREATE INDEX IDX_F552745DEA7100A1 ON "part_custom_states" (id_preview_attachment) + SQL); + $this->addSql(<<<'SQL' + ALTER TABLE "part_custom_states" + ADD CONSTRAINT FK_F552745D727ACA70 + FOREIGN KEY (parent_id) REFERENCES "part_custom_states" (id) NOT DEFERRABLE INITIALLY IMMEDIATE + SQL); + $this->addSql(<<<'SQL' + ALTER TABLE "part_custom_states" + ADD CONSTRAINT FK_F552745DEA7100A1 + FOREIGN KEY (id_preview_attachment) REFERENCES "attachments" (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE + SQL); + + + $this->addSql(<<<'SQL' + ALTER TABLE parts ADD id_part_custom_state INT DEFAULT NULL + SQL); + $this->addSql(<<<'SQL' + ALTER TABLE parts ADD CONSTRAINT FK_6940A7FEA3ED1215 FOREIGN KEY (id_part_custom_state) REFERENCES "part_custom_states" (id) NOT DEFERRABLE INITIALLY IMMEDIATE + SQL); + $this->addSql(<<<'SQL' + CREATE INDEX IDX_6940A7FEA3ED1215 ON parts (id_part_custom_state) + SQL); + } + + public function postgreSQLDown(Schema $schema): void + { + $this->addSql(<<<'SQL' + ALTER TABLE "parts" DROP CONSTRAINT FK_6940A7FEA3ED1215 + SQL); + $this->addSql(<<<'SQL' + DROP INDEX IDX_6940A7FEA3ED1215 + SQL); + $this->addSql(<<<'SQL' + ALTER TABLE "parts" DROP id_part_custom_state + SQL); + + $this->addSql(<<<'SQL' + ALTER TABLE "part_custom_states" DROP CONSTRAINT FK_F552745D727ACA70 + SQL); + $this->addSql(<<<'SQL' + ALTER TABLE "part_custom_states" DROP CONSTRAINT FK_F552745DEA7100A1 + SQL); + $this->addSql(<<<'SQL' + DROP TABLE "part_custom_states" + SQL); + } +} diff --git a/migrations/Version20250325073036.php b/migrations/Version20250325073036.php new file mode 100644 index 00000000..3bae80ab --- /dev/null +++ b/migrations/Version20250325073036.php @@ -0,0 +1,307 @@ +addSql(<<<'SQL' + ALTER TABLE categories ADD COLUMN part_ipn_prefix VARCHAR(255) NOT NULL DEFAULT '' + SQL); + } + + public function mySQLDown(Schema $schema): void + { + $this->addSql(<<<'SQL' + ALTER TABLE categories DROP part_ipn_prefix + SQL); + } + + public function sqLiteUp(Schema $schema): void + { + $this->addSql(<<<'SQL' + CREATE TEMPORARY TABLE __temp__categories AS + SELECT + id, + parent_id, + id_preview_attachment, + partname_hint, + partname_regex, + disable_footprints, + disable_manufacturers, + disable_autodatasheets, + disable_properties, + default_description, + default_comment, + comment, + not_selectable, + name, + last_modified, + datetime_added, + alternative_names, + eda_info_reference_prefix, + eda_info_invisible, + eda_info_exclude_from_bom, + eda_info_exclude_from_board, + eda_info_exclude_from_sim, + eda_info_kicad_symbol + FROM categories + SQL); + + $this->addSql('DROP TABLE categories'); + + $this->addSql(<<<'SQL' + CREATE TABLE categories ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + parent_id INTEGER DEFAULT NULL, + id_preview_attachment INTEGER DEFAULT NULL, + partname_hint CLOB NOT NULL, + partname_regex CLOB NOT NULL, + part_ipn_prefix VARCHAR(255) DEFAULT '' NOT NULL, + disable_footprints BOOLEAN NOT NULL, + disable_manufacturers BOOLEAN NOT NULL, + disable_autodatasheets BOOLEAN NOT NULL, + disable_properties BOOLEAN NOT NULL, + default_description CLOB NOT NULL, + default_comment CLOB NOT NULL, + comment CLOB NOT NULL, + not_selectable BOOLEAN NOT NULL, + name VARCHAR(255) NOT NULL, + last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, + datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, + alternative_names CLOB DEFAULT NULL, + eda_info_reference_prefix VARCHAR(255) DEFAULT NULL, + eda_info_invisible BOOLEAN DEFAULT NULL, + eda_info_exclude_from_bom BOOLEAN DEFAULT NULL, + eda_info_exclude_from_board BOOLEAN DEFAULT NULL, + eda_info_exclude_from_sim BOOLEAN DEFAULT NULL, + eda_info_kicad_symbol VARCHAR(255) DEFAULT NULL, + CONSTRAINT FK_3AF34668727ACA70 FOREIGN KEY (parent_id) REFERENCES categories (id) ON UPDATE NO ACTION ON DELETE NO ACTION NOT DEFERRABLE INITIALLY IMMEDIATE, + CONSTRAINT FK_3AF34668EA7100A1 FOREIGN KEY (id_preview_attachment) REFERENCES attachments (id) ON UPDATE NO ACTION ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE + ) + SQL); + + $this->addSql(<<<'SQL' + INSERT INTO categories ( + id, + parent_id, + id_preview_attachment, + partname_hint, + partname_regex, + disable_footprints, + disable_manufacturers, + disable_autodatasheets, + disable_properties, + default_description, + default_comment, + comment, + not_selectable, + name, + last_modified, + datetime_added, + alternative_names, + eda_info_reference_prefix, + eda_info_invisible, + eda_info_exclude_from_bom, + eda_info_exclude_from_board, + eda_info_exclude_from_sim, + eda_info_kicad_symbol + ) SELECT + id, + parent_id, + id_preview_attachment, + partname_hint, + partname_regex, + disable_footprints, + disable_manufacturers, + disable_autodatasheets, + disable_properties, + default_description, + default_comment, + comment, + not_selectable, + name, + last_modified, + datetime_added, + alternative_names, + eda_info_reference_prefix, + eda_info_invisible, + eda_info_exclude_from_bom, + eda_info_exclude_from_board, + eda_info_exclude_from_sim, + eda_info_kicad_symbol + FROM __temp__categories + SQL); + + $this->addSql('DROP TABLE __temp__categories'); + + $this->addSql(<<<'SQL' + CREATE INDEX IDX_3AF34668727ACA70 ON categories (parent_id) + SQL); + $this->addSql(<<<'SQL' + CREATE INDEX IDX_3AF34668EA7100A1 ON categories (id_preview_attachment) + SQL); + $this->addSql(<<<'SQL' + CREATE INDEX category_idx_name ON categories (name) + SQL); + $this->addSql(<<<'SQL' + CREATE INDEX category_idx_parent_name ON categories (parent_id, name) + SQL); + } + + public function sqLiteDown(Schema $schema): void + { + $this->addSql(<<<'SQL' + CREATE TEMPORARY TABLE __temp__categories AS + SELECT + id, + parent_id, + id_preview_attachment, + partname_hint, + partname_regex, + disable_footprints, + disable_manufacturers, + disable_autodatasheets, + disable_properties, + default_description, + default_comment, + comment, + not_selectable, + name, + last_modified, + datetime_added, + alternative_names, + eda_info_reference_prefix, + eda_info_invisible, + eda_info_exclude_from_bom, + eda_info_exclude_from_board, + eda_info_exclude_from_sim, + eda_info_kicad_symbol + FROM categories + SQL); + + $this->addSql('DROP TABLE categories'); + + $this->addSql(<<<'SQL' + CREATE TABLE categories ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + parent_id INTEGER DEFAULT NULL, + id_preview_attachment INTEGER DEFAULT NULL, + partname_hint CLOB NOT NULL, + partname_regex CLOB NOT NULL, + disable_footprints BOOLEAN NOT NULL, + disable_manufacturers BOOLEAN NOT NULL, + disable_autodatasheets BOOLEAN NOT NULL, + disable_properties BOOLEAN NOT NULL, + default_description CLOB NOT NULL, + default_comment CLOB NOT NULL, + comment CLOB NOT NULL, + not_selectable BOOLEAN NOT NULL, + name VARCHAR(255) NOT NULL, + last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, + datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, + alternative_names CLOB DEFAULT NULL, + eda_info_reference_prefix VARCHAR(255) DEFAULT NULL, + eda_info_invisible BOOLEAN DEFAULT NULL, + eda_info_exclude_from_bom BOOLEAN DEFAULT NULL, + eda_info_exclude_from_board BOOLEAN DEFAULT NULL, + eda_info_exclude_from_sim BOOLEAN DEFAULT NULL, + eda_info_kicad_symbol VARCHAR(255) DEFAULT NULL, + CONSTRAINT FK_3AF34668727ACA70 FOREIGN KEY (parent_id) REFERENCES categories (id) ON UPDATE NO ACTION ON DELETE NO ACTION NOT DEFERRABLE INITIALLY IMMEDIATE, + CONSTRAINT FK_3AF34668EA7100A1 FOREIGN KEY (id_preview_attachment) REFERENCES attachments (id) ON UPDATE NO ACTION ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE + ) + SQL); + + $this->addSql(<<<'SQL' + INSERT INTO categories ( + id, + parent_id, + id_preview_attachment, + partname_hint, + partname_regex, + disable_footprints, + disable_manufacturers, + disable_autodatasheets, + disable_properties, + default_description, + default_comment, + comment, + not_selectable, + name, + last_modified, + datetime_added, + alternative_names, + eda_info_reference_prefix, + eda_info_invisible, + eda_info_exclude_from_bom, + eda_info_exclude_from_board, + eda_info_exclude_from_sim, + eda_info_kicad_symbol + ) SELECT + id, + parent_id, + id_preview_attachment, + partname_hint, + partname_regex, + disable_footprints, + disable_manufacturers, + disable_autodatasheets, + disable_properties, + default_description, + default_comment, + comment, + not_selectable, + name, + last_modified, + datetime_added, + alternative_names, + eda_info_reference_prefix, + eda_info_invisible, + eda_info_exclude_from_bom, + eda_info_exclude_from_board, + eda_info_exclude_from_sim, + eda_info_kicad_symbol + FROM __temp__categories + SQL); + + $this->addSql('DROP TABLE __temp__categories'); + + $this->addSql(<<<'SQL' + CREATE INDEX IDX_3AF34668727ACA70 ON categories (parent_id) + SQL); + $this->addSql(<<<'SQL' + CREATE INDEX IDX_3AF34668EA7100A1 ON categories (id_preview_attachment) + SQL); + $this->addSql(<<<'SQL' + CREATE INDEX category_idx_name ON categories (name) + SQL); + $this->addSql(<<<'SQL' + CREATE INDEX category_idx_parent_name ON categories (parent_id, name) + SQL); + } + + public function postgreSQLUp(Schema $schema): void + { + $this->addSql(<<<'SQL' + ALTER TABLE categories ADD part_ipn_prefix VARCHAR(255) DEFAULT '' NOT NULL + SQL); + } + + public function postgreSQLDown(Schema $schema): void + { + $this->addSql(<<<'SQL' + ALTER TABLE "categories" DROP part_ipn_prefix + SQL); + } +} diff --git a/src/Command/Migrations/ImportPartKeeprCommand.php b/src/Command/Migrations/ImportPartKeeprCommand.php index aee71afe..429f018d 100644 --- a/src/Command/Migrations/ImportPartKeeprCommand.php +++ b/src/Command/Migrations/ImportPartKeeprCommand.php @@ -121,6 +121,11 @@ class ImportPartKeeprCommand extends Command $count = $this->datastructureImporter->importPartUnits($data); $io->success('Imported '.$count.' measurement units.'); + //Import the custom states + $io->info('Importing custom states...'); + $count = $this->datastructureImporter->importPartCustomStates($data); + $io->success('Imported '.$count.' custom states.'); + //Import manufacturers $io->info('Importing manufacturers...'); $count = $this->datastructureImporter->importManufacturers($data); diff --git a/src/Controller/AdminPages/BaseAdminController.php b/src/Controller/AdminPages/BaseAdminController.php index edc5917a..e7dd7421 100644 --- a/src/Controller/AdminPages/BaseAdminController.php +++ b/src/Controller/AdminPages/BaseAdminController.php @@ -232,6 +232,7 @@ abstract class BaseAdminController extends AbstractController 'timeTravel' => $timeTravel_timestamp, 'repo' => $repo, 'partsContainingElement' => $repo instanceof PartsContainingRepositoryInterface, + 'showParameters' => !($this instanceof PartCustomStateController), ]); } @@ -382,6 +383,7 @@ abstract class BaseAdminController extends AbstractController 'import_form' => $import_form, 'mass_creation_form' => $mass_creation_form, 'route_base' => $this->route_base, + 'showParameters' => !($this instanceof PartCustomStateController), ]); } diff --git a/src/Controller/AdminPages/PartCustomStateController.php b/src/Controller/AdminPages/PartCustomStateController.php new file mode 100644 index 00000000..60f63abf --- /dev/null +++ b/src/Controller/AdminPages/PartCustomStateController.php @@ -0,0 +1,83 @@ +. + */ + +declare(strict_types=1); + +namespace App\Controller\AdminPages; + +use App\Entity\Attachments\PartCustomStateAttachment; +use App\Entity\Parameters\PartCustomStateParameter; +use App\Entity\Parts\PartCustomState; +use App\Form\AdminPages\PartCustomStateAdminForm; +use App\Services\ImportExportSystem\EntityExporter; +use App\Services\ImportExportSystem\EntityImporter; +use App\Services\Trees\StructuralElementRecursionHelper; +use Doctrine\ORM\EntityManagerInterface; +use Symfony\Component\HttpFoundation\RedirectResponse; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\Routing\Attribute\Route; + +/** + * @see \App\Tests\Controller\AdminPages\PartCustomStateControllerTest + */ +#[Route(path: '/part_custom_state')] +class PartCustomStateController extends BaseAdminController +{ + protected string $entity_class = PartCustomState::class; + protected string $twig_template = 'admin/part_custom_state_admin.html.twig'; + protected string $form_class = PartCustomStateAdminForm::class; + protected string $route_base = 'part_custom_state'; + protected string $attachment_class = PartCustomStateAttachment::class; + protected ?string $parameter_class = PartCustomStateParameter::class; + + #[Route(path: '/{id}', name: 'part_custom_state_delete', methods: ['DELETE'])] + public function delete(Request $request, PartCustomState $entity, StructuralElementRecursionHelper $recursionHelper): RedirectResponse + { + return $this->_delete($request, $entity, $recursionHelper); + } + + #[Route(path: '/{id}/edit/{timestamp}', name: 'part_custom_state_edit', requirements: ['id' => '\d+'])] + #[Route(path: '/{id}', requirements: ['id' => '\d+'])] + public function edit(PartCustomState $entity, Request $request, EntityManagerInterface $em, ?string $timestamp = null): Response + { + return $this->_edit($entity, $request, $em, $timestamp); + } + + #[Route(path: '/new', name: 'part_custom_state_new')] + #[Route(path: '/{id}/clone', name: 'part_custom_state_clone')] + #[Route(path: '/')] + public function new(Request $request, EntityManagerInterface $em, EntityImporter $importer, ?PartCustomState $entity = null): Response + { + return $this->_new($request, $em, $importer, $entity); + } + + #[Route(path: '/export', name: 'part_custom_state_export_all')] + public function exportAll(EntityManagerInterface $em, EntityExporter $exporter, Request $request): Response + { + return $this->_exportAll($em, $exporter, $request); + } + + #[Route(path: '/{id}/export', name: 'part_custom_state_export')] + public function exportEntity(PartCustomState $entity, EntityExporter $exporter, Request $request): Response + { + return $this->_exportEntity($entity, $exporter, $request); + } +} diff --git a/src/Controller/PartController.php b/src/Controller/PartController.php index aeb2664e..3a121ad2 100644 --- a/src/Controller/PartController.php +++ b/src/Controller/PartController.php @@ -47,6 +47,7 @@ use App\Services\Parts\PartLotWithdrawAddHelper; use App\Services\Parts\PricedetailHelper; use App\Services\ProjectSystem\ProjectBuildPartHelper; use App\Settings\BehaviorSettings\PartInfoSettings; +use App\Settings\MiscSettings\IpnSuggestSettings; use DateTime; use Doctrine\ORM\EntityManagerInterface; use Exception; @@ -74,6 +75,7 @@ final class PartController extends AbstractController private readonly EntityManagerInterface $em, private readonly EventCommentHelper $commentHelper, private readonly PartInfoSettings $partInfoSettings, + private readonly IpnSuggestSettings $ipnSuggestSettings, ) { } @@ -444,10 +446,13 @@ final class PartController extends AbstractController $template = 'parts/edit/update_from_ip.html.twig'; } + $partRepository = $this->em->getRepository(Part::class); + return $this->render( $template, [ 'part' => $new_part, + 'ipnSuggestions' => $partRepository->autoCompleteIpn($data, $data->getDescription(), $this->ipnSuggestSettings->suggestPartDigits), 'form' => $form, 'merge_old_name' => $merge_infos['tname_before'] ?? null, 'merge_other' => $merge_infos['other_part'] ?? null, @@ -457,7 +462,6 @@ final class PartController extends AbstractController ); } - #[Route(path: '/{id}/add_withdraw', name: 'part_add_withdraw', methods: ['POST'])] public function withdrawAddHandler(Part $part, Request $request, EntityManagerInterface $em, PartLotWithdrawAddHelper $withdrawAddHelper): Response { diff --git a/src/Controller/TypeaheadController.php b/src/Controller/TypeaheadController.php index 89eac7ff..39821f59 100644 --- a/src/Controller/TypeaheadController.php +++ b/src/Controller/TypeaheadController.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace App\Controller; use App\Entity\Parameters\AbstractParameter; +use App\Settings\MiscSettings\IpnSuggestSettings; use Symfony\Component\HttpFoundation\Response; use App\Entity\Attachments\Attachment; use App\Entity\Parts\Category; @@ -60,8 +61,11 @@ use Symfony\Component\Serializer\Serializer; #[Route(path: '/typeahead')] class TypeaheadController extends AbstractController { - public function __construct(protected AttachmentURLGenerator $urlGenerator, protected Packages $assets) - { + public function __construct( + protected AttachmentURLGenerator $urlGenerator, + protected Packages $assets, + protected IpnSuggestSettings $ipnSuggestSettings, + ) { } #[Route(path: '/builtInResources/search', name: 'typeahead_builtInRessources')] @@ -183,4 +187,30 @@ class TypeaheadController extends AbstractController return new JsonResponse($data, Response::HTTP_OK, [], true); } + + #[Route(path: '/parts/ipn-suggestions', name: 'ipn_suggestions', methods: ['GET'])] + public function ipnSuggestions( + Request $request, + EntityManagerInterface $entityManager + ): JsonResponse { + $partId = $request->query->get('partId'); + if ($partId === '0' || $partId === 'undefined' || $partId === 'null') { + $partId = null; + } + $categoryId = $request->query->getInt('categoryId'); + $description = base64_decode($request->query->getString('description'), true); + + /** @var Part $part */ + $part = $partId !== null ? $entityManager->getRepository(Part::class)->find($partId) : new Part(); + /** @var Category|null $category */ + $category = $entityManager->getRepository(Category::class)->find($categoryId); + + $clonedPart = clone $part; + $clonedPart->setCategory($category); + + $partRepository = $entityManager->getRepository(Part::class); + $ipnSuggestions = $partRepository->autoCompleteIpn($clonedPart, $description, $this->ipnSuggestSettings->suggestPartDigits); + + return new JsonResponse($ipnSuggestions); + } } diff --git a/src/DataFixtures/DataStructureFixtures.php b/src/DataFixtures/DataStructureFixtures.php index fc713d4d..9c685338 100644 --- a/src/DataFixtures/DataStructureFixtures.php +++ b/src/DataFixtures/DataStructureFixtures.php @@ -24,6 +24,7 @@ namespace App\DataFixtures; use App\Entity\Attachments\AttachmentType; use App\Entity\Base\AbstractStructuralDBElement; +use App\Entity\Parts\PartCustomState; use App\Entity\ProjectSystem\Project; use App\Entity\Parts\Category; use App\Entity\Parts\Footprint; @@ -50,7 +51,7 @@ class DataStructureFixtures extends Fixture implements DependentFixtureInterface { //Reset autoincrement $types = [AttachmentType::class, Project::class, Category::class, Footprint::class, Manufacturer::class, - MeasurementUnit::class, StorageLocation::class, Supplier::class,]; + MeasurementUnit::class, StorageLocation::class, Supplier::class, PartCustomState::class]; foreach ($types as $type) { $this->createNodesForClass($type, $manager); diff --git a/src/DataTables/Filters/PartFilter.php b/src/DataTables/Filters/PartFilter.php index e44cf69d..cf185dfd 100644 --- a/src/DataTables/Filters/PartFilter.php +++ b/src/DataTables/Filters/PartFilter.php @@ -41,6 +41,7 @@ use App\Entity\Parts\Category; use App\Entity\Parts\Footprint; use App\Entity\Parts\Manufacturer; use App\Entity\Parts\MeasurementUnit; +use App\Entity\Parts\PartCustomState; use App\Entity\Parts\PartLot; use App\Entity\Parts\StorageLocation; use App\Entity\Parts\Supplier; @@ -86,6 +87,7 @@ class PartFilter implements FilterInterface public readonly EntityConstraint $lotOwner; public readonly EntityConstraint $measurementUnit; + public readonly EntityConstraint $partCustomState; public readonly TextConstraint $manufacturer_product_url; public readonly TextConstraint $manufacturer_product_number; public readonly IntConstraint $attachmentsCount; @@ -128,6 +130,7 @@ class PartFilter implements FilterInterface $this->favorite = new BooleanConstraint('part.favorite'); $this->needsReview = new BooleanConstraint('part.needs_review'); $this->measurementUnit = new EntityConstraint($nodesListBuilder, MeasurementUnit::class, 'part.partUnit'); + $this->partCustomState = new EntityConstraint($nodesListBuilder, PartCustomState::class, 'part.partCustomState'); $this->mass = new NumberConstraint('part.mass'); $this->dbId = new IntConstraint('part.id'); $this->ipn = new TextConstraint('part.ipn'); diff --git a/src/DataTables/PartsDataTable.php b/src/DataTables/PartsDataTable.php index a97762b1..0baee630 100644 --- a/src/DataTables/PartsDataTable.php +++ b/src/DataTables/PartsDataTable.php @@ -174,6 +174,19 @@ final class PartsDataTable implements DataTableTypeInterface return $tmp; } ]) + ->add('partCustomState', TextColumn::class, [ + 'label' => $this->translator->trans('part.table.partCustomState'), + 'orderField' => 'NATSORT(_partCustomState.name)', + 'render' => function($value, Part $context): string { + $partCustomState = $context->getPartCustomState(); + + if ($partCustomState === null) { + return ''; + } + + return htmlspecialchars($partCustomState->getName()); + } + ]) ->add('addedDate', LocaleDateTimeColumn::class, [ 'label' => $this->translator->trans('part.table.addedDate'), ]) @@ -309,6 +322,7 @@ final class PartsDataTable implements DataTableTypeInterface ->addSelect('footprint') ->addSelect('manufacturer') ->addSelect('partUnit') + ->addSelect('partCustomState') ->addSelect('master_picture_attachment') ->addSelect('footprint_attachment') ->addSelect('partLots') @@ -327,6 +341,7 @@ final class PartsDataTable implements DataTableTypeInterface ->leftJoin('orderdetails.supplier', 'suppliers') ->leftJoin('part.attachments', 'attachments') ->leftJoin('part.partUnit', 'partUnit') + ->leftJoin('part.partCustomState', 'partCustomState') ->leftJoin('part.parameters', 'parameters') ->where('part.id IN (:ids)') ->setParameter('ids', $ids) @@ -344,6 +359,7 @@ final class PartsDataTable implements DataTableTypeInterface ->addGroupBy('suppliers') ->addGroupBy('attachments') ->addGroupBy('partUnit') + ->addGroupBy('partCustomState') ->addGroupBy('parameters'); //Get the results in the same order as the IDs were passed @@ -415,6 +431,10 @@ final class PartsDataTable implements DataTableTypeInterface $builder->leftJoin('part.partUnit', '_partUnit'); $builder->addGroupBy('_partUnit'); } + if (str_contains($dql, '_partCustomState')) { + $builder->leftJoin('part.partCustomState', '_partCustomState'); + $builder->addGroupBy('_partCustomState'); + } if (str_contains($dql, '_parameters')) { $builder->leftJoin('part.parameters', '_parameters'); //Do not group by many-to-* relations, as it would restrict the COUNT having clauses to be maximum 1 diff --git a/src/Entity/Attachments/Attachment.php b/src/Entity/Attachments/Attachment.php index 00cf581a..35a6a529 100644 --- a/src/Entity/Attachments/Attachment.php +++ b/src/Entity/Attachments/Attachment.php @@ -97,7 +97,7 @@ use function in_array; #[DiscriminatorMap(typeProperty: '_type', mapping: self::API_DISCRIMINATOR_MAP)] abstract class Attachment extends AbstractNamedDBElement { - private const ORM_DISCRIMINATOR_MAP = ['Part' => PartAttachment::class, 'Device' => ProjectAttachment::class, + private const ORM_DISCRIMINATOR_MAP = ['Part' => PartAttachment::class, 'PartCustomState' => PartCustomStateAttachment::class, 'Device' => ProjectAttachment::class, 'AttachmentType' => AttachmentTypeAttachment::class, 'Category' => CategoryAttachment::class, 'Footprint' => FootprintAttachment::class, 'Manufacturer' => ManufacturerAttachment::class, 'Currency' => CurrencyAttachment::class, 'Group' => GroupAttachment::class, 'MeasurementUnit' => MeasurementUnitAttachment::class, @@ -107,7 +107,8 @@ abstract class Attachment extends AbstractNamedDBElement /* * The discriminator map used for API platform. The key should be the same as the api platform short type (the @type JSONLD field). */ - private const API_DISCRIMINATOR_MAP = ["Part" => PartAttachment::class, "Project" => ProjectAttachment::class, "AttachmentType" => AttachmentTypeAttachment::class, + private const API_DISCRIMINATOR_MAP = ["Part" => PartAttachment::class, "PartCustomState" => PartCustomStateAttachment::class, "Project" => ProjectAttachment::class, + "AttachmentType" => AttachmentTypeAttachment::class, "Category" => CategoryAttachment::class, "Footprint" => FootprintAttachment::class, "Manufacturer" => ManufacturerAttachment::class, "Currency" => CurrencyAttachment::class, "Group" => GroupAttachment::class, "MeasurementUnit" => MeasurementUnitAttachment::class, "StorageLocation" => StorageLocationAttachment::class, "Supplier" => SupplierAttachment::class, "User" => UserAttachment::class, "LabelProfile" => LabelAttachment::class]; diff --git a/src/Entity/Attachments/PartCustomStateAttachment.php b/src/Entity/Attachments/PartCustomStateAttachment.php new file mode 100644 index 00000000..3a561b13 --- /dev/null +++ b/src/Entity/Attachments/PartCustomStateAttachment.php @@ -0,0 +1,45 @@ +. + */ + +declare(strict_types=1); + +namespace App\Entity\Attachments; + +use App\Entity\Parts\PartCustomState; +use App\Serializer\APIPlatform\OverrideClassDenormalizer; +use Doctrine\ORM\Mapping as ORM; +use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; +use Symfony\Component\Serializer\Attribute\Context; + +/** + * An attachment attached to a part custom state element. + * @extends Attachment + */ +#[UniqueEntity(['name', 'attachment_type', 'element'])] +#[ORM\Entity] +class PartCustomStateAttachment extends Attachment +{ + final public const ALLOWED_ELEMENT_CLASS = PartCustomState::class; + + #[ORM\ManyToOne(targetEntity: PartCustomState::class, inversedBy: 'attachments')] + #[ORM\JoinColumn(name: 'element_id', nullable: false, onDelete: 'CASCADE')] + #[Context(denormalizationContext: [OverrideClassDenormalizer::CONTEXT_KEY => self::ALLOWED_ELEMENT_CLASS])] + protected ?AttachmentContainingDBElement $element = null; +} diff --git a/src/Entity/Base/AbstractDBElement.php b/src/Entity/Base/AbstractDBElement.php index 9fb5d648..a088b3df 100644 --- a/src/Entity/Base/AbstractDBElement.php +++ b/src/Entity/Base/AbstractDBElement.php @@ -33,6 +33,7 @@ use App\Entity\Attachments\LabelAttachment; use App\Entity\Attachments\ManufacturerAttachment; use App\Entity\Attachments\MeasurementUnitAttachment; use App\Entity\Attachments\PartAttachment; +use App\Entity\Attachments\PartCustomStateAttachment; use App\Entity\Attachments\ProjectAttachment; use App\Entity\Attachments\StorageLocationAttachment; use App\Entity\Attachments\SupplierAttachment; @@ -40,6 +41,7 @@ use App\Entity\Attachments\UserAttachment; use App\Entity\Parameters\AbstractParameter; use App\Entity\Parts\Category; use App\Entity\PriceInformations\Pricedetail; +use App\Entity\Parts\PartCustomState; use App\Entity\ProjectSystem\Project; use App\Entity\ProjectSystem\ProjectBOMEntry; use App\Entity\Parts\Footprint; @@ -68,7 +70,41 @@ use Symfony\Component\Serializer\Annotation\Groups; * Every database table which are managed with this class (or a subclass of it) * must have the table row "id"!! The ID is the unique key to identify the elements. */ -#[DiscriminatorMap(typeProperty: 'type', mapping: ['attachment_type' => AttachmentType::class, 'attachment' => Attachment::class, 'attachment_type_attachment' => AttachmentTypeAttachment::class, 'category_attachment' => CategoryAttachment::class, 'currency_attachment' => CurrencyAttachment::class, 'footprint_attachment' => FootprintAttachment::class, 'group_attachment' => GroupAttachment::class, 'label_attachment' => LabelAttachment::class, 'manufacturer_attachment' => ManufacturerAttachment::class, 'measurement_unit_attachment' => MeasurementUnitAttachment::class, 'part_attachment' => PartAttachment::class, 'project_attachment' => ProjectAttachment::class, 'storelocation_attachment' => StorageLocationAttachment::class, 'supplier_attachment' => SupplierAttachment::class, 'user_attachment' => UserAttachment::class, 'category' => Category::class, 'project' => Project::class, 'project_bom_entry' => ProjectBOMEntry::class, 'footprint' => Footprint::class, 'group' => Group::class, 'manufacturer' => Manufacturer::class, 'orderdetail' => Orderdetail::class, 'part' => Part::class, 'pricedetail' => Pricedetail::class, 'storelocation' => StorageLocation::class, 'part_lot' => PartLot::class, 'currency' => Currency::class, 'measurement_unit' => MeasurementUnit::class, 'parameter' => AbstractParameter::class, 'supplier' => Supplier::class, 'user' => User::class])] +#[DiscriminatorMap(typeProperty: 'type', mapping: [ + 'attachment_type' => AttachmentType::class, + 'attachment' => Attachment::class, + 'attachment_type_attachment' => AttachmentTypeAttachment::class, + 'category_attachment' => CategoryAttachment::class, + 'currency_attachment' => CurrencyAttachment::class, + 'footprint_attachment' => FootprintAttachment::class, + 'group_attachment' => GroupAttachment::class, + 'label_attachment' => LabelAttachment::class, + 'manufacturer_attachment' => ManufacturerAttachment::class, + 'measurement_unit_attachment' => MeasurementUnitAttachment::class, + 'part_attachment' => PartAttachment::class, + 'part_custom_state_attachment' => PartCustomStateAttachment::class, + 'project_attachment' => ProjectAttachment::class, + 'storelocation_attachment' => StorageLocationAttachment::class, + 'supplier_attachment' => SupplierAttachment::class, + 'user_attachment' => UserAttachment::class, + 'category' => Category::class, + 'project' => Project::class, + 'project_bom_entry' => ProjectBOMEntry::class, + 'footprint' => Footprint::class, + 'group' => Group::class, + 'manufacturer' => Manufacturer::class, + 'orderdetail' => Orderdetail::class, + 'part' => Part::class, + 'part_custom_state' => PartCustomState::class, + 'pricedetail' => Pricedetail::class, + 'storelocation' => StorageLocation::class, + 'part_lot' => PartLot::class, + 'currency' => Currency::class, + 'measurement_unit' => MeasurementUnit::class, + 'parameter' => AbstractParameter::class, + 'supplier' => Supplier::class, + 'user' => User::class] +)] #[ORM\MappedSuperclass(repositoryClass: DBElementRepository::class)] abstract class AbstractDBElement implements JsonSerializable { diff --git a/src/Entity/LogSystem/CollectionElementDeleted.php b/src/Entity/LogSystem/CollectionElementDeleted.php index 16bf33f5..34ab8fba 100644 --- a/src/Entity/LogSystem/CollectionElementDeleted.php +++ b/src/Entity/LogSystem/CollectionElementDeleted.php @@ -46,6 +46,7 @@ use App\Entity\Attachments\AttachmentType; use App\Entity\Attachments\AttachmentTypeAttachment; use App\Entity\Attachments\CategoryAttachment; use App\Entity\Attachments\CurrencyAttachment; +use App\Entity\Attachments\PartCustomStateAttachment; use App\Entity\Attachments\ProjectAttachment; use App\Entity\Attachments\FootprintAttachment; use App\Entity\Attachments\GroupAttachment; @@ -58,6 +59,8 @@ use App\Entity\Attachments\UserAttachment; use App\Entity\Base\AbstractDBElement; use App\Entity\Contracts\LogWithEventUndoInterface; use App\Entity\Contracts\NamedElementInterface; +use App\Entity\Parameters\PartCustomStateParameter; +use App\Entity\Parts\PartCustomState; use App\Entity\ProjectSystem\Project; use App\Entity\Parameters\AbstractParameter; use App\Entity\Parameters\AttachmentTypeParameter; @@ -158,6 +161,7 @@ class CollectionElementDeleted extends AbstractLogEntry implements LogWithEventU Part::class => PartParameter::class, StorageLocation::class => StorageLocationParameter::class, Supplier::class => SupplierParameter::class, + PartCustomState::class => PartCustomStateParameter::class, default => throw new \RuntimeException('Unknown target class for parameter: '.$this->getTargetClass()), }; } @@ -173,6 +177,7 @@ class CollectionElementDeleted extends AbstractLogEntry implements LogWithEventU Manufacturer::class => ManufacturerAttachment::class, MeasurementUnit::class => MeasurementUnitAttachment::class, Part::class => PartAttachment::class, + PartCustomState::class => PartCustomStateAttachment::class, StorageLocation::class => StorageLocationAttachment::class, Supplier::class => SupplierAttachment::class, User::class => UserAttachment::class, diff --git a/src/Entity/LogSystem/LogTargetType.php b/src/Entity/LogSystem/LogTargetType.php index 61a2b081..3b2d8682 100644 --- a/src/Entity/LogSystem/LogTargetType.php +++ b/src/Entity/LogSystem/LogTargetType.php @@ -34,6 +34,7 @@ use App\Entity\Parts\Manufacturer; use App\Entity\Parts\MeasurementUnit; use App\Entity\Parts\Part; use App\Entity\Parts\PartAssociation; +use App\Entity\Parts\PartCustomState; use App\Entity\Parts\PartLot; use App\Entity\Parts\StorageLocation; use App\Entity\Parts\Supplier; @@ -71,6 +72,7 @@ enum LogTargetType: int case PART_ASSOCIATION = 20; case BULK_INFO_PROVIDER_IMPORT_JOB = 21; case BULK_INFO_PROVIDER_IMPORT_JOB_PART = 22; + case PART_CUSTOM_STATE = 23; /** * Returns the class name of the target type or null if the target type is NONE. @@ -102,6 +104,7 @@ enum LogTargetType: int self::PART_ASSOCIATION => PartAssociation::class, self::BULK_INFO_PROVIDER_IMPORT_JOB => BulkInfoProviderImportJob::class, self::BULK_INFO_PROVIDER_IMPORT_JOB_PART => BulkInfoProviderImportJobPart::class, + self::PART_CUSTOM_STATE => PartCustomState::class }; } diff --git a/src/Entity/Parameters/AbstractParameter.php b/src/Entity/Parameters/AbstractParameter.php index 39f333da..388745d4 100644 --- a/src/Entity/Parameters/AbstractParameter.php +++ b/src/Entity/Parameters/AbstractParameter.php @@ -73,7 +73,8 @@ use function sprintf; #[ORM\DiscriminatorMap([0 => CategoryParameter::class, 1 => CurrencyParameter::class, 2 => ProjectParameter::class, 3 => FootprintParameter::class, 4 => GroupParameter::class, 5 => ManufacturerParameter::class, 6 => MeasurementUnitParameter::class, 7 => PartParameter::class, 8 => StorageLocationParameter::class, - 9 => SupplierParameter::class, 10 => AttachmentTypeParameter::class])] + 9 => SupplierParameter::class, 10 => AttachmentTypeParameter::class, + 12 => PartCustomStateParameter::class])] #[ORM\Table('parameters')] #[ORM\Index(columns: ['name'], name: 'parameter_name_idx')] #[ORM\Index(columns: ['param_group'], name: 'parameter_group_idx')] @@ -105,7 +106,7 @@ abstract class AbstractParameter extends AbstractNamedDBElement implements Uniqu "AttachmentType" => AttachmentTypeParameter::class, "Category" => CategoryParameter::class, "Currency" => CurrencyParameter::class, "Project" => ProjectParameter::class, "Footprint" => FootprintParameter::class, "Group" => GroupParameter::class, "Manufacturer" => ManufacturerParameter::class, "MeasurementUnit" => MeasurementUnitParameter::class, - "StorageLocation" => StorageLocationParameter::class, "Supplier" => SupplierParameter::class]; + "StorageLocation" => StorageLocationParameter::class, "Supplier" => SupplierParameter::class, "PartCustomState" => PartCustomStateParameter::class]; /** * @var string The class of the element that can be passed to this attachment. Must be overridden in subclasses. diff --git a/src/Entity/Parameters/PartCustomStateParameter.php b/src/Entity/Parameters/PartCustomStateParameter.php new file mode 100644 index 00000000..ceedf7b4 --- /dev/null +++ b/src/Entity/Parameters/PartCustomStateParameter.php @@ -0,0 +1,65 @@ +. + */ + +declare(strict_types=1); + +/** + * 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 . + */ + +namespace App\Entity\Parameters; + +use App\Entity\Base\AbstractDBElement; +use App\Entity\Parts\PartCustomState; +use App\Repository\ParameterRepository; +use App\Serializer\APIPlatform\OverrideClassDenormalizer; +use Doctrine\ORM\Mapping as ORM; +use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; +use Symfony\Component\Serializer\Attribute\Context; + +#[UniqueEntity(fields: ['name', 'group', 'element'])] +#[ORM\Entity(repositoryClass: ParameterRepository::class)] +class PartCustomStateParameter extends AbstractParameter +{ + final public const ALLOWED_ELEMENT_CLASS = PartCustomState::class; + + /** + * @var PartCustomState the element this para is associated with + */ + #[ORM\ManyToOne(targetEntity: PartCustomState::class, inversedBy: 'parameters')] + #[ORM\JoinColumn(name: 'element_id', nullable: false, onDelete: 'CASCADE')] + #[Context(denormalizationContext: [OverrideClassDenormalizer::CONTEXT_KEY => self::ALLOWED_ELEMENT_CLASS])] + protected ?AbstractDBElement $element = null; +} diff --git a/src/Entity/Parts/Category.php b/src/Entity/Parts/Category.php index 99ed3c6d..7fca81bc 100644 --- a/src/Entity/Parts/Category.php +++ b/src/Entity/Parts/Category.php @@ -118,6 +118,13 @@ class Category extends AbstractPartsContainingDBElement #[ORM\Column(type: Types::TEXT)] protected string $partname_regex = ''; + /** + * @var string The prefix for ipn generation for created parts in this category. + */ + #[Groups(['full', 'import', 'category:read', 'category:write'])] + #[ORM\Column(type: Types::STRING, length: 255, nullable: false, options: ['default' => ''])] + protected string $part_ipn_prefix = ''; + /** * @var bool Set to true, if the footprints should be disabled for parts this category (not implemented yet). */ @@ -225,6 +232,16 @@ class Category extends AbstractPartsContainingDBElement return $this; } + public function getPartIpnPrefix(): string + { + return $this->part_ipn_prefix; + } + + public function setPartIpnPrefix(string $part_ipn_prefix): void + { + $this->part_ipn_prefix = $part_ipn_prefix; + } + public function isDisableFootprints(): bool { return $this->disable_footprints; diff --git a/src/Entity/Parts/Part.php b/src/Entity/Parts/Part.php index 2f274a8a..d0a279e3 100644 --- a/src/Entity/Parts/Part.php +++ b/src/Entity/Parts/Part.php @@ -61,7 +61,6 @@ use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\Common\Collections\Criteria; use Doctrine\ORM\Mapping as ORM; -use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\Validator\Context\ExecutionContextInterface; @@ -75,7 +74,6 @@ use Symfony\Component\Validator\Context\ExecutionContextInterface; * @extends AttachmentContainingDBElement * @template-use ParametersTrait */ -#[UniqueEntity(fields: ['ipn'], message: 'part.ipn.must_be_unique')] #[ORM\Entity(repositoryClass: PartRepository::class)] #[ORM\EntityListeners([TreeCacheInvalidationListener::class])] #[ORM\Table('`parts`')] @@ -107,7 +105,7 @@ use Symfony\Component\Validator\Context\ExecutionContextInterface; denormalizationContext: ['groups' => ['part:write', 'api:basic:write', 'eda_info:write', 'attachment:write', 'parameter:write'], 'openapi_definition_name' => 'Write'], )] #[ApiFilter(PropertyFilter::class)] -#[ApiFilter(EntityFilter::class, properties: ["category", "footprint", "manufacturer", "partUnit"])] +#[ApiFilter(EntityFilter::class, properties: ["category", "footprint", "manufacturer", "partUnit", "partCustomState"])] #[ApiFilter(PartStoragelocationFilter::class, properties: ["storage_location"])] #[ApiFilter(LikeFilter::class, properties: ["name", "comment", "description", "ipn", "manufacturer_product_number"])] #[ApiFilter(TagFilter::class, properties: ["tags"])] diff --git a/src/Entity/Parts/PartCustomState.php b/src/Entity/Parts/PartCustomState.php new file mode 100644 index 00000000..136ff984 --- /dev/null +++ b/src/Entity/Parts/PartCustomState.php @@ -0,0 +1,127 @@ +. + */ + +declare(strict_types=1); + +namespace App\Entity\Parts; + +use ApiPlatform\Metadata\ApiProperty; +use App\Entity\Attachments\Attachment; +use App\Entity\Attachments\PartCustomStateAttachment; +use ApiPlatform\Doctrine\Common\Filter\DateFilterInterface; +use ApiPlatform\Doctrine\Orm\Filter\DateFilter; +use ApiPlatform\Doctrine\Orm\Filter\OrderFilter; +use ApiPlatform\Metadata\ApiFilter; +use ApiPlatform\Metadata\ApiResource; +use ApiPlatform\Metadata\Delete; +use ApiPlatform\Metadata\Get; +use ApiPlatform\Metadata\GetCollection; +use ApiPlatform\Metadata\Patch; +use ApiPlatform\Metadata\Post; +use ApiPlatform\Serializer\Filter\PropertyFilter; +use App\ApiPlatform\Filter\LikeFilter; +use App\Entity\Base\AbstractPartsContainingDBElement; +use App\Entity\Base\AbstractStructuralDBElement; +use App\Entity\Parameters\PartCustomStateParameter; +use App\Repository\Parts\PartCustomStateRepository; +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; +use Doctrine\Common\Collections\Criteria; +use Doctrine\ORM\Mapping as ORM; +use Symfony\Component\Serializer\Annotation\Groups; +use Symfony\Component\Validator\Constraints as Assert; + +/** + * This entity represents a custom part state. + * If an organisation uses Part-DB and has its custom part states, this is useful. + * + * @extends AbstractPartsContainingDBElement + */ +#[ORM\Entity(repositoryClass: PartCustomStateRepository::class)] +#[ORM\Table('`part_custom_states`')] +#[ORM\Index(columns: ['name'], name: 'part_custom_state_name')] +#[ApiResource( + operations: [ + new Get(security: 'is_granted("read", object)'), + new GetCollection(security: 'is_granted("@part_custom_states.read")'), + new Post(securityPostDenormalize: 'is_granted("create", object)'), + new Patch(security: 'is_granted("edit", object)'), + new Delete(security: 'is_granted("delete", object)'), + ], + normalizationContext: ['groups' => ['part_custom_state:read', 'api:basic:read'], 'openapi_definition_name' => 'Read'], + denormalizationContext: ['groups' => ['part_custom_state:write', 'api:basic:write'], 'openapi_definition_name' => 'Write'], +)] +#[ApiFilter(PropertyFilter::class)] +#[ApiFilter(LikeFilter::class, properties: ["name"])] +#[ApiFilter(DateFilter::class, strategy: DateFilterInterface::EXCLUDE_NULL)] +#[ApiFilter(OrderFilter::class, properties: ['name', 'id', 'addedDate', 'lastModified'])] +class PartCustomState extends AbstractPartsContainingDBElement +{ + /** + * @var string The comment info for this element as markdown + */ + #[Groups(['part_custom_state:read', 'part_custom_state:write', 'full', 'import'])] + protected string $comment = ''; + + #[ORM\OneToMany(mappedBy: 'parent', targetEntity: self::class, cascade: ['persist'])] + #[ORM\OrderBy(['name' => Criteria::ASC])] + protected Collection $children; + + #[ORM\ManyToOne(targetEntity: self::class, inversedBy: 'children')] + #[ORM\JoinColumn(name: 'parent_id')] + #[Groups(['part_custom_state:read', 'part_custom_state:write'])] + #[ApiProperty(readableLink: false, writableLink: false)] + protected ?AbstractStructuralDBElement $parent = null; + + /** + * @var Collection + */ + #[Assert\Valid] + #[ORM\OneToMany(targetEntity: PartCustomStateAttachment::class, mappedBy: 'element', cascade: ['persist', 'remove'], orphanRemoval: true)] + #[ORM\OrderBy(['name' => Criteria::ASC])] + #[Groups(['part_custom_state:read', 'part_custom_state:write'])] + protected Collection $attachments; + + #[ORM\ManyToOne(targetEntity: PartCustomStateAttachment::class)] + #[ORM\JoinColumn(name: 'id_preview_attachment', onDelete: 'SET NULL')] + #[Groups(['part_custom_state:read', 'part_custom_state:write'])] + protected ?Attachment $master_picture_attachment = null; + + /** @var Collection + */ + #[Assert\Valid] + #[ORM\OneToMany(mappedBy: 'element', targetEntity: PartCustomStateParameter::class, cascade: ['persist', 'remove'], orphanRemoval: true)] + #[ORM\OrderBy(['name' => 'ASC'])] + #[Groups(['part_custom_state:read', 'part_custom_state:write'])] + protected Collection $parameters; + + #[Groups(['part_custom_state:read'])] + protected ?\DateTimeImmutable $addedDate = null; + #[Groups(['part_custom_state:read'])] + protected ?\DateTimeImmutable $lastModified = null; + + public function __construct() + { + parent::__construct(); + $this->children = new ArrayCollection(); + $this->attachments = new ArrayCollection(); + $this->parameters = new ArrayCollection(); + } +} diff --git a/src/Entity/Parts/PartTraits/AdvancedPropertyTrait.php b/src/Entity/Parts/PartTraits/AdvancedPropertyTrait.php index 230ba7b7..2cee7f1a 100644 --- a/src/Entity/Parts/PartTraits/AdvancedPropertyTrait.php +++ b/src/Entity/Parts/PartTraits/AdvancedPropertyTrait.php @@ -23,12 +23,14 @@ declare(strict_types=1); namespace App\Entity\Parts\PartTraits; use App\Entity\Parts\InfoProviderReference; +use App\Entity\Parts\PartCustomState; use Doctrine\DBAL\Types\Types; use App\Entity\Parts\Part; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\Validator\Constraints\Length; +use App\Validator\Constraints\UniquePartIpnConstraint; /** * Advanced properties of a part, not related to a more specific group. @@ -64,6 +66,7 @@ trait AdvancedPropertyTrait #[Groups(['extended', 'full', 'import', 'part:read', 'part:write'])] #[ORM\Column(type: Types::STRING, length: 100, unique: true, nullable: true)] #[Length(max: 100)] + #[UniquePartIpnConstraint] protected ?string $ipn = null; /** @@ -73,6 +76,14 @@ trait AdvancedPropertyTrait #[Groups(['full', 'part:read'])] protected InfoProviderReference $providerReference; + /** + * @var ?PartCustomState the custom state for the part + */ + #[Groups(['extended', 'full', 'import', 'part:read', 'part:write'])] + #[ORM\ManyToOne(targetEntity: PartCustomState::class)] + #[ORM\JoinColumn(name: 'id_part_custom_state')] + protected ?PartCustomState $partCustomState = null; + /** * Checks if this part is marked, for that it needs further review. */ @@ -180,7 +191,24 @@ trait AdvancedPropertyTrait return $this; } + /** + * Gets the custom part state for the part + * Returns null if no specific part state is set. + */ + public function getPartCustomState(): ?PartCustomState + { + return $this->partCustomState; + } + /** + * Sets the custom part state. + * + * @return $this + */ + public function setPartCustomState(?PartCustomState $partCustomState): self + { + $this->partCustomState = $partCustomState; - + return $this; + } } diff --git a/src/EventSubscriber/UserSystem/PartUniqueIpnSubscriber.php b/src/EventSubscriber/UserSystem/PartUniqueIpnSubscriber.php new file mode 100644 index 00000000..ecc25b4f --- /dev/null +++ b/src/EventSubscriber/UserSystem/PartUniqueIpnSubscriber.php @@ -0,0 +1,97 @@ +ipnSuggestSettings->autoAppendSuffix) { + return; + } + + $em = $args->getObjectManager(); + $uow = $em->getUnitOfWork(); + $meta = $em->getClassMetadata(Part::class); + + // Collect all IPNs already reserved in the current flush (so new entities do not collide with each other) + $reservedIpns = []; + + // Helper to assign a collision-free IPN for a Part entity + $ensureUnique = function (Part $part) use ($em, $uow, $meta, &$reservedIpns) { + $ipn = $part->getIpn(); + if ($ipn === null || $ipn === '') { + return; + } + + // Check against IPNs already reserved in the current flush (except itself) + $originalIpn = $ipn; + $candidate = $originalIpn; + $increment = 1; + + $conflicts = function (string $candidate) use ($em, $part, $reservedIpns) { + // Collision within the current flush session? + if (isset($reservedIpns[$candidate]) && $reservedIpns[$candidate] !== $part) { + return true; + } + // Collision with an existing DB row? + $existing = $em->getRepository(Part::class)->findOneBy(['ipn' => $candidate]); + return $existing !== null && $existing->getId() !== $part->getId(); + }; + + while ($conflicts($candidate)) { + $candidate = $originalIpn . '_' . $increment; + $increment++; + } + + if ($candidate !== $ipn) { + $before = $part->getIpn(); + $part->setIpn($candidate); + + // Recompute the change set so Doctrine writes the change + $uow->recomputeSingleEntityChangeSet($meta, $part); + $reservedIpns[$candidate] = $part; + + // If the old IPN was reserved already, clean it up + if ($before !== null && isset($reservedIpns[$before]) && $reservedIpns[$before] === $part) { + unset($reservedIpns[$before]); + } + } else { + // Candidate unchanged, but reserve it so subsequent entities see it + $reservedIpns[$candidate] = $part; + } + }; + + // 1) Iterate over new entities + foreach ($uow->getScheduledEntityInsertions() as $entity) { + if ($entity instanceof Part) { + $ensureUnique($entity); + } + } + + // 2) Iterate over updates (if IPN changed, ensure uniqueness again) + foreach ($uow->getScheduledEntityUpdates() as $entity) { + if ($entity instanceof Part) { + $ensureUnique($entity); + } + } + } +} diff --git a/src/Form/AdminPages/CategoryAdminForm.php b/src/Form/AdminPages/CategoryAdminForm.php index 44c1dede..489649ed 100644 --- a/src/Form/AdminPages/CategoryAdminForm.php +++ b/src/Form/AdminPages/CategoryAdminForm.php @@ -84,6 +84,17 @@ class CategoryAdminForm extends BaseEntityAdminForm 'disabled' => !$this->security->isGranted($is_new ? 'create' : 'edit', $entity), ]); + $builder->add('part_ipn_prefix', TextType::class, [ + 'required' => false, + 'empty_data' => '', + 'label' => 'category.edit.part_ipn_prefix', + 'help' => 'category.edit.part_ipn_prefix.help', + 'attr' => [ + 'placeholder' => 'category.edit.part_ipn_prefix.placeholder', + ], + 'disabled' => !$this->security->isGranted($is_new ? 'create' : 'edit', $entity), + ]); + $builder->add('default_description', RichTextEditorType::class, [ 'required' => false, 'empty_data' => '', diff --git a/src/Form/AdminPages/PartCustomStateAdminForm.php b/src/Form/AdminPages/PartCustomStateAdminForm.php new file mode 100644 index 00000000..b8bb2815 --- /dev/null +++ b/src/Form/AdminPages/PartCustomStateAdminForm.php @@ -0,0 +1,27 @@ +. + */ + +declare(strict_types=1); + +namespace App\Form\AdminPages; + +class PartCustomStateAdminForm extends BaseEntityAdminForm +{ +} diff --git a/src/Form/Filters/LogFilterType.php b/src/Form/Filters/LogFilterType.php index c973ad0f..30abf723 100644 --- a/src/Form/Filters/LogFilterType.php +++ b/src/Form/Filters/LogFilterType.php @@ -130,6 +130,7 @@ class LogFilterType extends AbstractType LogTargetType::PART_ASSOCIATION => 'part_association.label', LogTargetType::BULK_INFO_PROVIDER_IMPORT_JOB => 'bulk_info_provider_import_job.label', LogTargetType::BULK_INFO_PROVIDER_IMPORT_JOB_PART => 'bulk_info_provider_import_job_part.label', + LogTargetType::PART_CUSTOM_STATE => 'part_custom_state.label', }, ]); diff --git a/src/Form/Filters/PartFilterType.php b/src/Form/Filters/PartFilterType.php index 871f9b07..e101c635 100644 --- a/src/Form/Filters/PartFilterType.php +++ b/src/Form/Filters/PartFilterType.php @@ -32,6 +32,7 @@ use App\Entity\Parts\Category; use App\Entity\Parts\Footprint; use App\Entity\Parts\Manufacturer; use App\Entity\Parts\MeasurementUnit; +use App\Entity\Parts\PartCustomState; use App\Entity\Parts\StorageLocation; use App\Entity\Parts\Supplier; use App\Entity\ProjectSystem\Project; @@ -139,6 +140,11 @@ class PartFilterType extends AbstractType 'entity_class' => MeasurementUnit::class ]); + $builder->add('partCustomState', StructuralEntityConstraintType::class, [ + 'label' => 'part.edit.partCustomState', + 'entity_class' => PartCustomState::class + ]); + $builder->add('lastModified', DateTimeConstraintType::class, [ 'label' => 'lastModified' ]); diff --git a/src/Form/Part/PartBaseType.php b/src/Form/Part/PartBaseType.php index 0bd3d0e3..b8276589 100644 --- a/src/Form/Part/PartBaseType.php +++ b/src/Form/Part/PartBaseType.php @@ -30,6 +30,7 @@ use App\Entity\Parts\Manufacturer; use App\Entity\Parts\ManufacturingStatus; use App\Entity\Parts\MeasurementUnit; use App\Entity\Parts\Part; +use App\Entity\Parts\PartCustomState; use App\Entity\PriceInformations\Orderdetail; use App\Form\AttachmentFormType; use App\Form\ParameterType; @@ -41,6 +42,7 @@ use App\Form\Type\StructuralEntityType; use App\Services\InfoProviderSystem\DTOs\PartDetailDTO; use App\Services\LogSystem\EventCommentNeededHelper; use App\Services\LogSystem\EventCommentType; +use App\Settings\MiscSettings\IpnSuggestSettings; use Symfony\Bundle\SecurityBundle\Security; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\CheckboxType; @@ -56,8 +58,12 @@ use Symfony\Component\Routing\Generator\UrlGeneratorInterface; class PartBaseType extends AbstractType { - public function __construct(protected Security $security, protected UrlGeneratorInterface $urlGenerator, protected EventCommentNeededHelper $event_comment_needed_helper) - { + public function __construct( + protected Security $security, + protected UrlGeneratorInterface $urlGenerator, + protected EventCommentNeededHelper $event_comment_needed_helper, + protected IpnSuggestSettings $ipnSuggestSettings, + ) { } public function buildForm(FormBuilderInterface $builder, array $options): void @@ -69,6 +75,39 @@ class PartBaseType extends AbstractType /** @var PartDetailDTO|null $dto */ $dto = $options['info_provider_dto']; + $descriptionAttr = [ + 'placeholder' => 'part.edit.description.placeholder', + 'rows' => 2, + ]; + + if ($this->ipnSuggestSettings->useDuplicateDescription) { + // Only add attribute when duplicate description feature is enabled + $descriptionAttr['data-ipn-suggestion'] = 'descriptionField'; + } + + $ipnAttr = [ + 'class' => 'ipn-suggestion-field', + 'data-elements--ipn-suggestion-target' => 'input', + 'autocomplete' => 'off', + ]; + + if ($this->ipnSuggestSettings->regex !== null && $this->ipnSuggestSettings->regex !== '') { + $ipnAttr['pattern'] = $this->ipnSuggestSettings->regex; + $ipnAttr['placeholder'] = $this->ipnSuggestSettings->regex; + $ipnAttr['title'] = $this->ipnSuggestSettings->regexHelp; + } + + $ipnOptions = [ + 'required' => false, + 'empty_data' => null, + 'label' => 'part.edit.ipn', + 'attr' => $ipnAttr, + ]; + + if (isset($ipnAttr['pattern']) && $this->ipnSuggestSettings->regexHelp !== null && $this->ipnSuggestSettings->regexHelp !== '') { + $ipnOptions['help'] = $this->ipnSuggestSettings->regexHelp; + } + //Common section $builder ->add('name', TextType::class, [ @@ -83,10 +122,7 @@ class PartBaseType extends AbstractType 'empty_data' => '', 'label' => 'part.edit.description', 'mode' => 'markdown-single_line', - 'attr' => [ - 'placeholder' => 'part.edit.description.placeholder', - 'rows' => 2, - ], + 'attr' => $descriptionAttr, ]) ->add('minAmount', SIUnitType::class, [ 'attr' => [ @@ -104,6 +140,9 @@ class PartBaseType extends AbstractType 'disable_not_selectable' => true, //Do not require category for new parts, so that the user must select the category by hand and cannot forget it (the requirement is handled by the constraint in the entity) 'required' => !$new_part, + 'attr' => [ + 'data-ipn-suggestion' => 'categoryField', + ] ]) ->add('footprint', StructuralEntityType::class, [ 'class' => Footprint::class, @@ -171,11 +210,13 @@ class PartBaseType extends AbstractType 'disable_not_selectable' => true, 'label' => 'part.edit.partUnit', ]) - ->add('ipn', TextType::class, [ + ->add('partCustomState', StructuralEntityType::class, [ + 'class' => PartCustomState::class, 'required' => false, - 'empty_data' => null, - 'label' => 'part.edit.ipn', - ]); + 'disable_not_selectable' => true, + 'label' => 'part.edit.partCustomState', + ]) + ->add('ipn', TextType::class, $ipnOptions); //Comment section $builder->add('comment', RichTextEditorType::class, [ diff --git a/src/Repository/PartRepository.php b/src/Repository/PartRepository.php index edccd74b..3c83001a 100644 --- a/src/Repository/PartRepository.php +++ b/src/Repository/PartRepository.php @@ -22,17 +22,35 @@ declare(strict_types=1); namespace App\Repository; +use App\Entity\Parts\Category; use App\Entity\Parts\Part; use App\Entity\Parts\PartLot; +use App\Settings\MiscSettings\IpnSuggestSettings; use Doctrine\ORM\NonUniqueResultException; use Doctrine\ORM\NoResultException; use Doctrine\ORM\QueryBuilder; +use Symfony\Contracts\Translation\TranslatorInterface; +use Doctrine\ORM\EntityManagerInterface; /** * @extends NamedDBElementRepository */ class PartRepository extends NamedDBElementRepository { + private TranslatorInterface $translator; + private IpnSuggestSettings $ipnSuggestSettings; + + public function __construct( + EntityManagerInterface $em, + TranslatorInterface $translator, + IpnSuggestSettings $ipnSuggestSettings, + ) { + parent::__construct($em, $em->getClassMetadata(Part::class)); + + $this->translator = $translator; + $this->ipnSuggestSettings = $ipnSuggestSettings; + } + /** * Gets the summed up instock of all parts (only parts without a measurement unit). * @@ -84,8 +102,7 @@ class PartRepository extends NamedDBElementRepository ->where('ILIKE(part.name, :query) = TRUE') ->orWhere('ILIKE(part.description, :query) = TRUE') ->orWhere('ILIKE(category.name, :query) = TRUE') - ->orWhere('ILIKE(footprint.name, :query) = TRUE') - ; + ->orWhere('ILIKE(footprint.name, :query) = TRUE'); $qb->setParameter('query', '%'.$query.'%'); @@ -94,4 +111,240 @@ class PartRepository extends NamedDBElementRepository return $qb->getQuery()->getResult(); } + + /** + * Provides IPN (Internal Part Number) suggestions for a given part based on its category, description, + * and configured autocomplete digit length. + * + * This function generates suggestions for common prefixes and incremented prefixes based on + * the part's current category and its hierarchy. If the part is unsaved, a default "n.a." prefix is returned. + * + * @param Part $part The part for which autocomplete suggestions are generated. + * @param string $description description to assist in generating suggestions. + * @param int $suggestPartDigits The number of digits used in autocomplete increments. + * + * @return array An associative array containing the following keys: + * - 'commonPrefixes': List of common prefixes found for the part. + * - 'prefixesPartIncrement': Increments for the generated prefixes, including hierarchical prefixes. + */ + public function autoCompleteIpn(Part $part, string $description, int $suggestPartDigits): array + { + $category = $part->getCategory(); + $ipnSuggestions = ['commonPrefixes' => [], 'prefixesPartIncrement' => []]; + + if (strlen($description) > 150) { + $description = substr($description, 0, 150); + } + + if ($description !== '' && $this->ipnSuggestSettings->useDuplicateDescription) { + // Check if the description is already used in another part, + + $suggestionByDescription = $this->getIpnSuggestByDescription($description); + + if ($suggestionByDescription !== null && $suggestionByDescription !== $part->getIpn() && $part->getIpn() !== null && $part->getIpn() !== '') { + $ipnSuggestions['prefixesPartIncrement'][] = [ + 'title' => $part->getIpn(), + 'description' => $this->translator->trans('part.edit.tab.advanced.ipn.prefix.description.current-increment') + ]; + } + + if ($suggestionByDescription !== null) { + $ipnSuggestions['prefixesPartIncrement'][] = [ + 'title' => $suggestionByDescription, + 'description' => $this->translator->trans('part.edit.tab.advanced.ipn.prefix.description.increment') + ]; + } + } + + // Validate the category and ensure it's an instance of Category + if ($category instanceof Category) { + $currentPath = $category->getPartIpnPrefix(); + $directIpnPrefixEmpty = $category->getPartIpnPrefix() === ''; + $currentPath = $currentPath === '' ? 'n.a.' : $currentPath; + + $increment = $this->generateNextPossiblePartIncrement($currentPath, $part, $suggestPartDigits); + + $ipnSuggestions['commonPrefixes'][] = [ + 'title' => $currentPath . '-', + 'description' => $directIpnPrefixEmpty ? $this->translator->trans('part.edit.tab.advanced.ipn.prefix_empty.direct_category', ['%name%' => $category->getName()]) : $this->translator->trans('part.edit.tab.advanced.ipn.prefix.direct_category') + ]; + + $ipnSuggestions['prefixesPartIncrement'][] = [ + 'title' => $currentPath . '-' . $increment, + 'description' => $directIpnPrefixEmpty ? $this->translator->trans('part.edit.tab.advanced.ipn.prefix_empty.direct_category', ['%name%' => $category->getName()]) : $this->translator->trans('part.edit.tab.advanced.ipn.prefix.direct_category.increment') + ]; + + // Process parent categories + $parentCategory = $category->getParent(); + + while ($parentCategory instanceof Category) { + // Prepend the parent category's prefix to the current path + $currentPath = $parentCategory->getPartIpnPrefix() . '-' . $currentPath; + $currentPath = $parentCategory->getPartIpnPrefix() === '' ? 'n.a.-' . $currentPath : $currentPath; + + $ipnSuggestions['commonPrefixes'][] = [ + 'title' => $currentPath . '-', + 'description' => $this->translator->trans('part.edit.tab.advanced.ipn.prefix.hierarchical.no_increment') + ]; + + $increment = $this->generateNextPossiblePartIncrement($currentPath, $part, $suggestPartDigits); + + $ipnSuggestions['prefixesPartIncrement'][] = [ + 'title' => $currentPath . '-' . $increment, + 'description' => $this->translator->trans('part.edit.tab.advanced.ipn.prefix.hierarchical.increment') + ]; + + // Move to the next parent category + $parentCategory = $parentCategory->getParent(); + } + } elseif ($part->getID() === null) { + $ipnSuggestions['commonPrefixes'][] = [ + 'title' => 'n.a.', + 'description' => $this->translator->trans('part.edit.tab.advanced.ipn.prefix.not_saved') + ]; + } + + return $ipnSuggestions; + } + + /** + * Suggests the next IPN (Internal Part Number) based on the provided part description. + * + * Searches for parts with similar descriptions and retrieves their existing IPNs to calculate the next suggestion. + * Returns null if the description is empty or no suggestion can be generated. + * + * @param string $description The part description to search for. + * + * @return string|null The suggested IPN, or null if no suggestion is possible. + * + * @throws NonUniqueResultException + */ + public function getIpnSuggestByDescription(string $description): ?string + { + if ($description === '') { + return null; + } + + $qb = $this->createQueryBuilder('part'); + + $qb->select('part') + ->where('part.description LIKE :descriptionPattern') + ->setParameter('descriptionPattern', $description.'%') + ->orderBy('part.id', 'ASC'); + + $partsBySameDescription = $qb->getQuery()->getResult(); + $givenIpnsWithSameDescription = []; + + foreach ($partsBySameDescription as $part) { + if ($part->getIpn() === null || $part->getIpn() === '') { + continue; + } + + $givenIpnsWithSameDescription[] = $part->getIpn(); + } + + return $this->getNextIpnSuggestion($givenIpnsWithSameDescription); + } + + /** + * Generates the next possible increment for a part within a given category, while ensuring uniqueness. + * + * This method calculates the next available increment for a part's identifier (`ipn`) based on the current path + * and the number of digits specified for the autocomplete feature. It ensures that the generated identifier + * aligns with the expected length and does not conflict with already existing identifiers in the same category. + * + * @param string $currentPath The base path or prefix for the part's identifier. + * @param Part $currentPart The part entity for which the increment is being generated. + * @param int $suggestPartDigits The number of digits reserved for the increment. + * + * @return string The next possible increment as a zero-padded string. + * + * @throws NonUniqueResultException If the query returns non-unique results. + * @throws NoResultException If the query fails to return a result. + */ + private function generateNextPossiblePartIncrement(string $currentPath, Part $currentPart, int $suggestPartDigits): string + { + $qb = $this->createQueryBuilder('part'); + + $expectedLength = strlen($currentPath) + 1 + $suggestPartDigits; // Path + '-' + $suggestPartDigits digits + + // Fetch all parts in the given category, sorted by their ID in ascending order + $qb->select('part') + ->where('part.ipn LIKE :ipnPattern') + ->andWhere('LENGTH(part.ipn) = :expectedLength') + ->setParameter('ipnPattern', $currentPath . '%') + ->setParameter('expectedLength', $expectedLength) + ->orderBy('part.id', 'ASC'); + + $parts = $qb->getQuery()->getResult(); + + // Collect all used increments in the category + $usedIncrements = []; + foreach ($parts as $part) { + if ($part->getIpn() === null || $part->getIpn() === '') { + continue; + } + + if ($part->getId() === $currentPart->getId() && $currentPart->getID() !== null) { + // Extract and return the current part's increment directly + $incrementPart = substr($part->getIpn(), -$suggestPartDigits); + if (is_numeric($incrementPart)) { + return str_pad((string) $incrementPart, $suggestPartDigits, '0', STR_PAD_LEFT); + } + } + + // Extract last $autocompletePartDigits digits for possible available part increment + $incrementPart = substr($part->getIpn(), -$suggestPartDigits); + if (is_numeric($incrementPart)) { + $usedIncrements[] = (int) $incrementPart; + } + + } + + // Generate the next free $autocompletePartDigits-digit increment + $nextIncrement = 1; // Start at the beginning + + while (in_array($nextIncrement, $usedIncrements, true)) { + $nextIncrement++; + } + + return str_pad((string) $nextIncrement, $suggestPartDigits, '0', STR_PAD_LEFT); + } + + /** + * Generates the next IPN suggestion based on the maximum numeric suffix found in the given IPNs. + * + * The new IPN is constructed using the base format of the first provided IPN, + * incremented by the next free numeric suffix. If no base IPNs are found, + * returns null. + * + * @param array $givenIpns List of IPNs to analyze. + * + * @return string|null The next suggested IPN, or null if no base IPNs can be derived. + */ + private function getNextIpnSuggestion(array $givenIpns): ?string { + $maxSuffix = 0; + + foreach ($givenIpns as $ipn) { + // Check whether the IPN contains a suffix "_ " + if (preg_match('/_(\d+)$/', $ipn, $matches)) { + $suffix = (int)$matches[1]; + if ($suffix > $maxSuffix) { + $maxSuffix = $suffix; // Höchste Nummer speichern + } + } + } + + // Find the basic format (the IPN without suffix) from the first IPN + $baseIpn = $givenIpns[0] ?? ''; + $baseIpn = preg_replace('/_\d+$/', '', $baseIpn); // Remove existing "_ " + + if ($baseIpn === '') { + return null; + } + + // Generate next free possible IPN + return $baseIpn . '_' . ($maxSuffix + 1); + } + } diff --git a/src/Repository/Parts/PartCustomStateRepository.php b/src/Repository/Parts/PartCustomStateRepository.php new file mode 100644 index 00000000..d66221a2 --- /dev/null +++ b/src/Repository/Parts/PartCustomStateRepository.php @@ -0,0 +1,48 @@ +. + */ +namespace App\Repository\Parts; + +use App\Entity\Parts\PartCustomState; +use App\Repository\AbstractPartsContainingRepository; +use InvalidArgumentException; + +class PartCustomStateRepository extends AbstractPartsContainingRepository +{ + public function getParts(object $element, string $nameOrderDirection = "ASC"): array + { + if (!$element instanceof PartCustomState) { + throw new InvalidArgumentException('$element must be an PartCustomState!'); + } + + return $this->getPartsByField($element, $nameOrderDirection, 'partUnit'); + } + + public function getPartsCount(object $element): int + { + if (!$element instanceof PartCustomState) { + throw new InvalidArgumentException('$element must be an PartCustomState!'); + } + + return $this->getPartsCountByField($element, 'partUnit'); + } +} diff --git a/src/Security/Voter/AttachmentVoter.php b/src/Security/Voter/AttachmentVoter.php index bd7ae4df..df3d73a7 100644 --- a/src/Security/Voter/AttachmentVoter.php +++ b/src/Security/Voter/AttachmentVoter.php @@ -22,6 +22,7 @@ declare(strict_types=1); namespace App\Security\Voter; +use App\Entity\Attachments\PartCustomStateAttachment; use App\Services\UserSystem\VoterHelper; use Symfony\Bundle\SecurityBundle\Security; use App\Entity\Attachments\AttachmentContainingDBElement; @@ -99,6 +100,8 @@ final class AttachmentVoter extends Voter $param = 'measurement_units'; } elseif (is_a($subject, PartAttachment::class, true)) { $param = 'parts'; + } elseif (is_a($subject, PartCustomStateAttachment::class, true)) { + $param = 'part_custom_states'; } elseif (is_a($subject, StorageLocationAttachment::class, true)) { $param = 'storelocations'; } elseif (is_a($subject, SupplierAttachment::class, true)) { diff --git a/src/Security/Voter/ParameterVoter.php b/src/Security/Voter/ParameterVoter.php index f59bdeaf..5dc30ea2 100644 --- a/src/Security/Voter/ParameterVoter.php +++ b/src/Security/Voter/ParameterVoter.php @@ -22,6 +22,7 @@ declare(strict_types=1); */ namespace App\Security\Voter; +use App\Entity\Parameters\PartCustomStateParameter; use App\Services\UserSystem\VoterHelper; use Symfony\Bundle\SecurityBundle\Security; use App\Entity\Base\AbstractDBElement; @@ -97,6 +98,8 @@ final class ParameterVoter extends Voter $param = 'measurement_units'; } elseif (is_a($subject, PartParameter::class, true)) { $param = 'parts'; + } elseif (is_a($subject, PartCustomStateParameter::class, true)) { + $param = 'part_custom_states'; } elseif (is_a($subject, StorageLocationParameter::class, true)) { $param = 'storelocations'; } elseif (is_a($subject, SupplierParameter::class, true)) { diff --git a/src/Security/Voter/StructureVoter.php b/src/Security/Voter/StructureVoter.php index ad0299a7..16d38e05 100644 --- a/src/Security/Voter/StructureVoter.php +++ b/src/Security/Voter/StructureVoter.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace App\Security\Voter; use App\Entity\Attachments\AttachmentType; +use App\Entity\Parts\PartCustomState; use App\Entity\ProjectSystem\Project; use App\Entity\Parts\Category; use App\Entity\Parts\Footprint; @@ -53,6 +54,7 @@ final class StructureVoter extends Voter Supplier::class => 'suppliers', Currency::class => 'currencies', MeasurementUnit::class => 'measurement_units', + PartCustomState::class => 'part_custom_states', ]; public function __construct(private readonly VoterHelper $helper) diff --git a/src/Services/Attachments/AttachmentSubmitHandler.php b/src/Services/Attachments/AttachmentSubmitHandler.php index 9fbc3fe3..c7e69257 100644 --- a/src/Services/Attachments/AttachmentSubmitHandler.php +++ b/src/Services/Attachments/AttachmentSubmitHandler.php @@ -30,6 +30,7 @@ use App\Entity\Attachments\AttachmentUpload; use App\Entity\Attachments\CategoryAttachment; use App\Entity\Attachments\CurrencyAttachment; use App\Entity\Attachments\LabelAttachment; +use App\Entity\Attachments\PartCustomStateAttachment; use App\Entity\Attachments\ProjectAttachment; use App\Entity\Attachments\FootprintAttachment; use App\Entity\Attachments\GroupAttachment; @@ -80,6 +81,7 @@ class AttachmentSubmitHandler //The mapping used to determine which folder will be used for an attachment type $this->folder_mapping = [ PartAttachment::class => 'part', + PartCustomStateAttachment::class => 'part_custom_state', AttachmentTypeAttachment::class => 'attachment_type', CategoryAttachment::class => 'category', CurrencyAttachment::class => 'currency', diff --git a/src/Services/Attachments/PartPreviewGenerator.php b/src/Services/Attachments/PartPreviewGenerator.php index ba6e5db0..9aedba74 100644 --- a/src/Services/Attachments/PartPreviewGenerator.php +++ b/src/Services/Attachments/PartPreviewGenerator.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace App\Services\Attachments; use App\Entity\Parts\Footprint; +use App\Entity\Parts\PartCustomState; use App\Entity\ProjectSystem\Project; use App\Entity\Parts\Category; use App\Entity\Parts\StorageLocation; diff --git a/src/Services/EDA/KiCadHelper.php b/src/Services/EDA/KiCadHelper.php index 75c2cc34..4b7c5e5a 100644 --- a/src/Services/EDA/KiCadHelper.php +++ b/src/Services/EDA/KiCadHelper.php @@ -233,6 +233,10 @@ class KiCadHelper } $result["fields"]["Part-DB Unit"] = $this->createField($unit); } + if ($part->getPartCustomState() !== null) { + $customState = $part->getPartCustomState()->getName(); + $result["fields"]["Part-DB Custom state"] = $this->createField($customState); + } if ($part->getMass()) { $result["fields"]["Mass"] = $this->createField($part->getMass() . ' g'); } diff --git a/src/Services/ElementTypeNameGenerator.php b/src/Services/ElementTypeNameGenerator.php index 326707b7..deb4cf30 100644 --- a/src/Services/ElementTypeNameGenerator.php +++ b/src/Services/ElementTypeNameGenerator.php @@ -37,6 +37,7 @@ use App\Entity\Parts\Manufacturer; use App\Entity\Parts\MeasurementUnit; use App\Entity\Parts\Part; use App\Entity\Parts\PartAssociation; +use App\Entity\Parts\PartCustomState; use App\Entity\Parts\PartLot; use App\Entity\Parts\StorageLocation; use App\Entity\Parts\Supplier; @@ -83,6 +84,7 @@ class ElementTypeNameGenerator PartAssociation::class => $this->translator->trans('part_association.label'), BulkInfoProviderImportJob::class => $this->translator->trans('bulk_info_provider_import_job.label'), BulkInfoProviderImportJobPart::class => $this->translator->trans('bulk_info_provider_import_job_part.label'), + PartCustomState::class => $this->translator->trans('part_custom_state.label'), ]; } diff --git a/src/Services/EntityMergers/Mergers/PartMerger.php b/src/Services/EntityMergers/Mergers/PartMerger.php index 01b53e25..d1f5c137 100644 --- a/src/Services/EntityMergers/Mergers/PartMerger.php +++ b/src/Services/EntityMergers/Mergers/PartMerger.php @@ -65,6 +65,7 @@ class PartMerger implements EntityMergerInterface $this->useOtherValueIfNotNull($target, $other, 'footprint'); $this->useOtherValueIfNotNull($target, $other, 'category'); $this->useOtherValueIfNotNull($target, $other, 'partUnit'); + $this->useOtherValueIfNotNull($target, $other, 'partCustomState'); //We assume that the higher value is the correct one for minimum instock $this->useLargerValue($target, $other, 'minamount'); diff --git a/src/Services/EntityURLGenerator.php b/src/Services/EntityURLGenerator.php index 78db06f0..91e271cc 100644 --- a/src/Services/EntityURLGenerator.php +++ b/src/Services/EntityURLGenerator.php @@ -27,6 +27,7 @@ use App\Entity\Attachments\AttachmentType; use App\Entity\Attachments\PartAttachment; use App\Entity\Base\AbstractDBElement; use App\Entity\Parameters\PartParameter; +use App\Entity\Parts\PartCustomState; use App\Entity\ProjectSystem\Project; use App\Entity\LabelSystem\LabelProfile; use App\Entity\Parts\Category; @@ -107,6 +108,7 @@ class EntityURLGenerator MeasurementUnit::class => 'measurement_unit_edit', Group::class => 'group_edit', LabelProfile::class => 'label_profile_edit', + PartCustomState::class => 'part_custom_state_edit', ]; try { @@ -213,6 +215,7 @@ class EntityURLGenerator MeasurementUnit::class => 'measurement_unit_edit', Group::class => 'group_edit', LabelProfile::class => 'label_profile_edit', + PartCustomState::class => 'part_custom_state_edit', ]; return $this->urlGenerator->generate($this->mapToController($map, $entity), ['id' => $entity->getID()]); @@ -243,6 +246,7 @@ class EntityURLGenerator MeasurementUnit::class => 'measurement_unit_edit', Group::class => 'group_edit', LabelProfile::class => 'label_profile_edit', + PartCustomState::class => 'part_custom_state_edit', ]; return $this->urlGenerator->generate($this->mapToController($map, $entity), ['id' => $entity->getID()]); @@ -274,6 +278,7 @@ class EntityURLGenerator MeasurementUnit::class => 'measurement_unit_new', Group::class => 'group_new', LabelProfile::class => 'label_profile_new', + PartCustomState::class => 'part_custom_state_new', ]; return $this->urlGenerator->generate($this->mapToController($map, $entity)); @@ -305,6 +310,7 @@ class EntityURLGenerator MeasurementUnit::class => 'measurement_unit_clone', Group::class => 'group_clone', LabelProfile::class => 'label_profile_clone', + PartCustomState::class => 'part_custom_state_clone', ]; return $this->urlGenerator->generate($this->mapToController($map, $entity), ['id' => $entity->getID()]); @@ -350,6 +356,7 @@ class EntityURLGenerator MeasurementUnit::class => 'measurement_unit_delete', Group::class => 'group_delete', LabelProfile::class => 'label_profile_delete', + PartCustomState::class => 'part_custom_state_delete', ]; return $this->urlGenerator->generate($this->mapToController($map, $entity), ['id' => $entity->getID()]); diff --git a/src/Services/ImportExportSystem/PartKeeprImporter/PKDatastructureImporter.php b/src/Services/ImportExportSystem/PartKeeprImporter/PKDatastructureImporter.php index 1f842c23..9e674f05 100644 --- a/src/Services/ImportExportSystem/PartKeeprImporter/PKDatastructureImporter.php +++ b/src/Services/ImportExportSystem/PartKeeprImporter/PKDatastructureImporter.php @@ -29,6 +29,7 @@ use App\Entity\Parts\Category; use App\Entity\Parts\Footprint; use App\Entity\Parts\Manufacturer; use App\Entity\Parts\MeasurementUnit; +use App\Entity\Parts\PartCustomState; use App\Entity\Parts\StorageLocation; use App\Entity\Parts\Supplier; use Doctrine\ORM\EntityManagerInterface; @@ -148,6 +149,26 @@ class PKDatastructureImporter return is_countable($partunit_data) ? count($partunit_data) : 0; } + public function importPartCustomStates(array $data): int + { + if (!isset($data['partcustomstate'])) { + throw new \RuntimeException('$data must contain a "partcustomstate" key!'); + } + + $partCustomStateData = $data['partcustomstate']; + foreach ($partCustomStateData as $partCustomState) { + $customState = new PartCustomState(); + $customState->setName($partCustomState['name']); + + $this->setIDOfEntity($customState, $partCustomState['id']); + $this->em->persist($customState); + } + + $this->em->flush(); + + return is_countable($partCustomStateData) ? count($partCustomStateData) : 0; + } + public function importCategories(array $data): int { if (!isset($data['partcategory'])) { diff --git a/src/Services/ImportExportSystem/PartKeeprImporter/PKPartImporter.php b/src/Services/ImportExportSystem/PartKeeprImporter/PKPartImporter.php index 80c2dbf7..ab06a134 100644 --- a/src/Services/ImportExportSystem/PartKeeprImporter/PKPartImporter.php +++ b/src/Services/ImportExportSystem/PartKeeprImporter/PKPartImporter.php @@ -91,6 +91,8 @@ class PKPartImporter $this->setAssociationField($entity, 'partUnit', MeasurementUnit::class, $part['partUnit_id']); } + $this->setAssociationField($entity, 'partCustomState', MeasurementUnit::class, $part['partCustomState_id']); + //Create a part lot to store the stock level and location $lot = new PartLot(); $lot->setAmount((float) ($part['stockLevel'] ?? 0)); diff --git a/src/Services/LabelSystem/SandboxedTwigFactory.php b/src/Services/LabelSystem/SandboxedTwigFactory.php index d6ea6968..d5e09fa5 100644 --- a/src/Services/LabelSystem/SandboxedTwigFactory.php +++ b/src/Services/LabelSystem/SandboxedTwigFactory.php @@ -133,7 +133,7 @@ final class SandboxedTwigFactory Supplier::class => ['getShippingCosts', 'getDefaultCurrency'], Part::class => ['isNeedsReview', 'getTags', 'getMass', 'getIpn', 'getProviderReference', 'getDescription', 'getComment', 'isFavorite', 'getCategory', 'getFootprint', - 'getPartLots', 'getPartUnit', 'useFloatAmount', 'getMinAmount', 'getAmountSum', 'isNotEnoughInstock', 'isAmountUnknown', 'getExpiredAmountSum', + 'getPartLots', 'getPartUnit', 'getPartCustomState', 'useFloatAmount', 'getMinAmount', 'getAmountSum', 'isNotEnoughInstock', 'isAmountUnknown', 'getExpiredAmountSum', 'getManufacturerProductUrl', 'getCustomProductURL', 'getManufacturingStatus', 'getManufacturer', 'getManufacturerProductNumber', 'getOrderdetails', 'isObsolete', 'getParameters', 'getGroupedParameters', diff --git a/src/Services/Trees/ToolsTreeBuilder.php b/src/Services/Trees/ToolsTreeBuilder.php index 036797f6..56064ba4 100644 --- a/src/Services/Trees/ToolsTreeBuilder.php +++ b/src/Services/Trees/ToolsTreeBuilder.php @@ -29,6 +29,7 @@ use App\Entity\Parts\Footprint; use App\Entity\Parts\Manufacturer; use App\Entity\Parts\MeasurementUnit; use App\Entity\Parts\Part; +use App\Entity\Parts\PartCustomState; use App\Entity\Parts\StorageLocation; use App\Entity\Parts\Supplier; use App\Entity\PriceInformations\Currency; @@ -217,6 +218,12 @@ class ToolsTreeBuilder $this->urlGenerator->generate('label_profile_new') ))->setIcon('fa-fw fa-treeview fa-solid fa-qrcode'); } + if ($this->security->isGranted('read', new PartCustomState())) { + $nodes[] = (new TreeViewNode( + $this->translator->trans('tree.tools.edit.part_custom_state'), + $this->urlGenerator->generate('part_custom_state_new') + ))->setIcon('fa-fw fa-treeview fa-solid fa-tools'); + } if ($this->security->isGranted('create', new Part())) { $nodes[] = (new TreeViewNode( $this->translator->trans('tree.tools.edit.part'), diff --git a/src/Services/UserSystem/PermissionPresetsHelper.php b/src/Services/UserSystem/PermissionPresetsHelper.php index 554da8b3..a3ed01b8 100644 --- a/src/Services/UserSystem/PermissionPresetsHelper.php +++ b/src/Services/UserSystem/PermissionPresetsHelper.php @@ -102,6 +102,7 @@ class PermissionPresetsHelper $this->permissionResolver->setAllOperationsOfPermission($perm_holder, 'attachment_types', PermissionData::ALLOW); $this->permissionResolver->setAllOperationsOfPermission($perm_holder, 'currencies', PermissionData::ALLOW); $this->permissionResolver->setAllOperationsOfPermission($perm_holder, 'measurement_units', PermissionData::ALLOW); + $this->permissionResolver->setAllOperationsOfPermission($perm_holder, 'part_custom_states', PermissionData::ALLOW); $this->permissionResolver->setAllOperationsOfPermission($perm_holder, 'suppliers', PermissionData::ALLOW); $this->permissionResolver->setAllOperationsOfPermission($perm_holder, 'projects', PermissionData::ALLOW); @@ -131,6 +132,7 @@ class PermissionPresetsHelper $this->permissionResolver->setAllOperationsOfPermissionExcept($permHolder, 'attachment_types', PermissionData::ALLOW, ['import']); $this->permissionResolver->setAllOperationsOfPermissionExcept($permHolder, 'currencies', PermissionData::ALLOW, ['import']); $this->permissionResolver->setAllOperationsOfPermissionExcept($permHolder, 'measurement_units', PermissionData::ALLOW, ['import']); + $this->permissionResolver->setAllOperationsOfPermissionExcept($permHolder, 'part_custom_states', PermissionData::ALLOW, ['import']); $this->permissionResolver->setAllOperationsOfPermissionExcept($permHolder, 'suppliers', PermissionData::ALLOW, ['import']); $this->permissionResolver->setAllOperationsOfPermissionExcept($permHolder, 'projects', PermissionData::ALLOW, ['import']); diff --git a/src/Settings/BehaviorSettings/PartTableColumns.php b/src/Settings/BehaviorSettings/PartTableColumns.php index eea6ad86..c025c952 100644 --- a/src/Settings/BehaviorSettings/PartTableColumns.php +++ b/src/Settings/BehaviorSettings/PartTableColumns.php @@ -46,6 +46,7 @@ enum PartTableColumns : string implements TranslatableInterface case FAVORITE = "favorite"; case MANUFACTURING_STATUS = "manufacturing_status"; case MPN = "manufacturer_product_number"; + case CUSTOM_PART_STATE = 'partCustomState'; case MASS = "mass"; case TAGS = "tags"; case ATTACHMENTS = "attachments"; @@ -63,4 +64,4 @@ enum PartTableColumns : string implements TranslatableInterface return $translator->trans($key, locale: $locale); } -} \ No newline at end of file +} diff --git a/src/Settings/BehaviorSettings/TableSettings.php b/src/Settings/BehaviorSettings/TableSettings.php index b6964876..b3421e41 100644 --- a/src/Settings/BehaviorSettings/TableSettings.php +++ b/src/Settings/BehaviorSettings/TableSettings.php @@ -68,7 +68,7 @@ class TableSettings #[Assert\All([new Assert\Type(PartTableColumns::class)])] public array $partsDefaultColumns = [PartTableColumns::NAME, PartTableColumns::DESCRIPTION, PartTableColumns::CATEGORY, PartTableColumns::FOOTPRINT, PartTableColumns::MANUFACTURER, - PartTableColumns::LOCATION, PartTableColumns::AMOUNT]; + PartTableColumns::LOCATION, PartTableColumns::AMOUNT, PartTableColumns::CUSTOM_PART_STATE]; #[SettingsParameter(label: new TM("settings.behavior.table.preview_image_min_width"), formOptions: ['attr' => ['min' => 1, 'max' => 100]], diff --git a/src/Settings/MiscSettings/IpnSuggestSettings.php b/src/Settings/MiscSettings/IpnSuggestSettings.php new file mode 100644 index 00000000..891b885c --- /dev/null +++ b/src/Settings/MiscSettings/IpnSuggestSettings.php @@ -0,0 +1,80 @@ +. + */ + +declare(strict_types=1); + + +namespace App\Settings\MiscSettings; + +use App\Settings\SettingsIcon; +use Jbtronics\SettingsBundle\Metadata\EnvVarMode; +use Jbtronics\SettingsBundle\ParameterTypes\StringType; +use Jbtronics\SettingsBundle\Settings\Settings; +use Jbtronics\SettingsBundle\Settings\SettingsParameter; +use Jbtronics\SettingsBundle\Settings\SettingsTrait; +use Symfony\Component\Translation\TranslatableMessage as TM; +use Symfony\Component\Validator\Constraints as Assert; + +#[Settings(label: new TM("settings.misc.ipn_suggest"))] +#[SettingsIcon("fa-list")] +class IpnSuggestSettings +{ + use SettingsTrait; + + #[SettingsParameter( + label: new TM("settings.misc.ipn_suggest.regex"), + description: new TM("settings.misc.ipn_suggest.regex.help"), + options: ['type' => StringType::class], + formOptions: ['attr' => ['placeholder' => '^[A-Za-z0-9]{3,4}(?:-[A-Za-z0-9]{3,4})*-\d{4}$']], + envVar: "IPN_SUGGEST_REGEX", envVarMode: EnvVarMode::OVERWRITE, + )] + public ?string $regex = null; + + #[SettingsParameter( + label: new TM("settings.misc.ipn_suggest.regex_help"), + description: new TM("settings.misc.ipn_suggest.regex_help_description"), + options: ['type' => StringType::class], + formOptions: ['attr' => ['placeholder' => 'Format: 3–4 alphanumeric segments (any number) separated by "-", followed by "-" and 4 digits, e.g., PCOM-RES-0001']], + envVar: "IPN_SUGGEST_REGEX_HELP", envVarMode: EnvVarMode::OVERWRITE, + )] + public ?string $regexHelp = null; + + #[SettingsParameter( + label: new TM("settings.misc.ipn_suggest.autoAppendSuffix"), + envVar: "bool:IPN_AUTO_APPEND_SUFFIX", envVarMode: EnvVarMode::OVERWRITE, + )] + public bool $autoAppendSuffix = false; + + #[SettingsParameter(label: new TM("settings.misc.ipn_suggest.suggestPartDigits"), + description: new TM("settings.misc.ipn_suggest.suggestPartDigits.help"), + formOptions: ['attr' => ['min' => 1, 'max' => 8]], + envVar: "int:IPN_SUGGEST_PART_DIGITS", envVarMode: EnvVarMode::OVERWRITE + )] + #[Assert\Range(min: 1, max: 8)] + public int $suggestPartDigits = 4; + + #[SettingsParameter( + label: new TM("settings.misc.ipn_suggest.useDuplicateDescription"), + description: new TM("settings.misc.ipn_suggest.useDuplicateDescription.help"), + envVar: "bool:IPN_USE_DUPLICATE_DESCRIPTION", envVarMode: EnvVarMode::OVERWRITE, + )] + public bool $useDuplicateDescription = false; +} diff --git a/src/Settings/MiscSettings/MiscSettings.php b/src/Settings/MiscSettings/MiscSettings.php index 1c304d4a..050dbcbc 100644 --- a/src/Settings/MiscSettings/MiscSettings.php +++ b/src/Settings/MiscSettings/MiscSettings.php @@ -35,4 +35,7 @@ class MiscSettings #[EmbeddedSettings] public ?ExchangeRateSettings $exchangeRate = null; + + #[EmbeddedSettings] + public ?IpnSuggestSettings $ipnSuggestSettings = null; } diff --git a/src/Twig/EntityExtension.php b/src/Twig/EntityExtension.php index 762ebb09..b5e5c3ca 100644 --- a/src/Twig/EntityExtension.php +++ b/src/Twig/EntityExtension.php @@ -24,6 +24,7 @@ namespace App\Twig; use App\Entity\Attachments\Attachment; use App\Entity\Base\AbstractDBElement; +use App\Entity\Parts\PartCustomState; use App\Entity\ProjectSystem\Project; use App\Entity\LabelSystem\LabelProfile; use App\Entity\Parts\Category; @@ -115,6 +116,7 @@ final class EntityExtension extends AbstractExtension Currency::class => 'currency', MeasurementUnit::class => 'measurement_unit', LabelProfile::class => 'label_profile', + PartCustomState::class => 'part_custom_state', ]; foreach ($map as $class => $type) { diff --git a/src/Validator/Constraints/UniquePartIpnConstraint.php b/src/Validator/Constraints/UniquePartIpnConstraint.php new file mode 100644 index 00000000..ca32f9ef --- /dev/null +++ b/src/Validator/Constraints/UniquePartIpnConstraint.php @@ -0,0 +1,22 @@ +entityManager = $entityManager; + $this->ipnSuggestSettings = $ipnSuggestSettings; + } + + public function validate($value, Constraint $constraint): void + { + if (null === $value || '' === $value) { + return; + } + + //If the autoAppendSuffix option is enabled, the IPN becomes unique automatically later + if ($this->ipnSuggestSettings->autoAppendSuffix) { + return; + } + + if (!$constraint instanceof UniquePartIpnConstraint) { + return; + } + + /** @var Part $currentPart */ + $currentPart = $this->context->getObject(); + + if (!$currentPart instanceof Part) { + return; + } + + $repository = $this->entityManager->getRepository(Part::class); + $existingParts = $repository->findBy(['ipn' => $value]); + + foreach ($existingParts as $existingPart) { + if ($currentPart->getId() !== $existingPart->getId()) { + $this->context->buildViolation($constraint->message) + ->setParameter('{{ value }}', $value) + ->addViolation(); + } + } + } +} diff --git a/templates/admin/base_admin.html.twig b/templates/admin/base_admin.html.twig index 51790c3c..e9fc0fb9 100644 --- a/templates/admin/base_admin.html.twig +++ b/templates/admin/base_admin.html.twig @@ -86,7 +86,7 @@ - {% if entity.parameters is defined %} + {% if entity.parameters is defined and showParameters == true %} diff --git a/templates/admin/category_admin.html.twig b/templates/admin/category_admin.html.twig index 5811640b..d87cee7f 100644 --- a/templates/admin/category_admin.html.twig +++ b/templates/admin/category_admin.html.twig @@ -31,6 +31,7 @@
    {{ form_row(form.partname_regex) }} {{ form_row(form.partname_hint) }} + {{ form_row(form.part_ipn_prefix) }}
    {{ form_row(form.default_description) }} {{ form_row(form.default_comment) }} diff --git a/templates/admin/part_custom_state_admin.html.twig b/templates/admin/part_custom_state_admin.html.twig new file mode 100644 index 00000000..004ceb65 --- /dev/null +++ b/templates/admin/part_custom_state_admin.html.twig @@ -0,0 +1,14 @@ +{% extends "admin/base_admin.html.twig" %} + +{% block card_title %} + {% trans %}part_custom_state.caption{% endtrans %} +{% endblock %} + +{% block edit_title %} + {% trans %}part_custom_state.edit{% endtrans %}: {{ entity.name }} +{% endblock %} + +{% block new_title %} + {% trans %}part_custom_state.new{% endtrans %} +{% endblock %} + diff --git a/templates/parts/edit/_advanced.html.twig b/templates/parts/edit/_advanced.html.twig index 12b546ab..b0f1ff86 100644 --- a/templates/parts/edit/_advanced.html.twig +++ b/templates/parts/edit/_advanced.html.twig @@ -1,5 +1,16 @@ {{ form_row(form.needsReview) }} {{ form_row(form.favorite) }} {{ form_row(form.mass) }} -{{ form_row(form.ipn) }} -{{ form_row(form.partUnit) }} \ No newline at end of file +
    + {{ form_row(form.ipn) }} +
    +{{ form_row(form.partUnit) }} +{{ form_row(form.partCustomState) }} \ No newline at end of file diff --git a/templates/parts/info/_sidebar.html.twig b/templates/parts/info/_sidebar.html.twig index 28eada04..0c353d8f 100644 --- a/templates/parts/info/_sidebar.html.twig +++ b/templates/parts/info/_sidebar.html.twig @@ -36,6 +36,19 @@ {% endif %} +{% if part.partCustomState is not null %} +
    +
    + {{ part.partCustomState.name }} + + {% if part.partCustomState is not null and part.partCustomState.masterPictureAttachment and attachment_manager.fileExisting(part.partCustomState.masterPictureAttachment) %} +
    + {% trans %}attachment.preview.alt{% endtrans %} + {% endif %} +
    +
    +{% endif %} + {# Favorite Status tag #} {% if part.favorite %}
    @@ -79,4 +92,4 @@
    -{% endif %} \ No newline at end of file +{% endif %} diff --git a/templates/parts/lists/_filter.html.twig b/templates/parts/lists/_filter.html.twig index ba9168d1..2fb5bff2 100644 --- a/templates/parts/lists/_filter.html.twig +++ b/templates/parts/lists/_filter.html.twig @@ -61,6 +61,7 @@ {{ form_row(filterForm.favorite) }} {{ form_row(filterForm.needsReview) }} {{ form_row(filterForm.measurementUnit) }} + {{ form_row(filterForm.partCustomState) }} {{ form_row(filterForm.mass) }} {{ form_row(filterForm.dbId) }} {{ form_row(filterForm.ipn) }} diff --git a/tests/API/Endpoints/PartCustomStateEndpointTest.php b/tests/API/Endpoints/PartCustomStateEndpointTest.php new file mode 100644 index 00000000..ac353d9c --- /dev/null +++ b/tests/API/Endpoints/PartCustomStateEndpointTest.php @@ -0,0 +1,69 @@ +. + */ + +declare(strict_types=1); + + +namespace App\Tests\API\Endpoints; + +class PartCustomStateEndpointTest extends CrudEndpointTestCase +{ + + protected function getBasePath(): string + { + return '/api/part_custom_states'; + } + + public function testGetCollection(): void + { + $this->_testGetCollection(); + self::assertJsonContains([ + 'hydra:totalItems' => 7, + ]); + } + + public function testGetItem(): void + { + $this->_testGetItem(1); + $this->_testGetItem(2); + $this->_testGetItem(3); + } + + public function testCreateItem(): void + { + $this->_testPostItem([ + 'name' => 'Test API', + 'parent' => '/api/part_custom_states/1', + ]); + } + + public function testUpdateItem(): void + { + $this->_testPatchItem(5, [ + 'name' => 'Updated', + 'parent' => '/api/part_custom_states/2', + ]); + } + + public function testDeleteItem(): void + { + $this->_testDeleteItem(4); + } +} diff --git a/tests/Controller/AdminPages/PartCustomStateControllerTest.php b/tests/Controller/AdminPages/PartCustomStateControllerTest.php new file mode 100644 index 00000000..3e87dfe2 --- /dev/null +++ b/tests/Controller/AdminPages/PartCustomStateControllerTest.php @@ -0,0 +1,34 @@ +. + */ + +declare(strict_types=1); + +namespace App\Tests\Controller\AdminPages; + +use App\Entity\Parts\PartCustomState; +use PHPUnit\Framework\Attributes\Group; + +#[Group('slow')] +#[Group('DB')] +class PartCustomStateControllerTest extends AbstractAdminController +{ + protected static string $base_path = '/en/part_custom_state'; + protected static string $entity_class = PartCustomState::class; +} diff --git a/tests/Entity/Attachments/AttachmentTest.php b/tests/Entity/Attachments/AttachmentTest.php index 00a68d7d..35222d63 100644 --- a/tests/Entity/Attachments/AttachmentTest.php +++ b/tests/Entity/Attachments/AttachmentTest.php @@ -29,6 +29,7 @@ use App\Entity\Attachments\AttachmentType; use App\Entity\Attachments\AttachmentTypeAttachment; use App\Entity\Attachments\CategoryAttachment; use App\Entity\Attachments\CurrencyAttachment; +use App\Entity\Attachments\PartCustomStateAttachment; use App\Entity\Attachments\ProjectAttachment; use App\Entity\Attachments\FootprintAttachment; use App\Entity\Attachments\GroupAttachment; @@ -38,6 +39,7 @@ use App\Entity\Attachments\PartAttachment; use App\Entity\Attachments\StorageLocationAttachment; use App\Entity\Attachments\SupplierAttachment; use App\Entity\Attachments\UserAttachment; +use App\Entity\Parts\PartCustomState; use App\Entity\ProjectSystem\Project; use App\Entity\Parts\Category; use App\Entity\Parts\Footprint; @@ -86,6 +88,7 @@ class AttachmentTest extends TestCase yield [ManufacturerAttachment::class, Manufacturer::class]; yield [MeasurementUnitAttachment::class, MeasurementUnit::class]; yield [PartAttachment::class, Part::class]; + yield [PartCustomStateAttachment::class, PartCustomState::class]; yield [StorageLocationAttachment::class, StorageLocation::class]; yield [SupplierAttachment::class, Supplier::class]; yield [UserAttachment::class, User::class]; diff --git a/tests/Repository/PartRepositoryTest.php b/tests/Repository/PartRepositoryTest.php new file mode 100644 index 00000000..68b75abb --- /dev/null +++ b/tests/Repository/PartRepositoryTest.php @@ -0,0 +1,297 @@ +. + */ + +declare(strict_types=1); + +namespace App\Tests\Repository; + +use App\Entity\Parts\Category; +use App\Entity\Parts\Part; +use App\Settings\MiscSettings\IpnSuggestSettings; +use Doctrine\ORM\EntityManagerInterface; +use Doctrine\ORM\Mapping\ClassMetadata; +use PHPUnit\Framework\TestCase; +use Doctrine\ORM\Query; +use Doctrine\ORM\QueryBuilder; +use Symfony\Contracts\Translation\TranslatorInterface; +use App\Repository\PartRepository; + +final class PartRepositoryTest extends TestCase +{ + public function test_autocompleteSearch_builds_expected_query_without_db(): void + { + $qb = $this->getMockBuilder(QueryBuilder::class) + ->disableOriginalConstructor() + ->onlyMethods([ + 'select', 'leftJoin', 'where', 'orWhere', + 'setParameter', 'setMaxResults', 'orderBy', 'getQuery' + ])->getMock(); + + $qb->expects(self::once())->method('select')->with('part')->willReturnSelf(); + + $qb->expects(self::exactly(2))->method('leftJoin')->with($this->anything(), $this->anything())->willReturnSelf(); + + $qb->expects(self::atLeastOnce())->method('where')->with($this->anything())->willReturnSelf(); + $qb->method('orWhere')->with($this->anything())->willReturnSelf(); + + $searchQuery = 'res'; + $qb->expects(self::once())->method('setParameter')->with('query', '%'.$searchQuery.'%')->willReturnSelf(); + $qb->expects(self::once())->method('setMaxResults')->with(10)->willReturnSelf(); + $qb->expects(self::once())->method('orderBy')->with('NATSORT(part.name)', 'ASC')->willReturnSelf(); + + $emMock = $this->createMock(EntityManagerInterface::class); + $classMetadata = new ClassMetadata(Part::class); + $emMock->method('getClassMetadata')->with(Part::class)->willReturn($classMetadata); + + $translatorMock = $this->createMock(TranslatorInterface::class); + $ipnSuggestSettings = $this->createMock(IpnSuggestSettings::class); + + $repo = $this->getMockBuilder(PartRepository::class) + ->setConstructorArgs([$emMock, $translatorMock, $ipnSuggestSettings]) + ->onlyMethods(['createQueryBuilder']) + ->getMock(); + + $repo->expects(self::once()) + ->method('createQueryBuilder') + ->with('part') + ->willReturn($qb); + + $part = new Part(); // create found part, because it is not saved in DB + $part->setName('Resistor'); + + $queryMock = $this->getMockBuilder(Query::class) + ->disableOriginalConstructor() + ->onlyMethods(['getResult']) + ->getMock(); + $queryMock->expects(self::once())->method('getResult')->willReturn([$part]); + + $qb->method('getQuery')->willReturn($queryMock); + + $result = $repo->autocompleteSearch($searchQuery, 10); + + // Check one part found and returned + self::assertIsArray($result); + self::assertCount(1, $result); + self::assertSame($part, $result[0]); + } + + public function test_autoCompleteIpn_with_unsaved_part_and_category_without_part_description(): void + { + $qb = $this->getMockBuilder(QueryBuilder::class) + ->disableOriginalConstructor() + ->onlyMethods([ + 'select', 'leftJoin', 'where', 'andWhere', 'orWhere', + 'setParameter', 'setMaxResults', 'orderBy', 'getQuery' + ])->getMock(); + + $qb->method('select')->willReturnSelf(); + $qb->method('leftJoin')->willReturnSelf(); + $qb->method('where')->willReturnSelf(); + $qb->method('andWhere')->willReturnSelf(); + $qb->method('orWhere')->willReturnSelf(); + $qb->method('setParameter')->willReturnSelf(); + $qb->method('setMaxResults')->willReturnSelf(); + $qb->method('orderBy')->willReturnSelf(); + + $emMock = $this->createMock(EntityManagerInterface::class); + $classMetadata = new ClassMetadata(Part::class); + $emMock->method('getClassMetadata')->with(Part::class)->willReturn($classMetadata); + + $translatorMock = $this->createMock(TranslatorInterface::class); + $translatorMock->method('trans') + ->willReturnCallback(static function (string $id, array $parameters = [], ?string $domain = null, ?string $locale = null): string { + return $id; + }); + + $ipnSuggestSettings = $this->createMock(IpnSuggestSettings::class); + + $ipnSuggestSettings->suggestPartDigits = 4; + $ipnSuggestSettings->useDuplicateDescription = false; + + $repo = $this->getMockBuilder(PartRepository::class) + ->setConstructorArgs([$emMock, $translatorMock, $ipnSuggestSettings]) + ->onlyMethods(['createQueryBuilder']) + ->getMock(); + + $repo->expects(self::atLeastOnce()) + ->method('createQueryBuilder') + ->with('part') + ->willReturn($qb); + + $queryMock = $this->getMockBuilder(Query::class) + ->disableOriginalConstructor() + ->onlyMethods(['getResult']) + ->getMock(); + + $categoryParent = new Category(); + $categoryParent->setName('Passive components'); + $categoryParent->setPartIpnPrefix('PCOM'); + + $categoryChild = new Category(); + $categoryChild->setName('Resistors'); + $categoryChild->setPartIpnPrefix('RES'); + $categoryChild->setParent($categoryParent); + + $partForSuggestGeneration = new Part(); // create found part, because it is not saved in DB + $partForSuggestGeneration->setIpn('RES-0001'); + $partForSuggestGeneration->setCategory($categoryChild); + + $queryMock->method('getResult')->willReturn([$partForSuggestGeneration]); + $qb->method('getQuery')->willReturn($queryMock); + $suggestions = $repo->autoCompleteIpn($partForSuggestGeneration, '', 4); + + // Check structure available + self::assertIsArray($suggestions); + self::assertArrayHasKey('commonPrefixes', $suggestions); + self::assertArrayHasKey('prefixesPartIncrement', $suggestions); + self::assertNotEmpty($suggestions['commonPrefixes']); + self::assertNotEmpty($suggestions['prefixesPartIncrement']); + + // Check expected values + self::assertSame('RES-', $suggestions['commonPrefixes'][0]['title']); + self::assertSame('part.edit.tab.advanced.ipn.prefix.direct_category', $suggestions['commonPrefixes'][0]['description']); + self::assertSame('PCOM-RES-', $suggestions['commonPrefixes'][1]['title']); + self::assertSame('part.edit.tab.advanced.ipn.prefix.hierarchical.no_increment', $suggestions['commonPrefixes'][1]['description']); + + self::assertSame('RES-0002', $suggestions['prefixesPartIncrement'][0]['title']); // next possible free increment for given part category + self::assertSame('part.edit.tab.advanced.ipn.prefix.direct_category.increment', $suggestions['prefixesPartIncrement'][0]['description']); + self::assertSame('PCOM-RES-0002', $suggestions['prefixesPartIncrement'][1]['title']); // next possible free increment for given part category + self::assertSame('part.edit.tab.advanced.ipn.prefix.hierarchical.increment', $suggestions['prefixesPartIncrement'][1]['description']); + } + + public function test_autoCompleteIpn_with_unsaved_part_and_category_with_part_description(): void + { + $qb = $this->getMockBuilder(QueryBuilder::class) + ->disableOriginalConstructor() + ->onlyMethods([ + 'select', 'leftJoin', 'where', 'andWhere', 'orWhere', + 'setParameter', 'setMaxResults', 'orderBy', 'getQuery' + ])->getMock(); + + $qb->method('select')->willReturnSelf(); + $qb->method('leftJoin')->willReturnSelf(); + $qb->method('where')->willReturnSelf(); + $qb->method('andWhere')->willReturnSelf(); + $qb->method('orWhere')->willReturnSelf(); + $qb->method('setParameter')->willReturnSelf(); + $qb->method('setMaxResults')->willReturnSelf(); + $qb->method('orderBy')->willReturnSelf(); + + $emMock = $this->createMock(EntityManagerInterface::class); + $classMetadata = new ClassMetadata(Part::class); + $emMock->method('getClassMetadata')->with(Part::class)->willReturn($classMetadata); + + $translatorMock = $this->createMock(TranslatorInterface::class); + $translatorMock->method('trans') + ->willReturnCallback(static function (string $id, array $parameters = [], ?string $domain = null, ?string $locale = null): string { + return $id; + }); + + $ipnSuggestSettings = $this->createMock(IpnSuggestSettings::class); + + $ipnSuggestSettings->suggestPartDigits = 4; + $ipnSuggestSettings->useDuplicateDescription = false; + + $repo = $this->getMockBuilder(PartRepository::class) + ->setConstructorArgs([$emMock, $translatorMock, $ipnSuggestSettings]) + ->onlyMethods(['createQueryBuilder']) + ->getMock(); + + $repo->expects(self::atLeastOnce()) + ->method('createQueryBuilder') + ->with('part') + ->willReturn($qb); + + $queryMock = $this->getMockBuilder(Query::class) + ->disableOriginalConstructor() + ->onlyMethods(['getResult']) + ->getMock(); + + $categoryParent = new Category(); + $categoryParent->setName('Passive components'); + $categoryParent->setPartIpnPrefix('PCOM'); + + $categoryChild = new Category(); + $categoryChild->setName('Resistors'); + $categoryChild->setPartIpnPrefix('RES'); + $categoryChild->setParent($categoryParent); + + $partForSuggestGeneration = new Part(); // create found part, because it is not saved in DB + $partForSuggestGeneration->setCategory($categoryChild); + $partForSuggestGeneration->setIpn('1810-1679_1'); + $partForSuggestGeneration->setDescription('NETWORK-RESISTOR 4 0 OHM +5PCT 0.063W TKF SMT'); + + $queryMock->method('getResult')->willReturn([$partForSuggestGeneration]); + $qb->method('getQuery')->willReturn($queryMock); + $suggestions = $repo->autoCompleteIpn($partForSuggestGeneration, 'NETWORK-RESISTOR 4 0 OHM +5PCT 0.063W TKF SMT', 4); + + // Check structure available + self::assertIsArray($suggestions); + self::assertArrayHasKey('commonPrefixes', $suggestions); + self::assertArrayHasKey('prefixesPartIncrement', $suggestions); + self::assertNotEmpty($suggestions['commonPrefixes']); + self::assertCount(2, $suggestions['commonPrefixes']); + self::assertNotEmpty($suggestions['prefixesPartIncrement']); + self::assertCount(2, $suggestions['prefixesPartIncrement']); + + // Check expected values without any increment, for user to decide + self::assertSame('RES-', $suggestions['commonPrefixes'][0]['title']); + self::assertSame('part.edit.tab.advanced.ipn.prefix.direct_category', $suggestions['commonPrefixes'][0]['description']); + self::assertSame('PCOM-RES-', $suggestions['commonPrefixes'][1]['title']); + self::assertSame('part.edit.tab.advanced.ipn.prefix.hierarchical.no_increment', $suggestions['commonPrefixes'][1]['description']); + + // Check expected values with next possible increment at category level + self::assertSame('RES-0001', $suggestions['prefixesPartIncrement'][0]['title']); // next possible free increment for given part category + self::assertSame('part.edit.tab.advanced.ipn.prefix.direct_category.increment', $suggestions['prefixesPartIncrement'][0]['description']); + self::assertSame('PCOM-RES-0001', $suggestions['prefixesPartIncrement'][1]['title']); // next possible free increment for given part category + self::assertSame('part.edit.tab.advanced.ipn.prefix.hierarchical.increment', $suggestions['prefixesPartIncrement'][1]['description']); + + $ipnSuggestSettings->useDuplicateDescription = true; + + $suggestionsWithSameDescription = $repo->autoCompleteIpn($partForSuggestGeneration, 'NETWORK-RESISTOR 4 0 OHM +5PCT 0.063W TKF SMT', 4); + + // Check structure available + self::assertIsArray($suggestionsWithSameDescription); + self::assertArrayHasKey('commonPrefixes', $suggestionsWithSameDescription); + self::assertArrayHasKey('prefixesPartIncrement', $suggestionsWithSameDescription); + self::assertNotEmpty($suggestionsWithSameDescription['commonPrefixes']); + self::assertCount(2, $suggestionsWithSameDescription['commonPrefixes']); + self::assertNotEmpty($suggestionsWithSameDescription['prefixesPartIncrement']); + self::assertCount(4, $suggestionsWithSameDescription['prefixesPartIncrement']); + + // Check expected values without any increment, for user to decide + self::assertSame('RES-', $suggestionsWithSameDescription['commonPrefixes'][0]['title']); + self::assertSame('part.edit.tab.advanced.ipn.prefix.direct_category', $suggestionsWithSameDescription['commonPrefixes'][0]['description']); + self::assertSame('PCOM-RES-', $suggestionsWithSameDescription['commonPrefixes'][1]['title']); + self::assertSame('part.edit.tab.advanced.ipn.prefix.hierarchical.no_increment', $suggestionsWithSameDescription['commonPrefixes'][1]['description']); + + // Check expected values with next possible increment at part description level + self::assertSame('1810-1679_1', $suggestionsWithSameDescription['prefixesPartIncrement'][0]['title']); // current given value + self::assertSame('part.edit.tab.advanced.ipn.prefix.description.current-increment', $suggestionsWithSameDescription['prefixesPartIncrement'][0]['description']); + self::assertSame('1810-1679_2', $suggestionsWithSameDescription['prefixesPartIncrement'][1]['title']); // next possible value + self::assertSame('part.edit.tab.advanced.ipn.prefix.description.increment', $suggestionsWithSameDescription['prefixesPartIncrement'][1]['description']); + + // Check expected values with next possible increment at category level + self::assertSame('RES-0001', $suggestionsWithSameDescription['prefixesPartIncrement'][2]['title']); // next possible free increment for given part category + self::assertSame('part.edit.tab.advanced.ipn.prefix.direct_category.increment', $suggestionsWithSameDescription['prefixesPartIncrement'][2]['description']); + self::assertSame('PCOM-RES-0001', $suggestionsWithSameDescription['prefixesPartIncrement'][3]['title']); // next possible free increment for given part category + self::assertSame('part.edit.tab.advanced.ipn.prefix.hierarchical.increment', $suggestionsWithSameDescription['prefixesPartIncrement'][3]['description']); + } +} diff --git a/tests/Services/EntityMergers/Mergers/PartMergerTest.php b/tests/Services/EntityMergers/Mergers/PartMergerTest.php index 56c7712e..7db4ddd6 100644 --- a/tests/Services/EntityMergers/Mergers/PartMergerTest.php +++ b/tests/Services/EntityMergers/Mergers/PartMergerTest.php @@ -29,6 +29,7 @@ use App\Entity\Parts\Manufacturer; use App\Entity\Parts\MeasurementUnit; use App\Entity\Parts\Part; use App\Entity\Parts\PartAssociation; +use App\Entity\Parts\PartCustomState; use App\Entity\Parts\PartLot; use App\Entity\PriceInformations\Orderdetail; use App\Services\EntityMergers\Mergers\PartMerger; @@ -54,6 +55,7 @@ class PartMergerTest extends KernelTestCase $manufacturer1 = new Manufacturer(); $manufacturer2 = new Manufacturer(); $unit = new MeasurementUnit(); + $customState = new PartCustomState(); $part1 = (new Part()) ->setCategory($category) @@ -62,7 +64,8 @@ class PartMergerTest extends KernelTestCase $part2 = (new Part()) ->setFootprint($footprint) ->setManufacturer($manufacturer2) - ->setPartUnit($unit); + ->setPartUnit($unit) + ->setPartCustomState($customState); $merged = $this->merger->merge($part1, $part2); $this->assertSame($merged, $part1); @@ -70,6 +73,7 @@ class PartMergerTest extends KernelTestCase $this->assertSame($footprint, $merged->getFootprint()); $this->assertSame($manufacturer1, $merged->getManufacturer()); $this->assertSame($unit, $merged->getPartUnit()); + $this->assertSame($customState, $merged->getPartCustomState()); } public function testMergeOfTags(): void diff --git a/tests/Twig/EntityExtensionTest.php b/tests/Twig/EntityExtensionTest.php index 3adb9ad2..18fe970b 100644 --- a/tests/Twig/EntityExtensionTest.php +++ b/tests/Twig/EntityExtensionTest.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace App\Tests\Twig; use App\Entity\Attachments\PartAttachment; +use App\Entity\Parts\PartCustomState; use App\Entity\ProjectSystem\Project; use App\Entity\LabelSystem\LabelProfile; use App\Entity\Parts\Category; @@ -67,6 +68,7 @@ class EntityExtensionTest extends WebTestCase $this->assertSame('currency', $this->service->getEntityType(new Currency())); $this->assertSame('measurement_unit', $this->service->getEntityType(new MeasurementUnit())); $this->assertSame('label_profile', $this->service->getEntityType(new LabelProfile())); + $this->assertSame('part_custom_state', $this->service->getEntityType(new PartCustomState())); } } diff --git a/tests/assets/partkeepr_import_test.xml b/tests/assets/partkeepr_import_test.xml index 4fa497e2..28e6f099 100644 --- a/tests/assets/partkeepr_import_test.xml +++ b/tests/assets/partkeepr_import_test.xml @@ -7437,11 +7437,13 @@ + + diff --git a/translations/messages.cs.xlf b/translations/messages.cs.xlf index 1f234450..cd572dae 100644 --- a/translations/messages.cs.xlf +++ b/translations/messages.cs.xlf @@ -548,6 +548,12 @@ Měrné jednotky + + + part_custom_state.caption + Vlastní stav komponenty + + Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:5 @@ -1842,6 +1848,66 @@ Související prvky budou přesunuty nahoru. Pokročilé + + + part.edit.tab.advanced.ipn.commonSectionHeader + Návrhy bez přírůstku části + + + + + part.edit.tab.advanced.ipn.partIncrementHeader + Návrhy s číselnými přírůstky částí + + + + + part.edit.tab.advanced.ipn.prefix.description.current-increment + Aktuální specifikace IPN pro součást + + + + + part.edit.tab.advanced.ipn.prefix.description.increment + Další možná specifikace IPN na základě identického popisu součásti + + + + + part.edit.tab.advanced.ipn.prefix_empty.direct_category + IPN předpona přímé kategorie je prázdná, zadejte ji v kategorii „%name%“ + + + + + part.edit.tab.advanced.ipn.prefix.direct_category + IPN prefix přímé kategorie + + + + + part.edit.tab.advanced.ipn.prefix.direct_category.increment + IPN prefix přímé kategorie a specifického přírůstku pro část + + + + + part.edit.tab.advanced.ipn.prefix.hierarchical.no_increment + IPN prefixy s hierarchickým pořadím kategorií rodičovských prefixů + + + + + part.edit.tab.advanced.ipn.prefix.hierarchical.increment + IPN prefixy s hierarchickým pořadím kategorií rodičovských prefixů a specifickým přírůstkem pro část + + + + + part.edit.tab.advanced.ipn.prefix.not_saved + Nejprve vytvořte součást a přiřaďte ji do kategorie: s dostupnými kategoriemi a jejich vlastními IPN prefixy lze automaticky navrhnout IPN označení pro danou součást + + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:40 @@ -4831,6 +4897,12 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn Měrné jednotky + + + part.table.partCustomState + Vlastní stav součásti + + Part-DB1\src\DataTables\PartsDataTable.php:236 @@ -5695,6 +5767,12 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn Měrná jednotka + + + part.edit.partCustomState + Vlastní stav součásti + + Part-DB1\src\Form\Part\PartBaseType.php:212 @@ -5982,6 +6060,12 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn Měrná jednotka + + + part_custom_state.label + Vlastní stav součásti + + Part-DB1\src\Services\ElementTypeNameGenerator.php:90 @@ -6225,6 +6309,12 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn Měrné jednotky + + + tree.tools.edit.part_custom_state + Vlastní stav součásti + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:203 @@ -6959,6 +7049,12 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn Filtr názvů + + + category.edit.part_ipn_prefix + Předpona součásti IPN + + obsolete @@ -8495,6 +8591,12 @@ Element 3 Měrná jednotka + + + perm.part_custom_states + Vlastní stav součásti + + obsolete @@ -10254,12 +10356,24 @@ Element 3 např. "/Kondenzátor \d+ nF/i" + + + category.edit.part_ipn_prefix.placeholder + např. "B12A" + + category.edit.partname_regex.help Regulární výraz kompatibilní s PCRE, kterému musí název dílu odpovídat. + + + category.edit.part_ipn_prefix.help + Předpona navrhovaná při zadávání IPN části. + + entity.select.add_hint @@ -10806,6 +10920,12 @@ Element 3 Měrná jednotka + + + log.element_edited.changed_fields.partCustomState + Vlastní stav součásti + + log.element_edited.changed_fields.expiration_date @@ -11064,6 +11184,18 @@ Element 3 Upravit měrnou jednotku + + + part_custom_state.new + Nový vlastní stav komponenty + + + + + part_custom_state.edit + Upravit vlastní stav komponenty + + user.aboutMe.label @@ -12975,6 +13107,54 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz Pokud potřebujete směnné kurzy mezi měnami mimo eurozónu, můžete zde zadat API klíč z fixer.io. + + + settings.misc.ipn_suggest + Seznam návrhů IPN součástek + + + + + settings.misc.ipn_suggest.regex + Regex + + + + + settings.misc.ipn_suggest.regex_help + Nápověda text + + + + + settings.misc.ipn_suggest.regex_help_description + Definujte svůj vlastní text nápovědy pro specifikaci formátu Regex. + + + + + settings.misc.ipn_suggest.autoAppendSuffix + Pokud je tato možnost povolena, bude při opětovném zadání existujícího IPN při ukládání k vstupu přidána přírůstková přípona. + + + + + settings.misc.ipn_suggest.suggestPartDigits + Počet čísel pro inkrement + + + + + settings.misc.ipn_suggest.useDuplicateDescription + Je-li povoleno, použije se popis součástky k nalezení existujících součástek se stejným popisem a k určení další volné IPN navýšením její číselné přípony pro seznam návrhů. + + + + + settings.misc.ipn_suggest.suggestPartDigits.help + Počet číslic použitých pro inkrementální číslování součástí v návrhovém systému IPN (Interní číslo součástky). + + settings.behavior.part_info diff --git a/translations/messages.da.xlf b/translations/messages.da.xlf index d7258986..530d91aa 100644 --- a/translations/messages.da.xlf +++ b/translations/messages.da.xlf @@ -548,6 +548,12 @@ Måleenhed + + + part_custom_state.caption + Brugerdefineret komponentstatus + + Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:5 @@ -1850,6 +1856,66 @@ Underelementer vil blive flyttet opad. Advanceret + + + part.edit.tab.advanced.ipn.commonSectionHeader + Forslag uden del-inkrement + + + + + part.edit.tab.advanced.ipn.partIncrementHeader + Forslag med numeriske deleforøgelser + + + + + part.edit.tab.advanced.ipn.prefix.description.current-increment + Aktuel IPN-specifikation for delen + + + + + part.edit.tab.advanced.ipn.prefix.description.increment + Næste mulige IPN-specifikation baseret på en identisk delebeskrivelse + + + + + part.edit.tab.advanced.ipn.prefix_empty.direct_category + IPN-præfikset for den direkte kategori er tomt, angiv det i kategorien "%name%" + + + + + part.edit.tab.advanced.ipn.prefix.direct_category + IPN-præfiks for direkte kategori + + + + + part.edit.tab.advanced.ipn.prefix.direct_category.increment + IPN-præfiks for den direkte kategori og en delspecifik inkrement + + + + + part.edit.tab.advanced.ipn.prefix.hierarchical.no_increment + IPN-præfikser med hierarkisk rækkefølge af overordnede præfikser + + + + + part.edit.tab.advanced.ipn.prefix.hierarchical.increment + IPN-præfikser med hierarkisk rækkefølge af overordnede præfikser og en del-specifik inkrement + + + + + part.edit.tab.advanced.ipn.prefix.not_saved + Opret først en komponent, og tildel den en kategori: med eksisterende kategorier og deres egne IPN-præfikser kan IPN-betegnelsen for komponenten foreslås automatisk + + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:40 @@ -4838,6 +4904,12 @@ Bemærk også, at uden to-faktor-godkendelse er din konto ikke længere så godt Måleenhed + + + part.table.partCustomState + Brugerdefineret komponentstatus + + Part-DB1\src\DataTables\PartsDataTable.php:236 @@ -5702,6 +5774,12 @@ Bemærk også, at uden to-faktor-godkendelse er din konto ikke længere så godt Måleenhed + + + part.edit.partCustomState + Brugerdefineret deltilstand + + Part-DB1\src\Form\Part\PartBaseType.php:212 @@ -5989,6 +6067,12 @@ Bemærk også, at uden to-faktor-godkendelse er din konto ikke længere så godt Måleenhed + + + part_custom_state.label + Brugerdefineret deltilstand + + Part-DB1\src\Services\ElementTypeNameGenerator.php:90 @@ -6232,6 +6316,12 @@ Bemærk også, at uden to-faktor-godkendelse er din konto ikke længere så godt Måleenhed + + + tree.tools.edit.part_custom_state + Brugerdefineret komponenttilstand + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:203 @@ -6966,6 +7056,12 @@ Bemærk også, at uden to-faktor-godkendelse er din konto ikke længere så godt Navnefilter + + + category.edit.part_ipn_prefix + IPN-komponentförstavelse + + obsolete @@ -8502,6 +8598,12 @@ Element 3 Måleenhed + + + perm.part_custom_states + Brugerdefineret komponentstatus + + obsolete @@ -10280,12 +10382,24 @@ Element 3 f.eks. "/Kondensator \d+ nF/i" + + + category.edit.part_ipn_prefix.placeholder + f.eks. "B12A" + + category.edit.partname_regex.help Et PCRE-kompatibelt regulært udtryk, som delnavnet skal opfylde. + + + category.edit.part_ipn_prefix.help + Et prefix foreslået, når IPN for en del indtastes. + + entity.select.add_hint @@ -10832,6 +10946,12 @@ Element 3 Måleenhed + + + log.element_edited.changed_fields.partCustomState + Brugerdefineret komponentstatus + + log.element_edited.changed_fields.expiration_date @@ -11096,6 +11216,18 @@ Oversættelsen Ret måleenhed + + + part_custom_state.new + Ny brugerdefineret komponentstatus + + + + + part_custom_state.edit + Rediger brugerdefineret komponentstatus + + user.aboutMe.label diff --git a/translations/messages.de.xlf b/translations/messages.de.xlf index 1d1c49af..806c2e52 100644 --- a/translations/messages.de.xlf +++ b/translations/messages.de.xlf @@ -1,6 +1,6 @@ - + Part-DB1\templates\AdminPages\AttachmentTypeAdmin.html.twig:4 @@ -242,7 +242,7 @@ part.info.timetravel_hint - So sah das Bauteil vor %timestamp% aus. <i>Beachten Sie, dass dieses Feature experimentell ist und die angezeigten Infos daher nicht unbedingt korrekt sind.</i> + Beachten Sie, dass dieses Feature experimentell ist und die angezeigten Infos daher nicht unbedingt korrekt sind.]]> @@ -548,6 +548,12 @@ Maßeinheit + + + part_custom_state.caption + Benutzerdefinierter Bauteilstatus + + Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:5 @@ -731,9 +737,9 @@ user.edit.tfa.disable_tfa_message - Dies wird <b>alle aktiven Zwei-Faktor-Authentifizierungsmethoden des Nutzers deaktivieren</b> und die <b>Backupcodes löschen</b>! <br> -Der Benutzer wird alle Zwei-Faktor-Authentifizierungmethoden neu einrichten müssen und neue Backupcodes ausdrucken müssen! <br><br> -<b>Führen sie dies nur durch, wenn Sie über die Identität des (um Hilfe suchenden) Benutzers absolut sicher sind, da ansonsten eine Kompromittierung des Accounts durch einen Angreifer erfolgen könnte!</b> + alle aktiven Zwei-Faktor-Authentifizierungsmethoden des Nutzers deaktivieren und die Backupcodes löschen!
    +Der Benutzer wird alle Zwei-Faktor-Authentifizierungmethoden neu einrichten müssen und neue Backupcodes ausdrucken müssen!

    +Führen sie dies nur durch, wenn Sie über die Identität des (um Hilfe suchenden) Benutzers absolut sicher sind, da ansonsten eine Kompromittierung des Accounts durch einen Angreifer erfolgen könnte!]]>
    @@ -1440,7 +1446,7 @@ Subelemente werden beim Löschen nach oben verschoben. homepage.github.text - Quellcode, Downloads, Bugreports, ToDo-Liste usw. gibts auf der <a class="link-external" target="_blank" href="%href%">GitHub Projektseite</a> + GitHub Projektseite]]> @@ -1462,7 +1468,7 @@ Subelemente werden beim Löschen nach oben verschoben. homepage.help.text - Hilfe und Tipps finden sie im <a class="link-external" rel="noopener" target="_blank" href="%href%">Wiki</a> der GitHub Seite. + Wiki der GitHub Seite.]]> @@ -1704,7 +1710,7 @@ Subelemente werden beim Löschen nach oben verschoben. email.pw_reset.fallback - Wenn dies nicht funktioniert, rufen Sie <a href="%url%">%url%</a> auf und geben Sie die folgenden Daten ein + %url% auf und geben Sie die folgenden Daten ein]]> @@ -1734,7 +1740,7 @@ Subelemente werden beim Löschen nach oben verschoben. email.pw_reset.valid_unit %date% - Das Reset-Token ist gültig bis <i>%date%</i> + %date%]]> @@ -1841,6 +1847,66 @@ Subelemente werden beim Löschen nach oben verschoben. Erweiterte Optionen + + + part.edit.tab.advanced.ipn.commonSectionHeader + Vorschläge ohne Teil-Inkrement + + + + + part.edit.tab.advanced.ipn.partIncrementHeader + Vorschläge mit numerischen Teil-Inkrement + + + + + part.edit.tab.advanced.ipn.prefix.description.current-increment + Aktuelle IPN-Angabe des Bauteils + + + + + part.edit.tab.advanced.ipn.prefix.description.increment + Nächstmögliche IPN-Angabe auf Basis der identischen Bauteil-Beschreibung + + + + + part.edit.tab.advanced.ipn.prefix_empty.direct_category + IPN-Präfix der direkten Kategorie leer, geben Sie einen Präfix in Kategorie "%name%" an + + + + + part.edit.tab.advanced.ipn.prefix.direct_category + IPN-Präfix der direkten Kategorie + + + + + part.edit.tab.advanced.ipn.prefix.direct_category.increment + IPN-Präfix der direkten Kategorie und eines teilspezifischen Inkrements + + + + + part.edit.tab.advanced.ipn.prefix.hierarchical.no_increment + IPN-Präfixe mit hierarchischer Kategorienreihenfolge der Elternpräfixe + + + + + part.edit.tab.advanced.ipn.prefix.hierarchical.increment + IPN-Präfixe mit hierarchischer Kategorienreihenfolge der Elternpräfixe und ein teilsspezifisches Inkrement + + + + + part.edit.tab.advanced.ipn.prefix.not_saved + Bitte erstellen Sie zuerst ein Bauteil und weisen Sie dieses einer Kategorie zu: mit vorhandenen Kategorien und derene eigenen IPN-Präfix kann die IPN-Angabe für das jeweilige Teil automatisch vorgeschlagen werden + + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:40 @@ -3577,8 +3643,8 @@ Subelemente werden beim Löschen nach oben verschoben. tfa_google.disable.confirm_message - Wenn Sie die Authenticator App deaktivieren, werden alle Backupcodes gelöscht, daher sie müssen sie evtl. neu ausdrucken.<br> -Beachten Sie außerdem, dass ihr Account ohne Zwei-Faktor-Authentifizierung nicht mehr so gut gegen Angreifer geschützt ist! + +Beachten Sie außerdem, dass ihr Account ohne Zwei-Faktor-Authentifizierung nicht mehr so gut gegen Angreifer geschützt ist!]]> @@ -3598,7 +3664,7 @@ Beachten Sie außerdem, dass ihr Account ohne Zwei-Faktor-Authentifizierung nich tfa_google.step.download - Laden Sie eine Authenticator App herunter (z.B. <a class="link-external" target="_blank" href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2">Google Authenticator</a> oder <a class="link-external" target="_blank" href="https://play.google.com/store/apps/details?id=org.fedorahosted.freeotp">FreeOTP Authenticator</a>) + Google Authenticator oder FreeOTP Authenticator)]]> @@ -3840,8 +3906,8 @@ Beachten Sie außerdem, dass ihr Account ohne Zwei-Faktor-Authentifizierung nich tfa_trustedDevices.explanation - Bei der Überprüfung des zweiten Faktors, kann der aktuelle Computer als vertrauenswürdig gekennzeichnet werden, daher werden keine Zwei-Faktor-Überprüfungen mehr an diesem Computer benötigt. -Wenn Sie dies fehlerhafterweise gemacht haben oder ein Computer nicht mehr vertrauenswürdig ist, können Sie hier den Status <i>aller </i>Computer zurücksetzen. + aller Computer zurücksetzen.]]> @@ -4830,6 +4896,12 @@ Wenn Sie dies fehlerhafterweise gemacht haben oder ein Computer nicht mehr vertr Maßeinheit + + + part.table.partCustomState + Benutzerdefinierter Bauteilstatus + + Part-DB1\src\DataTables\PartsDataTable.php:236 @@ -5312,7 +5384,7 @@ Wenn Sie dies fehlerhafterweise gemacht haben oder ein Computer nicht mehr vertr label_options.lines_mode.help - Wenn Sie hier Twig auswählen, wird das Contentfeld als Twig-Template interpretiert. Weitere Hilfe gibt es in der <a href="https://twig.symfony.com/doc/3.x/templates.html">Twig Dokumentation</a> und dem <a href="https://docs.part-db.de/usage/labels.html#twig-mode">Wiki</a>. + Twig Dokumentation und dem Wiki.]]> @@ -5694,6 +5766,12 @@ Wenn Sie dies fehlerhafterweise gemacht haben oder ein Computer nicht mehr vertr Maßeinheit + + + part.edit.partCustomState + Benutzerdefinierter Bauteilstatus + + Part-DB1\src\Form\Part\PartBaseType.php:212 @@ -5981,6 +6059,12 @@ Wenn Sie dies fehlerhafterweise gemacht haben oder ein Computer nicht mehr vertr Maßeinheit + + + part_custom_state.label + Benutzerdefinierter Bauteilstatus + + Part-DB1\src\Services\ElementTypeNameGenerator.php:90 @@ -6224,6 +6308,12 @@ Wenn Sie dies fehlerhafterweise gemacht haben oder ein Computer nicht mehr vertr Maßeinheiten + + + tree.tools.edit.part_custom_state + Benutzerdefinierter Bauteilstatus + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:203 @@ -6958,6 +7048,12 @@ Wenn Sie dies fehlerhafterweise gemacht haben oder ein Computer nicht mehr vertr Namensfilter + + + category.edit.part_ipn_prefix + Bauteil IPN-Präfix + + obsolete @@ -7156,15 +7252,15 @@ Wenn Sie dies fehlerhafterweise gemacht haben oder ein Computer nicht mehr vertr mass_creation.lines.placeholder - Element 1 + +Element 1 -> Element 1.1 +Element 1 -> Element 1.2]]> @@ -8497,6 +8593,12 @@ Element 1 -> Element 1.2 Maßeinheiten + + + perm.part_custom_states + Benutzerdefinierter Bauteilstatus + + obsolete @@ -9443,25 +9545,25 @@ Element 1 -> Element 1.2 filter.parameter_value_constraint.operator.< - Typ. Wert < + filter.parameter_value_constraint.operator.> - Typ. Wert > + ]]> filter.parameter_value_constraint.operator.<= - Typ. Wert <= + filter.parameter_value_constraint.operator.>= - Typ. Wert >= + =]]> @@ -9569,7 +9671,7 @@ Element 1 -> Element 1.2 parts_list.search.searching_for - Suche Teile mit dem Suchbegriff <b>%keyword%</b> + %keyword%]]> @@ -10229,13 +10331,13 @@ Element 1 -> Element 1.2 project.builds.number_of_builds_possible - Sie haben genug Bauteile auf Lager, um <b>%max_builds%</b> Exemplare dieses Projektes zu bauen. + %max_builds% Exemplare dieses Projektes zu bauen.]]> project.builds.check_project_status - Der aktuelle Projektstatus ist <b>"%project_status%"</b>. Sie sollten überprüfen, ob sie das Projekt mit diesem Status wirklich bauen wollen! + "%project_status%". Sie sollten überprüfen, ob sie das Projekt mit diesem Status wirklich bauen wollen!]]> @@ -10328,16 +10430,28 @@ Element 1 -> Element 1.2 z.B. "/Kondensator \d+ nF/i" + + + category.edit.part_ipn_prefix.placeholder + z.B. "B12A" + + category.edit.partname_regex.help Ein PCRE-kompatibler regulärer Ausdruck, den der Bauteilename erfüllen muss. + + + category.edit.part_ipn_prefix.help + Ein Präfix, der bei der IPN-Eingabe eines Bauteils vorgeschlagen wird. + + entity.select.add_hint - Nutzen Sie -> um verschachtelte Strukturen anzulegen, z.B. "Element 1->Element 1.1" + um verschachtelte Strukturen anzulegen, z.B. "Element 1->Element 1.1"]]> @@ -10361,13 +10475,13 @@ Element 1 -> Element 1.2 homepage.first_steps.introduction - Die Datenbank ist momentan noch leer. Sie möchten möglicherweise die <a href="%url%">Dokumentation</a> lesen oder anfangen, die folgenden Datenstrukturen anzulegen. + Dokumentation lesen oder anfangen, die folgenden Datenstrukturen anzulegen.]]> homepage.first_steps.create_part - Oder Sie können direkt ein <a href="%url%">neues Bauteil erstellen</a>. + neues Bauteil erstellen.]]> @@ -10379,7 +10493,7 @@ Element 1 -> Element 1.2 homepage.forum.text - Für Fragen rund um Part-DB, nutze das <a class="link-external" rel="noopener" target="_blank" href="%href%">Diskussionsforum</a> + Diskussionsforum]]> @@ -10880,6 +10994,12 @@ Element 1 -> Element 1.2 Maßeinheit + + + log.element_edited.changed_fields.partCustomState + Benutzerdefinierter Bauteilstatus + + log.element_edited.changed_fields.expiration_date @@ -11039,7 +11159,7 @@ Element 1 -> Element 1.2 parts.import.help_documentation - Konsultieren Sie die <a href="%link%">Dokumentation</a> für weiter Informationen über das Dateiformat. + Dokumentation für weiter Informationen über das Dateiformat.]]> @@ -11144,6 +11264,18 @@ Element 1 -> Element 1.2 Bearbeite Maßeinheit + + + part_custom_state.new + Neuer benutzerdefinierter Bauteilstatus + + + + + part_custom_state.edit + Bearbeite benutzerdefinierten Bauteilstatus + + user.aboutMe.label @@ -11219,7 +11351,7 @@ Element 1 -> Element 1.2 part.filter.lessThanDesired - Weniger vorhanden als gewünscht (Gesamtmenge < Mindestmenge) + @@ -12031,13 +12163,13 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön part.merge.confirm.title - Möchten Sie wirklich <b>%other%</b> in <b>%target%</b> zusammenführen? + %other% in %target% zusammenführen?]]> part.merge.confirm.message - <b>%other%</b> wird gelöscht, und das aktuelle Bauteil wird mit den angezeigten Daten gespeichert. + %other% wird gelöscht, und das aktuelle Bauteil wird mit den angezeigten Daten gespeichert.]]> @@ -12391,7 +12523,7 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön settings.ips.element14.apiKey.help - Sie können sich unter <a href="https://partner.element14.com/">https://partner.element14.com/</a> für einen API-Schlüssel registrieren. + https://partner.element14.com/ für einen API-Schlüssel registrieren.]]> @@ -12403,7 +12535,7 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön settings.ips.element14.storeId.help - Die Domain des Shops, aus dem die Daten abgerufen werden sollen. Diese bestimmt die Sprache und Währung der Ergebnisse. Eine Liste der gültigen Domains finden Sie <a href="https://partner.element14.com/docs/Product_Search_API_REST__Description">hier</a>. + hier.]]> @@ -12421,7 +12553,7 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön settings.ips.tme.token.help - Sie können einen API-Token und einen geheimen Schlüssel unter <a href="https://developers.tme.eu/en/">https://developers.tme.eu/en/</a> erhalten. + https://developers.tme.eu/en/ erhalten.]]> @@ -12469,7 +12601,7 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön settings.ips.mouser.apiKey.help - Sie können sich unter <a href="https://eu.mouser.com/api-hub/">https://eu.mouser.com/api-hub/</a> für einen API-Schlüssel registrieren. + https://eu.mouser.com/api-hub/ für einen API-Schlüssel registrieren.]]> @@ -12517,7 +12649,7 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön settings.ips.mouser.searchOptions.rohsAndInStock - Sofort verfügbar & RoHS konform + @@ -12547,7 +12679,7 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön settings.system.attachments - Anhänge & Dateien + @@ -12571,7 +12703,7 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön settings.system.attachments.allowDownloads.help - Mit dieser Option können Benutzer externe Dateien in die Part-DB herunterladen, indem sie eine URL angeben. <b>Achtung: Dies kann ein Sicherheitsrisiko darstellen, da Benutzer dadurch möglicherweise über die Part-DB auf Intranet-Ressourcen zugreifen können!</b> + Achtung: Dies kann ein Sicherheitsrisiko darstellen, da Benutzer dadurch möglicherweise über die Part-DB auf Intranet-Ressourcen zugreifen können!]]> @@ -12745,8 +12877,8 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön settings.system.localization.base_currency_description - Die Währung, in der Preisinformationen und Wechselkurse gespeichert werden. Diese Währung wird angenommen, wenn für eine Preisinformation keine Währung festgelegt ist. -<b>Bitte beachten Sie, dass die Währungen bei einer Änderung dieses Wertes nicht umgerechnet werden. Wenn Sie also die Basiswährung ändern, nachdem Sie bereits Preisinformationen hinzugefügt haben, führt dies zu falschen Preisen!</b> + Bitte beachten Sie, dass die Währungen bei einer Änderung dieses Wertes nicht umgerechnet werden. Wenn Sie also die Basiswährung ändern, nachdem Sie bereits Preisinformationen hinzugefügt haben, führt dies zu falschen Preisen!]]> @@ -12776,7 +12908,7 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön settings.misc.kicad_eda.category_depth.help - Dieser Wert bestimmt die Tiefe des Kategoriebaums, der in KiCad sichtbar ist. 0 bedeutet, dass nur die Kategorien der obersten Ebene sichtbar sind. Setzen Sie den Wert auf > 0, um weitere Ebenen anzuzeigen. Setzen Sie den Wert auf -1, um alle Teile der Part-DB innerhalb einer einzigen Kategorie in KiCad anzuzeigen. + 0, um weitere Ebenen anzuzeigen. Setzen Sie den Wert auf -1, um alle Teile der Part-DB innerhalb einer einzigen Kategorie in KiCad anzuzeigen.]]> @@ -12794,7 +12926,7 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön settings.behavior.sidebar.items.help - Die Menüs, die standardmäßig in der Seitenleiste angezeigt werden. Die Reihenfolge der Elemente kann per Drag & Drop geändert werden. + @@ -12842,7 +12974,7 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön settings.behavior.table.parts_default_columns.help - Die Spalten, die standardmäßig in Bauteiltabellen angezeigt werden sollen. Die Reihenfolge der Elemente kann per Drag & Drop geändert werden. + @@ -12896,7 +13028,7 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön settings.ips.oemsecrets.sortMode.M - Vollständigkeit & Herstellername + @@ -13055,6 +13187,54 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön Wenn Sie Wechselkurse zwischen Nicht-Euro-Währungen benötigen, können Sie hier einen API-Schlüssel von fixer.io eingeben. + + + settings.misc.ipn_suggest + Bauteil IPN-Vorschlagsliste + + + + + settings.misc.ipn_suggest.regex + Regex + + + + + settings.misc.ipn_suggest.regex_help + Hilfetext + + + + + settings.misc.ipn_suggest.regex_help_description + Definieren Sie Ihren eigenen Nutzer-Hilfetext zur Regex Formatvorgabe. + + + + + settings.misc.ipn_suggest.autoAppendSuffix + Hänge ein inkrementelles Suffix an, wenn eine IPN bereits durch ein anderes Bauteil verwendet wird. + + + + + settings.misc.ipn_suggest.suggestPartDigits + Stellen für numerisches Inkrement + + + + + settings.misc.ipn_suggest.useDuplicateDescription + Verwende Bauteilebeschreibung zur Ermittlung der nächsten IPN + + + + + settings.misc.ipn_suggest.suggestPartDigits.help + Die Anzahl der Ziffern, die für die inkrementale Nummerierung von Teilen im IPN-Vorschlagssystem verwendet werden. + + settings.behavior.part_info @@ -13508,7 +13688,7 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön settings.behavior.homepage.items.help - Die Elemente, die auf der Startseite angezeigt werden sollen. Die Reihenfolge kann per Drag & Drop geändert werden. + @@ -14250,5 +14430,11 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön Dies ist auf der Informationsquellen Übersichtsseite möglich. + + + settings.misc.ipn_suggest.useDuplicateDescription.help + Wenn aktiviert, wird die Bauteil-Beschreibung verwendet, um vorhandene Teile mit derselben Beschreibung zu finden und die nächste verfügbare IPN für die Vorschlagsliste zu ermitteln, indem der numerische Suffix entsprechend erhöht wird. + + diff --git a/translations/messages.el.xlf b/translations/messages.el.xlf index cc17d9be..3618fa3d 100644 --- a/translations/messages.el.xlf +++ b/translations/messages.el.xlf @@ -318,6 +318,12 @@ Μονάδα μέτρησης + + + part_custom_state.caption + Προσαρμοσμένη κατάσταση εξαρτήματος + + Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:5 @@ -1535,5 +1541,131 @@ Επεξεργασία + + + perm.part_custom_states + Προσαρμοσμένη κατάσταση εξαρτήματος + + + + + tree.tools.edit.part_custom_state + Προσαρμοσμένη κατάσταση εξαρτήματος + + + + + part_custom_state.new + Νέα προσαρμοσμένη κατάσταση εξαρτήματος + + + + + part_custom_state.edit + Επεξεργασία προσαρμοσμένης κατάστασης εξαρτήματος + + + + + part_custom_state.label + Προσαρμοσμένη κατάσταση μέρους + + + + + log.element_edited.changed_fields.partCustomState + Προσαρμοσμένη κατάσταση εξαρτήματος + + + + + part.edit.partCustomState + Προσαρμοσμένη κατάσταση εξαρτήματος + + + + + part.table.partCustomState + Προσαρμοσμένη κατάσταση μέρους + + + + + category.edit.part_ipn_prefix + Πρόθεμα εξαρτήματος IPN + + + + + category.edit.part_ipn_prefix.placeholder + π.χ. "B12A" + + + + + category.edit.part_ipn_prefix.help + Μια προτεινόμενη πρόθεμα κατά την εισαγωγή του IPN ενός τμήματος. + + + + + part.edit.tab.advanced.ipn.commonSectionHeader + Προτάσεις χωρίς αύξηση μέρους + + + + + part.edit.tab.advanced.ipn.partIncrementHeader + Προτάσεις με αριθμητικές αυξήσεις μερών + + + + + part.edit.tab.advanced.ipn.prefix.description.current-increment + Τρέχουσα προδιαγραφή IPN του εξαρτήματος + + + + + part.edit.tab.advanced.ipn.prefix.description.increment + Επόμενη δυνατή προδιαγραφή IPN βάσει της ίδιας περιγραφής εξαρτήματος + + + + + part.edit.tab.advanced.ipn.prefix_empty.direct_category + Το IPN πρόθεμα της άμεσης κατηγορίας είναι κενό, καθορίστε το στην κατηγορία "%name%" + + + + + part.edit.tab.advanced.ipn.prefix.direct_category + Πρόθεμα IPN για την άμεση κατηγορία + + + + + part.edit.tab.advanced.ipn.prefix.direct_category.increment + Πρόθεμα IPN της άμεσης κατηγορίας και μιας ειδικής για μέρος αύξησης + + + + + part.edit.tab.advanced.ipn.prefix.hierarchical.no_increment + Προθέματα IPN με ιεραρχική σειρά κατηγοριών των προθέτων γονέων + + + + + part.edit.tab.advanced.ipn.prefix.hierarchical.increment + Προθέματα IPN με ιεραρχική σειρά κατηγοριών των προθέτων γονέων και συγκεκριμένη αύξηση για το μέρος + + + + + part.edit.tab.advanced.ipn.prefix.not_saved + Δημιουργήστε πρώτα ένα εξάρτημα και αντιστοιχίστε το σε μια κατηγορία: με τις υπάρχουσες κατηγορίες και τα δικά τους προθέματα IPN, η ονομασία IPN για το εξάρτημα μπορεί να προταθεί αυτόματα + + diff --git a/translations/messages.en.xlf b/translations/messages.en.xlf index 62f145e0..a5d86338 100644 --- a/translations/messages.en.xlf +++ b/translations/messages.en.xlf @@ -242,7 +242,7 @@ part.info.timetravel_hint - This is how the part appeared before %timestamp%. <i>Please note that this feature is experimental, so the info may not be correct.</i> + Please note that this feature is experimental, so the info may not be correct.]]> @@ -548,6 +548,12 @@ Measurement Unit + + + part_custom_state.caption + Custom part states + + Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:5 @@ -731,10 +737,10 @@ user.edit.tfa.disable_tfa_message - This will disable <b>all active two-factor authentication methods of the user</b> and delete the <b>backup codes</b>! -<br> -The user will have to set up all two-factor authentication methods again and print new backup codes! <br><br> -<b>Only do this if you are absolutely sure about the identity of the user (seeking help), otherwise the account could be compromised by an attacker!</b> + all active two-factor authentication methods of the user and delete the backup codes! +
    +The user will have to set up all two-factor authentication methods again and print new backup codes!

    +Only do this if you are absolutely sure about the identity of the user (seeking help), otherwise the account could be compromised by an attacker!]]>
    @@ -885,9 +891,9 @@ The user will have to set up all two-factor authentication methods again and pri entity.delete.message - This can not be undone! -<br> -Sub elements will be moved upwards. + +Sub elements will be moved upwards.]]> @@ -1441,7 +1447,7 @@ Sub elements will be moved upwards. homepage.github.text - Source, downloads, bug reports, to-do-list etc. can be found on <a href="%href%" class="link-external" target="_blank">GitHub project page</a> + GitHub project page]]> @@ -1463,7 +1469,7 @@ Sub elements will be moved upwards. homepage.help.text - Help and tips can be found in Wiki the <a href="%href%" class="link-external" target="_blank">GitHub page</a> + GitHub page]]> @@ -1705,7 +1711,7 @@ Sub elements will be moved upwards. email.pw_reset.fallback - If this does not work for you, go to <a href="%url%">%url%</a> and enter the following info + %url% and enter the following info]]> @@ -1735,7 +1741,7 @@ Sub elements will be moved upwards. email.pw_reset.valid_unit %date% - The reset token will be valid until <i>%date%</i>. + %date%.]]> @@ -1842,6 +1848,66 @@ Sub elements will be moved upwards. Advanced + + + part.edit.tab.advanced.ipn.commonSectionHeader + Suggestions without part increment + + + + + part.edit.tab.advanced.ipn.partIncrementHeader + Suggestions with numeric part increment + + + + + part.edit.tab.advanced.ipn.prefix.description.current-increment + Current IPN specification of the part + + + + + part.edit.tab.advanced.ipn.prefix.description.increment + Next possible IPN specification based on an identical part description + + + + + part.edit.tab.advanced.ipn.prefix_empty.direct_category + IPN prefix of direct category empty, specify one in category "%name%" + + + + + part.edit.tab.advanced.ipn.prefix.direct_category + IPN prefix of direct category + + + + + part.edit.tab.advanced.ipn.prefix.direct_category.increment + IPN prefix of direct category and part-specific increment + + + + + part.edit.tab.advanced.ipn.prefix.hierarchical.no_increment + IPN prefixes with hierarchical category order of parent-prefix(es) + + + + + part.edit.tab.advanced.ipn.prefix.hierarchical.increment + IPN prefixes with hierarchical category order of parent-prefix(es) and part-specific increment + + + + + part.edit.tab.advanced.ipn.prefix.not_saved + Please create part at first and assign it to a category: with existing categories and their own IPN prefix, the IPN for the part can be suggested automatically + + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:40 @@ -3578,8 +3644,8 @@ Sub elements will be moved upwards. tfa_google.disable.confirm_message - If you disable the Authenticator App, all backup codes will be deleted, so you may need to reprint them.<br> -Also note that without two-factor authentication, your account is no longer as well protected against attackers! + +Also note that without two-factor authentication, your account is no longer as well protected against attackers!]]> @@ -3599,7 +3665,7 @@ Also note that without two-factor authentication, your account is no longer as w tfa_google.step.download - Download an authenticator app (e.g. <a class="link-external" target="_blank" href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2">Google Authenticator</a> oder <a class="link-external" target="_blank" href="https://play.google.com/store/apps/details?id=org.fedorahosted.freeotp">FreeOTP Authenticator</a>) + Google Authenticator oder FreeOTP Authenticator)]]> @@ -3841,8 +3907,8 @@ Also note that without two-factor authentication, your account is no longer as w tfa_trustedDevices.explanation - When checking the second factor, the current computer can be marked as trustworthy, so no more two-factor checks on this computer are needed. -If you have done this incorrectly or if a computer is no longer trusted, you can reset the status of <i>all </i>computers here. + all computers here.]]> @@ -4831,6 +4897,12 @@ If you have done this incorrectly or if a computer is no longer trusted, you can Measurement Unit + + + part.table.partCustomState + Custom part state + + Part-DB1\src\DataTables\PartsDataTable.php:236 @@ -5313,7 +5385,7 @@ If you have done this incorrectly or if a computer is no longer trusted, you can label_options.lines_mode.help - If you select Twig here, the content field is interpreted as Twig template. See <a href="https://twig.symfony.com/doc/3.x/templates.html">Twig documentation</a> and <a href="https://docs.part-db.de/usage/labels.html#twig-mode">Wiki</a> for more information. + Twig documentation and Wiki for more information.]]> @@ -5695,6 +5767,12 @@ If you have done this incorrectly or if a computer is no longer trusted, you can Measuring unit + + + part.edit.partCustomState + Custom part state + + Part-DB1\src\Form\Part\PartBaseType.php:212 @@ -5982,6 +6060,12 @@ If you have done this incorrectly or if a computer is no longer trusted, you can Measurement unit + + + part_custom_state.label + Custom part state + + Part-DB1\src\Services\ElementTypeNameGenerator.php:90 @@ -6225,6 +6309,12 @@ If you have done this incorrectly or if a computer is no longer trusted, you can Measurement Unit + + + tree.tools.edit.part_custom_state + Custom part states + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:203 @@ -6959,6 +7049,12 @@ If you have done this incorrectly or if a computer is no longer trusted, you can Name filter + + + category.edit.part_ipn_prefix + Part IPN Prefix + + obsolete @@ -7157,15 +7253,15 @@ Exampletown mass_creation.lines.placeholder - Element 1 + +Element 1 -> Element 1.1 +Element 1 -> Element 1.2]]> @@ -8498,6 +8594,12 @@ Element 1 -> Element 1.2 Measurement unit + + + perm.part_custom_states + Custom part state + + obsolete @@ -9444,25 +9546,25 @@ Element 1 -> Element 1.2 filter.parameter_value_constraint.operator.< - Typ. Value < + filter.parameter_value_constraint.operator.> - Typ. Value > + ]]> filter.parameter_value_constraint.operator.<= - Typ. Value <= + filter.parameter_value_constraint.operator.>= - Typ. Value >= + =]]> @@ -9570,7 +9672,7 @@ Element 1 -> Element 1.2 parts_list.search.searching_for - Searching parts with keyword <b>%keyword%</b> + %keyword%]]> @@ -10230,13 +10332,13 @@ Element 1 -> Element 1.2 project.builds.number_of_builds_possible - You have enough stocked to build <b>%max_builds%</b> builds of this project. + %max_builds% builds of this project.]]> project.builds.check_project_status - The current project status is <b>"%project_status%"</b>. You should check if you really want to build the project with this status! + "%project_status%". You should check if you really want to build the project with this status!]]> @@ -10329,16 +10431,28 @@ Element 1 -> Element 1.2 e.g "/Capacitor \d+ nF/i" + + + category.edit.part_ipn_prefix.placeholder + e.g "B12A" + + category.edit.partname_regex.help A PCRE-compatible regular expression, which a part name have to match. + + + category.edit.part_ipn_prefix.help + A prefix suggested when entering the IPN of a part. + + entity.select.add_hint - Use -> to create nested structures, e.g. "Node 1->Node 1.1" + to create nested structures, e.g. "Node 1->Node 1.1"]]> @@ -10362,13 +10476,13 @@ Element 1 -> Element 1.2 homepage.first_steps.introduction - Your database is still empty. You might want to read the <a href="%url%">documentation</a> or start to creating the following data structures: + documentation or start to creating the following data structures:]]> homepage.first_steps.create_part - Or you can directly <a href="%url%">create a new part</a>. + create a new part.]]> @@ -10380,7 +10494,7 @@ Element 1 -> Element 1.2 homepage.forum.text - For questions about Part-DB use the <a href="%href%" class="link-external" target="_blank">discussion forum</a> + discussion forum]]> @@ -10881,6 +10995,12 @@ Element 1 -> Element 1.2 Measuring Unit + + + log.element_edited.changed_fields.partCustomState + Custom part state + + log.element_edited.changed_fields.expiration_date @@ -11040,7 +11160,7 @@ Element 1 -> Element 1.2 parts.import.help_documentation - See the <a href="%link%">documentation</a> for more information on the file format. + documentation for more information on the file format.]]> @@ -11145,6 +11265,18 @@ Element 1 -> Element 1.2 Edit Measurement Unit + + + part_custom_state.new + New custom part state + + + + + part_custom_state.edit + Edit custom part state + + user.aboutMe.label @@ -11220,7 +11352,7 @@ Element 1 -> Element 1.2 part.filter.lessThanDesired - In stock less than desired (total amount < min. amount) + @@ -12032,13 +12164,13 @@ Please note, that you can not impersonate a disabled user. If you try you will g part.merge.confirm.title - Do you really want to merge <b>%other%</b> into <b>%target%</b>? + %other% into %target%?]]> part.merge.confirm.message - <b>%other%</b> will be deleted, and the part will be saved with the shown information. + %other% will be deleted, and the part will be saved with the shown information.]]> @@ -12392,7 +12524,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g settings.ips.element14.apiKey.help - You can register for an API key on <a href="https://partner.element14.com/">https://partner.element14.com/</a>. + https://partner.element14.com/.]]> @@ -12404,7 +12536,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g settings.ips.element14.storeId.help - The store domain to retrieve the data from. This decides the language and currency of results. See <a href="https://partner.element14.com/docs/Product_Search_API_REST__Description">here</a> for a list of valid domains. + here for a list of valid domains.]]> @@ -12422,7 +12554,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g settings.ips.tme.token.help - You can get an API token and secret on <a href="https://developers.tme.eu/en/">https://developers.tme.eu/en/</a>. + https://developers.tme.eu/en/.]]> @@ -12470,7 +12602,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g settings.ips.mouser.apiKey.help - You can register for an API key on <a href="https://eu.mouser.com/api-hub/">https://eu.mouser.com/api-hub/</a>. + https://eu.mouser.com/api-hub/.]]> @@ -12548,7 +12680,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g settings.system.attachments - Attachments & Files + @@ -12572,7 +12704,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g settings.system.attachments.allowDownloads.help - With this option users can download external files into Part-DB by providing an URL. <b>Attention: This can be a security issue, as it might allow users to access intranet ressources via Part-DB!</b> + Attention: This can be a security issue, as it might allow users to access intranet ressources via Part-DB!]]> @@ -12746,8 +12878,8 @@ Please note, that you can not impersonate a disabled user. If you try you will g settings.system.localization.base_currency_description - The currency that is used to store price information and exchange rates in. This currency is assumed, when no currency is set for a price information. -<b>Please note that the currencies are not converted, when changing this value. So changing the default currency after you already added price information, will result in wrong prices!</b> + Please note that the currencies are not converted, when changing this value. So changing the default currency after you already added price information, will result in wrong prices!]]> @@ -12777,7 +12909,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g settings.misc.kicad_eda.category_depth.help - This value determines the depth of the category tree, that is visible inside KiCad. 0 means that only the top level categories are visible. Set to a value > 0 to show more levels. Set to -1, to show all parts of Part-DB inside a sigle cnategory in KiCad. + 0 to show more levels. Set to -1, to show all parts of Part-DB inside a sigle cnategory in KiCad.]]> @@ -12795,7 +12927,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g settings.behavior.sidebar.items.help - The menus which appear at the sidebar by default. Order of items can be changed via drag & drop. + @@ -12843,7 +12975,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g settings.behavior.table.parts_default_columns.help - The columns to show by default in part tables. Order of items can be changed via drag & drop. + @@ -12897,7 +13029,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g settings.ips.oemsecrets.sortMode.M - Completeness & Manufacturer name + @@ -13056,6 +13188,54 @@ Please note, that you can not impersonate a disabled user. If you try you will g If you need exchange rates between non-euro currencies, you can input an API key from fixer.io here. + + + settings.misc.ipn_suggest + Part IPN Suggest + + + + + settings.misc.ipn_suggest.regex + Regex + + + + + settings.misc.ipn_suggest.regex_help + Help text + + + + + settings.misc.ipn_suggest.regex_help_description + Define your own user help text for the Regex format specification. + + + + + settings.misc.ipn_suggest.autoAppendSuffix + Add incremental suffix to IPN, if the value is already used by another part + + + + + settings.misc.ipn_suggest.suggestPartDigits + Increment Digits + + + + + settings.misc.ipn_suggest.useDuplicateDescription + Use part description to find next available IPN + + + + + settings.misc.ipn_suggest.suggestPartDigits.help + The number of digits used for the incremental numbering of parts in the IPN (Internal Part Number) suggestion system. + + settings.behavior.part_info @@ -13509,7 +13689,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g settings.behavior.homepage.items.help - The items to show at the homepage. Order can be changed via drag & drop. + @@ -14276,5 +14456,17 @@ You can do this in the provider info list. You can do this in the provider info list. + + + settings.misc.ipn_suggest.useDuplicateDescription.help + When enabled, the part’s description is used to find existing parts with the same description and to determine the next available IPN by incrementing their numeric suffix for the suggestion list. + + + + + settings.misc.ipn_suggest.regex.help + A PCRE-compatible regular expression every IPN has to fulfill. Leave empty to allow all everything as IPN. + + diff --git a/translations/messages.es.xlf b/translations/messages.es.xlf index fce38e52..57ac5c85 100644 --- a/translations/messages.es.xlf +++ b/translations/messages.es.xlf @@ -548,6 +548,12 @@ Unidad de medida + + + part_custom_state.caption + Estado personalizado del componente + + Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:5 @@ -1842,6 +1848,66 @@ Subelementos serán desplazados hacia arriba. Avanzado + + + part.edit.tab.advanced.ipn.commonSectionHeader + Sugerencias sin incremento de parte + + + + + part.edit.tab.advanced.ipn.partIncrementHeader + Sugerencias con incrementos numéricos de partes + + + + + part.edit.tab.advanced.ipn.prefix.description.current-increment + Especificación actual de IPN de la pieza + + + + + part.edit.tab.advanced.ipn.prefix.description.increment + Siguiente especificación de IPN posible basada en una descripción idéntica de la pieza + + + + + part.edit.tab.advanced.ipn.prefix_empty.direct_category + El prefijo IPN de la categoría directa está vacío, especifíquelo en la categoría "%name%" + + + + + part.edit.tab.advanced.ipn.prefix.direct_category + Prefijo IPN de la categoría directa + + + + + part.edit.tab.advanced.ipn.prefix.direct_category.increment + Prefijo IPN de la categoría directa y un incremento específico de la pieza + + + + + part.edit.tab.advanced.ipn.prefix.hierarchical.no_increment + Prefijos IPN con orden jerárquico de categorías de prefijos principales + + + + + part.edit.tab.advanced.ipn.prefix.hierarchical.increment + Prefijos IPN con orden jerárquico de categorías de prefijos principales y un incremento específico para la parte + + + + + part.edit.tab.advanced.ipn.prefix.not_saved + Primero cree un componente y asígnele una categoría: con las categorías existentes y sus propios prefijos IPN, el identificador IPN para el componente puede ser sugerido automáticamente + + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:40 @@ -4830,6 +4896,12 @@ Subelementos serán desplazados hacia arriba. Unidad de Medida + + + part.table.partCustomState + Estado personalizado del componente + + Part-DB1\src\DataTables\PartsDataTable.php:236 @@ -5694,6 +5766,12 @@ Subelementos serán desplazados hacia arriba. Unidad de medida + + + part.edit.partCustomState + Estado personalizado de la pieza + + Part-DB1\src\Form\Part\PartBaseType.php:212 @@ -5981,6 +6059,12 @@ Subelementos serán desplazados hacia arriba. Unidad de medida + + + part_custom_state.label + Estado personalizado de la pieza + + Part-DB1\src\Services\ElementTypeNameGenerator.php:90 @@ -6224,6 +6308,12 @@ Subelementos serán desplazados hacia arriba. Unidad de medida + + + tree.tools.edit.part_custom_state + Estado personalizado del componente + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:203 @@ -6958,6 +7048,12 @@ Subelementos serán desplazados hacia arriba. Filtro de nombre + + + category.edit.part_ipn_prefix + Prefijo de IPN de la pieza + + obsolete @@ -8494,6 +8590,12 @@ Elemento 3 Unidad de medida + + + perm.part_custom_states + Estado personalizado del componente + + obsolete @@ -10272,12 +10374,24 @@ Elemento 3 p.ej. "/Condensador \d+ nF/i" + + + category.edit.part_ipn_prefix.placeholder + p.ej. "B12A" + + category.edit.partname_regex.help Una expresión regular compatible con PCRE, la cual debe coincidir con el nombre de un componente. + + + category.edit.part_ipn_prefix.help + Un prefijo sugerido al ingresar el IPN de una parte. + + entity.select.add_hint @@ -10824,6 +10938,12 @@ Elemento 3 Unidad de medida + + + log.element_edited.changed_fields.partCustomState + Estado personalizado del componente + + log.element_edited.changed_fields.expiration_date @@ -11082,6 +11202,18 @@ Elemento 3 Editar Unidad de Medida + + + part_custom_state.new + Nuevo estado personalizado del componente + + + + + part_custom_state.edit + Editar estado personalizado del componente + + user.aboutMe.label diff --git a/translations/messages.fr.xlf b/translations/messages.fr.xlf index 11f7da3d..8ed971b8 100644 --- a/translations/messages.fr.xlf +++ b/translations/messages.fr.xlf @@ -1,7 +1,7 @@ - + Part-DB1\templates\AdminPages\AttachmentTypeAdmin.html.twig:4 Part-DB1\templates\AdminPages\AttachmentTypeAdmin.html.twig:4 @@ -9,10 +9,10 @@ attachment_type.caption - Type de fichiers pour la pièce jointe + Types pour fichiers joints - + Part-DB1\templates\AdminPages\AttachmentTypeAdmin.html.twig:12 new @@ -22,7 +22,7 @@ Modifier le type de pièce jointe - + Part-DB1\templates\AdminPages\AttachmentTypeAdmin.html.twig:16 new @@ -32,7 +32,7 @@ Nouveau type de pièce jointe - + Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:4 Part-DB1\templates\_sidebar.html.twig:22 @@ -51,7 +51,7 @@ Catégories - + Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:8 Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:19 @@ -64,7 +64,7 @@ Options - + Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:9 Part-DB1\templates\AdminPages\CompanyAdminBase.html.twig:15 @@ -77,7 +77,7 @@ Avancé - + Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:13 new @@ -87,7 +87,7 @@ Éditer la catégorie - + Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:17 new @@ -97,7 +97,7 @@ Nouvelle catégorie - + Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:4 Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:4 @@ -107,7 +107,7 @@ Devise - + Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:12 Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:12 @@ -117,7 +117,7 @@ Code ISO - + Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:15 Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:15 @@ -127,17 +127,17 @@ Symbole de la devise - + Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:29 new currency.edit - Éditer la devise + Editer la devise - + Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:33 new @@ -147,38 +147,7 @@ Nouvelle devise - - - Part-DB1\templates\AdminPages\DeviceAdmin.html.twig:4 - Part-DB1\templates\AdminPages\DeviceAdmin.html.twig:4 - templates\AdminPages\DeviceAdmin.html.twig:4 - - - project.caption - Projet - - - - - Part-DB1\templates\AdminPages\DeviceAdmin.html.twig:8 - new - - - project.edit - Éditer le projet - - - - - Part-DB1\templates\AdminPages\DeviceAdmin.html.twig:12 - new - - - project.new - Nouveau projet - - - + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19 Part-DB1\templates\_navbar_search.html.twig:67 @@ -201,7 +170,7 @@ Recherche - + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:23 Part-DB1\templates\_sidebar.html.twig:3 @@ -217,7 +186,7 @@ Agrandir tout - + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:27 Part-DB1\templates\_sidebar.html.twig:4 @@ -233,7 +202,7 @@ Réduire tout - + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:54 Part-DB1\templates\Parts\info\_sidebar.html.twig:4 @@ -242,10 +211,10 @@ part.info.timetravel_hint - C'est ainsi que le composant apparaissait avant le %timestamp%. <i>Veuillez noter que cette fonctionnalité est expérimentale, les informations ne sont peut-être pas correctes. </i> + C'est ainsi que le composant apparaissait avant le %timestamp%. <i>Veuillez noter que cette fonctionnalité est expérimentale, donc les infos ne sont peut-être pas correctes. </i> - + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:60 Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:60 @@ -256,7 +225,7 @@ Propriétés - + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:61 Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:61 @@ -267,7 +236,7 @@ Informations - + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:63 Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:63 @@ -278,7 +247,7 @@ Historique - + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:66 Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:66 @@ -289,7 +258,7 @@ Exporter - + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:68 Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:68 @@ -297,20 +266,20 @@ import_export.label - Importer / exporter + Importer exporter - + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:69 Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:69 mass_creation.label - Création en masse + Création multiple - + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:82 Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:82 @@ -321,7 +290,7 @@ Commun - + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:86 Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:86 @@ -331,7 +300,7 @@ Fichiers joints - + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:90 @@ -340,7 +309,7 @@ Paramètres - + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:179 Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:167 @@ -351,17 +320,17 @@ Exporter tous les éléments - + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:185 Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:173 mass_creation.help - Chaque ligne sera interprétée comme le nom d'un élément qui sera créé. Vous pouvez créer des structures imbriquées par indentations. + Chaque ligne sera interprétée comme le nom d'un élément qui sera créé. - + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:45 Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:45 @@ -372,7 +341,7 @@ Éditer l'élément "%name" - + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:50 Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:50 @@ -383,7 +352,7 @@ Nouvel élément - + Part-DB1\templates\AdminPages\FootprintAdmin.html.twig:4 Part-DB1\templates\_sidebar.html.twig:9 @@ -398,17 +367,17 @@ Empreintes - + Part-DB1\templates\AdminPages\FootprintAdmin.html.twig:13 new footprint.edit - Éditer l'empreinte + Editer l'empreinte - + Part-DB1\templates\AdminPages\FootprintAdmin.html.twig:17 new @@ -418,7 +387,7 @@ Nouvelle empreinte - + Part-DB1\templates\AdminPages\GroupAdmin.html.twig:4 Part-DB1\templates\AdminPages\GroupAdmin.html.twig:4 @@ -428,7 +397,7 @@ Groupes - + Part-DB1\templates\AdminPages\GroupAdmin.html.twig:9 Part-DB1\templates\AdminPages\UserAdmin.html.twig:16 @@ -440,17 +409,17 @@ Permissions - + Part-DB1\templates\AdminPages\GroupAdmin.html.twig:24 new group.edit - Éditer le groupe + Editer le groupe - + Part-DB1\templates\AdminPages\GroupAdmin.html.twig:28 new @@ -460,7 +429,7 @@ Nouveau groupe - + Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:4 @@ -469,7 +438,7 @@ Profil des étiquettes - + Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:8 @@ -478,7 +447,7 @@ Avancé - + Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:9 @@ -487,17 +456,17 @@ Commentaire - + Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:55 new label_profile.edit - Éditer profil d'étiquette + Editer profil d'étiquette - + Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:59 new @@ -507,7 +476,7 @@ Nouveau profil d'étiquette - + Part-DB1\templates\AdminPages\ManufacturerAdmin.html.twig:4 Part-DB1\templates\AdminPages\ManufacturerAdmin.html.twig:4 @@ -518,7 +487,7 @@ Fabricants - + Part-DB1\templates\AdminPages\ManufacturerAdmin.html.twig:8 new @@ -528,7 +497,7 @@ Modifiez le fabricant - + Part-DB1\templates\AdminPages\ManufacturerAdmin.html.twig:12 new @@ -538,7 +507,7 @@ Nouveau fabricant - + Part-DB1\templates\AdminPages\MeasurementUnitAdmin.html.twig:4 Part-DB1\templates\AdminPages\MeasurementUnitAdmin.html.twig:4 @@ -548,7 +517,13 @@ Unité de mesure - + + + part_custom_state.caption + État personnalisé du composant + + + Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:5 Part-DB1\templates\_sidebar.html.twig:8 @@ -563,7 +538,7 @@ Emplacement de stockage - + Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:32 new @@ -573,7 +548,7 @@ Modifier l'emplacement de stockage - + Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:36 new @@ -583,7 +558,7 @@ Nouvel emplacement de stockage - + Part-DB1\templates\AdminPages\SupplierAdmin.html.twig:4 Part-DB1\templates\AdminPages\SupplierAdmin.html.twig:4 @@ -594,7 +569,7 @@ Fournisseurs - + Part-DB1\templates\AdminPages\SupplierAdmin.html.twig:16 new @@ -604,7 +579,7 @@ Modifier le fournisseur - + Part-DB1\templates\AdminPages\SupplierAdmin.html.twig:20 new @@ -614,7 +589,7 @@ Nouveau fournisseur - + Part-DB1\templates\AdminPages\UserAdmin.html.twig:8 Part-DB1\templates\AdminPages\UserAdmin.html.twig:8 @@ -624,7 +599,7 @@ Utilisateurs - + Part-DB1\templates\AdminPages\UserAdmin.html.twig:14 Part-DB1\templates\AdminPages\UserAdmin.html.twig:14 @@ -634,7 +609,7 @@ Configuration - + Part-DB1\templates\AdminPages\UserAdmin.html.twig:15 Part-DB1\templates\AdminPages\UserAdmin.html.twig:15 @@ -644,7 +619,7 @@ Mot de passe - + Part-DB1\templates\AdminPages\UserAdmin.html.twig:45 Part-DB1\templates\AdminPages\UserAdmin.html.twig:45 @@ -654,7 +629,7 @@ Authentification à deux facteurs - + Part-DB1\templates\AdminPages\UserAdmin.html.twig:47 Part-DB1\templates\AdminPages\UserAdmin.html.twig:47 @@ -664,7 +639,7 @@ Application d'authentification active - + Part-DB1\templates\AdminPages\UserAdmin.html.twig:48 Part-DB1\templates\Users\backup_codes.html.twig:15 @@ -678,7 +653,7 @@ Nombre de codes de secours restant - + Part-DB1\templates\AdminPages\UserAdmin.html.twig:49 Part-DB1\templates\Users\backup_codes.html.twig:17 @@ -692,7 +667,7 @@ Date de génération des codes de secours - + Part-DB1\templates\AdminPages\UserAdmin.html.twig:53 Part-DB1\templates\AdminPages\UserAdmin.html.twig:60 @@ -704,7 +679,7 @@ Méthode désactivée - + Part-DB1\templates\AdminPages\UserAdmin.html.twig:56 Part-DB1\templates\AdminPages\UserAdmin.html.twig:56 @@ -714,17 +689,17 @@ Clés de sécurité actives - + Part-DB1\templates\AdminPages\UserAdmin.html.twig:72 Part-DB1\templates\AdminPages\UserAdmin.html.twig:72 user.edit.tfa.disable_tfa_title - Voulez-vous vraiment poursuivre ? + Voulez vous vraiment poursuivre ? - + Part-DB1\templates\AdminPages\UserAdmin.html.twig:72 Part-DB1\templates\AdminPages\UserAdmin.html.twig:72 @@ -737,7 +712,7 @@ L'utilisateur devra configurer à nouveau toutes les méthodes d'authentificatio <b>Ne faites ceci qu'en étant sûr de l'identité de l'utilisateur (ayant besoin d'aide),autrement le compte pourrai être compromis!</b> - + Part-DB1\templates\AdminPages\UserAdmin.html.twig:73 Part-DB1\templates\AdminPages\UserAdmin.html.twig:73 @@ -747,7 +722,7 @@ L'utilisateur devra configurer à nouveau toutes les méthodes d'authentificatio Désactiver toutes les méthodes d'authentification à deux facteurs - + Part-DB1\templates\AdminPages\UserAdmin.html.twig:85 new @@ -757,7 +732,7 @@ L'utilisateur devra configurer à nouveau toutes les méthodes d'authentificatio Modifier l'utilisateur - + Part-DB1\templates\AdminPages\UserAdmin.html.twig:89 new @@ -767,7 +742,7 @@ L'utilisateur devra configurer à nouveau toutes les méthodes d'authentificatio Nouvel utilisateur - + Part-DB1\templates\AdminPages\_attachments.html.twig:4 Part-DB1\templates\Parts\edit\_attachments.html.twig:4 @@ -780,13 +755,21 @@ L'utilisateur devra configurer à nouveau toutes les méthodes d'authentificatio Supprimer - + + + Part-DB1\templates\AdminPages\_attachments.html.twig:41 + Part-DB1\templates\Parts\edit\_attachments.html.twig:38 + Part-DB1\templates\Parts\info\_attachments_info.html.twig:35 + Part-DB1\src\DataTables\AttachmentDataTable.php:159 + Part-DB1\templates\Parts\edit\_attachments.html.twig:38 + Part-DB1\src\DataTables\AttachmentDataTable.php:159 + - attachment.external_only - Pièce jointe externe uniquement + attachment.external + Externe - + Part-DB1\templates\AdminPages\_attachments.html.twig:49 Part-DB1\templates\Parts\edit\_attachments.html.twig:47 @@ -798,7 +781,7 @@ L'utilisateur devra configurer à nouveau toutes les méthodes d'authentificatio Miniature du fichier joint - + Part-DB1\templates\AdminPages\_attachments.html.twig:52 Part-DB1\templates\Parts\edit\_attachments.html.twig:50 @@ -808,11 +791,11 @@ L'utilisateur devra configurer à nouveau toutes les méthodes d'authentificatio Part-DB1\templates\Parts\info\_attachments_info.html.twig:45 - attachment.view_local - Vue locale de la pièce jointe + attachment.view + Afficher - + Part-DB1\templates\AdminPages\_attachments.html.twig:58 Part-DB1\templates\Parts\edit\_attachments.html.twig:56 @@ -828,7 +811,7 @@ L'utilisateur devra configurer à nouveau toutes les méthodes d'authentificatio Fichier introuvable - + Part-DB1\templates\AdminPages\_attachments.html.twig:66 Part-DB1\templates\Parts\edit\_attachments.html.twig:64 @@ -840,7 +823,7 @@ L'utilisateur devra configurer à nouveau toutes les méthodes d'authentificatio Fichier joint privé - + Part-DB1\templates\AdminPages\_attachments.html.twig:79 Part-DB1\templates\Parts\edit\_attachments.html.twig:77 @@ -852,7 +835,7 @@ L'utilisateur devra configurer à nouveau toutes les méthodes d'authentificatio Ajouter un fichier joint - + Part-DB1\templates\AdminPages\_attachments.html.twig:84 Part-DB1\templates\Parts\edit\_attachments.html.twig:82 @@ -863,10 +846,10 @@ L'utilisateur devra configurer à nouveau toutes les méthodes d'authentificatio part_lot.edit.delete.confirm - Voulez-vous vraiment supprimer ce stock ? Cette action ne pourra pas être annulée ! + Voulez vous vraiment supprimer ce stock ? Cette action ne pourra pas être annulée! - + Part-DB1\templates\AdminPages\_delete_form.html.twig:2 Part-DB1\templates\AdminPages\_delete_form.html.twig:2 @@ -874,10 +857,10 @@ L'utilisateur devra configurer à nouveau toutes les méthodes d'authentificatio entity.delete.confirm_title - Voulez-vous vraiment supprimer %name% ? + Voulez vous vraiment supprimer %name%? - + Part-DB1\templates\AdminPages\_delete_form.html.twig:3 Part-DB1\templates\AdminPages\_delete_form.html.twig:3 @@ -885,12 +868,12 @@ L'utilisateur devra configurer à nouveau toutes les méthodes d'authentificatio entity.delete.message - Cette action ne pourra pas être annulée ! + Cette action ne pourra pas être annulée! <br> Les sous éléments seront déplacés vers le haut. - + Part-DB1\templates\AdminPages\_delete_form.html.twig:11 Part-DB1\templates\AdminPages\_delete_form.html.twig:11 @@ -901,7 +884,7 @@ Les sous éléments seront déplacés vers le haut. Supprimer l'élément - + Part-DB1\templates\AdminPages\_delete_form.html.twig:16 Part-DB1\templates\Parts\info\_tools.html.twig:45 @@ -916,7 +899,7 @@ Les sous éléments seront déplacés vers le haut. Éditer le commentaire - + Part-DB1\templates\AdminPages\_delete_form.html.twig:24 Part-DB1\templates\AdminPages\_delete_form.html.twig:24 @@ -927,7 +910,7 @@ Les sous éléments seront déplacés vers le haut. Suppression récursive (tous les sous éléments) - + Part-DB1\templates\AdminPages\_duplicate.html.twig:3 @@ -936,7 +919,7 @@ Les sous éléments seront déplacés vers le haut. Dupliquer l’élément - + Part-DB1\templates\AdminPages\_export_form.html.twig:4 Part-DB1\src\Form\AdminPages\ImportType.php:76 @@ -950,7 +933,7 @@ Les sous éléments seront déplacés vers le haut. Format de fichier - + Part-DB1\templates\AdminPages\_export_form.html.twig:16 Part-DB1\templates\AdminPages\_export_form.html.twig:16 @@ -961,7 +944,7 @@ Les sous éléments seront déplacés vers le haut. Niveau de verbosité - + Part-DB1\templates\AdminPages\_export_form.html.twig:19 Part-DB1\templates\AdminPages\_export_form.html.twig:19 @@ -972,7 +955,7 @@ Les sous éléments seront déplacés vers le haut. Simple - + Part-DB1\templates\AdminPages\_export_form.html.twig:20 Part-DB1\templates\AdminPages\_export_form.html.twig:20 @@ -983,7 +966,7 @@ Les sous éléments seront déplacés vers le haut. Étendu - + Part-DB1\templates\AdminPages\_export_form.html.twig:21 Part-DB1\templates\AdminPages\_export_form.html.twig:21 @@ -994,7 +977,7 @@ Les sous éléments seront déplacés vers le haut. Complet - + Part-DB1\templates\AdminPages\_export_form.html.twig:31 Part-DB1\templates\AdminPages\_export_form.html.twig:31 @@ -1005,7 +988,7 @@ Les sous éléments seront déplacés vers le haut. Exporter également les sous éléments - + Part-DB1\templates\AdminPages\_export_form.html.twig:39 Part-DB1\templates\AdminPages\_export_form.html.twig:39 @@ -1016,7 +999,7 @@ Les sous éléments seront déplacés vers le haut. Exporter - + Part-DB1\templates\AdminPages\_info.html.twig:4 Part-DB1\templates\Parts\edit\edit_part_info.html.twig:12 @@ -1035,7 +1018,7 @@ Les sous éléments seront déplacés vers le haut. ID - + Part-DB1\templates\AdminPages\_info.html.twig:11 Part-DB1\templates\Parts\info\_attachments_info.html.twig:76 @@ -1059,7 +1042,7 @@ Les sous éléments seront déplacés vers le haut. Créé le - + Part-DB1\templates\AdminPages\_info.html.twig:25 Part-DB1\templates\Parts\info\_extended_infos.html.twig:21 @@ -1077,7 +1060,7 @@ Les sous éléments seront déplacés vers le haut. Dernière modification - + Part-DB1\templates\AdminPages\_info.html.twig:38 Part-DB1\templates\AdminPages\_info.html.twig:38 @@ -1087,7 +1070,7 @@ Les sous éléments seront déplacés vers le haut. Nombre de composants avec cet élément - + Part-DB1\templates\AdminPages\_parameters.html.twig:6 Part-DB1\templates\helper.twig:125 @@ -1098,7 +1081,7 @@ Les sous éléments seront déplacés vers le haut. Paramètre - + Part-DB1\templates\AdminPages\_parameters.html.twig:7 Part-DB1\templates\Parts\edit\_specifications.html.twig:7 @@ -1108,7 +1091,7 @@ Les sous éléments seront déplacés vers le haut. Symbole - + Part-DB1\templates\AdminPages\_parameters.html.twig:8 Part-DB1\templates\Parts\edit\_specifications.html.twig:8 @@ -1118,17 +1101,17 @@ Les sous éléments seront déplacés vers le haut. Min. - + Part-DB1\templates\AdminPages\_parameters.html.twig:9 Part-DB1\templates\Parts\edit\_specifications.html.twig:9 specifications.value_typ - Type. + Typ. - + Part-DB1\templates\AdminPages\_parameters.html.twig:10 Part-DB1\templates\Parts\edit\_specifications.html.twig:10 @@ -1138,7 +1121,7 @@ Les sous éléments seront déplacés vers le haut. Max. - + Part-DB1\templates\AdminPages\_parameters.html.twig:11 Part-DB1\templates\Parts\edit\_specifications.html.twig:11 @@ -1148,7 +1131,7 @@ Les sous éléments seront déplacés vers le haut. Unité - + Part-DB1\templates\AdminPages\_parameters.html.twig:12 Part-DB1\templates\Parts\edit\_specifications.html.twig:12 @@ -1158,7 +1141,7 @@ Les sous éléments seront déplacés vers le haut. Texte - + Part-DB1\templates\AdminPages\_parameters.html.twig:13 Part-DB1\templates\Parts\edit\_specifications.html.twig:13 @@ -1168,7 +1151,7 @@ Les sous éléments seront déplacés vers le haut. Groupe - + Part-DB1\templates\AdminPages\_parameters.html.twig:26 Part-DB1\templates\Parts\edit\_specifications.html.twig:26 @@ -1178,7 +1161,7 @@ Les sous éléments seront déplacés vers le haut. Nouveau paramètre - + Part-DB1\templates\AdminPages\_parameters.html.twig:31 Part-DB1\templates\Parts\edit\_specifications.html.twig:31 @@ -1188,7 +1171,7 @@ Les sous éléments seront déplacés vers le haut. Souhaitez-vous vraiment supprimer ce paramètre ? - + Part-DB1\templates\attachment_list.html.twig:3 Part-DB1\templates\attachment_list.html.twig:3 @@ -1198,7 +1181,7 @@ Les sous éléments seront déplacés vers le haut. Liste des fichiers joints - + Part-DB1\templates\attachment_list.html.twig:10 Part-DB1\templates\LogSystem\_log_table.html.twig:8 @@ -1212,7 +1195,7 @@ Les sous éléments seront déplacés vers le haut. Chargement - + Part-DB1\templates\attachment_list.html.twig:11 Part-DB1\templates\LogSystem\_log_table.html.twig:9 @@ -1226,7 +1209,7 @@ Les sous éléments seront déplacés vers le haut. Cela peut prendre un moment.Si ce message ne disparaît pas, essayez de recharger la page. - + Part-DB1\templates\base.html.twig:68 Part-DB1\templates\base.html.twig:68 @@ -1234,20 +1217,21 @@ Les sous éléments seront déplacés vers le haut. vendor.base.javascript_hint - Activez JavaScript pour profiter de toutes les fonctionnalités ! + Activez Javascipt pour profiter de toutes les fonctionnalités! - + Part-DB1\templates\base.html.twig:73 Part-DB1\templates\base.html.twig:73 sidebar.big.toggle - Afficher / Cacher le panneau latéral + Afficher/Cacher le panneau latéral +Show/Hide sidebar - + Part-DB1\templates\base.html.twig:95 Part-DB1\templates\base.html.twig:95 @@ -1255,10 +1239,10 @@ Les sous éléments seront déplacés vers le haut. loading.caption - Chargement : + Chargement: - + Part-DB1\templates\base.html.twig:96 Part-DB1\templates\base.html.twig:96 @@ -1269,7 +1253,7 @@ Les sous éléments seront déplacés vers le haut. Cela peut prendre un moment.Si ce message ne disparaît pas, essayez de recharger la page. - + Part-DB1\templates\base.html.twig:101 Part-DB1\templates\base.html.twig:101 @@ -1280,7 +1264,7 @@ Les sous éléments seront déplacés vers le haut. Chargement... - + Part-DB1\templates\base.html.twig:112 Part-DB1\templates\base.html.twig:112 @@ -1291,7 +1275,7 @@ Les sous éléments seront déplacés vers le haut. Retour en haut de page - + Part-DB1\templates\Form\permissionLayout.html.twig:35 Part-DB1\templates\Form\permissionLayout.html.twig:35 @@ -1301,7 +1285,7 @@ Les sous éléments seront déplacés vers le haut. Permissions - + Part-DB1\templates\Form\permissionLayout.html.twig:36 Part-DB1\templates\Form\permissionLayout.html.twig:36 @@ -1311,17 +1295,17 @@ Les sous éléments seront déplacés vers le haut. Valeur - + Part-DB1\templates\Form\permissionLayout.html.twig:53 Part-DB1\templates\Form\permissionLayout.html.twig:53 permission.legend.title - Explication des états : + Explication des états: - + Part-DB1\templates\Form\permissionLayout.html.twig:57 Part-DB1\templates\Form\permissionLayout.html.twig:57 @@ -1331,7 +1315,7 @@ Les sous éléments seront déplacés vers le haut. Interdire - + Part-DB1\templates\Form\permissionLayout.html.twig:61 Part-DB1\templates\Form\permissionLayout.html.twig:61 @@ -1341,7 +1325,7 @@ Les sous éléments seront déplacés vers le haut. Autoriser - + Part-DB1\templates\Form\permissionLayout.html.twig:65 Part-DB1\templates\Form\permissionLayout.html.twig:65 @@ -1351,7 +1335,7 @@ Les sous éléments seront déplacés vers le haut. Hériter du groupe (parent) - + Part-DB1\templates\helper.twig:3 Part-DB1\templates\helper.twig:3 @@ -1361,7 +1345,7 @@ Les sous éléments seront déplacés vers le haut. Vrai - + Part-DB1\templates\helper.twig:5 Part-DB1\templates\helper.twig:5 @@ -1371,7 +1355,7 @@ Les sous éléments seront déplacés vers le haut. Faux - + Part-DB1\templates\helper.twig:92 Part-DB1\templates\helper.twig:87 @@ -1381,7 +1365,7 @@ Les sous éléments seront déplacés vers le haut. Oui - + Part-DB1\templates\helper.twig:94 Part-DB1\templates\helper.twig:89 @@ -1391,7 +1375,7 @@ Les sous éléments seront déplacés vers le haut. Non - + Part-DB1\templates\helper.twig:126 @@ -1400,7 +1384,7 @@ Les sous éléments seront déplacés vers le haut. Valeur - + Part-DB1\templates\homepage.html.twig:7 Part-DB1\templates\homepage.html.twig:7 @@ -1411,7 +1395,7 @@ Les sous éléments seront déplacés vers le haut. Version - + Part-DB1\templates\homepage.html.twig:22 Part-DB1\templates\homepage.html.twig:22 @@ -1419,10 +1403,10 @@ Les sous éléments seront déplacés vers le haut. homepage.license - Information de licence + Information de license - + Part-DB1\templates\homepage.html.twig:31 Part-DB1\templates\homepage.html.twig:31 @@ -1433,7 +1417,7 @@ Les sous éléments seront déplacés vers le haut. Page du projet - + Part-DB1\templates\homepage.html.twig:31 Part-DB1\templates\homepage.html.twig:31 @@ -1441,10 +1425,10 @@ Les sous éléments seront déplacés vers le haut. homepage.github.text - Retrouvez les téléchargements, report de bugs, to-do-list, etc. sur <a href="%href%" class="link-external" target="_blank">la page du projet GitHub</a> + Retrouvez les téléchargements, report de bugs, to-do-list etc. sur <a href="%href%" class="link-external" target="_blank">la page du projet GitHub</a> - + Part-DB1\templates\homepage.html.twig:32 Part-DB1\templates\homepage.html.twig:32 @@ -1455,7 +1439,7 @@ Les sous éléments seront déplacés vers le haut. Aide - + Part-DB1\templates\homepage.html.twig:32 Part-DB1\templates\homepage.html.twig:32 @@ -1466,7 +1450,7 @@ Les sous éléments seront déplacés vers le haut. De l'aide et des conseils sont disponibles sur le Wiki de la <a href="%href%" class="link-external" target="_blank">page GitHub</a> - + Part-DB1\templates\homepage.html.twig:33 Part-DB1\templates\homepage.html.twig:33 @@ -1477,7 +1461,7 @@ Les sous éléments seront déplacés vers le haut. Forum - + Part-DB1\templates\homepage.html.twig:45 Part-DB1\templates\homepage.html.twig:45 @@ -1488,7 +1472,7 @@ Les sous éléments seront déplacés vers le haut. Activité récente - + Part-DB1\templates\LabelSystem\dialog.html.twig:3 Part-DB1\templates\LabelSystem\dialog.html.twig:6 @@ -1498,7 +1482,7 @@ Les sous éléments seront déplacés vers le haut. Générateur d'étiquettes - + Part-DB1\templates\LabelSystem\dialog.html.twig:16 @@ -1507,7 +1491,7 @@ Les sous éléments seront déplacés vers le haut. Commun - + Part-DB1\templates\LabelSystem\dialog.html.twig:20 @@ -1516,7 +1500,7 @@ Les sous éléments seront déplacés vers le haut. Avancé - + Part-DB1\templates\LabelSystem\dialog.html.twig:24 @@ -1525,7 +1509,7 @@ Les sous éléments seront déplacés vers le haut. Profils - + Part-DB1\templates\LabelSystem\dialog.html.twig:58 @@ -1534,7 +1518,7 @@ Les sous éléments seront déplacés vers le haut. Profil actuellement sélectionné - + Part-DB1\templates\LabelSystem\dialog.html.twig:62 @@ -1543,7 +1527,7 @@ Les sous éléments seront déplacés vers le haut. Modifier le profil - + Part-DB1\templates\LabelSystem\dialog.html.twig:75 @@ -1552,7 +1536,7 @@ Les sous éléments seront déplacés vers le haut. Charger le profil - + Part-DB1\templates\LabelSystem\dialog.html.twig:102 @@ -1561,7 +1545,7 @@ Les sous éléments seront déplacés vers le haut. Télécharger - + Part-DB1\templates\LabelSystem\dropdown_macro.html.twig:3 Part-DB1\templates\LabelSystem\dropdown_macro.html.twig:5 @@ -1571,7 +1555,7 @@ Les sous éléments seront déplacés vers le haut. Générer une étiquette - + Part-DB1\templates\LabelSystem\dropdown_macro.html.twig:20 @@ -1580,7 +1564,7 @@ Les sous éléments seront déplacés vers le haut. Nouvelle étiquette vide - + Part-DB1\templates\LabelSystem\Scanner\dialog.html.twig:3 @@ -1589,7 +1573,7 @@ Les sous éléments seront déplacés vers le haut. Lecteur d'étiquettes - + Part-DB1\templates\LabelSystem\Scanner\dialog.html.twig:7 @@ -1598,7 +1582,7 @@ Les sous éléments seront déplacés vers le haut. Aucune webcam trouvée - + Part-DB1\templates\LabelSystem\Scanner\dialog.html.twig:7 @@ -1607,7 +1591,7 @@ Les sous éléments seront déplacés vers le haut. Vous devez disposer d'une webcam et donner l'autorisation d'utiliser la fonction de scanner. Vous pouvez entrer le code à barres manuellement ci-dessous. - + Part-DB1\templates\LabelSystem\Scanner\dialog.html.twig:27 @@ -1616,7 +1600,7 @@ Les sous éléments seront déplacés vers le haut. Sélectionnez une source - + Part-DB1\templates\LogSystem\log_list.html.twig:3 Part-DB1\templates\LogSystem\log_list.html.twig:3 @@ -1626,7 +1610,7 @@ Les sous éléments seront déplacés vers le haut. Journal système - + Part-DB1\templates\LogSystem\_log_table.html.twig:1 Part-DB1\templates\LogSystem\_log_table.html.twig:1 @@ -1637,7 +1621,7 @@ Les sous éléments seront déplacés vers le haut. Annuler le changement / revenir à une date antérieure ? - + Part-DB1\templates\LogSystem\_log_table.html.twig:2 Part-DB1\templates\LogSystem\_log_table.html.twig:2 @@ -1648,7 +1632,7 @@ Les sous éléments seront déplacés vers le haut. Voulez-vous annuler la modification donnée / réinitialiser l'élément à une date donnée ? - + Part-DB1\templates\mail\base.html.twig:24 Part-DB1\templates\mail\base.html.twig:24 @@ -1658,7 +1642,7 @@ Les sous éléments seront déplacés vers le haut. Cet email a été envoyé automatiquement par - + Part-DB1\templates\mail\base.html.twig:24 Part-DB1\templates\mail\base.html.twig:24 @@ -1668,7 +1652,7 @@ Les sous éléments seront déplacés vers le haut. Ne répondez pas à cet email. - + Part-DB1\templates\mail\pw_reset.html.twig:6 Part-DB1\templates\mail\pw_reset.html.twig:6 @@ -1678,7 +1662,7 @@ Les sous éléments seront déplacés vers le haut. Bonjour %name% - + Part-DB1\templates\mail\pw_reset.html.twig:7 Part-DB1\templates\mail\pw_reset.html.twig:7 @@ -1688,7 +1672,7 @@ Les sous éléments seront déplacés vers le haut. Quelqu’un (surement vous) a demandé une réinitialisation de votre mot de passe.Si ce n'est pas le cas, ignorez simplement cet email. - + Part-DB1\templates\mail\pw_reset.html.twig:9 Part-DB1\templates\mail\pw_reset.html.twig:9 @@ -1698,7 +1682,7 @@ Les sous éléments seront déplacés vers le haut. Cliquez ici pour réinitialiser votre mot de passe - + Part-DB1\templates\mail\pw_reset.html.twig:11 Part-DB1\templates\mail\pw_reset.html.twig:11 @@ -1708,7 +1692,7 @@ Les sous éléments seront déplacés vers le haut. Si cela ne fonctionne pas pour vous, allez à <a href="%url%">%url%</a> et entrez les informations suivantes - + Part-DB1\templates\mail\pw_reset.html.twig:16 Part-DB1\templates\mail\pw_reset.html.twig:16 @@ -1718,7 +1702,7 @@ Les sous éléments seront déplacés vers le haut. Nom d'utilisateur - + Part-DB1\templates\mail\pw_reset.html.twig:19 Part-DB1\templates\mail\pw_reset.html.twig:19 @@ -1728,7 +1712,7 @@ Les sous éléments seront déplacés vers le haut. Jeton - + Part-DB1\templates\mail\pw_reset.html.twig:24 Part-DB1\templates\mail\pw_reset.html.twig:24 @@ -1738,7 +1722,7 @@ Les sous éléments seront déplacés vers le haut. Le jeton de réinitialisation sera valable jusqu'au <i>%date%</i>. - + Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:18 Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:58 @@ -1750,7 +1734,7 @@ Les sous éléments seront déplacés vers le haut. Supprimer - + Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:39 Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:39 @@ -1760,7 +1744,7 @@ Les sous éléments seront déplacés vers le haut. Quantité minimale de commande - + Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:40 Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:40 @@ -1770,7 +1754,7 @@ Les sous éléments seront déplacés vers le haut. Prix - + Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:41 Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:41 @@ -1780,7 +1764,7 @@ Les sous éléments seront déplacés vers le haut. Pour la quantité - + Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:54 Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:54 @@ -1790,7 +1774,7 @@ Les sous éléments seront déplacés vers le haut. Ajouter prix - + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:4 Part-DB1\templates\Parts\edit\edit_part_info.html.twig:4 @@ -1801,7 +1785,7 @@ Les sous éléments seront déplacés vers le haut. Éditer le composant - + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:9 Part-DB1\templates\Parts\edit\edit_part_info.html.twig:9 @@ -1812,7 +1796,7 @@ Les sous éléments seront déplacés vers le haut. Éditer le composant - + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:22 Part-DB1\templates\Parts\edit\edit_part_info.html.twig:22 @@ -1822,7 +1806,7 @@ Les sous éléments seront déplacés vers le haut. Général - + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:28 Part-DB1\templates\Parts\edit\edit_part_info.html.twig:28 @@ -1832,7 +1816,7 @@ Les sous éléments seront déplacés vers le haut. Fabricant - + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:34 Part-DB1\templates\Parts\edit\edit_part_info.html.twig:34 @@ -1842,7 +1826,67 @@ Les sous éléments seront déplacés vers le haut. Avancé - + + + part.edit.tab.advanced.ipn.commonSectionHeader + Suggestions sans incrément de partie + + + + + part.edit.tab.advanced.ipn.partIncrementHeader + Propositions avec incréments numériques de parties + + + + + part.edit.tab.advanced.ipn.prefix.description.current-increment + Spécification IPN actuelle pour la pièce + + + + + part.edit.tab.advanced.ipn.prefix.description.increment + Prochaine spécification IPN possible basée sur une description identique de la pièce + + + + + part.edit.tab.advanced.ipn.prefix_empty.direct_category + Le préfixe IPN de la catégorie directe est vide, veuillez le spécifier dans la catégorie "%name%" + + + + + part.edit.tab.advanced.ipn.prefix.direct_category + Préfixe IPN de la catégorie directe + + + + + part.edit.tab.advanced.ipn.prefix.direct_category.increment + Préfixe IPN de la catégorie directe et d'un incrément spécifique à la partie + + + + + part.edit.tab.advanced.ipn.prefix.hierarchical.no_increment + Préfixes IPN avec un ordre hiérarchique des catégories des préfixes parents + + + + + part.edit.tab.advanced.ipn.prefix.hierarchical.increment + Préfixes IPN avec un ordre hiérarchique des catégories des préfixes parents et un incrément spécifique à la pièce + + + + + part.edit.tab.advanced.ipn.prefix.not_saved + Créez d'abord une pièce et assignez-la à une catégorie : avec les catégories existantes et leurs propres préfixes IPN, l'identifiant IPN pour la pièce peut être proposé automatiquement + + + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:40 Part-DB1\templates\Parts\edit\edit_part_info.html.twig:40 @@ -1852,7 +1896,7 @@ Les sous éléments seront déplacés vers le haut. Stocks - + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:46 Part-DB1\templates\Parts\edit\edit_part_info.html.twig:46 @@ -1862,7 +1906,7 @@ Les sous éléments seront déplacés vers le haut. Fichiers joints - + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:52 Part-DB1\templates\Parts\edit\edit_part_info.html.twig:52 @@ -1872,7 +1916,7 @@ Les sous éléments seront déplacés vers le haut. Informations pour la commande - + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:58 @@ -1881,7 +1925,7 @@ Les sous éléments seront déplacés vers le haut. Caractéristiques - + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:64 Part-DB1\templates\Parts\edit\edit_part_info.html.twig:58 @@ -1891,7 +1935,7 @@ Les sous éléments seront déplacés vers le haut. Commentaire - + Part-DB1\templates\Parts\edit\new_part.html.twig:8 Part-DB1\templates\Parts\edit\new_part.html.twig:8 @@ -1902,7 +1946,7 @@ Les sous éléments seront déplacés vers le haut. Créer un nouveau composant - + Part-DB1\templates\Parts\edit\_lots.html.twig:5 Part-DB1\templates\Parts\edit\_lots.html.twig:5 @@ -1912,7 +1956,7 @@ Les sous éléments seront déplacés vers le haut. Supprimer - + Part-DB1\templates\Parts\edit\_lots.html.twig:28 Part-DB1\templates\Parts\edit\_lots.html.twig:28 @@ -1922,7 +1966,7 @@ Les sous éléments seront déplacés vers le haut. Créer un inventaire - + Part-DB1\templates\Parts\edit\_orderdetails.html.twig:13 Part-DB1\templates\Parts\edit\_orderdetails.html.twig:13 @@ -1932,7 +1976,7 @@ Les sous éléments seront déplacés vers le haut. Ajouter un fournisseur - + Part-DB1\templates\Parts\edit\_orderdetails.html.twig:18 Part-DB1\templates\Parts\edit\_orderdetails.html.twig:18 @@ -1942,7 +1986,7 @@ Les sous éléments seront déplacés vers le haut. Voulez-vous vraiment supprimer ce prix ? Cela ne peut pas être défait ! - + Part-DB1\templates\Parts\edit\_orderdetails.html.twig:62 Part-DB1\templates\Parts\edit\_orderdetails.html.twig:61 @@ -1952,7 +1996,7 @@ Les sous éléments seront déplacés vers le haut. Voulez-vous vraiment supprimer ce fournisseur ? Cela ne peut pas être défait ! - + Part-DB1\templates\Parts\info\show_part_info.html.twig:4 Part-DB1\templates\Parts\info\show_part_info.html.twig:19 @@ -1966,7 +2010,7 @@ Les sous éléments seront déplacés vers le haut. Informations détaillées pour - + Part-DB1\templates\Parts\info\show_part_info.html.twig:47 Part-DB1\templates\Parts\info\show_part_info.html.twig:47 @@ -1976,7 +2020,7 @@ Les sous éléments seront déplacés vers le haut. Stocks - + Part-DB1\templates\Parts\info\show_part_info.html.twig:56 Part-DB1\templates\Parts\lists\_info_card.html.twig:43 @@ -1991,7 +2035,7 @@ Les sous éléments seront déplacés vers le haut. Commentaire - + Part-DB1\templates\Parts\info\show_part_info.html.twig:64 @@ -2000,7 +2044,7 @@ Les sous éléments seront déplacés vers le haut. Caractéristiques - + Part-DB1\templates\Parts\info\show_part_info.html.twig:74 Part-DB1\templates\Parts\info\show_part_info.html.twig:64 @@ -2011,7 +2055,7 @@ Les sous éléments seront déplacés vers le haut. Fichiers joints - + Part-DB1\templates\Parts\info\show_part_info.html.twig:83 Part-DB1\templates\Parts\info\show_part_info.html.twig:71 @@ -2022,7 +2066,7 @@ Les sous éléments seront déplacés vers le haut. Informations de commande - + Part-DB1\templates\Parts\info\show_part_info.html.twig:91 Part-DB1\templates\Parts\info\show_part_info.html.twig:78 @@ -2033,7 +2077,7 @@ Les sous éléments seront déplacés vers le haut. Historique - + Part-DB1\templates\Parts\info\show_part_info.html.twig:97 Part-DB1\templates\_sidebar.html.twig:54 @@ -2052,7 +2096,7 @@ Les sous éléments seront déplacés vers le haut. Outils - + Part-DB1\templates\Parts\info\show_part_info.html.twig:103 Part-DB1\templates\Parts\info\show_part_info.html.twig:90 @@ -2062,7 +2106,7 @@ Les sous éléments seront déplacés vers le haut. Informations complémentaires - + Part-DB1\templates\Parts\info\_attachments_info.html.twig:7 Part-DB1\templates\Parts\info\_attachments_info.html.twig:7 @@ -2072,7 +2116,7 @@ Les sous éléments seront déplacés vers le haut. Nom - + Part-DB1\templates\Parts\info\_attachments_info.html.twig:8 Part-DB1\templates\Parts\info\_attachments_info.html.twig:8 @@ -2082,7 +2126,7 @@ Les sous éléments seront déplacés vers le haut. Type de fichier joint - + Part-DB1\templates\Parts\info\_attachments_info.html.twig:9 Part-DB1\templates\Parts\info\_attachments_info.html.twig:9 @@ -2092,7 +2136,7 @@ Les sous éléments seront déplacés vers le haut. Nom du fichier - + Part-DB1\templates\Parts\info\_attachments_info.html.twig:10 Part-DB1\templates\Parts\info\_attachments_info.html.twig:10 @@ -2102,7 +2146,7 @@ Les sous éléments seront déplacés vers le haut. Taille du fichier - + Part-DB1\templates\Parts\info\_attachments_info.html.twig:54 @@ -2111,17 +2155,17 @@ Les sous éléments seront déplacés vers le haut. Aperçu de l'image - + Part-DB1\templates\Parts\info\_attachments_info.html.twig:67 Part-DB1\templates\Parts\info\_attachments_info.html.twig:50 - attachment.download_local - Télécharger la pièce jointe locale + attachment.download + Téléchargement - + Part-DB1\templates\Parts\info\_extended_infos.html.twig:11 Part-DB1\templates\Parts\info\_extended_infos.html.twig:11 @@ -2132,7 +2176,7 @@ Les sous éléments seront déplacés vers le haut. Utilisateur qui a créé ce composant - + Part-DB1\templates\Parts\info\_extended_infos.html.twig:13 Part-DB1\templates\Parts\info\_extended_infos.html.twig:28 @@ -2146,7 +2190,7 @@ Les sous éléments seront déplacés vers le haut. Inconnu - + Part-DB1\templates\Parts\info\_extended_infos.html.twig:15 Part-DB1\templates\Parts\info\_extended_infos.html.twig:30 @@ -2159,7 +2203,7 @@ Les sous éléments seront déplacés vers le haut. Accès refusé - + Part-DB1\templates\Parts\info\_extended_infos.html.twig:26 Part-DB1\templates\Parts\info\_extended_infos.html.twig:26 @@ -2170,7 +2214,7 @@ Les sous éléments seront déplacés vers le haut. Utilisateur qui a édité ce composant en dernier - + Part-DB1\templates\Parts\info\_extended_infos.html.twig:41 Part-DB1\templates\Parts\info\_extended_infos.html.twig:41 @@ -2180,7 +2224,7 @@ Les sous éléments seront déplacés vers le haut. Favoris - + Part-DB1\templates\Parts\info\_extended_infos.html.twig:46 Part-DB1\templates\Parts\info\_extended_infos.html.twig:46 @@ -2190,7 +2234,7 @@ Les sous éléments seront déplacés vers le haut. Quantité minimale de commande - + Part-DB1\templates\Parts\info\_main_infos.html.twig:8 Part-DB1\templates\_navbar_search.html.twig:46 @@ -2207,7 +2251,7 @@ Les sous éléments seront déplacés vers le haut. Fabricant - + Part-DB1\templates\Parts\info\_main_infos.html.twig:24 Part-DB1\templates\_navbar_search.html.twig:11 @@ -2219,7 +2263,7 @@ Les sous éléments seront déplacés vers le haut. Nom - + Part-DB1\templates\Parts\info\_main_infos.html.twig:27 Part-DB1\templates\Parts\info\_main_infos.html.twig:27 @@ -2230,7 +2274,7 @@ Les sous éléments seront déplacés vers le haut. Retour à la version actuelle - + Part-DB1\templates\Parts\info\_main_infos.html.twig:32 Part-DB1\templates\_navbar_search.html.twig:19 @@ -2245,7 +2289,7 @@ Les sous éléments seront déplacés vers le haut. Description - + Part-DB1\templates\Parts\info\_main_infos.html.twig:34 Part-DB1\templates\_navbar_search.html.twig:15 @@ -2262,7 +2306,7 @@ Les sous éléments seront déplacés vers le haut. Catégorie - + Part-DB1\templates\Parts\info\_main_infos.html.twig:39 Part-DB1\templates\Parts\info\_main_infos.html.twig:39 @@ -2274,7 +2318,7 @@ Les sous éléments seront déplacés vers le haut. En stock - + Part-DB1\templates\Parts\info\_main_infos.html.twig:41 Part-DB1\templates\Parts\info\_main_infos.html.twig:41 @@ -2286,7 +2330,7 @@ Les sous éléments seront déplacés vers le haut. Stock minimum - + Part-DB1\templates\Parts\info\_main_infos.html.twig:45 Part-DB1\templates\_navbar_search.html.twig:52 @@ -2302,7 +2346,7 @@ Les sous éléments seront déplacés vers le haut. Empreinte - + Part-DB1\templates\Parts\info\_main_infos.html.twig:56 Part-DB1\templates\Parts\info\_main_infos.html.twig:59 @@ -2315,7 +2359,7 @@ Les sous éléments seront déplacés vers le haut. Prix moyen - + Part-DB1\templates\Parts\info\_order_infos.html.twig:5 Part-DB1\templates\Parts\info\_order_infos.html.twig:5 @@ -2325,17 +2369,17 @@ Les sous éléments seront déplacés vers le haut. Nom - + Part-DB1\templates\Parts\info\_order_infos.html.twig:6 Part-DB1\templates\Parts\info\_order_infos.html.twig:6 part.supplier.partnr - Lien/Code Fournisseur + Lien/Code cmd. - + Part-DB1\templates\Parts\info\_order_infos.html.twig:28 Part-DB1\templates\Parts\info\_order_infos.html.twig:28 @@ -2345,7 +2389,7 @@ Les sous éléments seront déplacés vers le haut. Nombre minimum - + Part-DB1\templates\Parts\info\_order_infos.html.twig:29 Part-DB1\templates\Parts\info\_order_infos.html.twig:29 @@ -2355,7 +2399,7 @@ Les sous éléments seront déplacés vers le haut. Prix - + Part-DB1\templates\Parts\info\_order_infos.html.twig:31 Part-DB1\templates\Parts\info\_order_infos.html.twig:31 @@ -2365,7 +2409,7 @@ Les sous éléments seront déplacés vers le haut. Prix unitaire - + Part-DB1\templates\Parts\info\_order_infos.html.twig:71 Part-DB1\templates\Parts\info\_order_infos.html.twig:71 @@ -2375,7 +2419,7 @@ Les sous éléments seront déplacés vers le haut. Éditer - + Part-DB1\templates\Parts\info\_order_infos.html.twig:72 Part-DB1\templates\Parts\info\_order_infos.html.twig:72 @@ -2385,7 +2429,7 @@ Les sous éléments seront déplacés vers le haut. Supprimer - + Part-DB1\templates\Parts\info\_part_lots.html.twig:7 Part-DB1\templates\Parts\info\_part_lots.html.twig:6 @@ -2395,7 +2439,7 @@ Les sous éléments seront déplacés vers le haut. Description - + Part-DB1\templates\Parts\info\_part_lots.html.twig:8 Part-DB1\templates\Parts\info\_part_lots.html.twig:7 @@ -2405,7 +2449,7 @@ Les sous éléments seront déplacés vers le haut. Emplacement de stockage - + Part-DB1\templates\Parts\info\_part_lots.html.twig:9 Part-DB1\templates\Parts\info\_part_lots.html.twig:8 @@ -2415,7 +2459,7 @@ Les sous éléments seront déplacés vers le haut. Quantité - + Part-DB1\templates\Parts\info\_part_lots.html.twig:24 Part-DB1\templates\Parts\info\_part_lots.html.twig:22 @@ -2425,7 +2469,7 @@ Les sous éléments seront déplacés vers le haut. Emplacement de stockage inconnu - + Part-DB1\templates\Parts\info\_part_lots.html.twig:31 Part-DB1\templates\Parts\info\_part_lots.html.twig:29 @@ -2435,7 +2479,7 @@ Les sous éléments seront déplacés vers le haut. Quantité inconnue - + Part-DB1\templates\Parts\info\_part_lots.html.twig:40 Part-DB1\templates\Parts\info\_part_lots.html.twig:38 @@ -2445,7 +2489,7 @@ Les sous éléments seront déplacés vers le haut. Date d'expiration - + Part-DB1\templates\Parts\info\_part_lots.html.twig:48 Part-DB1\templates\Parts\info\_part_lots.html.twig:46 @@ -2455,7 +2499,7 @@ Les sous éléments seront déplacés vers le haut. Expiré - + Part-DB1\templates\Parts\info\_part_lots.html.twig:55 Part-DB1\templates\Parts\info\_part_lots.html.twig:53 @@ -2465,7 +2509,7 @@ Les sous éléments seront déplacés vers le haut. Doit être rempli à nouveau - + Part-DB1\templates\Parts\info\_picture.html.twig:15 Part-DB1\templates\Parts\info\_picture.html.twig:15 @@ -2475,7 +2519,7 @@ Les sous éléments seront déplacés vers le haut. Image précédente - + Part-DB1\templates\Parts\info\_picture.html.twig:19 Part-DB1\templates\Parts\info\_picture.html.twig:19 @@ -2485,7 +2529,7 @@ Les sous éléments seront déplacés vers le haut. Image suivante - + Part-DB1\templates\Parts\info\_sidebar.html.twig:21 Part-DB1\templates\Parts\info\_sidebar.html.twig:21 @@ -2495,7 +2539,7 @@ Les sous éléments seront déplacés vers le haut. Poids - + Part-DB1\templates\Parts\info\_sidebar.html.twig:30 Part-DB1\templates\Parts\info\_sidebar.html.twig:30 @@ -2505,7 +2549,7 @@ Les sous éléments seront déplacés vers le haut. Révision nécessaire - + Part-DB1\templates\Parts\info\_sidebar.html.twig:39 Part-DB1\templates\Parts\info\_sidebar.html.twig:39 @@ -2515,7 +2559,7 @@ Les sous éléments seront déplacés vers le haut. Favoris - + Part-DB1\templates\Parts\info\_sidebar.html.twig:47 Part-DB1\templates\Parts\info\_sidebar.html.twig:47 @@ -2525,7 +2569,7 @@ Les sous éléments seront déplacés vers le haut. N'est plus disponible - + Part-DB1\templates\Parts\info\_specifications.html.twig:10 @@ -2534,7 +2578,7 @@ Les sous éléments seront déplacés vers le haut. Automatiquement extrait de la description - + Part-DB1\templates\Parts\info\_specifications.html.twig:15 @@ -2543,7 +2587,7 @@ Les sous éléments seront déplacés vers le haut. Automatiquement extrait du commentaire - + Part-DB1\templates\Parts\info\_tools.html.twig:6 Part-DB1\templates\Parts\info\_tools.html.twig:4 @@ -2554,7 +2598,7 @@ Les sous éléments seront déplacés vers le haut. Éditer - + Part-DB1\templates\Parts\info\_tools.html.twig:16 Part-DB1\templates\Parts\info\_tools.html.twig:14 @@ -2565,7 +2609,7 @@ Les sous éléments seront déplacés vers le haut. Duplication - + Part-DB1\templates\Parts\info\_tools.html.twig:24 Part-DB1\templates\Parts\lists\_action_bar.html.twig:4 @@ -2576,7 +2620,7 @@ Les sous éléments seront déplacés vers le haut. Créer un nouveau composant - + Part-DB1\templates\Parts\info\_tools.html.twig:31 Part-DB1\templates\Parts\info\_tools.html.twig:29 @@ -2586,7 +2630,7 @@ Les sous éléments seront déplacés vers le haut. Voulez-vous vraiment supprimer ce composant ? - + Part-DB1\templates\Parts\info\_tools.html.twig:32 Part-DB1\templates\Parts\info\_tools.html.twig:30 @@ -2596,7 +2640,7 @@ Les sous éléments seront déplacés vers le haut. Le composant et toutes les informations associées (stocks, fichiers joints, etc.) sont supprimés. Cela ne pourra pas être annulé. - + Part-DB1\templates\Parts\info\_tools.html.twig:39 Part-DB1\templates\Parts\info\_tools.html.twig:37 @@ -2606,7 +2650,7 @@ Les sous éléments seront déplacés vers le haut. Supprimer le composant - + Part-DB1\templates\Parts\lists\all_list.html.twig:4 Part-DB1\templates\Parts\lists\all_list.html.twig:4 @@ -2616,7 +2660,7 @@ Les sous éléments seront déplacés vers le haut. Tous les composants - + Part-DB1\templates\Parts\lists\category_list.html.twig:4 Part-DB1\templates\Parts\lists\category_list.html.twig:4 @@ -2626,7 +2670,7 @@ Les sous éléments seront déplacés vers le haut. Composants avec catégorie - + Part-DB1\templates\Parts\lists\footprint_list.html.twig:4 Part-DB1\templates\Parts\lists\footprint_list.html.twig:4 @@ -2636,7 +2680,7 @@ Les sous éléments seront déplacés vers le haut. Composants avec empreinte - + Part-DB1\templates\Parts\lists\manufacturer_list.html.twig:4 Part-DB1\templates\Parts\lists\manufacturer_list.html.twig:4 @@ -2646,7 +2690,7 @@ Les sous éléments seront déplacés vers le haut. Composants avec fabricant - + Part-DB1\templates\Parts\lists\search_list.html.twig:4 Part-DB1\templates\Parts\lists\search_list.html.twig:4 @@ -2656,7 +2700,7 @@ Les sous éléments seront déplacés vers le haut. Recherche de composants - + Part-DB1\templates\Parts\lists\store_location_list.html.twig:4 Part-DB1\templates\Parts\lists\store_location_list.html.twig:4 @@ -2666,7 +2710,7 @@ Les sous éléments seront déplacés vers le haut. Composants avec lieu de stockage - + Part-DB1\templates\Parts\lists\supplier_list.html.twig:4 Part-DB1\templates\Parts\lists\supplier_list.html.twig:4 @@ -2676,7 +2720,7 @@ Les sous éléments seront déplacés vers le haut. Composants avec fournisseur - + Part-DB1\templates\Parts\lists\tags_list.html.twig:4 Part-DB1\templates\Parts\lists\tags_list.html.twig:4 @@ -2686,7 +2730,7 @@ Les sous éléments seront déplacés vers le haut. Composants avec tag - + Part-DB1\templates\Parts\lists\_info_card.html.twig:22 Part-DB1\templates\Parts\lists\_info_card.html.twig:17 @@ -2696,7 +2740,7 @@ Les sous éléments seront déplacés vers le haut. Général - + Part-DB1\templates\Parts\lists\_info_card.html.twig:26 Part-DB1\templates\Parts\lists\_info_card.html.twig:20 @@ -2706,7 +2750,7 @@ Les sous éléments seront déplacés vers le haut. Statistiques - + Part-DB1\templates\Parts\lists\_info_card.html.twig:31 @@ -2715,7 +2759,7 @@ Les sous éléments seront déplacés vers le haut. Pièces jointes - + Part-DB1\templates\Parts\lists\_info_card.html.twig:37 @@ -2724,7 +2768,7 @@ Les sous éléments seront déplacés vers le haut. Caractéristiques - + Part-DB1\templates\Parts\lists\_info_card.html.twig:54 Part-DB1\templates\Parts\lists\_info_card.html.twig:30 @@ -2734,7 +2778,7 @@ Les sous éléments seront déplacés vers le haut. Nom - + Part-DB1\templates\Parts\lists\_info_card.html.twig:58 Part-DB1\templates\Parts\lists\_info_card.html.twig:96 @@ -2746,7 +2790,7 @@ Les sous éléments seront déplacés vers le haut. Parent - + Part-DB1\templates\Parts\lists\_info_card.html.twig:70 Part-DB1\templates\Parts\lists\_info_card.html.twig:46 @@ -2756,7 +2800,7 @@ Les sous éléments seront déplacés vers le haut. Éditer - + Part-DB1\templates\Parts\lists\_info_card.html.twig:92 Part-DB1\templates\Parts\lists\_info_card.html.twig:63 @@ -2766,7 +2810,7 @@ Les sous éléments seront déplacés vers le haut. Nombre de sous-éléments - + Part-DB1\templates\security\2fa_base_form.html.twig:3 Part-DB1\templates\security\2fa_base_form.html.twig:5 @@ -2778,7 +2822,7 @@ Les sous éléments seront déplacés vers le haut. Authentification à deux facteurs requise - + Part-DB1\templates\security\2fa_base_form.html.twig:39 Part-DB1\templates\security\2fa_base_form.html.twig:39 @@ -2788,7 +2832,7 @@ Les sous éléments seront déplacés vers le haut. Il s'agit d'un ordinateur de confiance (si cette fonction est activée, aucune autre requête à deux facteurs n'est effectuée sur cet ordinateur) - + Part-DB1\templates\security\2fa_base_form.html.twig:52 Part-DB1\templates\security\login.html.twig:58 @@ -2800,7 +2844,7 @@ Les sous éléments seront déplacés vers le haut. Connexion - + Part-DB1\templates\security\2fa_base_form.html.twig:53 Part-DB1\templates\security\U2F\u2f_login.html.twig:13 @@ -2814,27 +2858,27 @@ Les sous éléments seront déplacés vers le haut. Déconnexion - + Part-DB1\templates\security\2fa_form.html.twig:6 Part-DB1\templates\security\2fa_form.html.twig:6 tfa.check.code.label - Code d'application du certificateur + Code d'application de l'authentificateur - + Part-DB1\templates\security\2fa_form.html.twig:10 Part-DB1\templates\security\2fa_form.html.twig:10 tfa.check.code.help - Entrez le code à 6 chiffres de votre application d'authentification ou l'un de vos codes de secours si le certificateur n'est pas disponible. + Entrez le code à 6 chiffres de votre application d'authentification ou l'un de vos codes de secours si l'authentificateur n'est pas disponible. - + Part-DB1\templates\security\login.html.twig:3 Part-DB1\templates\security\login.html.twig:3 @@ -2845,7 +2889,7 @@ Les sous éléments seront déplacés vers le haut. Connexion - + Part-DB1\templates\security\login.html.twig:7 Part-DB1\templates\security\login.html.twig:7 @@ -2856,7 +2900,7 @@ Les sous éléments seront déplacés vers le haut. Connexion - + Part-DB1\templates\security\login.html.twig:31 Part-DB1\templates\security\login.html.twig:31 @@ -2867,7 +2911,7 @@ Les sous éléments seront déplacés vers le haut. Nom d'utilisateur - + Part-DB1\templates\security\login.html.twig:34 Part-DB1\templates\security\login.html.twig:34 @@ -2878,7 +2922,7 @@ Les sous éléments seront déplacés vers le haut. Nom d'utilisateur - + Part-DB1\templates\security\login.html.twig:38 Part-DB1\templates\security\login.html.twig:38 @@ -2889,7 +2933,7 @@ Les sous éléments seront déplacés vers le haut. Mot de passe - + Part-DB1\templates\security\login.html.twig:40 Part-DB1\templates\security\login.html.twig:40 @@ -2900,7 +2944,7 @@ Les sous éléments seront déplacés vers le haut. Mot de passe - + Part-DB1\templates\security\login.html.twig:50 Part-DB1\templates\security\login.html.twig:50 @@ -2911,7 +2955,7 @@ Les sous éléments seront déplacés vers le haut. Rester connecté (non recommandé sur les ordinateurs publics) - + Part-DB1\templates\security\login.html.twig:64 Part-DB1\templates\security\login.html.twig:64 @@ -2921,7 +2965,7 @@ Les sous éléments seront déplacés vers le haut. Nom d'utilisateur/mot de passe oublié ? - + Part-DB1\templates\security\pw_reset_new_pw.html.twig:5 Part-DB1\templates\security\pw_reset_new_pw.html.twig:5 @@ -2931,7 +2975,7 @@ Les sous éléments seront déplacés vers le haut. Définir un nouveau mot de passe - + Part-DB1\templates\security\pw_reset_request.html.twig:5 Part-DB1\templates\security\pw_reset_request.html.twig:5 @@ -2941,7 +2985,7 @@ Les sous éléments seront déplacés vers le haut. Demander un nouveau mot de passe - + Part-DB1\templates\security\U2F\u2f_login.html.twig:7 Part-DB1\templates\security\U2F\u2f_register.html.twig:10 @@ -2953,7 +2997,7 @@ Les sous éléments seront déplacés vers le haut. Vous accédez à cette page en utilisant la méthode HTTP non sécurisée, donc U2F ne fonctionnera probablement pas (message d'erreur "Bad Request"). Demandez à un administrateur de mettre en place la méthode HTTPS sécurisée si vous souhaitez utiliser des clés de sécurité. - + Part-DB1\templates\security\U2F\u2f_login.html.twig:10 Part-DB1\templates\security\U2F\u2f_register.html.twig:22 @@ -2965,7 +3009,7 @@ Les sous éléments seront déplacés vers le haut. Veuillez insérer la clé de sécurité et appuyer sur le bouton ! - + Part-DB1\templates\security\U2F\u2f_register.html.twig:3 Part-DB1\templates\security\U2F\u2f_register.html.twig:3 @@ -2975,7 +3019,7 @@ Les sous éléments seront déplacés vers le haut. Ajouter une clé de sécurité - + Part-DB1\templates\security\U2F\u2f_register.html.twig:6 Part-DB1\templates\Users\_2fa_settings.html.twig:111 @@ -2987,7 +3031,7 @@ Les sous éléments seront déplacés vers le haut. À l'aide d'une clé de sécurité compatible U2F/FIDO (par exemple YubiKey ou NitroKey), une authentification à deux facteurs sûre et pratique peut être obtenue. Les clés de sécurité peuvent être enregistrées ici, et si une vérification à deux facteurs est nécessaire, il suffit d'insérer la clé via USB ou de la taper sur le dispositif via NFC. - + Part-DB1\templates\security\U2F\u2f_register.html.twig:7 Part-DB1\templates\security\U2F\u2f_register.html.twig:7 @@ -2997,7 +3041,7 @@ Les sous éléments seront déplacés vers le haut. Pour garantir l'accès même en cas de perte de la clé, il est recommandé d'enregistrer une deuxième clé en guise de sauvegarde et de la conserver dans un endroit sûr ! - + Part-DB1\templates\security\U2F\u2f_register.html.twig:16 Part-DB1\templates\security\U2F\u2f_register.html.twig:16 @@ -3007,7 +3051,7 @@ Les sous éléments seront déplacés vers le haut. Afficher le nom de la clé (par exemple, sauvegarde) - + Part-DB1\templates\security\U2F\u2f_register.html.twig:19 Part-DB1\templates\security\U2F\u2f_register.html.twig:19 @@ -3017,7 +3061,7 @@ Les sous éléments seront déplacés vers le haut. Ajouter une clé de sécurité - + Part-DB1\templates\security\U2F\u2f_register.html.twig:27 Part-DB1\templates\security\U2F\u2f_register.html.twig:27 @@ -3027,7 +3071,7 @@ Les sous éléments seront déplacés vers le haut. Retour aux paramètres - + Part-DB1\templates\Statistics\statistics.html.twig:5 Part-DB1\templates\Statistics\statistics.html.twig:8 @@ -3040,7 +3084,7 @@ Les sous éléments seront déplacés vers le haut. Statistiques - + Part-DB1\templates\Statistics\statistics.html.twig:14 Part-DB1\templates\Statistics\statistics.html.twig:14 @@ -3051,7 +3095,7 @@ Les sous éléments seront déplacés vers le haut. Composants - + Part-DB1\templates\Statistics\statistics.html.twig:19 Part-DB1\templates\Statistics\statistics.html.twig:19 @@ -3062,7 +3106,7 @@ Les sous éléments seront déplacés vers le haut. Structures des données - + Part-DB1\templates\Statistics\statistics.html.twig:24 Part-DB1\templates\Statistics\statistics.html.twig:24 @@ -3073,7 +3117,7 @@ Les sous éléments seront déplacés vers le haut. Fichiers joints - + Part-DB1\templates\Statistics\statistics.html.twig:34 Part-DB1\templates\Statistics\statistics.html.twig:59 @@ -3088,7 +3132,7 @@ Les sous éléments seront déplacés vers le haut. Propriété - + Part-DB1\templates\Statistics\statistics.html.twig:35 Part-DB1\templates\Statistics\statistics.html.twig:60 @@ -3103,7 +3147,7 @@ Les sous éléments seront déplacés vers le haut. Valeur - + Part-DB1\templates\Statistics\statistics.html.twig:40 Part-DB1\templates\Statistics\statistics.html.twig:40 @@ -3114,7 +3158,7 @@ Les sous éléments seront déplacés vers le haut. Nombre de composants distincts - + Part-DB1\templates\Statistics\statistics.html.twig:44 Part-DB1\templates\Statistics\statistics.html.twig:44 @@ -3122,10 +3166,10 @@ Les sous éléments seront déplacés vers le haut. statistics.parts_instock_sum - Somme de tous les composants en stock + Somme de tout les composants en stock - + Part-DB1\templates\Statistics\statistics.html.twig:48 Part-DB1\templates\Statistics\statistics.html.twig:48 @@ -3136,7 +3180,7 @@ Les sous éléments seront déplacés vers le haut. Nombre de composants avec information de prix - + Part-DB1\templates\Statistics\statistics.html.twig:65 Part-DB1\templates\Statistics\statistics.html.twig:65 @@ -3147,7 +3191,7 @@ Les sous éléments seront déplacés vers le haut. Nombre de catégories - + Part-DB1\templates\Statistics\statistics.html.twig:69 Part-DB1\templates\Statistics\statistics.html.twig:69 @@ -3158,7 +3202,7 @@ Les sous éléments seront déplacés vers le haut. Nombre d'empreintes - + Part-DB1\templates\Statistics\statistics.html.twig:73 Part-DB1\templates\Statistics\statistics.html.twig:73 @@ -3169,7 +3213,7 @@ Les sous éléments seront déplacés vers le haut. Nombre de fabricants - + Part-DB1\templates\Statistics\statistics.html.twig:77 Part-DB1\templates\Statistics\statistics.html.twig:77 @@ -3180,7 +3224,7 @@ Les sous éléments seront déplacés vers le haut. Nombre d'emplacements de stockage - + Part-DB1\templates\Statistics\statistics.html.twig:81 Part-DB1\templates\Statistics\statistics.html.twig:81 @@ -3191,7 +3235,7 @@ Les sous éléments seront déplacés vers le haut. Nombre de fournisseurs - + Part-DB1\templates\Statistics\statistics.html.twig:85 Part-DB1\templates\Statistics\statistics.html.twig:85 @@ -3202,7 +3246,7 @@ Les sous éléments seront déplacés vers le haut. Nombre de devises - + Part-DB1\templates\Statistics\statistics.html.twig:89 Part-DB1\templates\Statistics\statistics.html.twig:89 @@ -3213,7 +3257,7 @@ Les sous éléments seront déplacés vers le haut. Nombre d'unités de mesure - + Part-DB1\templates\Statistics\statistics.html.twig:93 Part-DB1\templates\Statistics\statistics.html.twig:93 @@ -3224,7 +3268,7 @@ Les sous éléments seront déplacés vers le haut. Nombre de projets - + Part-DB1\templates\Statistics\statistics.html.twig:110 Part-DB1\templates\Statistics\statistics.html.twig:110 @@ -3235,7 +3279,7 @@ Les sous éléments seront déplacés vers le haut. Nombre de types de fichiers joints - + Part-DB1\templates\Statistics\statistics.html.twig:114 Part-DB1\templates\Statistics\statistics.html.twig:114 @@ -3246,7 +3290,7 @@ Les sous éléments seront déplacés vers le haut. Total des pièces jointes - + Part-DB1\templates\Statistics\statistics.html.twig:118 Part-DB1\templates\Statistics\statistics.html.twig:118 @@ -3254,10 +3298,10 @@ Les sous éléments seront déplacés vers le haut. statistics.user_uploaded_attachments_count - Nombre de fichiers joints envoyés + Nombre de fichiers joints envoyées - + Part-DB1\templates\Statistics\statistics.html.twig:122 Part-DB1\templates\Statistics\statistics.html.twig:122 @@ -3268,7 +3312,7 @@ Les sous éléments seront déplacés vers le haut. Nombre de fichiers joints privés - + Part-DB1\templates\Statistics\statistics.html.twig:126 Part-DB1\templates\Statistics\statistics.html.twig:126 @@ -3279,7 +3323,7 @@ Les sous éléments seront déplacés vers le haut. Nombre de fichiers joints externes - + Part-DB1\templates\Users\backup_codes.html.twig:3 Part-DB1\templates\Users\backup_codes.html.twig:9 @@ -3291,7 +3335,7 @@ Les sous éléments seront déplacés vers le haut. Codes de secours - + Part-DB1\templates\Users\backup_codes.html.twig:12 Part-DB1\templates\Users\backup_codes.html.twig:12 @@ -3301,7 +3345,7 @@ Les sous éléments seront déplacés vers le haut. Imprimez ces codes et conservez-les dans un endroit sûr ! - + Part-DB1\templates\Users\backup_codes.html.twig:13 Part-DB1\templates\Users\backup_codes.html.twig:13 @@ -3311,7 +3355,7 @@ Les sous éléments seront déplacés vers le haut. Si vous n'avez plus accès à votre appareil avec l'application d'authentification (smartphone perdu, perte de données, etc.), vous pouvez utiliser un de ces codes pour accéder à votre compte et éventuellement configurer une nouvelle application d'authentification. Chacun de ces codes peut être utilisé une fois, il est recommandé de supprimer les codes utilisés. Toute personne ayant accès à ces codes peut potentiellement accéder à votre compte, alors gardez-les en lieu sûr. - + Part-DB1\templates\Users\backup_codes.html.twig:16 Part-DB1\templates\Users\backup_codes.html.twig:16 @@ -3321,7 +3365,7 @@ Les sous éléments seront déplacés vers le haut. Nom d'utilisateur - + Part-DB1\templates\Users\backup_codes.html.twig:29 Part-DB1\templates\Users\backup_codes.html.twig:29 @@ -3331,7 +3375,7 @@ Les sous éléments seront déplacés vers le haut. Page générée le %date% - + Part-DB1\templates\Users\backup_codes.html.twig:32 Part-DB1\templates\Users\backup_codes.html.twig:32 @@ -3341,7 +3385,7 @@ Les sous éléments seront déplacés vers le haut. Imprimer - + Part-DB1\templates\Users\backup_codes.html.twig:35 Part-DB1\templates\Users\backup_codes.html.twig:35 @@ -3351,7 +3395,7 @@ Les sous éléments seront déplacés vers le haut. Copier dans le presse-papier - + Part-DB1\templates\Users\user_info.html.twig:3 Part-DB1\templates\Users\user_info.html.twig:6 @@ -3368,7 +3412,7 @@ Les sous éléments seront déplacés vers le haut. Informations sur l'utilisateur - + Part-DB1\templates\Users\user_info.html.twig:18 Part-DB1\src\Form\UserSettingsType.php:77 @@ -3382,7 +3426,7 @@ Les sous éléments seront déplacés vers le haut. Prénom - + Part-DB1\templates\Users\user_info.html.twig:24 Part-DB1\src\Form\UserSettingsType.php:82 @@ -3396,7 +3440,7 @@ Les sous éléments seront déplacés vers le haut. Nom - + Part-DB1\templates\Users\user_info.html.twig:30 Part-DB1\src\Form\UserSettingsType.php:92 @@ -3410,7 +3454,7 @@ Les sous éléments seront déplacés vers le haut. Email - + Part-DB1\templates\Users\user_info.html.twig:37 Part-DB1\src\Form\UserSettingsType.php:87 @@ -3424,7 +3468,7 @@ Les sous éléments seront déplacés vers le haut. Département - + Part-DB1\templates\Users\user_info.html.twig:47 Part-DB1\src\Form\UserSettingsType.php:73 @@ -3438,7 +3482,7 @@ Les sous éléments seront déplacés vers le haut. Nom d'utilisateur - + Part-DB1\templates\Users\user_info.html.twig:53 Part-DB1\src\Services\ElementTypeNameGenerator.php:93 @@ -3451,7 +3495,7 @@ Les sous éléments seront déplacés vers le haut. Groupe - + Part-DB1\templates\Users\user_info.html.twig:67 Part-DB1\templates\Users\user_info.html.twig:67 @@ -3461,7 +3505,7 @@ Les sous éléments seront déplacés vers le haut. Autorisations - + Part-DB1\templates\Users\user_settings.html.twig:3 Part-DB1\templates\Users\user_settings.html.twig:6 @@ -3478,7 +3522,7 @@ Les sous éléments seront déplacés vers le haut. Paramètres utilisateur - + Part-DB1\templates\Users\user_settings.html.twig:18 Part-DB1\templates\Users\user_settings.html.twig:18 @@ -3489,7 +3533,7 @@ Les sous éléments seront déplacés vers le haut. Données personnelles - + Part-DB1\templates\Users\user_settings.html.twig:22 Part-DB1\templates\Users\user_settings.html.twig:22 @@ -3500,7 +3544,7 @@ Les sous éléments seront déplacés vers le haut. Configuration - + Part-DB1\templates\Users\user_settings.html.twig:55 Part-DB1\templates\Users\user_settings.html.twig:55 @@ -3511,7 +3555,7 @@ Les sous éléments seront déplacés vers le haut. Changer de mot de passe - + Part-DB1\templates\Users\_2fa_settings.html.twig:6 Part-DB1\templates\Users\_2fa_settings.html.twig:6 @@ -3521,7 +3565,7 @@ Les sous éléments seront déplacés vers le haut. Authentification à deux facteurs - + Part-DB1\templates\Users\_2fa_settings.html.twig:13 Part-DB1\templates\Users\_2fa_settings.html.twig:13 @@ -3531,7 +3575,7 @@ Les sous éléments seront déplacés vers le haut. Application d'authentification - + Part-DB1\templates\Users\_2fa_settings.html.twig:17 Part-DB1\templates\Users\_2fa_settings.html.twig:17 @@ -3541,7 +3585,7 @@ Les sous éléments seront déplacés vers le haut. Codes de secours - + Part-DB1\templates\Users\_2fa_settings.html.twig:21 Part-DB1\templates\Users\_2fa_settings.html.twig:21 @@ -3551,7 +3595,7 @@ Les sous éléments seront déplacés vers le haut. Clés de sécurité (U2F) - + Part-DB1\templates\Users\_2fa_settings.html.twig:25 Part-DB1\templates\Users\_2fa_settings.html.twig:25 @@ -3561,7 +3605,7 @@ Les sous éléments seront déplacés vers le haut. Appareils de confiance - + Part-DB1\templates\Users\_2fa_settings.html.twig:33 Part-DB1\templates\Users\_2fa_settings.html.twig:33 @@ -3571,7 +3615,7 @@ Les sous éléments seront déplacés vers le haut. Voulez-vous vraiment désactiver l'application d'authentification ? - + Part-DB1\templates\Users\_2fa_settings.html.twig:33 Part-DB1\templates\Users\_2fa_settings.html.twig:33 @@ -3582,7 +3626,7 @@ Les sous éléments seront déplacés vers le haut. Notez également que sans authentification à deux facteurs, votre compte n'est pas aussi bien protégé ! - + Part-DB1\templates\Users\_2fa_settings.html.twig:39 Part-DB1\templates\Users\_2fa_settings.html.twig:39 @@ -3592,7 +3636,7 @@ Notez également que sans authentification à deux facteurs, votre compte n'est Application d'authentification désactivée - + Part-DB1\templates\Users\_2fa_settings.html.twig:48 Part-DB1\templates\Users\_2fa_settings.html.twig:48 @@ -3602,7 +3646,7 @@ Notez également que sans authentification à deux facteurs, votre compte n'est Télécharger une application d'authentification (par exemple <a class="link-external" target="_blank" href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2">Authentificateur Google</a> ou <a class="link-external" target="_blank" href="https://play.google.com/store/apps/details?id=org.fedorahosted.freeotp">Authentificateur FreeOTP</a>) - + Part-DB1\templates\Users\_2fa_settings.html.twig:49 Part-DB1\templates\Users\_2fa_settings.html.twig:49 @@ -3612,7 +3656,7 @@ Notez également que sans authentification à deux facteurs, votre compte n'est Scannez le QR code adjacent avec l'application ou saisissez les données manuellement - + Part-DB1\templates\Users\_2fa_settings.html.twig:50 Part-DB1\templates\Users\_2fa_settings.html.twig:50 @@ -3622,7 +3666,7 @@ Notez également que sans authentification à deux facteurs, votre compte n'est Entrez le code généré dans le champ ci-dessous et confirmez - + Part-DB1\templates\Users\_2fa_settings.html.twig:51 Part-DB1\templates\Users\_2fa_settings.html.twig:51 @@ -3632,7 +3676,7 @@ Notez également que sans authentification à deux facteurs, votre compte n'est Imprimez vos codes de secours et conservez-les dans un endroit sûr - + Part-DB1\templates\Users\_2fa_settings.html.twig:58 Part-DB1\templates\Users\_2fa_settings.html.twig:58 @@ -3642,7 +3686,7 @@ Notez également que sans authentification à deux facteurs, votre compte n'est Configuration manuelle - + Part-DB1\templates\Users\_2fa_settings.html.twig:62 Part-DB1\templates\Users\_2fa_settings.html.twig:62 @@ -3652,7 +3696,7 @@ Notez également que sans authentification à deux facteurs, votre compte n'est Type - + Part-DB1\templates\Users\_2fa_settings.html.twig:63 Part-DB1\templates\Users\_2fa_settings.html.twig:63 @@ -3662,7 +3706,7 @@ Notez également que sans authentification à deux facteurs, votre compte n'est Nom d'utilisateur - + Part-DB1\templates\Users\_2fa_settings.html.twig:64 Part-DB1\templates\Users\_2fa_settings.html.twig:64 @@ -3672,7 +3716,7 @@ Notez également que sans authentification à deux facteurs, votre compte n'est Secret - + Part-DB1\templates\Users\_2fa_settings.html.twig:65 Part-DB1\templates\Users\_2fa_settings.html.twig:65 @@ -3682,7 +3726,7 @@ Notez également que sans authentification à deux facteurs, votre compte n'est Nombre de caractères - + Part-DB1\templates\Users\_2fa_settings.html.twig:74 Part-DB1\templates\Users\_2fa_settings.html.twig:74 @@ -3692,7 +3736,7 @@ Notez également que sans authentification à deux facteurs, votre compte n'est Application d'authentification activée - + Part-DB1\templates\Users\_2fa_settings.html.twig:83 Part-DB1\templates\Users\_2fa_settings.html.twig:83 @@ -3702,7 +3746,7 @@ Notez également que sans authentification à deux facteurs, votre compte n'est Codes de secours désactivés. Configurez l'application d'authentification pour activer les codes de secours. - + Part-DB1\templates\Users\_2fa_settings.html.twig:84 Part-DB1\templates\Users\_2fa_settings.html.twig:92 @@ -3714,17 +3758,17 @@ Notez également que sans authentification à deux facteurs, votre compte n'est Grâce à ces codes de secours, vous pouvez accéder à votre compte même si vous perdez l'appareil avec l'application d'authentification. Imprimez les codes et conservez-les dans un endroit sûr. - + Part-DB1\templates\Users\_2fa_settings.html.twig:88 Part-DB1\templates\Users\_2fa_settings.html.twig:88 tfa_backup.reset_codes.confirm_title - Êtes-vous sûr de vouloir réinitialiser les codes ? + Etes vous sûr de vouloir réinitialiser les codes ? - + Part-DB1\templates\Users\_2fa_settings.html.twig:88 Part-DB1\templates\Users\_2fa_settings.html.twig:88 @@ -3734,7 +3778,7 @@ Notez également que sans authentification à deux facteurs, votre compte n'est Cela permettra de supprimer tous les codes précédents et de générer un ensemble de nouveaux codes. Cela ne peut pas être annulé. N'oubliez pas d'imprimer les nouveaux codes et de les conserver dans un endroit sûr ! - + Part-DB1\templates\Users\_2fa_settings.html.twig:91 Part-DB1\templates\Users\_2fa_settings.html.twig:91 @@ -3744,7 +3788,7 @@ Notez également que sans authentification à deux facteurs, votre compte n'est Codes de secours activés - + Part-DB1\templates\Users\_2fa_settings.html.twig:99 Part-DB1\templates\Users\_2fa_settings.html.twig:99 @@ -3754,7 +3798,7 @@ Notez également que sans authentification à deux facteurs, votre compte n'est Afficher les codes de secours - + Part-DB1\templates\Users\_2fa_settings.html.twig:114 Part-DB1\templates\Users\_2fa_settings.html.twig:114 @@ -3764,17 +3808,17 @@ Notez également que sans authentification à deux facteurs, votre compte n'est Clés de sécurité enregistrées - + Part-DB1\templates\Users\_2fa_settings.html.twig:115 Part-DB1\templates\Users\_2fa_settings.html.twig:115 tfa_u2f.delete_u2f.confirm_title - Êtes-vous sûr de vouloir supprimer cette clé de sécurité ? + Etes vous sûr de vouloir supprimer cette clé de sécurité ? - + Part-DB1\templates\Users\_2fa_settings.html.twig:116 Part-DB1\templates\Users\_2fa_settings.html.twig:116 @@ -3784,7 +3828,7 @@ Notez également que sans authentification à deux facteurs, votre compte n'est Si vous supprimez cette clé, il ne sera plus possible de se connecter avec cette clé. S'il ne reste aucune clé de sécurité, l'authentification à deux facteurs sera désactivée. - + Part-DB1\templates\Users\_2fa_settings.html.twig:123 Part-DB1\templates\Users\_2fa_settings.html.twig:123 @@ -3794,7 +3838,7 @@ Notez également que sans authentification à deux facteurs, votre compte n'est Nom de la clé - + Part-DB1\templates\Users\_2fa_settings.html.twig:124 Part-DB1\templates\Users\_2fa_settings.html.twig:124 @@ -3804,7 +3848,7 @@ Notez également que sans authentification à deux facteurs, votre compte n'est Date d'enregistrement - + Part-DB1\templates\Users\_2fa_settings.html.twig:134 Part-DB1\templates\Users\_2fa_settings.html.twig:134 @@ -3814,7 +3858,7 @@ Notez également que sans authentification à deux facteurs, votre compte n'est Supprimer la clé - + Part-DB1\templates\Users\_2fa_settings.html.twig:141 Part-DB1\templates\Users\_2fa_settings.html.twig:141 @@ -3824,7 +3868,7 @@ Notez également que sans authentification à deux facteurs, votre compte n'est Aucune clé de sécurité enregistrée - + Part-DB1\templates\Users\_2fa_settings.html.twig:144 Part-DB1\templates\Users\_2fa_settings.html.twig:144 @@ -3834,7 +3878,7 @@ Notez également que sans authentification à deux facteurs, votre compte n'est Enregistrer une nouvelle clé de sécurité - + Part-DB1\templates\Users\_2fa_settings.html.twig:148 Part-DB1\templates\Users\_2fa_settings.html.twig:148 @@ -3845,17 +3889,17 @@ Notez également que sans authentification à deux facteurs, votre compte n'est Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fiable, vous pouvez réinitialiser le statut de <i>tous</i> les ordinateurs ici. - + Part-DB1\templates\Users\_2fa_settings.html.twig:149 Part-DB1\templates\Users\_2fa_settings.html.twig:149 tfa_trustedDevices.invalidate.confirm_title - Êtes-vous sûr de vouloir supprimer tous les ordinateurs de confiance ? + Etes vous sûr de vouloir supprimer tous les ordinateurs de confiance ? - + Part-DB1\templates\Users\_2fa_settings.html.twig:150 Part-DB1\templates\Users\_2fa_settings.html.twig:150 @@ -3865,7 +3909,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Vous devrez à nouveau procéder à une authentification à deux facteurs sur tous les ordinateurs. Assurez-vous d'avoir votre appareil à deux facteurs à portée de main. - + Part-DB1\templates\Users\_2fa_settings.html.twig:154 Part-DB1\templates\Users\_2fa_settings.html.twig:154 @@ -3875,7 +3919,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Supprimer tous les dispositifs de confiance - + Part-DB1\templates\_navbar.html.twig:4 Part-DB1\templates\_navbar.html.twig:4 @@ -3886,7 +3930,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Activer/désactiver la barre latérale - + Part-DB1\templates\_navbar.html.twig:22 @@ -3895,7 +3939,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Scanner - + Part-DB1\templates\_navbar.html.twig:38 Part-DB1\templates\_navbar.html.twig:36 @@ -3906,7 +3950,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Connecté en tant que - + Part-DB1\templates\_navbar.html.twig:44 Part-DB1\templates\_navbar.html.twig:42 @@ -3917,17 +3961,17 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Connexion - + Part-DB1\templates\_navbar.html.twig:50 Part-DB1\templates\_navbar.html.twig:48 ui.toggle_darkmode - Sombre + Darkmode - + Part-DB1\templates\_navbar.html.twig:54 Part-DB1\src\Form\UserSettingsType.php:97 @@ -3941,7 +3985,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Langue - + Part-DB1\templates\_navbar_search.html.twig:4 Part-DB1\templates\_navbar_search.html.twig:4 @@ -3952,7 +3996,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Options de recherche - + Part-DB1\templates\_navbar_search.html.twig:23 @@ -3961,7 +4005,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Tags - + Part-DB1\templates\_navbar_search.html.twig:27 Part-DB1\src\Form\LabelOptionsType.php:68 @@ -3976,7 +4020,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Emplacement de stockage - + Part-DB1\templates\_navbar_search.html.twig:36 Part-DB1\templates\_navbar_search.html.twig:31 @@ -3987,7 +4031,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Codecmd. - + Part-DB1\templates\_navbar_search.html.twig:40 Part-DB1\src\Services\ElementTypeNameGenerator.php:89 @@ -4000,7 +4044,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Fournisseur - + Part-DB1\templates\_navbar_search.html.twig:57 Part-DB1\templates\_navbar_search.html.twig:52 @@ -4008,10 +4052,10 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia search.deactivateBarcode - Désactiver Code barres + Désa. Code barres - + Part-DB1\templates\_navbar_search.html.twig:61 Part-DB1\templates\_navbar_search.html.twig:56 @@ -4022,33 +4066,17 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Reg.Ex. Correspondance - + Part-DB1\templates\_navbar_search.html.twig:68 Part-DB1\templates\_navbar_search.html.twig:62 search.submit - Rechercher ! + Rechercher! - - - Part-DB1\templates\_sidebar.html.twig:37 - Part-DB1\templates\_sidebar.html.twig:12 - Part-DB1\templates\_sidebar.html.twig:37 - Part-DB1\templates\_sidebar.html.twig:12 - templates\base.html.twig:175 - templates\base.html.twig:189 - templates\base.html.twig:202 - templates\base.html.twig:230 - - - project.labelp - Projet - - - + Part-DB1\templates\_sidebar.html.twig:2 Part-DB1\templates\_sidebar.html.twig:2 @@ -4061,7 +4089,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Actions - + Part-DB1\templates\_sidebar.html.twig:6 Part-DB1\templates\_sidebar.html.twig:6 @@ -4074,7 +4102,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Source de données - + Part-DB1\templates\_sidebar.html.twig:10 Part-DB1\templates\_sidebar.html.twig:10 @@ -4087,7 +4115,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Fabricants - + Part-DB1\templates\_sidebar.html.twig:11 Part-DB1\templates\_sidebar.html.twig:11 @@ -4100,7 +4128,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Fournisseurs - + Part-DB1\src\Controller\AdminPages\BaseAdminController.php:213 Part-DB1\src\Controller\AdminPages\BaseAdminController.php:293 @@ -4116,7 +4144,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Le téléchargement du fichier joint a échoué ! - + Part-DB1\src\Controller\AdminPages\BaseAdminController.php:222 Part-DB1\src\Controller\AdminPages\BaseAdminController.php:190 @@ -4126,7 +4154,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Changements sauvegardés avec succès. - + Part-DB1\src\Controller\AdminPages\BaseAdminController.php:231 Part-DB1\src\Controller\AdminPages\BaseAdminController.php:196 @@ -4136,7 +4164,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Les changements n'ont pas pu être sauvegardés ! Veuillez vérifier vos données ! - + Part-DB1\src\Controller\AdminPages\BaseAdminController.php:302 Part-DB1\src\Controller\AdminPages\BaseAdminController.php:252 @@ -4146,7 +4174,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Élément créé avec succès ! - + Part-DB1\src\Controller\AdminPages\BaseAdminController.php:308 Part-DB1\src\Controller\AdminPages\BaseAdminController.php:258 @@ -4156,7 +4184,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia L'élément n'a pas pu être créé ! Vérifiez vos données ! - + Part-DB1\src\Controller\AdminPages\BaseAdminController.php:399 Part-DB1\src\Controller\AdminPages\BaseAdminController.php:352 @@ -4167,7 +4195,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Élément supprimé ! - + Part-DB1\src\Controller\AdminPages\BaseAdminController.php:401 Part-DB1\src\Controller\UserController.php:109 @@ -4180,10 +4208,10 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia csfr_invalid - Le jeton CSRF n'est pas valide ! Rechargez cette page ou contactez un administrateur si le problème persiste ! + Le jeton RFTS n'est pas valable ! Rechargez cette page ou contactez un administrateur si le problème persiste ! - + Part-DB1\src\Controller\LabelController.php:125 @@ -4192,7 +4220,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Aucune entité correspondant à la gamme trouvée. - + Part-DB1\src\Controller\LogController.php:149 Part-DB1\src\Controller\LogController.php:154 @@ -4203,7 +4231,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia L'élément ciblé n'a pas pu être trouvé dans la base de données ! - + Part-DB1\src\Controller\LogController.php:156 Part-DB1\src\Controller\LogController.php:160 @@ -4214,7 +4242,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Rétablissement réussi. - + Part-DB1\src\Controller\LogController.php:176 Part-DB1\src\Controller\LogController.php:180 @@ -4225,7 +4253,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Élément restauré avec succès. - + Part-DB1\src\Controller\LogController.php:178 Part-DB1\src\Controller\LogController.php:182 @@ -4236,7 +4264,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia L'élément a déjà été restauré ! - + Part-DB1\src\Controller\LogController.php:185 Part-DB1\src\Controller\LogController.php:189 @@ -4247,7 +4275,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia L'élément a été supprimé avec succès. - + Part-DB1\src\Controller\LogController.php:187 Part-DB1\src\Controller\LogController.php:191 @@ -4258,7 +4286,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia L'élément a déjà été supprimé ! - + Part-DB1\src\Controller\LogController.php:194 Part-DB1\src\Controller\LogController.php:198 @@ -4269,7 +4297,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Annulation de la modification de l'élément - + Part-DB1\src\Controller\LogController.php:196 Part-DB1\src\Controller\LogController.php:200 @@ -4280,7 +4308,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Vous devez supprimer l'élément avant de pouvoir annuler ce changement ! - + Part-DB1\src\Controller\LogController.php:199 Part-DB1\src\Controller\LogController.php:203 @@ -4291,7 +4319,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Cette entrée de journal ne peut pas être annulée ! - + Part-DB1\src\Controller\PartController.php:182 Part-DB1\src\Controller\PartController.php:182 @@ -4302,7 +4330,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Changements sauvegardés ! - + Part-DB1\src\Controller\PartController.php:186 Part-DB1\src\Controller\PartController.php:186 @@ -4312,7 +4340,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Erreur lors de l'enregistrement : Vérifiez vos données ! - + Part-DB1\src\Controller\PartController.php:216 Part-DB1\src\Controller\PartController.php:219 @@ -4322,7 +4350,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Composant supprimé avec succès. - + Part-DB1\src\Controller\PartController.php:302 Part-DB1\src\Controller\PartController.php:277 @@ -4335,7 +4363,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Composants créés avec succès ! - + Part-DB1\src\Controller\PartController.php:308 Part-DB1\src\Controller\PartController.php:283 @@ -4345,7 +4373,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Erreur lors de la création : Vérifiez vos données ! - + Part-DB1\src\Controller\ScanController.php:68 Part-DB1\src\Controller\ScanController.php:90 @@ -4355,7 +4383,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Aucun élément trouvé pour le code-barres donné. - + Part-DB1\src\Controller\ScanController.php:71 @@ -4364,7 +4392,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Format inconnu ! - + Part-DB1\src\Controller\ScanController.php:86 @@ -4373,7 +4401,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Élément trouvé. - + Part-DB1\src\Controller\SecurityController.php:114 Part-DB1\src\Controller\SecurityController.php:109 @@ -4383,7 +4411,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Nom d'utilisateur / Email - + Part-DB1\src\Controller\SecurityController.php:131 Part-DB1\src\Controller\SecurityController.php:126 @@ -4393,7 +4421,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Demande de mot de passe réussie ! Consultez vos e-mails pour plus d'informations. - + Part-DB1\src\Controller\SecurityController.php:162 Part-DB1\src\Controller\SecurityController.php:160 @@ -4403,17 +4431,17 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Nom d'utilisateur - + Part-DB1\src\Controller\SecurityController.php:165 Part-DB1\src\Controller\SecurityController.php:163 pw_reset.token - Token + Jeton - + Part-DB1\src\Controller\SecurityController.php:194 Part-DB1\src\Controller\SecurityController.php:192 @@ -4423,7 +4451,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Nom d'utilisateur ou jeton invalide ! Veuillez vérifier vos données. - + Part-DB1\src\Controller\SecurityController.php:196 Part-DB1\src\Controller\SecurityController.php:194 @@ -4433,7 +4461,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Le mot de passe a été réinitialisé avec succès. Vous pouvez maintenant vous connecter avec le nouveau mot de passe. - + Part-DB1\src\Controller\UserController.php:107 Part-DB1\src\Controller\UserController.php:99 @@ -4443,7 +4471,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Toutes les méthodes d'authentification à deux facteurs ont été désactivées avec succès. - + Part-DB1\src\Controller\UserSettingsController.php:101 Part-DB1\src\Controller\UserSettingsController.php:92 @@ -4453,7 +4481,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Aucun code de secours n'est activé ! - + Part-DB1\src\Controller\UserSettingsController.php:138 Part-DB1\src\Controller\UserSettingsController.php:132 @@ -4463,7 +4491,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Il n'y a pas de clé de sécurité avec cet ID ! - + Part-DB1\src\Controller\UserSettingsController.php:145 Part-DB1\src\Controller\UserSettingsController.php:139 @@ -4473,7 +4501,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Vous ne pouvez pas supprimer les clés de sécurité des autres utilisateurs ! - + Part-DB1\src\Controller\UserSettingsController.php:153 Part-DB1\src\Controller\UserSettingsController.php:147 @@ -4483,7 +4511,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Clé de sécurité retirée avec succès. - + Part-DB1\src\Controller\UserSettingsController.php:188 Part-DB1\src\Controller\UserSettingsController.php:180 @@ -4493,7 +4521,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Les appareils de confiance ont été réinitialisés avec succès. - + Part-DB1\src\Controller\UserSettingsController.php:235 Part-DB1\src\Controller\UserSettingsController.php:226 @@ -4504,7 +4532,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Paramètres sauvegardés ! - + Part-DB1\src\Controller\UserSettingsController.php:297 Part-DB1\src\Controller\UserSettingsController.php:288 @@ -4515,7 +4543,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Mot de passe changé ! - + Part-DB1\src\Controller\UserSettingsController.php:317 Part-DB1\src\Controller\UserSettingsController.php:306 @@ -4525,7 +4553,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia L'application d'authentification a été activée avec succès. - + Part-DB1\src\Controller\UserSettingsController.php:328 Part-DB1\src\Controller\UserSettingsController.php:315 @@ -4535,7 +4563,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia L'application d'authentification a été désactivée avec succès. - + Part-DB1\src\Controller\UserSettingsController.php:346 Part-DB1\src\Controller\UserSettingsController.php:332 @@ -4545,7 +4573,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia De nouveaux codes de secours ont été générés avec succès. - + Part-DB1\src\DataTables\AttachmentDataTable.php:148 Part-DB1\src\DataTables\AttachmentDataTable.php:148 @@ -4555,7 +4583,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Nom du fichier - + Part-DB1\src\DataTables\AttachmentDataTable.php:153 Part-DB1\src\DataTables\AttachmentDataTable.php:153 @@ -4565,7 +4593,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Taille du fichier - + Part-DB1\src\DataTables\AttachmentDataTable.php:183 Part-DB1\src\DataTables\AttachmentDataTable.php:191 @@ -4585,7 +4613,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Vrai - + Part-DB1\src\DataTables\AttachmentDataTable.php:184 Part-DB1\src\DataTables\AttachmentDataTable.php:192 @@ -4607,7 +4635,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Faux - + Part-DB1\src\DataTables\Column\LogEntryTargetColumn.php:128 Part-DB1\src\DataTables\Column\LogEntryTargetColumn.php:119 @@ -4617,7 +4645,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Cible supprimée. - + Part-DB1\src\DataTables\Column\RevertLogColumn.php:57 Part-DB1\src\DataTables\Column\RevertLogColumn.php:60 @@ -4628,7 +4656,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Annuler la suppression - + Part-DB1\src\DataTables\Column\RevertLogColumn.php:63 Part-DB1\src\DataTables\Column\RevertLogColumn.php:66 @@ -4639,7 +4667,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Annuler la modification - + Part-DB1\src\DataTables\Column\RevertLogColumn.php:83 Part-DB1\src\DataTables\Column\RevertLogColumn.php:86 @@ -4650,7 +4678,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Restaurer à cette date - + Part-DB1\src\DataTables\LogDataTable.php:173 Part-DB1\src\DataTables\LogDataTable.php:161 @@ -4660,7 +4688,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia ID - + Part-DB1\src\DataTables\LogDataTable.php:178 Part-DB1\src\DataTables\LogDataTable.php:166 @@ -4670,7 +4698,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Horodatage - + Part-DB1\src\DataTables\LogDataTable.php:183 Part-DB1\src\DataTables\LogDataTable.php:171 @@ -4680,7 +4708,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Type - + Part-DB1\src\DataTables\LogDataTable.php:191 Part-DB1\src\DataTables\LogDataTable.php:179 @@ -4690,7 +4718,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Niveau - + Part-DB1\src\DataTables\LogDataTable.php:200 Part-DB1\src\DataTables\LogDataTable.php:188 @@ -4700,7 +4728,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Utilisateur - + Part-DB1\src\DataTables\LogDataTable.php:213 Part-DB1\src\DataTables\LogDataTable.php:201 @@ -4710,7 +4738,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Type de cible - + Part-DB1\src\DataTables\LogDataTable.php:226 Part-DB1\src\DataTables\LogDataTable.php:214 @@ -4720,7 +4748,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Cible - + Part-DB1\src\DataTables\LogDataTable.php:231 Part-DB1\src\DataTables\LogDataTable.php:218 @@ -4731,7 +4759,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Extra - + Part-DB1\src\DataTables\PartsDataTable.php:168 Part-DB1\src\DataTables\PartsDataTable.php:116 @@ -4741,7 +4769,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Nom - + Part-DB1\src\DataTables\PartsDataTable.php:178 Part-DB1\src\DataTables\PartsDataTable.php:126 @@ -4751,7 +4779,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia ID - + Part-DB1\src\DataTables\PartsDataTable.php:182 Part-DB1\src\DataTables\PartsDataTable.php:130 @@ -4761,7 +4789,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Description - + Part-DB1\src\DataTables\PartsDataTable.php:185 Part-DB1\src\DataTables\PartsDataTable.php:133 @@ -4771,7 +4799,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Catégorie - + Part-DB1\src\DataTables\PartsDataTable.php:190 Part-DB1\src\DataTables\PartsDataTable.php:138 @@ -4781,7 +4809,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Empreinte - + Part-DB1\src\DataTables\PartsDataTable.php:194 Part-DB1\src\DataTables\PartsDataTable.php:142 @@ -4791,7 +4819,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Fabricant - + Part-DB1\src\DataTables\PartsDataTable.php:197 Part-DB1\src\DataTables\PartsDataTable.php:145 @@ -4801,7 +4829,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Emplacement de stockage - + Part-DB1\src\DataTables\PartsDataTable.php:216 Part-DB1\src\DataTables\PartsDataTable.php:164 @@ -4811,7 +4839,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Quantité - + Part-DB1\src\DataTables\PartsDataTable.php:224 Part-DB1\src\DataTables\PartsDataTable.php:172 @@ -4821,7 +4849,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Quantité min. - + Part-DB1\src\DataTables\PartsDataTable.php:232 Part-DB1\src\DataTables\PartsDataTable.php:180 @@ -4831,7 +4859,13 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Unité de mesure - + + + part.table.partCustomState + État personnalisé de la pièce + + + Part-DB1\src\DataTables\PartsDataTable.php:236 Part-DB1\src\DataTables\PartsDataTable.php:184 @@ -4841,7 +4875,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Créé le - + Part-DB1\src\DataTables\PartsDataTable.php:240 Part-DB1\src\DataTables\PartsDataTable.php:188 @@ -4851,7 +4885,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Dernière modification - + Part-DB1\src\DataTables\PartsDataTable.php:244 Part-DB1\src\DataTables\PartsDataTable.php:192 @@ -4861,7 +4895,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Révision nécessaire - + Part-DB1\src\DataTables\PartsDataTable.php:251 Part-DB1\src\DataTables\PartsDataTable.php:199 @@ -4871,7 +4905,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Favoris - + Part-DB1\src\DataTables\PartsDataTable.php:258 Part-DB1\src\DataTables\PartsDataTable.php:206 @@ -4881,7 +4915,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia État - + Part-DB1\src\DataTables\PartsDataTable.php:260 Part-DB1\src\DataTables\PartsDataTable.php:262 @@ -4895,7 +4929,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Inconnu - + Part-DB1\src\DataTables\PartsDataTable.php:263 Part-DB1\src\Form\Part\PartBaseType.php:90 @@ -4907,7 +4941,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Annoncé - + Part-DB1\src\DataTables\PartsDataTable.php:264 Part-DB1\src\Form\Part\PartBaseType.php:90 @@ -4919,7 +4953,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Actif - + Part-DB1\src\DataTables\PartsDataTable.php:265 Part-DB1\src\Form\Part\PartBaseType.php:90 @@ -4931,7 +4965,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Non recommandé pour les nouvelles conceptions - + Part-DB1\src\DataTables\PartsDataTable.php:266 Part-DB1\src\Form\Part\PartBaseType.php:90 @@ -4943,7 +4977,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Fin de vie - + Part-DB1\src\DataTables\PartsDataTable.php:267 Part-DB1\src\Form\Part\PartBaseType.php:90 @@ -4955,7 +4989,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Arrêtés - + Part-DB1\src\DataTables\PartsDataTable.php:271 Part-DB1\src\DataTables\PartsDataTable.php:219 @@ -4965,7 +4999,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia MPN - + Part-DB1\src\DataTables\PartsDataTable.php:275 Part-DB1\src\DataTables\PartsDataTable.php:223 @@ -4975,7 +5009,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Poids - + Part-DB1\src\DataTables\PartsDataTable.php:279 Part-DB1\src\DataTables\PartsDataTable.php:227 @@ -4985,7 +5019,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Tags - + Part-DB1\src\DataTables\PartsDataTable.php:283 Part-DB1\src\DataTables\PartsDataTable.php:231 @@ -4995,7 +5029,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Fichiers joints - + Part-DB1\src\EventSubscriber\UserSystem\LoginSuccessSubscriber.php:82 Part-DB1\src\EventSubscriber\LoginSuccessListener.php:82 @@ -5005,7 +5039,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Connexion réussie. - + Part-DB1\src\Form\AdminPages\ImportType.php:77 Part-DB1\src\Form\AdminPages\ImportType.php:77 @@ -5016,7 +5050,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia JSON - + Part-DB1\src\Form\AdminPages\ImportType.php:77 Part-DB1\src\Form\AdminPages\ImportType.php:77 @@ -5027,7 +5061,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia XML - + Part-DB1\src\Form\AdminPages\ImportType.php:77 Part-DB1\src\Form\AdminPages\ImportType.php:77 @@ -5038,7 +5072,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia CSV - + Part-DB1\src\Form\AdminPages\ImportType.php:77 Part-DB1\src\Form\AdminPages\ImportType.php:77 @@ -5049,7 +5083,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia YAML - + Part-DB1\src\Form\AdminPages\ImportType.php:124 Part-DB1\src\Form\AdminPages\ImportType.php:124 @@ -5059,7 +5093,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Si cette option est activée, l'ensemble du processus est interrompu si des données non valides sont détectées. Si cette option n'est pas active, les entrées non valides sont ignorées et une tentative est faite pour importer les autres entrées. - + Part-DB1\src\Form\AdminPages\ImportType.php:86 Part-DB1\src\Form\AdminPages\ImportType.php:86 @@ -5070,7 +5104,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Séparateur CSV - + Part-DB1\src\Form\AdminPages\ImportType.php:93 Part-DB1\src\Form\AdminPages\ImportType.php:93 @@ -5081,7 +5115,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Élément parent - + Part-DB1\src\Form\AdminPages\ImportType.php:101 Part-DB1\src\Form\AdminPages\ImportType.php:101 @@ -5092,7 +5126,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Fichier - + Part-DB1\src\Form\AdminPages\ImportType.php:111 Part-DB1\src\Form\AdminPages\ImportType.php:111 @@ -5103,7 +5137,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Importer également des sous-éléments - + Part-DB1\src\Form\AdminPages\ImportType.php:120 Part-DB1\src\Form\AdminPages\ImportType.php:120 @@ -5114,7 +5148,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Interrompre sur donnée invalide - + Part-DB1\src\Form\AdminPages\ImportType.php:132 Part-DB1\src\Form\AdminPages\ImportType.php:132 @@ -5125,7 +5159,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Importer - + Part-DB1\src\Form\AttachmentFormType.php:113 Part-DB1\src\Form\AttachmentFormType.php:109 @@ -5135,7 +5169,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Un fichier joint marqué comme étant privé ne peut être consulté que par un utilisateur connecté qui a l'autorisation appropriée. Si cette option est activée, aucune miniature n'est générée et l'accès au fichier est plus lent. - + Part-DB1\src\Form\AttachmentFormType.php:127 Part-DB1\src\Form\AttachmentFormType.php:123 @@ -5145,7 +5179,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Il est possible de saisir ici soit l'URL d'un fichier externe, soit un mot clé pour rechercher les ressources intégrées (par exemple les empreintes). - + Part-DB1\src\Form\AttachmentFormType.php:82 Part-DB1\src\Form\AttachmentFormType.php:79 @@ -5155,7 +5189,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Nom - + Part-DB1\src\Form\AttachmentFormType.php:85 Part-DB1\src\Form\AttachmentFormType.php:82 @@ -5165,7 +5199,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Type de fichier joint - + Part-DB1\src\Form\AttachmentFormType.php:94 Part-DB1\src\Form\AttachmentFormType.php:91 @@ -5175,7 +5209,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Voir dans le tableau - + Part-DB1\src\Form\AttachmentFormType.php:105 Part-DB1\src\Form\AttachmentFormType.php:102 @@ -5185,7 +5219,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Fichier joint privé - + Part-DB1\src\Form\AttachmentFormType.php:119 Part-DB1\src\Form\AttachmentFormType.php:115 @@ -5195,7 +5229,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia URL - + Part-DB1\src\Form\AttachmentFormType.php:133 Part-DB1\src\Form\AttachmentFormType.php:129 @@ -5205,7 +5239,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Télécharger un fichier externe - + Part-DB1\src\Form\AttachmentFormType.php:146 Part-DB1\src\Form\AttachmentFormType.php:142 @@ -5215,7 +5249,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Télécharger le fichier - + Part-DB1\src\Form\LabelOptionsType.php:68 Part-DB1\src\Services\ElementTypeNameGenerator.php:86 @@ -5225,7 +5259,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Composant - + Part-DB1\src\Form\LabelOptionsType.php:68 Part-DB1\src\Services\ElementTypeNameGenerator.php:87 @@ -5235,7 +5269,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Lot de composant - + Part-DB1\src\Form\LabelOptionsType.php:78 @@ -5244,7 +5278,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Aucun - + Part-DB1\src\Form\LabelOptionsType.php:78 @@ -5253,7 +5287,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia QR Code (recommandé) - + Part-DB1\src\Form\LabelOptionsType.php:78 @@ -5262,7 +5296,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Code 128 (recommandé) - + Part-DB1\src\Form\LabelOptionsType.php:78 @@ -5271,7 +5305,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Code 39 (recommandé) - + Part-DB1\src\Form\LabelOptionsType.php:78 @@ -5280,7 +5314,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Code 93 - + Part-DB1\src\Form\LabelOptionsType.php:78 @@ -5289,16 +5323,16 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Datamatrix - + Part-DB1\src\Form\LabelOptionsType.php:122 label_options.lines_mode.html - Espace réservé + Placeholders - + Part-DB1\src\Form\LabelOptionsType.php:122 @@ -5307,16 +5341,16 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Twig - + Part-DB1\src\Form\LabelOptionsType.php:126 label_options.lines_mode.help - Si vous sélectionnez Twig ici, le champ de contenu est interprété comme un modèle Twig. Voir <a href="https://twig.symfony.com/doc/3.x/templates.html">Documentation de Twig</a> et <a href="https://docs.part-db.de/usage/labels.html#twig-mode">Wiki</a> pour plus d'informations. + Si vous sélectionnez Twig ici, le champ de contenu est interprété comme un modèle Twig. Voir <a href="https://twig.symfony.com/doc/3.x/templates.html">Documentation de Twig</a> et <a href="https://github.com/Part-DB/Part-DB-symfony/wiki/Labels#twig-mode">Wiki</a> pour plus d'informations. - + Part-DB1\src\Form\LabelOptionsType.php:47 @@ -5325,7 +5359,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Taille de l'étiquette - + Part-DB1\src\Form\LabelOptionsType.php:66 @@ -5334,7 +5368,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Type de cible - + Part-DB1\src\Form\LabelOptionsType.php:75 @@ -5343,7 +5377,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Code barre - + Part-DB1\src\Form\LabelOptionsType.php:102 @@ -5352,7 +5386,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Contenu - + Part-DB1\src\Form\LabelOptionsType.php:111 @@ -5361,16 +5395,16 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Styles supplémentaires (CSS) - + Part-DB1\src\Form\LabelOptionsType.php:120 label_options.lines_mode.label - Mode du parseur + Parser mode - + Part-DB1\src\Form\LabelOptionsType.php:51 @@ -5379,7 +5413,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Largeur - + Part-DB1\src\Form\LabelOptionsType.php:60 @@ -5388,7 +5422,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Hauteur - + Part-DB1\src\Form\LabelSystem\LabelDialogType.php:49 @@ -5397,7 +5431,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Vous pouvez spécifier ici plusieurs ID (par exemple 1,2,3) et/ou une plage (1-3) pour générer des étiquettes pour plusieurs éléments à la fois. - + Part-DB1\src\Form\LabelSystem\LabelDialogType.php:46 @@ -5406,7 +5440,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia ID des cibles - + Part-DB1\src\Form\LabelSystem\LabelDialogType.php:59 @@ -5415,7 +5449,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Actualisation - + Part-DB1\src\Form\LabelSystem\ScanDialogType.php:36 @@ -5424,7 +5458,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Saisie - + Part-DB1\src\Form\LabelSystem\ScanDialogType.php:44 @@ -5433,25 +5467,25 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Soumettre - + Part-DB1\src\Form\ParameterType.php:41 parameters.name.placeholder - Ex. Gain de courant DC + ex. Gain de courant DC - + Part-DB1\src\Form\ParameterType.php:50 parameters.symbol.placeholder - Ex. h_{FE} + ex. h_{FE} - + Part-DB1\src\Form\ParameterType.php:60 @@ -5460,7 +5494,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia ex. Test conditions - + Part-DB1\src\Form\ParameterType.php:71 @@ -5469,16 +5503,16 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia ex. 350 - + Part-DB1\src\Form\ParameterType.php:82 parameters.min.placeholder - Mémoire minimale + ex. 100 - + Part-DB1\src\Form\ParameterType.php:93 @@ -5487,25 +5521,25 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia ex. 200 - + Part-DB1\src\Form\ParameterType.php:103 parameters.unit.placeholder - Ex. V + ex. V - + Part-DB1\src\Form\ParameterType.php:114 parameter.group.placeholder - Ex. Spécifications techniques + ex. Spécifications techniques - + Part-DB1\src\Form\Part\OrderdetailType.php:72 Part-DB1\src\Form\Part\OrderdetailType.php:75 @@ -5515,7 +5549,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Numéro de commande - + Part-DB1\src\Form\Part\OrderdetailType.php:81 Part-DB1\src\Form\Part\OrderdetailType.php:84 @@ -5525,7 +5559,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Fournisseur - + Part-DB1\src\Form\Part\OrderdetailType.php:87 Part-DB1\src\Form\Part\OrderdetailType.php:90 @@ -5535,7 +5569,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Lien vers l'offre - + Part-DB1\src\Form\Part\OrderdetailType.php:93 Part-DB1\src\Form\Part\OrderdetailType.php:96 @@ -5545,7 +5579,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Plus disponible - + Part-DB1\src\Form\Part\OrderdetailType.php:75 Part-DB1\src\Form\Part\OrderdetailType.php:78 @@ -5555,7 +5589,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Ex. BC 547C - + Part-DB1\src\Form\Part\PartBaseType.php:101 Part-DB1\src\Form\Part\PartBaseType.php:99 @@ -5565,7 +5599,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Nom - + Part-DB1\src\Form\Part\PartBaseType.php:109 Part-DB1\src\Form\Part\PartBaseType.php:107 @@ -5575,7 +5609,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Description - + Part-DB1\src\Form\Part\PartBaseType.php:120 Part-DB1\src\Form\Part\PartBaseType.php:118 @@ -5585,7 +5619,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Stock minimum - + Part-DB1\src\Form\Part\PartBaseType.php:129 Part-DB1\src\Form\Part\PartBaseType.php:127 @@ -5595,7 +5629,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Catégories - + Part-DB1\src\Form\Part\PartBaseType.php:135 Part-DB1\src\Form\Part\PartBaseType.php:133 @@ -5605,7 +5639,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Empreinte - + Part-DB1\src\Form\Part\PartBaseType.php:142 Part-DB1\src\Form\Part\PartBaseType.php:140 @@ -5615,7 +5649,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Tags - + Part-DB1\src\Form\Part\PartBaseType.php:154 Part-DB1\src\Form\Part\PartBaseType.php:152 @@ -5625,7 +5659,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Fabricant - + Part-DB1\src\Form\Part\PartBaseType.php:161 Part-DB1\src\Form\Part\PartBaseType.php:159 @@ -5635,7 +5669,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Lien vers la page du produit - + Part-DB1\src\Form\Part\PartBaseType.php:167 Part-DB1\src\Form\Part\PartBaseType.php:165 @@ -5645,7 +5679,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Numéro de pièce du fabricant - + Part-DB1\src\Form\Part\PartBaseType.php:173 Part-DB1\src\Form\Part\PartBaseType.php:171 @@ -5655,7 +5689,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia État de la fabrication - + Part-DB1\src\Form\Part\PartBaseType.php:181 Part-DB1\src\Form\Part\PartBaseType.php:179 @@ -5665,7 +5699,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Révision nécessaire - + Part-DB1\src\Form\Part\PartBaseType.php:189 Part-DB1\src\Form\Part\PartBaseType.php:187 @@ -5675,7 +5709,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Favoris - + Part-DB1\src\Form\Part\PartBaseType.php:197 Part-DB1\src\Form\Part\PartBaseType.php:195 @@ -5685,7 +5719,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Poids - + Part-DB1\src\Form\Part\PartBaseType.php:203 Part-DB1\src\Form\Part\PartBaseType.php:201 @@ -5695,7 +5729,13 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Unité de mesure - + + + part.edit.partCustomState + État personnalisé de la pièce + + + Part-DB1\src\Form\Part\PartBaseType.php:212 Part-DB1\src\Form\Part\PartBaseType.php:210 @@ -5705,7 +5745,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Commentaire - + Part-DB1\src\Form\Part\PartBaseType.php:250 Part-DB1\src\Form\Part\PartBaseType.php:246 @@ -5715,7 +5755,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Miniature - + Part-DB1\src\Form\Part\PartBaseType.php:295 Part-DB1\src\Form\Part\PartBaseType.php:276 @@ -5726,7 +5766,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Sauvegarder les modifications - + Part-DB1\src\Form\Part\PartBaseType.php:296 Part-DB1\src\Form\Part\PartBaseType.php:277 @@ -5734,10 +5774,10 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia part.edit.reset - Rejeter les modifications + rejeter les modifications - + Part-DB1\src\Form\Part\PartBaseType.php:105 Part-DB1\src\Form\Part\PartBaseType.php:103 @@ -5747,7 +5787,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Ex. BC547 - + Part-DB1\src\Form\Part\PartBaseType.php:115 Part-DB1\src\Form\Part\PartBaseType.php:113 @@ -5757,7 +5797,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Ex. NPN 45V, 0,1A, 0,5W - + Part-DB1\src\Form\Part\PartBaseType.php:123 Part-DB1\src\Form\Part\PartBaseType.php:121 @@ -5767,7 +5807,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Ex. 1 - + Part-DB1\src\Form\Part\PartLotType.php:69 Part-DB1\src\Form\Part\PartLotType.php:69 @@ -5777,7 +5817,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Description - + Part-DB1\src\Form\Part\PartLotType.php:78 Part-DB1\src\Form\Part\PartLotType.php:78 @@ -5787,7 +5827,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Emplacement de stockage - + Part-DB1\src\Form\Part\PartLotType.php:89 Part-DB1\src\Form\Part\PartLotType.php:89 @@ -5797,7 +5837,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Quantité - + Part-DB1\src\Form\Part\PartLotType.php:98 Part-DB1\src\Form\Part\PartLotType.php:97 @@ -5807,7 +5847,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Quantité inconnue - + Part-DB1\src\Form\Part\PartLotType.php:109 Part-DB1\src\Form\Part\PartLotType.php:108 @@ -5817,7 +5857,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Doit être rempli - + Part-DB1\src\Form\Part\PartLotType.php:120 Part-DB1\src\Form\Part\PartLotType.php:119 @@ -5827,7 +5867,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Date d'expiration - + Part-DB1\src\Form\Part\PartLotType.php:128 Part-DB1\src\Form\Part\PartLotType.php:125 @@ -5837,7 +5877,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Commentaire - + Part-DB1\src\Form\Permissions\PermissionsType.php:99 Part-DB1\src\Form\Permissions\PermissionsType.php:99 @@ -5847,7 +5887,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Divers - + Part-DB1\src\Form\TFAGoogleSettingsType.php:97 Part-DB1\src\Form\TFAGoogleSettingsType.php:97 @@ -5857,7 +5897,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Activer l'application d'authentification - + Part-DB1\src\Form\TFAGoogleSettingsType.php:101 Part-DB1\src\Form\TFAGoogleSettingsType.php:101 @@ -5867,7 +5907,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Désactiver l'application d'authentification - + Part-DB1\src\Form\TFAGoogleSettingsType.php:74 Part-DB1\src\Form\TFAGoogleSettingsType.php:74 @@ -5877,7 +5917,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Code de confirmation - + Part-DB1\src\Form\UserSettingsType.php:108 Part-DB1\src\Form\UserSettingsType.php:108 @@ -5888,7 +5928,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Fuseau horaire - + Part-DB1\src\Form\UserSettingsType.php:133 Part-DB1\src\Form\UserSettingsType.php:132 @@ -5898,7 +5938,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Devise préférée - + Part-DB1\src\Form\UserSettingsType.php:140 Part-DB1\src\Form\UserSettingsType.php:139 @@ -5909,7 +5949,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Appliquer les modifications - + Part-DB1\src\Form\UserSettingsType.php:141 Part-DB1\src\Form\UserSettingsType.php:140 @@ -5920,7 +5960,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Rejeter les modifications - + Part-DB1\src\Form\UserSettingsType.php:104 Part-DB1\src\Form\UserSettingsType.php:104 @@ -5931,7 +5971,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Langue du serveur - + Part-DB1\src\Form\UserSettingsType.php:115 Part-DB1\src\Form\UserSettingsType.php:115 @@ -5942,7 +5982,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Fuseau horaire du serveur - + Part-DB1\src\Services\ElementTypeNameGenerator.php:79 Part-DB1\src\Services\ElementTypeNameGenerator.php:79 @@ -5952,7 +5992,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Fichier joint - + Part-DB1\src\Services\ElementTypeNameGenerator.php:81 Part-DB1\src\Services\ElementTypeNameGenerator.php:81 @@ -5962,17 +6002,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Type de fichier joint - - - Part-DB1\src\Services\ElementTypeNameGenerator.php:82 - Part-DB1\src\Services\ElementTypeNameGenerator.php:82 - - - project.label - Projet - - - + Part-DB1\src\Services\ElementTypeNameGenerator.php:85 Part-DB1\src\Services\ElementTypeNameGenerator.php:85 @@ -5982,7 +6012,13 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Unité de mesure - + + + part_custom_state.label + État personnalisé de la pièce + + + Part-DB1\src\Services\ElementTypeNameGenerator.php:90 Part-DB1\src\Services\ElementTypeNameGenerator.php:90 @@ -5992,7 +6028,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Devise - + Part-DB1\src\Services\ElementTypeNameGenerator.php:91 Part-DB1\src\Services\ElementTypeNameGenerator.php:91 @@ -6002,7 +6038,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Informations de commande - + Part-DB1\src\Services\ElementTypeNameGenerator.php:92 Part-DB1\src\Services\ElementTypeNameGenerator.php:92 @@ -6012,7 +6048,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Informations sur les prix - + Part-DB1\src\Services\ElementTypeNameGenerator.php:94 Part-DB1\src\Services\ElementTypeNameGenerator.php:94 @@ -6022,7 +6058,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Utilisateur - + Part-DB1\src\Services\ElementTypeNameGenerator.php:95 @@ -6031,7 +6067,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Caractéristique - + Part-DB1\src\Services\ElementTypeNameGenerator.php:96 @@ -6040,7 +6076,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Profil d'étiquette - + Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:176 Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:161 @@ -6051,7 +6087,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Inconnu - + Part-DB1\src\Services\MarkdownParser.php:73 Part-DB1\src\Services\MarkdownParser.php:73 @@ -6061,7 +6097,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Chargement de la remise. Si ce message ne disparaît pas, essayez de recharger la page. - + Part-DB1\src\Services\PasswordResetManager.php:98 Part-DB1\src\Services\PasswordResetManager.php:98 @@ -6071,7 +6107,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Réinitialisation du mot de passe de votre compte Part-DB - + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:108 @@ -6080,7 +6116,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Outils - + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:109 Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:107 @@ -6091,7 +6127,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Éditer - + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:110 Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:108 @@ -6102,7 +6138,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Afficher - + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:111 Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:109 @@ -6112,7 +6148,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Système - + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:123 @@ -6121,7 +6157,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Générateur d'étiquettes - + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:130 @@ -6130,7 +6166,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Scanner - + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:149 Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:126 @@ -6141,7 +6177,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Types de fichier joint - + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:155 Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:132 @@ -6152,18 +6188,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Catégories - - - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:161 - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:138 - src\Services\ToolsTreeBuilder.php:66 - - - tree.tools.edit.projects - Modifier les projets - - - + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:167 Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:144 @@ -6174,7 +6199,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Fournisseurs - + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:173 Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:150 @@ -6185,7 +6210,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Fabricants - + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:179 Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:156 @@ -6195,7 +6220,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Emplacements de stockage - + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:185 Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:162 @@ -6205,7 +6230,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Empreintes - + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:191 Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:168 @@ -6215,7 +6240,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Devises - + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:197 Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:174 @@ -6225,7 +6250,13 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Unité de mesure - + + + tree.tools.edit.part_custom_state + État personnalisé de la pièce + + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:203 @@ -6234,7 +6265,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Profils d'étiquettes - + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:209 Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:180 @@ -6244,7 +6275,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Composant - + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:226 Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:197 @@ -6255,7 +6286,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Voir tous les composants - + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:232 Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:203 @@ -6265,7 +6296,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Fichiers joints - + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:239 Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:210 @@ -6276,7 +6307,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Statistiques - + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:258 Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:229 @@ -6286,7 +6317,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Utilisateurs - + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:264 Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:235 @@ -6296,7 +6327,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Groupes - + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:271 Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:242 @@ -6307,7 +6338,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Système d'événements - + Part-DB1\src\Services\Trees\TreeViewGenerator.php:95 Part-DB1\src\Services\Trees\TreeViewGenerator.php:95 @@ -6318,7 +6349,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Nouvel élément - + Part-DB1\templates\Parts\info\_attachments_info.html.twig:34 obsolete @@ -6328,7 +6359,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Fichier extérieur - + Part-DB1\templates\Parts\info\_attachments_info.html.twig:62 obsolete @@ -6338,7 +6369,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Éditer - + Part-DB1\templates\_navbar.html.twig:27 templates\base.html.twig:88 @@ -6349,7 +6380,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Scanner un code-barres - + Part-DB1\src\Form\UserSettingsType.php:119 src\Form\UserSettingsType.php:49 @@ -6360,7 +6391,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Thème - + Part-DB1\src\Form\UserSettingsType.php:129 src\Form\UserSettingsType.php:50 @@ -6371,7 +6402,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Thème du serveur - + Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:100 new @@ -6382,7 +6413,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia IP - + Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:128 Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:150 @@ -6396,7 +6427,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Modification annulée - + Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:130 Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:152 @@ -6410,7 +6441,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Élément restauré - + Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:139 new @@ -6421,7 +6452,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Ancien stock - + Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:160 new @@ -6432,7 +6463,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Ancien nom - + Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:184 new @@ -6443,7 +6474,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Champs modifiés - + Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:198 new @@ -6454,7 +6485,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Commentaire - + Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:214 new @@ -6465,7 +6496,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Élément supprimé : - + templates\base.html.twig:81 obsolete @@ -6473,10 +6504,10 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia go.exclamation - Allez ! + Allez! - + templates\base.html.twig:109 obsolete @@ -6487,7 +6518,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Anglais - + templates\base.html.twig:112 obsolete @@ -6498,7 +6529,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Allemand - + obsolete obsolete @@ -6508,7 +6539,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Votre mot de passe doit être changé ! - + obsolete obsolete @@ -6518,47 +6549,47 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Type de fichier joint - + obsolete obsolete attachment.table.element - Élément lié + élément lié - + obsolete obsolete attachment.edit.isPicture - Image ? + Image? - + obsolete obsolete attachment.edit.is3DModel - Modèle 3D ? + Modèle 3D? - + obsolete obsolete attachment.edit.isBuiltin - Intégré ? + Intégré? - + obsolete obsolete @@ -6568,7 +6599,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Ex. utilisé pour les alimentations à découpage - + obsolete obsolete @@ -6578,7 +6609,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Créer de nouveaux codes de secours - + obsolete obsolete @@ -6588,7 +6619,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Un élément ne peut pas être son propre parent. - + obsolete obsolete @@ -6598,7 +6629,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Le parent ne peut pas être un de ses propres enfants. - + obsolete obsolete @@ -6608,7 +6639,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Le lieu de stockage utilisé a été marqué comme étant plein, le stock ne peut donc pas être augmenté. (Nouveau stock maximum {{old_amount}}) - + obsolete obsolete @@ -6618,7 +6649,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia L'emplacement de stockage est plein, c'est pourquoi aucun nouveau composant ne peut être ajouté. - + obsolete obsolete @@ -6628,7 +6659,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia L'emplacement de stockage a été marqué comme "uniquement existant", donc aucun nouveau composant ne peut être ajouté. - + obsolete obsolete @@ -6638,7 +6669,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia L'emplacement de stockage a été marqué comme "Composant seul", par conséquent aucun nouveau composant ne peut être ajouté. - + obsolete obsolete @@ -6648,7 +6679,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Le composant est actuellement en cours de production et sera produit dans un avenir proche. - + obsolete obsolete @@ -6658,7 +6689,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Le composant a été annoncé, mais n'est pas encore disponible. - + obsolete obsolete @@ -6668,7 +6699,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Le composant n'est plus fabriqué. - + obsolete obsolete @@ -6678,7 +6709,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia La production de ce composant sera bientôt arrêtée. - + obsolete obsolete @@ -6688,7 +6719,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Ce composant est actuellement en production mais n'est pas recommandé pour les nouvelles conceptions. - + obsolete obsolete @@ -6698,7 +6729,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia L'état de la production n'est pas connu. - + obsolete obsolete @@ -6708,7 +6739,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Succès - + obsolete obsolete @@ -6718,7 +6749,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Erreur - + obsolete obsolete @@ -6728,7 +6759,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Attention - + obsolete obsolete @@ -6738,7 +6769,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Remarque - + obsolete obsolete @@ -6748,7 +6779,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Info - + obsolete obsolete @@ -6758,7 +6789,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Vous ne pouvez pas révoquer vous-même l'autorisation de "modifier les autorisations" pour éviter de vous verrouiller accidentellement ! - + obsolete obsolete @@ -6768,17 +6799,17 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Types de fichiers autorisés - + obsolete obsolete attachment_type.edit.filetype_filter.help - Vous pouvez spécifier ici une liste, séparée par des virgules, des extensions de fichiers ou des types mimes qu'un fichier téléchargé avec ce type de pièce jointe doit avoir. Pour autoriser tous les fichiers d'images pris en charge, utilisez image/*. + Vous pouvez spécifier ici une liste, séparée par des virgules, des extensions de fichiers ou des mimétapes qu'un fichier téléchargé avec ce type de pièce jointe doit avoir. Pour autoriser tous les fichiers d'images pris en charge, utilisez image/*. - + obsolete obsolete @@ -6788,7 +6819,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Ex. .txt, application/pdf, image/* - + src\Form\PartType.php:63 obsolete @@ -6799,7 +6830,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Ex. BC547 - + obsolete obsolete @@ -6809,7 +6840,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Non sélectionnable - + obsolete obsolete @@ -6819,7 +6850,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Si cette option est activée, alors cet élément ne peut être attribué à aucun composant en tant que propriété. Utile, par exemple si cet élément doit être utilisé uniquement pour le tri. - + obsolete obsolete @@ -6829,7 +6860,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Le BBCode peut être utilisé ici (par exemple [b]Bold[/b]) - + obsolete obsolete @@ -6839,7 +6870,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Créer un élément - + obsolete obsolete @@ -6849,7 +6880,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Sauvegarder - + obsolete obsolete @@ -6859,7 +6890,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Désactiver les empreintes - + obsolete obsolete @@ -6869,7 +6900,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Si cette option est activée, la propriété Empreinte est désactivée pour tous les composants de cette catégorie. - + obsolete obsolete @@ -6879,7 +6910,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Désactiver les fabricants - + obsolete obsolete @@ -6889,7 +6920,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Si cette option est activée, la propriété fabricant est désactivée pour tous les composants de cette catégorie. - + obsolete obsolete @@ -6899,7 +6930,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Désactiver les liens automatiques des fiches techniques - + obsolete obsolete @@ -6909,7 +6940,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Si cette option est activée, aucun lien automatique avec la fiche technique n'est généré pour les pièces de cette catégorie. - + obsolete obsolete @@ -6919,7 +6950,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Désactiver les propriétés - + obsolete obsolete @@ -6929,7 +6960,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Si cette option est activée, les propriétés des composants pour tous les composants de cette catégorie sont désactivées. - + obsolete obsolete @@ -6939,7 +6970,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Indication du nom du composant - + obsolete obsolete @@ -6949,7 +6980,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Ex. 100nF - + obsolete obsolete @@ -6959,7 +6990,13 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Filtre de nom - + + + category.edit.part_ipn_prefix + Préfixe de pièce IPN + + + obsolete obsolete @@ -6969,7 +7006,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Description par défaut - + obsolete obsolete @@ -6979,7 +7016,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Ex. Condensateur, 10mmx10mm, CMS - + obsolete obsolete @@ -6989,7 +7026,7 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Commentaire par défaut - + obsolete obsolete @@ -6999,18 +7036,18 @@ Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fia Adresse - + obsolete obsolete company.edit.address.placeholder - Ex. 99 exemple de rue + Ex. 99 exemple de rue exemple de ville - + obsolete obsolete @@ -7020,7 +7057,7 @@ exemple de ville Numéro de téléphone - + obsolete obsolete @@ -7030,7 +7067,7 @@ exemple de ville +33 1 23 45 67 89 - + obsolete obsolete @@ -7040,7 +7077,7 @@ exemple de ville Numéro de fax - + obsolete obsolete @@ -7050,7 +7087,7 @@ exemple de ville Email - + obsolete obsolete @@ -7060,7 +7097,7 @@ exemple de ville Ex. contact@foo.bar - + obsolete obsolete @@ -7070,7 +7107,7 @@ exemple de ville Site internet - + obsolete obsolete @@ -7080,7 +7117,7 @@ exemple de ville https://www.foo.bar - + obsolete obsolete @@ -7090,7 +7127,7 @@ exemple de ville URL du produit - + obsolete obsolete @@ -7100,7 +7137,7 @@ exemple de ville Si cette URL est définie, elle est utilisée pour générer l'URL d'un composant sur le site web du fabricant. Dans ce cas, %PARTNUMBER% sera remplacé par le numéro de commande. - + obsolete obsolete @@ -7110,7 +7147,7 @@ exemple de ville https://foo.bar/product/%PARTNUMBER% - + obsolete obsolete @@ -7120,7 +7157,7 @@ exemple de ville Code ISO - + obsolete obsolete @@ -7130,7 +7167,7 @@ exemple de ville Taux de change - + obsolete obsolete @@ -7140,7 +7177,7 @@ exemple de ville Modèle 3D - + obsolete obsolete @@ -7150,7 +7187,7 @@ exemple de ville Saisie - + obsolete obsolete @@ -7158,17 +7195,11 @@ exemple de ville mass_creation.lines.placeholder Élément 1 - Élément 1.1 - Élément 1.1.1 - Élément 1.2 Élément 2 -Élément 3 - -Élément 1 -> Élément 1.1 -Élément 1 -> Élément 1.2 +Élément 3 - + obsolete obsolete @@ -7178,7 +7209,7 @@ exemple de ville Créer - + obsolete obsolete @@ -7188,7 +7219,7 @@ exemple de ville Nombre entier - + obsolete obsolete @@ -7198,7 +7229,7 @@ exemple de ville Si cette option est activée, toutes les quantités dans cette unité sont arrondies à des nombres entiers. - + obsolete obsolete @@ -7208,7 +7239,7 @@ exemple de ville Utiliser les préfixes SI - + obsolete obsolete @@ -7218,7 +7249,7 @@ exemple de ville Si cette option est activée, les préfixes SI sont utilisés lors de la génération des nombres (par exemple 1,2 kg au lieu de 1200 g) - + obsolete obsolete @@ -7228,7 +7259,7 @@ exemple de ville Symbole de l'unité - + obsolete obsolete @@ -7238,7 +7269,7 @@ exemple de ville Ex. m - + obsolete obsolete @@ -7248,7 +7279,7 @@ exemple de ville Emplacement de stockage plein - + obsolete obsolete @@ -7258,7 +7289,7 @@ exemple de ville Si cette option est activée, il n'est pas possible d'ajouter de nouveaux composants à ce lieu de stockage ni d'augmenter le nombre de composants existants. - + obsolete obsolete @@ -7268,7 +7299,7 @@ exemple de ville Limiter aux composants existants - + obsolete obsolete @@ -7278,7 +7309,7 @@ exemple de ville Si cette option est active, il n'est pas possible d'ajouter de nouveaux composants à ce lieu de stockage, mais il est possible d'augmenter le nombre de composants existants. - + obsolete obsolete @@ -7288,7 +7319,7 @@ exemple de ville Seulement un composant - + obsolete obsolete @@ -7298,7 +7329,7 @@ exemple de ville Si cette option est activée, cet emplacement de stockage ne peut contenir qu'un seul composant (mais une quantité quelconque). Utile pour les petits compartiments ou les distributeurs de CMS. - + obsolete obsolete @@ -7308,7 +7339,7 @@ exemple de ville Type de stockage - + obsolete obsolete @@ -7318,7 +7349,7 @@ exemple de ville Ici, vous pouvez sélectionner une unité de mesure qu'un composant doit avoir pour être stocké dans ce lieu de stockage. - + obsolete obsolete @@ -7328,7 +7359,7 @@ exemple de ville Devise par défaut - + obsolete obsolete @@ -7338,7 +7369,7 @@ exemple de ville Frais de port - + obsolete obsolete @@ -7348,7 +7379,7 @@ exemple de ville Ex. j.doe - + obsolete obsolete @@ -7358,7 +7389,7 @@ exemple de ville Ex. John - + obsolete obsolete @@ -7368,7 +7399,7 @@ exemple de ville Ex. Doe - + obsolete obsolete @@ -7378,7 +7409,7 @@ exemple de ville j.doe@ecorp.com - + obsolete obsolete @@ -7388,7 +7419,7 @@ exemple de ville Ex. Development - + obsolete obsolete @@ -7398,7 +7429,7 @@ exemple de ville Nouveau mot de passe - + obsolete obsolete @@ -7408,7 +7439,7 @@ exemple de ville Confirmer le nouveau mot de passe - + obsolete obsolete @@ -7418,7 +7449,7 @@ exemple de ville L'utilisateur doit changer de mot de passe - + obsolete obsolete @@ -7428,7 +7459,7 @@ exemple de ville Utilisateur désactivé (connexion impossible) - + obsolete obsolete @@ -7438,7 +7469,7 @@ exemple de ville Créer l'utilisateur - + obsolete obsolete @@ -7448,7 +7479,7 @@ exemple de ville Enregistrer - + obsolete obsolete @@ -7458,7 +7489,7 @@ exemple de ville Rejeter les modifications - + templates\Parts\show_part_info.html.twig:166 obsolete @@ -7469,7 +7500,7 @@ exemple de ville Retrait - + templates\Parts\show_part_info.html.twig:171 obsolete @@ -7480,7 +7511,7 @@ exemple de ville Commentaire/objet - + templates\Parts\show_part_info.html.twig:189 obsolete @@ -7491,7 +7522,7 @@ exemple de ville Ajouter composants - + templates\Parts\show_part_info.html.twig:194 obsolete @@ -7502,7 +7533,7 @@ exemple de ville Ajouter - + templates\Parts\show_part_info.html.twig:199 obsolete @@ -7513,7 +7544,7 @@ exemple de ville Commentaire/objet - + templates\AdminPages\CompanyAdminBase.html.twig:15 obsolete @@ -7524,7 +7555,7 @@ exemple de ville Commentaire - + src\Form\PartType.php:83 obsolete @@ -7535,7 +7566,7 @@ exemple de ville Lien vers le site du fabricant - + src\Form\PartType.php:66 obsolete @@ -7546,7 +7577,7 @@ exemple de ville Ex. NPN 45V 0,1A 0,5W - + src\Form\PartType.php:69 obsolete @@ -7557,7 +7588,7 @@ exemple de ville Ex. 10 - + src\Form\PartType.php:72 obsolete @@ -7568,7 +7599,7 @@ exemple de ville Ex. 10 - + obsolete obsolete @@ -7578,7 +7609,7 @@ exemple de ville Prix par - + obsolete obsolete @@ -7588,7 +7619,7 @@ exemple de ville Retrait de composants - + obsolete obsolete @@ -7598,7 +7629,7 @@ exemple de ville _MENU_ - + obsolete obsolete @@ -7608,7 +7639,7 @@ exemple de ville Composants - + obsolete obsolete @@ -7618,7 +7649,7 @@ exemple de ville Structures des données - + obsolete obsolete @@ -7628,7 +7659,7 @@ exemple de ville Système - + obsolete obsolete @@ -7638,7 +7669,7 @@ exemple de ville Général - + obsolete obsolete @@ -7648,7 +7679,7 @@ exemple de ville Afficher - + obsolete obsolete @@ -7658,7 +7689,7 @@ exemple de ville Éditer - + obsolete obsolete @@ -7668,7 +7699,7 @@ exemple de ville Créer - + obsolete obsolete @@ -7678,7 +7709,7 @@ exemple de ville Changer de catégorie - + obsolete obsolete @@ -7688,7 +7719,7 @@ exemple de ville Supprimer - + obsolete obsolete @@ -7698,7 +7729,7 @@ exemple de ville Rechercher - + obsolete obsolete @@ -7708,7 +7739,7 @@ exemple de ville Liste de tous les composants - + obsolete obsolete @@ -7718,7 +7749,7 @@ exemple de ville Liste des composants sans prix - + obsolete obsolete @@ -7728,7 +7759,7 @@ exemple de ville Liste des composants obsolètes - + obsolete obsolete @@ -7738,7 +7769,7 @@ exemple de ville Liste des composants dont le stock est inconnu - + obsolete obsolete @@ -7748,7 +7779,7 @@ exemple de ville Changer le statut de favori - + obsolete obsolete @@ -7758,7 +7789,7 @@ exemple de ville Afficher les favoris - + obsolete obsolete @@ -7768,7 +7799,7 @@ exemple de ville Afficher les derniers composants modifiés/ajoutés - + obsolete obsolete @@ -7778,7 +7809,7 @@ exemple de ville Afficher le dernier utilisateur ayant apporté des modifications - + obsolete obsolete @@ -7788,7 +7819,7 @@ exemple de ville Afficher l'historique - + obsolete obsolete @@ -7798,7 +7829,7 @@ exemple de ville Nom - + obsolete obsolete @@ -7808,7 +7839,7 @@ exemple de ville Description - + obsolete obsolete @@ -7818,7 +7849,7 @@ exemple de ville En stock - + obsolete obsolete @@ -7828,7 +7859,7 @@ exemple de ville Stock minimum - + obsolete obsolete @@ -7838,7 +7869,7 @@ exemple de ville Commentaire - + obsolete obsolete @@ -7848,7 +7879,7 @@ exemple de ville Emplacement de stockage - + obsolete obsolete @@ -7858,7 +7889,7 @@ exemple de ville Fabricant - + obsolete obsolete @@ -7868,7 +7899,7 @@ exemple de ville Informations pour la commande - + obsolete obsolete @@ -7878,7 +7909,7 @@ exemple de ville Prix - + obsolete obsolete @@ -7888,7 +7919,7 @@ exemple de ville Fichiers joints - + obsolete obsolete @@ -7898,7 +7929,7 @@ exemple de ville Commandes - + obsolete obsolete @@ -7908,7 +7939,7 @@ exemple de ville Emplacements de stockage - + obsolete obsolete @@ -7918,7 +7949,7 @@ exemple de ville Déplacer - + obsolete obsolete @@ -7928,7 +7959,7 @@ exemple de ville Liste des composants - + obsolete obsolete @@ -7938,7 +7969,7 @@ exemple de ville Empreintes - + obsolete obsolete @@ -7948,7 +7979,7 @@ exemple de ville Catégories - + obsolete obsolete @@ -7958,7 +7989,7 @@ exemple de ville Fournisseurs - + obsolete obsolete @@ -7968,17 +7999,7 @@ exemple de ville Fabricants - - - obsolete - obsolete - - - perm.projects - Projets - - - + obsolete obsolete @@ -7988,7 +8009,7 @@ exemple de ville Types de fichiers joints - + obsolete obsolete @@ -7998,7 +8019,7 @@ exemple de ville Importer - + obsolete obsolete @@ -8008,7 +8029,7 @@ exemple de ville Étiquettes - + obsolete obsolete @@ -8018,7 +8039,7 @@ exemple de ville Calculateur de résistance - + obsolete obsolete @@ -8028,7 +8049,7 @@ exemple de ville Empreintes - + obsolete obsolete @@ -8038,7 +8059,7 @@ exemple de ville Logos CI - + obsolete obsolete @@ -8048,7 +8069,7 @@ exemple de ville Statistiques - + obsolete obsolete @@ -8058,7 +8079,7 @@ exemple de ville Éditer les autorisations - + obsolete obsolete @@ -8068,7 +8089,7 @@ exemple de ville Modifier le nom d'utilisateur - + obsolete obsolete @@ -8078,17 +8099,17 @@ exemple de ville Modifier le groupe - + obsolete obsolete perm.users.edit_infos - Éditer les informations + Editer les informations - + obsolete obsolete @@ -8098,7 +8119,7 @@ exemple de ville Modifier les autorisations - + obsolete obsolete @@ -8108,7 +8129,7 @@ exemple de ville Définir le mot de passe - + obsolete obsolete @@ -8118,7 +8139,7 @@ exemple de ville Changer les paramètres utilisateur - + obsolete obsolete @@ -8128,7 +8149,7 @@ exemple de ville Afficher l’état - + obsolete obsolete @@ -8138,7 +8159,7 @@ exemple de ville Actualiser la base de données - + obsolete obsolete @@ -8148,7 +8169,7 @@ exemple de ville Lecture des paramètres de la base de donnée - + obsolete obsolete @@ -8158,7 +8179,7 @@ exemple de ville Modifier les paramètres de la base de données - + obsolete obsolete @@ -8168,7 +8189,7 @@ exemple de ville Lecture de la configuration - + obsolete obsolete @@ -8178,7 +8199,7 @@ exemple de ville Modifier la configuration - + obsolete obsolete @@ -8188,7 +8209,7 @@ exemple de ville Informations sur le serveur - + obsolete obsolete @@ -8198,7 +8219,7 @@ exemple de ville Utiliser les outils de débogage - + obsolete obsolete @@ -8208,7 +8229,7 @@ exemple de ville Afficher les logs - + obsolete obsolete @@ -8218,7 +8239,7 @@ exemple de ville Supprimer les logs - + obsolete obsolete @@ -8228,7 +8249,7 @@ exemple de ville Modifier les informations - + obsolete obsolete @@ -8238,7 +8259,7 @@ exemple de ville Modifier le nom d'utilisateur - + obsolete obsolete @@ -8248,7 +8269,7 @@ exemple de ville Voir les autorisations - + obsolete obsolete @@ -8258,7 +8279,7 @@ exemple de ville Afficher ses propres logs - + obsolete obsolete @@ -8268,7 +8289,7 @@ exemple de ville Créer des étiquettes - + obsolete obsolete @@ -8278,7 +8299,7 @@ exemple de ville Modifier les options - + obsolete obsolete @@ -8288,7 +8309,7 @@ exemple de ville Supprimer les profils - + obsolete obsolete @@ -8298,7 +8319,7 @@ exemple de ville Modifier les profils - + obsolete obsolete @@ -8308,7 +8329,7 @@ exemple de ville Outils - + obsolete obsolete @@ -8318,7 +8339,7 @@ exemple de ville Groupes - + obsolete obsolete @@ -8328,7 +8349,7 @@ exemple de ville Utilisateurs - + obsolete obsolete @@ -8338,7 +8359,7 @@ exemple de ville Base de données - + obsolete obsolete @@ -8348,7 +8369,7 @@ exemple de ville Configuration - + obsolete obsolete @@ -8358,7 +8379,7 @@ exemple de ville Système - + obsolete obsolete @@ -8368,7 +8389,7 @@ exemple de ville Propre utilisateur - + obsolete obsolete @@ -8378,7 +8399,7 @@ exemple de ville Étiquettes - + obsolete obsolete @@ -8388,7 +8409,7 @@ exemple de ville Catégorie - + obsolete obsolete @@ -8398,7 +8419,7 @@ exemple de ville Quantité minimum - + obsolete obsolete @@ -8408,7 +8429,7 @@ exemple de ville Empreinte - + obsolete obsolete @@ -8418,7 +8439,7 @@ exemple de ville MPN - + obsolete obsolete @@ -8428,7 +8449,7 @@ exemple de ville État de la fabrication - + obsolete obsolete @@ -8438,7 +8459,7 @@ exemple de ville Tags - + obsolete obsolete @@ -8448,7 +8469,7 @@ exemple de ville Unité - + obsolete obsolete @@ -8458,7 +8479,7 @@ exemple de ville Poids - + obsolete obsolete @@ -8468,7 +8489,7 @@ exemple de ville Lots de composants - + obsolete obsolete @@ -8478,7 +8499,7 @@ exemple de ville Afficher le dernier utilisateur ayant apporté des modifications - + obsolete obsolete @@ -8488,7 +8509,7 @@ exemple de ville Devises - + obsolete obsolete @@ -8498,7 +8519,13 @@ exemple de ville Unités de mesure - + + + perm.part_custom_states + État personnalisé du composant + + + obsolete obsolete @@ -8508,7 +8535,7 @@ exemple de ville Ancien mot de passe - + obsolete obsolete @@ -8518,7 +8545,7 @@ exemple de ville Réinitialiser le mot de passe - + obsolete obsolete @@ -8528,23 +8555,17 @@ exemple de ville Clé de sécurité (U2F) - + obsolete obsolete google - Google + google - - - tfa.provider.webauthn_two_factor_provider - Clé de sécurité à deux facteurs - - - + obsolete obsolete @@ -8554,7 +8575,17 @@ exemple de ville Application d'authentification - + + + obsolete + obsolete + + + Login successful + Connexion réussie + + + obsolete obsolete @@ -8564,7 +8595,7 @@ exemple de ville Exception - + obsolete obsolete @@ -8574,7 +8605,7 @@ exemple de ville Connexion utilisateur - + obsolete obsolete @@ -8584,7 +8615,7 @@ exemple de ville Déconnexion de l’utilisateur - + obsolete obsolete @@ -8594,7 +8625,7 @@ exemple de ville Inconnu - + obsolete obsolete @@ -8604,7 +8635,7 @@ exemple de ville Élément créé - + obsolete obsolete @@ -8614,7 +8645,7 @@ exemple de ville Élément modifié - + obsolete obsolete @@ -8624,7 +8655,7 @@ exemple de ville Élément supprimé - + obsolete obsolete @@ -8634,7 +8665,7 @@ exemple de ville Base de données mise à jour - + obsolete @@ -8643,7 +8674,7 @@ exemple de ville Restaurer les éléments - + obsolete @@ -8652,7 +8683,7 @@ exemple de ville Afficher l'historique - + obsolete @@ -8661,7 +8692,7 @@ exemple de ville Afficher l'activité récente - + obsolete @@ -8670,7 +8701,7 @@ exemple de ville Afficher les anciennes versions des éléments (Time travel) - + obsolete @@ -8679,7 +8710,16 @@ exemple de ville Clé de sécurité ajoutée avec succès. - + + + obsolete + + + Username + Nom d'utilisateur + + + obsolete @@ -8688,7 +8728,7 @@ exemple de ville Application d'authentification désactivée - + obsolete @@ -8697,7 +8737,7 @@ exemple de ville Clé de sécurité enlevée - + obsolete @@ -8706,7 +8746,7 @@ exemple de ville Clé de sécurité ajoutée - + obsolete @@ -8715,7 +8755,7 @@ exemple de ville Clés de sauvegarde régénérées - + obsolete @@ -8724,7 +8764,7 @@ exemple de ville Application Authenticator activée - + obsolete @@ -8733,7 +8773,7 @@ exemple de ville Mot de passe modifié - + obsolete @@ -8742,7 +8782,7 @@ exemple de ville Appareils de confiance réinitialisés - + obsolete @@ -8751,7 +8791,7 @@ exemple de ville Élément de collecte supprimé - + obsolete @@ -8760,7 +8800,7 @@ exemple de ville Réinitialisation du mot de passe - + obsolete @@ -8769,7 +8809,7 @@ exemple de ville Réinitialisation à deux facteurs par l'administrateur - + obsolete @@ -8778,7 +8818,7 @@ exemple de ville Tentative d'accès non autorisé - + obsolete @@ -8787,7 +8827,7 @@ exemple de ville Succès - + obsolete @@ -8796,7 +8836,7 @@ exemple de ville 2D - + obsolete @@ -8805,7 +8845,7 @@ exemple de ville 1D - + obsolete @@ -8814,7 +8854,7 @@ exemple de ville Caractéristiques - + obsolete @@ -8823,7 +8863,7 @@ exemple de ville Voir les pièces jointes privées - + obsolete @@ -8832,7 +8872,7 @@ exemple de ville Lecteur d'étiquettes - + obsolete @@ -8841,7 +8881,7 @@ exemple de ville Lire les profils - + obsolete @@ -8850,7 +8890,7 @@ exemple de ville Créer des profils - + obsolete @@ -8859,5394 +8899,334 @@ exemple de ville Utiliser le mode twig - + label_profile.showInDropdown Afficher en sélection rapide - + group.edit.enforce_2fa Imposer l'authentification à deux facteurs (2FA) - + group.edit.enforce_2fa.help Si cette option est activée, chaque membre direct de ce groupe doit configurer au moins un deuxième facteur d'authentification. Recommandé pour les groupes administratifs ayant beaucoup de permissions. - + selectpicker.empty Rien n'est sélectionné - + selectpicker.nothing_selected Rien n'est sélectionné - + entity.delete.must_not_contain_parts - L'élément "%PATH%" contient encore des composants ! Vous devez déplacer les composants pour pouvoir supprimer cet élément. + L'élement contient encore des parties ! Vous devez déplacer les parties pour pouvoir supprimer cet élément. - + entity.delete.must_not_contain_attachments Le type de pièce jointe contient toujours des pièces jointes. Changez leur type, pour pouvoir supprimer ce type de pièce jointe. - + entity.delete.must_not_contain_prices La devise contient encore des prix. Vous devez changer leur devise pour pouvoir supprimer cet élément. - + entity.delete.must_not_contain_users - Des utilisateurs utilisent toujours ce groupe ! Changez-les de groupe pour pouvoir supprimer ce groupe. + Des utilisateurs utilisent toujours ce groupe ! Changez les de groupe pour pouvoir supprimer ce groupe. - + part.table.edit Modifier - + part.table.edit.title Modifier composant - - - part_list.action.scrollable_hint - Faire défiler pour voir toutes les actions - - - + part_list.action.action.title Sélectionnez une action - + part_list.action.action.group.favorite Statut favori - + part_list.action.action.favorite Favorable - + part_list.action.action.unfavorite Défavorable - + part_list.action.action.group.change_field Modifier le champ - + part_list.action.action.change_category Modifier la catégorie - + part_list.action.action.change_footprint Modifier l'empreinte - + part_list.action.action.change_manufacturer Modifier le fabricant - + part_list.action.action.change_unit Modifier l'unité - + part_list.action.action.delete Supprimer - + part_list.action.submit Soumettre - + part_list.action.part_count %count% composants sélectionnés - + company.edit.quick.website Ouvrir le site web - + company.edit.quick.email Envoyer un e-mail - + company.edit.quick.phone Téléphoner - + company.edit.quick.fax Envoyer une télécopie - + company.fax_number.placeholder ex. +33 12 34 56 78 90 - + part.edit.save_and_clone Sauvegarder et dupliquer - + validator.file_ext_not_allowed L'extension de fichier n'est pas autorisée pour ce type de pièce jointe. - + tools.reel_calc.title Calculateur de bobines CMS - + tools.reel_calc.inner_dia Diamètre intérieur - + tools.reel_calc.outer_dia Diamètre extérieur - + tools.reel_calc.tape_thick Épaisseur du ruban - + tools.reel_calc.part_distance Distance entre les composants - + tools.reel_calc.update Actualiser - + tools.reel_calc.parts_per_meter Composants par mètre - + tools.reel_calc.result_length Longueur de la bande - + tools.reel_calc.result_amount - Nombre approximatif de composants + Nbre approximatif de composants - + tools.reel_calc.outer_greater_inner_error Erreur : Le diamètre extérieur doit être supérieur au diamètre intérieur ! - + tools.reel_calc.missing_values.error Veuillez remplir toutes les valeurs ! - + tools.reel_calc.load_preset Charger la présélection - + tools.reel_calc.explanation Ce calculateur vous donne une estimation du nombre de pièces qui restent sur une bobine de CMS. Mesurez les dimensions notées sur la bobine (ou utilisez certains des préréglages) et cliquez sur "Actualiser" pour obtenir un résultat. - + perm.tools.reel_calculator Calculateur de bobines CMS - + tree.tools.tools.reel_calculator Calculateur de bobines CMS - - - user.pw_change_needed.flash - Votre mot de passe doit être changé. Veuillez définir un nouveau mot de passe. - - - - - tree.root_node.text - Texte du nœud racine - - - - - part_list.action.select_null - Sélection vide - - - - - part_list.action.delete-title - Voulez-vous réellement supprimer ce composant ? - - - - - part_list.action.delete-message - Ces éléments et toutes les informations associées (comme les pièces jointes, les informations sur les prix, etc.) seront supprimés. Cette opération ne peut pas être annulée ! - - - - - part.table.actions.success - Action terminée avec succès - - - - - attachment.edit.delete.confirm - Voulez-vous réellement supprimer cette pièce jointe ? - - - - - filter.text_constraint.value.operator.EQ - Est - - - - - filter.text_constraint.value.operator.NEQ - N'est pas - - - - - filter.text_constraint.value.operator.STARTS - Commence par - - - - - filter.text_constraint.value.operator.CONTAINS - Contient - - - - - filter.text_constraint.value.operator.ENDS - Termine avec - - - - - filter.text_constraint.value.operator.LIKE - Comme modèle - - - - - filter.text_constraint.value.operator.REGEX - Expression régulière - - - - - filter.number_constraint.value.operator.BETWEEN - Entre - - - - - filter.number_constraint.AND - et - - - - - filter.entity_constraint.operator.EQ - Est (exclu répertoire enfant) - - - - - filter.entity_constraint.operator.NEQ - N'est pas (exclu répertoire enfant) - - - - - filter.entity_constraint.operator.INCLUDING_CHILDREN - Est (inclus répertoire enfant) - - - - - filter.entity_constraint.operator.EXCLUDING_CHILDREN - N'est pas (exclu répertoire enfant) - - - - - part.filter.dbId - Identifiant de la db(ID) - - - - - filter.tags_constraint.operator.ANY - N'importe laquelle des étiquettes - - - - - filter.tags_constraint.operator.ALL - TOUS les mots-clés - - - - - filter.tags_constraint.operator.NONE - Aucune des étiquettes - - - - - part.filter.lot_count - Nombre de lots - - - - - part.filter.attachments_count - Nombre de pièces jointes - - - - - part.filter.orderdetails_count - Nombre de détails de la commande - - - - - part.filter.lotExpirationDate - Date d'expiration du lot. - - - - - part.filter.lotNeedsRefill - Tous les lots doivent être rechargés - - - - - part.filter.lotUnknwonAmount - Tout lot a un montant inconnu - - - - - part.filter.attachmentName - Nom de la pièce jointe - - - - - filter.bulk_import_job.label - Tâche d'import de masse - - - - - filter.bulk_import_job.job_status - Status de la tâche - - - - - filter.bulk_import_job.part_status_in_job - Status du Composant dans la tâche - - - - - filter.bulk_import_job.status.pending - En attente - - - - - filter.bulk_import_job.status.in_progress - En cours - - - - - filter.bulk_import_job.status.completed - Terminé - - - - - filter.bulk_import_job.status.stopped - Stoppé - - - - - filter.bulk_import_job.status.failed - En échec - - - - - filter.bulk_import_job.part_status.pending - En attente - - - - - filter.bulk_import_job.part_status.completed - Terminé - - - - - filter.bulk_import_job.part_status.skipped - Zappé - - - - - filter.choice_constraint.operator.ANY - N'importe lequel des - - - - - filter.choice_constraint.operator.NONE - Aucun - - - - - part.filter.amount_sum - Montant total - - - - - filter.submit - Mise à jour - - - - - filter.discard - Effacer le filtre - - - - - filter.clear_filters - Effacer tous les filtres - - - - - filter.title - Filtre - - - - - filter.parameter_value_constraint.operator.= - Opérateur de recherche = - - - - - filter.parameter_value_constraint.operator.!= - Opérateur de recherche != - - - - - filter.parameter_value_constraint.operator.< - Opérateur de recherche < - - - - - filter.parameter_value_constraint.operator.> - Opérateur de recherche > - - - - - filter.parameter_value_constraint.operator.<= - Opérateur de recherche <= - - - - - filter.parameter_value_constraint.operator.>= - Valeur typique - - - - - filter.parameter_value_constraint.operator.BETWEEN - Value typique entre - - - - - filter.parameter_value_constraint.operator.IN_RANGE - Dans la plage de valeurs - - - - - filter.parameter_value_constraint.operator.NOT_IN_RANGE - Pas dans la plage de valeurs - - - - - filter.parameter_value_constraint.operator.GREATER_THAN_RANGE - Plus grand que la plage de valeurs - - - - - filter.parameter_value_constraint.operator.GREATER_EQUAL_RANGE - Plus grand ou égal à la plage de valeurs - - - - - filter.parameter_value_constraint.operator.LESS_THAN_RANGE - Plus petit que la plage de valeurs - - - - - filter.parameter_value_constraint.operator.LESS_EQUAL_RANGE - Plus petit ou égal à la plage de valeurs - - - - - filter.parameter_value_constraint.operator.RANGE_IN_RANGE - La plage se situe dans la page de valeurs - - - - - filter.parameter_value_constraint.operator.RANGE_INTERSECT_RANGE - La plage intersecte la plage de valeurs - - - - - filter.text_constraint.value - Aucune valeur entrée - - - - - filter.number_constraint.value1 - Aucune valeur entrée - - - - - filter.number_constraint.value2 - Valeur maximale - - - - - filter.datetime_constraint.value1 - Pas de date de définie - - - - - filter.datetime_constraint.value2 - Date trop éloignée - - - - - filter.constraint.add - Ajouter un filtre - - - - - part.filter.parameters_count - Nombre de paramètres - - - - - part.filter.lotDescription - Description du lot - - - - - parts_list.search.searching_for - Recherche dans la liste des pièces - - - - - parts_list.search_options.caption - Activation des options de recherches - - - - - attachment.table.element_type - Type d'élément attaché - - - - - log.level.debug - Débogage - - - - - log.level.info - Informations sur le niveau - - - - - log.level.notice - Notification - - - - - log.level.warning - Avertissement - - - - - log.level.error - Erreur - - - - - log.level.critical - Niveau critique - - - - - log.level.alert - Alerte de niveau - - - - - log.level.emergency - Niveau d'urgence - - - - - log.type.security - Type de sécurité - - - - - log.type.instock_changed - [LEGACY] Stock disponible modifié - - - - - log.target_id - ID de l'élément ciblé - - - - - entity.info.parts_count_recursive - Nombre de pièces avec cet élément ou ses sous-éléments - - - - - tools.server_infos.title - Infos du serveur - - - - - permission.preset.read_only - Lecture seule - - - - - permission.preset.read_only.desc - Autoriser les opérations de lecture seule uniquement - - - - - permission.preset.all_inherit - Tout Hérité - - - - - permission.preset.all_inherit.desc - Mettre toutes les permissions en "Hérité" - - - - - permission.preset.all_forbid - Tout Interdit - - - - - permission.preset.all_forbid.desc - Mettre toutes les permissions en "Interdit" - - - - - permission.preset.all_allow - Tout Autoriser - - - - - permission.preset.all_allow.desc - Mettre toutes les permissions en "Autorisé" - - - - - perm.server_infos - Infos Serveur - - - - - permission.preset.editor - Éditeur - - - - - permission.preset.editor.desc - Autoriser la modification de pièces et de structures de données - - - - - permission.preset.admin - Admin - - - - - permission.preset.admin.desc - Autoriser les actions administrateur - - - - - permission.preset.button - Appliquer le preset - - - - - perm.attachments.show_private - Montrer les pièces jointes privées - - - - - perm.attachments.list_attachments - Montrer la liste de toutes les pièces jointes - - - - - user.edit.permission_success - Preset de Permissions correctement appliquées. Vérifiez si les nouvelles permissions vous conviennent - - - - - perm.group.data - Données - - - - - part_list.action.action.group.needs_review - Nécessite un examen - - - - - part_list.action.action.set_needs_review - Appliquer le status "Nécessite un examen" - - - - - part_list.action.action.unset_needs_review - Retirer le status "Nécessite un examen" - - - - - part.edit.ipn - Numéro de Pièce Interne (IPN) - - - - - part.ipn.not_defined - Non défini - - - - - part.table.ipn - IPN - - - + currency.edit.update_rate Taux de rafraîchissement - + currency.edit.exchange_rate_update.unsupported_currency Devise non prise en charge - + currency.edit.exchange_rate_update.generic_error Erreur générique - + currency.edit.exchange_rate_updated.success Succès - - - project.bom.quantity - Quantité BOM - - - - - project.bom.mountnames - Nom du montage - - - - - project.bom.name - Nom - - - - - project.bom.comment - Notes - - - - - project.bom.part - Nom du composant - - - - - project.bom.add_entry - Ajouté un élément - - - - - part_list.action.group.projects - Projets - - - - - part_list.action.projects.add_to_project - Ajouter un élément au projet - - - - - project.bom.delete.confirm - Voulez-vous vraiment supprimer cet élément de la BOM ? - - - - - project.add_parts_to_project - Ajouter cet élément à la BOM du projet - - - - - part.info.add_part_to_project - Ajouter cet élément au projet - - - - - project_bom_entry.label - BOM - - - - - project.edit.status - Status du projet - - - - - project.status.draft - Brouillon - - - - - project.status.planning - Planning - - - - - project.status.in_production - En production - - - - - project.status.finished - Terminé - - - - - project.status.archived - Archivé - - - - - part.new_build_part.error.build_part_already_exists - Le projet est déjà associé à un composant de sortie - - - - - project.edit.associated_build_part - Composant de sortie associé - - - - - project.edit.associated_build_part.add - Ajouter un composant de sortie - - - - - project.edit.associated_build.hint - Voici le composant de sortie associé à ce projet, qui est stocké quelque part - - - - - part.info.projectBuildPart.hint - Ce composant est fabriqué par ce projet - - - - - part.is_build_part - Fait partie du projet - - - - - project.info.title - Informations Projet - - - - - project.info.bom_entries_count - Entrées de la BOM - - - - - project.info.sub_projects_count - Sous Projets - - - - - project.info.bom_add_parts - Ajouter à la BOM - - - - - project.info.info.label - Info - - - - - project.info.sub_projects.label - Sous Projets - - - - - project.bom.price - Prix - - - - - part.info.withdraw_modal.title.withdraw - Enlever un élément du lot - - - - - part.info.withdraw_modal.title.add - Ajouter un élément au lot - - - - - part.info.withdraw_modal.title.move - Bouger un élément vers un autre lot - - - - - part.info.withdraw_modal.amount - Quantité - - - - - part.info.withdraw_modal.move_to - Bouger vers - - - - - part.info.withdraw_modal.comment - Commentaire - - - - - part.info.withdraw_modal.comment.hint - Vous pouvez laisser un commentaire expliquant l'opération(ex. Pourquoi vous avez besoin de ce composant). Cette info sera sauvée dans les logs. - - - - - modal.close - Fermer - - - - - modal.submit - Soumettre - - - - - part.withdraw.success - Composant ajouté/bougé/supprimé avec succès. - - - - - perm.parts_stock - Stock de composants - - - - - perm.parts_stock.withdraw - Enlever un composant du stock - - - - - perm.parts_stock.add - Ajouter un composant du stock - - - - - perm.parts_stock.move - Bouger un composant du stock - - - - - user.permissions_schema_updated - Les permissions de votre utilisateur mis à jour à la dernière version. - - - - - log.type.part_stock_changed - Inventaire du composant changé - - - - - log.part_stock_changed.withdraw - Stock supprimé - - - - - log.part_stock_changed.add - Stock ajouté - - - - - log.part_stock_changed.move - Stock bougé - - - - - log.part_stock_changed.comment - Commentaire - - - - - log.part_stock_changed.change - Changer - - - - - log.part_stock_changed.move_target - Déplacer la cible - - - - - tools.builtin_footprints_viewer.title - Image de l'empreinte - - - - - tools.builtin_footprints_viewer.hint - Cette galerie liste toutes les images d'empreintes intégrées disponibles. Si vous voulez les utiliser dans une pièce-jointe, tapez dans le nom (ou un mot-clé) dans le champ du chemin de la pièce-jointe et sélectionnez l'image dans la sélection déroulante. - - - - - tools.ic_logos.title - Logos CI - - - - - part_list.action.group.labels - Étiquettes - - - - - part_list.action.projects.generate_label - Générer des étiquettes (pour les composants) - - - - - part_list.action.projects.generate_label_lot - Générer des étiquettes (pour un lot de composants) - - - - - part_list.action.generate_label.empty - Étiquette vide - - - - - project.info.builds.label - Fabriquer - - - - - project.builds.build_not_possible - Fabrication impossible : Pièces non stockées - - - - - project.builds.following_bom_entries_miss_instock - Les composants suivant n'ont pas assez de stock pour fabriquer au moins une fois ce projet : - - - - - project.builds.stocked - stockées - - - - - project.builds.needed - Besoins - - - - - project.builds.build_possible - Fabrication possible - - - - - project.builds.number_of_builds_possible - Vous avez assez de stock pour fabriquer <b>%max_builds%</b> éléments de ce projet. - - - - - project.builds.check_project_status - Le status du projet en cours est <b>"%project_status%"</b>. Vous devriez vérifier que vous voulez vraiment concevoir le projet avec ce status ! - - - - - project.builds.following_bom_entries_miss_instock_n - Vous n'avez pas assez de composants en stock pour fabriquer ce projet %number_of_builds% fois. Il manque cet élément en stock : - - - - - project.build.flash.invalid_input - Impossible de fabriquer ce projet. Vérifier les entrées ! - - - - - project.build.required_qty - Besoin d'une quantité - - - - - project.build.btn_build - Fabriquer - - - - - project.build.help - Choisir de quels inventaires les composants doivent être soustraits(et leur quantité). Cocher la case pour chaque ligne, ou cliquer sur la case en haut pour toutes les cocher en même temps. - - - - - project.build.buildsPartLot.new_lot - Créer un nouveau lot - - - - - project.build.add_builds_to_builds_part - Ajouter des conceptions aux composants du projet - - - - - project.build.builds_part_lot - Stock à utiliser - - - - - project.builds.number_of_builds - Nombre à fabriquer - - - - - project.builds.no_stocked_builds - Nombre de conceptions en stock - - - - - user.change_avatar.label - Changer la photo de profil - - - - - user_settings.change_avatar.label - Changer la photo de profil - - - - - user_settings.remove_avatar.label - Supprimer la photo de profil - - - - - part.edit.name.category_hint - Astuce de la catégorie - - - - - category.edit.partname_regex.placeholder - ex. "Condensateur \d+ nF/i" - - - - - category.edit.partname_regex.help - Une expression régulière compatible PCRE, qu'un nom de composant doit correspondre. - - - - - entity.select.add_hint - Utilisez -> pour créer une structure imbriquée, ex "Nœud 1->Nœud 1.1" - - - - - entity.select.group.new_not_added_to_DB - Nouveau (pas encore ajouté à la BDD) - - - - - part.edit.save_and_new - Sauver et créer un nouveau composant vide - - - - - homepage.first_steps.title - Premières étapes - - - - - homepage.first_steps.introduction - Votre base de donnée est toujours vide. Vous voulez peut-être lire la <a href="%url%">documentation</a> ou commencer à créer les structures de données suivantes : - - - - - homepage.first_steps.create_part - Ou vous pouvez directement <a href="%url%">créer un nouveau composant</a>. - - - - - homepage.first_steps.hide_hint - Cette boite se cachera dès que vous aurez créé votre premier composant. - - - + homepage.forum.text - Si vous avez des questions à propos de Part-DB, rendez-vous sur <a href="%href%" class="link-external" target="_blank">Github</a> + Si vous avez des questions à propos de Part-DB , rendez vous sur <a href="%href%" class="link-external" target="_blank">Github</a> - + - log.element_edited.changed_fields.category - Catégorie + part_custom_state.new + Nouveau statut personnalisé du composant - + - log.element_edited.changed_fields.footprint - Empreinte + part_custom_state.edit + Modifier le statut personnalisé du composant - + - log.element_edited.changed_fields.manufacturer - Fabricant + log.element_edited.changed_fields.partCustomState + État personnalisé de la pièce - + - log.element_edited.changed_fields.value_typical - valeur typique + category.edit.part_ipn_prefix.placeholder + par ex. "B12A" - + - log.element_edited.changed_fields.pw_reset_expires - Réinitialisation du mot de passe - - - - - log.element_edited.changed_fields.comment - Notes - - - - - log.element_edited.changed_fields.supplierpartnr - Numéro de composant fournisseur - - - - - log.element_edited.changed_fields.supplier_product_url - Lien vers l'offre - - - - - log.element_edited.changed_fields.price - Prix - - - - - log.element_edited.changed_fields.min_discount_quantity - Quantité minimale - - - - - log.element_edited.changed_fields.original_filename - Nom du fichier original - - - - - log.element_edited.changed_fields.path - Lien du fichier - - - - - log.element_edited.changed_fields.description - Description - - - - - log.element_edited.changed_fields.manufacturing_status - État de production - - - - - log.element_edited.changed_fields.options.barcode_type - Type de code barre - - - - - log.element_edited.changed_fields.status - État - - - - - log.element_edited.changed_fields.quantity - BOM Qty. - - - - - log.element_edited.changed_fields.mountnames - Méthode de montage - - - - - log.element_edited.changed_fields.name - Nom - - - - - log.element_edited.changed_fields.part - Composant - - - - - log.element_edited.changed_fields.price_currency - Devise du prix - - - - - log.element_edited.changed_fields.partname_hint - Astuce de nom de composant - - - - - log.element_edited.changed_fields.partname_regex - Filtre de nom - - - - - log.element_edited.changed_fields.disable_footprints - Désactiver les empreintes - - - - - log.element_edited.changed_fields.disable_manufacturers - Désactiver les fabricants - - - - - log.element_edited.changed_fields.disable_autodatasheets - Désactiver les liens automatiques de datasheet - - - - - log.element_edited.changed_fields.disable_properties - Propriétés désactivées - - - - - log.element_edited.changed_fields.default_description - Description par défaut - - - - - log.element_edited.changed_fields.default_comment - Notes par défaut - - - - - log.element_edited.changed_fields.filetype_filter - Extensions de fichier autorisé - - - - - log.element_edited.changed_fields.not_selectable - Non sélectionné - - - - - log.element_edited.changed_fields.parent - Élément parent - - - - - log.element_edited.changed_fields.shipping_costs - Frais d'expédition - - - - - log.element_edited.changed_fields.default_currency - Devise par défaut - - - - - log.element_edited.changed_fields.address - Adresse - - - - - log.element_edited.changed_fields.phone_number - Numéro de téléphone - - - - - log.element_edited.changed_fields.fax_number - Numéro de Fax - - - - - log.element_edited.changed_fields.email_address - Email - - - - - log.element_edited.changed_fields.website - Site Web - - - - - log.element_edited.changed_fields.auto_product_url - Lien du produit - - - - - log.element_edited.changed_fields.is_full - Espace de stockage plein - - - - - log.element_edited.changed_fields.limit_to_existing_parts - Limiter aux composants existants - - - - - log.element_edited.changed_fields.only_single_part - Seulement à l'unité - - - - - log.element_edited.changed_fields.storage_type - Type de stockage - - - - - log.element_edited.changed_fields.footprint_3d - Modèle 3D - - - - - log.element_edited.changed_fields.master_picture_attachment - Prévisualisation - - - - - log.element_edited.changed_fields.exchange_rate - Taux de change - - - - - log.element_edited.changed_fields.iso_code - Taux de change - - - - - log.element_edited.changed_fields.unit - Symbole unitaire - - - - - log.element_edited.changed_fields.is_integer - Est un entier - - - - - log.element_edited.changed_fields.use_si_prefix - Utiliser les préfixes SI - - - - - log.element_edited.changed_fields.options.width - Largeur - - - - - log.element_edited.changed_fields.options.height - Hauteur - - - - - log.element_edited.changed_fields.options.supported_element - Type d'élément - - - - - log.element_edited.changed_fields.options.additional_css - Style (CSS) additionnel - - - - - log.element_edited.changed_fields.options.lines - Contenu - - - - - log.element_edited.changed_fields.permissions.data - Permissions - - - - - log.element_edited.changed_fields.disabled - Désactivé - - - - - log.element_edited.changed_fields.theme - Thème - - - - - log.element_edited.changed_fields.timezone - Fuseau horaire - - - - - log.element_edited.changed_fields.language - Langue - - - - - log.element_edited.changed_fields.email - Email - - - - - log.element_edited.changed_fields.department - Département - - - - - log.element_edited.changed_fields.last_name - Nom de famille - - - - - log.element_edited.changed_fields.first_name - Prénom - - - - - log.element_edited.changed_fields.group - Groupe - - - - - log.element_edited.changed_fields.currency - Devise préférée - - - - - log.element_edited.changed_fields.enforce2FA - Forcer la double authentification - - - - - log.element_edited.changed_fields.symbol - Symbole - - - - - log.element_edited.changed_fields.value_min - Valeur min. - - - - - log.element_edited.changed_fields.value_max - Valeur max. - - - - - log.element_edited.changed_fields.value_text - Valeur de texte - - - - - log.element_edited.changed_fields.show_in_table - Montrer dans le tableau - - - - - log.element_edited.changed_fields.attachment_type - Montrer dans le tableau - - - - - log.element_edited.changed_fields.needs_review - Besoin d'être vérifié - - - - - log.element_edited.changed_fields.tags - Tags - - - - - log.element_edited.changed_fields.mass - Poids - - - - - log.element_edited.changed_fields.ipn - Numéro de série - - - - - log.element_edited.changed_fields.favorite - Favoris - - - - - log.element_edited.changed_fields.minamount - Stock minimum - - - - - log.element_edited.changed_fields.manufacturer_product_url - Lien vers le produit - - - - - log.element_edited.changed_fields.manufacturer_product_number - MPN - - - - - log.element_edited.changed_fields.partUnit - Unité de mesure - - - - - log.element_edited.changed_fields.expiration_date - Date d'expiration - - - - - log.element_edited.changed_fields.amount - Quantité - - - - - log.element_edited.changed_fields.storage_location - Lieu de stockage - - - - - attachment.max_file_size - Taille maximum du fichier - - - - - user.saml_user - Utilisateur SSO / SAML - - - - - user.saml_user.pw_change_hint - Votre utilisateur utilise le single sign-on (SSO). Vous ne pouvez changer le mot de passe ou paramètres 2FA ici. Configurez-les chez votre fournisseur de SSO a la place. - - - - - login.sso_saml_login - Single Sign-On Login (SSO) - - - - - login.local_login_hint - Le formulaire suivant est seulement pour se connecter avec un utilisateur local. Si vous voulez vous connecter via SSO pressez le bouton ci-dessus. - - - - - part_list.action.action.export - Exporter les composants - - - - - part_list.action.export_json - Exporter en JSON - - - - - part_list.action.export_csv - Exporter en CSV - - - - - part_list.action.export_yaml - Exporter en YAML - - - - - part_list.action.export_xml - Export en XML - - - - - part_list.action.export_xlsx - Export vers Excel - - - - - parts.import.title - Importer des composants - - - - - parts.import.errors.title - Violations d'import - - - - - parts.import.flash.error - Erreurs pendant l'import. C'est probablement causé par des données invalides. - - - - - parts.import.format.auto - Automatique (basé sur l'extension du fichier) - - - - - parts.import.flash.error.unknown_format - Impossible de déterminer le type du fichier fourni ! - - - - - parts.import.flash.error.invalid_file - Fichier invalide. Veuillez vérifier que vous avez sélectionné le bon type ! - - - - - parts.import.part_category.label - Surcharge de la catégorie - - - - - parts.import.part_category.help - Si vous sélectionnez une valeur ici, tous les composants importés seront assignés à cette catégorie. Quoi que vous aillez dans les données. - - - - - import.create_unknown_datastructures - Créer une structure de données inconnue - - - - - import.create_unknown_datastructures.help - Si séléctionné, les structures de données (tel les catégories, empreintes, etc.) qui n'existent pas encore dans la base de donnée, seront automatiquement crées. Si ce n'est pas selectionné, seulement les structures de données existantes seront utilisés, et si aucune concordance n'est trouvé, le composant n'aura rien d'assigné - - - - - import.path_delimiter - Délimiteur de chemin - - - - - import.path_delimiter.help - Le délimiteur est utilisé pour marquer différents niveaux dans les chemins de structure de données tels que les catégories, empreintes, etc. - - - - - parts.import.help_documentation - Voir là <a href="%link%">documentation</a> pour plus d'information sur le format du fichier. - - - - - parts.import.help - Vous pouvez importer des composants depuis des fichiers existants avec cet outil. Les composants seront directement écrits en base de donnée, veuillez vérifier le contenu de votre fichier est correct avant de l'envoyer ici. - - - - - parts.import.flash.success - Import de composants avec succès ! - - - - - parts.import.errors.imported_entities - Composants importés - - - - - perm.import - Importer des données - - - - - parts.import.part_needs_review.label - Marquer tous les composants importés comme "Besoin d'être vérifié" - - - - - parts.import.part_needs_review.help - Si cette option est sélectionnée, alors tous les composants seront importés comme "Besoin d'être vérifié", peu importe ce qui est dans les paramètres. - - - - - project.bom_import.flash.success - %count% entrées de la BOM importées avec succès. - - - - - project.bom_import.type - Type - - - - - project.bom_import.type.kicad_pcbnew - KiCAD Pcbnew BOM (fichier CSV) - - - - - project.bom_import.clear_existing_bom - Supprimée les entrées de la BOM avant l'import - - - - - project.bom_import.clear_existing_bom.help - En sélectionnant cette option, toutes les entrées précédentes vont être supprimées du projet et récrite par l'importation de la BOM ! - - - - - project.bom_import.flash.invalid_file - Importation impossible. Vérifier que vous avez sélectionné le bon type. Erreur : %message% - - - - - project.bom_import.flash.invalid_entries - Problème lors de la validation ! Vérifier les données ! - - - - - project.import_bom - Importé une BOM pour le projet - - - - - project.edit.bom.import_bom - Importé une BOM - - - - - measurement_unit.new - Nouvelle unité de mesure - - - - - measurement_unit.edit - Modifier l'unité de mesure - - - - - user.aboutMe.label - À propos de moi - - - - - storelocation.owner.label - Propriétaire - - - - - storelocation.part_owner_must_match.label - Le propriétaire du lot de composants doit correspondre au propriétaire de la localisation de stockage - - - - - part_lot.owner - Propriétaire - - - - - part_lot.owner.help - Seul le propriétaire peut changer les stocks de ce lot. - - - - - log.element_edited.changed_fields.owner - Propriétaire - - - - - log.element_edited.changed_fields.instock_unknown - Quantité inconnue - - - - - log.element_edited.changed_fields.needs_refill - Recharge nécessaire - - - - - part.withdraw.access_denied - Impossible d’exécuter l'action. Vérifier les permissions et le propriétaire du lot. - - - - - part.info.amount.less_than_desired - Moins que voulu - - - - - log.cli_user - Utilisateur CLI - - - - - log.element_edited.changed_fields.part_owner_must_match - Le propriétaire du composant doit être le même que le propriétaire du stock - - - - - part.filter.lessThanDesired - En stock il y en a moins que voulu(qty totale < qty min.) - - - - - part.filter.lotOwner - Propriétaire du lot - - - - - user.show_email_on_profile.label - Montrer son email sur la page public du profil - - - - - log.details.title - Logs - - - - - log.user_login.login_from_ip - Login par adresse IP - - - - - log.user_login.ip_anonymize_hint - Si les derniers chiffres de l'adresse IP sont manquants, alors le mode RGPD est activé, dans lequel l'adresse IP est anonyme. - - - - - log.user_not_allowed.unauthorized_access_attempt_to - Essai d'accès a la page non autorisé - - - - - log.user_not_allowed.hint - La requête a été bloquée. Aucune action requise. - - - - - log.no_comment - Pas de commentaire - - - - - log.element_changed.field - Champ - - - - - log.element_changed.data_before - Donnés avant changements - - - - - error_table.error - Une erreur s'est produite. - - - - - part.table.invalid_regex - Expression régulière invalide (regex) - - - - - log.element_changed.data_after - Données après changement - - - - - log.element_changed.diff - Différence - - - - - log.undo.undo.short - Annuler - - - - - log.undo.revert.short - Rétablir à ce timestamp - - - - - log.view_version - Voir la version - - - - - log.undo.undelete.short - Rétablir - - - - - log.element_edited.changed_fields.id - ID - - - - - log.element_edited.changed_fields.id_owner - Propriétaire - - - - - log.element_edited.changed_fields.parent_id - Parent - - - - - log.details.delete_entry - Supprimer entrée de log - - - - - log.delete.message.title - Voulez-vous vraiment supprimer cette entrée de log ? - - - - - log.delete.message - Si c'est une entrée d'histoire d'élément, ça casse l'historique des éléments ! Ça peut amener à des résultats inattendus en utilisant la fonction de voyage dans le temps. - - - - - log.collection_deleted.on_collection - dans la Collection - - - - - log.element_edited.changed_fields.attachments - Pièces jointes - - - - - tfa_u2f.add_key.registration_error - Une erreur est survenue lors de l'enregistrement de la clé de sécurité. Réessayez ou utilisez une autre clé de sécurité ! - - - - - log.target_type.none - Aucun - - - - - ui.darkmode.light - Léger - - - - - ui.darkmode.dark - Foncé - - - - - ui.darkmode.auto - Automatique (décision basée sur les paramètres système) - - - - - label_generator.no_lines_given - Aucun contenu de texte fournit ! Les étiquettes resteront vides. - - - - - user.password_strength.very_weak - Très faible - - - - - user.password_strength.weak - Faible - - - - - user.password_strength.medium - Moyen - - - - - user.password_strength.strong - Fort - - - - - user.password_strength.very_strong - Très fort - - - - - perm.users.impersonate - Imiter d'autres utilisateurs - - - - - user.impersonated_by.label - Imité par - - - - - user.stop_impersonation - Arrêter d'imiter un autre utilisateur - - - - - user.impersonate.btn - Imiter - - - - - user.impersonate.confirm.title - Voulez-vous vraiment imiter cet utilisateur ? - - - - - user.impersonate.confirm.message - Ça sera enregistré. Vous devez faire ça seulement avec une bonne raison. - - - - - log.type.security.user_impersonated - Utilisateur imité - - - - - info_providers.providers_list.title - Fournisseur d'informations - - - - - info_providers.providers_list.active - Actif - - - - - info_providers.providers_list.disabled - Désactivé - - - - - info_providers.capabilities.basic - Basique - - - - - info_providers.capabilities.footprint - Empreinte - - - - - info_providers.capabilities.picture - Photo - - - - - info_providers.capabilities.datasheet - Datasheets - - - - - info_providers.capabilities.price - Prix - - - - - part.info_provider_reference.badge - Le fournisseur d'informations utilisé pour créer ce composant. - - - - - part.info_provider_reference - Créer par un fournisseur d'informations - - - - - oauth_client.connect.btn - Connexion OAuth - - - - - info_providers.table.provider.label - Fournisseur - - - - - info_providers.search.keyword - Mot-clé - - - - - info_providers.search.submit - Chercher - - - - - info_providers.search.providers.help - Sélectionnez le fournisseur dans lequel chercher. - - - - - info_providers.search.providers - Fournisseurs - - - - - info_providers.search.info_providers_list - Voir tous les fournisseurs d'information disponibles - - - - - info_providers.search.title - Créer des composants depuis un fournisseur d'informations - - - - - oauth_client.flash.connection_successful - Connexion avec succès de l'application via OAuth ! - - - - - perm.part.info_providers - Fournisseurs d'informations - - - - - perm.part.info_providers.create_parts - Créer des composants depuis les fournisseurs d'informations - - - - - entity.edit.alternative_names.label - Noms alternatifs - - - - - entity.edit.alternative_names.help - Les noms alternatifs fournis ici sont utilisés pour trouver cet élément basé sur les résultats des fournisseurs d'informations. - - - - - info_providers.form.help_prefix - Fournisseur - - - - - update_manager.new_version_available.title - Nouvelle version disponible - - - - - update_manager.new_version_available.text - Une nouvelle version de Part-DB est disponible. Découvrez-la ici - - - - - update_manager.new_version_available.only_administrators_can_see - Seul les administrateurs peuvent voir ce message. - - - - - perm.system.show_available_updates - Voir les mises-à-jour de Part-DB disponibles - - - - - user.settings.api_tokens - API tokens - - - - - user.settings.api_tokens.description - En utilisant un token d'API, d'autres applications peuvent accéder à Part-DB avec vos droits utilisateur, pour faire diverses actions en utilisant l'API REST de Part-DB. Si vous supprimez un token d'API ici, l'application qui utilise ce token n'aura plus accès à Part-DB pour vous. - - - - - api_tokens.name - Nom - - - - - api_tokens.access_level - Niveau d'accès - - - - - api_tokens.expiration_date - Date d'expiration - - - - - api_tokens.added_date - Ajouté le - - - - - api_tokens.last_time_used - Dernière fois utilisé - - - - - datetime.never - Jamais - - - - - api_token.valid - Valide - - - - - api_token.expired - Expiré - - - - - user.settings.show_api_documentation - Voir la documentation de l'API - - - - - api_token.create_new - Créer un nouveau token d'API - - - - - api_token.level.read_only - Lecture seule - - - - - api_token.level.edit - Éditer - - - - - api_token.level.admin - Admin - - - - - api_token.level.full - Complet - - - - - api_tokens.access_level.help - Vous pouvez restreindre ce que le token d'API peut accéder. L'accès est toujours limité par les permissions de votre utilisateur. - - - - - api_tokens.expiration_date.help - Après cette date, le token ne sera plus utilisable. Laissez vide si le token ne doit jamais expirer. - - - - - api_tokens.your_token_is - Votre token d'API est - - - - - api_tokens.please_save_it - Veuillez le sauver. Vous ne le reverrez plus jamais ! - - - - - api_tokens.create_new.back_to_user_settings - Retour aux paramètres utilisateur - - - - - project.build.dont_check_quantity - Ne pas vérifier les quantités - - - - - project.build.dont_check_quantity.help - Si cette option est sélectionnée, les quantités utilisées sont utilisé comme fournies, même si plus ou moins de composants sont actuellement requis pour concevoir ce projet. - - - - - part_list.action.invert_selection - Inverser la sélection - - - - - perm.api - API - - - - - perm.api.access_api - Accès API - - - - - perm.api.manage_tokens - Gérer les tokens d'API - - - - - user.settings.api_tokens.delete.title - Voulez-vous vraiment supprimer ce token d'API ? - - - - - user.settings.api_tokens.delete - Supprimer - - - - - user.settings.api_tokens.delete.message - L'application qui utilise ce token d'API n'aura plus accès à Part-DB. Cette action ne peut-être annulée ! - - - - - api_tokens.deleted - Token d'API supprimé avec succès ! - - - - - user.settings.api_tokens.no_api_tokens_yet - Aucun token d'API configurés pour le moment. - - - - - api_token.ends_with - Se termine avec - - - - - entity.select.creating_new_entities_not_allowed - Vous n'êtes pas autorisé à créer de nouvelles entités de ce type ! Veuillez en choisir une existante. - - - - - scan_dialog.mode - Type de code-barre - - - - - scan_dialog.mode.auto - Détection automatique - - - - - scan_dialog.mode.ipn - Code-barre IPN - - - - - scan_dialog.mode.internal - Code-barre Part-DB - - - - - part_association.label - Association de composant - - - - - part.edit.tab.associations - Composants associés - - - - - part_association.edit.other_part - Composant associé - - - - - part_association.edit.type - Type de relation - - - - - part_association.edit.comment - Notes - - - - - part_association.edit.type.help - Vous pouvez sélectionner ici comment le composant choisi est en relation avec ce composant. - - - - - part_association.table.from_this_part - Associations de ce composant vers les autres - - - - - part_association.table.from - Depuis - - - - - part_association.table.type - Relation - - - - - part_association.table.to - Vers - - - - - part_association.type.compatible - Est compatible avec - - - - - part_association.table.to_this_part - Associations de ce composant depuis les autres - - - - - part_association.type.other - Autre (valeur personnalisée) - - - - - part_association.type.supersedes - Remplace - - - - - part_association.edit.other_type - Type personnalisé - - - - - part_association.edit.delete.confirm - Voulez-vous vraiment supprimer cette association ? Ce ne peut-être annulé. - - - - - part_lot.edit.advanced - Dérouler les options avancées - - - - - part_lot.edit.vendor_barcode - Code-barre fournisseur - - - - - part_lot.edit.vendor_barcode.help - Si ce lot a déjà un code-barre (ex. placé par le fournisseur), vous pouvez entrer son contenu ici pour le scanner facilement. - - - - - scan_dialog.mode.vendor - Code-barre fournisseur (configuré dans le lot de composant) - - - - - project.bom.instockAmount - Quantité stockée - - - - - collection_type.new_element.tooltip - Cet élément a été créé récemment et n'a pas encore persisté dans la base de donnée. - - - - - part.merge.title - Fusionner composant - - - - - part.merge.title.into - dans - - - - - part.merge.confirm.title - Voulez-vous vraiment fusionner <b>%other%</b> dans<b>%target%</b> ? - - - - - part.merge.confirm.message - <b>%other%</b> sera supprimé, et le composant sera sauvé avec les informations affichées. - - - - - part.info.merge_modal.title - Fusionner composants - - - - - part.info.merge_modal.other_part - Autre composant - - - - - part.info.merge_modal.other_into_this - Fusionner un autre composant dans celui-là (supprimer l'autre composant, garder celui-là) - - - - - part.info.merge_modal.this_into_other - Fusionner ce composant dans l'autre (supprimer ce composant, garder l'autre) - - - - - part.info.merge_btn - Fusionner composant - - - - - part.update_part_from_info_provider.btn - Mettre-à-jour le composant depuis les fournisseurs d'informations - - - - - info_providers.update_part.title - Mettre-à-jour un composant existant depuis les fournisseurs d'informations - - - - - part.merge.flash.please_review - Donnés pas encore sauvés. Veuillez relire les changements et cliquer sur sauver pour sauvegarder les nouvelles données. - - - - - user.edit.flash.permissions_fixed - Des permissions requises par d'autres permissions étaient manquantes. Ça a été corrigé. Veuillez vérifier que les permissions sont comme vous souhaitez. - - - - - permission.legend.dependency_note - Veuillez noter que certaines permissions d'opérations dépendent entre-elles. Si vous rencontrez une alerte de permission manquante qui a été corrigée et qu'une permission a été faite pour autoriser encore, vous avez a mettre les opérations dépendantes a interdit aussi. Les dépendances peuvent normalement trouver les droits d'une opération. - - - - - log.part_stock_changed.timestamp - Horodatage - - - - - part.info.withdraw_modal.timestamp - Horodatage de l'action - - - - - part.info.withdraw_modal.timestamp.hint - Ce champ vous permet de spécifier la vraie date, quand l'opération de stock à été vraiment effectué, et non pas seulement quand ça a été enregistré. Cette valeur est sauvée dans les champs supplémentaires de l'entrée de log. - - - - - part.info.withdraw_modal.delete_lot_if_empty - Supprimer ce lot s'il devient vide - - - - - info_providers.search.error.client_exception - Une erreur est survenue lors de la communication avec le fournisseur d'informations. Vérifiez la configuration de ce fournisseur et rafraichissez les tokens OAuth si possible. - - - - - eda_info.reference_prefix.placeholder - ex. R - - - - - eda_info.reference_prefix - Préfixe de référence - - - - - eda_info.kicad_section.title - Paramètres spécifiques à KiCAD - - - - - eda_info.value - Valeur - - - - - eda_info.value.placeholder - ex. 100n - - - - - eda_info.exclude_from_bom - Exclure le composant de la BOM - - - - - eda_info.exclude_from_board - Exclure le composant du PCB/Circuit - - - - - eda_info.exclude_from_sim - Exclure le composant de la simulation - - - - - eda_info.kicad_symbol - Symbole schématique KiCAD - - - - - eda_info.kicad_symbol.placeholder - ex. Transistor_BJT:BC547 - - - - - eda_info.kicad_footprint - Empreinte KiCAD - - - - - eda_info.kicad_footprint.placeholder - ex. Package_TO_SOT_THT:TO-92 - - - - - part.edit.tab.eda - Informations EDA - - - - - api.api_endpoints.title - Terminaisons d'API - - - - - api.api_endpoints.partdb - Part-DB API - - - - - api.api_endpoints.kicad_root_url - URL racine de l'API KiCAD - - - - - eda_info.visibility - Forcer la visibilité - - - - - eda_info.visibility.help - Par défaut la visibilité du logiciel EDA est automatiquement déterminé. Avec cette coche vous pouvez forcer le composant à être visible ou invisible. - - - - - part.withdraw.zero_amount - Vous avez essayé de retirer/ajouter une quantité de zéro ! Aucune action n'a été effectuée. - - - - - login.flash.access_denied_please_login - Accès interdit ! Veuillez vous connecter pour continuer. - - - - - attachment.upload_multiple_files - Envoyer des fichiers - - - - - entity.mass_creation_flash - %COUNT% entités crées avec succès. - - - - - info_providers.search.number_of_results - %number% résultats - - - - - info_providers.search.no_results - Aucuns résultats trouvés - - - - - tfa.check.code.confirmation - Code généré - - - - - info_providers.search.show_existing_part - Voir le composant existant - - - - - info_providers.search.edit_existing_part - Éditer le composant existant - - - - - info_providers.search.existing_part_found.short - Composant déjà existant - - - - - info_providers.search.existing_part_found - Ce composant (ou un très similaire) a déjà été trouvé dans la base de donnée. Veuillez vérifier si c'est le même et si vous voulez créer le même ! - - - - - info_providers.search.update_existing_part - Mettre à jour le composant existant depuis un fournisseur d'informations - - - - - part.create_from_info_provider.no_category_yet - La catégorie ne peut pas être déterminée automatiquement par le fournisseur d'informations. Vérifiez les données et sélectionnez la catégorie manuellement. - - - - - part_lot.edit.user_barcode - Code-barre utilisateur - - - - - scan_dialog.mode.user - Code-barre défini par l'utilisateur (configuré comme lot de composants) - - - - - scan_dialog.mode.eigp - Code-barre EIGP 114 (ex. les code datamatrix des commandes DigiKey ou Mouser) - - - - - scan_dialog.info_mode - Mode information (décode le code-barre et affiche son contenu mais ne redirige pas vers le composant) - - - - - label_scanner.decoded_info.title - Information décodée - - - - - label_generator.edit_profiles - Éditer les profiles - - - - - label_generator.profile_name_empty - Le nom de profil ne doit pas être vide ! - - - - - label_generator.save_profile_name - Nom de profil - - - - - label_generator.save_profile - Sauver comme nouveau profil - - - - - label_generator.profile_saved - Profil sauvé ! - - - - - settings.ips.element14 - Element 14 / Farnell - - - - - settings.ips.element14.apiKey - Clé d'API - - - - - settings.ips.element14.apiKey.help - Vous pouvez vous enregistrer pour une clé d'API sur <a href="https://partner.element14.com/">https://partner.element14.com/</a>. - - - - - settings.ips.element14.storeId - Store Domain - - - - - settings.ips.element14.storeId.help - Le "store domain" pour retrouver les données. Cela décidera du language et monnaie des résultats. Voir <a href="https://partner.element14.com/docs/Product_Search_API_REST__Description">here</a> pour une liste des domains. - - - - - settings.ips.tme - TME - - - - - settings.ips.tme.token - API Token - - - - - settings.ips.tme.token.help - Vous pouvez obtenir un token d'API et secret ici <a href="https://developers.tme.eu/en/">https://developers.tme.eu/en/</a>. - - - - - settings.ips.tme.secret - API Secret - - - - - settings.ips.tme.currency - Monnaie - - - - - settings.ips.tme.language - Langage - - - - - settings.ips.tme.country - Pays - - - - - settings.ips.tme.grossPrices - Avoir les prix totaux (avec taxes) - - - - - settings.ips.mouser - Mouser - - - - - settings.ips.mouser.apiKey - Clé d'API - - - - - settings.ips.mouser.apiKey.help - Vous pouvez vous enregistrer pour obtenir une clé d'API ici <a href="https://eu.mouser.com/api-hub/">https://eu.mouser.com/api-hub/</a>. - - - - - settings.ips.mouser.searchLimit - Limite de recherche - - - - - settings.ips.mouser.searchLimit.help - Le nombre maximum de résultats pour une seule recherche. Ne peut être supérieur à 50. - - - - - settings.ips.mouser.searchOptions - Filtres de recherche - - - - - settings.ips.mouser.searchOptions.help - Vous autorise à seulement voir les composants avec une certaine disponibilité et/ou conforme. - - - - - settings.ips.mouser.searchOptions.none - Aucuns filtres - - - - - settings.ips.mouser.searchOptions.rohs - Seulement les composants conformes RoHS - - - - - settings.ips.mouser.searchOptions.inStock - Seulement les composants en stock - - - - - settings.ips.mouser.searchOptions.rohsAndInStock - Seulement les composants en stock et conforme RoHS - - - - - settings.ips.lcsc - LCSC - - - - - settings.ips.lcsc.help - Attention : LCSC ne fournit pas d'API officielle. Ce fournisseur utilise l'API du webshop. LCSC n'à pas prévu l'usage de cette API et peut casser à tout moment, utilisez à vos propres risques. - - - - - settings.ips.lcsc.enabled - Activer - - - - - settings.ips.lcsc.currency - Monnaie - - - - - settings.system.attachments - Fichiers & Pièces-jointes - - - - - settings.system.attachments.maxFileSize - Taille de fichier maximale - - - - - settings.system.attachments.maxFileSize.help - La taille maximale de fichiers qui peuvent être uploadés. Veuillez noter que c'est aussi limité par la configuration PHP. - - - - - settings.system.attachments.allowDownloads - Autoriser le téléchargement de fichiers externes - - - - - settings.system.attachments.allowDownloads.help - Avec cette option les utilisateurs peuvent télécharger des fichiers externes dans Part-DB en fournissant une URL. <b>Attention : Cela peut être un problème de sécurité, car il peut permettre aux utilisateurs d'accéder a des ressources intranet via Part-DB !</b> - - - - - settings.system.attachments.downloadByDefault - Télécharger les nouvelles URL de pièces-jointes par défaut - - - - - settings.system.customization - Personnalisation - - - - - settings.system.customization.instanceName - Nom d'instance - - - - - settings.system.customization.instanceName.help - Nom de cette installation de Part-DB. La valeur est affichée dans la barre de navigation et titres. - - - - - settings.system.customization.banner - Bannière de page d'accueil - - - - - settings.system.history - Historique de logs - - - - - settings.system.history.saveChangedFields - Sauver les champs modifiés d'un élément dans les entrées de log - - - - - settings.system.history.saveOldData - Sauver l'ancienne donnée dans une entrée de log lorsqu'un élément change - - - - - settings.system.history.saveNewData - Sauver les nouvelles données dans une entrée de log lors de la création/changement d'éléments - - - - - settings.system.history.saveRemovedData - Sauver les données dans une entrée de log lors de la suppression d'un élément - - - - - settings.system.customization.theme - Thème global - - - - - settings.system.history.enforceComments - Forcer les commentaires pour les types d'actions - - - - - settings.system.history.enforceComments.description - Avec cette option vous pouvez spécifier pour quelles actions les utilisateurs seront forcés de donner une raison qui sera loggué dans l'historique. - - - - - settings.system.history.enforceComments.type.part_edit - Modification de composant - - - - - settings.system.history.enforceComments.type.part_create - Création de composant - - - - - settings.system.history.enforceComments.type.part_delete - Suppression de composant - - - - - settings.system.history.enforceComments.type.part_stock_operation - Opération de stock d'un composant - - - - - settings.system.history.enforceComments.type.datastructure_edit - Modification de structure de donnée - - - - - settings.system.history.enforceComments.type.datastructure_create - Création de structure de donnée - - - - - settings.system.history.enforceComments.type.datastructure_delete - Suppression de structure de donnée - - - - - settings.system.privacy.useGravatar - Utiliser les avatars de Gravatar - - - - - settings.system.privacy.useGravatar.description - Si un utilisateur n'a pas d'avatar spécifié, utilise l'avatar depuis Gravatar basé sur l'email de l'utilisateur. Cela fera charger des images au navigateur depuis une source tierce ! - - - - - settings.system.privacy.checkForUpdates - Vérifier les mises-à-jour de Part-DB - - - - - settings.system.privacy.checkForUpdates.description - Part-DB cherche régulièrement si une nouvelle version est disponible sur GitHub. Désactivez ici si vous ne voulez pas cela ou que votre serveur n'a pas accès à internet. - - - - - settings.system.localization.locale - Langage / locale par défaut - - - - - settings.system.localization - Localisation - - - - - settings.system.localization.timezone - Fuseau horaire par défaut - - - - - settings.system.localization.base_currency - Monnaie de base - - - - - settings.system.localization.base_currency_description - La monnaie qui est utilisée pour enregistrer l'information et taux de change . Cette monnaie est assumée quand aucune monnaie n'est mise pour une information de prix. -<b>Veuillez noter que les monnaies ne sont pas converties lors du changement de cette valeur. Changer la monnaie par défaut après que vous aillez déjà ajoutés les informations de prix donnera de mauvais prix !</b> - - - - - settings.system.privacy - Confidentialité - - - - - settings.title - Paramètres serveur - - - - - settings.misc.kicad_eda - Intégration KiCAD - - - - - settings.misc.kicad_eda.category_depth - Profondeur des catégories - - - - - settings.misc.kicad_eda.category_depth.help - Cette valeur déterminera la profondeur de l'arborescence de catégories qui est visible dans KiCAD. 0 veut dire que seul le premier niveau est visible. Mettez une valeur > 0 pour afficher plus de niveaux. Mettez à -1 pour voir tous les composants de Part-DB dans une seule catégorie dans KiCAD. - - - - - settings.behavior.sidebar - Barre latérale - - - - - settings.behavior.sidebar.items - Éléments de barre latérale - - - - - settings.behavior.sidebar.items.help - Les menus qui apparaitront dans la barre latérale par défaut. L'ordre des items peut-être modifié via glissé & déposé. - - - - - settings.behavior.sidebar.rootNodeEnabled - Utiliser un nœud principal - - - - - settings.behavior.sidebar.rootNodeEnabled.help - Si c'est activé tous les premiers niveaux de catégories, empreintes etc. seront placés sous un seul nœud unique. Si désactivé le premier niveau des catégories sera mis directement dans le menu. - - - - - settings.behavior.sidebar.rootNodeExpanded - Dérouler le nœud principal par défaut - - - - - settings.behavior.table - Tableaux - - - - - settings.behavior.table.default_page_size - Taille de page par défaut - - - - - settings.behavior.table.default_page_size.help - La taille par défaut des tableaux complets. Mettez -1 pour voir tous les items par défaut sans pagination. - - - - - settings.behavior.table.parts_default_columns - Colonnes par défaut des tableaux de composants - - - - - settings.behavior.table.parts_default_columns.help - Les colonnes à afficher par défaut dans les tableaux de composants. L'ordre des items peut être changé par glissé & déposé. - - - - - settings.ips.oemsecrets - OEMSecrets - - - - - settings.ips.oemsecrets.keepZeroPrices - Garder les distributeurs avec aucuns prix - - - - - settings.ips.oemsecrets.keepZeroPrices.help - Si ce n'est pas activé, les distributeurs dont les prix sont à 0 seront exclus comme invalides. - - - - - settings.ips.oemsecrets.parseParams - Extraire les paramètres de la description - - - - - settings.ips.oemsecrets.parseParams.help - Si activé, les fournisseurs essaient de convertir les descriptions non structurées des OEMSecrets en structures de paramètres. Chaque paramètre dans la description doit avoir la forme "...;name1:value;name2:value2" - - - - - settings.ips.oemsecrets.sortMode - Mode de tri des résultats - - - - - settings.ips.oemsecrets.sortMode.N - Aucun - - - - - settings.ips.oemsecrets.sortMode.C - Complet (priorise les items avec informations détaillés) - - - - - settings.ips.oemsecrets.sortMode.M - Complet & Nom du fabricant - - - - - entity.export.flash.error.no_entities - Aucune entité à exporter ! - - - - - attachment.table.internal_file - Fichier interne - - - - - attachment.table.external_link - Lien externe - - - - - attachment.view_external.view_at - Voir à %host% - - - - - attachment.view_external - Voir la version externe - - - - - part.table.actions.error - %count% erreurs survenues en faisant les actions : - - - - - part.table.actions.error_detail - %part_name% (ID: %part_id%): %message% - - - - - part_list.action.action.change_location - Changer emplacement (seulement pour les composants avec un lot seul) - - - - - parts.table.action_handler.error.part_lots_multiple - Ce composant contient plus d'un stock. Changez l'emplacement à la main pour sélectionner quel stock utiliser. - - - - - settings.ips.reichelt - Reichelt - - - - - settings.ips.reichelt.help - Reichelt.com n'offre aucune API officielle donc ce fournisseur d'info scrape le site web pour extraire les infos. Ça peut casser à tout moment, utilisez le à vos propres risques. - - - - - settings.ips.reichelt.include_vat - Inclure la TVA dans les prix - - - - - settings.ips.pollin - Pollin - - - - - settings.ips.pollin.help - Pollin.de n'offre aucune API officielle donc ce fournisseur d'info scrape le site web pour extraire les infos. Ça peut casser à tout moment, utilisez le à vos propres risques. - - - - - settings.behavior.sidebar.rootNodeRedirectsToNewEntity - Les nœuds principaux redirigent vers des pages de nouvelles entités - - - - - settings.ips.digikey - Digikey - - - - - settings.ips.digikey.client_id - Client ID - - - - - settings.ips.digikey.secret - Secret - - - - - settings.ips.octopart - Octopart / Nexar - - - - - settings.ips.octopart.searchLimit - Nombre de résultats - - - - - settings.ips.octopart.searchLimit.help - Le nombre de résultats à obtenir d'Octopart lors de la recherche (veuillez noter que cela compte dans vos limites d'API) - - - - - settings.ips.octopart.onlyAuthorizedSellers - Seulement les vendeurs autorisés - - - - - settings.ips.octopart.onlyAuthorizedSellers.help - Mettez à faux pour inclure les offres non autorisés dans les résultats - - - - - settings.misc.exchange_rate - Taux d'échange monétaire - - - - - settings.misc.exchange_rate.fixer_api_key - Fixer.io API Key - - - - - settings.misc.exchange_rate.fixer_api_key.help - Si vous avez besoin de taux d'échange entre monnaies non-européennes vous pouvez renseigner ici votre clé d'API depuis fixer.io. - - - - - settings.behavior.part_info - Page d'info composant - - - - - settings.behavior.part_info.show_part_image_overlay - Voir image d'overlay - - - - - settings.behavior.part_info.show_part_image_overlay.help - Voir l'image d'overlay avec les détails de pièce-jointe au survol dans la galerie d'images. - - - - - perm.config.change_system_settings - Changer les paramètres système - - - - - tree.tools.system.settings - Paramètre système - - - - - settings.tooltip.overrideable_by_env - La valeur de ce paramètre peut être écrasé en renseignant la variable d'environnement "%env%". - - - - - settings.flash.saved - Paramètres sauvés avec succès. - - - - - settings.flash.invalid - Paramètres invalides. Veuillez vérifier vos entrés ! - - - - - info_providers.settings.title - Paramètres de fournisseur d'informations - - - - - form.apikey.redacted - Caché pour raisons de sécurité - - - - - project.bom_import.map_fields - Correspondance de champs - - - - - project.bom_import.map_fields.help - Configurez comment les colonnes CSV correspondent aux champs de BOM - - - - - project.bom_import.delimiter - Délimiteur - - - - - project.bom_import.delimiter.comma - Virgule (,) - - - - - project.bom_import.delimiter.semicolon - Point-virgule (;) - - - - - project.bom_import.delimiter.tab - Tabulation - - - - - project.bom_import.field_mapping.title - Correspondance de champs - - - - - project.bom_import.field_mapping.csv_field - Champ CSV - - - - - project.bom_import.field_mapping.maps_to - Correspond à - - - - - project.bom_import.field_mapping.suggestion - Suggestion - - - - - project.bom_import.field_mapping.priority - Priorité - - - - - project.bom_import.field_mapping.priority_help - Priorité (faible nombre = priorité haute) - - - - - project.bom_import.field_mapping.priority_short - P - - - - - project.bom_import.field_mapping.priority_note - Astuce de priorité : les faibles nombres ont une plus haute priorité. La priorité par défaut est 10. Utilisez les priorités 1-9 pour les champs les plus importants, 10+ pour une priorité normale. - - - - - project.bom_import.field_mapping.summary - Résumé des correspondances de champs - - - - - project.bom_import.field_mapping.select_to_see_summary - Sélectionnez la correspondance de champs pour voir le résumé - - - - - project.bom_import.field_mapping.no_suggestion - Aucune suggestion - - - - - project.bom_import.preview - Prévisualisation - - - - - project.bom_import.flash.session_expired - Session d'import expirée. Veuillez uploader votre fichier à nouveau. - - - - - project.bom_import.field_mapping.ignore - Ignorer - - - - - project.bom_import.type.kicad_schematic - KiCAD Schematic BOM (Fichier CSV) - - - - - common.back - Précédent - - - - - project.bom_import.validation.errors.required_field_missing - Ligne %line% : Le champ requis "%field%" est manquant ou vide. Assurez-vous que ce champ est mappé et contiens des données. - - - - - project.bom_import.validation.errors.no_valid_designators - Ligne %line% : Le champ désigné ne contient pas de référence de composant valide. Format attendu : "R1,C2,U3" ou "R1, C2, U3". - - - - - project.bom_import.validation.warnings.unusual_designator_format - Ligne %line% : Certaines références de composants peuvent avoir un format inhabituel : %designators%. Format attendu : "R1", "C2", "U3", etc. - - - - - project.bom_import.validation.errors.duplicate_designators - Ligne %line% : Références de composants dupliqués trouvés : %designators%. Chaque composant ne doit être référencé qu'une seule fois par ligne. - - - - - project.bom_import.validation.errors.invalid_quantity - Ligne %line% : Quantité "%quantity%" n'est pas un nombre valide. Veuillez entrer une valeur numérique (ex., 1, 2.5, 10). - - - - - project.bom_import.validation.errors.quantity_zero_or_negative - Ligne %line% : La quantité doit être supérieure à 0, nous avons %quantity%. - - - - - project.bom_import.validation.warnings.quantity_unusually_high - Ligne %line% : La quantité %quantity% semble inhabituellement haute. Veuillez vérifier que c'est correct. - - - - - project.bom_import.validation.warnings.quantity_not_whole_number - Ligne %line% : La quantité %quantity% n'est pas un nombre entier mais vous avez %count% références de composants. Ça peut indiquer une erreur. - - - - - project.bom_import.validation.errors.quantity_designator_mismatch - Ligne %line% : Différence entre la quantité et les références de composants. Quantité : %quantity%, Références : %count% (%designators%). Ils doivent correspondre. Ajustez la quantité ou vérifiez les références des composants. - - - - - project.bom_import.validation.errors.invalid_partdb_id - Ligne %line% : L'ID Part-DB "%id%" n'est pas un nombre valide. Veuillez entrer un ID numérique. - - - - - project.bom_import.validation.errors.partdb_id_zero_or_negative - Ligne %line% : L'ID Part-DB doit être supérieur à 0, obtenu %id%. - - - - - project.bom_import.validation.warnings.partdb_id_not_found - Ligne %line% : L'ID Part-DB %id% n'a pas été trouvé dans la base de donnée. Le composant sera importé sans lien avec un composant existant. - - - - - project.bom_import.validation.info.partdb_link_success - Ligne %line% : Liaison avec le composant Part-DB "%name%" (ID: %id%) faite avec succès. - - - - - project.bom_import.validation.warnings.no_component_name - Ligne %line% : Aucun nom/description de composant fournit (MPN, Désignation, ou Valeur). Le composant sera nommé "Composant Inconnu". - - - - - project.bom_import.validation.warnings.package_name_too_long - Ligne %line% : Le nom d'empreinte "%package%" est inhabituellement long. Veuillez vérifier que c'est correct. - - - - - project.bom_import.validation.info.library_prefix_detected - Ligne %line% : L'empreinte "%package%" contient un préfixe de librairie. Ça sera supprimé automatiquement pendant l'import. - - - - - project.bom_import.validation.errors.non_numeric_field - Ligne %line% : Le champ "%field%" contient une valeur non numérique "%value%". Veuillez entrer un nombre valide. - - - - - project.bom_import.validation.info.import_summary - Résumé d'importation : %total% entrées totales, %valid% valides, %invalid% avec des problèmes. - - - - - project.bom_import.validation.errors.summary - Trouvé %count% erreur(s) de validation qui doivent être corrigés avant que l'import puisse s'effectuer. - - - - - project.bom_import.validation.warnings.summary - Trouvé %count% alerte(s). Veuillez relire les alertes avant de continuer. - - - - - project.bom_import.validation.info.all_valid - Toutes les entrées ont passé la validation avec succès ! - - - - - project.bom_import.validation.summary - Résumé de validation - - - - - project.bom_import.validation.total_entries - Entrées totales - - - - - project.bom_import.validation.valid_entries - Entrées Valides - - - - - project.bom_import.validation.invalid_entries - Entrées Invalides - - - - - project.bom_import.validation.success_rate - Taux de succès - - - - - project.bom_import.validation.errors.title - Erreurs de validation - - - - - project.bom_import.validation.errors.description - Les erreurs suivantes doivent être corrigés avant que l'import puisse continuer : - - - - - project.bom_import.validation.warnings.title - Alertes de validation - - - - - project.bom_import.validation.warnings.description - Les alertes suivantes doivent être revues avant de continuer : - - - - - project.bom_import.validation.info.title - Information - - - - - project.bom_import.validation.details.title - Résultats détaillés de validation - - - - - project.bom_import.validation.details.line - Ligne - - - - - project.bom_import.validation.details.status - Status - - - - - project.bom_import.validation.details.messages - Messages - - - - - project.bom_import.validation.details.valid - Valide - - - - - project.bom_import.validation.details.invalid - Invalide - - - - - project.bom_import.validation.all_valid - Toutes les entrées sont valides et prêtes à l'import ! - - - - - project.bom_import.validation.fix_errors - Veuillez corriger les erreurs de validation avant de procéder a l'import. - - - - - project.bom_import.type.generic_csv - CSV Générique - - - - - label_generator.update_profile - Mettre à jour le profil avec les paramètres en cours - - - - - label_generator.profile_updated - Profil d'étiquette mis à jour avec succès. - - - - - settings.behavior.hompepage.items - Items de page d'accueil - - - - - settings.behavior.homepage.items.help - Les items à montrer sur la page d'accueil. L'ordre peut être changé par glissé & déposé. - - - - - settings.system.customization.showVersionOnHomepage - Afficher la version de Part-DB sur la page d'accueil - - - - - settings.behavior.part_info.extract_params_from_description - Extraire les paramètres depuis la description du composant - - - - - settings.behavior.part_info.extract_params_from_notes - Extraire les paramètres depuis les notes du composant - - - - - settings.ips.default_providers - Fournisseurs de recherche par défaut - - - - - settings.ips.general - Paramètres généraux - - - - - settings.ips.default_providers.help - Ces fournisseurs seront présélectionnés pour les recherches dans les fournisseurs de composants. - - - - - settings.behavior.table.preview_image_max_width - Largeur maximale (px) de l'image de prévisualisation - - - - - settings.behavior.table.preview_image_min_width - Largeur minimale (px) de l'image de prévisualisation - - - - - info_providers.bulk_import.step1.title - Import de masse via fournisseur d'information - Étape 1 - - - - - info_providers.bulk_import.parts_selected - composants sélectionnés - - - - - info_providers.bulk_import.step1.global_mapping_description - Configurez les correspondances de champs qui seront appliqués a tous les composants sélectionnés. Par exemple : "MPN → LCSC + Mouser" veut dire que chercher via les fournisseurs LCSC et Mouser en utilisant chaque champ MPN des composants. - - - - - info_providers.bulk_import.selected_parts - Composants sélectionnés - - - - - info_providers.bulk_import.field_mappings - Correspondances de champs - - - - - info_providers.bulk_import.field_mappings_help - Définissez quels champs de composants rechercher avec quels fournisseurs d'informations. Plusieurs correspondances peuvent être combinées. - - - - - info_providers.bulk_import.add_mapping - Ajouter une correspondance - - - - - info_providers.bulk_import.search_results.title - Résultats de recherche - - - - - info_providers.bulk_import.errors - erreurs - - - - - info_providers.bulk_import.results_found - %count% résultats trouvés - - - - - info_providers.bulk_import.source_field - Champ Source - - - - - info_providers.bulk_import.view_existing - Voir Existant - - - - - info_providers.bulk_search.search_field - Champ de recherche - - - - - info_providers.bulk_search.providers - Fournisseurs d'informations - - - - - info_providers.bulk_import.actions.label - Actions - - - - - info_providers.bulk_search.providers.help - Sélectionnez dans quels fournisseurs d'information rechercher quand les composants ont ce champ. - - - - - info_providers.bulk_search.submit - Chercher tous les composants - - - - - info_providers.bulk_search.field.select - Sélectionnez un champ depuis lequel chercher - - - - - info_providers.bulk_search.field.mpn - Numéro de pièce fabriquant (MPN) - - - - - info_providers.bulk_search.field.name - Nom de composant - - - - - part_list.action.action.info_provider - Fournisseur d'information - - - - - part_list.action.bulk_info_provider_import - Import en masse de fournisseur d'information - - - - - info_providers.bulk_import.step1.spn_recommendation - Le SPN (Numéro de pièce fournisseur) est recommandé pour de meilleurs résultats. Ajoutez une correspondance pour chaque fournisseur pour utiliser leur SPN. - - - - - info_providers.bulk_import.update_part - Mettre à jour le composant - - - - - info_providers.bulk_import.prefetch_details - Détails de préchargement - - - - - info_providers.bulk_import.prefetch_details_help - Détails de préchargements pour tous les résultats. Ça prendra plus de temps mais accélèrera le workflow pour mettre à jour les composants. - - - - - info_providers.bulk_import.step2.title - Import de masse depuis les fournisseurs d'informations - - - - - info_providers.bulk_import.step2.card_title - Import de masse pour %count% composants - %date% - - - - - info_providers.bulk_import.parts - composants - - - - - info_providers.bulk_import.results - résultats - - - - - info_providers.bulk_import.created_at - Créer le - - - - - info_providers.bulk_import.status.in_progress - En Cours - - - - - info_providers.bulk_import.status.completed - Complété - - - - - info_providers.bulk_import.status.failed - Échec - - - - - info_providers.bulk_import.table.name - Nom - - - - - info_providers.bulk_import.table.description - Description - - - - - info_providers.bulk_import.table.manufacturer - Fabriquant - - - - - info_providers.bulk_import.table.provider - Fournisseur - - - - - info_providers.bulk_import.table.source_field - Champ Source - - - - - info_providers.bulk_import.back - Précédent - - - - - info_providers.bulk_import.progress - Progression : - - - - - info_providers.bulk_import.status.pending - En attente - - - - - info_providers.bulk_import.completed - terminé - - - - - info_providers.bulk_import.skipped - zappé - - - - - info_providers.bulk_import.mark_completed - Marquer terminé - - - - - info_providers.bulk_import.mark_skipped - Marquer à zapper - - - - - info_providers.bulk_import.mark_pending - Marquer en attente - - - - - info_providers.bulk_import.skip_reason - Raison pour zapper - - - - - info_providers.bulk_import.editing_part - Éditer un composant comme partie d'un import de masse - - - - - info_providers.bulk_import.complete - Terminer - - - - - info_providers.bulk_import.existing_jobs - Tâches existantes - - - - - info_providers.bulk_import.job_name - Nom de tâche - - - - - info_providers.bulk_import.parts_count - Nombre de composants - - - - - info_providers.bulk_import.results_count - Nombre de résultats - - - - - info_providers.bulk_import.progress_label - Progression : %current%/%total% - - - - - info_providers.bulk_import.manage_jobs - Gérer les tâches d'import de masse - - - - - info_providers.bulk_import.view_results - Voir les Résultats - - - - - info_providers.bulk_import.status - Status - - - - - info_providers.bulk_import.manage_jobs_description - Voir et gérer toutes vos taches d'import de masse. Pour créer une nouvelle tache, sélectionnez les composants et cliquez "Import de masse depuis les fournisseurs d'informations". - - - - - info_providers.bulk_import.no_jobs_found - Aucune tache d'import de masse trouvé. - - - - - info_providers.bulk_import.create_first_job - Créez votre première tache d'import de masse en sélectionnant plusieurs composants dans un tableau de composants et sélectionnez l'option "Import de masse de fournisseurs d'informations". - - - - - info_providers.bulk_import.confirm_delete_job - Êtes-vous sûr de vouloir supprimer cette tache ? - - - - - info_providers.bulk_import.job_name_template - Import de masse de %count% composants - - - - - info_providers.bulk_import.step2.instructions.title - Comment utiliser l'import de masse - - - - - info_providers.bulk_import.step2.instructions.description - Suivez ces étapes pour mieux mettre à jour vos composants : - - - - - info_providers.bulk_import.step2.instructions.step1 - Cliquez "Mettre à jour le composant" pour éditer un composant avec les données de fournisseur - - - - - info_providers.bulk_import.step2.instructions.step2 - Relisez et modifiez les informations de composants comme souhaité. Note : Vous devez cliquer sur "Sauver" deux fois pour sauver les changements. - - - - - info_providers.bulk_import.step2.instructions.step3 - Cliquez sur "Terminer" pour marquer le composant comme finalisé et retourner a cette vue d'ensemble - - - - - info_providers.bulk_import.created_by - Créer Par - - - - - info_providers.bulk_import.completed_at - Terminé le - - - - - info_providers.bulk_import.action.label - Action - - - - - info_providers.bulk_import.action.delete - Supprimer - - - - - info_providers.bulk_import.status.active - Actif - - - - - info_providers.bulk_import.progress.title - Progression - - - - - info_providers.bulk_import.progress.completed_text - %completed% / %total% terminés - - - - - info_providers.bulk_import.status.stopped - Arrêté - - - - - info_providers.bulk_import.action.stop - Arrêter - - - - - info_providers.bulk_import.confirm_stop_job - Êtes-vous sûr de vouloir arrêter cette tache ? - - - - - part.filter.in_bulk_import_job - Dans la tache d'import de masse - - - - - part.filter.bulk_import_job_status - Status de la tache d'import de masse - - - - - part.filter.bulk_import_part_status - Status de l'import de masse de composants - - - - - part.edit.tab.bulk_import - Tache d'import de masse - - - - - bulk_import.status.pending - En attente - - - - - bulk_import.status.in_progress - En cours - - - - - bulk_import.status.completed - Terminé - - - - - bulk_import.status.stopped - Arrêté - - - - - bulk_import.status.failed - Échec - - - - - bulk_import.part_status.pending - En attente - - - - - bulk_import.part_status.completed - Terminé - - - - - bulk_import.part_status.skipped - Zappé - - - - - bulk_import.part_status.failed - Échec - - - - - bulk_info_provider_import_job.label - Import de masse via fournisseur d'informations - - - - - bulk_info_provider_import_job_part.label - Tache d'import de masse de composant - - - - - info_providers.bulk_search.priority - Priorité - - - - - info_providers.bulk_search.priority.help - Faible nombre = haute priorité. Même priorité = combiner les résultats. Priorités différentes = essayer le plus haut en premier, repli si pas de résultats. - - - - - info_providers.bulk_import.priority_system.title - Système de priorités - - - - - info_providers.bulk_import.priority_system.description - Faible nombre = haute priorité. Même priorité = combiner les résultats. Priorités différentes = essayer le plus haut en premier, repli si pas de résultats. - - - - - info_providers.bulk_import.priority_system.example - Rechercher les fournisseurs - - - - - info_providers.bulk_import.search.submit - Rechercher les fournisseurs - - - - - info_providers.bulk_import.research.title - Rechercher les composants - - - - - info_providers.bulk_import.research.description - Re-chercher des composants en utilisant les infos mises à jour (ex. nouveau MPN). Utilise la même correspondance de champs que la recherche originelle. - - - - - info_providers.bulk_import.research.all_pending - Rechercher tous les composants en attente - - - - - info_providers.bulk_import.research.part - Recherche - - - - - info_providers.bulk_import.research.part_tooltip - Rechercher ce composant avec les infos mises à jour - - - - - info_providers.bulk_import.max_mappings_reached - Nombre maximum de correspondances atteint - - - - - settings.system - Système - - - - - settings.behavior - Comportement - - - - - settings.ips - Fournisseurs d'informations - - - - - settings.misc - Autre - - - - - settings.system.localization.language_menu_entries - Entrées de menu de langues - - - - - settings.system.localization.language_menu_entries.description - Les langues à afficher dans le menu déroulant de langues. L'ordre peut être changé par glissé & déposé. Laissez vide pour afficher toutes les langues. - - - - - project.builds.no_bom_entries - Le projet n'a aucune entrée de BOM - - - - - settings.behavior.sidebar.data_structure_nodes_table_include_children - Les tableaux doivent inclure les nœuds enfants par défaut - - - - - settings.behavior.sidebar.data_structure_nodes_table_include_children.help - Si coché, les tableaux de composants pour les catégories, empreintes etc. doivent inclure tous les composants des sous-catégories. Si non coché seul les composants qui appartiennent seulement au nœud cliqué seront visibles. - - - - - info_providers.search.error.oauth_reconnect - Vous devez reconnecter l'OAuth pour les fournisseurs suivants : %provider% -Vous pouvez faire ça depuis la liste des fournisseurs d'informations. + category.edit.part_ipn_prefix.help + Un préfixe suggéré lors de la saisie de l'IPN d'une pièce. diff --git a/translations/messages.it.xlf b/translations/messages.it.xlf index 828304eb..34540da1 100644 --- a/translations/messages.it.xlf +++ b/translations/messages.it.xlf @@ -548,6 +548,12 @@ Unità di misura + + + part_custom_state.caption + Stato personalizzato del componente + + Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:5 @@ -1842,6 +1848,66 @@ I sub elementi saranno spostati verso l'alto. Avanzate + + + part.edit.tab.advanced.ipn.commonSectionHeader + Suggerimenti senza incremento di parte + + + + + part.edit.tab.advanced.ipn.partIncrementHeader + Suggerimenti con incrementi numerici delle parti + + + + + part.edit.tab.advanced.ipn.prefix.description.current-increment + Specifica IPN attuale per il pezzo + + + + + part.edit.tab.advanced.ipn.prefix.description.increment + Prossima specifica IPN possibile basata su una descrizione identica del pezzo + + + + + part.edit.tab.advanced.ipn.prefix_empty.direct_category + Il prefisso IPN della categoria diretta è vuoto, specificarlo nella categoria "%name%" + + + + + part.edit.tab.advanced.ipn.prefix.direct_category + Prefisso IPN della categoria diretta + + + + + part.edit.tab.advanced.ipn.prefix.direct_category.increment + Prefisso IPN della categoria diretta e di un incremento specifico della parte + + + + + part.edit.tab.advanced.ipn.prefix.hierarchical.no_increment + Prefissi IPN con ordine gerarchico delle categorie dei prefissi padre + + + + + part.edit.tab.advanced.ipn.prefix.hierarchical.increment + Prefissi IPN con ordine gerarchico delle categorie dei prefissi padre e un incremento specifico per il pezzo + + + + + part.edit.tab.advanced.ipn.prefix.not_saved + Crea prima un componente e assegnagli una categoria: con le categorie esistenti e i loro propri prefissi IPN, l'identificativo IPN per il componente può essere suggerito automaticamente + + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:40 @@ -4832,6 +4898,12 @@ Se è stato fatto in modo errato o se un computer non è più attendibile, puoi Unità di misura + + + part.table.partCustomState + Stato personalizzato del componente + + Part-DB1\src\DataTables\PartsDataTable.php:236 @@ -5696,6 +5768,12 @@ Se è stato fatto in modo errato o se un computer non è più attendibile, puoi Unità di misura + + + part.edit.partCustomState + Stato personalizzato della parte + + Part-DB1\src\Form\Part\PartBaseType.php:212 @@ -5983,6 +6061,12 @@ Se è stato fatto in modo errato o se un computer non è più attendibile, puoi Unità di misura + + + part_custom_state.label + Stato personalizzato della parte + + Part-DB1\src\Services\ElementTypeNameGenerator.php:90 @@ -6226,6 +6310,12 @@ Se è stato fatto in modo errato o se un computer non è più attendibile, puoi Unità di misura + + + tree.tools.edit.part_custom_state + Stato personalizzato del componente + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:203 @@ -6960,6 +7050,12 @@ Se è stato fatto in modo errato o se un computer non è più attendibile, puoi Filtro nome + + + category.edit.part_ipn_prefix + Prefisso parte IPN + + obsolete @@ -8496,6 +8592,12 @@ Element 3 Unità di misura + + + perm.part_custom_states + Stato personalizzato del componente + + obsolete @@ -10274,12 +10376,24 @@ Element 3 es. "/Condensatore \d+ nF/i" + + + category.edit.part_ipn_prefix.placeholder + es. "B12A" + + category.edit.partname_regex.help Un'espressione regolare compatibile con PCRE che il nome del componente deve soddisfare. + + + category.edit.part_ipn_prefix.help + Un prefisso suggerito durante l'inserimento dell'IPN di una parte. + + entity.select.add_hint @@ -10826,6 +10940,12 @@ Element 3 Unità di misura + + + log.element_edited.changed_fields.partCustomState + Stato personalizzato della parte + + log.element_edited.changed_fields.expiration_date @@ -11084,6 +11204,18 @@ Element 3 Modificare l'unità di misura + + + part_custom_state.new + Nuovo stato personalizzato del componente + + + + + part_custom_state.edit + Modifica stato personalizzato del componente + + user.aboutMe.label diff --git a/translations/messages.ja.xlf b/translations/messages.ja.xlf index 4becc319..668c51c1 100644 --- a/translations/messages.ja.xlf +++ b/translations/messages.ja.xlf @@ -517,6 +517,12 @@ 単位 + + + part_custom_state.caption + 部品のカスタム状態 + + Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:5 @@ -1820,6 +1826,66 @@ 詳細 + + + part.edit.tab.advanced.ipn.commonSectionHeader + 部品の増加なしの提案。 + + + + + part.edit.tab.advanced.ipn.partIncrementHeader + パーツの数値インクリメントを含む提案 + + + + + part.edit.tab.advanced.ipn.prefix.description.current-increment + 部品の現在のIPN仕様 + + + + + part.edit.tab.advanced.ipn.prefix.description.increment + 同じ部品説明に基づく次の可能なIPN仕様 + + + + + part.edit.tab.advanced.ipn.prefix_empty.direct_category + 直接カテゴリの IPN プレフィックスが空です。「%name%」カテゴリで指定してください + + + + + part.edit.tab.advanced.ipn.prefix.direct_category + 直接カテゴリのIPNプレフィックス + + + + + part.edit.tab.advanced.ipn.prefix.direct_category.increment + 直接カテゴリのIPNプレフィックスと部品特有のインクリメント + + + + + part.edit.tab.advanced.ipn.prefix.hierarchical.no_increment + 親プレフィックスの階層カテゴリ順のIPNプレフィックス + + + + + part.edit.tab.advanced.ipn.prefix.hierarchical.increment + 親プレフィックスの階層カテゴリ順とパーツ固有の増分のIPNプレフィックス + + + + + part.edit.tab.advanced.ipn.prefix.not_saved + まずはコンポーネントを作成し、それをカテゴリに割り当ててください:既存のカテゴリとそれぞれのIPNプレフィックスを基に、コンポーネントのIPNを自動的に提案できます + + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:40 @@ -4793,6 +4859,12 @@ 単位 + + + part.table.partCustomState + 部品のカスタム状態 + + Part-DB1\src\DataTables\PartsDataTable.php:236 @@ -5657,6 +5729,12 @@ 単位 + + + part.edit.partCustomState + 部品のカスタム状態 + + Part-DB1\src\Form\Part\PartBaseType.php:212 @@ -5934,6 +6012,12 @@ 単位 + + + part_custom_state.label + 部品のカスタム状態 + + Part-DB1\src\Services\ElementTypeNameGenerator.php:90 @@ -6166,6 +6250,12 @@ 単位 + + + tree.tools.edit.part_custom_state + 部品のカスタム状態 + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:203 @@ -6901,6 +6991,12 @@ 名前のフィルター + + + category.edit.part_ipn_prefix + 部品 IPN 接頭辞 + + obsolete @@ -8424,6 +8520,12 @@ Exampletown 単位 + + + perm.part_custom_states + 部品のカスタム状態 + + obsolete @@ -8834,5 +8936,35 @@ Exampletown Part-DBについての質問は、<a href="%href%" class="link-external" target="_blank">GitHub</a> にスレッドがあります。 + + + part_custom_state.new + 部品の新しいカスタム状態 + + + + + part_custom_state.edit + 部品のカスタム状態を編集 + + + + + log.element_edited.changed_fields.partCustomState + 部品のカスタム状態 + + + + + category.edit.part_ipn_prefix.placeholder + 例: "B12A" + + + + + category.edit.part_ipn_prefix.help + 部品のIPN入力時に提案される接頭辞。 + + diff --git a/translations/messages.nl.xlf b/translations/messages.nl.xlf index 760533d7..1c063187 100644 --- a/translations/messages.nl.xlf +++ b/translations/messages.nl.xlf @@ -548,6 +548,12 @@ Meeteenheden + + + part_custom_state.caption + Aangepaste status van het onderdeel + + Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:5 @@ -724,5 +730,131 @@ Weet u zeker dat u wilt doorgaan? + + + perm.part_custom_states + Aangepaste status van onderdeel + + + + + tree.tools.edit.part_custom_state + Aangepaste status van het onderdeel + + + + + part_custom_state.new + Nieuwe aangepaste status van het onderdeel + + + + + part_custom_state.edit + Aangepaste status van het onderdeel bewerken + + + + + part_custom_state.label + Aangepaste staat van onderdeel + + + + + log.element_edited.changed_fields.partCustomState + Aangepaste staat van het onderdeel + + + + + part.edit.partCustomState + Aangepaste staat van het onderdeel + + + + + part.table.partCustomState + Aangepaste status van onderdeel + + + + + category.edit.part_ipn_prefix + IPN-voorvoegsel van onderdeel + + + + + category.edit.part_ipn_prefix.placeholder + bijv. "B12A" + + + + + category.edit.part_ipn_prefix.help + Een voorgesteld voorvoegsel bij het invoeren van de IPN van een onderdeel. + + + + + part.edit.tab.advanced.ipn.commonSectionHeader + Suggesties zonder toename van onderdelen + + + + + part.edit.tab.advanced.ipn.partIncrementHeader + Suggesties met numerieke verhogingen van onderdelen + + + + + part.edit.tab.advanced.ipn.prefix.description.current-increment + Huidige IPN-specificatie voor het onderdeel + + + + + part.edit.tab.advanced.ipn.prefix.description.increment + Volgende mogelijke IPN-specificatie op basis van een identieke onderdeelbeschrijving + + + + + part.edit.tab.advanced.ipn.prefix_empty.direct_category + Het IPN-prefix van de directe categorie is leeg, geef het op in de categorie "%name%" + + + + + part.edit.tab.advanced.ipn.prefix.direct_category + IPN-prefix van de directe categorie + + + + + part.edit.tab.advanced.ipn.prefix.direct_category.increment + IPN-voorvoegsel van de directe categorie en een onderdeel specifiek increment + + + + + part.edit.tab.advanced.ipn.prefix.hierarchical.no_increment + IPN-prefixen met een hiërarchische volgorde van hoofdcategorieën + + + + + part.edit.tab.advanced.ipn.prefix.hierarchical.increment + IPN-prefixen met een hiërarchische volgorde van hoofdcategorieën en een specifieke toename voor het onderdeel + + + + + part.edit.tab.advanced.ipn.prefix.not_saved + Maak eerst een component en wijs het toe aan een categorie: met de bestaande categorieën en hun eigen IPN-prefixen kan de IPN voor het component automatisch worden voorgesteld + + diff --git a/translations/messages.pl.xlf b/translations/messages.pl.xlf index b769e273..0a9353fb 100644 --- a/translations/messages.pl.xlf +++ b/translations/messages.pl.xlf @@ -548,6 +548,12 @@ Jednostka miary + + + part_custom_state.caption + Stan niestandardowy komponentu + + Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:5 @@ -1847,6 +1853,66 @@ Po usunięciu pod elementy zostaną przeniesione na górę. Zaawansowane + + + part.edit.tab.advanced.ipn.commonSectionHeader + Sugestie bez zwiększenia części + + + + + part.edit.tab.advanced.ipn.partIncrementHeader + Propozycje z numerycznymi przyrostami części + + + + + part.edit.tab.advanced.ipn.prefix.description.current-increment + Aktualna specyfikacja IPN dla części + + + + + part.edit.tab.advanced.ipn.prefix.description.increment + Następna możliwa specyfikacja IPN na podstawie identycznego opisu części + + + + + part.edit.tab.advanced.ipn.prefix_empty.direct_category + Prefiks IPN kategorii bezpośredniej jest pusty, podaj go w kategorii "%name%". + + + + + part.edit.tab.advanced.ipn.prefix.direct_category + Prefiks IPN kategorii bezpośredniej + + + + + part.edit.tab.advanced.ipn.prefix.direct_category.increment + Prefiks IPN bezpośredniej kategorii i specyficzny dla części przyrost + + + + + part.edit.tab.advanced.ipn.prefix.hierarchical.no_increment + Prefiksy IPN z hierarchiczną kolejnością kategorii prefiksów nadrzędnych + + + + + part.edit.tab.advanced.ipn.prefix.hierarchical.increment + Prefiksy IPN z hierarchiczną kolejnością kategorii prefiksów nadrzędnych i specyficznym przyrostem dla części + + + + + part.edit.tab.advanced.ipn.prefix.not_saved + Najpierw utwórz komponent i przypisz go do kategorii: dzięki istniejącym kategoriom i ich własnym prefiksom IPN identyfikator IPN dla komponentu może być proponowany automatycznie + + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:40 @@ -4835,6 +4901,12 @@ Jeśli zrobiłeś to niepoprawnie lub komputer nie jest już godny zaufania, mo Jednostka pomiarowa + + + part.table.partCustomState + Niestandardowy stan części + + Part-DB1\src\DataTables\PartsDataTable.php:236 @@ -5699,6 +5771,12 @@ Jeśli zrobiłeś to niepoprawnie lub komputer nie jest już godny zaufania, mo Jednostka pomiarowa + + + part.edit.partCustomState + Własny stan części + + Part-DB1\src\Form\Part\PartBaseType.php:212 @@ -5986,6 +6064,12 @@ Jeśli zrobiłeś to niepoprawnie lub komputer nie jest już godny zaufania, mo Jednostka pomiarowa + + + part_custom_state.label + Własny stan części + + Part-DB1\src\Services\ElementTypeNameGenerator.php:90 @@ -6229,6 +6313,12 @@ Jeśli zrobiłeś to niepoprawnie lub komputer nie jest już godny zaufania, mo Jednostka miary + + + tree.tools.edit.part_custom_state + Niestandardowy stan części + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:203 @@ -6963,6 +7053,12 @@ Jeśli zrobiłeś to niepoprawnie lub komputer nie jest już godny zaufania, mo Filtr nazwy + + + category.edit.part_ipn_prefix + Prefiks IPN części + + obsolete @@ -8499,6 +8595,12 @@ Element 3 Jednostka miary + + + perm.part_custom_states + Stan niestandardowy komponentu + + obsolete @@ -10277,12 +10379,24 @@ Element 3 np. "/Kondensator \d+ nF/i" + + + category.edit.part_ipn_prefix.placeholder + np. "B12A" + + category.edit.partname_regex.help Wyrażenie regularne zgodne z PCRE, do którego musi pasować nazwa komponentu. + + + category.edit.part_ipn_prefix.help + Een voorgesteld voorvoegsel bij het invoeren van de IPN van een onderdeel. + + entity.select.add_hint @@ -10829,6 +10943,12 @@ Element 3 Jednostka pomiarowa + + + log.element_edited.changed_fields.partCustomState + Niestandardowy stan części + + log.element_edited.changed_fields.expiration_date @@ -11087,6 +11207,18 @@ Element 3 Edytuj jednostkę miary + + + part_custom_state.new + Nowy niestandardowy stan części + + + + + part_custom_state.edit + Edytuj niestandardowy stan części + + user.aboutMe.label diff --git a/translations/messages.ru.xlf b/translations/messages.ru.xlf index 62570acb..9c91a4b1 100644 --- a/translations/messages.ru.xlf +++ b/translations/messages.ru.xlf @@ -548,6 +548,12 @@ Единица измерения + + + part_custom_state.caption + Пользовательское состояние компонента + + Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:5 @@ -1850,6 +1856,66 @@ Расширенные + + + part.edit.tab.advanced.ipn.commonSectionHeader + Предложения без увеличения частей. + + + + + part.edit.tab.advanced.ipn.partIncrementHeader + Предложения с числовыми приращениями частей + + + + + part.edit.tab.advanced.ipn.prefix.description.current-increment + Текущая спецификация IPN для детали + + + + + part.edit.tab.advanced.ipn.prefix.description.increment + Следующая возможная спецификация IPN на основе идентичного описания детали + + + + + part.edit.tab.advanced.ipn.prefix_empty.direct_category + Префикс IPN для прямой категории пуст, укажите его в категории «%name%». + + + + + part.edit.tab.advanced.ipn.prefix.direct_category + Префикс IPN для прямой категории + + + + + part.edit.tab.advanced.ipn.prefix.direct_category.increment + Префикс IPN прямой категории и специфическое для части приращение + + + + + part.edit.tab.advanced.ipn.prefix.hierarchical.no_increment + IPN-префиксы с иерархическим порядком категорий родительских префиксов + + + + + part.edit.tab.advanced.ipn.prefix.hierarchical.increment + IPN-префиксы с иерархическим порядком категорий родительских префиксов и специфическим увеличением для компонента + + + + + part.edit.tab.advanced.ipn.prefix.not_saved + Сначала создайте компонент и назначьте ему категорию: на основе существующих категорий и их собственных IPN-префиксов идентификатор IPN для компонента может быть предложен автоматически + + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:40 @@ -4841,6 +4907,12 @@ Единица измерения + + + part.table.partCustomState + Пользовательское состояние детали + + Part-DB1\src\DataTables\PartsDataTable.php:236 @@ -5705,6 +5777,12 @@ Единица измерения + + + part.edit.partCustomState + Пользовательское состояние части + + Part-DB1\src\Form\Part\PartBaseType.php:212 @@ -5992,6 +6070,12 @@ Единица измерения + + + part_custom_state.label + Пользовательское состояние детали + + Part-DB1\src\Services\ElementTypeNameGenerator.php:90 @@ -6235,6 +6319,12 @@ Единица измерения + + + tree.tools.edit.part_custom_state + Пользовательское состояние компонента + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:203 @@ -6970,6 +7060,12 @@ Фильтр по имени + + + category.edit.part_ipn_prefix + Префикс IPN детали + + obsolete @@ -8503,6 +8599,12 @@ Единица измерения + + + perm.part_custom_states + Пользовательское состояние компонента + + obsolete @@ -10281,12 +10383,24 @@ e.g "/Конденсатор \d+ nF/i" + + + category.edit.part_ipn_prefix.placeholder + e.g "B12A" + + category.edit.partname_regex.help PCRE-совместимое регулярное выражение которому должно соответствовать имя компонента. + + + category.edit.part_ipn_prefix.help + Предлагаемый префикс при вводе IPN детали. + + entity.select.add_hint @@ -10833,6 +10947,12 @@ Единица измерения + + + log.element_edited.changed_fields.partCustomState + Пользовательское состояние детали + + log.element_edited.changed_fields.expiration_date @@ -11091,6 +11211,18 @@ Изменить единицу измерения + + + part_custom_state.new + Новое пользовательское состояние компонента + + + + + part_custom_state.edit + Редактировать пользовательское состояние компонента + + user.aboutMe.label diff --git a/translations/messages.zh.xlf b/translations/messages.zh.xlf index 668c32f2..ee912800 100644 --- a/translations/messages.zh.xlf +++ b/translations/messages.zh.xlf @@ -548,6 +548,12 @@ 计量单位 + + + part_custom_state.caption + 部件的自定义状态 + + Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:5 @@ -1850,6 +1856,66 @@ 高级 + + + part.edit.tab.advanced.ipn.commonSectionHeader + Sugestie bez zwiększenia części + + + + + part.edit.tab.advanced.ipn.partIncrementHeader + 包含部件数值增量的建议 + + + + + part.edit.tab.advanced.ipn.prefix.description.current-increment + 部件的当前IPN规格 + + + + + part.edit.tab.advanced.ipn.prefix.description.increment + 基于相同部件描述的下一个可能的IPN规格 + + + + + part.edit.tab.advanced.ipn.prefix_empty.direct_category + 直接类别的 IPN 前缀为空,请在类别“%name%”中指定。 + + + + + part.edit.tab.advanced.ipn.prefix.direct_category + 直接类别的IPN前缀 + + + + + part.edit.tab.advanced.ipn.prefix.direct_category.increment + 直接类别的IPN前缀和部件特定的增量 + + + + + part.edit.tab.advanced.ipn.prefix.hierarchical.no_increment + 具有父级前缀层级类别顺序的IPN前缀 + + + + + part.edit.tab.advanced.ipn.prefix.hierarchical.increment + 具有父级前缀层级类别顺序和组件特定增量的IPN前缀 + + + + + part.edit.tab.advanced.ipn.prefix.not_saved + 请先创建组件并将其分配到类别:基于现有类别及其专属的IPN前缀,可以自动建议组件的IPN + + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:40 @@ -4839,6 +4905,12 @@ 计量单位 + + + part.table.partCustomState + 部件的自定义状态 + + Part-DB1\src\DataTables\PartsDataTable.php:236 @@ -5703,6 +5775,12 @@ 计量单位 + + + part.edit.partCustomState + 部件的自定义状态 + + Part-DB1\src\Form\Part\PartBaseType.php:212 @@ -5990,6 +6068,12 @@ 计量单位 + + + part_custom_state.label + 部件自定义状态 + + Part-DB1\src\Services\ElementTypeNameGenerator.php:90 @@ -6233,6 +6317,12 @@ 计量单位 + + + tree.tools.edit.part_custom_state + 部件自定义状态 + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:203 @@ -6967,6 +7057,12 @@ 名称过滤器 + + + category.edit.part_ipn_prefix + 部件 IPN 前缀 + + obsolete @@ -8502,6 +8598,12 @@ Element 3 计量单位 + + + perm.part_custom_states + 部件的自定义状态 + + obsolete @@ -10280,12 +10382,24 @@ Element 3 + + + category.edit.part_ipn_prefix.placeholder + 例如:"B12A" + + category.edit.partname_regex.help 与PCRE兼容的正则表达式,部分名称必须匹配。 + + + category.edit.part_ipn_prefix.help + 输入零件IPN时建议的前缀。 + + entity.select.add_hint @@ -10832,6 +10946,12 @@ Element 3 计量单位 + + + log.element_edited.changed_fields.partCustomState + 部件的自定义状态 + + log.element_edited.changed_fields.expiration_date @@ -11090,6 +11210,18 @@ Element 3 编辑度量单位 + + + part_custom_state.new + 部件的新自定义状态 + + + + + part_custom_state.edit + 编辑部件的自定义状态 + + user.aboutMe.label diff --git a/yarn.lock b/yarn.lock index 2a2ab405..0896bc62 100644 --- a/yarn.lock +++ b/yarn.lock @@ -64,25 +64,25 @@ js-tokens "^4.0.0" picocolors "^1.1.1" -"@babel/compat-data@^7.27.2", "@babel/compat-data@^7.27.7", "@babel/compat-data@^7.28.0": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.4.tgz#96fdf1af1b8859c8474ab39c295312bfb7c24b04" - integrity sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw== +"@babel/compat-data@^7.27.2", "@babel/compat-data@^7.27.7", "@babel/compat-data@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.5.tgz#a8a4962e1567121ac0b3b487f52107443b455c7f" + integrity sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA== "@babel/core@^7.19.6": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.4.tgz#12a550b8794452df4c8b084f95003bce1742d496" - integrity sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA== + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.5.tgz#4c81b35e51e1b734f510c99b07dfbc7bbbb48f7e" + integrity sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw== dependencies: "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.28.3" + "@babel/generator" "^7.28.5" "@babel/helper-compilation-targets" "^7.27.2" "@babel/helper-module-transforms" "^7.28.3" "@babel/helpers" "^7.28.4" - "@babel/parser" "^7.28.4" + "@babel/parser" "^7.28.5" "@babel/template" "^7.27.2" - "@babel/traverse" "^7.28.4" - "@babel/types" "^7.28.4" + "@babel/traverse" "^7.28.5" + "@babel/types" "^7.28.5" "@jridgewell/remapping" "^2.3.5" convert-source-map "^2.0.0" debug "^4.1.0" @@ -90,13 +90,13 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.3.tgz#9626c1741c650cbac39121694a0f2d7451b8ef3e" - integrity sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw== +"@babel/generator@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.5.tgz#712722d5e50f44d07bc7ac9fe84438742dd61298" + integrity sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ== dependencies: - "@babel/parser" "^7.28.3" - "@babel/types" "^7.28.2" + "@babel/parser" "^7.28.5" + "@babel/types" "^7.28.5" "@jridgewell/gen-mapping" "^0.3.12" "@jridgewell/trace-mapping" "^0.3.28" jsesc "^3.0.2" @@ -120,25 +120,25 @@ semver "^6.3.1" "@babel/helper-create-class-features-plugin@^7.27.1", "@babel/helper-create-class-features-plugin@^7.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz#3e747434ea007910c320c4d39a6b46f20f371d46" - integrity sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg== + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz#472d0c28028850968979ad89f173594a6995da46" + integrity sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ== dependencies: "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-member-expression-to-functions" "^7.27.1" + "@babel/helper-member-expression-to-functions" "^7.28.5" "@babel/helper-optimise-call-expression" "^7.27.1" "@babel/helper-replace-supers" "^7.27.1" "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - "@babel/traverse" "^7.28.3" + "@babel/traverse" "^7.28.5" semver "^6.3.1" "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz#05b0882d97ba1d4d03519e4bce615d70afa18c53" - integrity sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ== + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz#7c1ddd64b2065c7f78034b25b43346a7e19ed997" + integrity sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw== dependencies: - "@babel/helper-annotate-as-pure" "^7.27.1" - regexpu-core "^6.2.0" + "@babel/helper-annotate-as-pure" "^7.27.3" + regexpu-core "^6.3.1" semver "^6.3.1" "@babel/helper-define-polyfill-provider@^0.6.5": @@ -157,13 +157,13 @@ resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== -"@babel/helper-member-expression-to-functions@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz#ea1211276be93e798ce19037da6f06fbb994fa44" - integrity sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA== +"@babel/helper-member-expression-to-functions@^7.27.1", "@babel/helper-member-expression-to-functions@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz#f3e07a10be37ed7a63461c63e6929575945a6150" + integrity sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg== dependencies: - "@babel/traverse" "^7.27.1" - "@babel/types" "^7.27.1" + "@babel/traverse" "^7.28.5" + "@babel/types" "^7.28.5" "@babel/helper-module-imports@^7.27.1": version "7.27.1" @@ -225,10 +225,10 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== -"@babel/helper-validator-identifier@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" - integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== +"@babel/helper-validator-identifier@^7.27.1", "@babel/helper-validator-identifier@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" + integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== "@babel/helper-validator-option@^7.27.1": version "7.27.1" @@ -252,20 +252,20 @@ "@babel/template" "^7.27.2" "@babel/types" "^7.28.4" -"@babel/parser@^7.18.9", "@babel/parser@^7.27.2", "@babel/parser@^7.28.3", "@babel/parser@^7.28.4": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.4.tgz#da25d4643532890932cc03f7705fe19637e03fa8" - integrity sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg== +"@babel/parser@^7.18.9", "@babel/parser@^7.27.2", "@babel/parser@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.5.tgz#0b0225ee90362f030efd644e8034c99468893b08" + integrity sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ== dependencies: - "@babel/types" "^7.28.4" + "@babel/types" "^7.28.5" -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz#61dd8a8e61f7eb568268d1b5f129da3eee364bf9" - integrity sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA== +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz#fbde57974707bbfa0376d34d425ff4fa6c732421" + integrity sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q== dependencies: "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.27.1" + "@babel/traverse" "^7.28.5" "@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.27.1": version "7.27.1" @@ -357,10 +357,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-block-scoping@^7.28.0": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz#e19ac4ddb8b7858bac1fd5c1be98a994d9726410" - integrity sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A== +"@babel/plugin-transform-block-scoping@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz#e0d3af63bd8c80de2e567e690a54e84d85eb16f6" + integrity sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g== dependencies: "@babel/helper-plugin-utils" "^7.27.1" @@ -380,7 +380,7 @@ "@babel/helper-create-class-features-plugin" "^7.28.3" "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-classes@^7.28.3": +"@babel/plugin-transform-classes@^7.28.4": version "7.28.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz#75d66175486788c56728a73424d67cbc7473495c" integrity sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA== @@ -400,13 +400,13 @@ "@babel/helper-plugin-utils" "^7.27.1" "@babel/template" "^7.27.1" -"@babel/plugin-transform-destructuring@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz#0f156588f69c596089b7d5b06f5af83d9aa7f97a" - integrity sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A== +"@babel/plugin-transform-destructuring@^7.28.0", "@babel/plugin-transform-destructuring@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz#b8402764df96179a2070bb7b501a1586cf8ad7a7" + integrity sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw== dependencies: "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.28.0" + "@babel/traverse" "^7.28.5" "@babel/plugin-transform-dotall-regex@^7.27.1": version "7.27.1" @@ -446,10 +446,10 @@ "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-destructuring" "^7.28.0" -"@babel/plugin-transform-exponentiation-operator@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz#fc497b12d8277e559747f5a3ed868dd8064f83e1" - integrity sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ== +"@babel/plugin-transform-exponentiation-operator@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz#7cc90a8170e83532676cfa505278e147056e94fe" + integrity sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw== dependencies: "@babel/helper-plugin-utils" "^7.27.1" @@ -491,10 +491,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-logical-assignment-operators@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz#890cb20e0270e0e5bebe3f025b434841c32d5baa" - integrity sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw== +"@babel/plugin-transform-logical-assignment-operators@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz#d028fd6db8c081dee4abebc812c2325e24a85b0e" + integrity sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA== dependencies: "@babel/helper-plugin-utils" "^7.27.1" @@ -521,15 +521,15 @@ "@babel/helper-module-transforms" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-modules-systemjs@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz#00e05b61863070d0f3292a00126c16c0e024c4ed" - integrity sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA== +"@babel/plugin-transform-modules-systemjs@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz#7439e592a92d7670dfcb95d0cbc04bd3e64801d2" + integrity sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew== dependencies: - "@babel/helper-module-transforms" "^7.27.1" + "@babel/helper-module-transforms" "^7.28.3" "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" - "@babel/traverse" "^7.27.1" + "@babel/helper-validator-identifier" "^7.28.5" + "@babel/traverse" "^7.28.5" "@babel/plugin-transform-modules-umd@^7.27.1": version "7.27.1" @@ -568,7 +568,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-object-rest-spread@^7.28.0": +"@babel/plugin-transform-object-rest-spread@^7.28.4": version "7.28.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz#9ee1ceca80b3e6c4bac9247b2149e36958f7f98d" integrity sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew== @@ -594,10 +594,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-optional-chaining@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz#874ce3c4f06b7780592e946026eb76a32830454f" - integrity sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg== +"@babel/plugin-transform-optional-chaining@^7.27.1", "@babel/plugin-transform-optional-chaining@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz#8238c785f9d5c1c515a90bf196efb50d075a4b26" + integrity sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" @@ -633,7 +633,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-regenerator@^7.28.3": +"@babel/plugin-transform-regenerator@^7.28.4": version "7.28.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz#9d3fa3bebb48ddd0091ce5729139cd99c67cea51" integrity sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA== @@ -723,15 +723,15 @@ "@babel/helper-plugin-utils" "^7.27.1" "@babel/preset-env@^7.19.4": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.28.3.tgz#2b18d9aff9e69643789057ae4b942b1654f88187" - integrity sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg== + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.28.5.tgz#82dd159d1563f219a1ce94324b3071eb89e280b0" + integrity sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg== dependencies: - "@babel/compat-data" "^7.28.0" + "@babel/compat-data" "^7.28.5" "@babel/helper-compilation-targets" "^7.27.2" "@babel/helper-plugin-utils" "^7.27.1" "@babel/helper-validator-option" "^7.27.1" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.27.1" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.28.5" "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.27.1" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.27.1" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.27.1" @@ -744,42 +744,42 @@ "@babel/plugin-transform-async-generator-functions" "^7.28.0" "@babel/plugin-transform-async-to-generator" "^7.27.1" "@babel/plugin-transform-block-scoped-functions" "^7.27.1" - "@babel/plugin-transform-block-scoping" "^7.28.0" + "@babel/plugin-transform-block-scoping" "^7.28.5" "@babel/plugin-transform-class-properties" "^7.27.1" "@babel/plugin-transform-class-static-block" "^7.28.3" - "@babel/plugin-transform-classes" "^7.28.3" + "@babel/plugin-transform-classes" "^7.28.4" "@babel/plugin-transform-computed-properties" "^7.27.1" - "@babel/plugin-transform-destructuring" "^7.28.0" + "@babel/plugin-transform-destructuring" "^7.28.5" "@babel/plugin-transform-dotall-regex" "^7.27.1" "@babel/plugin-transform-duplicate-keys" "^7.27.1" "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.27.1" "@babel/plugin-transform-dynamic-import" "^7.27.1" "@babel/plugin-transform-explicit-resource-management" "^7.28.0" - "@babel/plugin-transform-exponentiation-operator" "^7.27.1" + "@babel/plugin-transform-exponentiation-operator" "^7.28.5" "@babel/plugin-transform-export-namespace-from" "^7.27.1" "@babel/plugin-transform-for-of" "^7.27.1" "@babel/plugin-transform-function-name" "^7.27.1" "@babel/plugin-transform-json-strings" "^7.27.1" "@babel/plugin-transform-literals" "^7.27.1" - "@babel/plugin-transform-logical-assignment-operators" "^7.27.1" + "@babel/plugin-transform-logical-assignment-operators" "^7.28.5" "@babel/plugin-transform-member-expression-literals" "^7.27.1" "@babel/plugin-transform-modules-amd" "^7.27.1" "@babel/plugin-transform-modules-commonjs" "^7.27.1" - "@babel/plugin-transform-modules-systemjs" "^7.27.1" + "@babel/plugin-transform-modules-systemjs" "^7.28.5" "@babel/plugin-transform-modules-umd" "^7.27.1" "@babel/plugin-transform-named-capturing-groups-regex" "^7.27.1" "@babel/plugin-transform-new-target" "^7.27.1" "@babel/plugin-transform-nullish-coalescing-operator" "^7.27.1" "@babel/plugin-transform-numeric-separator" "^7.27.1" - "@babel/plugin-transform-object-rest-spread" "^7.28.0" + "@babel/plugin-transform-object-rest-spread" "^7.28.4" "@babel/plugin-transform-object-super" "^7.27.1" "@babel/plugin-transform-optional-catch-binding" "^7.27.1" - "@babel/plugin-transform-optional-chaining" "^7.27.1" + "@babel/plugin-transform-optional-chaining" "^7.28.5" "@babel/plugin-transform-parameters" "^7.27.7" "@babel/plugin-transform-private-methods" "^7.27.1" "@babel/plugin-transform-private-property-in-object" "^7.27.1" "@babel/plugin-transform-property-literals" "^7.27.1" - "@babel/plugin-transform-regenerator" "^7.28.3" + "@babel/plugin-transform-regenerator" "^7.28.4" "@babel/plugin-transform-regexp-modifiers" "^7.27.1" "@babel/plugin-transform-reserved-words" "^7.27.1" "@babel/plugin-transform-shorthand-properties" "^7.27.1" @@ -816,26 +816,26 @@ "@babel/parser" "^7.27.2" "@babel/types" "^7.27.1" -"@babel/traverse@^7.18.9", "@babel/traverse@^7.27.1", "@babel/traverse@^7.28.0", "@babel/traverse@^7.28.3", "@babel/traverse@^7.28.4": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.4.tgz#8d456101b96ab175d487249f60680221692b958b" - integrity sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ== +"@babel/traverse@^7.18.9", "@babel/traverse@^7.27.1", "@babel/traverse@^7.28.0", "@babel/traverse@^7.28.3", "@babel/traverse@^7.28.4", "@babel/traverse@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.5.tgz#450cab9135d21a7a2ca9d2d35aa05c20e68c360b" + integrity sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ== dependencies: "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.28.3" + "@babel/generator" "^7.28.5" "@babel/helper-globals" "^7.28.0" - "@babel/parser" "^7.28.4" + "@babel/parser" "^7.28.5" "@babel/template" "^7.27.2" - "@babel/types" "^7.28.4" + "@babel/types" "^7.28.5" debug "^4.3.1" -"@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.2", "@babel/types@^7.28.4", "@babel/types@^7.4.4": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.4.tgz#0a4e618f4c60a7cd6c11cb2d48060e4dbe38ac3a" - integrity sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q== +"@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.2", "@babel/types@^7.28.4", "@babel/types@^7.28.5", "@babel/types@^7.4.4": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.5.tgz#10fc405f60897c35f07e85493c932c7b5ca0592b" + integrity sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA== dependencies: "@babel/helper-string-parser" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" + "@babel/helper-validator-identifier" "^7.28.5" "@ckeditor/ckeditor5-adapter-ckfinder@47.1.0": version "47.1.0" @@ -1850,9 +1850,9 @@ integrity sha512-eGeIqNOQpXoPAIP7tC1+1Yc1yl1xnwYqg+3mzqxyrbE5pg5YFBZcA6YoTiByJB6DKAEsiWtl6tjTJS4IYtbB7A== "@hotwired/turbo@^8.0.1": - version "8.0.18" - resolved "https://registry.yarnpkg.com/@hotwired/turbo/-/turbo-8.0.18.tgz#10ae3de450b955862f89e30c50d96d676813744e" - integrity sha512-dG0N7khQsP8sujclodQE3DYkI4Lq7uKA04fhT0DCC/DwMgn4T4WM3aji6EC6+iCfABQeJncY0SraXqVeOq0vvQ== + version "8.0.20" + resolved "https://registry.yarnpkg.com/@hotwired/turbo/-/turbo-8.0.20.tgz#068ede648c4db09fed4cf0ac0266788056673f2f" + integrity sha512-IilkH/+h92BRLeY/rMMR3MUh1gshIfdra/qZzp/Bl5FmiALD/6sQZK/ecxSbumeyOYiWr/JRI+Au1YQmkJGnoA== "@isaacs/balanced-match@^4.0.1": version "4.0.1" @@ -2024,10 +2024,10 @@ schema-utils "^3.0.0 || ^4.0.0" "@symfony/ux-translator@file:vendor/symfony/ux-translator/assets": - version "2.29.2" + version "2.30.0" "@symfony/ux-turbo@file:vendor/symfony/ux-turbo/assets": - version "2.29.2" + version "2.30.0" "@symfony/webpack-encore@^5.0.0": version "5.2.0" @@ -2076,9 +2076,9 @@ "@types/ms" "*" "@types/emscripten@^1.41.2": - version "1.41.4" - resolved "https://registry.yarnpkg.com/@types/emscripten/-/emscripten-1.41.4.tgz#fd7dfaaa9f311bdf3838c98e5d619850a99d3187" - integrity sha512-ECf0qTibhAi2Z0K6FIY96CvBTVkVIuVunOfbTUgbaAmGmbwsc33dbK9KZPROWsmzHotddy6C5pIqYqOmsBoJEw== + version "1.41.5" + resolved "https://registry.yarnpkg.com/@types/emscripten/-/emscripten-1.41.5.tgz#5670e4b52b098691cb844b84ee48c9176699b68d" + integrity sha512-cMQm7pxu6BxtHyqJ7mQZ2kXWV5SLmugybFdHCBbJ5eHzOo6VhBckEgAT3//rP5FwPHNPeEiq4SmQ5ucBwsOo4Q== "@types/eslint-scope@^3.7.7": version "3.7.7" @@ -2160,11 +2160,11 @@ integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== "@types/node@*": - version "24.8.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-24.8.1.tgz#74c8ae00b045a0a351f2837ec00f25dfed0053be" - integrity sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q== + version "24.9.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-24.9.2.tgz#90ded2422dbfcafcf72080f28975adc21366148d" + integrity sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA== dependencies: - undici-types "~7.14.0" + undici-types "~7.16.0" "@types/parse-json@^4.0.0": version "4.0.2" @@ -2192,9 +2192,9 @@ integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^17.0.8": - version "17.0.33" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" - integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== + version "17.0.34" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.34.tgz#1c2f9635b71d5401827373a01ce2e8a7670ea839" + integrity sha512-KExbHVa92aJpw9WDQvzBaGVE2/Pz+pLZQloT2hjL8IqsZnV62rlPOYvNnLmf/L2dyllfVUOVBj64M0z/46eR2A== dependencies: "@types/yargs-parser" "*" @@ -2612,10 +2612,10 @@ base64-js@^1.1.2, base64-js@^1.3.0: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -baseline-browser-mapping@^2.8.9: - version "2.8.18" - resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.8.18.tgz#b44b18cadddfa037ee8440dafaba4a329dfb327c" - integrity sha512-UYmTpOBwgPScZpS4A+YbapwWuBwasxvO/2IOHArSsAhL/+ZdmATBXTex3t+l2hXwLVYK382ibr/nKoY9GKe86w== +baseline-browser-mapping@^2.8.19: + version "2.8.23" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.8.23.tgz#cd43e17eff5cbfb67c92153e7fe856cf6d426421" + integrity sha512-616V5YX4bepJFzNyOfce5Fa8fDJMfoxzOIzDCZwaGL8MKVpFrXqfNUoIpRn9YMI5pXf/VKgzjB4htFMsFKKdiQ== big.js@^5.2.2: version "5.2.2" @@ -2679,16 +2679,16 @@ browser-stdout@1.3.1: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserslist@^4.0.0, browserslist@^4.23.0, browserslist@^4.24.0, browserslist@^4.25.1, browserslist@^4.26.3: - version "4.26.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.26.3.tgz#40fbfe2d1cd420281ce5b1caa8840049c79afb56" - integrity sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w== +browserslist@^4.0.0, browserslist@^4.23.0, browserslist@^4.24.0, browserslist@^4.26.3, browserslist@^4.27.0: + version "4.27.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.27.0.tgz#755654744feae978fbb123718b2f139bc0fa6697" + integrity sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw== dependencies: - baseline-browser-mapping "^2.8.9" - caniuse-lite "^1.0.30001746" - electron-to-chromium "^1.5.227" - node-releases "^2.0.21" - update-browserslist-db "^1.1.3" + baseline-browser-mapping "^2.8.19" + caniuse-lite "^1.0.30001751" + electron-to-chromium "^1.5.238" + node-releases "^2.0.26" + update-browserslist-db "^1.1.4" bs-custom-file-input@^1.3.4: version "1.3.4" @@ -2775,10 +2775,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001746: - version "1.0.30001751" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz#dacd5d9f4baeea841641640139d2b2a4df4226ad" - integrity sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001751: + version "1.0.30001753" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001753.tgz#419f8fc9bab6f1a1d10d9574d0b3374f823c5b00" + integrity sha512-Bj5H35MD/ebaOV4iDLqPEtiliTN29qkGtEHCwawWn4cYm+bPJM2NsaP30vtZcnERClMzp52J4+aw2UNbK4o+zw== ccount@^2.0.0: version "2.0.1" @@ -3268,26 +3268,26 @@ cssnano-preset-default@^6.1.2: postcss-svgo "^6.0.3" postcss-unique-selectors "^6.0.4" -cssnano-preset-default@^7.0.9: - version "7.0.9" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-7.0.9.tgz#ba778ab7cbec830e4dbcac722443a90fd99ae34e" - integrity sha512-tCD6AAFgYBOVpMBX41KjbvRh9c2uUjLXRyV7KHSIrwHiq5Z9o0TFfUCoM3TwVrRsRteN3sVXGNvjVNxYzkpTsA== +cssnano-preset-default@^7.0.10: + version "7.0.10" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-7.0.10.tgz#4fb6ee962c0852a03084e8c7a4b60fb0e2db45e0" + integrity sha512-6ZBjW0Lf1K1Z+0OKUAUpEN62tSXmYChXWi2NAA0afxEVsj9a+MbcB1l5qel6BHJHmULai2fCGRthCeKSFbScpA== dependencies: - browserslist "^4.25.1" + browserslist "^4.27.0" css-declaration-sorter "^7.2.0" cssnano-utils "^5.0.1" postcss-calc "^10.1.1" - postcss-colormin "^7.0.4" - postcss-convert-values "^7.0.7" - postcss-discard-comments "^7.0.4" + postcss-colormin "^7.0.5" + postcss-convert-values "^7.0.8" + postcss-discard-comments "^7.0.5" postcss-discard-duplicates "^7.0.2" postcss-discard-empty "^7.0.1" postcss-discard-overridden "^7.0.1" postcss-merge-longhand "^7.0.5" - postcss-merge-rules "^7.0.6" + postcss-merge-rules "^7.0.7" postcss-minify-font-values "^7.0.1" postcss-minify-gradients "^7.0.1" - postcss-minify-params "^7.0.4" + postcss-minify-params "^7.0.5" postcss-minify-selectors "^7.0.5" postcss-normalize-charset "^7.0.1" postcss-normalize-display-values "^7.0.1" @@ -3295,11 +3295,11 @@ cssnano-preset-default@^7.0.9: postcss-normalize-repeat-style "^7.0.1" postcss-normalize-string "^7.0.1" postcss-normalize-timing-functions "^7.0.1" - postcss-normalize-unicode "^7.0.4" + postcss-normalize-unicode "^7.0.5" postcss-normalize-url "^7.0.1" postcss-normalize-whitespace "^7.0.1" postcss-ordered-values "^7.0.2" - postcss-reduce-initial "^7.0.4" + postcss-reduce-initial "^7.0.5" postcss-reduce-transforms "^7.0.1" postcss-svgo "^7.1.0" postcss-unique-selectors "^7.0.4" @@ -3323,11 +3323,11 @@ cssnano@^6.0.3: lilconfig "^3.1.1" cssnano@^7.0.4: - version "7.1.1" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-7.1.1.tgz#a24ae8a87ec4129f9a783498402c9cbcb2e9fe25" - integrity sha512-fm4D8ti0dQmFPeF8DXSAA//btEmqCOgAc/9Oa3C1LW94h5usNrJEfrON7b4FkPZgnDEn6OUs5NdxiJZmAtGOpQ== + version "7.1.2" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-7.1.2.tgz#a8a533a8f509d74b2d22e73d80ec1294f65fdc70" + integrity sha512-HYOPBsNvoiFeR1eghKD5C3ASm64v9YVyJB4Ivnl2gqKoQYvjjN/G0rztvKQq8OxocUtC6sjqY8jwYngIB4AByA== dependencies: - cssnano-preset-default "^7.0.9" + cssnano-preset-default "^7.0.10" lilconfig "^3.1.3" csso@^5.0.5: @@ -3661,10 +3661,10 @@ duplexer@^0.1.2: resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== -electron-to-chromium@^1.5.227: - version "1.5.237" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.237.tgz#eacf61cef3f6345d0069ab427585c5a04d7084f0" - integrity sha512-icUt1NvfhGLar5lSWH3tHNzablaA5js3HVHacQimfP8ViEBOQv+L7DKEuHdbTZ0SKCO1ogTJTIL1Gwk9S6Qvcg== +electron-to-chromium@^1.5.238: + version "1.5.244" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.244.tgz#b9b61e3d24ef4203489951468614f2a360763820" + integrity sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw== emoji-regex@^7.0.1: version "7.0.3" @@ -3700,9 +3700,9 @@ entities@^4.2.0: integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== envinfo@^7.7.3: - version "7.19.0" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.19.0.tgz#b4b4507a27e9900b0175f556167fd3a95f8623f1" - integrity sha512-DoSM9VyG6O3vqBf+p3Gjgr/Q52HYBBtO3v+4koAxt1MnWr+zEnxE+nke/yXS4lt2P4SYCHQ4V3f1i88LQVOpAw== + version "7.20.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.20.0.tgz#3fd9de69fb6af3e777a017dfa033676368d67dd7" + integrity sha512-+zUomDcLXsVkQ37vUqWBvQwLaLlj8eZPSi61llaEFAVBY5mhcXdaSw1pSJVl4yTYD5g/gEfpNl28YYk4IPvrrg== error-ex@^1.3.1: version "1.3.4" @@ -4137,9 +4137,9 @@ get-symbol-description@^1.1.0: get-intrinsic "^1.2.6" get-tsconfig@^4.4.0: - version "4.12.0" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.12.0.tgz#cfb3a4446a2abd324a205469e8bda4e7e44cbd35" - integrity sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw== + version "4.13.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.13.0.tgz#fcdd991e6d22ab9a600f00e91c318707a5d9a0d7" + integrity sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ== dependencies: resolve-pkg-maps "^1.0.0" @@ -4619,7 +4619,7 @@ is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.16.0: +is-core-module@^2.16.1: version "2.16.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== @@ -5581,9 +5581,9 @@ mini-css-extract-plugin@^2.4.2, mini-css-extract-plugin@^2.6.0: tapable "^2.2.1" minimatch@*: - version "10.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.3.tgz#cf7a0314a16c4d9ab73a7730a0e8e3c3502d47aa" - integrity sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw== + version "10.1.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.1.1.tgz#e6e61b9b0c1dcab116b5a7d1458e8b6ae9e73a55" + integrity sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ== dependencies: "@isaacs/brace-expansion" "^5.0.0" @@ -5734,10 +5734,10 @@ node-notifier@^9.0.0: uuid "^8.3.0" which "^2.0.2" -node-releases@^2.0.21: - version "2.0.25" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.25.tgz#95479437bd409231e03981c1f6abee67f5e962df" - integrity sha512-4auku8B/vw5psvTiiN9j1dAOsXvMoGqJuKJcR+dTdqiXEK20mMTk1UEo3HS16LeGQsVG6+qKTPM9u/qQ2LqATA== +node-releases@^2.0.26: + version "2.0.27" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.27.tgz#eedca519205cf20f650f61d56b070db111231e4e" + integrity sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -6021,12 +6021,12 @@ postcss-colormin@^6.1.0: colord "^2.9.3" postcss-value-parser "^4.2.0" -postcss-colormin@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-7.0.4.tgz#12b5ed701bc860d58e5267a51679415939563bdb" - integrity sha512-ziQuVzQZBROpKpfeDwmrG+Vvlr0YWmY/ZAk99XD+mGEBuEojoFekL41NCsdhyNUtZI7DPOoIWIR7vQQK9xwluw== +postcss-colormin@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-7.0.5.tgz#0c7526289ab3f0daf96a376fd7430fae7258d5cf" + integrity sha512-ekIBP/nwzRWhEMmIxHHbXHcMdzd1HIUzBECaj5KEdLz9DVP2HzT065sEhvOx1dkLjYW7jyD0CngThx6bpFi2fA== dependencies: - browserslist "^4.25.1" + browserslist "^4.27.0" caniuse-api "^3.0.0" colord "^2.9.3" postcss-value-parser "^4.2.0" @@ -6039,12 +6039,12 @@ postcss-convert-values@^6.1.0: browserslist "^4.23.0" postcss-value-parser "^4.2.0" -postcss-convert-values@^7.0.7: - version "7.0.7" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-7.0.7.tgz#e24f8118d8f5cb3830dd8841c8a01537b7535293" - integrity sha512-HR9DZLN04Xbe6xugRH6lS4ZQH2zm/bFh/ZyRkpedZozhvh+awAfbA0P36InO4fZfDhvYfNJeNvlTf1sjwGbw/A== +postcss-convert-values@^7.0.8: + version "7.0.8" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-7.0.8.tgz#0c599dc29891d47d7b4d6db399c402cf3ba8efc3" + integrity sha512-+XNKuPfkHTCEo499VzLMYn94TiL3r9YqRE3Ty+jP7UX4qjewUONey1t7CG21lrlTLN07GtGM8MqFVp86D4uKJg== dependencies: - browserslist "^4.25.1" + browserslist "^4.27.0" postcss-value-parser "^4.2.0" postcss-discard-comments@^6.0.2: @@ -6052,10 +6052,10 @@ postcss-discard-comments@^6.0.2: resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz#e768dcfdc33e0216380623652b0a4f69f4678b6c" integrity sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw== -postcss-discard-comments@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-7.0.4.tgz#9aded15cf437d14ee02b7589ee911b780cd73ffb" - integrity sha512-6tCUoql/ipWwKtVP/xYiFf1U9QgJ0PUvxN7pTcsQ8Ns3Fnwq1pU5D5s1MhT/XySeLq6GXNvn37U46Ded0TckWg== +postcss-discard-comments@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-7.0.5.tgz#0a95aa4d229a021bc441861d4773d57145ee15dd" + integrity sha512-IR2Eja8WfYgN5n32vEGSctVQ1+JARfu4UH8M7bgGh1bC+xI/obsPJXaBpQF7MAByvgwZinhpHpdrmXtvVVlKcQ== dependencies: postcss-selector-parser "^7.1.0" @@ -6142,12 +6142,12 @@ postcss-merge-rules@^6.1.1: cssnano-utils "^4.0.2" postcss-selector-parser "^6.0.16" -postcss-merge-rules@^7.0.6: - version "7.0.6" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-7.0.6.tgz#f5a0cabf6423b1370ba76d5363dfe44776f1e619" - integrity sha512-2jIPT4Tzs8K87tvgCpSukRQ2jjd+hH6Bb8rEEOUDmmhOeTcqDg5fEFK8uKIu+Pvc3//sm3Uu6FRqfyv7YF7+BQ== +postcss-merge-rules@^7.0.7: + version "7.0.7" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-7.0.7.tgz#f49537e5029ce0e655c2f31fdb205f14575c7334" + integrity sha512-njWJrd/Ms6XViwowaaCc+/vqhPG3SmXn725AGrnl+BgTuRPEacjiLEaGq16J6XirMJbtKkTwnt67SS+e2WGoew== dependencies: - browserslist "^4.25.1" + browserslist "^4.27.0" caniuse-api "^3.0.0" cssnano-utils "^5.0.1" postcss-selector-parser "^7.1.0" @@ -6193,12 +6193,12 @@ postcss-minify-params@^6.1.0: cssnano-utils "^4.0.2" postcss-value-parser "^4.2.0" -postcss-minify-params@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-7.0.4.tgz#665848c0674c5ff59e054e63e052339738cbc6a3" - integrity sha512-3OqqUddfH8c2e7M35W6zIwv7jssM/3miF9cbCSb1iJiWvtguQjlxZGIHK9JRmc8XAKmE2PFGtHSM7g/VcW97sw== +postcss-minify-params@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-7.0.5.tgz#4a0d15e312252e41d0c8504227d43538e3f607a2" + integrity sha512-FGK9ky02h6Ighn3UihsyeAH5XmLEE2MSGH5Tc4tXMFtEDx7B+zTG6hD/+/cT+fbF7PbYojsmmWjyTwFwW1JKQQ== dependencies: - browserslist "^4.25.1" + browserslist "^4.27.0" cssnano-utils "^5.0.1" postcss-value-parser "^4.2.0" @@ -6352,12 +6352,12 @@ postcss-normalize-unicode@^6.1.0: browserslist "^4.23.0" postcss-value-parser "^4.2.0" -postcss-normalize-unicode@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.4.tgz#9fd8d1d1e931b60ed946556e4d657b5879e3ee00" - integrity sha512-LvIURTi1sQoZqj8mEIE8R15yvM+OhbR1avynMtI9bUzj5gGKR/gfZFd8O7VMj0QgJaIFzxDwxGl/ASMYAkqO8g== +postcss-normalize-unicode@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.5.tgz#d47a3cc40529d7eeb18d7f7a8a215c38c54455cd" + integrity sha512-X6BBwiRxVaFHrb2WyBMddIeB5HBjJcAaUHyhLrM2FsxSq5TFqcHSsK7Zu1otag+o0ZphQGJewGH1tAyrD0zX1Q== dependencies: - browserslist "^4.25.1" + browserslist "^4.27.0" postcss-value-parser "^4.2.0" postcss-normalize-url@^6.0.2: @@ -6412,12 +6412,12 @@ postcss-reduce-initial@^6.1.0: browserslist "^4.23.0" caniuse-api "^3.0.0" -postcss-reduce-initial@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-7.0.4.tgz#ebe8b4c85990efaa5a1accfc77f41f23cfa66187" - integrity sha512-rdIC9IlMBn7zJo6puim58Xd++0HdbvHeHaPgXsimMfG1ijC5A9ULvNLSE0rUKVJOvNMcwewW4Ga21ngyJjY/+Q== +postcss-reduce-initial@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-7.0.5.tgz#cf74bb747dfa003cd3d5372081f6157e6d8e1545" + integrity sha512-RHagHLidG8hTZcnr4FpyMB2jtgd/OcyAazjMhoy5qmWJOx1uxKh4ntk0Pb46ajKM0rkf32lRH4C8c9qQiPR6IA== dependencies: - browserslist "^4.25.1" + browserslist "^4.27.0" caniuse-api "^3.0.0" postcss-reduce-transforms@^6.0.2: @@ -6650,7 +6650,7 @@ regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.4: gopd "^1.2.0" set-function-name "^2.0.2" -regexpu-core@^6.2.0: +regexpu-core@^6.3.1: version "6.4.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.4.0.tgz#3580ce0c4faedef599eccb146612436b62a176e5" integrity sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA== @@ -6822,11 +6822,11 @@ resolve-url-loader@^5.0.0: source-map "0.6.1" resolve@^1.1.6, resolve@^1.1.7, resolve@^1.20.0, resolve@^1.22.10: - version "1.22.10" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" - integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== + version "1.22.11" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.11.tgz#aad857ce1ffb8bfa9b0b1ac29f1156383f68c262" + integrity sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ== dependencies: - is-core-module "^2.16.0" + is-core-module "^2.16.1" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -7282,11 +7282,11 @@ stylehacks@^6.1.1: postcss-selector-parser "^6.0.16" stylehacks@^7.0.5: - version "7.0.6" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-7.0.6.tgz#b52653ec54b4d902268df4be5db5e16f18822b31" - integrity sha512-iitguKivmsueOmTO0wmxURXBP8uqOO+zikLGZ7Mm9e/94R4w5T999Js2taS/KBOnQ/wdC3jN3vNSrkGDrlnqQg== + version "7.0.7" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-7.0.7.tgz#12b0dd1eceee4d564aae6da0632804ef0004a5be" + integrity sha512-bJkD0JkEtbRrMFtwgpJyBbFIwfDDONQ1Ov3sDLZQP8HuJ73kBOyx66H4bOcAbVWmnfLdvQ0AJwXxOMkpujcO6g== dependencies: - browserslist "^4.25.1" + browserslist "^4.27.0" postcss-selector-parser "^7.1.0" sugarss@^4.0.1: @@ -7552,10 +7552,10 @@ unbox-primitive@^1.1.0: has-symbols "^1.1.0" which-boxed-primitive "^1.1.1" -undici-types@~7.14.0: - version "7.14.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.14.0.tgz#4c037b32ca4d7d62fae042174604341588bc0840" - integrity sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA== +undici-types@~7.16.0: + version "7.16.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46" + integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.1" @@ -7674,10 +7674,10 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -update-browserslist-db@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" - integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== +update-browserslist-db@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz#7802aa2ae91477f255b86e0e46dbc787a206ad4a" + integrity sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A== dependencies: escalade "^3.2.0" picocolors "^1.1.1"