Compare commits

...

8 commits

Author SHA1 Message Date
d-buchmann
0e9558e331
Do not mark internal (relative) links as external and open in new tab in markdown blocks
Some checks are pending
Build assets artifact / Build assets artifact (push) Waiting to run
Docker Image Build / docker (push) Waiting to run
Docker Image Build (FrankenPHP) / docker (push) Waiting to run
Static analysis / Static analysis (push) Waiting to run
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.2, mysql) (push) Waiting to run
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.3, mysql) (push) Waiting to run
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.4, mysql) (push) Waiting to run
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.2, postgres) (push) Waiting to run
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.3, postgres) (push) Waiting to run
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.4, postgres) (push) Waiting to run
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.2, sqlite) (push) Waiting to run
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.3, sqlite) (push) Waiting to run
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.4, sqlite) (push) Waiting to run
Don't handle links as external by default. Instead distiguish internal (relative) and external (absolute) links.
2025-09-06 19:49:38 +02:00
d-buchmann
4e9e82d9f1
Replace "range" indicators with mathematical tilde in LCSC provider (#989)
* Replace "range" indicators with mathematical tilde symbols in LCSC provider

* Improve comment
2025-09-06 19:43:50 +02:00
Jan Böhmer
411ac500ba
New Crowdin updates (#1008)
* New translations messages.en.xlf (Czech)

* New translations messages.en.xlf (Czech)

* New translations messages.en.xlf (Czech)

* New translations messages.en.xlf (Czech)

* New translations messages.en.xlf (German)

* New translations messages.en.xlf (German)

* New translations messages.en.xlf (German)
2025-09-06 19:43:05 +02:00
d-buchmann
b1443a817b
Add import permission for label profiles (#1021) 2025-09-06 19:42:07 +02:00
Jan Böhmer
3e8ca06177 Fixed text color in ckeditor editors when in dark mode
Fixes issue #1016
2025-09-06 19:34:31 +02:00
Jan Böhmer
c1b7272ab1 Updated frontend dependencies 2025-09-06 19:30:17 +02:00
Jan Böhmer
b093866d15 Do not replace LCSC category slashes with arrows, as these are actually their names, not level separators 2025-09-06 19:27:10 +02:00
Jan Böhmer
065ef9f8ae Fixed LCSC provider
LCSC has changed its search API, so it was broken. Fixes issue #1018
2025-09-06 19:22:59 +02:00
8 changed files with 812 additions and 795 deletions

View file

@ -56,12 +56,16 @@ export default class MarkdownController extends Controller {
this.element.innerHTML = DOMPurify.sanitize(MarkdownController._marked.parse(this.unescapeHTML(raw)));
for(let a of this.element.querySelectorAll('a')) {
//Mark all links as external
a.classList.add('link-external');
//Open links in new tag
a.setAttribute('target', '_blank');
//Dont track
a.setAttribute('rel', 'noopener');
// test if link is absolute
var r = new RegExp('^(?:[a-z+]+:)?//', 'i');
if (r.test(a.getAttribute('href'))) {
//Mark all links as external
a.classList.add('link-external');
//Open links in new tag
a.setAttribute('target', '_blank');
//Dont track
a.setAttribute('rel', 'noopener');
}
}
//Apply bootstrap styles to tables
@ -108,4 +112,4 @@ export default class MarkdownController extends Controller {
gfm: true,
});
}*/
}
}

View file

@ -71,6 +71,8 @@
--ck-color-button-on-hover-background: var(--bs-secondary-bg);
--ck-color-button-on-active-background: var(--bs-secondary-bg);
--ck-color-button-on-disabled-background: var(--bs-secondary-bg);
--ck-color-button-on-color: var(--bs-primary)
--ck-color-button-on-color: var(--bs-primary);
}
--ck-content-font-color: var(--ck-color-base-text);
}

View file

@ -359,6 +359,10 @@ perms: # Here comes a list with all Permission names (they have a perm_[name] co
label: "perm.revert_elements"
alsoSet: ['read_profiles', 'edit_profiles', 'create_profiles', 'delete_profiles']
apiTokenRole: ROLE_API_EDIT
import:
label: "perm.import"
alsoSet: ['read_profiles', 'edit_profiles', 'create_profiles' ]
apiTokenRole: ROLE_API_EDIT
api:
label: "perm.api"

View file

@ -59,6 +59,7 @@ final class LabelProfileVoter extends Voter
'delete' => 'delete_profiles',
'show_history' => 'show_history',
'revert_element' => 'revert_element',
'import' => 'import',
];
public function __construct(private readonly VoterHelper $helper)

View file

@ -123,11 +123,11 @@ class LCSCProvider implements InfoProviderInterface
*/
private function queryByTerm(string $term): array
{
$response = $this->lcscClient->request('GET', self::ENDPOINT_URL . "/search/global", [
$response = $this->lcscClient->request('POST', self::ENDPOINT_URL . "/search/v2/global", [
'headers' => [
'Cookie' => new Cookie('currencyCode', $this->settings->currency)
],
'query' => [
'json' => [
'keyword' => $term,
],
]);
@ -165,6 +165,9 @@ class LCSCProvider implements InfoProviderInterface
if ($field === null) {
return null;
}
// Replace "range" indicators with mathematical tilde symbols
// so they don't get rendered as strikethrough by Markdown
$field = preg_replace("/~/", "\u{223c}", $field);
return strip_tags($field);
}
@ -197,9 +200,6 @@ class LCSCProvider implements InfoProviderInterface
$category = $product['parentCatalogName'] ?? null;
if (isset($product['catalogName'])) {
$category = ($category ?? '') . ' -> ' . $product['catalogName'];
// Replace the / with a -> for better readability
$category = str_replace('/', ' -> ', $category);
}
return new PartDetailDTO(

View file

@ -580,7 +580,7 @@
</notes>
<segment state="translated">
<source>storelocation.new</source>
<target>Nové místo skladování</target>
<target>Nové umístění</target>
</segment>
</unit>
<unit id="Rt3eY_7" name="supplier.caption">
@ -913,7 +913,7 @@ Související prvky budou přesunuty nahoru.</target>
</notes>
<segment state="translated">
<source>edit.log_comment</source>
<target>Změnit komentář</target>
<target>Komentář ke změně</target>
</segment>
</unit>
<unit id="ZMmz8UB" name="entity.delete.recursive">
@ -2502,7 +2502,7 @@ Související prvky budou přesunuty nahoru.</target>
</notes>
<segment state="translated">
<source>part.needs_review.badge</source>
<target>Potřeba revize</target>
<target>Vyžaduje kontrolu</target>
</segment>
</unit>
<unit id="IttGv57" name="part.favorite.badge">
@ -4019,7 +4019,7 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
</notes>
<segment state="translated">
<source>search.regexmatching</source>
<target>RegEx. shoda</target>
<target>Reg.Ex. shoda</target>
</segment>
</unit>
<unit id="U5IhkwB" name="search.submit">
@ -4858,7 +4858,7 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
</notes>
<segment state="translated">
<source>part.table.needsReview</source>
<target>Potřeba revize</target>
<target>Vyžaduje kontrolu</target>
</segment>
</unit>
<unit id="AtzzLFz" name="part.table.favorite">
@ -5662,7 +5662,7 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
</notes>
<segment state="translated">
<source>part.edit.needs_review</source>
<target>Potřeba revize</target>
<target>Vyžaduje kontrolu</target>
</segment>
</unit>
<unit id="TQbwkUd" name="part.edit.is_favorite">
@ -6357,7 +6357,7 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
</notes>
<segment state="translated">
<source>user.theme.label</source>
<target>Téma</target>
<target>Vzhled</target>
</segment>
</unit>
<unit id="LQ7ihIX" name="user_settings.theme.placeholder">
@ -6368,7 +6368,7 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn
</notes>
<segment state="translated">
<source>user_settings.theme.placeholder</source>
<target>Serverové téma</target>
<target>Vzhled pro celý server</target>
</segment>
</unit>
<unit id="ZkXKucz" name="log.user_login.ip">
@ -9718,7 +9718,7 @@ Element 3</target>
<unit id="OEVzOkv" name="part_list.action.action.group.needs_review">
<segment state="translated">
<source>part_list.action.action.group.needs_review</source>
<target>Potřeba revize</target>
<target>Vyžaduje kontrolu</target>
</segment>
</unit>
<unit id="nkoTW_w" name="part_list.action.action.set_needs_review">
@ -10678,7 +10678,7 @@ Element 3</target>
<unit id="VraT.Lo" name="log.element_edited.changed_fields.theme">
<segment state="translated">
<source>log.element_edited.changed_fields.theme</source>
<target>Téma</target>
<target>Vzhled</target>
</segment>
</unit>
<unit id="QFESysH" name="log.element_edited.changed_fields.timezone">
@ -10774,7 +10774,7 @@ Element 3</target>
<unit id="iF9ovqi" name="log.element_edited.changed_fields.needs_review">
<segment state="translated">
<source>log.element_edited.changed_fields.needs_review</source>
<target>Potřeba revize</target>
<target>Vyžaduje kontrolu</target>
</segment>
</unit>
<unit id="wgJmpYG" name="log.element_edited.changed_fields.tags">
@ -10984,7 +10984,7 @@ Element 3</target>
<unit id="awbvhVq" name="parts.import.help">
<segment state="translated">
<source>parts.import.help</source>
<target>Pomocí tohoto nástroje můžete importovat díly z existujících souborů. Díly budou zapsány přímo do databáze, proto před nahráním souboru sem zkontrolujte, zda je jeho obsah správný.</target>
<target>Pomocí tohoto nástroje můžete importovat součásti z existujících souborů. Součásti budou přímo zapsány do databáze, proto před nahráním souboru zkontrolujte jeho správný obsah.</target>
</segment>
</unit>
<unit id="5.sq5ns" name="parts.import.flash.success">
@ -11014,7 +11014,7 @@ Element 3</target>
<unit id="7dsEiOg" name="parts.import.part_needs_review.help">
<segment state="translated">
<source>parts.import.part_needs_review.help</source>
<target>Pokud je tato možnost vybrána, budou všechny díly označeny jako "Potřeba revize" bez ohledu na to, co bylo nastaveno v údajích.</target>
<target>Pokud je tato možnost vybrána, budou všechny díly označeny jako "Vyžaduje kontrolu" bez ohledu na to, co bylo nastaveno v údajích.</target>
</segment>
</unit>
<unit id="Ie9LLKJ" name="project.bom_import.flash.success">
@ -12060,7 +12060,7 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz
<unit id="duBTELg" name="part.info.withdraw_modal.delete_lot_if_empty">
<segment state="translated">
<source>part.info.withdraw_modal.delete_lot_if_empty</source>
<target>Vymazat tento inventář, až se vyprázdní</target>
<target>Smazat tuto položku, pokud se vyprázdní</target>
</segment>
</unit>
<unit id="SMclulD" name="info_providers.search.error.client_exception">
@ -12528,7 +12528,7 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz
<unit id="VYMqQr5" name="settings.system.customization.instanceName">
<segment state="translated">
<source>settings.system.customization.instanceName</source>
<target>Instance name</target>
<target>Název instance</target>
</segment>
</unit>
<unit id="0YFxSHZ" name="settings.system.customization.instanceName.help">
@ -12576,7 +12576,7 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz
<unit id="pinyqu2" name="settings.system.customization.theme">
<segment state="translated">
<source>settings.system.customization.theme</source>
<target>Globální téma</target>
<target>Globální vzhed</target>
</segment>
</unit>
<unit id="Aky9nXE" name="settings.system.history.enforceComments">
@ -12642,7 +12642,7 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz
<unit id="8IszKgp" name="settings.system.privacy.useGravatar.description">
<segment state="translated">
<source>settings.system.privacy.useGravatar.description</source>
<target>Pokud uživatel nemá nastavený avatar, použijte avatar z Gravataru na základě e-mailové adresy uživatele. To způsobí, že prohlížeč načte obrázky od třetí strany!</target>
<target>Pokud uživatel nemá zadaný obrázek avatara, použije se avatar z Gravataru na základě e-mailu uživatele. To způsobí, že prohlížeč načte obrázky ze třetí strany!</target>
</segment>
</unit>
<unit id="rxHBzbv" name="settings.system.privacy.checkForUpdates">
@ -12691,7 +12691,7 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz
<unit id="cvpTUeY" name="settings.system.privacy">
<segment state="translated">
<source>settings.system.privacy</source>
<target>Ochrana osobních údajů</target>
<target>Soukromí</target>
</segment>
</unit>
<unit id="TVAVZUl" name="settings.title">

View file

@ -6504,7 +6504,7 @@ Wenn Sie dies fehlerhafterweise gemacht haben oder ein Computer nicht mehr vertr
</notes>
<segment state="translated">
<source>flash.password_change_needed</source>
<target>Ihr Password muss geändert werden!</target>
<target>Ihr Passwort muss geändert werden!</target>
</segment>
</unit>
<unit id="8I8zHPK" name="attachment.table.type">
@ -7157,8 +7157,14 @@ Wenn Sie dies fehlerhafterweise gemacht haben oder ein Computer nicht mehr vertr
<segment state="translated">
<source>mass_creation.lines.placeholder</source>
<target>Element 1
Element 1.1
Element 1.1.1
Element 1.2
Element 2
Element 3</target>
Element 3
Element 1 -&gt; Element 1.1
Element 1 -&gt; Element 1.2</target>
</segment>
</unit>
<unit id="TWSqPFi" name="entity.mass_creation.btn">
@ -9006,7 +9012,7 @@ Element 3</target>
<unit id="gaoMsrY" name="part_list.action.part_count">
<segment state="translated">
<source>part_list.action.part_count</source>
<target>%count% Bauteile ausgewählt!</target>
<target>%count% Bauteile ausgewählt</target>
</segment>
</unit>
<unit id="FhdheZY" name="company.edit.quick.website">
@ -12921,7 +12927,7 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön
<unit id="TEm7uIg" name="settings.behavior.sidebar.rootNodeRedirectsToNewEntity">
<segment state="translated">
<source>settings.behavior.sidebar.rootNodeRedirectsToNewEntity</source>
<target>Wurzelknoten leitet zur Erstellung eines neuen Elements weiter</target>
<target>Stammknoten leitet zur Erstellung eines neuen Elements weiter</target>
</segment>
</unit>
<unit id="j7HiQ80" name="settings.ips.digikey">

1518
yarn.lock

File diff suppressed because it is too large Load diff