mirror of
https://github.com/Part-DB/Part-DB-server.git
synced 2026-05-19 09:51:45 +00:00
Datasource-spezifische Suche für Projects/Assemblies sowie Parts umsetzen
This commit is contained in:
parent
dde91ff1c5
commit
ca6254cc53
39 changed files with 4695 additions and 494 deletions
|
|
@ -120,6 +120,9 @@ export default class extends Controller {
|
||||||
|
|
||||||
this._autocomplete = autocomplete({
|
this._autocomplete = autocomplete({
|
||||||
container: this.element,
|
container: this.element,
|
||||||
|
initialState: {
|
||||||
|
query: this.element.dataset.initialQuery || that.inputTarget.value || ""
|
||||||
|
},
|
||||||
//Place the panel in the navbar, if the element is in navbar mode
|
//Place the panel in the navbar, if the element is in navbar mode
|
||||||
panelContainer: navbar_mode ? document.getElementById("navbar-search-form") : document.body,
|
panelContainer: navbar_mode ? document.getElementById("navbar-search-form") : document.body,
|
||||||
panelPlacement: this.element.dataset.panelPlacement,
|
panelPlacement: this.element.dataset.panelPlacement,
|
||||||
|
|
@ -162,7 +165,10 @@ export default class extends Controller {
|
||||||
}
|
}
|
||||||
|
|
||||||
input.value = state.query;
|
input.value = state.query;
|
||||||
|
|
||||||
|
if (input.form) {
|
||||||
input.form.requestSubmit();
|
input.form.requestSubmit();
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
getSources({ query }) {
|
getSources({ query }) {
|
||||||
|
|
|
||||||
76
assets/controllers/elements/search_options_controller.js
Normal file
76
assets/controllers/elements/search_options_controller.js
Normal file
|
|
@ -0,0 +1,76 @@
|
||||||
|
import { Controller } from "@hotwired/stimulus";
|
||||||
|
|
||||||
|
export default class extends Controller {
|
||||||
|
static targets = ["datasource", "partOptions", "assemblyOptions", "projectOptions", "divider"];
|
||||||
|
static values = {
|
||||||
|
isSearchList: Boolean
|
||||||
|
};
|
||||||
|
|
||||||
|
connect() {
|
||||||
|
// Delay update slightly to ensure all child controllers are connected and DOM is ready
|
||||||
|
setTimeout(() => {
|
||||||
|
this.updateVisibility();
|
||||||
|
}, 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
onDatasourceChange() {
|
||||||
|
this.updateVisibility();
|
||||||
|
}
|
||||||
|
|
||||||
|
updateVisibility() {
|
||||||
|
if (!this.hasDatasourceTarget) return;
|
||||||
|
|
||||||
|
const datasource = this.datasourceTarget.value;
|
||||||
|
const isSearchList = this.isSearchListValue;
|
||||||
|
const isPart = (datasource === "parts");
|
||||||
|
const isAssembly = (datasource === "assemblies");
|
||||||
|
const isProject = (datasource === "projects");
|
||||||
|
|
||||||
|
if (this.hasPartOptionsTarget) {
|
||||||
|
this.toggleOptions(this.partOptionsTarget, isPart, isSearchList);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.hasAssemblyOptionsTarget) {
|
||||||
|
this.toggleOptions(this.assemblyOptionsTarget, isAssembly, isSearchList);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.hasProjectOptionsTarget) {
|
||||||
|
this.toggleOptions(this.projectOptionsTarget, isProject, isSearchList);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.hasDividerTarget) {
|
||||||
|
this.dividerTarget.classList.toggle("d-none", !isPart && !isAssembly && !isProject);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
toggleOptions(container, show, isSearchList) {
|
||||||
|
const wasHidden = container.classList.contains("d-none");
|
||||||
|
container.classList.toggle("d-none", !show);
|
||||||
|
|
||||||
|
const checkboxes = container.querySelectorAll('input[type="checkbox"]');
|
||||||
|
if (!show) {
|
||||||
|
// Deselect checkboxes if not in correct mode
|
||||||
|
checkboxes.forEach(checkbox => {
|
||||||
|
// Store current state to restore it later if the user switches back
|
||||||
|
if (checkbox.checked) {
|
||||||
|
checkbox.dataset.previousState = "true";
|
||||||
|
checkbox.checked = false;
|
||||||
|
// Trigger a change event to update sessionStorage via the sessionStorage_checkbox controller
|
||||||
|
// We use a CustomEvent to pass the skipStorage flag
|
||||||
|
checkbox.dispatchEvent(new CustomEvent('change', { bubbles: true, detail: { skipStorage: true } }));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else if (wasHidden) {
|
||||||
|
// Restore state when switching back
|
||||||
|
checkboxes.forEach(checkbox => {
|
||||||
|
// Restore state if NOT on search list
|
||||||
|
// On search list, we don't restore to avoid overwriting Twig's checked state
|
||||||
|
if (!isSearchList && checkbox.dataset.previousState === "true") {
|
||||||
|
checkbox.checked = true;
|
||||||
|
checkbox.dispatchEvent(new CustomEvent('change', { bubbles: true, detail: { skipStorage: true } }));
|
||||||
|
}
|
||||||
|
delete checkbox.dataset.previousState;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,81 @@
|
||||||
|
/*
|
||||||
|
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019 - 2023 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {Controller} from "@hotwired/stimulus";
|
||||||
|
|
||||||
|
export default class extends Controller
|
||||||
|
{
|
||||||
|
static values = {
|
||||||
|
id: String,
|
||||||
|
isSearchList: Boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
connect() {
|
||||||
|
if (this.isSearchListValue) {
|
||||||
|
// If we are on the search list, we want to update the localStorage with the current (server-side) state
|
||||||
|
// to ensure consistency.
|
||||||
|
this.saveState();
|
||||||
|
} else {
|
||||||
|
// Otherwise, we load the state from localStorage.
|
||||||
|
this.loadState();
|
||||||
|
}
|
||||||
|
this.element.addEventListener('change', (event) => {
|
||||||
|
// Don't save state if we are currently being toggled by the search_options controller
|
||||||
|
// to avoid saving "unchecked" states when options are hidden.
|
||||||
|
// CustomEvent's detail property contains the data we passed.
|
||||||
|
if (event instanceof CustomEvent && event.detail && event.detail.skipStorage) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.saveState()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
loadState() {
|
||||||
|
let storageKey = this.getStorageKey();
|
||||||
|
let value = localStorage.getItem(storageKey);
|
||||||
|
if (value === null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value === 'true') {
|
||||||
|
this.element.checked = true
|
||||||
|
}
|
||||||
|
if (value === 'false') {
|
||||||
|
this.element.checked = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
saveState() {
|
||||||
|
let storageKey = this.getStorageKey();
|
||||||
|
|
||||||
|
if (this.element.checked) {
|
||||||
|
localStorage.setItem(storageKey, 'true');
|
||||||
|
} else {
|
||||||
|
localStorage.setItem(storageKey, 'false');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getStorageKey() {
|
||||||
|
if (this.hasIdValue) {
|
||||||
|
return 'persistent_checkbox_' + this.idValue
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'persistent_checkbox_' + this.element.id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -34,6 +34,10 @@ export default class extends Controller {
|
||||||
/** @type {HTMLFormElement} */
|
/** @type {HTMLFormElement} */
|
||||||
const form = event.target.closest('form');
|
const form = event.target.closest('form');
|
||||||
|
|
||||||
|
if (!form) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for(const element of form.elements) {
|
for(const element of form.elements) {
|
||||||
if(! element.value) {
|
if(! element.value) {
|
||||||
element.disabled = true;
|
element.disabled = true;
|
||||||
|
|
@ -53,6 +57,11 @@ export default class extends Controller {
|
||||||
clearAll(event)
|
clearAll(event)
|
||||||
{
|
{
|
||||||
const form = event.target.closest('form');
|
const form = event.target.closest('form');
|
||||||
|
|
||||||
|
if (!form) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for(const element of form.elements) {
|
for(const element of form.elements) {
|
||||||
// Do not clear elements with data-no-clear attribute
|
// Do not clear elements with data-no-clear attribute
|
||||||
if(element.dataset.noClear) {
|
if(element.dataset.noClear) {
|
||||||
|
|
|
||||||
|
|
@ -147,6 +147,9 @@ bundled with Part-DB. Set `DATABASE_MYSQL_SSL_VERIFY_CERT` if you want to accept
|
||||||
time).
|
time).
|
||||||
Also specify the default order of the columns. This is a comma separated list of column names. Available columns
|
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`, `partCustomState`, `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`.
|
||||||
|
* `TABLE_PROJECTS_DEFAULT_COLUMNS`: The columns in projects 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`, `description`, `notes`, `edit`, `addedDate`, `lastModified`.
|
||||||
* `TABLE_ASSEMBLIES_DEFAULT_COLUMNS`: The columns in assemblies tables, which are visible by default (when loading table for first time).
|
* `TABLE_ASSEMBLIES_DEFAULT_COLUMNS`: The columns in assemblies 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
|
Also specify the default order of the columns. This is a comma separated list of column names. Available columns
|
||||||
are: `name`, `id`, `ipn`, `description`, `referencedAssemblies`, `edit`, `addedDate`, `lastModified`.
|
are: `name`, `id`, `ipn`, `description`, `referencedAssemblies`, `edit`, `addedDate`, `lastModified`.
|
||||||
|
|
|
||||||
|
|
@ -24,8 +24,17 @@ namespace App\Controller;
|
||||||
|
|
||||||
use App\DataTables\ErrorDataTable;
|
use App\DataTables\ErrorDataTable;
|
||||||
use App\DataTables\Filters\PartFilter;
|
use App\DataTables\Filters\PartFilter;
|
||||||
|
use App\DataTables\Filters\AssemblyFilter;
|
||||||
|
use App\DataTables\Filters\ProjectFilter;
|
||||||
|
use App\DataTables\AssemblyDataTable;
|
||||||
|
use App\DataTables\Filters\AssemblySearchFilter;
|
||||||
use App\DataTables\Filters\PartSearchFilter;
|
use App\DataTables\Filters\PartSearchFilter;
|
||||||
|
use App\DataTables\Filters\ProjectSearchFilter;
|
||||||
|
use App\Form\Filters\AssemblyFilterType;
|
||||||
|
use App\Form\Filters\PartFilterType;
|
||||||
|
use App\Form\Filters\ProjectFilterType;
|
||||||
use App\DataTables\PartsDataTable;
|
use App\DataTables\PartsDataTable;
|
||||||
|
use App\DataTables\ProjectSearchDataTable;
|
||||||
use App\Entity\Parts\Category;
|
use App\Entity\Parts\Category;
|
||||||
use App\Entity\Parts\Footprint;
|
use App\Entity\Parts\Footprint;
|
||||||
use App\Entity\Parts\Manufacturer;
|
use App\Entity\Parts\Manufacturer;
|
||||||
|
|
@ -33,7 +42,6 @@ use App\Entity\Parts\Part;
|
||||||
use App\Entity\Parts\StorageLocation;
|
use App\Entity\Parts\StorageLocation;
|
||||||
use App\Entity\Parts\Supplier;
|
use App\Entity\Parts\Supplier;
|
||||||
use App\Exceptions\InvalidRegexException;
|
use App\Exceptions\InvalidRegexException;
|
||||||
use App\Form\Filters\PartFilterType;
|
|
||||||
use App\Services\Parts\PartsTableActionHandler;
|
use App\Services\Parts\PartsTableActionHandler;
|
||||||
use App\Services\Trees\NodesListBuilder;
|
use App\Services\Trees\NodesListBuilder;
|
||||||
use App\Settings\BehaviorSettings\SidebarSettings;
|
use App\Settings\BehaviorSettings\SidebarSettings;
|
||||||
|
|
@ -160,25 +168,52 @@ class PartListsController extends AbstractController
|
||||||
|
|
||||||
$formRequest = clone $request;
|
$formRequest = clone $request;
|
||||||
$formRequest->setMethod('GET');
|
$formRequest->setMethod('GET');
|
||||||
|
|
||||||
|
$filterType = $additional_table_vars['filterType'] ?? PartFilter::class;
|
||||||
|
unset($additional_table_vars['filterType']);
|
||||||
|
|
||||||
|
if ($filterType === PartFilter::class) {
|
||||||
$filter = new PartFilter($this->nodesListBuilder);
|
$filter = new PartFilter($this->nodesListBuilder);
|
||||||
if($filter_changer !== null){
|
} elseif ($filterType === AssemblyFilter::class) {
|
||||||
|
$filter = new AssemblyFilter($this->nodesListBuilder);
|
||||||
|
} elseif ($filterType === ProjectFilter::class) {
|
||||||
|
$filter = new ProjectFilter($this->nodesListBuilder);
|
||||||
|
} else {
|
||||||
|
$filter = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($filter !== null && $filter_changer !== null) {
|
||||||
$filter_changer($filter);
|
$filter_changer($filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
//If we are in a post request for the tables, we only have to apply the filter form if the submit query param was set
|
//If we are in a post request for the tables, we only have to apply the filter form if the submit query param was set
|
||||||
//This saves us some time from creating this complicated term on simple list pages, where no special filter is applied
|
//This saves us some time from creating this complicated term on simple list pages, where no special filter is applied
|
||||||
$filterForm = null;
|
$filterForm = null;
|
||||||
if ($request->getMethod() !== 'POST' || $request->query->has('part_filter')) {
|
if ($request->getMethod() !== 'POST' || $request->query->has('part_filter') || $request->query->has('assembly_filter') || $request->query->has('project_filter') || $request->query->has('submit')) {
|
||||||
$filterForm = $this->createForm(PartFilterType::class, $filter, ['method' => 'GET']);
|
$formType = match ($filterType) {
|
||||||
|
PartFilter::class => PartFilterType::class,
|
||||||
|
AssemblyFilter::class => AssemblyFilterType::class,
|
||||||
|
ProjectFilter::class => ProjectFilterType::class,
|
||||||
|
default => null,
|
||||||
|
};
|
||||||
|
|
||||||
|
if ($formType !== null) {
|
||||||
|
$filterForm = $this->createForm($formType, $filter, ['method' => 'GET']);
|
||||||
if ($form_changer !== null) {
|
if ($form_changer !== null) {
|
||||||
$form_changer($filterForm);
|
$form_changer($filterForm);
|
||||||
}
|
}
|
||||||
|
|
||||||
$filterForm->handleRequest($formRequest);
|
$filterForm->handleRequest($formRequest);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$table = $this->dataTableFactory->createFromType(PartsDataTable::class, array_merge(
|
$dataTableType = $additional_table_vars['dataTableType'] ?? PartsDataTable::class;
|
||||||
['filter' => $filter], $additional_table_vars),
|
unset($additional_table_vars['dataTableType']);
|
||||||
|
|
||||||
|
$tableOptions = array_merge(
|
||||||
|
['filter' => $filter], $additional_table_vars);
|
||||||
|
|
||||||
|
$table = $this->dataTableFactory->createFromType($dataTableType, $tableOptions,
|
||||||
['pageLength' => $this->tableSettings->fullDefaultPageSize, 'lengthMenu' => PartsDataTable::LENGTH_MENU])
|
['pageLength' => $this->tableSettings->fullDefaultPageSize, 'lengthMenu' => PartsDataTable::LENGTH_MENU])
|
||||||
->handleRequest($request);
|
->handleRequest($request);
|
||||||
|
|
||||||
|
|
@ -313,11 +348,70 @@ class PartListsController extends AbstractController
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function searchRequestToFilter(Request $request): PartSearchFilter
|
/**
|
||||||
|
* @return PartSearchFilter|AssemblySearchFilter|ProjectSearchFilter
|
||||||
|
*/
|
||||||
|
private function searchRequestToFilter(Request $request): object
|
||||||
{
|
{
|
||||||
$filter = new PartSearchFilter($request->query->get('keyword', ''));
|
$datasource = $request->query->get('datasource', 'parts');
|
||||||
|
$keyword = $request->query->get('keyword', '');
|
||||||
|
|
||||||
|
if ($datasource === 'assemblies') {
|
||||||
|
$filter = new AssemblySearchFilter($keyword);
|
||||||
|
$filter->setDatasource($datasource);
|
||||||
|
$filter->setRegex($request->query->getBoolean('regex'));
|
||||||
|
|
||||||
//As an unchecked checkbox is not set in the query, the default value for all bools have to be false (which is the default argument value)!
|
//As an unchecked checkbox is not set in the query, the default value for all bools have to be false (which is the default argument value)!
|
||||||
|
//But if we are coming from a simple search (without search options set), we want to search in all fields by default
|
||||||
|
if ($request->query->has('name') || $request->query->has('description') || $request->query->has('comment') || $request->query->has('ipn') || $request->query->has('category') || $request->query->has('status') || $request->query->has('dbid')) {
|
||||||
|
$filter->setName($request->query->getBoolean('name'));
|
||||||
|
$filter->setDescription($request->query->getBoolean('description'));
|
||||||
|
$filter->setComment($request->query->getBoolean('comment') || $request->query->getBoolean('notes'));
|
||||||
|
$filter->setIPN($request->query->getBoolean('ipn'));
|
||||||
|
$filter->setCategory($request->query->getBoolean('category'));
|
||||||
|
$filter->setStatus($request->query->getBoolean('status'));
|
||||||
|
$filter->setDbId($request->query->getBoolean('dbid'));
|
||||||
|
} else {
|
||||||
|
//Simple search: search in all fields
|
||||||
|
$filter->setName(true);
|
||||||
|
$filter->setDescription(true);
|
||||||
|
$filter->setComment(true);
|
||||||
|
$filter->setIPN(true);
|
||||||
|
$filter->setStatus(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $filter;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($datasource === 'projects') {
|
||||||
|
$filter = new ProjectSearchFilter($keyword);
|
||||||
|
$filter->setDatasource($datasource);
|
||||||
|
$filter->setRegex($request->query->getBoolean('regex'));
|
||||||
|
|
||||||
|
//As an unchecked checkbox is not set in the query, the default value for all bools have to be false (which is the default argument value)!
|
||||||
|
if ($request->query->has('name') || $request->query->has('description') || $request->query->has('comment') || $request->query->has('notes') || $request->query->has('category') || $request->query->has('status') || $request->query->has('dbid')) {
|
||||||
|
$filter->setName($request->query->getBoolean('name'));
|
||||||
|
$filter->setDescription($request->query->getBoolean('description'));
|
||||||
|
$filter->setComment($request->query->getBoolean('comment') || $request->query->getBoolean('notes'));
|
||||||
|
$filter->setCategory($request->query->getBoolean('category'));
|
||||||
|
$filter->setStatus($request->query->getBoolean('status'));
|
||||||
|
$filter->setDbId($request->query->getBoolean('dbid'));
|
||||||
|
} else {
|
||||||
|
//Simple search: search in all fields
|
||||||
|
$filter->setName(true);
|
||||||
|
$filter->setDescription(true);
|
||||||
|
$filter->setComment(true);
|
||||||
|
$filter->setStatus(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $filter;
|
||||||
|
}
|
||||||
|
|
||||||
|
$filter = new PartSearchFilter($keyword);
|
||||||
|
$filter->setDatasource($datasource);
|
||||||
|
|
||||||
|
//As an unchecked checkbox is not set in the query, the default value for all bools have to be false (which is the default argument value)!
|
||||||
|
if ($request->query->has('name') || $request->query->has('description') || $request->query->has('comment') || $request->query->has('ipn') || $request->query->has('category') || $request->query->has('dbid') || $request->query->has('mpn') || $request->query->has('tags') || $request->query->has('storelocation') || $request->query->has('ordernr') || $request->query->has('supplier') || $request->query->has('manufacturer') || $request->query->has('footprint') || $request->query->has('assembly') || $request->query->has('manufacturing_status')) {
|
||||||
$filter->setName($request->query->getBoolean('name'));
|
$filter->setName($request->query->getBoolean('name'));
|
||||||
$filter->setDbId($request->query->getBoolean('dbid'));
|
$filter->setDbId($request->query->getBoolean('dbid'));
|
||||||
$filter->setCategory($request->query->getBoolean('category'));
|
$filter->setCategory($request->query->getBoolean('category'));
|
||||||
|
|
@ -326,12 +420,27 @@ class PartListsController extends AbstractController
|
||||||
$filter->setTags($request->query->getBoolean('tags'));
|
$filter->setTags($request->query->getBoolean('tags'));
|
||||||
$filter->setStorelocation($request->query->getBoolean('storelocation'));
|
$filter->setStorelocation($request->query->getBoolean('storelocation'));
|
||||||
$filter->setComment($request->query->getBoolean('comment'));
|
$filter->setComment($request->query->getBoolean('comment'));
|
||||||
|
$filter->setManufacturingStatus($request->query->getBoolean('manufacturing_status'));
|
||||||
$filter->setIPN($request->query->getBoolean('ipn'));
|
$filter->setIPN($request->query->getBoolean('ipn'));
|
||||||
$filter->setOrdernr($request->query->getBoolean('ordernr'));
|
$filter->setOrdernr($request->query->getBoolean('ordernr'));
|
||||||
$filter->setSupplier($request->query->getBoolean('supplier'));
|
$filter->setSupplier($request->query->getBoolean('supplier'));
|
||||||
$filter->setManufacturer($request->query->getBoolean('manufacturer'));
|
$filter->setManufacturer($request->query->getBoolean('manufacturer'));
|
||||||
$filter->setFootprint($request->query->getBoolean('footprint'));
|
$filter->setFootprint($request->query->getBoolean('footprint'));
|
||||||
$filter->setAssembly($request->query->getBoolean('assembly'));
|
$filter->setAssembly($request->query->getBoolean('assembly'));
|
||||||
|
} else {
|
||||||
|
//Simple search: search in all fields
|
||||||
|
$filter->setName(true);
|
||||||
|
$filter->setCategory(true);
|
||||||
|
$filter->setDescription(true);
|
||||||
|
$filter->setComment(true);
|
||||||
|
$filter->setManufacturingStatus(true);
|
||||||
|
$filter->setTags(true);
|
||||||
|
$filter->setStorelocation(true);
|
||||||
|
$filter->setOrdernr(true);
|
||||||
|
$filter->setMpn(true);
|
||||||
|
$filter->setIPN(true);
|
||||||
|
$filter->setAssembly(true);
|
||||||
|
}
|
||||||
|
|
||||||
$filter->setRegex($request->query->getBoolean('regex'));
|
$filter->setRegex($request->query->getBoolean('regex'));
|
||||||
|
|
||||||
|
|
@ -342,17 +451,34 @@ class PartListsController extends AbstractController
|
||||||
public function showSearch(Request $request, DataTableFactory $dataTable): Response
|
public function showSearch(Request $request, DataTableFactory $dataTable): Response
|
||||||
{
|
{
|
||||||
$searchFilter = $this->searchRequestToFilter($request);
|
$searchFilter = $this->searchRequestToFilter($request);
|
||||||
|
$datasource = $request->query->get('datasource', 'parts');
|
||||||
|
|
||||||
|
$dataTableType = PartsDataTable::class;
|
||||||
|
$template = 'parts/lists/search_list.html.twig';
|
||||||
|
$filterType = PartFilter::class;
|
||||||
|
|
||||||
|
if ($searchFilter instanceof AssemblySearchFilter) {
|
||||||
|
$dataTableType = AssemblyDataTable::class;
|
||||||
|
$filterType = AssemblyFilter::class;
|
||||||
|
} elseif ($searchFilter instanceof ProjectSearchFilter) {
|
||||||
|
$dataTableType = ProjectSearchDataTable::class;
|
||||||
|
$filterType = ProjectFilter::class;
|
||||||
|
}
|
||||||
|
|
||||||
return $this->showListWithFilter($request,
|
return $this->showListWithFilter($request,
|
||||||
'parts/lists/search_list.html.twig',
|
$template,
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
[
|
[
|
||||||
'keyword' => $searchFilter->getKeyword(),
|
'keyword' => $searchFilter->getKeyword(),
|
||||||
'searchFilter' => $searchFilter,
|
'searchFilter' => $searchFilter,
|
||||||
|
'dataTableType' => $dataTableType,
|
||||||
|
'datasource' => $datasource,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'search' => $searchFilter,
|
'search' => $searchFilter,
|
||||||
|
'dataTableType' => $dataTableType,
|
||||||
|
'filterType' => $filterType,
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -136,7 +136,7 @@ class TypeaheadController extends AbstractController
|
||||||
|
|
||||||
$partRepository = $entityManager->getRepository(Part::class);
|
$partRepository = $entityManager->getRepository(Part::class);
|
||||||
|
|
||||||
$parts = $partRepository->autocompleteSearch($query, 100);
|
$parts = $partRepository->autocompleteSearch($query, 10);
|
||||||
|
|
||||||
/** @var Part[]|Assembly[] $data */
|
/** @var Part[]|Assembly[] $data */
|
||||||
$data = [];
|
$data = [];
|
||||||
|
|
@ -167,7 +167,7 @@ class TypeaheadController extends AbstractController
|
||||||
if ($this->isGranted('@projects.read')) {
|
if ($this->isGranted('@projects.read')) {
|
||||||
$projectRepository = $entityManager->getRepository(Project::class);
|
$projectRepository = $entityManager->getRepository(Project::class);
|
||||||
|
|
||||||
$projects = $projectRepository->autocompleteSearch($query, 100);
|
$projects = $projectRepository->autocompleteSearch($query, 10);
|
||||||
|
|
||||||
foreach ($projects as $project) {
|
foreach ($projects as $project) {
|
||||||
$preview_attachment = $projectPreviewGenerator->getTablePreviewAttachment($project);
|
$preview_attachment = $projectPreviewGenerator->getTablePreviewAttachment($project);
|
||||||
|
|
@ -194,7 +194,7 @@ class TypeaheadController extends AbstractController
|
||||||
if ($this->isGranted('@assemblies.read')) {
|
if ($this->isGranted('@assemblies.read')) {
|
||||||
$assemblyRepository = $entityManager->getRepository(Assembly::class);
|
$assemblyRepository = $entityManager->getRepository(Assembly::class);
|
||||||
|
|
||||||
$assemblies = $assemblyRepository->autocompleteSearch($query, 100);
|
$assemblies = $assemblyRepository->autocompleteSearch($query, 10);
|
||||||
|
|
||||||
foreach ($assemblies as $assembly) {
|
foreach ($assemblies as $assembly) {
|
||||||
$preview_attachment = $assemblyPreviewGenerator->getTablePreviewAttachment($assembly);
|
$preview_attachment = $assemblyPreviewGenerator->getTablePreviewAttachment($assembly);
|
||||||
|
|
|
||||||
|
|
@ -82,6 +82,8 @@ final class AssemblyDataTable implements DataTableTypeInterface
|
||||||
'label' => '',
|
'label' => '',
|
||||||
'className' => 'no-colvis',
|
'className' => 'no-colvis',
|
||||||
'render' => fn($value, Assembly $context) => $this->assemblyDataTableHelper->renderPicture($context),
|
'render' => fn($value, Assembly $context) => $this->assemblyDataTableHelper->renderPicture($context),
|
||||||
|
'orderable' => false,
|
||||||
|
'searchable' => false,
|
||||||
], visibility_configurable: false)
|
], visibility_configurable: false)
|
||||||
->add('name', TextColumn::class, [
|
->add('name', TextColumn::class, [
|
||||||
'label' => $this->translator->trans('assembly.table.name'),
|
'label' => $this->translator->trans('assembly.table.name'),
|
||||||
|
|
@ -98,6 +100,10 @@ final class AssemblyDataTable implements DataTableTypeInterface
|
||||||
->add('description', MarkdownColumn::class, [
|
->add('description', MarkdownColumn::class, [
|
||||||
'label' => $this->translator->trans('assembly.table.description'),
|
'label' => $this->translator->trans('assembly.table.description'),
|
||||||
])
|
])
|
||||||
|
->add('comment', MarkdownColumn::class, [
|
||||||
|
'label' => $this->translator->trans('assembly.table.comment'),
|
||||||
|
'render' => fn($value, Assembly $context) => $context->getComment()
|
||||||
|
])
|
||||||
->add('addedDate', LocaleDateTimeColumn::class, [
|
->add('addedDate', LocaleDateTimeColumn::class, [
|
||||||
'label' => $this->translator->trans('assembly.table.addedDate'),
|
'label' => $this->translator->trans('assembly.table.addedDate'),
|
||||||
])
|
])
|
||||||
|
|
@ -222,11 +228,23 @@ final class AssemblyDataTable implements DataTableTypeInterface
|
||||||
//The join fields get prefixed with an underscore, so we can check if they are used in the query easy without confusing them for a assembly subfield
|
//The join fields get prefixed with an underscore, so we can check if they are used in the query easy without confusing them for a assembly subfield
|
||||||
$dql = $builder->getDQL();
|
$dql = $builder->getDQL();
|
||||||
|
|
||||||
if (str_contains($dql, '_master_picture_attachment')) {
|
//Helper function to check if a join alias is already present in the QueryBuilder
|
||||||
|
$hasJoin = static function (QueryBuilder $qb, string $alias): bool {
|
||||||
|
foreach ($qb->getDQLPart('join') as $joins) {
|
||||||
|
foreach ($joins as $join) {
|
||||||
|
if ($join->getAlias() === $alias) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (str_contains($dql, '_master_picture_attachment') && !$hasJoin($builder, '_master_picture_attachment')) {
|
||||||
$builder->leftJoin('assembly.master_picture_attachment', '_master_picture_attachment');
|
$builder->leftJoin('assembly.master_picture_attachment', '_master_picture_attachment');
|
||||||
$builder->addGroupBy('_master_picture_attachment');
|
$builder->addGroupBy('_master_picture_attachment');
|
||||||
}
|
}
|
||||||
if (str_contains($dql, '_attachments')) {
|
if (str_contains($dql, '_attachments') && !$hasJoin($builder, '_attachments')) {
|
||||||
$builder->leftJoin('assembly.attachments', '_attachments');
|
$builder->leftJoin('assembly.attachments', '_attachments');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,10 +22,12 @@ declare(strict_types=1);
|
||||||
*/
|
*/
|
||||||
namespace App\DataTables\Filters;
|
namespace App\DataTables\Filters;
|
||||||
|
|
||||||
|
use App\DataTables\Filters\Constraints\ChoiceConstraint;
|
||||||
use App\DataTables\Filters\Constraints\DateTimeConstraint;
|
use App\DataTables\Filters\Constraints\DateTimeConstraint;
|
||||||
use App\DataTables\Filters\Constraints\EntityConstraint;
|
use App\DataTables\Filters\Constraints\EntityConstraint;
|
||||||
use App\DataTables\Filters\Constraints\IntConstraint;
|
use App\DataTables\Filters\Constraints\IntConstraint;
|
||||||
use App\DataTables\Filters\Constraints\TextConstraint;
|
use App\DataTables\Filters\Constraints\TextConstraint;
|
||||||
|
use App\Entity\AssemblySystem\Assembly;
|
||||||
use App\Entity\Attachments\AttachmentType;
|
use App\Entity\Attachments\AttachmentType;
|
||||||
use App\Services\Trees\NodesListBuilder;
|
use App\Services\Trees\NodesListBuilder;
|
||||||
use Doctrine\ORM\QueryBuilder;
|
use Doctrine\ORM\QueryBuilder;
|
||||||
|
|
@ -40,6 +42,8 @@ class AssemblyFilter implements FilterInterface
|
||||||
public readonly TextConstraint $name;
|
public readonly TextConstraint $name;
|
||||||
public readonly TextConstraint $description;
|
public readonly TextConstraint $description;
|
||||||
public readonly TextConstraint $comment;
|
public readonly TextConstraint $comment;
|
||||||
|
public readonly ChoiceConstraint $status;
|
||||||
|
public readonly EntityConstraint $category;
|
||||||
public readonly DateTimeConstraint $lastModified;
|
public readonly DateTimeConstraint $lastModified;
|
||||||
public readonly DateTimeConstraint $addedDate;
|
public readonly DateTimeConstraint $addedDate;
|
||||||
|
|
||||||
|
|
@ -52,6 +56,8 @@ class AssemblyFilter implements FilterInterface
|
||||||
$this->name = new TextConstraint('assembly.name');
|
$this->name = new TextConstraint('assembly.name');
|
||||||
$this->description = new TextConstraint('assembly.description');
|
$this->description = new TextConstraint('assembly.description');
|
||||||
$this->comment = new TextConstraint('assembly.comment');
|
$this->comment = new TextConstraint('assembly.comment');
|
||||||
|
$this->status = new ChoiceConstraint('assembly.status');
|
||||||
|
$this->category = new EntityConstraint($nodesListBuilder, Assembly::class, 'assembly.parent');
|
||||||
$this->dbId = new IntConstraint('assembly.id');
|
$this->dbId = new IntConstraint('assembly.id');
|
||||||
$this->ipn = new TextConstraint('assembly.ipn');
|
$this->ipn = new TextConstraint('assembly.ipn');
|
||||||
$this->addedDate = new DateTimeConstraint('assembly.addedDate');
|
$this->addedDate = new DateTimeConstraint('assembly.addedDate');
|
||||||
|
|
|
||||||
|
|
@ -30,19 +30,34 @@ class AssemblySearchFilter implements FilterInterface
|
||||||
protected bool $regex = false;
|
protected bool $regex = false;
|
||||||
|
|
||||||
/** @var bool Use name field for searching */
|
/** @var bool Use name field for searching */
|
||||||
protected bool $name = true;
|
protected bool $name = false;
|
||||||
|
|
||||||
/** @var bool Use description for searching */
|
/** @var bool Use description for searching */
|
||||||
protected bool $description = true;
|
protected bool $description = false;
|
||||||
|
|
||||||
/** @var bool Use comment field for searching */
|
/** @var bool Use comment field for searching */
|
||||||
protected bool $comment = true;
|
protected bool $comment = false;
|
||||||
|
|
||||||
/** @var bool Use ordernr for searching */
|
|
||||||
protected bool $ordernr = true;
|
|
||||||
|
|
||||||
/** @var bool Use Internal part number for searching */
|
/** @var bool Use Internal part number for searching */
|
||||||
protected bool $ipn = true;
|
protected bool $ipn = false;
|
||||||
|
|
||||||
|
/** @var bool Use id field for searching */
|
||||||
|
protected bool $dbId = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If true, we search in the name of the parent assembly (if available).
|
||||||
|
* This field is named "category" to keep the API consistent with PartSearchFilter,
|
||||||
|
* although assemblies don't have categories (they only have parents).
|
||||||
|
*/
|
||||||
|
protected bool $category = false;
|
||||||
|
|
||||||
|
/** @var bool Use status field for searching */
|
||||||
|
protected bool $status = false;
|
||||||
|
|
||||||
|
/** @var string The datasource used for searching */
|
||||||
|
protected string $datasource = 'assemblies';
|
||||||
|
|
||||||
|
protected static int $parameterCounter = 0;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
/** @var string The string to query for */
|
/** @var string The string to query for */
|
||||||
|
|
@ -51,6 +66,13 @@ class AssemblySearchFilter implements FilterInterface
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function generateParameterIdentifier(string $property): string
|
||||||
|
{
|
||||||
|
//Replace all special characters with underscores
|
||||||
|
$property = preg_replace('/\W/', '_', $property);
|
||||||
|
return $property . '_' . (self::$parameterCounter++) . '_';
|
||||||
|
}
|
||||||
|
|
||||||
protected function getFieldsToSearch(): array
|
protected function getFieldsToSearch(): array
|
||||||
{
|
{
|
||||||
$fields_to_search = [];
|
$fields_to_search = [];
|
||||||
|
|
@ -67,12 +89,41 @@ class AssemblySearchFilter implements FilterInterface
|
||||||
if ($this->ipn) {
|
if ($this->ipn) {
|
||||||
$fields_to_search[] = 'assembly.ipn';
|
$fields_to_search[] = 'assembly.ipn';
|
||||||
}
|
}
|
||||||
|
if ($this->status) {
|
||||||
|
$fields_to_search[] = 'assembly.status';
|
||||||
|
}
|
||||||
|
if ($this->dbId) {
|
||||||
|
$fields_to_search[] = 'assembly.id';
|
||||||
|
}
|
||||||
|
if ($this->category) {
|
||||||
|
// We search in the name of the parent assembly.
|
||||||
|
// This is named category for consistency with PartSearchFilter.
|
||||||
|
$fields_to_search[] = '_search_parent.name';
|
||||||
|
}
|
||||||
|
|
||||||
return $fields_to_search;
|
return $fields_to_search;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function apply(QueryBuilder $queryBuilder): void
|
public function apply(QueryBuilder $queryBuilder): void
|
||||||
{
|
{
|
||||||
|
if ($this->category) {
|
||||||
|
// We search in the parent assembly.
|
||||||
|
// Check if the join alias is already present in the QueryBuilder
|
||||||
|
$hasJoin = false;
|
||||||
|
foreach ($queryBuilder->getDQLPart('join') as $joins) {
|
||||||
|
foreach ($joins as $join) {
|
||||||
|
if ($join->getAlias() === '_search_parent') {
|
||||||
|
$hasJoin = true;
|
||||||
|
break 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$hasJoin) {
|
||||||
|
$queryBuilder->leftJoin('assembly.parent', '_search_parent');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$fields_to_search = $this->getFieldsToSearch();
|
$fields_to_search = $this->getFieldsToSearch();
|
||||||
|
|
||||||
//If we have nothing to search for, do nothing
|
//If we have nothing to search for, do nothing
|
||||||
|
|
@ -80,13 +131,15 @@ class AssemblySearchFilter implements FilterInterface
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$parameterIdentifier = $this->generateParameterIdentifier('search_query');
|
||||||
|
|
||||||
//Convert the fields to search to a list of expressions
|
//Convert the fields to search to a list of expressions
|
||||||
$expressions = array_map(function (string $field): string {
|
$expressions = array_map(function (string $field) use ($parameterIdentifier): string {
|
||||||
if ($this->regex) {
|
if ($this->regex) {
|
||||||
return sprintf("REGEXP(%s, :search_query) = TRUE", $field);
|
return sprintf("REGEXP(%s, :%s) = TRUE", $field, $parameterIdentifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
return sprintf("ILIKE(%s, :search_query) = TRUE", $field);
|
return sprintf("ILIKE(%s, :%s) = TRUE", $field, $parameterIdentifier);
|
||||||
}, $fields_to_search);
|
}, $fields_to_search);
|
||||||
|
|
||||||
//Add Or concatenation of the expressions to our query
|
//Add Or concatenation of the expressions to our query
|
||||||
|
|
@ -96,9 +149,11 @@ class AssemblySearchFilter implements FilterInterface
|
||||||
|
|
||||||
//For regex, we pass the query as is, for like we add % to the start and end as wildcards
|
//For regex, we pass the query as is, for like we add % to the start and end as wildcards
|
||||||
if ($this->regex) {
|
if ($this->regex) {
|
||||||
$queryBuilder->setParameter('search_query', $this->keyword);
|
$queryBuilder->setParameter($parameterIdentifier, $this->keyword);
|
||||||
} else {
|
} else {
|
||||||
$queryBuilder->setParameter('search_query', '%' . $this->keyword . '%');
|
//Escape % and _ characters in the keyword
|
||||||
|
$keyword_escaped = str_replace(['%', '_'], ['\%', '\_'], $this->keyword);
|
||||||
|
$queryBuilder->setParameter($parameterIdentifier, '%' . $keyword_escaped . '%');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -162,11 +217,137 @@ class AssemblySearchFilter implements FilterInterface
|
||||||
return $this->comment;
|
return $this->comment;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setComment(bool $comment): AssemblySearchFilter
|
public function setComment(bool $comment): self
|
||||||
{
|
{
|
||||||
$this->comment = $comment;
|
$this->comment = $comment;
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function isCategory(): bool
|
||||||
|
{
|
||||||
|
return $this->category;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set if the parent assembly name should be searched.
|
||||||
|
* This is named "category" for consistency with PartSearchFilter.
|
||||||
|
*/
|
||||||
|
public function setCategory(bool $category): self
|
||||||
|
{
|
||||||
|
$this->category = $category;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isStatus(): bool
|
||||||
|
{
|
||||||
|
return $this->status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setStatus(bool $status): self
|
||||||
|
{
|
||||||
|
$this->status = $status;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isMpn(): bool
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setMpn(bool $mpn): self
|
||||||
|
{
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isTags(): bool
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setTags(bool $tags): self
|
||||||
|
{
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isStorelocation(): bool
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setStorelocation(bool $storelocation): self
|
||||||
|
{
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isSupplier(): bool
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setSupplier(bool $supplier): self
|
||||||
|
{
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isManufacturer(): bool
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setManufacturer(bool $manufacturer): self
|
||||||
|
{
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isFootprint(): bool
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setFootprint(bool $footprint): self
|
||||||
|
{
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isDbId(): bool
|
||||||
|
{
|
||||||
|
return $this->dbId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setDbId(bool $dbId): self
|
||||||
|
{
|
||||||
|
$this->dbId = $dbId;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isAssembly(): bool
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setAssembly(bool $assembly): self
|
||||||
|
{
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isOrdernr(): bool
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setOrdernr(bool $ordernr): self
|
||||||
|
{
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getDatasource(): string
|
||||||
|
{
|
||||||
|
return $this->datasource;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setDatasource(string $datasource): self
|
||||||
|
{
|
||||||
|
$this->datasource = $datasource;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,31 +32,31 @@ class PartSearchFilter implements FilterInterface
|
||||||
protected bool $regex = false;
|
protected bool $regex = false;
|
||||||
|
|
||||||
/** @var bool Use name field for searching */
|
/** @var bool Use name field for searching */
|
||||||
protected bool $name = true;
|
protected bool $name = false;
|
||||||
|
|
||||||
/** @var bool Use id field for searching */
|
/** @var bool Use id field for searching */
|
||||||
protected bool $dbId = false;
|
protected bool $dbId = false;
|
||||||
|
|
||||||
/** @var bool Use category name for searching */
|
/** @var bool Use category name for searching */
|
||||||
protected bool $category = true;
|
protected bool $category = false;
|
||||||
|
|
||||||
/** @var bool Use description for searching */
|
/** @var bool Use description for searching */
|
||||||
protected bool $description = true;
|
protected bool $description = false;
|
||||||
|
|
||||||
/** @var bool Use tags for searching */
|
/** @var bool Use tags for searching */
|
||||||
protected bool $tags = true;
|
protected bool $tags = false;
|
||||||
|
|
||||||
/** @var bool Use storelocation name for searching */
|
/** @var bool Use storelocation name for searching */
|
||||||
protected bool $storelocation = true;
|
protected bool $storelocation = false;
|
||||||
|
|
||||||
/** @var bool Use comment field for searching */
|
/** @var bool Use comment field for searching */
|
||||||
protected bool $comment = true;
|
protected bool $comment = false;
|
||||||
|
|
||||||
/** @var bool Use ordernr for searching */
|
/** @var bool Use ordernr for searching */
|
||||||
protected bool $ordernr = true;
|
protected bool $ordernr = false;
|
||||||
|
|
||||||
/** @var bool Use manufacturer product name for searching */
|
/** @var bool Use manufacturer product name for searching */
|
||||||
protected bool $mpn = true;
|
protected bool $mpn = false;
|
||||||
|
|
||||||
/** @var bool Use supplier name for searching */
|
/** @var bool Use supplier name for searching */
|
||||||
protected bool $supplier = false;
|
protected bool $supplier = false;
|
||||||
|
|
@ -67,11 +67,19 @@ class PartSearchFilter implements FilterInterface
|
||||||
/** @var bool Use footprint name for searching */
|
/** @var bool Use footprint name for searching */
|
||||||
protected bool $footprint = false;
|
protected bool $footprint = false;
|
||||||
|
|
||||||
|
/** @var bool Use manufacturing status for searching */
|
||||||
|
protected bool $manufacturingStatus = false;
|
||||||
|
|
||||||
/** @var bool Use Internal Part number for searching */
|
/** @var bool Use Internal Part number for searching */
|
||||||
protected bool $ipn = true;
|
protected bool $ipn = false;
|
||||||
|
|
||||||
/** @var bool Use assembly name for searching */
|
/** @var bool Use assembly name for searching */
|
||||||
protected bool $assembly = true;
|
protected bool $assembly = false;
|
||||||
|
|
||||||
|
/** @var string The datasource used for searching */
|
||||||
|
protected string $datasource = 'parts';
|
||||||
|
|
||||||
|
protected static int $parameterCounter = 0;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
/** @var string The string to query for */
|
/** @var string The string to query for */
|
||||||
|
|
@ -80,6 +88,13 @@ class PartSearchFilter implements FilterInterface
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function generateParameterIdentifier(string $property): string
|
||||||
|
{
|
||||||
|
//Replace all special characters with underscores
|
||||||
|
$property = preg_replace('/\W/', '_', $property);
|
||||||
|
return $property . '_' . (self::$parameterCounter++) . '_';
|
||||||
|
}
|
||||||
|
|
||||||
protected function getFieldsToSearch(): array
|
protected function getFieldsToSearch(): array
|
||||||
{
|
{
|
||||||
$fields_to_search = [];
|
$fields_to_search = [];
|
||||||
|
|
@ -88,7 +103,7 @@ class PartSearchFilter implements FilterInterface
|
||||||
$fields_to_search[] = 'part.name';
|
$fields_to_search[] = 'part.name';
|
||||||
}
|
}
|
||||||
if($this->category) {
|
if($this->category) {
|
||||||
$fields_to_search[] = '_category.name';
|
$fields_to_search[] = '_search_category.name';
|
||||||
}
|
}
|
||||||
if($this->description) {
|
if($this->description) {
|
||||||
$fields_to_search[] = 'part.description';
|
$fields_to_search[] = 'part.description';
|
||||||
|
|
@ -100,29 +115,32 @@ class PartSearchFilter implements FilterInterface
|
||||||
$fields_to_search[] = 'part.tags';
|
$fields_to_search[] = 'part.tags';
|
||||||
}
|
}
|
||||||
if($this->storelocation) {
|
if($this->storelocation) {
|
||||||
$fields_to_search[] = '_storelocations.name';
|
$fields_to_search[] = '_search_storelocations.name';
|
||||||
}
|
}
|
||||||
if($this->ordernr) {
|
if($this->ordernr) {
|
||||||
$fields_to_search[] = '_orderdetails.supplierpartnr';
|
$fields_to_search[] = '_search_orderdetails.supplierpartnr';
|
||||||
}
|
}
|
||||||
if($this->mpn) {
|
if($this->mpn) {
|
||||||
$fields_to_search[] = 'part.manufacturer_product_number';
|
$fields_to_search[] = 'part.manufacturer_product_number';
|
||||||
}
|
}
|
||||||
if($this->supplier) {
|
if($this->supplier) {
|
||||||
$fields_to_search[] = '_suppliers.name';
|
$fields_to_search[] = '_search_suppliers.name';
|
||||||
}
|
}
|
||||||
if($this->manufacturer) {
|
if($this->manufacturer) {
|
||||||
$fields_to_search[] = '_manufacturer.name';
|
$fields_to_search[] = '_search_manufacturer.name';
|
||||||
}
|
}
|
||||||
if($this->footprint) {
|
if($this->footprint) {
|
||||||
$fields_to_search[] = '_footprint.name';
|
$fields_to_search[] = '_search_footprint.name';
|
||||||
|
}
|
||||||
|
if($this->manufacturingStatus) {
|
||||||
|
$fields_to_search[] = 'part.manufacturing_status';
|
||||||
}
|
}
|
||||||
if ($this->ipn) {
|
if ($this->ipn) {
|
||||||
$fields_to_search[] = 'part.ipn';
|
$fields_to_search[] = 'part.ipn';
|
||||||
}
|
}
|
||||||
if ($this->assembly) {
|
if ($this->assembly) {
|
||||||
$fields_to_search[] = '_assembly.name';
|
$fields_to_search[] = '_search_assembly.name';
|
||||||
$fields_to_search[] = '_assembly.ipn';
|
$fields_to_search[] = '_search_assembly.ipn';
|
||||||
}
|
}
|
||||||
|
|
||||||
return $fields_to_search;
|
return $fields_to_search;
|
||||||
|
|
@ -130,6 +148,33 @@ class PartSearchFilter implements FilterInterface
|
||||||
|
|
||||||
public function apply(QueryBuilder $queryBuilder): void
|
public function apply(QueryBuilder $queryBuilder): void
|
||||||
{
|
{
|
||||||
|
if ($this->category) {
|
||||||
|
$queryBuilder->leftJoin('part.category', '_search_category');
|
||||||
|
}
|
||||||
|
if ($this->storelocation) {
|
||||||
|
$queryBuilder->leftJoin('part.partLots', '_search_partLots')
|
||||||
|
->leftJoin('_search_partLots.storage_location', '_search_storelocations');
|
||||||
|
}
|
||||||
|
if ($this->ordernr) {
|
||||||
|
$queryBuilder->leftJoin('part.orderdetails', '_search_orderdetails');
|
||||||
|
}
|
||||||
|
if ($this->supplier) {
|
||||||
|
if (!$this->ordernr) {
|
||||||
|
$queryBuilder->leftJoin('part.orderdetails', '_search_orderdetails');
|
||||||
|
}
|
||||||
|
$queryBuilder->leftJoin('_search_orderdetails.supplier', '_search_suppliers');
|
||||||
|
}
|
||||||
|
if ($this->manufacturer) {
|
||||||
|
$queryBuilder->leftJoin('part.manufacturer', '_search_manufacturer');
|
||||||
|
}
|
||||||
|
if ($this->footprint) {
|
||||||
|
$queryBuilder->leftJoin('part.footprint', '_search_footprint');
|
||||||
|
}
|
||||||
|
if ($this->assembly) {
|
||||||
|
$queryBuilder->leftJoin('part.assembly_bom_entries', '_search_assemblyBomEntries')
|
||||||
|
->leftJoin('_search_assemblyBomEntries.assembly', '_search_assembly');
|
||||||
|
}
|
||||||
|
|
||||||
$fields_to_search = $this->getFieldsToSearch();
|
$fields_to_search = $this->getFieldsToSearch();
|
||||||
$is_numeric = preg_match('/^\d+$/', $this->keyword) === 1;
|
$is_numeric = preg_match('/^\d+$/', $this->keyword) === 1;
|
||||||
|
|
||||||
|
|
@ -141,32 +186,34 @@ class PartSearchFilter implements FilterInterface
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$parameterIdentifier = $this->generateParameterIdentifier('search_query');
|
||||||
$expressions = [];
|
$expressions = [];
|
||||||
|
|
||||||
if($fields_to_search !== []) {
|
if($fields_to_search !== []) {
|
||||||
//Convert the fields to search to a list of expressions
|
//Convert the fields to search to a list of expressions
|
||||||
$expressions = array_map(function (string $field): string {
|
$expressions = array_map(function (string $field) use ($parameterIdentifier): string {
|
||||||
if ($this->regex) {
|
if ($this->regex) {
|
||||||
return sprintf("REGEXP(%s, :search_query) = TRUE", $field);
|
return sprintf("REGEXP(%s, :%s) = TRUE", $field, $parameterIdentifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
return sprintf("ILIKE(%s, :search_query) = TRUE", $field);
|
return sprintf("ILIKE(%s, :%s) = TRUE", $field, $parameterIdentifier);
|
||||||
}, $fields_to_search);
|
}, $fields_to_search);
|
||||||
|
|
||||||
//For regex, we pass the query as is, for like we add % to the start and end as wildcards
|
//For regex, we pass the query as is, for like we add % to the start and end as wildcards
|
||||||
if ($this->regex) {
|
if ($this->regex) {
|
||||||
$queryBuilder->setParameter('search_query', $this->keyword);
|
$queryBuilder->setParameter($parameterIdentifier, $this->keyword);
|
||||||
} else {
|
} else {
|
||||||
//Escape % and _ characters in the keyword
|
//Escape % and _ characters in the keyword
|
||||||
$this->keyword = str_replace(['%', '_'], ['\%', '\_'], $this->keyword);
|
$keyword_escaped = str_replace(['%', '_'], ['\%', '\_'], $this->keyword);
|
||||||
$queryBuilder->setParameter('search_query', '%' . $this->keyword . '%');
|
$queryBuilder->setParameter($parameterIdentifier, '%' . $keyword_escaped . '%');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Use equal expression to just search for exact numeric matches
|
//Use equal expression to just search for exact numeric matches
|
||||||
if ($search_dbId) {
|
if ($search_dbId) {
|
||||||
$expressions[] = $queryBuilder->expr()->eq('part.id', ':id_exact');
|
$idParameterIdentifier = $this->generateParameterIdentifier('id_exact');
|
||||||
$queryBuilder->setParameter('id_exact', (int) $this->keyword,
|
$expressions[] = $queryBuilder->expr()->eq('part.id', ':' . $idParameterIdentifier);
|
||||||
|
$queryBuilder->setParameter($idParameterIdentifier, (int) $this->keyword,
|
||||||
ParameterType::INTEGER);
|
ParameterType::INTEGER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -333,6 +380,17 @@ class PartSearchFilter implements FilterInterface
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function isManufacturingStatus(): bool
|
||||||
|
{
|
||||||
|
return $this->manufacturingStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setManufacturingStatus(bool $manufacturingStatus): PartSearchFilter
|
||||||
|
{
|
||||||
|
$this->manufacturingStatus = $manufacturingStatus;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
public function isComment(): bool
|
public function isComment(): bool
|
||||||
{
|
{
|
||||||
return $this->comment;
|
return $this->comment;
|
||||||
|
|
@ -354,4 +412,31 @@ class PartSearchFilter implements FilterInterface
|
||||||
$this->assembly = $assembly;
|
$this->assembly = $assembly;
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dummy method for compatibility with assembly/project search options in Twig.
|
||||||
|
*/
|
||||||
|
public function isStatus(): bool
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dummy method for compatibility with assembly/project search options in Twig.
|
||||||
|
*/
|
||||||
|
public function setStatus(bool $status): PartSearchFilter
|
||||||
|
{
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getDatasource(): string
|
||||||
|
{
|
||||||
|
return $this->datasource;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setDatasource(string $datasource): PartSearchFilter
|
||||||
|
{
|
||||||
|
$this->datasource = $datasource;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
73
src/DataTables/Filters/ProjectFilter.php
Normal file
73
src/DataTables/Filters/ProjectFilter.php
Normal file
|
|
@ -0,0 +1,73 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019 - 2026 Jan Böhmer (https://github.com/jbtronics)
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published
|
||||||
|
* by the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace App\DataTables\Filters;
|
||||||
|
|
||||||
|
use App\DataTables\Filters\Constraints\ChoiceConstraint;
|
||||||
|
use App\DataTables\Filters\Constraints\DateTimeConstraint;
|
||||||
|
use App\DataTables\Filters\Constraints\EntityConstraint;
|
||||||
|
use App\DataTables\Filters\Constraints\IntConstraint;
|
||||||
|
use App\DataTables\Filters\Constraints\TextConstraint;
|
||||||
|
use App\Entity\Attachments\AttachmentType;
|
||||||
|
use App\Entity\ProjectSystem\Project;
|
||||||
|
use App\Services\Trees\NodesListBuilder;
|
||||||
|
use Doctrine\ORM\QueryBuilder;
|
||||||
|
|
||||||
|
class ProjectFilter implements FilterInterface
|
||||||
|
{
|
||||||
|
use CompoundFilterTrait;
|
||||||
|
|
||||||
|
public readonly IntConstraint $dbId;
|
||||||
|
public readonly TextConstraint $name;
|
||||||
|
public readonly TextConstraint $description;
|
||||||
|
public readonly TextConstraint $comment;
|
||||||
|
public readonly ChoiceConstraint $status;
|
||||||
|
public readonly EntityConstraint $category;
|
||||||
|
public readonly DateTimeConstraint $lastModified;
|
||||||
|
public readonly DateTimeConstraint $addedDate;
|
||||||
|
|
||||||
|
public readonly IntConstraint $attachmentsCount;
|
||||||
|
public readonly EntityConstraint $attachmentType;
|
||||||
|
public readonly TextConstraint $attachmentName;
|
||||||
|
|
||||||
|
public function __construct(NodesListBuilder $nodesListBuilder)
|
||||||
|
{
|
||||||
|
$this->name = new TextConstraint('project.name');
|
||||||
|
$this->description = new TextConstraint('project.description');
|
||||||
|
$this->comment = new TextConstraint('project.comment');
|
||||||
|
$this->status = new ChoiceConstraint('project.status');
|
||||||
|
$this->category = new EntityConstraint($nodesListBuilder, Project::class, 'project.parent');
|
||||||
|
$this->dbId = new IntConstraint('project.id');
|
||||||
|
$this->addedDate = new DateTimeConstraint('project.addedDate');
|
||||||
|
$this->lastModified = new DateTimeConstraint('project.lastModified');
|
||||||
|
|
||||||
|
$this->attachmentsCount = new IntConstraint('COUNT(_attachments)');
|
||||||
|
$this->attachmentType = new EntityConstraint($nodesListBuilder, AttachmentType::class, '_attachments.attachment_type');
|
||||||
|
$this->attachmentName = new TextConstraint('_attachments.name');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function apply(QueryBuilder $queryBuilder): void
|
||||||
|
{
|
||||||
|
$this->applyAllChildFilters($queryBuilder);
|
||||||
|
}
|
||||||
|
}
|
||||||
346
src/DataTables/Filters/ProjectSearchFilter.php
Normal file
346
src/DataTables/Filters/ProjectSearchFilter.php
Normal file
|
|
@ -0,0 +1,346 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019 - 2026 Jan Böhmer (https://github.com/jbtronics)
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published
|
||||||
|
* by the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace App\DataTables\Filters;
|
||||||
|
|
||||||
|
use Doctrine\ORM\QueryBuilder;
|
||||||
|
|
||||||
|
class ProjectSearchFilter implements FilterInterface
|
||||||
|
{
|
||||||
|
/** @var boolean Whether to use regex for searching */
|
||||||
|
protected bool $regex = false;
|
||||||
|
|
||||||
|
/** @var bool Use name field for searching */
|
||||||
|
protected bool $name = false;
|
||||||
|
|
||||||
|
/** @var bool Use description for searching */
|
||||||
|
protected bool $description = false;
|
||||||
|
|
||||||
|
/** @var bool Use comment field for searching */
|
||||||
|
protected bool $comment = false;
|
||||||
|
|
||||||
|
/** @var bool Use status field for searching */
|
||||||
|
protected bool $status = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If true, we search in the name of the parent project (if available).
|
||||||
|
* This field is named "category" to keep the API consistent with PartSearchFilter and AssemblySearchFilter,
|
||||||
|
* although projects don't have categories (they only have parents).
|
||||||
|
*/
|
||||||
|
protected bool $category = false;
|
||||||
|
|
||||||
|
/** @var bool Use dbId field for searching */
|
||||||
|
protected bool $dbId = false;
|
||||||
|
|
||||||
|
/** @var string The datasource used for searching */
|
||||||
|
protected string $datasource = 'projects';
|
||||||
|
|
||||||
|
protected static int $parameterCounter = 0;
|
||||||
|
|
||||||
|
public function __construct(
|
||||||
|
/** @var string The string to query for */
|
||||||
|
protected string $keyword
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function generateParameterIdentifier(string $property): string
|
||||||
|
{
|
||||||
|
//Replace all special characters with underscores
|
||||||
|
$property = preg_replace('/\W/', '_', $property);
|
||||||
|
return $property . '_' . (self::$parameterCounter++) . '_';
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getFieldsToSearch(): array
|
||||||
|
{
|
||||||
|
$fields_to_search = [];
|
||||||
|
|
||||||
|
if ($this->name) {
|
||||||
|
$fields_to_search[] = 'project.name';
|
||||||
|
}
|
||||||
|
if ($this->description) {
|
||||||
|
$fields_to_search[] = 'project.description';
|
||||||
|
}
|
||||||
|
if ($this->comment) {
|
||||||
|
$fields_to_search[] = 'project.comment';
|
||||||
|
}
|
||||||
|
if ($this->status) {
|
||||||
|
$fields_to_search[] = 'project.status';
|
||||||
|
}
|
||||||
|
if ($this->category) {
|
||||||
|
// We search in the name of the parent project.
|
||||||
|
// This is named category for consistency with PartSearchFilter and AssemblySearchFilter.
|
||||||
|
$fields_to_search[] = '_search_parent.name';
|
||||||
|
}
|
||||||
|
if ($this->dbId) {
|
||||||
|
$fields_to_search[] = 'project.id';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $fields_to_search;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function apply(QueryBuilder $queryBuilder): void
|
||||||
|
{
|
||||||
|
if ($this->category) {
|
||||||
|
// We search in the parent project.
|
||||||
|
// Check if the join alias is already present in the QueryBuilder
|
||||||
|
$hasJoin = false;
|
||||||
|
foreach ($queryBuilder->getDQLPart('join') as $joins) {
|
||||||
|
foreach ($joins as $join) {
|
||||||
|
if ($join->getAlias() === '_search_parent') {
|
||||||
|
$hasJoin = true;
|
||||||
|
break 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$hasJoin) {
|
||||||
|
$queryBuilder->leftJoin('project.parent', '_search_parent');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$fields_to_search = $this->getFieldsToSearch();
|
||||||
|
|
||||||
|
//If we have nothing to search for, do nothing
|
||||||
|
if ($fields_to_search === [] || $this->keyword === '') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$parameterIdentifier = $this->generateParameterIdentifier('search_query');
|
||||||
|
|
||||||
|
//Convert the fields to search to a list of expressions
|
||||||
|
$expressions = array_map(function (string $field) use ($parameterIdentifier): string {
|
||||||
|
if ($this->regex) {
|
||||||
|
return sprintf("REGEXP(%s, :%s) = TRUE", $field, $parameterIdentifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
return sprintf("ILIKE(%s, :%s) = TRUE", $field, $parameterIdentifier);
|
||||||
|
}, $fields_to_search);
|
||||||
|
|
||||||
|
//Add Or concatenation of the expressions to our query
|
||||||
|
$queryBuilder->andWhere(
|
||||||
|
$queryBuilder->expr()->orX(...$expressions)
|
||||||
|
);
|
||||||
|
|
||||||
|
//For regex, we pass the query as is, for like we add % to the start and end as wildcards
|
||||||
|
if ($this->regex) {
|
||||||
|
$queryBuilder->setParameter($parameterIdentifier, $this->keyword);
|
||||||
|
} else {
|
||||||
|
//Escape % and _ characters in the keyword
|
||||||
|
$keyword_escaped = str_replace(['%', '_'], ['\%', '\_'], $this->keyword);
|
||||||
|
$queryBuilder->setParameter($parameterIdentifier, '%' . $keyword_escaped . '%');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getKeyword(): string
|
||||||
|
{
|
||||||
|
return $this->keyword;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setKeyword(string $keyword): self
|
||||||
|
{
|
||||||
|
$this->keyword = $keyword;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isRegex(): bool
|
||||||
|
{
|
||||||
|
return $this->regex;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setRegex(bool $regex): self
|
||||||
|
{
|
||||||
|
$this->regex = $regex;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isName(): bool
|
||||||
|
{
|
||||||
|
return $this->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setName(bool $name): self
|
||||||
|
{
|
||||||
|
$this->name = $name;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isDescription(): bool
|
||||||
|
{
|
||||||
|
return $this->description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setDescription(bool $description): self
|
||||||
|
{
|
||||||
|
$this->description = $description;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isComment(): bool
|
||||||
|
{
|
||||||
|
return $this->comment;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setComment(bool $comment): self
|
||||||
|
{
|
||||||
|
$this->comment = $comment;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isStatus(): bool
|
||||||
|
{
|
||||||
|
return $this->status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setStatus(bool $status): self
|
||||||
|
{
|
||||||
|
$this->status = $status;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isCategory(): bool
|
||||||
|
{
|
||||||
|
return $this->category;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set if the parent project name should be searched.
|
||||||
|
* This is named "category" for consistency with PartSearchFilter and AssemblySearchFilter.
|
||||||
|
*/
|
||||||
|
public function setCategory(bool $category): self
|
||||||
|
{
|
||||||
|
$this->category = $category;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isMpn(): bool
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setMpn(bool $mpn): self
|
||||||
|
{
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isTags(): bool
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setTags(bool $tags): self
|
||||||
|
{
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isStorelocation(): bool
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setStorelocation(bool $storelocation): self
|
||||||
|
{
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isSupplier(): bool
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setSupplier(bool $supplier): self
|
||||||
|
{
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isManufacturer(): bool
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setManufacturer(bool $manufacturer): self
|
||||||
|
{
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isFootprint(): bool
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setFootprint(bool $footprint): self
|
||||||
|
{
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isDbId(): bool
|
||||||
|
{
|
||||||
|
return $this->dbId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setDbId(bool $dbId): self
|
||||||
|
{
|
||||||
|
$this->dbId = $dbId;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isAssembly(): bool
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setAssembly(bool $assembly): self
|
||||||
|
{
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isOrdernr(): bool
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setOrdernr(bool $ordernr): self
|
||||||
|
{
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isIPN(): bool
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setIPN(bool $ipn): self
|
||||||
|
{
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getDatasource(): string
|
||||||
|
{
|
||||||
|
return $this->datasource;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setDatasource(string $datasource): self
|
||||||
|
{
|
||||||
|
$this->datasource = $datasource;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
}
|
||||||
74
src/DataTables/Helpers/ProjectDataTableHelper.php
Normal file
74
src/DataTables/Helpers/ProjectDataTableHelper.php
Normal file
|
|
@ -0,0 +1,74 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019 - 2026 Jan Böhmer (https://github.com/jbtronics)
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published
|
||||||
|
* by the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace App\DataTables\Helpers;
|
||||||
|
|
||||||
|
use App\Entity\Attachments\Attachment;
|
||||||
|
use App\Entity\ProjectSystem\Project;
|
||||||
|
use App\Services\Attachments\AttachmentURLGenerator;
|
||||||
|
use App\Services\Attachments\ProjectPreviewGenerator;
|
||||||
|
use App\Services\EntityURLGenerator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A helper service which contains common code to render columns for project related tables
|
||||||
|
*/
|
||||||
|
class ProjectDataTableHelper
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
private readonly EntityURLGenerator $entityURLGenerator,
|
||||||
|
private readonly ProjectPreviewGenerator $previewGenerator,
|
||||||
|
private readonly AttachmentURLGenerator $attachmentURLGenerator
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public function renderName(Project $context): string
|
||||||
|
{
|
||||||
|
return sprintf(
|
||||||
|
'<a href="%s">%s</a>',
|
||||||
|
$this->entityURLGenerator->infoURL($context),
|
||||||
|
htmlspecialchars($context->getName())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function renderPicture(Project $context): string
|
||||||
|
{
|
||||||
|
$preview_attachment = $this->previewGenerator->getTablePreviewAttachment($context);
|
||||||
|
if (!$preview_attachment instanceof Attachment) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$title = htmlspecialchars($preview_attachment->getName());
|
||||||
|
if ($preview_attachment->getFilename()) {
|
||||||
|
$title .= ' ('.htmlspecialchars($preview_attachment->getFilename()).')';
|
||||||
|
}
|
||||||
|
|
||||||
|
return sprintf(
|
||||||
|
'<img alt="%s" src="%s" data-thumbnail="%s" class="%s" data-title="%s" data-controller="elements--hoverpic">',
|
||||||
|
'Project image',
|
||||||
|
$this->attachmentURLGenerator->getThumbnailURL($preview_attachment),
|
||||||
|
$this->attachmentURLGenerator->getThumbnailURL($preview_attachment, 'thumbnail_md'),
|
||||||
|
'hoverpic project-table-image',
|
||||||
|
$title
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -419,6 +419,18 @@ final class PartsDataTable implements DataTableTypeInterface
|
||||||
//The join fields get prefixed with an underscore, so we can check if they are used in the query easy without confusing them for a part subfield
|
//The join fields get prefixed with an underscore, so we can check if they are used in the query easy without confusing them for a part subfield
|
||||||
$dql = $builder->getDQL();
|
$dql = $builder->getDQL();
|
||||||
|
|
||||||
|
//Helper function to check if a join alias is already present in the QueryBuilder
|
||||||
|
$hasJoin = static function (QueryBuilder $qb, string $alias): bool {
|
||||||
|
foreach ($qb->getDQLPart('join') as $joins) {
|
||||||
|
foreach ($joins as $join) {
|
||||||
|
if ($join->getAlias() === $alias) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
//Add the amountSum field, if it is used in the query
|
//Add the amountSum field, if it is used in the query
|
||||||
if (str_contains($dql, 'amountSum')) {
|
if (str_contains($dql, 'amountSum')) {
|
||||||
//Calculate amount sum using a subquery, so we can filter and sort by it
|
//Calculate amount sum using a subquery, so we can filter and sort by it
|
||||||
|
|
@ -433,69 +445,85 @@ final class PartsDataTable implements DataTableTypeInterface
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (str_contains($dql, '_category')) {
|
if (str_contains($dql, '_category') && !$hasJoin($builder, '_category')) {
|
||||||
$builder->leftJoin('part.category', '_category');
|
$builder->leftJoin('part.category', '_category');
|
||||||
$builder->addGroupBy('_category');
|
$builder->addGroupBy('_category');
|
||||||
}
|
}
|
||||||
if (str_contains($dql, '_master_picture_attachment')) {
|
if (str_contains($dql, '_master_picture_attachment') && !$hasJoin($builder, '_master_picture_attachment')) {
|
||||||
$builder->leftJoin('part.master_picture_attachment', '_master_picture_attachment');
|
$builder->leftJoin('part.master_picture_attachment', '_master_picture_attachment');
|
||||||
$builder->addGroupBy('_master_picture_attachment');
|
$builder->addGroupBy('_master_picture_attachment');
|
||||||
}
|
}
|
||||||
if (str_contains($dql, '_partLots') || str_contains($dql, '_storelocations')) {
|
if (str_contains($dql, '_partLots') || str_contains($dql, '_storelocations')) {
|
||||||
|
if (!$hasJoin($builder, '_partLots')) {
|
||||||
$builder->leftJoin('part.partLots', '_partLots');
|
$builder->leftJoin('part.partLots', '_partLots');
|
||||||
|
}
|
||||||
|
if (str_contains($dql, '_storelocations') && !$hasJoin($builder, '_storelocations')) {
|
||||||
$builder->leftJoin('_partLots.storage_location', '_storelocations');
|
$builder->leftJoin('_partLots.storage_location', '_storelocations');
|
||||||
|
}
|
||||||
//Do not group by many-to-* relations, as it would restrict the COUNT having clauses to be maximum 1
|
//Do not group by many-to-* relations, as it would restrict the COUNT having clauses to be maximum 1
|
||||||
//$builder->addGroupBy('_partLots');
|
//$builder->addGroupBy('_partLots');
|
||||||
//$builder->addGroupBy('_storelocations');
|
//$builder->addGroupBy('_storelocations');
|
||||||
}
|
}
|
||||||
if (str_contains($dql, '_footprint')) {
|
if (str_contains($dql, '_footprint') && !$hasJoin($builder, '_footprint')) {
|
||||||
$builder->leftJoin('part.footprint', '_footprint');
|
$builder->leftJoin('part.footprint', '_footprint');
|
||||||
$builder->addGroupBy('_footprint');
|
$builder->addGroupBy('_footprint');
|
||||||
}
|
}
|
||||||
if (str_contains($dql, '_manufacturer')) {
|
if (str_contains($dql, '_manufacturer') && !$hasJoin($builder, '_manufacturer')) {
|
||||||
$builder->leftJoin('part.manufacturer', '_manufacturer');
|
$builder->leftJoin('part.manufacturer', '_manufacturer');
|
||||||
$builder->addGroupBy('_manufacturer');
|
$builder->addGroupBy('_manufacturer');
|
||||||
}
|
}
|
||||||
if (str_contains($dql, '_orderdetails') || str_contains($dql, '_suppliers')) {
|
if (str_contains($dql, '_orderdetails') || str_contains($dql, '_suppliers')) {
|
||||||
|
if (!$hasJoin($builder, '_orderdetails')) {
|
||||||
$builder->leftJoin('part.orderdetails', '_orderdetails');
|
$builder->leftJoin('part.orderdetails', '_orderdetails');
|
||||||
|
}
|
||||||
|
if (str_contains($dql, '_suppliers') && !$hasJoin($builder, '_suppliers')) {
|
||||||
$builder->leftJoin('_orderdetails.supplier', '_suppliers');
|
$builder->leftJoin('_orderdetails.supplier', '_suppliers');
|
||||||
|
}
|
||||||
//Do not group by many-to-* relations, as it would restrict the COUNT having clauses to be maximum 1
|
//Do not group by many-to-* relations, as it would restrict the COUNT having clauses to be maximum 1
|
||||||
//$builder->addGroupBy('_orderdetails');
|
//$builder->addGroupBy('_orderdetails');
|
||||||
//$builder->addGroupBy('_suppliers');
|
//$builder->addGroupBy('_suppliers');
|
||||||
}
|
}
|
||||||
if (str_contains($dql, '_attachments')) {
|
if (str_contains($dql, '_attachments') && !$hasJoin($builder, '_attachments')) {
|
||||||
$builder->leftJoin('part.attachments', '_attachments');
|
$builder->leftJoin('part.attachments', '_attachments');
|
||||||
//Do not group by many-to-* relations, as it would restrict the COUNT having clauses to be maximum 1
|
//Do not group by many-to-* relations, as it would restrict the COUNT having clauses to be maximum 1
|
||||||
//$builder->addGroupBy('_attachments');
|
//$builder->addGroupBy('_attachments');
|
||||||
}
|
}
|
||||||
if (str_contains($dql, '_partUnit')) {
|
if (str_contains($dql, '_partUnit') && !$hasJoin($builder, '_partUnit')) {
|
||||||
$builder->leftJoin('part.partUnit', '_partUnit');
|
$builder->leftJoin('part.partUnit', '_partUnit');
|
||||||
$builder->addGroupBy('_partUnit');
|
$builder->addGroupBy('_partUnit');
|
||||||
}
|
}
|
||||||
if (str_contains($dql, '_partCustomState')) {
|
if (str_contains($dql, '_partCustomState') && !$hasJoin($builder, '_partCustomState')) {
|
||||||
$builder->leftJoin('part.partCustomState', '_partCustomState');
|
$builder->leftJoin('part.partCustomState', '_partCustomState');
|
||||||
$builder->addGroupBy('_partCustomState');
|
$builder->addGroupBy('_partCustomState');
|
||||||
}
|
}
|
||||||
if (str_contains($dql, '_parameters')) {
|
if (str_contains($dql, '_parameters') && !$hasJoin($builder, '_parameters')) {
|
||||||
$builder->leftJoin('part.parameters', '_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
|
//Do not group by many-to-* relations, as it would restrict the COUNT having clauses to be maximum 1
|
||||||
//$builder->addGroupBy('_parameters');
|
//$builder->addGroupBy('_parameters');
|
||||||
}
|
}
|
||||||
if (str_contains($dql, '_projectBomEntries')) {
|
if (str_contains($dql, '_projectBomEntries') && !$hasJoin($builder, '_projectBomEntries')) {
|
||||||
$builder->leftJoin('part.project_bom_entries', '_projectBomEntries');
|
$builder->leftJoin('part.project_bom_entries', '_projectBomEntries');
|
||||||
//Do not group by many-to-* relations, as it would restrict the COUNT having clauses to be maximum 1
|
//Do not group by many-to-* relations, as it would restrict the COUNT having clauses to be maximum 1
|
||||||
//$builder->addGroupBy('_projectBomEntries');
|
//$builder->addGroupBy('_projectBomEntries');
|
||||||
}
|
}
|
||||||
if (str_contains($dql, '_assembly.')) {
|
if (str_contains($dql, '_assembly.')) {
|
||||||
|
if (!$hasJoin($builder, '_assemblyBomEntries')) {
|
||||||
$builder->leftJoin('part.assembly_bom_entries', '_assemblyBomEntries');
|
$builder->leftJoin('part.assembly_bom_entries', '_assemblyBomEntries');
|
||||||
|
}
|
||||||
|
if (!$hasJoin($builder, '_assembly')) {
|
||||||
$builder->leftJoin('_assemblyBomEntries.assembly', '_assembly');
|
$builder->leftJoin('_assemblyBomEntries.assembly', '_assembly');
|
||||||
}
|
}
|
||||||
if (str_contains($dql, '_assemblyBomEntries')) {
|
}
|
||||||
|
if (str_contains($dql, '_assemblyBomEntries') && !$hasJoin($builder, '_assemblyBomEntries')) {
|
||||||
$builder->leftJoin('part.assembly_bom_entries', '_assemblyBomEntries');
|
$builder->leftJoin('part.assembly_bom_entries', '_assemblyBomEntries');
|
||||||
}
|
}
|
||||||
if (str_contains($dql, '_jobPart')) {
|
if (str_contains($dql, '_jobPart')) {
|
||||||
|
if (!$hasJoin($builder, '_jobPart')) {
|
||||||
$builder->leftJoin('part.bulkImportJobParts', '_jobPart');
|
$builder->leftJoin('part.bulkImportJobParts', '_jobPart');
|
||||||
|
}
|
||||||
|
if (!$hasJoin($builder, '_bulkImportJob')) {
|
||||||
$builder->leftJoin('_jobPart.job', '_bulkImportJob');
|
$builder->leftJoin('_jobPart.job', '_bulkImportJob');
|
||||||
|
}
|
||||||
//Do not group by many-to-* relations, as it would restrict the COUNT having clauses to be maximum 1
|
//Do not group by many-to-* relations, as it would restrict the COUNT having clauses to be maximum 1
|
||||||
//$builder->addGroupBy('_jobPart');
|
//$builder->addGroupBy('_jobPart');
|
||||||
//$builder->addGroupBy('_bulkImportJob');
|
//$builder->addGroupBy('_bulkImportJob');
|
||||||
|
|
|
||||||
188
src/DataTables/ProjectSearchDataTable.php
Normal file
188
src/DataTables/ProjectSearchDataTable.php
Normal file
|
|
@ -0,0 +1,188 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019 - 2026 Jan Böhmer (https://github.com/jbtronics)
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published
|
||||||
|
* by the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace App\DataTables;
|
||||||
|
|
||||||
|
use App\DataTables\Adapters\TwoStepORMAdapter;
|
||||||
|
use App\DataTables\Column\IconLinkColumn;
|
||||||
|
use App\DataTables\Column\LocaleDateTimeColumn;
|
||||||
|
use App\DataTables\Helpers\ColumnSortHelper;
|
||||||
|
use App\DataTables\Helpers\ProjectDataTableHelper;
|
||||||
|
use App\DataTables\Filters\ProjectFilter;
|
||||||
|
use App\DataTables\Filters\ProjectSearchFilter;
|
||||||
|
use App\DataTables\Column\MarkdownColumn;
|
||||||
|
use App\Entity\ProjectSystem\Project;
|
||||||
|
use App\Doctrine\Helpers\FieldHelper;
|
||||||
|
use App\Services\EntityURLGenerator;
|
||||||
|
use App\Settings\BehaviorSettings\TableSettings;
|
||||||
|
use Doctrine\ORM\AbstractQuery;
|
||||||
|
use Doctrine\ORM\QueryBuilder;
|
||||||
|
use Omines\DataTablesBundle\Adapter\Doctrine\ORM\SearchCriteriaProvider;
|
||||||
|
use Omines\DataTablesBundle\Column\TextColumn;
|
||||||
|
use Omines\DataTablesBundle\DataTable;
|
||||||
|
use Omines\DataTablesBundle\DataTableTypeInterface;
|
||||||
|
use Symfony\Bundle\SecurityBundle\Security;
|
||||||
|
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||||
|
use Symfony\Contracts\Translation\TranslatorInterface;
|
||||||
|
|
||||||
|
class ProjectSearchDataTable implements DataTableTypeInterface
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
private readonly ProjectDataTableHelper $projectDataTableHelper,
|
||||||
|
private readonly TranslatorInterface $translator,
|
||||||
|
private readonly EntityURLGenerator $urlGenerator,
|
||||||
|
private readonly Security $security,
|
||||||
|
private readonly ColumnSortHelper $csh,
|
||||||
|
private readonly TableSettings $tableSettings
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public function configureOptions(OptionsResolver $optionsResolver): void
|
||||||
|
{
|
||||||
|
$optionsResolver->setDefaults([
|
||||||
|
'filter' => null,
|
||||||
|
'search' => null,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$optionsResolver->setAllowedTypes('filter', [ProjectFilter::class, 'null']);
|
||||||
|
$optionsResolver->setAllowedTypes('search', [ProjectSearchFilter::class, 'null']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function configure(DataTable $dataTable, array $options): void
|
||||||
|
{
|
||||||
|
$resolver = new OptionsResolver();
|
||||||
|
$this->configureOptions($resolver);
|
||||||
|
$options = $resolver->resolve($options);
|
||||||
|
|
||||||
|
$this->csh
|
||||||
|
->add('picture', TextColumn::class, [
|
||||||
|
'label' => '',
|
||||||
|
'className' => 'no-colvis',
|
||||||
|
'render' => function ($value, Project $context): string {
|
||||||
|
return $this->projectDataTableHelper->renderPicture($context);
|
||||||
|
},
|
||||||
|
'orderable' => false,
|
||||||
|
'searchable' => false,
|
||||||
|
], visibility_configurable: false)
|
||||||
|
->add('name', TextColumn::class, [
|
||||||
|
'label' => $this->translator->trans('project.table.name'),
|
||||||
|
'render' => function ($value, Project $context): string {
|
||||||
|
return $this->projectDataTableHelper->renderName($context);
|
||||||
|
},
|
||||||
|
'orderField' => 'NATSORT(project.name)'
|
||||||
|
])
|
||||||
|
->add('id', TextColumn::class, [
|
||||||
|
'label' => $this->translator->trans('project.table.id'),
|
||||||
|
])
|
||||||
|
->add('description', MarkdownColumn::class, [
|
||||||
|
'label' => $this->translator->trans('project.table.description'),
|
||||||
|
])
|
||||||
|
->add('comment', MarkdownColumn::class, [
|
||||||
|
'label' => $this->translator->trans('project.table.comment'),
|
||||||
|
])
|
||||||
|
->add('addedDate', LocaleDateTimeColumn::class, [
|
||||||
|
'label' => $this->translator->trans('project.table.addedDate'),
|
||||||
|
])
|
||||||
|
->add('lastModified', LocaleDateTimeColumn::class, [
|
||||||
|
'label' => $this->translator->trans('project.table.lastModified'),
|
||||||
|
])
|
||||||
|
->add('edit', IconLinkColumn::class, [
|
||||||
|
'label' => $this->translator->trans('project.table.edit'),
|
||||||
|
'href' => fn($value, Project $context) => $this->urlGenerator->editURL($context),
|
||||||
|
'disabled' => fn($value, Project $context) => !$this->security->isGranted('edit', $context),
|
||||||
|
'title' => $this->translator->trans('project.table.edit.title'),
|
||||||
|
]);
|
||||||
|
|
||||||
|
//Apply the user configured order and visibility and add the columns to the table
|
||||||
|
$this->csh->applyVisibilityAndConfigureColumns($dataTable, $this->tableSettings->projectsDefaultColumns,
|
||||||
|
"TABLE_PROJECTS_DEFAULT_COLUMNS");
|
||||||
|
|
||||||
|
$dataTable->addOrderBy('name')
|
||||||
|
->createAdapter(TwoStepORMAdapter::class, [
|
||||||
|
'filter_query' => $this->getFilterQuery(...),
|
||||||
|
'detail_query' => $this->getDetailQuery(...),
|
||||||
|
'entity' => Project::class,
|
||||||
|
'hydrate' => AbstractQuery::HYDRATE_OBJECT,
|
||||||
|
'simple_total_query' => true,
|
||||||
|
'criteria' => [
|
||||||
|
function (QueryBuilder $builder) use ($options): void {
|
||||||
|
if ($options['search'] instanceof ProjectSearchFilter) {
|
||||||
|
$options['search']->apply($builder);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($options['filter'] instanceof ProjectFilter) {
|
||||||
|
$options['filter']->apply($builder);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new SearchCriteriaProvider(),
|
||||||
|
],
|
||||||
|
'query_modifier' => $this->addJoins(...),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getFilterQuery(QueryBuilder $builder): void
|
||||||
|
{
|
||||||
|
$builder
|
||||||
|
->select('project.id')
|
||||||
|
->from(Project::class, 'project');
|
||||||
|
|
||||||
|
$this->addJoins($builder);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function addJoins(QueryBuilder $builder): QueryBuilder
|
||||||
|
{
|
||||||
|
$dql = $builder->getDQL();
|
||||||
|
|
||||||
|
//Helper function to check if a join alias is already present in the QueryBuilder
|
||||||
|
$hasJoin = static function (QueryBuilder $qb, string $alias): bool {
|
||||||
|
foreach ($qb->getDQLPart('join') as $joins) {
|
||||||
|
foreach ($joins as $join) {
|
||||||
|
if ($join->getAlias() === $alias) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (str_contains($dql, '_master_picture_attachment') && !$hasJoin($builder, '_master_picture_attachment')) {
|
||||||
|
$builder->leftJoin('project.master_picture_attachment', '_master_picture_attachment');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $builder;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getDetailQuery(QueryBuilder $builder, array $filter_results): void
|
||||||
|
{
|
||||||
|
$ids = array_map(static fn($row) => $row['id'], $filter_results);
|
||||||
|
|
||||||
|
$builder
|
||||||
|
->select('project')
|
||||||
|
->from(Project::class, 'project')
|
||||||
|
->where('project.id IN (:ids)')
|
||||||
|
->setParameter('ids', $ids);
|
||||||
|
|
||||||
|
//Get the results in the same order as the IDs were passed
|
||||||
|
FieldHelper::addOrderByFieldParam($builder, 'project.id', 'ids');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -23,7 +23,9 @@ declare(strict_types=1);
|
||||||
namespace App\Form\Filters;
|
namespace App\Form\Filters;
|
||||||
|
|
||||||
use App\DataTables\Filters\AssemblyFilter;
|
use App\DataTables\Filters\AssemblyFilter;
|
||||||
|
use App\Entity\AssemblySystem\Assembly;
|
||||||
use App\Entity\Attachments\AttachmentType;
|
use App\Entity\Attachments\AttachmentType;
|
||||||
|
use App\Form\Filters\Constraints\ChoiceConstraintType;
|
||||||
use App\Form\Filters\Constraints\DateTimeConstraintType;
|
use App\Form\Filters\Constraints\DateTimeConstraintType;
|
||||||
use App\Form\Filters\Constraints\NumberConstraintType;
|
use App\Form\Filters\Constraints\NumberConstraintType;
|
||||||
use App\Form\Filters\Constraints\StructuralEntityConstraintType;
|
use App\Form\Filters\Constraints\StructuralEntityConstraintType;
|
||||||
|
|
@ -59,6 +61,24 @@ class AssemblyFilterType extends AbstractType
|
||||||
'label' => 'assembly.filter.description',
|
'label' => 'assembly.filter.description',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
$builder->add('category', StructuralEntityConstraintType::class, [
|
||||||
|
'label' => 'assembly.filter.parent',
|
||||||
|
'entity_class' => Assembly::class,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$status_choices = [
|
||||||
|
'assembly.status.draft' => 'draft',
|
||||||
|
'assembly.status.planning' => 'planning',
|
||||||
|
'assembly.status.in_production' => 'in_production',
|
||||||
|
'assembly.status.finished' => 'finished',
|
||||||
|
'assembly.status.archived' => 'archived',
|
||||||
|
];
|
||||||
|
|
||||||
|
$builder->add('status', ChoiceConstraintType::class, [
|
||||||
|
'label' => 'assembly.filter.status',
|
||||||
|
'choices' => $status_choices,
|
||||||
|
]);
|
||||||
|
|
||||||
$builder->add('comment', TextConstraintType::class, [
|
$builder->add('comment', TextConstraintType::class, [
|
||||||
'label' => 'assembly.filter.comment'
|
'label' => 'assembly.filter.comment'
|
||||||
]);
|
]);
|
||||||
|
|
|
||||||
131
src/Form/Filters/ProjectFilterType.php
Normal file
131
src/Form/Filters/ProjectFilterType.php
Normal file
|
|
@ -0,0 +1,131 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019 - 2026 Jan Böhmer (https://github.com/jbtronics)
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published
|
||||||
|
* by the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace App\Form\Filters;
|
||||||
|
|
||||||
|
use App\DataTables\Filters\ProjectFilter;
|
||||||
|
use App\Entity\Attachments\AttachmentType;
|
||||||
|
use App\Entity\ProjectSystem\Project;
|
||||||
|
use App\Form\Filters\Constraints\ChoiceConstraintType;
|
||||||
|
use App\Form\Filters\Constraints\DateTimeConstraintType;
|
||||||
|
use App\Form\Filters\Constraints\NumberConstraintType;
|
||||||
|
use App\Form\Filters\Constraints\StructuralEntityConstraintType;
|
||||||
|
use App\Form\Filters\Constraints\TextConstraintType;
|
||||||
|
use Symfony\Component\Form\AbstractType;
|
||||||
|
use Symfony\Component\Form\Extension\Core\Type\ResetType;
|
||||||
|
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
|
||||||
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
|
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||||
|
|
||||||
|
class ProjectFilterType extends AbstractType
|
||||||
|
{
|
||||||
|
public function configureOptions(OptionsResolver $resolver): void
|
||||||
|
{
|
||||||
|
$resolver->setDefaults([
|
||||||
|
'compound' => true,
|
||||||
|
'data_class' => ProjectFilter::class,
|
||||||
|
'csrf_protection' => false,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function buildForm(FormBuilderInterface $builder, array $options): void
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Common tab
|
||||||
|
*/
|
||||||
|
|
||||||
|
$builder->add('name', TextConstraintType::class, [
|
||||||
|
'label' => 'project.filter.name',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$builder->add('description', TextConstraintType::class, [
|
||||||
|
'label' => 'project.filter.description',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$builder->add('category', StructuralEntityConstraintType::class, [
|
||||||
|
'label' => 'project.filter.parent',
|
||||||
|
'entity_class' => Project::class,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$status_choices = [
|
||||||
|
'project.status.draft' => 'draft',
|
||||||
|
'project.status.planning' => 'planning',
|
||||||
|
'project.status.in_production' => 'in_production',
|
||||||
|
'project.status.finished' => 'finished',
|
||||||
|
'project.status.archived' => 'archived',
|
||||||
|
];
|
||||||
|
|
||||||
|
$builder->add('status', ChoiceConstraintType::class, [
|
||||||
|
'label' => 'project.filter.status',
|
||||||
|
'choices' => $status_choices,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$builder->add('comment', TextConstraintType::class, [
|
||||||
|
'label' => 'project.filter.comment'
|
||||||
|
]);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Advanced tab
|
||||||
|
*/
|
||||||
|
|
||||||
|
$builder->add('dbId', NumberConstraintType::class, [
|
||||||
|
'label' => 'project.filter.dbId',
|
||||||
|
'min' => 1,
|
||||||
|
'step' => 1,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$builder->add('lastModified', DateTimeConstraintType::class, [
|
||||||
|
'label' => 'lastModified'
|
||||||
|
]);
|
||||||
|
|
||||||
|
$builder->add('addedDate', DateTimeConstraintType::class, [
|
||||||
|
'label' => 'createdAt'
|
||||||
|
]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attachments count
|
||||||
|
*/
|
||||||
|
$builder->add('attachmentsCount', NumberConstraintType::class, [
|
||||||
|
'label' => 'project.filter.attachments_count',
|
||||||
|
'step' => 1,
|
||||||
|
'min' => 0,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$builder->add('attachmentType', StructuralEntityConstraintType::class, [
|
||||||
|
'label' => 'attachment.attachment_type',
|
||||||
|
'entity_class' => AttachmentType::class
|
||||||
|
]);
|
||||||
|
|
||||||
|
$builder->add('attachmentName', TextConstraintType::class, [
|
||||||
|
'label' => 'project.filter.attachmentName',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$builder->add('submit', SubmitType::class, [
|
||||||
|
'label' => 'filter.submit',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$builder->add('discard', ResetType::class, [
|
||||||
|
'label' => 'filter.discard',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -37,13 +37,16 @@ class MarkdownParser
|
||||||
* Mark the markdown for rendering.
|
* Mark the markdown for rendering.
|
||||||
* The rendering of markdown is done on client side.
|
* The rendering of markdown is done on client side.
|
||||||
*
|
*
|
||||||
* @param string $markdown the Markdown text that should be parsed to html
|
* @param string|null $markdown the Markdown text that should be parsed to html
|
||||||
* @param bool $inline_mode When true, p blocks will have no margins behind them
|
* @param bool $inline_mode When true, p blocks will have no margins behind them
|
||||||
*
|
*
|
||||||
* @return string the markdown in a version that can be parsed on client side
|
* @return string the markdown in a version that can be parsed on client side
|
||||||
*/
|
*/
|
||||||
public function markForRendering(string $markdown, bool $inline_mode = false): string
|
public function markForRendering(?string $markdown, bool $inline_mode = false): string
|
||||||
{
|
{
|
||||||
|
if ($markdown === null) {
|
||||||
|
$markdown = '';
|
||||||
|
}
|
||||||
return sprintf(
|
return sprintf(
|
||||||
'<div class="markdown %s" data-markdown="%s" data-controller="common--markdown">%s</div>',
|
'<div class="markdown %s" data-markdown="%s" data-controller="common--markdown">%s</div>',
|
||||||
$inline_mode ? 'markdown-inline' : '', //Add class if inline mode is enabled, to prevent margin after p
|
$inline_mode ? 'markdown-inline' : '', //Add class if inline mode is enabled, to prevent margin after p
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,7 @@ enum AssemblyTableColumns : string implements TranslatableInterface
|
||||||
case ID = "id";
|
case ID = "id";
|
||||||
case IPN = "ipn";
|
case IPN = "ipn";
|
||||||
case DESCRIPTION = "description";
|
case DESCRIPTION = "description";
|
||||||
|
case COMMENT = "comment";
|
||||||
case REFERENCED_ASSEMBLIES = "referencedAssemblies";
|
case REFERENCED_ASSEMBLIES = "referencedAssemblies";
|
||||||
case ADDED_DATE = "addedDate";
|
case ADDED_DATE = "addedDate";
|
||||||
case LAST_MODIFIED = "lastModified";
|
case LAST_MODIFIED = "lastModified";
|
||||||
|
|
|
||||||
46
src/Settings/BehaviorSettings/ProjectTableColumns.php
Normal file
46
src/Settings/BehaviorSettings/ProjectTableColumns.php
Normal file
|
|
@ -0,0 +1,46 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019 - 2026 Jan Böhmer (https://github.com/jbtronics)
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published
|
||||||
|
* by the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Settings\BehaviorSettings;
|
||||||
|
|
||||||
|
use Symfony\Contracts\Translation\TranslatableInterface;
|
||||||
|
use Symfony\Contracts\Translation\TranslatorInterface;
|
||||||
|
|
||||||
|
enum ProjectTableColumns : string implements TranslatableInterface
|
||||||
|
{
|
||||||
|
case NAME = "name";
|
||||||
|
case ID = "id";
|
||||||
|
case DESCRIPTION = "description";
|
||||||
|
case COMMENT = "comment";
|
||||||
|
case ADDED_DATE = "addedDate";
|
||||||
|
case LAST_MODIFIED = "lastModified";
|
||||||
|
case EDIT = "edit";
|
||||||
|
|
||||||
|
public function trans(TranslatorInterface $translator, ?string $locale = null): string
|
||||||
|
{
|
||||||
|
$key = match($this) {
|
||||||
|
default => 'project.table.' . $this->value,
|
||||||
|
};
|
||||||
|
|
||||||
|
return $translator->trans($key, locale: $locale);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -85,6 +85,21 @@ class TableSettings
|
||||||
public array $assembliesDefaultColumns = [AssemblyTableColumns::ID, AssemblyTableColumns::IPN, AssemblyTableColumns::NAME,
|
public array $assembliesDefaultColumns = [AssemblyTableColumns::ID, AssemblyTableColumns::IPN, AssemblyTableColumns::NAME,
|
||||||
AssemblyTableColumns::DESCRIPTION, AssemblyTableColumns::REFERENCED_ASSEMBLIES, AssemblyTableColumns::EDIT];
|
AssemblyTableColumns::DESCRIPTION, AssemblyTableColumns::REFERENCED_ASSEMBLIES, AssemblyTableColumns::EDIT];
|
||||||
|
|
||||||
|
/** @var ProjectTableColumns[] */
|
||||||
|
#[SettingsParameter(ArrayType::class,
|
||||||
|
label: new TM("settings.behavior.table.projects_default_columns"),
|
||||||
|
description: new TM("settings.behavior.table.projects_default_columns.help"),
|
||||||
|
options: ['type' => EnumType::class, 'options' => ['class' => ProjectTableColumns::class]],
|
||||||
|
formType: \Symfony\Component\Form\Extension\Core\Type\EnumType::class,
|
||||||
|
formOptions: ['class' => ProjectTableColumns::class, 'multiple' => true, 'ordered' => true],
|
||||||
|
envVar: "TABLE_PROJECTS_DEFAULT_COLUMNS", envVarMode: EnvVarMode::OVERWRITE, envVarMapper: [self::class, 'mapProjectsDefaultColumnsEnv']
|
||||||
|
)]
|
||||||
|
#[Assert\NotBlank()]
|
||||||
|
#[Assert\Unique()]
|
||||||
|
#[Assert\All([new Assert\Type(ProjectTableColumns::class)])]
|
||||||
|
public array $projectsDefaultColumns = [ProjectTableColumns::NAME, ProjectTableColumns::DESCRIPTION,
|
||||||
|
ProjectTableColumns::COMMENT, ProjectTableColumns::EDIT];
|
||||||
|
|
||||||
/** @var AssemblyBomTableColumns[] */
|
/** @var AssemblyBomTableColumns[] */
|
||||||
#[SettingsParameter(ArrayType::class,
|
#[SettingsParameter(ArrayType::class,
|
||||||
label: new TM("settings.behavior.table.assemblies_bom_default_columns"),
|
label: new TM("settings.behavior.table.assemblies_bom_default_columns"),
|
||||||
|
|
@ -148,6 +163,22 @@ class TableSettings
|
||||||
return $ret;
|
return $ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function mapProjectsDefaultColumnsEnv(string $columns): array
|
||||||
|
{
|
||||||
|
$exploded = explode(',', $columns);
|
||||||
|
$ret = [];
|
||||||
|
foreach ($exploded as $column) {
|
||||||
|
$enum = ProjectTableColumns::tryFrom($column);
|
||||||
|
if (!$enum) {
|
||||||
|
throw new \InvalidArgumentException("Invalid column '$column' in TABLE_PROJECTS_DEFAULT_COLUMNS");
|
||||||
|
}
|
||||||
|
|
||||||
|
$ret[] = $enum;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
public static function mapAssemblyBomsDefaultColumnsEnv(string $columns): array
|
public static function mapAssemblyBomsDefaultColumnsEnv(string $columns): array
|
||||||
{
|
{
|
||||||
$exploded = explode(',', $columns);
|
$exploded = explode(',', $columns);
|
||||||
|
|
|
||||||
|
|
@ -1,86 +1,230 @@
|
||||||
{% macro settings_drodown(show_label_instead_icon = true) %}
|
{% macro settings_drodown(show_label_instead_icon = true, searchFilter = null, isSearchList = false) %}
|
||||||
|
|
||||||
<div class="dropdown">
|
<div class="dropdown" {{ stimulus_controller('elements/search_options', {
|
||||||
|
'isSearchList': isSearchList or searchFilter is not null
|
||||||
|
}) }}>
|
||||||
<button class="btn dropdown-toggle my-2" type="button" id="navbar-search-options" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" data-bs-auto-close="true">
|
<button class="btn dropdown-toggle my-2" type="button" id="navbar-search-options" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" data-bs-auto-close="true">
|
||||||
{% if show_label_instead_icon %}{% trans %}search.options.label{% endtrans %}{% else %}<i class="fa-solid fa-gear"></i>{% endif %}
|
{% if show_label_instead_icon %}{% trans %}search.options.label{% endtrans %}{% else %}<i class="fa-solid fa-gear"></i>{% endif %}
|
||||||
<span class="caret"></span>
|
<span class="caret"></span>
|
||||||
</button>
|
</button>
|
||||||
<div class="dropdown-menu" aria-labelledby="navbar-search-options">
|
<div class="dropdown-menu" aria-labelledby="navbar-search-options">
|
||||||
<div class="px-2" style="width: max-content;">
|
<div style="width: max-content;">
|
||||||
|
<div class="mb-2 px-2">
|
||||||
|
<label for="search_datasource" class="form-label">{% trans %}datasource{% endtrans %}</label>
|
||||||
|
<select class="form-select form-select-sm" id="search_datasource" name="datasource"
|
||||||
|
data-action="change->elements--search-options#onDatasourceChange"
|
||||||
|
data-elements--search-options-target="datasource">
|
||||||
|
<option value="parts" {% if (searchFilter and searchFilter.datasource == 'parts') or (not searchFilter and (app.request.get('datasource') == 'parts' or app.request.get('datasource') is empty)) %}selected{% endif %}>{% trans %}datasource.parts{% endtrans %}</option>
|
||||||
|
<option value="projects" {% if (searchFilter and searchFilter.datasource == 'projects') or (not searchFilter and app.request.get('datasource') == 'projects') %}selected{% endif %}>{% trans %}datasource.projects{% endtrans %}</option>
|
||||||
|
<option value="assemblies" {% if (searchFilter and searchFilter.datasource == 'assemblies') or (not searchFilter and app.request.get('datasource') == 'assemblies') %}selected{% endif %}>{% trans %}datasource.assemblies{% endtrans %}</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<hr data-elements--search-options-target="divider" class="my-1">
|
||||||
|
<div data-elements--search-options-target="partOptions" id="part-options-container">
|
||||||
|
<div class="px-2">
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input type="checkbox" class="form-check-input" id="search_name" name="name" value="1" checked {{ stimulus_controller('elements/localStorage_checkbox') }}>
|
<input type="checkbox" class="form-check-input" id="search_name" name="name" value="1"
|
||||||
|
{% if (searchFilter and searchFilter.name) or (not searchFilter and (app.request.query.has('name') ? app.request.get('name') == '1' : (app.request.get('datasource') == 'parts' or app.request.get('datasource') is empty))) %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
<label for="search_name" class="form-check-label justify-content-start">{% trans %}name.label{% endtrans %}</label>
|
<label for="search_name" class="form-check-label justify-content-start">{% trans %}name.label{% endtrans %}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input type="checkbox" class="form-check-input" id="search_dbid" name="dbid" value="1" {{ stimulus_controller('elements/localStorage_checkbox') }}>
|
<input type="checkbox" class="form-check-input" id="search_dbid" name="dbid" value="1"
|
||||||
|
{% if (searchFilter and searchFilter.dbId) or (not searchFilter and app.request.get('dbid') == '1') %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
<label for="search_dbid" class="form-check-label justify-content-start">{% trans %}id.label{% endtrans %}</label>
|
<label for="search_dbid" class="form-check-label justify-content-start">{% trans %}id.label{% endtrans %}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input type="checkbox" class="form-check-input" id="search_category" name="category" value="1" checked {{ stimulus_controller('elements/localStorage_checkbox') }}>
|
<input type="checkbox" class="form-check-input" id="search_category" name="category" value="1"
|
||||||
|
{% if (searchFilter and searchFilter.category) or (not searchFilter and (app.request.query.has('category') ? app.request.get('category') == '1' : (app.request.get('datasource') == 'parts' or app.request.get('datasource') is empty))) %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
<label for="search_category" class="form-check-label justify-content-start">{% trans %}category.label{% endtrans %}</label>
|
<label for="search_category" class="form-check-label justify-content-start">{% trans %}category.label{% endtrans %}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input type="checkbox" class="form-check-input" id="search_description" name="description" value="1" checked {{ stimulus_controller('elements/localStorage_checkbox') }}>
|
<input type="checkbox" class="form-check-input" id="search_description" name="description" value="1"
|
||||||
|
{% if (searchFilter and searchFilter.description) or (not searchFilter and (app.request.query.has('description') ? app.request.get('description') == '1' : (app.request.get('datasource') == 'parts' or app.request.get('datasource') is empty))) %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
<label for="search_description" class="form-check-label justify-content-start">{% trans %}description.label{% endtrans %}</label>
|
<label for="search_description" class="form-check-label justify-content-start">{% trans %}description.label{% endtrans %}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input type="checkbox" class="form-check-input" id="search_mpn" name="mpn" value="1" checked {{ stimulus_controller('elements/localStorage_checkbox') }}>
|
<input type="checkbox" class="form-check-input" id="search_mpn" name="mpn" value="1"
|
||||||
|
{% if (searchFilter and searchFilter.mpn) or (not searchFilter and (app.request.query.has('mpn') ? app.request.get('mpn') == '1' : (app.request.get('datasource') == 'parts' or app.request.get('datasource') is empty))) %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
<label for="search_mpn" class="form-check-label justify-content-start">{% trans %}part.edit.mpn{% endtrans %}</label>
|
<label for="search_mpn" class="form-check-label justify-content-start">{% trans %}part.edit.mpn{% endtrans %}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input type="checkbox" class="form-check-input" id="search_tags" name="tags" value="1" checked {{ stimulus_controller('elements/localStorage_checkbox') }}>
|
<input type="checkbox" class="form-check-input" id="search_tags" name="tags" value="1"
|
||||||
|
{% if (searchFilter and searchFilter.tags) or (not searchFilter and (app.request.query.has('tags') ? app.request.get('tags') == '1' : (app.request.get('datasource') == 'parts' or app.request.get('datasource') is empty))) %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
<label for="search_tags" class="form-check-label justify-content-start">{% trans %}tags.label{% endtrans %}</label>
|
<label for="search_tags" class="form-check-label justify-content-start">{% trans %}tags.label{% endtrans %}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input type="checkbox" class="form-check-input" id="search_storelocation" name="storelocation" value="1" checked {{ stimulus_controller('elements/localStorage_checkbox') }}>
|
<input type="checkbox" class="form-check-input" id="search_storelocation" name="storelocation" value="1"
|
||||||
|
{% if (searchFilter and searchFilter.storelocation) or (not searchFilter and (app.request.query.has('storelocation') ? app.request.get('storelocation') == '1' : (app.request.get('datasource') == 'parts' or app.request.get('datasource') is empty))) %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
<label for="search_storelocation" class="form-check-label justify-content-start">{% trans %}storelocation.label{% endtrans %}</label>
|
<label for="search_storelocation" class="form-check-label justify-content-start">{% trans %}storelocation.label{% endtrans %}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input type="checkbox" class="form-check-input" id="search_comment" name="comment" value="1" checked {{ stimulus_controller('elements/localStorage_checkbox') }}>
|
<input type="checkbox" class="form-check-input" id="search_comment" name="comment" value="1"
|
||||||
|
{% if (searchFilter and searchFilter.comment is defined and searchFilter.comment) or (not searchFilter and (app.request.query.has('comment') ? app.request.get('comment') == '1' : (app.request.get('datasource') == 'parts' or app.request.get('datasource') is empty))) %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
<label for="search_comment" class="form-check-label justify-content-start">{% trans %}comment.label{% endtrans %}</label>
|
<label for="search_comment" class="form-check-label justify-content-start">{% trans %}comment.label{% endtrans %}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input type="checkbox" class="form-check-input" id="search_ipn" name="ipn" value="1" checked {{ stimulus_controller('elements/localStorage_checkbox') }}>
|
<input type="checkbox" class="form-check-input" id="search_manufacturing_status" name="manufacturing_status" value="1"
|
||||||
|
{% if (searchFilter and searchFilter.manufacturingStatus is defined and searchFilter.manufacturingStatus) or (not searchFilter and (app.request.query.has('manufacturing_status') ? app.request.get('manufacturing_status') == '1' : (app.request.get('datasource') == 'parts' or app.request.get('datasource') is empty))) %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
|
<label for="search_manufacturing_status" class="form-check-label justify-content-start">{% trans %}part.edit.manufacturing_status{% endtrans %}</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check">
|
||||||
|
<input type="checkbox" class="form-check-input" id="search_ipn" name="ipn" value="1"
|
||||||
|
{% if (searchFilter and searchFilter.ipn) or (not searchFilter and (app.request.query.has('ipn') ? (app.request.get('ipn') == '1') : (app.request.get('datasource') == 'parts' or app.request.get('datasource') is empty))) %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
<label for="search_ipn" class="form-check-label justify-content-start">{% trans %}part.edit.ipn{% endtrans %}</label>
|
<label for="search_ipn" class="form-check-label justify-content-start">{% trans %}part.edit.ipn{% endtrans %}</label>
|
||||||
</div>
|
</div>
|
||||||
{% if true %}
|
{% if true %}
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input type="checkbox" class="form-check-input" id="search_supplierpartnr" name="ordernr" value="1" checked {{ stimulus_controller('elements/localStorage_checkbox') }}>
|
<input type="checkbox" class="form-check-input" id="search_ordernr" name="ordernr" value="1"
|
||||||
<label for="search_supplierpartnr" class="form-check-label justify-content-start">{% trans %}orderdetails.edit.supplierpartnr{% endtrans %}</label>
|
{% if (searchFilter and searchFilter.ordernr) or (not searchFilter and (app.request.query.has('ordernr') ? app.request.get('ordernr') == '1' : (app.request.get('datasource') == 'parts' or app.request.get('datasource') is empty))) %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
|
<label for="search_ordernr" class="form-check-label justify-content-start">{% trans %}orderdetails.edit.supplierpartnr{% endtrans %}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input type="checkbox" class="form-check-input" id="search_supplier" name="supplier" value="1" {{ stimulus_controller('elements/localStorage_checkbox') }}>
|
<input type="checkbox" class="form-check-input" id="search_supplier" name="supplier" value="1"
|
||||||
|
{% if (searchFilter and searchFilter.supplier) or (not searchFilter and app.request.get('supplier') == '1') %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
<label for="search_supplier" class="form-check-label justify-content-start">{% trans %}supplier.label{% endtrans %}</label>
|
<label for="search_supplier" class="form-check-label justify-content-start">{% trans %}supplier.label{% endtrans %}</label>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if true %}
|
{% if true %}
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input type="checkbox" class="form-check-input" id="search_manufacturer" name="manufacturer" value="1" {{ stimulus_controller('elements/localStorage_checkbox') }}>
|
<input type="checkbox" class="form-check-input" id="search_manufacturer" name="manufacturer" value="1"
|
||||||
|
{% if (searchFilter and searchFilter.manufacturer) or (not searchFilter and app.request.get('manufacturer') == '1') %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
<label for="search_manufacturer" class="form-check-label justify-content-start">{% trans %}manufacturer.label{% endtrans %}</label>
|
<label for="search_manufacturer" class="form-check-label justify-content-start">{% trans %}manufacturer.label{% endtrans %}</label>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if true %}
|
{% if true %}
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input type="checkbox" class="form-check-input" id="search_footprint" name="footprint" value="1" {{ stimulus_controller('elements/localStorage_checkbox') }}>
|
<input type="checkbox" class="form-check-input" id="search_footprint" name="footprint" value="1"
|
||||||
|
{% if (searchFilter and searchFilter.footprint) or (not searchFilter and app.request.get('footprint') == '1') %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
<label for="search_footprint" class="form-check-label justify-content-start">{% trans %}footprint.label{% endtrans %}</label>
|
<label for="search_footprint" class="form-check-label justify-content-start">{% trans %}footprint.label{% endtrans %}</label>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input type="checkbox" class="form-check-input" id="search_assembly" name="assembly" value="1" {{ stimulus_controller('elements/localStorage_checkbox') }}>
|
<input type="checkbox" class="form-check-input" id="search_assembly" name="assembly" value="1"
|
||||||
|
{% if (searchFilter and searchFilter.assembly) or (not searchFilter and (app.request.query.has('assembly') ? app.request.get('assembly') == '1' : (app.request.get('datasource') == 'parts' or app.request.get('datasource') is empty))) %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
<label for="search_assembly" class="form-check-label justify-content-start">{% trans %}assembly.label{% endtrans %}</label>
|
<label for="search_assembly" class="form-check-label justify-content-start">{% trans %}assembly.label{% endtrans %}</label>
|
||||||
</div>
|
</div>
|
||||||
<hr>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div data-elements--search-options-target="assemblyOptions" id="assembly-options-container" class="d-none">
|
||||||
|
<div class="px-2">
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input type="checkbox" class="form-check-input" id="regex" name="regex" value="1" {{ stimulus_controller('elements/localStorage_checkbox') }}>
|
<input type="checkbox" class="form-check-input" id="search_assembly_name" name="name" value="1"
|
||||||
|
{% if (searchFilter and searchFilter.name) or (not searchFilter and (app.request.query.has('name') ? app.request.get('name') == '1' : app.request.get('datasource') == 'assemblies')) %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
|
<label for="search_assembly_name" class="form-check-label justify-content-start">{% trans %}name.label{% endtrans %}</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check">
|
||||||
|
<input type="checkbox" class="form-check-input" id="search_assembly_dbid" name="dbid" value="1"
|
||||||
|
{% if (searchFilter and searchFilter.dbId) or (not searchFilter and app.request.get('dbid') == '1') %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
|
<label for="search_assembly_dbid" class="form-check-label justify-content-start">{% trans %}id.label{% endtrans %}</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check">
|
||||||
|
<input type="checkbox" class="form-check-input" id="search_assembly_ipn" name="ipn" value="1"
|
||||||
|
{% if (searchFilter and searchFilter.ipn) or (not searchFilter and (app.request.query.has('ipn') ? (app.request.get('ipn') == '1' or app.request.get('iPN') == '1') : app.request.get('datasource') == 'assemblies')) %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
|
<label for="search_assembly_ipn" class="form-check-label justify-content-start">{% trans %}assembly.edit.ipn{% endtrans %}</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check">
|
||||||
|
<input type="checkbox" class="form-check-input" id="search_assembly_description" name="description" value="1"
|
||||||
|
{% if (searchFilter and searchFilter.description) or (not searchFilter and (app.request.query.has('description') ? app.request.get('description') == '1' : app.request.get('datasource') == 'assemblies')) %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
|
<label for="search_assembly_description" class="form-check-label justify-content-start">{% trans %}description.label{% endtrans %}</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check">
|
||||||
|
<input type="checkbox" class="form-check-input" id="search_assembly_status" name="status" value="1"
|
||||||
|
{% if (searchFilter and searchFilter.status) or (not searchFilter and (app.request.query.has('status') ? app.request.get('status') == '1' : app.request.get('datasource') == 'assemblies')) %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
|
<label for="search_assembly_status" class="form-check-label justify-content-start">{% trans %}assembly.edit.status{% endtrans %}</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check">
|
||||||
|
<input type="checkbox" class="form-check-input" id="search_assembly_category" name="category" value="1"
|
||||||
|
{% if (searchFilter and searchFilter.category) or (not searchFilter and (app.request.query.has('category') ? app.request.get('category') == '1' : app.request.get('datasource') == 'assemblies')) %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
|
<label for="search_assembly_category" class="form-check-label justify-content-start">{% trans %}assembly.filter.parent{% endtrans %}</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check">
|
||||||
|
<input type="checkbox" class="form-check-input" id="search_assembly_notes" name="comment" value="1"
|
||||||
|
{% if (searchFilter and searchFilter.comment) or (not searchFilter and (app.request.query.has('notes') or app.request.query.has('comment') ? (app.request.get('notes') == '1' or app.request.get('comment') == '1') : app.request.get('datasource') == 'assemblies')) %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
|
<label for="search_assembly_notes" class="form-check-label justify-content-start">{% trans %}assembly.filter.comment{% endtrans %}</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div data-elements--search-options-target="projectOptions" id="project-options-container" class="d-none">
|
||||||
|
<div class="px-2">
|
||||||
|
<div class="form-check">
|
||||||
|
<input type="checkbox" class="form-check-input" id="search_project_name" name="name" value="1"
|
||||||
|
{% if (searchFilter and searchFilter.name) or (not searchFilter and (app.request.query.has('name') ? app.request.get('name') == '1' : app.request.get('datasource') == 'projects')) %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
|
<label for="search_project_name" class="form-check-label justify-content-start">{% trans %}name.label{% endtrans %}</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check">
|
||||||
|
<input type="checkbox" class="form-check-input" id="search_project_dbid" name="dbid" value="1"
|
||||||
|
{% if (searchFilter and searchFilter.dbId) or (not searchFilter and app.request.get('dbid') == '1') %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
|
<label for="search_project_dbid" class="form-check-label justify-content-start">{% trans %}id.label{% endtrans %}</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check">
|
||||||
|
<input type="checkbox" class="form-check-input" id="search_project_description" name="description" value="1"
|
||||||
|
{% if (searchFilter and searchFilter.description) or (not searchFilter and (app.request.query.has('description') ? app.request.get('description') == '1' : app.request.get('datasource') == 'projects')) %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
|
<label for="search_project_description" class="form-check-label justify-content-start">{% trans %}description.label{% endtrans %}</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check">
|
||||||
|
<input type="checkbox" class="form-check-input" id="search_project_notes" name="comment" value="1"
|
||||||
|
{% if (searchFilter and searchFilter.comment) or (not searchFilter and (app.request.query.has('comment') or app.request.query.has('notes') ? (app.request.get('comment') == '1' or app.request.get('notes') == '1') : app.request.get('datasource') == 'projects')) %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
|
<label for="search_project_notes" class="form-check-label justify-content-start">{% trans %}project.filter.comment{% endtrans %}</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check">
|
||||||
|
<input type="checkbox" class="form-check-input" id="search_project_status" name="status" value="1"
|
||||||
|
{% if (searchFilter and searchFilter.status) or (not searchFilter and (app.request.query.has('status') ? app.request.get('status') == '1' : app.request.get('datasource') == 'projects')) %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
|
<label for="search_project_status" class="form-check-label justify-content-start">{% trans %}project.edit.status{% endtrans %}</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check">
|
||||||
|
<input type="checkbox" class="form-check-input" id="search_project_category" name="category" value="1"
|
||||||
|
{% if (searchFilter and searchFilter.category) or (not searchFilter and (app.request.query.has('category') ? app.request.get('category') == '1' : app.request.get('datasource') == 'projects')) %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
|
<label for="search_project_category" class="form-check-label justify-content-start">{% trans %}project.filter.parent{% endtrans %}</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<hr>
|
||||||
|
<div class="px-2">
|
||||||
|
<div class="form-check">
|
||||||
|
<input type="checkbox" class="form-check-input" id="regex" name="regex" value="1"
|
||||||
|
{% if (searchFilter and searchFilter.regex) or (not searchFilter and app.request.get('regex') == '1') %}checked{% endif %}
|
||||||
|
{{ stimulus_controller('elements/sessionStorage_checkbox') }}>
|
||||||
<label for="regex" class="form-check-label justify-content-start">{% trans %}search.regexmatching{% endtrans %}</label>
|
<label for="regex" class="form-check-label justify-content-start">{% trans %}search.regexmatching{% endtrans %}</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
||||||
{# Render a complete usable search form including the form tags. mode can be "standalone" or "navbar" #}
|
{# Render a complete usable search form including the form tags. mode can be "standalone" or "navbar" #}
|
||||||
{% macro search_form(mode = "standalone") %}
|
{% macro search_form(mode = "standalone", searchFilter = null, isSearchList = false) %}
|
||||||
{% set is_navbar = (mode == "navbar") %}
|
{% set is_navbar = (mode == "navbar") %}
|
||||||
|
|
||||||
<form action="{{ path('parts_search') }}" class="d-flex {% if is_navbar %}my-lg-0{% endif%} ms-auto" method="get"
|
<form action="{{ path('parts_search') }}" class="d-flex {% if is_navbar %}my-lg-0{% endif%} ms-auto" method="get"
|
||||||
|
|
@ -89,7 +233,7 @@
|
||||||
|
|
||||||
{# Show the options left in navbar #}
|
{# Show the options left in navbar #}
|
||||||
{% if is_navbar %}
|
{% if is_navbar %}
|
||||||
{{ _self.settings_drodown(is_navbar) }}
|
{{ _self.settings_drodown(is_navbar, searchFilter, isSearchList) }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<div {{ stimulus_controller('elements/part_search') }}
|
<div {{ stimulus_controller('elements/part_search') }}
|
||||||
|
|
@ -102,14 +246,15 @@
|
||||||
data-autocomplete="{{ path('typeahead_parts', {'query': '__QUERY__'}) }}"
|
data-autocomplete="{{ path('typeahead_parts', {'query': '__QUERY__'}) }}"
|
||||||
data-detail-url="{{ path('part_info', {'id': '__ID__'}) }}"
|
data-detail-url="{{ path('part_info', {'id': '__ID__'}) }}"
|
||||||
data-project-detail-url="{{ path('project_info', {'id': '__ID__'}) }}"
|
data-project-detail-url="{{ path('project_info', {'id': '__ID__'}) }}"
|
||||||
data-assembly-detail-url="{{ path('assembly_info', {'id': '__ID__'}) }}">
|
data-assembly-detail-url="{{ path('assembly_info', {'id': '__ID__'}) }}"
|
||||||
|
data-initial-query="{{ searchFilter ? searchFilter.keyword : app.request.get('keyword') }}">
|
||||||
|
|
||||||
<input type="hidden" name="keyword" required {{ stimulus_target('elements/part_search', 'input') }}>
|
<input type="hidden" name="keyword" required {{ stimulus_target('elements/part_search', 'input') }} value="{{ searchFilter ? searchFilter.keyword : app.request.get('keyword') }}">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{# And right in the standalone mode #}
|
{# And right in the standalone mode #}
|
||||||
{% if not is_navbar %}
|
{% if not is_navbar %}
|
||||||
{{ _self.settings_drodown(is_navbar) }}
|
{{ _self.settings_drodown(is_navbar, searchFilter, isSearchList) }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</form>
|
</form>
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
|
||||||
|
|
@ -8,24 +8,32 @@
|
||||||
<li class="nav-item" role="presentation">
|
<li class="nav-item" role="presentation">
|
||||||
<button class="nav-link active" id="filter-common-tab" data-bs-toggle="tab" data-bs-target="#filter-common"><i class="fas fa-id-card fa-fw"></i> {% trans %}part.edit.tab.common{% endtrans %}</button>
|
<button class="nav-link active" id="filter-common-tab" data-bs-toggle="tab" data-bs-target="#filter-common"><i class="fas fa-id-card fa-fw"></i> {% trans %}part.edit.tab.common{% endtrans %}</button>
|
||||||
</li>
|
</li>
|
||||||
|
{% if filterForm.manufacturer is defined or filterForm.manufacturing_status is defined %}
|
||||||
<li class="nav-item" role="presentation">
|
<li class="nav-item" role="presentation">
|
||||||
<button class="nav-link" id="filter-manufacturer-tab" data-bs-toggle="tab" data-bs-target="#filter-manufacturer"><i class="fas fa-industry fa-fw"></i> {% trans %}part.edit.tab.manufacturer{% endtrans %}</button>
|
<button class="nav-link" id="filter-manufacturer-tab" data-bs-toggle="tab" data-bs-target="#filter-manufacturer"><i class="fas fa-industry fa-fw"></i> {% trans %}part.edit.tab.manufacturer{% endtrans %}</button>
|
||||||
</li>
|
</li>
|
||||||
|
{% endif %}
|
||||||
<li class="nav-item" role="presentation">
|
<li class="nav-item" role="presentation">
|
||||||
<button class="nav-link" id="filter-advanced-tab" data-bs-toggle="tab" data-bs-target="#filter-advanced"><i class="fas fa-shapes fa-fw"></i> {% trans %}part.edit.tab.advanced{% endtrans %}</button>
|
<button class="nav-link" id="filter-advanced-tab" data-bs-toggle="tab" data-bs-target="#filter-advanced"><i class="fas fa-shapes fa-fw"></i> {% trans %}part.edit.tab.advanced{% endtrans %}</button>
|
||||||
</li>
|
</li>
|
||||||
|
{% if filterForm.storelocation is defined or filterForm.minAmount is defined %}
|
||||||
<li class="nav-item" role="presentation">
|
<li class="nav-item" role="presentation">
|
||||||
<button class="nav-link" id="filter-stocks-tab" data-bs-toggle="tab" data-bs-target="#filter-stocks"><i class="fas fa-boxes fa-fw"></i> {% trans %}part.edit.tab.part_lots{% endtrans %}</button>
|
<button class="nav-link" id="filter-stocks-tab" data-bs-toggle="tab" data-bs-target="#filter-stocks"><i class="fas fa-boxes fa-fw"></i> {% trans %}part.edit.tab.part_lots{% endtrans %}</button>
|
||||||
</li>
|
</li>
|
||||||
|
{% endif %}
|
||||||
<li class="nav-item" role="presentation">
|
<li class="nav-item" role="presentation">
|
||||||
<button class="nav-link" id="filter-attachments-tab" data-bs-toggle="tab" data-bs-target="#filter-attachments"><i class="fas fa-paperclip fa-fw"></i> {% trans %}part.edit.tab.attachments{% endtrans %}</button>
|
<button class="nav-link" id="filter-attachments-tab" data-bs-toggle="tab" data-bs-target="#filter-attachments"><i class="fas fa-paperclip fa-fw"></i> {% trans %}part.edit.tab.attachments{% endtrans %}</button>
|
||||||
</li>
|
</li>
|
||||||
|
{% if filterForm.supplier is defined or filterForm.orderdetailsCount is defined %}
|
||||||
<li class="nav-item" role="presentation">
|
<li class="nav-item" role="presentation">
|
||||||
<button class="nav-link" id="filter-orderdetails-tab" data-bs-toggle="tab" data-bs-target="#filter-orderdetails"><i class="fas fa-shopping-cart fa-fw"></i> {% trans %}part.edit.tab.orderdetails{% endtrans %}</button>
|
<button class="nav-link" id="filter-orderdetails-tab" data-bs-toggle="tab" data-bs-target="#filter-orderdetails"><i class="fas fa-shopping-cart fa-fw"></i> {% trans %}part.edit.tab.orderdetails{% endtrans %}</button>
|
||||||
</li>
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% if filterForm.parameters is defined %}
|
||||||
<li class="nav-item" role="presentation">
|
<li class="nav-item" role="presentation">
|
||||||
<button class="nav-link" id="filter-parameters-tab" data-bs-toggle="tab" data-bs-target="#filter-parameters"><i class="fas fa-atlas fa-fw"></i> {% trans %}part.edit.tab.specifications{% endtrans %}</button>
|
<button class="nav-link" id="filter-parameters-tab" data-bs-toggle="tab" data-bs-target="#filter-parameters"><i class="fas fa-atlas fa-fw"></i> {% trans %}part.edit.tab.specifications{% endtrans %}</button>
|
||||||
</li>
|
</li>
|
||||||
|
{% endif %}
|
||||||
{% if filterForm.project is defined %}
|
{% if filterForm.project is defined %}
|
||||||
<li class="nav-item" role="presentation">
|
<li class="nav-item" role="presentation">
|
||||||
<button class="nav-link" id="filter-projects-tab" data-bs-toggle="tab" data-bs-target="#filter-projects"><i class="fas fa-archive fa-fw"></i> {% trans %}project.labelp{% endtrans %}</button>
|
<button class="nav-link" id="filter-projects-tab" data-bs-toggle="tab" data-bs-target="#filter-projects"><i class="fas fa-archive fa-fw"></i> {% trans %}project.labelp{% endtrans %}</button>
|
||||||
|
|
@ -43,64 +51,68 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
{% if filterForm %}
|
||||||
{{ form_start(filterForm, {"attr": {"data-controller": "helpers--form-cleanup", "data-action": "helpers--form-cleanup#submit"}}) }}
|
{{ form_start(filterForm, {"attr": {"data-controller": "helpers--form-cleanup", "data-action": "helpers--form-cleanup#submit"}}) }}
|
||||||
|
|
||||||
<div class="tab-content">
|
<div class="tab-content">
|
||||||
<div class="tab-pane active pt-3" id="filter-common" role="tabpanel" aria-labelledby="filter-common-tab" tabindex="0">
|
<div class="tab-pane active pt-3" id="filter-common" role="tabpanel" aria-labelledby="filter-common-tab" tabindex="0">
|
||||||
{{ form_row(filterForm.name) }}
|
{{ form_row(filterForm.name) }}
|
||||||
{{ form_row(filterForm.description) }}
|
{% if filterForm.description is defined %}{{ form_row(filterForm.description) }}{% endif %}
|
||||||
{{ form_row(filterForm.category) }}
|
{% if filterForm.category is defined %}{{ form_row(filterForm.category) }}{% endif %}
|
||||||
{{ form_row(filterForm.footprint) }}
|
{% if filterForm.footprint is defined %}{{ form_row(filterForm.footprint) }}{% endif %}
|
||||||
{{ form_row(filterForm.tags) }}
|
{% if filterForm.tags is defined %}{{ form_row(filterForm.tags) }}{% endif %}
|
||||||
{{ form_row(filterForm.comment) }}
|
{% if filterForm.status is defined %}{{ form_row(filterForm.status) }}{% endif %}
|
||||||
|
{% if filterForm.comment is defined %}{{ form_row(filterForm.comment) }}{% endif %}
|
||||||
|
{% if filterForm.notes is defined %}{{ form_row(filterForm.notes) }}{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="tab-pane pt-3" id="filter-manufacturer" role="tabpanel" aria-labelledby="filter-manufacturer-tab" tabindex="0">
|
<div class="tab-pane pt-3" id="filter-manufacturer" role="tabpanel" aria-labelledby="filter-manufacturer-tab" tabindex="0">
|
||||||
{{ form_row(filterForm.manufacturer) }}
|
{% if filterForm.manufacturer is defined %}{{ form_row(filterForm.manufacturer) }}{% endif %}
|
||||||
{{ form_row(filterForm.manufacturing_status) }}
|
{% if filterForm.manufacturing_status is defined %}{{ form_row(filterForm.manufacturing_status) }}{% endif %}
|
||||||
{{ form_row(filterForm.manufacturer_product_number) }}
|
{% if filterForm.manufacturer_product_number is defined %}{{ form_row(filterForm.manufacturer_product_number) }}{% endif %}
|
||||||
{{ form_row(filterForm.manufacturer_product_url) }}
|
{% if filterForm.manufacturer_product_url is defined %}{{ form_row(filterForm.manufacturer_product_url) }}{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="tab-pane pt-3" id="filter-advanced" role="tabpanel" aria-labelledby="filter-advanced-tab" tabindex="0">
|
<div class="tab-pane pt-3" id="filter-advanced" role="tabpanel" aria-labelledby="filter-advanced-tab" tabindex="0">
|
||||||
{{ form_row(filterForm.favorite) }}
|
{% if filterForm.favorite is defined %}{{ form_row(filterForm.favorite) }}{% endif %}
|
||||||
{{ form_row(filterForm.needsReview) }}
|
{% if filterForm.needsReview is defined %}{{ form_row(filterForm.needsReview) }}{% endif %}
|
||||||
{{ form_row(filterForm.measurementUnit) }}
|
{% if filterForm.measurementUnit is defined %}{{ form_row(filterForm.measurementUnit) }}{% endif %}
|
||||||
{{ form_row(filterForm.partCustomState) }}
|
{% if filterForm.partCustomState is defined %}{{ form_row(filterForm.partCustomState) }}{% endif %}
|
||||||
{{ form_row(filterForm.mass) }}
|
{% if filterForm.mass is defined %}{{ form_row(filterForm.mass) }}{% endif %}
|
||||||
{{ form_row(filterForm.dbId) }}
|
{% if filterForm.dbId is defined %}{{ form_row(filterForm.dbId) }}{% endif %}
|
||||||
{{ form_row(filterForm.ipn) }}
|
{% if filterForm.ipn is defined %}{{ form_row(filterForm.ipn) }}{% endif %}
|
||||||
{{ form_row(filterForm.gtin) }}
|
{% if filterForm.gtin is defined %}{{ form_row(filterForm.gtin) }}{% endif %}
|
||||||
{{ form_row(filterForm.lastModified) }}
|
{% if filterForm.lastModified is defined %}{{ form_row(filterForm.lastModified) }}{% endif %}
|
||||||
{{ form_row(filterForm.addedDate) }}
|
{% if filterForm.addedDate is defined %}{{ form_row(filterForm.addedDate) }}{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="tab-pane pt-3" id="filter-stocks" role="tabpanel" aria-labelledby="filter-stocks-tab" tabindex="0">
|
<div class="tab-pane pt-3" id="filter-stocks" role="tabpanel" aria-labelledby="filter-stocks-tab" tabindex="0">
|
||||||
{{ form_row(filterForm.storelocation) }}
|
{% if filterForm.storelocation is defined %}{{ form_row(filterForm.storelocation) }}{% endif %}
|
||||||
{{ form_row(filterForm.minAmount) }}
|
{% if filterForm.minAmount is defined %}{{ form_row(filterForm.minAmount) }}{% endif %}
|
||||||
{{ form_row(filterForm.amountSum) }}
|
{% if filterForm.amountSum is defined %}{{ form_row(filterForm.amountSum) }}{% endif %}
|
||||||
{{ form_row(filterForm.lessThanDesired) }}
|
{% if filterForm.lessThanDesired is defined %}{{ form_row(filterForm.lessThanDesired) }}{% endif %}
|
||||||
{{ form_row(filterForm.lotCount) }}
|
{% if filterForm.lotCount is defined %}{{ form_row(filterForm.lotCount) }}{% endif %}
|
||||||
{{ form_row(filterForm.lotExpirationDate) }}
|
{% if filterForm.lotExpirationDate is defined %}{{ form_row(filterForm.lotExpirationDate) }}{% endif %}
|
||||||
{{ form_row(filterForm.lotDescription) }}
|
{% if filterForm.lotDescription is defined %}{{ form_row(filterForm.lotDescription) }}{% endif %}
|
||||||
{{ form_row(filterForm.lotOwner) }}
|
{% if filterForm.lotOwner is defined %}{{ form_row(filterForm.lotOwner) }}{% endif %}
|
||||||
{{ form_row(filterForm.lotNeedsRefill) }}
|
{% if filterForm.lotNeedsRefill is defined %}{{ form_row(filterForm.lotNeedsRefill) }}{% endif %}
|
||||||
{{ form_row(filterForm.lotUnknownAmount) }}
|
{% if filterForm.lotUnknownAmount is defined %}{{ form_row(filterForm.lotUnknownAmount) }}{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="tab-pane pt-3" id="filter-attachments" role="tabpanel" aria-labelledby="filter-attachments-tab" tabindex="0">
|
<div class="tab-pane pt-3" id="filter-attachments" role="tabpanel" aria-labelledby="filter-attachments-tab" tabindex="0">
|
||||||
{{ form_row(filterForm.attachmentsCount) }}
|
{% if filterForm.attachmentsCount is defined %}{{ form_row(filterForm.attachmentsCount) }}{% endif %}
|
||||||
{{ form_row(filterForm.attachmentType) }}
|
{% if filterForm.attachmentType is defined %}{{ form_row(filterForm.attachmentType) }}{% endif %}
|
||||||
{{ form_row(filterForm.attachmentName) }}
|
{% if filterForm.attachmentName is defined %}{{ form_row(filterForm.attachmentName) }}{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="tab-pane pt-3" id="filter-orderdetails" role="tabpanel" aria-labelledby="filter-orderdetails-tab" tabindex="0">
|
<div class="tab-pane pt-3" id="filter-orderdetails" role="tabpanel" aria-labelledby="filter-orderdetails-tab" tabindex="0">
|
||||||
{{ form_row(filterForm.supplier) }}
|
{% if filterForm.supplier is defined %}{{ form_row(filterForm.supplier) }}{% endif %}
|
||||||
{{ form_row(filterForm.orderdetailsCount) }}
|
{% if filterForm.orderdetailsCount is defined %}{{ form_row(filterForm.orderdetailsCount) }}{% endif %}
|
||||||
{{ form_row(filterForm.obsolete) }}
|
{% if filterForm.obsolete is defined %}{{ form_row(filterForm.obsolete) }}{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="tab-pane pt-3" id="filter-parameters" role="tabpanel" aria-labelledby="filter-parameters-tab" tabindex="0">
|
<div class="tab-pane pt-3" id="filter-parameters" role="tabpanel" aria-labelledby="filter-parameters-tab" tabindex="0">
|
||||||
|
{% if filterForm.parameters is defined %}
|
||||||
{% import 'components/collection_type.macro.html.twig' as collection %}
|
{% import 'components/collection_type.macro.html.twig' as collection %}
|
||||||
{{ form_row(filterForm.parametersCount) }}
|
{{ form_row(filterForm.parametersCount) }}
|
||||||
|
|
||||||
|
|
@ -128,6 +140,7 @@
|
||||||
{% trans %}filter.constraint.add{% endtrans %}
|
{% trans %}filter.constraint.add{% endtrans %}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% if filterForm.project is defined %}
|
{% if filterForm.project is defined %}
|
||||||
|
|
@ -174,6 +187,7 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{{ form_end(filterForm) }}
|
{{ form_end(filterForm) }}
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,16 @@
|
||||||
{% extends "base.html.twig" %}
|
{% extends "base.html.twig" %}
|
||||||
|
|
||||||
|
{% import "components/search.macro.html.twig" as search %}
|
||||||
|
|
||||||
{% block title %}
|
{% block title %}
|
||||||
{% trans %}parts_list.search.title{% endtrans %}: {{ keyword }}
|
{% if datasource == 'assemblies' %}
|
||||||
|
{% trans %}assembly.search.title{% endtrans %}
|
||||||
|
{% elseif datasource == 'projects' %}
|
||||||
|
{% trans %}project.search.title{% endtrans %}
|
||||||
|
{% else %}
|
||||||
|
{% trans %}parts_list.search.title{% endtrans %}
|
||||||
|
{% endif %}
|
||||||
|
: {{ keyword }}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
@ -11,12 +20,27 @@
|
||||||
<div class="accordion-header">
|
<div class="accordion-header">
|
||||||
<button class="accordion-button collapsed py-2" data-bs-toggle="collapse" data-bs-target="#searchInfo">
|
<button class="accordion-button collapsed py-2" data-bs-toggle="collapse" data-bs-target="#searchInfo">
|
||||||
<i class="fa-solid fa-magnifying-glass fa-fw"></i>
|
<i class="fa-solid fa-magnifying-glass fa-fw"></i>
|
||||||
{% trans %}parts_list.search.title{% endtrans %}: <b>{{ keyword }}</b>
|
{% if datasource == 'assemblies' %}
|
||||||
|
{% trans %}assembly.search.title{% endtrans %}
|
||||||
|
{% elseif datasource == 'projects' %}
|
||||||
|
{% trans %}project.search.title{% endtrans %}
|
||||||
|
{% else %}
|
||||||
|
{% trans %}parts_list.search.title{% endtrans %}
|
||||||
|
{% endif %}
|
||||||
|
: <b>{{ keyword }}</b>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div id="searchInfo" class="accordion-collapse collapse" data-bs-parent="#listAccordion">
|
<div id="searchInfo" class="accordion-collapse collapse" data-bs-parent="#listAccordion">
|
||||||
<div class="accordion-body">
|
<div class="accordion-body">
|
||||||
<h4>{% trans with {"%keyword%": keyword|escape} %}parts_list.search.searching_for{% endtrans %}</h4>
|
<h4>
|
||||||
|
{% if datasource == 'assemblies' %}
|
||||||
|
{% trans with {"%keyword%": keyword|escape} %}parts_list.search.searching_for_assemblies{% endtrans %}
|
||||||
|
{% elseif datasource == 'projects' %}
|
||||||
|
{% trans with {"%keyword%": keyword|escape} %}parts_list.search.searching_for_projects{% endtrans %}
|
||||||
|
{% else %}
|
||||||
|
{% trans with {"%keyword%": keyword|escape} %}parts_list.search.searching_for{% endtrans %}
|
||||||
|
{% endif %}
|
||||||
|
</h4>
|
||||||
{% trans %}parts_list.search_options.caption{% endtrans %}:
|
{% trans %}parts_list.search_options.caption{% endtrans %}:
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -25,13 +49,28 @@
|
||||||
<label class="form-check-label justify-content-start">{% trans %}name.label{% endtrans %}</label>
|
<label class="form-check-label justify-content-start">{% trans %}name.label{% endtrans %}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input type="checkbox" class="form-check-input" disabled {% if searchFilter.category %}checked{% endif %}>
|
<input type="checkbox" class="form-check-input" disabled {% if searchFilter.dbId %}checked{% endif %}>
|
||||||
<label class="form-check-label justify-content-start">{% trans %}category.label{% endtrans %}</label>
|
<label class="form-check-label justify-content-start">{% trans %}id.label{% endtrans %}</label>
|
||||||
</div>
|
</div>
|
||||||
|
{% if datasource == 'parts' or datasource == 'assemblies' or datasource == 'projects' %}
|
||||||
|
<div class="form-check">
|
||||||
|
<input type="checkbox" class="form-check-input" disabled {% if searchFilter.category %}checked{% endif %}>
|
||||||
|
<label class="form-check-label justify-content-start">
|
||||||
|
{% if datasource == 'parts' %}
|
||||||
|
{% trans %}category.label{% endtrans %}
|
||||||
|
{% elseif datasource == 'assemblies' %}
|
||||||
|
{% trans %}assembly.filter.parent{% endtrans %}
|
||||||
|
{% else %}
|
||||||
|
{% trans %}project.filter.parent{% endtrans %}
|
||||||
|
{% endif %}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input type="checkbox" class="form-check-input" disabled {% if searchFilter.description %}checked{% endif %}>
|
<input type="checkbox" class="form-check-input" disabled {% if searchFilter.description %}checked{% endif %}>
|
||||||
<label class="form-check-label justify-content-start">{% trans %}description.label{% endtrans %}</label>
|
<label class="form-check-label justify-content-start">{% trans %}description.label{% endtrans %}</label>
|
||||||
</div>
|
</div>
|
||||||
|
{% if datasource == 'parts' %}
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input type="checkbox" class="form-check-input" disabled {% if searchFilter.mpn %}checked{% endif %}>
|
<input type="checkbox" class="form-check-input" disabled {% if searchFilter.mpn %}checked{% endif %}>
|
||||||
<label class="form-check-label justify-content-start">{% trans %}part.edit.mpn{% endtrans %}</label>
|
<label class="form-check-label justify-content-start">{% trans %}part.edit.mpn{% endtrans %}</label>
|
||||||
|
|
@ -44,10 +83,36 @@
|
||||||
<input type="checkbox" class="form-check-input" disabled {% if searchFilter.storelocation %}checked{% endif %}>
|
<input type="checkbox" class="form-check-input" disabled {% if searchFilter.storelocation %}checked{% endif %}>
|
||||||
<label class="form-check-label justify-content-start">{% trans %}storelocation.label{% endtrans %}</label>
|
<label class="form-check-label justify-content-start">{% trans %}storelocation.label{% endtrans %}</label>
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if datasource == 'assemblies' %}
|
||||||
|
<div class="form-check">
|
||||||
|
<input type="checkbox" class="form-check-input" disabled {% if searchFilter.comment %}checked{% endif %}>
|
||||||
|
<label class="form-check-label justify-content-start">{% trans %}assembly.filter.comment{% endtrans %}</label>
|
||||||
|
</div>
|
||||||
|
{% elseif datasource == 'projects' %}
|
||||||
|
<div class="form-check">
|
||||||
|
<input type="checkbox" class="form-check-input" disabled {% if searchFilter.comment %}checked{% endif %}>
|
||||||
|
<label class="form-check-label justify-content-start">{% trans %}project.filter.comment{% endtrans %}</label>
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input type="checkbox" class="form-check-input" disabled {% if searchFilter.comment %}checked{% endif %}>
|
<input type="checkbox" class="form-check-input" disabled {% if searchFilter.comment %}checked{% endif %}>
|
||||||
<label class="form-check-label justify-content-start">{% trans %}comment.label{% endtrans %}</label>
|
<label class="form-check-label justify-content-start">{% trans %}comment.label{% endtrans %}</label>
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if datasource == 'parts' %}
|
||||||
|
<div class="form-check">
|
||||||
|
<input type="checkbox" class="form-check-input" disabled {% if searchFilter.manufacturingStatus %}checked{% endif %}>
|
||||||
|
<label class="form-check-label justify-content-start">{% trans %}part.edit.manufacturing_status{% endtrans %}</label>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if datasource == 'parts' or datasource == 'assemblies' %}
|
||||||
|
<div class="form-check">
|
||||||
|
<input type="checkbox" class="form-check-input" disabled {% if searchFilter.ipn %}checked{% endif %}>
|
||||||
|
<label class="form-check-label justify-content-start">{% trans %}part.edit.ipn{% endtrans %}</label>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if datasource == 'parts' %}
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input type="checkbox" class="form-check-input" disabled {% if searchFilter.ordernr %}checked{% endif %}>
|
<input type="checkbox" class="form-check-input" disabled {% if searchFilter.ordernr %}checked{% endif %}>
|
||||||
<label for="search_supplierpartnr" class="form-check-label justify-content-start">{% trans %}orderdetails.edit.supplierpartnr{% endtrans %}</label>
|
<label for="search_supplierpartnr" class="form-check-label justify-content-start">{% trans %}orderdetails.edit.supplierpartnr{% endtrans %}</label>
|
||||||
|
|
@ -64,6 +129,18 @@
|
||||||
<input type="checkbox" class="form-check-input" disabled {% if searchFilter.footprint %}checked{% endif %}>
|
<input type="checkbox" class="form-check-input" disabled {% if searchFilter.footprint %}checked{% endif %}>
|
||||||
<label for="search_footprint" class="form-check-label justify-content-start">{% trans %}footprint.label{% endtrans %}</label>
|
<label for="search_footprint" class="form-check-label justify-content-start">{% trans %}footprint.label{% endtrans %}</label>
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if datasource == 'assemblies' %}
|
||||||
|
<div class="form-check">
|
||||||
|
<input type="checkbox" class="form-check-input" disabled {% if searchFilter.status %}checked{% endif %}>
|
||||||
|
<label class="form-check-label justify-content-start">{% trans %}assembly.edit.status{% endtrans %}</label>
|
||||||
|
</div>
|
||||||
|
{% elseif datasource == 'projects' %}
|
||||||
|
<div class="form-check">
|
||||||
|
<input type="checkbox" class="form-check-input" disabled {% if searchFilter.status %}checked{% endif %}>
|
||||||
|
<label class="form-check-label justify-content-start">{% trans %}project.edit.status{% endtrans %}</label>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
<hr>
|
<hr>
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input type="checkbox" class="form-check-input" disabled {% if searchFilter.regex %}checked{% endif %}>
|
<input type="checkbox" class="form-check-input" disabled {% if searchFilter.regex %}checked{% endif %}>
|
||||||
|
|
@ -73,10 +150,13 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
{% include "parts/lists/_filter.html.twig" %}
|
{% include "parts/lists/_filter.html.twig" %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% include "parts/lists/_parts_list.html.twig" %}
|
{% include "parts/lists/_parts_list.html.twig" %}
|
||||||
|
|
||||||
|
<form action="{{ path('parts_search') }}" method="get" class="d-none">
|
||||||
|
<input type="hidden" name="keyword" value="{{ keyword }}">
|
||||||
|
{{ search.settings_drodown(true, searchFilter, true) }}
|
||||||
|
</form>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
||||||
|
|
@ -1617,6 +1617,174 @@ Související prvky budou přesunuty nahoru.</target>
|
||||||
<target>Vyhledat díly</target>
|
<target>Vyhledat díly</target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="Upyz4NL" name="assembly.search.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.search.title</source>
|
||||||
|
<target>Hledání sestav</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="deO4FsM" name="project.search.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.search.title</source>
|
||||||
|
<target>Hledání projektů</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="Xq01S2F" name="project.table.id">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.id</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="wNWc9GW" name="project.table.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.name</source>
|
||||||
|
<target>Název</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="9AdhysG" name="project.table.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.description</source>
|
||||||
|
<target>Popis</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="4qJkRic" name="project.table.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.comment</source>
|
||||||
|
<target>Poznámky</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="NrH0WW8" name="project.table.addedDate">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.addedDate</source>
|
||||||
|
<target>Přidáno dne</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="6rN1Yf1" name="project.table.lastModified">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.lastModified</source>
|
||||||
|
<target>Naposledy upraveno</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="F2nNNFD" name="project.table.edit">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit</source>
|
||||||
|
<target>Upravit</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="KZCGmOp" name="project.table.edit.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit.title</source>
|
||||||
|
<target>Upravit projekt</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="cmck5zP" name="datasource.parts">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.parts</source>
|
||||||
|
<target>Součástky</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="3tkaYAP" name="datasource.projects">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.projects</source>
|
||||||
|
<target>Projekty</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="aYPamdy" name="datasource.assemblies">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.assemblies</source>
|
||||||
|
<target>Sestavy</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="searching_for_assemblies" name="parts_list.search.searching_for_assemblies">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>parts_list.search.searching_for_assemblies</source>
|
||||||
|
<target>Hledání sestav...</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="searching_for_projects" name="parts_list.search.searching_for_projects">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>parts_list.search.searching_for_projects</source>
|
||||||
|
<target>Hledání projektů...</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="ObC5PW9" name="settings.behavior.table.projects_default_columns">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>settings.behavior.table.projects_default_columns</source>
|
||||||
|
<target>Výchozí sloupce pro tabulky projektů</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="dHwCrSv" name="settings.behavior.table.projects_default_columns.help">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>settings.behavior.table.projects_default_columns.help</source>
|
||||||
|
<target>Vyberte sloupce, které se mají ve výchozím nastavení zobrazovat v tabulkách projektů.</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="asdfghj" name="assembly.filter.status">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.filter.status</source>
|
||||||
|
<target>Stav sestavy</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="qwertyu" name="assembly.filter.parent">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.filter.parent</source>
|
||||||
|
<target>Nadřazená sestava</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="acEe1Tb_notes" name="assembly.table.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.table.comment</source>
|
||||||
|
<target>Poznámky</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="Ag9x60T" name="project.filter.dbId">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.dbId</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="MjSfszH" name="project.filter.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.name</source>
|
||||||
|
<target>Název</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="ELxZW9y" name="project.filter.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.description</source>
|
||||||
|
<target>Popis</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="svzDJ9V" name="project.filter.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.comment</source>
|
||||||
|
<target>Poznámky</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="sCPeQFs" name="project.filter.status">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.status</source>
|
||||||
|
<target>Stav projektu</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="1Fcochg" name="project.filter.parent">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.parent</source>
|
||||||
|
<target>Nadřazený projekt</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="s3yI9D6" name="project.filter.attachments_count">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.attachments_count</source>
|
||||||
|
<target>Počet příloh</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="75p958O" name="project.filter.attachmentName">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.attachmentName</source>
|
||||||
|
<target>Název přílohy</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
<unit id=".nsfK4V" name="parts_list.storelocation.title">
|
<unit id=".nsfK4V" name="parts_list.storelocation.title">
|
||||||
<segment state="translated">
|
<segment state="translated">
|
||||||
<source>parts_list.storelocation.title</source>
|
<source>parts_list.storelocation.title</source>
|
||||||
|
|
|
||||||
|
|
@ -1575,6 +1575,174 @@ Underelementer vil blive flyttet opad.</target>
|
||||||
<target>Søg komponenter</target>
|
<target>Søg komponenter</target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="Upyz4NL" name="assembly.search.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.search.title</source>
|
||||||
|
<target>Søgning i baugrupper</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="deO4FsM" name="project.search.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.search.title</source>
|
||||||
|
<target>Projektsøgning</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="Xq01S2F" name="project.table.id">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.id</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="wNWc9GW" name="project.table.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.name</source>
|
||||||
|
<target>Navn</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="9AdhysG" name="project.table.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.description</source>
|
||||||
|
<target>Beskrivelse</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="4qJkRic" name="project.table.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.comment</source>
|
||||||
|
<target>Noter</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="NrH0WW8" name="project.table.addedDate">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.addedDate</source>
|
||||||
|
<target>Tilføjet den</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="6rN1Yf1" name="project.table.lastModified">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.lastModified</source>
|
||||||
|
<target>Sidst ændret den</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="F2nNNFD" name="project.table.edit">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit</source>
|
||||||
|
<target>Rediger</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="KZCGmOp" name="project.table.edit.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit.title</source>
|
||||||
|
<target>Rediger projekt</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="cmck5zP" name="datasource.parts">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.parts</source>
|
||||||
|
<target>Bauteile</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="3tkaYAP" name="datasource.projects">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.projects</source>
|
||||||
|
<target>Projekter</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="aYPamdy" name="datasource.assemblies">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.assemblies</source>
|
||||||
|
<target>Baugrupper</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="searching_for_assemblies" name="parts_list.search.searching_for_assemblies">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>parts_list.search.searching_for_assemblies</source>
|
||||||
|
<target>Søger efter baugrupper...</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="searching_for_projects" name="parts_list.search.searching_for_projects">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>parts_list.search.searching_for_projects</source>
|
||||||
|
<target>Søger efter projekter...</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="ObC5PW9" name="settings.behavior.table.projects_default_columns">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>settings.behavior.table.projects_default_columns</source>
|
||||||
|
<target>Standardkolonner for projekttabeller</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="dHwCrSv" name="settings.behavior.table.projects_default_columns.help">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>settings.behavior.table.projects_default_columns.help</source>
|
||||||
|
<target>Vælg de kolonner, der skal vises som standard i projekttabeller.</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="asdfghj" name="assembly.filter.status">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.filter.status</source>
|
||||||
|
<target>Baugruppestatus</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="qwertyu" name="assembly.filter.parent">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.filter.parent</source>
|
||||||
|
<target>Overordnet baugruppe</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="acEe1Tb_notes" name="assembly.table.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.table.comment</source>
|
||||||
|
<target>Noter</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="Ag9x60T" name="project.filter.dbId">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.dbId</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="MjSfszH" name="project.filter.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.name</source>
|
||||||
|
<target>Navn</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="ELxZW9y" name="project.filter.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.description</source>
|
||||||
|
<target>Beskrivelse</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="svzDJ9V" name="project.filter.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.comment</source>
|
||||||
|
<target>Noter</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="sCPeQFs" name="project.filter.status">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.status</source>
|
||||||
|
<target>Projektstatus</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="1Fcochg" name="project.filter.parent">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.parent</source>
|
||||||
|
<target>Overordnet projekt</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="s3yI9D6" name="project.filter.attachments_count">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.attachments_count</source>
|
||||||
|
<target>Antal vedhæftede filer</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="75p958O" name="project.filter.attachmentName">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.attachmentName</source>
|
||||||
|
<target>Filnavn på vedhæftet fil</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
<unit id=".nsfK4V" name="parts_list.storelocation.title">
|
<unit id=".nsfK4V" name="parts_list.storelocation.title">
|
||||||
<segment state="translated">
|
<segment state="translated">
|
||||||
<source>parts_list.storelocation.title</source>
|
<source>parts_list.storelocation.title</source>
|
||||||
|
|
|
||||||
|
|
@ -1574,6 +1574,66 @@ Subelemente werden beim Löschen nach oben verschoben.</target>
|
||||||
<target>Bauteilesuche</target>
|
<target>Bauteilesuche</target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="Upyz4NL" name="assembly.search.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.search.title</source>
|
||||||
|
<target>Baugruppensuche</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="deO4FsM" name="project.search.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.search.title</source>
|
||||||
|
<target>Projektsuche</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="wNWc9GW" name="project.table.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.name</source>
|
||||||
|
<target>Name</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="Xq01S2F" name="project.table.id">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.id</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="9AdhysG" name="project.table.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.description</source>
|
||||||
|
<target>Beschreibung</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="4qJkRic" name="project.table.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.comment</source>
|
||||||
|
<target>Notizen</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="NrH0WW8" name="project.table.addedDate">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.addedDate</source>
|
||||||
|
<target>Hinzugefügt am</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="6rN1Yf1" name="project.table.lastModified">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.lastModified</source>
|
||||||
|
<target>Zuletzt geändert am</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="F2nNNFD" name="project.table.edit">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit</source>
|
||||||
|
<target>Bearbeiten</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="KZCGmOp" name="project.table.edit.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit.title</source>
|
||||||
|
<target>Projekt bearbeiten</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
<unit id=".nsfK4V" name="parts_list.storelocation.title">
|
<unit id=".nsfK4V" name="parts_list.storelocation.title">
|
||||||
<segment state="translated">
|
<segment state="translated">
|
||||||
<source>parts_list.storelocation.title</source>
|
<source>parts_list.storelocation.title</source>
|
||||||
|
|
@ -2446,6 +2506,24 @@ Wenn Sie dies fehlerhafterweise gemacht haben oder ein Computer nicht mehr vertr
|
||||||
<target>Datenquelle</target>
|
<target>Datenquelle</target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="cmck5zP" name="datasource.parts">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.parts</source>
|
||||||
|
<target>Bauteile</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="3tkaYAP" name="datasource.projects">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.projects</source>
|
||||||
|
<target>Projekte</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="aYPamdy" name="datasource.assemblies">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.assemblies</source>
|
||||||
|
<target>Baugruppen</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
<unit id="uF_oOxY" name="manufacturer.labelp">
|
<unit id="uF_oOxY" name="manufacturer.labelp">
|
||||||
<segment state="translated">
|
<segment state="translated">
|
||||||
<source>manufacturer.labelp</source>
|
<source>manufacturer.labelp</source>
|
||||||
|
|
@ -6827,6 +6905,18 @@ Element 1 -> Element 1.2</target>
|
||||||
<target>Suche Teile mit dem Suchbegriff <b>%keyword%</b></target>
|
<target>Suche Teile mit dem Suchbegriff <b>%keyword%</b></target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="searching_for_assemblies" name="parts_list.search.searching_for_assemblies">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>parts_list.search.searching_for_assemblies</source>
|
||||||
|
<target>Suche Baugruppen mit dem Suchbegriff <b>%keyword%</b></target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="searching_for_projects" name="parts_list.search.searching_for_projects">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>parts_list.search.searching_for_projects</source>
|
||||||
|
<target>Suche Projekte mit dem Suchbegriff <b>%keyword%</b></target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
<unit id="4vomKLa" name="parts_list.search_options.caption">
|
<unit id="4vomKLa" name="parts_list.search_options.caption">
|
||||||
<segment state="translated">
|
<segment state="translated">
|
||||||
<source>parts_list.search_options.caption</source>
|
<source>parts_list.search_options.caption</source>
|
||||||
|
|
@ -10467,12 +10557,24 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön
|
||||||
<target>Standardmäßige Spalten für Baugruppentabellen</target>
|
<target>Standardmäßige Spalten für Baugruppentabellen</target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="ObC5PW9" name="settings.behavior.table.projects_default_columns">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>settings.behavior.table.projects_default_columns</source>
|
||||||
|
<target>Standard-Spalten für Projekte</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
<unit id="t4jhp3R" name="settings.behavior.table.assemblies_default_columns.help">
|
<unit id="t4jhp3R" name="settings.behavior.table.assemblies_default_columns.help">
|
||||||
<segment state="translated">
|
<segment state="translated">
|
||||||
<source>settings.behavior.table.assemblies_default_columns.help</source>
|
<source>settings.behavior.table.assemblies_default_columns.help</source>
|
||||||
<target>Die Spalten, die standardmäßig in Baugruppentabellen angezeigt werden sollen. Die Reihenfolge der Elemente kann per Drag & Drop geändert werden.</target>
|
<target>Die Spalten, die standardmäßig in Baugruppentabellen angezeigt werden sollen. Die Reihenfolge der Elemente kann per Drag & Drop geändert werden.</target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="dHwCrSv" name="settings.behavior.table.projects_default_columns.help">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>settings.behavior.table.projects_default_columns.help</source>
|
||||||
|
<target>Wähle die Spalten aus, die standardmäßig in der Projektsuche angezeigt werden sollen.</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
<unit id="Uj8ie5E" name="settings.behavior.table.assemblies_bom_default_columns">
|
<unit id="Uj8ie5E" name="settings.behavior.table.assemblies_bom_default_columns">
|
||||||
<segment state="translated">
|
<segment state="translated">
|
||||||
<source>settings.behavior.table.assemblies_bom_default_columns</source>
|
<source>settings.behavior.table.assemblies_bom_default_columns</source>
|
||||||
|
|
@ -12614,6 +12716,18 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön
|
||||||
<target>Notizen</target>
|
<target>Notizen</target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="asdfghj" name="assembly.filter.status">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.filter.status</source>
|
||||||
|
<target>Baugruppen-Status</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="qwertyu" name="assembly.filter.parent">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.filter.parent</source>
|
||||||
|
<target>Übergeordnete Baugruppe</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
<unit id="ux2Ws9p" name="assembly.filter.attachments_count">
|
<unit id="ux2Ws9p" name="assembly.filter.attachments_count">
|
||||||
<segment state="translated">
|
<segment state="translated">
|
||||||
<source>assembly.filter.attachments_count</source>
|
<source>assembly.filter.attachments_count</source>
|
||||||
|
|
@ -12656,6 +12770,12 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön
|
||||||
<target>Beschreibung</target>
|
<target>Beschreibung</target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="acEe1Tb_notes" name="assembly.table.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.table.comment</source>
|
||||||
|
<target>Notizen</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
<unit id="ahzol5T" name="assembly.table.referencedAssemblies">
|
<unit id="ahzol5T" name="assembly.table.referencedAssemblies">
|
||||||
<segment state="translated">
|
<segment state="translated">
|
||||||
<source>assembly.table.referencedAssemblies</source>
|
<source>assembly.table.referencedAssemblies</source>
|
||||||
|
|
@ -12692,6 +12812,96 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön
|
||||||
<target>Ungültiger regulärer Ausdruck (regex)</target>
|
<target>Ungültiger regulärer Ausdruck (regex)</target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="Ag9x60T" name="project.filter.dbId">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.dbId</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="MjSfszH" name="project.filter.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.name</source>
|
||||||
|
<target>Name</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="ELxZW9y" name="project.filter.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.description</source>
|
||||||
|
<target>Beschreibung</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="svzDJ9V" name="project.filter.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.comment</source>
|
||||||
|
<target>Notizen</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="sCPeQFs" name="project.filter.status">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.status</source>
|
||||||
|
<target>Projekt-Status</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="1Fcochg" name="project.filter.parent">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.parent</source>
|
||||||
|
<target>Übergeordnetes Projekt</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="s3yI9D6" name="project.filter.attachments_count">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.attachments_count</source>
|
||||||
|
<target>Anzahl Dateianhänge</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="75p958O" name="project.filter.attachmentName">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.attachmentName</source>
|
||||||
|
<target>Name des Dateianhangs</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="project.table.id" name="project.table.id">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.id</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="project.table.name" name="project.table.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.name</source>
|
||||||
|
<target>Name</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="project.table.description" name="project.table.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.description</source>
|
||||||
|
<target>Beschreibung</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="project.table.addedDate" name="project.table.addedDate">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.addedDate</source>
|
||||||
|
<target>Hinzugefügt</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="project.table.lastModified" name="project.table.lastModified">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.lastModified</source>
|
||||||
|
<target>Zuletzt bearbeitet</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="project.table.edit" name="project.table.edit">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit</source>
|
||||||
|
<target>Ändern</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="project.table.edit.title" name="project.table.edit.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit.title</source>
|
||||||
|
<target>Projekt ändern</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
<unit id="8uh6vTx" name="assembly.bom.table.id">
|
<unit id="8uh6vTx" name="assembly.bom.table.id">
|
||||||
<segment state="translated">
|
<segment state="translated">
|
||||||
<source>assembly.bom.table.id</source>
|
<source>assembly.bom.table.id</source>
|
||||||
|
|
|
||||||
|
|
@ -774,6 +774,174 @@
|
||||||
<target>Αναζήτηση εξαρτημάτων</target>
|
<target>Αναζήτηση εξαρτημάτων</target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="Upyz4NL" name="assembly.search.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.search.title</source>
|
||||||
|
<target>Αναζήτηση συναρμολογημάτων</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="deO4FsM" name="project.search.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.search.title</source>
|
||||||
|
<target>Αναζήτηση έργων</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="Xq01S2F" name="project.table.id">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.id</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="wNWc9GW" name="project.table.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.name</source>
|
||||||
|
<target>Όνομα</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="9AdhysG" name="project.table.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.description</source>
|
||||||
|
<target>Περιγραφή</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="4qJkRic" name="project.table.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.comment</source>
|
||||||
|
<target>Σχόλια</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="NrH0WW8" name="project.table.addedDate">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.addedDate</source>
|
||||||
|
<target>Προστέθηκε στις</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="6rN1Yf1" name="project.table.lastModified">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.lastModified</source>
|
||||||
|
<target>Τελευταία τροποποίηση</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="F2nNNFD" name="project.table.edit">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit</source>
|
||||||
|
<target>Επεξεργασία</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="KZCGmOp" name="project.table.edit.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit.title</source>
|
||||||
|
<target>Επεξεργασία έργου</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="cmck5zP" name="datasource.parts">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.parts</source>
|
||||||
|
<target>Εξαρτήματα</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="3tkaYAP" name="datasource.projects">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.projects</source>
|
||||||
|
<target>Έργα</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="aYPamdy" name="datasource.assemblies">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.assemblies</source>
|
||||||
|
<target>Συναρμολογήματα</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="searching_for_assemblies" name="parts_list.search.searching_for_assemblies">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>parts_list.search.searching_for_assemblies</source>
|
||||||
|
<target>Αναζήτηση συναρμολογημάτων...</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="searching_for_projects" name="parts_list.search.searching_for_projects">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>parts_list.search.searching_for_projects</source>
|
||||||
|
<target>Αναζήτηση έργων...</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="ObC5PW9" name="settings.behavior.table.projects_default_columns">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>settings.behavior.table.projects_default_columns</source>
|
||||||
|
<target>Προεπιλεγμένες στήλες για πίνακες έργων</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="dHwCrSv" name="settings.behavior.table.projects_default_columns.help">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>settings.behavior.table.projects_default_columns.help</source>
|
||||||
|
<target>Επιλέξτε τις στήλες που θα εμφανίζονται από προεπιλογή στους πίνακες έργων.</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="asdfghj" name="assembly.filter.status">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.filter.status</source>
|
||||||
|
<target>Κατάσταση συναρμολογήματος</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="qwertyu" name="assembly.filter.parent">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.filter.parent</source>
|
||||||
|
<target>Γονικό συναρμολόγημα</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="acEe1Tb_notes" name="assembly.table.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.table.comment</source>
|
||||||
|
<target>Σχόλια</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="Ag9x60T" name="project.filter.dbId">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.dbId</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="MjSfszH" name="project.filter.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.name</source>
|
||||||
|
<target>Όνομα</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="ELxZW9y" name="project.filter.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.description</source>
|
||||||
|
<target>Περιγραφή</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="svzDJ9V" name="project.filter.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.comment</source>
|
||||||
|
<target>Σχόλια</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="sCPeQFs" name="project.filter.status">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.status</source>
|
||||||
|
<target>Κατάσταση έργου</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="1Fcochg" name="project.filter.parent">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.parent</source>
|
||||||
|
<target>Γονικό έργο</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="s3yI9D6" name="project.filter.attachments_count">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.attachments_count</source>
|
||||||
|
<target>Αριθμός συνημμένων</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="75p958O" name="project.filter.attachmentName">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.attachmentName</source>
|
||||||
|
<target>Όνομα συνημμένου</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
<unit id="gwE_D3w" name="parts_list.storelocation.title">
|
<unit id="gwE_D3w" name="parts_list.storelocation.title">
|
||||||
<segment state="translated">
|
<segment state="translated">
|
||||||
<source>parts_list.storelocation.title</source>
|
<source>parts_list.storelocation.title</source>
|
||||||
|
|
|
||||||
|
|
@ -1575,6 +1575,66 @@ Sub elements will be moved upwards.</target>
|
||||||
<target>Search [[part]]</target>
|
<target>Search [[part]]</target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="Upyz4NL" name="assembly.search.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.search.title</source>
|
||||||
|
<target>Assembly search</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="deO4FsM" name="project.search.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.search.title</source>
|
||||||
|
<target>Project search</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="wNWc9GW" name="project.table.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.name</source>
|
||||||
|
<target>Name</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="Xq01S2F" name="project.table.id">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.id</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="9AdhysG" name="project.table.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.description</source>
|
||||||
|
<target>Description</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="4qJkRic" name="project.table.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.comment</source>
|
||||||
|
<target>Notes</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="NrH0WW8" name="project.table.addedDate">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.addedDate</source>
|
||||||
|
<target>Added at</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="6rN1Yf1" name="project.table.lastModified">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.lastModified</source>
|
||||||
|
<target>Last modified at</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="F2nNNFD" name="project.table.edit">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit</source>
|
||||||
|
<target>Edit</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="KZCGmOp" name="project.table.edit.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit.title</source>
|
||||||
|
<target>Edit project</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
<unit id=".nsfK4V" name="parts_list.storelocation.title">
|
<unit id=".nsfK4V" name="parts_list.storelocation.title">
|
||||||
<segment state="translated">
|
<segment state="translated">
|
||||||
<source>parts_list.storelocation.title</source>
|
<source>parts_list.storelocation.title</source>
|
||||||
|
|
@ -2447,6 +2507,24 @@ If you have done this incorrectly or if a computer is no longer trusted, you can
|
||||||
<target>Data source</target>
|
<target>Data source</target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="cmck5zP" name="datasource.parts">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.parts</source>
|
||||||
|
<target>Parts</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="3tkaYAP" name="datasource.projects">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.projects</source>
|
||||||
|
<target>Projects</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="aYPamdy" name="datasource.assemblies">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.assemblies</source>
|
||||||
|
<target>Assemblies</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
<unit id="uF_oOxY" name="manufacturer.labelp">
|
<unit id="uF_oOxY" name="manufacturer.labelp">
|
||||||
<segment state="translated">
|
<segment state="translated">
|
||||||
<source>manufacturer.labelp</source>
|
<source>manufacturer.labelp</source>
|
||||||
|
|
@ -6828,6 +6906,18 @@ Element 1 -> Element 1.2</target>
|
||||||
<target>Searching parts with keyword <b>%keyword%</b></target>
|
<target>Searching parts with keyword <b>%keyword%</b></target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="searching_for_assemblies" name="parts_list.search.searching_for_assemblies">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>parts_list.search.searching_for_assemblies</source>
|
||||||
|
<target>Searching assemblies with keyword <b>%keyword%</b></target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="searching_for_projects" name="parts_list.search.searching_for_projects">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>parts_list.search.searching_for_projects</source>
|
||||||
|
<target>Searching projects with keyword <b>%keyword%</b></target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
<unit id="4vomKLa" name="parts_list.search_options.caption">
|
<unit id="4vomKLa" name="parts_list.search_options.caption">
|
||||||
<segment state="translated">
|
<segment state="translated">
|
||||||
<source>parts_list.search_options.caption</source>
|
<source>parts_list.search_options.caption</source>
|
||||||
|
|
@ -10468,12 +10558,24 @@ Please note, that you can not impersonate a disabled user. If you try you will g
|
||||||
<target>Default columns for assembly tables</target>
|
<target>Default columns for assembly tables</target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="ObC5PW9" name="settings.behavior.table.projects_default_columns">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>settings.behavior.table.projects_default_columns</source>
|
||||||
|
<target>Default columns for projects</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
<unit id="t4jhp3R" name="settings.behavior.table.assemblies_default_columns.help">
|
<unit id="t4jhp3R" name="settings.behavior.table.assemblies_default_columns.help">
|
||||||
<segment state="translated">
|
<segment state="translated">
|
||||||
<source>settings.behavior.table.assemblies_default_columns.help</source>
|
<source>settings.behavior.table.assemblies_default_columns.help</source>
|
||||||
<target>The columns to show by default in assembly tables. Order of items can be changed via drag & drop.</target>
|
<target>The columns to show by default in assembly tables. Order of items can be changed via drag & drop.</target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="dHwCrSv" name="settings.behavior.table.projects_default_columns.help">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>settings.behavior.table.projects_default_columns.help</source>
|
||||||
|
<target>Select the columns that should be displayed by default in the project search.</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
<unit id="Uj8ie5E" name="settings.behavior.table.assemblies_bom_default_columns">
|
<unit id="Uj8ie5E" name="settings.behavior.table.assemblies_bom_default_columns">
|
||||||
<segment state="translated">
|
<segment state="translated">
|
||||||
<source>settings.behavior.table.assemblies_bom_default_columns</source>
|
<source>settings.behavior.table.assemblies_bom_default_columns</source>
|
||||||
|
|
@ -12636,7 +12738,19 @@ Please note, that you can not impersonate a disabled user. If you try you will g
|
||||||
<unit id="kix5dMf" name="assembly.filter.comment">
|
<unit id="kix5dMf" name="assembly.filter.comment">
|
||||||
<segment state="translated">
|
<segment state="translated">
|
||||||
<source>assembly.filter.comment</source>
|
<source>assembly.filter.comment</source>
|
||||||
<target>Comments</target>
|
<target>Notes</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="asdfghj" name="assembly.filter.status">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.filter.status</source>
|
||||||
|
<target>Assembly status</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="qwertyu" name="assembly.filter.parent">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.filter.parent</source>
|
||||||
|
<target>Parent assembly</target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
<unit id="ux2Ws9p" name="assembly.filter.attachments_count">
|
<unit id="ux2Ws9p" name="assembly.filter.attachments_count">
|
||||||
|
|
@ -12681,6 +12795,12 @@ Please note, that you can not impersonate a disabled user. If you try you will g
|
||||||
<target>Description</target>
|
<target>Description</target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="acEe1Tb_notes" name="assembly.table.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.table.comment</source>
|
||||||
|
<target>Notes</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
<unit id="ahzol5T" name="assembly.table.referencedAssemblies">
|
<unit id="ahzol5T" name="assembly.table.referencedAssemblies">
|
||||||
<segment state="translated">
|
<segment state="translated">
|
||||||
<source>assembly.table.referencedAssemblies</source>
|
<source>assembly.table.referencedAssemblies</source>
|
||||||
|
|
@ -12717,6 +12837,96 @@ Please note, that you can not impersonate a disabled user. If you try you will g
|
||||||
<target>Invalid regular expression (regex)</target>
|
<target>Invalid regular expression (regex)</target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="Ag9x60T" name="project.filter.dbId">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.dbId</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="MjSfszH" name="project.filter.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.name</source>
|
||||||
|
<target>Name</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="ELxZW9y" name="project.filter.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.description</source>
|
||||||
|
<target>Description</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="svzDJ9V" name="project.filter.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.comment</source>
|
||||||
|
<target>Notes</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="sCPeQFs" name="project.filter.status">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.status</source>
|
||||||
|
<target>Project status</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="1Fcochg" name="project.filter.parent">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.parent</source>
|
||||||
|
<target>Parent project</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="s3yI9D6" name="project.filter.attachments_count">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.attachments_count</source>
|
||||||
|
<target>Number of attachments</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="75p958O" name="project.filter.attachmentName">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.attachmentName</source>
|
||||||
|
<target>Attachment name</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="project.table.id" name="project.table.id">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.id</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="project.table.name" name="project.table.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.name</source>
|
||||||
|
<target>Name</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="project.table.description" name="project.table.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.description</source>
|
||||||
|
<target>Description</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="project.table.addedDate" name="project.table.addedDate">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.addedDate</source>
|
||||||
|
<target>Added</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="project.table.lastModified" name="project.table.lastModified">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.lastModified</source>
|
||||||
|
<target>Last edited</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="project.table.edit" name="project.table.edit">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit</source>
|
||||||
|
<target>Edit</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="project.table.edit.title" name="project.table.edit.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit.title</source>
|
||||||
|
<target>Edit project</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
<unit id="8uh6vTx" name="assembly.bom.table.id">
|
<unit id="8uh6vTx" name="assembly.bom.table.id">
|
||||||
<segment state="translated">
|
<segment state="translated">
|
||||||
<source>assembly.bom.table.id</source>
|
<source>assembly.bom.table.id</source>
|
||||||
|
|
|
||||||
|
|
@ -1617,6 +1617,174 @@ Subelementos serán desplazados hacia arriba.</target>
|
||||||
<target>Buscar componentes</target>
|
<target>Buscar componentes</target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="Upyz4NL" name="assembly.search.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.search.title</source>
|
||||||
|
<target>Búsqueda de ensamblajes</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="deO4FsM" name="project.search.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.search.title</source>
|
||||||
|
<target>Búsqueda de proyectos</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="Xq01S2F" name="project.table.id">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.id</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="wNWc9GW" name="project.table.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.name</source>
|
||||||
|
<target>Nombre</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="9AdhysG" name="project.table.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.description</source>
|
||||||
|
<target>Descripción</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="4qJkRic" name="project.table.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.comment</source>
|
||||||
|
<target>Notas</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="NrH0WW8" name="project.table.addedDate">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.addedDate</source>
|
||||||
|
<target>Añadido el</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="6rN1Yf1" name="project.table.lastModified">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.lastModified</source>
|
||||||
|
<target>Última modificación</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="F2nNNFD" name="project.table.edit">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit</source>
|
||||||
|
<target>Editar</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="KZCGmOp" name="project.table.edit.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit.title</source>
|
||||||
|
<target>Editar proyecto</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="cmck5zP" name="datasource.parts">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.parts</source>
|
||||||
|
<target>Piezas</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="3tkaYAP" name="datasource.projects">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.projects</source>
|
||||||
|
<target>Proyectos</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="aYPamdy" name="datasource.assemblies">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.assemblies</source>
|
||||||
|
<target>Ensamblajes</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="searching_for_assemblies" name="parts_list.search.searching_for_assemblies">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>parts_list.search.searching_for_assemblies</source>
|
||||||
|
<target>Buscando ensamblajes...</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="searching_for_projects" name="parts_list.search.searching_for_projects">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>parts_list.search.searching_for_projects</source>
|
||||||
|
<target>Buscando proyectos...</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="ObC5PW9" name="settings.behavior.table.projects_default_columns">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>settings.behavior.table.projects_default_columns</source>
|
||||||
|
<target>Columnas predeterminadas para tablas de proyectos</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="dHwCrSv" name="settings.behavior.table.projects_default_columns.help">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>settings.behavior.table.projects_default_columns.help</source>
|
||||||
|
<target>Seleccione las columnas que se mostrarán por defecto en las tablas de proyectos.</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="asdfghj" name="assembly.filter.status">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.filter.status</source>
|
||||||
|
<target>Estado del ensamblaje</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="qwertyu" name="assembly.filter.parent">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.filter.parent</source>
|
||||||
|
<target>Ensamblaje superior</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="acEe1Tb_notes" name="assembly.table.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.table.comment</source>
|
||||||
|
<target>Notas</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="Ag9x60T" name="project.filter.dbId">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.dbId</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="MjSfszH" name="project.filter.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.name</source>
|
||||||
|
<target>Nombre</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="ELxZW9y" name="project.filter.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.description</source>
|
||||||
|
<target>Descripción</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="svzDJ9V" name="project.filter.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.comment</source>
|
||||||
|
<target>Notas</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="sCPeQFs" name="project.filter.status">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.status</source>
|
||||||
|
<target>Estado del proyecto</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="1Fcochg" name="project.filter.parent">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.parent</source>
|
||||||
|
<target>Proyecto superior</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="s3yI9D6" name="project.filter.attachments_count">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.attachments_count</source>
|
||||||
|
<target>Número de adjuntos</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="75p958O" name="project.filter.attachmentName">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.attachmentName</source>
|
||||||
|
<target>Nombre del adjunto</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
<unit id=".nsfK4V" name="parts_list.storelocation.title">
|
<unit id=".nsfK4V" name="parts_list.storelocation.title">
|
||||||
<segment state="translated">
|
<segment state="translated">
|
||||||
<source>parts_list.storelocation.title</source>
|
<source>parts_list.storelocation.title</source>
|
||||||
|
|
|
||||||
|
|
@ -1600,6 +1600,174 @@ Show/Hide sidebar</target>
|
||||||
<target>Recherche de composants</target>
|
<target>Recherche de composants</target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="Upyz4NL" name="assembly.search.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.search.title</source>
|
||||||
|
<target>Recherche d'assemblages</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="deO4FsM" name="project.search.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.search.title</source>
|
||||||
|
<target>Recherche de projets</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="Xq01S2F" name="project.table.id">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.id</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="wNWc9GW" name="project.table.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.name</source>
|
||||||
|
<target>Nom</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="9AdhysG" name="project.table.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.description</source>
|
||||||
|
<target>Description</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="4qJkRic" name="project.table.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.comment</source>
|
||||||
|
<target>Notes</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="NrH0WW8" name="project.table.addedDate">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.addedDate</source>
|
||||||
|
<target>Ajouté le</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="6rN1Yf1" name="project.table.lastModified">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.lastModified</source>
|
||||||
|
<target>Dernière modification</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="F2nNNFD" name="project.table.edit">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit</source>
|
||||||
|
<target>Modifier</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="KZCGmOp" name="project.table.edit.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit.title</source>
|
||||||
|
<target>Modifier le projet</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="cmck5zP" name="datasource.parts">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.parts</source>
|
||||||
|
<target>Pièces</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="3tkaYAP" name="datasource.projects">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.projects</source>
|
||||||
|
<target>Projets</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="aYPamdy" name="datasource.assemblies">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.assemblies</source>
|
||||||
|
<target>Assemblages</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="searching_for_assemblies" name="parts_list.search.searching_for_assemblies">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>parts_list.search.searching_for_assemblies</source>
|
||||||
|
<target>Recherche d'assemblages...</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="searching_for_projects" name="parts_list.search.searching_for_projects">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>parts_list.search.searching_for_projects</source>
|
||||||
|
<target>Recherche de projets...</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="ObC5PW9" name="settings.behavior.table.projects_default_columns">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>settings.behavior.table.projects_default_columns</source>
|
||||||
|
<target>Colonnes par défaut pour les tableaux de projets</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="dHwCrSv" name="settings.behavior.table.projects_default_columns.help">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>settings.behavior.table.projects_default_columns.help</source>
|
||||||
|
<target>Sélectionnez les colonnes à afficher par défaut dans les tableaux de projets.</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="asdfghj" name="assembly.filter.status">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.filter.status</source>
|
||||||
|
<target>Statut de l'assemblage</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="qwertyu" name="assembly.filter.parent">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.filter.parent</source>
|
||||||
|
<target>Assemblage parent</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="acEe1Tb_notes" name="assembly.table.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.table.comment</source>
|
||||||
|
<target>Notes</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="Ag9x60T" name="project.filter.dbId">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.dbId</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="MjSfszH" name="project.filter.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.name</source>
|
||||||
|
<target>Nom</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="ELxZW9y" name="project.filter.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.description</source>
|
||||||
|
<target>Description</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="svzDJ9V" name="project.filter.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.comment</source>
|
||||||
|
<target>Notes</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="sCPeQFs" name="project.filter.status">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.status</source>
|
||||||
|
<target>Statut du projet</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="1Fcochg" name="project.filter.parent">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.parent</source>
|
||||||
|
<target>Projet parent</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="s3yI9D6" name="project.filter.attachments_count">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.attachments_count</source>
|
||||||
|
<target>Nombre de pièces jointes</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="75p958O" name="project.filter.attachmentName">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.attachmentName</source>
|
||||||
|
<target>Nom de la pièce jointe</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
<unit id="gwE_D3w" name="parts_list.storelocation.title">
|
<unit id="gwE_D3w" name="parts_list.storelocation.title">
|
||||||
<segment state="translated">
|
<segment state="translated">
|
||||||
<source>parts_list.storelocation.title</source>
|
<source>parts_list.storelocation.title</source>
|
||||||
|
|
|
||||||
|
|
@ -1528,6 +1528,174 @@
|
||||||
<target>Alkatrészek keresése</target>
|
<target>Alkatrészek keresése</target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="Upyz4NL" name="assembly.search.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.search.title</source>
|
||||||
|
<target>Szerelvények keresése</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="deO4FsM" name="project.search.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.search.title</source>
|
||||||
|
<target>Projektek keresése</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="Xq01S2F" name="project.table.id">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.id</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="wNWc9GW" name="project.table.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.name</source>
|
||||||
|
<target>Név</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="9AdhysG" name="project.table.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.description</source>
|
||||||
|
<target>Leírás</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="4qJkRic" name="project.table.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.comment</source>
|
||||||
|
<target>Megjegyzések</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="NrH0WW8" name="project.table.addedDate">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.addedDate</source>
|
||||||
|
<target>Hozzáadva</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="6rN1Yf1" name="project.table.lastModified">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.lastModified</source>
|
||||||
|
<target>Utoljára módosítva</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="F2nNNFD" name="project.table.edit">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit</source>
|
||||||
|
<target>Szerkesztés</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="KZCGmOp" name="project.table.edit.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit.title</source>
|
||||||
|
<target>Projekt szerkesztése</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="cmck5zP" name="datasource.parts">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.parts</source>
|
||||||
|
<target>Alkatrészek</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="3tkaYAP" name="datasource.projects">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.projects</source>
|
||||||
|
<target>Projektek</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="aYPamdy" name="datasource.assemblies">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.assemblies</source>
|
||||||
|
<target>Szerelvények</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="searching_for_assemblies" name="parts_list.search.searching_for_assemblies">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>parts_list.search.searching_for_assemblies</source>
|
||||||
|
<target>Szerelvények keresése...</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="searching_for_projects" name="parts_list.search.searching_for_projects">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>parts_list.search.searching_for_projects</source>
|
||||||
|
<target>Projektek keresése...</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="ObC5PW9" name="settings.behavior.table.projects_default_columns">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>settings.behavior.table.projects_default_columns</source>
|
||||||
|
<target>Alapértelmezett oszlopok a projekttáblázatokhoz</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="dHwCrSv" name="settings.behavior.table.projects_default_columns.help">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>settings.behavior.table.projects_default_columns.help</source>
|
||||||
|
<target>Válassza ki a projekttáblázatokban alapértelmezés szerint megjelenítendő oszlopokat.</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="asdfghj" name="assembly.filter.status">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.filter.status</source>
|
||||||
|
<target>Szerelvény állapota</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="qwertyu" name="assembly.filter.parent">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.filter.parent</source>
|
||||||
|
<target>Szülő szerelvény</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="acEe1Tb_notes" name="assembly.table.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.table.comment</source>
|
||||||
|
<target>Megjegyzések</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="Ag9x60T" name="project.filter.dbId">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.dbId</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="MjSfszH" name="project.filter.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.name</source>
|
||||||
|
<target>Név</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="ELxZW9y" name="project.filter.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.description</source>
|
||||||
|
<target>Leírás</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="svzDJ9V" name="project.filter.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.comment</source>
|
||||||
|
<target>Megjegyzések</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="sCPeQFs" name="project.filter.status">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.status</source>
|
||||||
|
<target>Projekt állapota</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="1Fcochg" name="project.filter.parent">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.parent</source>
|
||||||
|
<target>Szülő projekt</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="s3yI9D6" name="project.filter.attachments_count">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.attachments_count</source>
|
||||||
|
<target>Mellékletek száma</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="75p958O" name="project.filter.attachmentName">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.attachmentName</source>
|
||||||
|
<target>Melléklet neve</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
<unit id=".nsfK4V" name="parts_list.storelocation.title">
|
<unit id=".nsfK4V" name="parts_list.storelocation.title">
|
||||||
<segment state="translated">
|
<segment state="translated">
|
||||||
<source>parts_list.storelocation.title</source>
|
<source>parts_list.storelocation.title</source>
|
||||||
|
|
|
||||||
|
|
@ -1617,6 +1617,174 @@ I sub elementi saranno spostati verso l'alto.</target>
|
||||||
<target>Ricerca componenti</target>
|
<target>Ricerca componenti</target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="Upyz4NL" name="assembly.search.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.search.title</source>
|
||||||
|
<target>Ricerca assemblaggi</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="deO4FsM" name="project.search.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.search.title</source>
|
||||||
|
<target>Ricerca progetti</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="Xq01S2F" name="project.table.id">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.id</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="wNWc9GW" name="project.table.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.name</source>
|
||||||
|
<target>Nome</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="9AdhysG" name="project.table.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.description</source>
|
||||||
|
<target>Descrizione</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="4qJkRic" name="project.table.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.comment</source>
|
||||||
|
<target>Note</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="NrH0WW8" name="project.table.addedDate">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.addedDate</source>
|
||||||
|
<target>Aggiunto il</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="6rN1Yf1" name="project.table.lastModified">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.lastModified</source>
|
||||||
|
<target>Ultima modifica</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="F2nNNFD" name="project.table.edit">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit</source>
|
||||||
|
<target>Modifica</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="KZCGmOp" name="project.table.edit.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit.title</source>
|
||||||
|
<target>Modifica progetto</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="cmck5zP" name="datasource.parts">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.parts</source>
|
||||||
|
<target>Parti</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="3tkaYAP" name="datasource.projects">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.projects</source>
|
||||||
|
<target>Progetti</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="aYPamdy" name="datasource.assemblies">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.assemblies</source>
|
||||||
|
<target>Assemblaggi</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="searching_for_assemblies" name="parts_list.search.searching_for_assemblies">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>parts_list.search.searching_for_assemblies</source>
|
||||||
|
<target>Ricerca assemblaggi in corso...</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="searching_for_projects" name="parts_list.search.searching_for_projects">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>parts_list.search.searching_for_projects</source>
|
||||||
|
<target>Ricerca progetti in corso...</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="ObC5PW9" name="settings.behavior.table.projects_default_columns">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>settings.behavior.table.projects_default_columns</source>
|
||||||
|
<target>Colonne predefinite per le tabelle dei progetti</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="dHwCrSv" name="settings.behavior.table.projects_default_columns.help">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>settings.behavior.table.projects_default_columns.help</source>
|
||||||
|
<target>Seleziona le colonne da visualizzare per impostazione predefinita nelle tabelle dei progetti.</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="asdfghj" name="assembly.filter.status">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.filter.status</source>
|
||||||
|
<target>Stato assemblaggio</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="qwertyu" name="assembly.filter.parent">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.filter.parent</source>
|
||||||
|
<target>Assemblaggio superiore</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="acEe1Tb_notes" name="assembly.table.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.table.comment</source>
|
||||||
|
<target>Note</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="Ag9x60T" name="project.filter.dbId">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.dbId</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="MjSfszH" name="project.filter.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.name</source>
|
||||||
|
<target>Nome</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="ELxZW9y" name="project.filter.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.description</source>
|
||||||
|
<target>Descrizione</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="svzDJ9V" name="project.filter.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.comment</source>
|
||||||
|
<target>Note</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="sCPeQFs" name="project.filter.status">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.status</source>
|
||||||
|
<target>Stato progetto</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="1Fcochg" name="project.filter.parent">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.parent</source>
|
||||||
|
<target>Progetto superiore</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="s3yI9D6" name="project.filter.attachments_count">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.attachments_count</source>
|
||||||
|
<target>Numero di allegati</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="75p958O" name="project.filter.attachmentName">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.attachmentName</source>
|
||||||
|
<target>Nome allegato</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
<unit id=".nsfK4V" name="parts_list.storelocation.title">
|
<unit id=".nsfK4V" name="parts_list.storelocation.title">
|
||||||
<segment state="translated">
|
<segment state="translated">
|
||||||
<source>parts_list.storelocation.title</source>
|
<source>parts_list.storelocation.title</source>
|
||||||
|
|
|
||||||
|
|
@ -1600,6 +1600,174 @@
|
||||||
<target>部品を検索</target>
|
<target>部品を検索</target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="Upyz4NL" name="assembly.search.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.search.title</source>
|
||||||
|
<target>アセンブリ検索</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="deO4FsM" name="project.search.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.search.title</source>
|
||||||
|
<target>プロジェクト検索</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="Xq01S2F" name="project.table.id">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.id</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="wNWc9GW" name="project.table.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.name</source>
|
||||||
|
<target>名前</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="9AdhysG" name="project.table.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.description</source>
|
||||||
|
<target>説明</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="4qJkRic" name="project.table.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.comment</source>
|
||||||
|
<target>ノート</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="NrH0WW8" name="project.table.addedDate">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.addedDate</source>
|
||||||
|
<target>追加日</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="6rN1Yf1" name="project.table.lastModified">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.lastModified</source>
|
||||||
|
<target>最終更新日</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="F2nNNFD" name="project.table.edit">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit</source>
|
||||||
|
<target>編集</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="KZCGmOp" name="project.table.edit.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit.title</source>
|
||||||
|
<target>プロジェクトの編集</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="cmck5zP" name="datasource.parts">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.parts</source>
|
||||||
|
<target>部品</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="3tkaYAP" name="datasource.projects">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.projects</source>
|
||||||
|
<target>プロジェクト</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="aYPamdy" name="datasource.assemblies">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.assemblies</source>
|
||||||
|
<target>アセンブリ</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="searching_for_assemblies" name="parts_list.search.searching_for_assemblies">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>parts_list.search.searching_for_assemblies</source>
|
||||||
|
<target>アセンブリを検索中...</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="searching_for_projects" name="parts_list.search.searching_for_projects">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>parts_list.search.searching_for_projects</source>
|
||||||
|
<target>プロジェクトを検索中...</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="ObC5PW9" name="settings.behavior.table.projects_default_columns">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>settings.behavior.table.projects_default_columns</source>
|
||||||
|
<target>プロジェクトテーブルのデフォルト列</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="dHwCrSv" name="settings.behavior.table.projects_default_columns.help">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>settings.behavior.table.projects_default_columns.help</source>
|
||||||
|
<target>プロジェクトテーブルにデフォルトで表示する列を選択します。</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="asdfghj" name="assembly.filter.status">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.filter.status</source>
|
||||||
|
<target>アセンブリステータス</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="qwertyu" name="assembly.filter.parent">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.filter.parent</source>
|
||||||
|
<target>親アセンブリ</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="acEe1Tb_notes" name="assembly.table.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.table.comment</source>
|
||||||
|
<target>ノート</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="Ag9x60T" name="project.filter.dbId">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.dbId</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="MjSfszH" name="project.filter.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.name</source>
|
||||||
|
<target>名前</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="ELxZW9y" name="project.filter.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.description</source>
|
||||||
|
<target>説明</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="svzDJ9V" name="project.filter.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.comment</source>
|
||||||
|
<target>ノート</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="sCPeQFs" name="project.filter.status">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.status</source>
|
||||||
|
<target>プロジェクトステータス</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="1Fcochg" name="project.filter.parent">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.parent</source>
|
||||||
|
<target>親プロジェクト</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="s3yI9D6" name="project.filter.attachments_count">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.attachments_count</source>
|
||||||
|
<target>添付ファイル数</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="75p958O" name="project.filter.attachmentName">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.attachmentName</source>
|
||||||
|
<target>添付ファイル名</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
<unit id="gwE_D3w" name="parts_list.storelocation.title">
|
<unit id="gwE_D3w" name="parts_list.storelocation.title">
|
||||||
<segment state="translated">
|
<segment state="translated">
|
||||||
<source>parts_list.storelocation.title</source>
|
<source>parts_list.storelocation.title</source>
|
||||||
|
|
|
||||||
|
|
@ -1317,6 +1317,168 @@
|
||||||
<target>Assemblage bewerken</target>
|
<target>Assemblage bewerken</target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="V1p8X9m" name="assembly.search.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.search.title</source>
|
||||||
|
<target>Assemblage zoeken</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="K3n7B2v" name="project.search.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.search.title</source>
|
||||||
|
<target>Project zoeken</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="M9n2V5c" name="datasource.parts">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.parts</source>
|
||||||
|
<target>Onderdelen</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="B4v7N1m" name="datasource.projects">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.projects</source>
|
||||||
|
<target>Projecten</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="X8z2L5p" name="datasource.assemblies">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.assemblies</source>
|
||||||
|
<target>Assemblages</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="H5n8M2v" name="parts_list.search.searching_for_assemblies">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>parts_list.search.searching_for_assemblies</source>
|
||||||
|
<target>Zoeken naar assemblages met trefwoord %keyword%</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="J3k9P1L" name="parts_list.search.searching_for_projects">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>parts_list.search.searching_for_projects</source>
|
||||||
|
<target>Zoeken naar projecten mit trefwoord %keyword%</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="T5v2N7c" name="settings.behavior.table.projects_default_columns">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>settings.behavior.table.projects_default_columns</source>
|
||||||
|
<target>Standaardkolommen voor projecten</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="R9z1K4m" name="settings.behavior.table.projects_default_columns.help">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>settings.behavior.table.projects_default_columns.help</source>
|
||||||
|
<target>Kies welke kolommen standaard worden weergegeven in de projectentabel.</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="L3n8B2v" name="assembly.filter.status">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.filter.status</source>
|
||||||
|
<target>Assemblage-status</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="P5v2M9n" name="assembly.filter.parent">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.filter.parent</source>
|
||||||
|
<target>Bovenliggende assemblage</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="N7c1V4p" name="assembly.table.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.table.comment</source>
|
||||||
|
<target>Notities</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="G3n9L2m" name="project.filter.dbId">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.dbId</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="K5v8N1p" name="project.filter.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.name</source>
|
||||||
|
<target>Naam</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="M2n7B4v" name="project.filter.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.description</source>
|
||||||
|
<target>Beschrijving</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="V9c1L5p" name="project.filter.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.comment</source>
|
||||||
|
<target>Notities</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="H3n2N7m" name="project.filter.status">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.status</source>
|
||||||
|
<target>Projectstatus</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="P8v1M2v" name="project.filter.parent">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.parent</source>
|
||||||
|
<target>Bovenliggend project</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="J5k9P4L" name="project.filter.attachments_count">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.attachments_count</source>
|
||||||
|
<target>Aantal bijlagen</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="T1n7V5c" name="project.filter.attachmentName">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.attachmentName</source>
|
||||||
|
<target>Naam bijlage</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="Q4v8B2m" name="project.table.id">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.id</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="W2n1M5v" name="project.table.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.name</source>
|
||||||
|
<target>Projectnaam</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="S9z3L7p" name="project.table.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.description</source>
|
||||||
|
<target>Beschrijving</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="Z5v2N4c" name="project.table.addedDate">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.addedDate</source>
|
||||||
|
<target>Toegevoegd op</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="Y1n8M2p" name="project.table.lastModified">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.lastModified</source>
|
||||||
|
<target>Laatst gewijzigd</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="K3v7N9m" name="project.table.edit">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit</source>
|
||||||
|
<target>Bewerken</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="F2n5L1v" name="project.table.edit.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit.title</source>
|
||||||
|
<target>Project bewerken</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
<unit id="juTbw2C" name="assembly.table.invalid_regex">
|
<unit id="juTbw2C" name="assembly.table.invalid_regex">
|
||||||
<segment state="translated">
|
<segment state="translated">
|
||||||
<source>assembly.table.invalid_regex</source>
|
<source>assembly.table.invalid_regex</source>
|
||||||
|
|
|
||||||
|
|
@ -1614,6 +1614,174 @@ Po usunięciu pod elementy zostaną przeniesione na górę.</target>
|
||||||
<target>Wyszukiwarka komponentów</target>
|
<target>Wyszukiwarka komponentów</target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="Upyz4NL" name="assembly.search.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.search.title</source>
|
||||||
|
<target>Wyszukiwanie zespołów</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="deO4FsM" name="project.search.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.search.title</source>
|
||||||
|
<target>Wyszukiwanie projektów</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="Xq01S2F" name="project.table.id">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.id</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="wNWc9GW" name="project.table.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.name</source>
|
||||||
|
<target>Nazwa</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="9AdhysG" name="project.table.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.description</source>
|
||||||
|
<target>Opis</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="4qJkRic" name="project.table.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.comment</source>
|
||||||
|
<target>Notatki</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="NrH0WW8" name="project.table.addedDate">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.addedDate</source>
|
||||||
|
<target>Dodano dnia</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="6rN1Yf1" name="project.table.lastModified">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.lastModified</source>
|
||||||
|
<target>Ostatnia zmiana</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="F2nNNFD" name="project.table.edit">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit</source>
|
||||||
|
<target>Edytuj</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="KZCGmOp" name="project.table.edit.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit.title</source>
|
||||||
|
<target>Edytuj projekt</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="cmck5zP" name="datasource.parts">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.parts</source>
|
||||||
|
<target>Części</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="3tkaYAP" name="datasource.projects">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.projects</source>
|
||||||
|
<target>Projekty</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="aYPamdy" name="datasource.assemblies">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.assemblies</source>
|
||||||
|
<target>Zespoły</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="searching_for_assemblies" name="parts_list.search.searching_for_assemblies">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>parts_list.search.searching_for_assemblies</source>
|
||||||
|
<target>Szukanie zespołów...</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="searching_for_projects" name="parts_list.search.searching_for_projects">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>parts_list.search.searching_for_projects</source>
|
||||||
|
<target>Szukanie projektów...</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="ObC5PW9" name="settings.behavior.table.projects_default_columns">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>settings.behavior.table.projects_default_columns</source>
|
||||||
|
<target>Domyślne kolumny dla tabel projektów</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="dHwCrSv" name="settings.behavior.table.projects_default_columns.help">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>settings.behavior.table.projects_default_columns.help</source>
|
||||||
|
<target>Wybierz kolumny, które mają być domyślnie wyświetlane w tabelach projektów.</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="asdfghj" name="assembly.filter.status">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.filter.status</source>
|
||||||
|
<target>Status zespołu</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="qwertyu" name="assembly.filter.parent">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.filter.parent</source>
|
||||||
|
<target>Zespół nadrzędny</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="acEe1Tb_notes" name="assembly.table.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.table.comment</source>
|
||||||
|
<target>Notatki</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="Ag9x60T" name="project.filter.dbId">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.dbId</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="MjSfszH" name="project.filter.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.name</source>
|
||||||
|
<target>Nazwa</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="ELxZW9y" name="project.filter.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.description</source>
|
||||||
|
<target>Opis</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="svzDJ9V" name="project.filter.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.comment</source>
|
||||||
|
<target>Notatki</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="sCPeQFs" name="project.filter.status">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.status</source>
|
||||||
|
<target>Status projektu</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="1Fcochg" name="project.filter.parent">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.parent</source>
|
||||||
|
<target>Projekt nadrzędny</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="s3yI9D6" name="project.filter.attachments_count">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.attachments_count</source>
|
||||||
|
<target>Liczba załączników</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="75p958O" name="project.filter.attachmentName">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.attachmentName</source>
|
||||||
|
<target>Nazwa załącznika</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
<unit id=".nsfK4V" name="parts_list.storelocation.title">
|
<unit id=".nsfK4V" name="parts_list.storelocation.title">
|
||||||
<segment state="translated">
|
<segment state="translated">
|
||||||
<source>parts_list.storelocation.title</source>
|
<source>parts_list.storelocation.title</source>
|
||||||
|
|
|
||||||
|
|
@ -1618,6 +1618,174 @@
|
||||||
<target>Поиск компонентов</target>
|
<target>Поиск компонентов</target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="Upyz4NL" name="assembly.search.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.search.title</source>
|
||||||
|
<target>Поиск сборок</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="deO4FsM" name="project.search.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.search.title</source>
|
||||||
|
<target>Поиск проектов</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="Xq01S2F" name="project.table.id">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.id</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="wNWc9GW" name="project.table.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.name</source>
|
||||||
|
<target>Имя</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="9AdhysG" name="project.table.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.description</source>
|
||||||
|
<target>Описание</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="4qJkRic" name="project.table.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.comment</source>
|
||||||
|
<target>Примечания</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="NrH0WW8" name="project.table.addedDate">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.addedDate</source>
|
||||||
|
<target>Добавлено</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="6rN1Yf1" name="project.table.lastModified">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.lastModified</source>
|
||||||
|
<target>Последнее изменение</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="F2nNNFD" name="project.table.edit">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit</source>
|
||||||
|
<target>Редактировать</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="KZCGmOp" name="project.table.edit.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit.title</source>
|
||||||
|
<target>Редактировать проект</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="cmck5zP" name="datasource.parts">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.parts</source>
|
||||||
|
<target>Детали</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="3tkaYAP" name="datasource.projects">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.projects</source>
|
||||||
|
<target>Проекты</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="aYPamdy" name="datasource.assemblies">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.assemblies</source>
|
||||||
|
<target>Сборки</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="searching_for_assemblies" name="parts_list.search.searching_for_assemblies">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>parts_list.search.searching_for_assemblies</source>
|
||||||
|
<target>Поиск сборок...</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="searching_for_projects" name="parts_list.search.searching_for_projects">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>parts_list.search.searching_for_projects</source>
|
||||||
|
<target>Поиск проектов...</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="ObC5PW9" name="settings.behavior.table.projects_default_columns">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>settings.behavior.table.projects_default_columns</source>
|
||||||
|
<target>Столбцы по умолчанию для таблиц проектов</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="dHwCrSv" name="settings.behavior.table.projects_default_columns.help">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>settings.behavior.table.projects_default_columns.help</source>
|
||||||
|
<target>Выберите столбцы, которые будут отображаться в таблицах проектов по умолчанию.</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="asdfghj" name="assembly.filter.status">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.filter.status</source>
|
||||||
|
<target>Статус сборки</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="qwertyu" name="assembly.filter.parent">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.filter.parent</source>
|
||||||
|
<target>Родительская сборка</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="acEe1Tb_notes" name="assembly.table.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.table.comment</source>
|
||||||
|
<target>Примечания</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="Ag9x60T" name="project.filter.dbId">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.dbId</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="MjSfszH" name="project.filter.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.name</source>
|
||||||
|
<target>Имя</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="ELxZW9y" name="project.filter.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.description</source>
|
||||||
|
<target>Описание</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="svzDJ9V" name="project.filter.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.comment</source>
|
||||||
|
<target>Примечания</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="sCPeQFs" name="project.filter.status">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.status</source>
|
||||||
|
<target>Статус проекта</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="1Fcochg" name="project.filter.parent">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.parent</source>
|
||||||
|
<target>Родительский проект</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="s3yI9D6" name="project.filter.attachments_count">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.attachments_count</source>
|
||||||
|
<target>Количество вложений</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="75p958O" name="project.filter.attachmentName">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.attachmentName</source>
|
||||||
|
<target>Имя вложения</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
<unit id=".nsfK4V" name="parts_list.storelocation.title">
|
<unit id=".nsfK4V" name="parts_list.storelocation.title">
|
||||||
<segment state="translated">
|
<segment state="translated">
|
||||||
<source>parts_list.storelocation.title</source>
|
<source>parts_list.storelocation.title</source>
|
||||||
|
|
|
||||||
|
|
@ -1617,6 +1617,174 @@
|
||||||
<target>搜索部件</target>
|
<target>搜索部件</target>
|
||||||
</segment>
|
</segment>
|
||||||
</unit>
|
</unit>
|
||||||
|
<unit id="Upyz4NL" name="assembly.search.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.search.title</source>
|
||||||
|
<target>组合体搜索</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="deO4FsM" name="project.search.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.search.title</source>
|
||||||
|
<target>项目搜索</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="Xq01S2F" name="project.table.id">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.id</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="wNWc9GW" name="project.table.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.name</source>
|
||||||
|
<target>名称</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="9AdhysG" name="project.table.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.description</source>
|
||||||
|
<target>描述</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="4qJkRic" name="project.table.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.comment</source>
|
||||||
|
<target>备注</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="NrH0WW8" name="project.table.addedDate">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.addedDate</source>
|
||||||
|
<target>添加日期</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="6rN1Yf1" name="project.table.lastModified">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.lastModified</source>
|
||||||
|
<target>最后修改</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="F2nNNFD" name="project.table.edit">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit</source>
|
||||||
|
<target>编辑</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="KZCGmOp" name="project.table.edit.title">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.table.edit.title</source>
|
||||||
|
<target>编辑项目</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="cmck5zP" name="datasource.parts">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.parts</source>
|
||||||
|
<target>零件</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="3tkaYAP" name="datasource.projects">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.projects</source>
|
||||||
|
<target>项目</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="aYPamdy" name="datasource.assemblies">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>datasource.assemblies</source>
|
||||||
|
<target>组合体</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="searching_for_assemblies" name="parts_list.search.searching_for_assemblies">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>parts_list.search.searching_for_assemblies</source>
|
||||||
|
<target>正在搜索组合体...</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="searching_for_projects" name="parts_list.search.searching_for_projects">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>parts_list.search.searching_for_projects</source>
|
||||||
|
<target>正在搜索项目...</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="ObC5PW9" name="settings.behavior.table.projects_default_columns">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>settings.behavior.table.projects_default_columns</source>
|
||||||
|
<target>项目表格默认列</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="dHwCrSv" name="settings.behavior.table.projects_default_columns.help">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>settings.behavior.table.projects_default_columns.help</source>
|
||||||
|
<target>选择要在项目表格中默认显示的列。</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="asdfghj" name="assembly.filter.status">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.filter.status</source>
|
||||||
|
<target>组合体状态</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="qwertyu" name="assembly.filter.parent">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.filter.parent</source>
|
||||||
|
<target>父级组合体</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="acEe1Tb_notes" name="assembly.table.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>assembly.table.comment</source>
|
||||||
|
<target>备注</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="Ag9x60T" name="project.filter.dbId">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.dbId</source>
|
||||||
|
<target>ID</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="MjSfszH" name="project.filter.name">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.name</source>
|
||||||
|
<target>名称</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="ELxZW9y" name="project.filter.description">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.description</source>
|
||||||
|
<target>描述</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="svzDJ9V" name="project.filter.comment">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.comment</source>
|
||||||
|
<target>备注</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="sCPeQFs" name="project.filter.status">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.status</source>
|
||||||
|
<target>项目状态</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="1Fcochg" name="project.filter.parent">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.parent</source>
|
||||||
|
<target>父级项目</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="s3yI9D6" name="project.filter.attachments_count">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.attachments_count</source>
|
||||||
|
<target>附件数量</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
|
<unit id="75p958O" name="project.filter.attachmentName">
|
||||||
|
<segment state="translated">
|
||||||
|
<source>project.filter.attachmentName</source>
|
||||||
|
<target>附件名称</target>
|
||||||
|
</segment>
|
||||||
|
</unit>
|
||||||
<unit id="gwE_D3w" name="parts_list.storelocation.title">
|
<unit id="gwE_D3w" name="parts_list.storelocation.title">
|
||||||
<segment state="translated">
|
<segment state="translated">
|
||||||
<source>parts_list.storelocation.title</source>
|
<source>parts_list.storelocation.title</source>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue