mirror of
https://gitee.com/nocobase/nocobase.git
synced 2025-05-05 21:49:25 +08:00
Merge branch 'next' into develop
This commit is contained in:
commit
9369059acc
@ -54,7 +54,7 @@
|
|||||||
"Insert inner": "Inserire dentro",
|
"Insert inner": "Inserire dentro",
|
||||||
"Delete": "Eliminare",
|
"Delete": "Eliminare",
|
||||||
"Disassociate": "Dissociare",
|
"Disassociate": "Dissociare",
|
||||||
"Disassociate record": "Dissociare il record",
|
"Disassociate record": "Dissociare record",
|
||||||
"Are you sure you want to disassociate it?": "Sei sicuro di voler dissociare?",
|
"Are you sure you want to disassociate it?": "Sei sicuro di voler dissociare?",
|
||||||
"UI editor": "Editor UI",
|
"UI editor": "Editor UI",
|
||||||
"Collection": "Raccolta",
|
"Collection": "Raccolta",
|
||||||
@ -80,7 +80,7 @@
|
|||||||
"Value": "Valore",
|
"Value": "Valore",
|
||||||
"Disabled": "Disabilitato",
|
"Disabled": "Disabilitato",
|
||||||
"Enabled": "Abilitato",
|
"Enabled": "Abilitato",
|
||||||
"Problematic": "Problematico",
|
"Problematic": "Con problemi",
|
||||||
"Setting": "Impostazioni",
|
"Setting": "Impostazioni",
|
||||||
"On": "Acceso",
|
"On": "Acceso",
|
||||||
"Off": "Spento",
|
"Off": "Spento",
|
||||||
@ -121,7 +121,7 @@
|
|||||||
"pixels": "pixel",
|
"pixels": "pixel",
|
||||||
"Screen size": "Dimensione dello schermo",
|
"Screen size": "Dimensione dello schermo",
|
||||||
"Display title": "Visualizza titolo",
|
"Display title": "Visualizza titolo",
|
||||||
"Set the count of columns displayed in a row": "Imposta il conteggio delle colonne visualizzate in una riga",
|
"Set the count of columns displayed in a row": "Imposta conteggio delle colonne visualizzate in una riga",
|
||||||
"Column": "Colonna",
|
"Column": "Colonna",
|
||||||
"Phone device": "Telefono",
|
"Phone device": "Telefono",
|
||||||
"Tablet device": "Tablet",
|
"Tablet device": "Tablet",
|
||||||
@ -146,7 +146,7 @@
|
|||||||
"Half of day": "Metà del giorno",
|
"Half of day": "Metà del giorno",
|
||||||
"Year": "Anno",
|
"Year": "Anno",
|
||||||
"QuarterYear": "Quarto dell' anno",
|
"QuarterYear": "Quarto dell' anno",
|
||||||
"Select grouping field": "Seleziona il campo di raggruppamento",
|
"Select grouping field": "Seleziona campo di raggruppamento",
|
||||||
"Media": "Media",
|
"Media": "Media",
|
||||||
"Markdown": "Markdown",
|
"Markdown": "Markdown",
|
||||||
"Wysiwyg": "Wysiwyg",
|
"Wysiwyg": "Wysiwyg",
|
||||||
@ -175,7 +175,7 @@
|
|||||||
"Expand all": "Espandi tutto",
|
"Expand all": "Espandi tutto",
|
||||||
"Expand/Collapse": "Espandi/Comprimi",
|
"Expand/Collapse": "Espandi/Comprimi",
|
||||||
"Default collapse": "Comprimi di default",
|
"Default collapse": "Comprimi di default",
|
||||||
"Tree table": "Tabella ad albero",
|
"Tree table": "Tabella struttura ad albero",
|
||||||
"Custom field display name": "Nome visualizzato campo personalizzato ",
|
"Custom field display name": "Nome visualizzato campo personalizzato ",
|
||||||
"Display fields": "Visualizza campi",
|
"Display fields": "Visualizza campi",
|
||||||
"Edit record": "Modifica record",
|
"Edit record": "Modifica record",
|
||||||
@ -191,8 +191,8 @@
|
|||||||
"This is a demo text, **supports Markdown syntax**.": "Questo è un testo demo, ** supporta la sintassi di Markdown **.",
|
"This is a demo text, **supports Markdown syntax**.": "Questo è un testo demo, ** supporta la sintassi di Markdown **.",
|
||||||
"Filter": "Filtro",
|
"Filter": "Filtro",
|
||||||
"Connect data blocks": "Collega blocchi di dati",
|
"Connect data blocks": "Collega blocchi di dati",
|
||||||
"Action type": "Tipo di operazione",
|
"Action type": "Tipo di azione",
|
||||||
"Actions": "Operazioni",
|
"Actions": "Azioni",
|
||||||
"Insert": "Inserisci",
|
"Insert": "Inserisci",
|
||||||
"Insert if not exists": "Inserisci se non esiste",
|
"Insert if not exists": "Inserisci se non esiste",
|
||||||
"Insert if not exists, or update": "Inserisci se non esiste o aggiorna",
|
"Insert if not exists, or update": "Inserisci se non esiste o aggiorna",
|
||||||
@ -252,9 +252,7 @@
|
|||||||
"Integer": "Intero",
|
"Integer": "Intero",
|
||||||
"Percent": "Percentuale",
|
"Percent": "Percentuale",
|
||||||
"Password": "Password",
|
"Password": "Password",
|
||||||
"Advanced type": "Avanzato",
|
"Advanced type": "Avanzato",
|
||||||
"Formula": "Formula",
|
|
||||||
"Formula description": "Calcola un valore in ciascun record in base ad altri campi nello stesso record.",
|
|
||||||
"Choices": "Scelte",
|
"Choices": "Scelte",
|
||||||
"Checkbox": "Casella di controllo",
|
"Checkbox": "Casella di controllo",
|
||||||
"Single select": "Selezione singola",
|
"Single select": "Selezione singola",
|
||||||
@ -320,8 +318,7 @@
|
|||||||
"Toggles the subfield mode": "Attiva la modalità Subfield",
|
"Toggles the subfield mode": "Attiva la modalità Subfield",
|
||||||
"Selector mode": "Modalità selettore",
|
"Selector mode": "Modalità selettore",
|
||||||
"Subtable mode": "Modalità sotto-tabella",
|
"Subtable mode": "Modalità sotto-tabella",
|
||||||
"Subform mode": "Modalità sotto-modulo",
|
"Subform mode": "Modalità sotto-modulo",
|
||||||
"Edit block title": "Modifica titolo blocco",
|
|
||||||
"Block title": "Titolo blocco",
|
"Block title": "Titolo blocco",
|
||||||
"Pattern": "Modello",
|
"Pattern": "Modello",
|
||||||
"Operator": "Operatore",
|
"Operator": "Operatore",
|
||||||
@ -341,12 +338,11 @@
|
|||||||
"not ends with": "non termina con",
|
"not ends with": "non termina con",
|
||||||
"is empty": "è vuoto",
|
"is empty": "è vuoto",
|
||||||
"is not empty": "non è vuoto",
|
"is not empty": "non è vuoto",
|
||||||
"Edit chart": "Modifica grafico",
|
"Edit chart": "Modifica grafico",
|
||||||
"Add text": "Aggiungi testo",
|
|
||||||
"Filterable fields": "Campi filtrabili",
|
"Filterable fields": "Campi filtrabili",
|
||||||
"Edit button": "Modifica pulsante",
|
"Edit button": "Modifica pulsante",
|
||||||
"Hide": "Nascondi",
|
"Hide": "Nascondi",
|
||||||
"Enable actions": "Abilita operazioni",
|
"Enable actions": "Abilita azioni",
|
||||||
"Import": "Importa",
|
"Import": "Importa",
|
||||||
"Export": "Esporta",
|
"Export": "Esporta",
|
||||||
"Customize": "Personalizza",
|
"Customize": "Personalizza",
|
||||||
@ -354,12 +350,12 @@
|
|||||||
"Function": "Funzione",
|
"Function": "Funzione",
|
||||||
"Popup form": "Modulo Popup",
|
"Popup form": "Modulo Popup",
|
||||||
"Flexible popup": "Popup flessibile",
|
"Flexible popup": "Popup flessibile",
|
||||||
"Configure actions": "Configura operazioni",
|
"Configure actions": "Configura azioni",
|
||||||
"Display order number": "Visualizza numero ordinamento",
|
"Display order number": "Visualizza numero ordinamento",
|
||||||
"Enable drag and drop sorting": "Abilita l'ordinamento con drag and drop",
|
"Enable drag and drop sorting": "Abilita l'ordinamento con drag and drop",
|
||||||
"Triggered when the row is clicked": "Attivato quando si fa clic sulla riga",
|
"Triggered when the row is clicked": "Attivato quando si fa clic sulla riga",
|
||||||
"Add tab": "Aggiungi scheda",
|
"Add tab": "Aggiungi scheda",
|
||||||
"Disable tabs": "Disabilita le schede",
|
"Disable tabs": "Disabilita schede",
|
||||||
"Details": "Dettagli",
|
"Details": "Dettagli",
|
||||||
"Edit form": "Modifica modulo",
|
"Edit form": "Modifica modulo",
|
||||||
"Create form": "Crea modulo",
|
"Create form": "Crea modulo",
|
||||||
@ -373,13 +369,13 @@
|
|||||||
"Custom column name": "Nome colonna personalizzato",
|
"Custom column name": "Nome colonna personalizzato",
|
||||||
"Edit description": "Modifica descrizione",
|
"Edit description": "Modifica descrizione",
|
||||||
"Required": "Richiesto",
|
"Required": "Richiesto",
|
||||||
"Unique": "Unico",
|
"Unique": "Univoco",
|
||||||
"Primary": "Primario",
|
"Primary": "Primario",
|
||||||
"Auto increment": "Incremento automatico",
|
"Auto increment": "Incremento automatico",
|
||||||
"Label field": "Campo etichetta",
|
"Label field": "Campo etichetta",
|
||||||
"Default is the ID field": "L'impostazione predefinita è il campo ID",
|
"Default is the ID field": "L'impostazione predefinita è il campo ID",
|
||||||
"Set default sorting rules": "Imposta le regole di ordinamento predefinite",
|
"Set default sorting rules": "Imposta regole di ordinamento predefinite",
|
||||||
"Set validation rules": "Imposta le regole di convalida",
|
"Set validation rules": "Imposta regole di convalida",
|
||||||
"Max length": "Lunghezza massima",
|
"Max length": "Lunghezza massima",
|
||||||
"Min length": "Lunghezza minima",
|
"Min length": "Lunghezza minima",
|
||||||
"Maximum": "Massimo",
|
"Maximum": "Massimo",
|
||||||
@ -430,8 +426,7 @@
|
|||||||
"Text Align": "Allineamento testo",
|
"Text Align": "Allineamento testo",
|
||||||
"Add option": "Aggiungi opzione",
|
"Add option": "Aggiungi opzione",
|
||||||
"Related collection": "Raccolta correlata",
|
"Related collection": "Raccolta correlata",
|
||||||
"Allow linking to multiple records": "Consenti il collegamento a più record",
|
"Allow linking to multiple records": "Consenti collegamento a più record",
|
||||||
"Allow uploading multiple files": "Consenti il caricamento di più file",
|
|
||||||
"Configure calendar": "Configura calendario",
|
"Configure calendar": "Configura calendario",
|
||||||
"Title field": "Campo titolo",
|
"Title field": "Campo titolo",
|
||||||
"Custom title": "Titolo personalizzato",
|
"Custom title": "Titolo personalizzato",
|
||||||
@ -471,13 +466,13 @@
|
|||||||
"Configure": "Configura",
|
"Configure": "Configura",
|
||||||
"Configure permissions": "Configura permessi",
|
"Configure permissions": "Configura permessi",
|
||||||
"Edit role": "Modifica ruolo",
|
"Edit role": "Modifica ruolo",
|
||||||
"Action permissions": "Permessi su operazioni",
|
"Action permissions": "Permessi su azioni",
|
||||||
"Menu permissions": "Permessi su menu",
|
"Menu permissions": "Permessi su menu",
|
||||||
"Menu item name": "Nome voce di menu",
|
"Menu item name": "Nome voce di menu",
|
||||||
"Allow access": "Consenti accesso",
|
"Allow access": "Consenti accesso",
|
||||||
"Action name": "Nome operazione",
|
"Action name": "Nome azione",
|
||||||
"Allow action": "Consenti operazione",
|
"Allow action": "Consenti azione",
|
||||||
"Action scope": "Ambito operazione",
|
"Action scope": "Ambito azione",
|
||||||
"Operate on new data": "Operare su nuovi dati",
|
"Operate on new data": "Operare su nuovi dati",
|
||||||
"Operate on existing data": "Operare su dati esistenti",
|
"Operate on existing data": "Operare su dati esistenti",
|
||||||
"Yes": "Si",
|
"Yes": "Si",
|
||||||
@ -503,11 +498,11 @@
|
|||||||
"Save as block template": "Salva come modello blocco",
|
"Save as block template": "Salva come modello blocco",
|
||||||
"Block templates": "Modelli blocco",
|
"Block templates": "Modelli blocco",
|
||||||
"Block template": "Modello blocco",
|
"Block template": "Modello blocco",
|
||||||
"Convert reference to duplicate": "Converti il riferimento a duplicato",
|
"Convert reference to duplicate": "Converti riferimento a duplicato",
|
||||||
"Template name": "Nome modello",
|
"Template name": "Nome modello",
|
||||||
"Block type": "Tipo blocco",
|
"Block type": "Tipo blocco",
|
||||||
"No blocks to connect": "Nessun blocco per connettersi",
|
"No blocks to connect": "Nessun blocco per connettersi",
|
||||||
"Action column": "Colonna operazioni",
|
"Action column": "Colonna azioni",
|
||||||
"Records per page": "Record per pagina",
|
"Records per page": "Record per pagina",
|
||||||
"(Fields only)": "(Solo campi)",
|
"(Fields only)": "(Solo campi)",
|
||||||
"Button title": "Titolo pulsante",
|
"Button title": "Titolo pulsante",
|
||||||
@ -542,7 +537,7 @@
|
|||||||
"Identifier for program usage. Support letters, numbers and underscores, must start with an letter.": "Identificatore per l'utilizzo del programma. Supporta lettere, numeri e underscore, deve iniziare con una lettera.",
|
"Identifier for program usage. Support letters, numbers and underscores, must start with an letter.": "Identificatore per l'utilizzo del programma. Supporta lettere, numeri e underscore, deve iniziare con una lettera.",
|
||||||
"Drawer": "Cassetto",
|
"Drawer": "Cassetto",
|
||||||
"Dialog": "Dialogo",
|
"Dialog": "Dialogo",
|
||||||
"Delete action": "Elimina operazione",
|
"Delete action": "Elimina azione",
|
||||||
"Custom column title": "Titolo colonna personalizzata",
|
"Custom column title": "Titolo colonna personalizzata",
|
||||||
"Column title": "Titolo colonna",
|
"Column title": "Titolo colonna",
|
||||||
"Original title: ": "Titolo originale: ",
|
"Original title: ": "Titolo originale: ",
|
||||||
@ -556,7 +551,7 @@
|
|||||||
"Then": "Poi",
|
"Then": "Poi",
|
||||||
"Stay on current page": "Resta sulla pagina corrente",
|
"Stay on current page": "Resta sulla pagina corrente",
|
||||||
"Redirect to": "Reindirizza a",
|
"Redirect to": "Reindirizza a",
|
||||||
"Save action": "Salva operazione",
|
"Save action": "Salva azione",
|
||||||
"Exists": "Esiste",
|
"Exists": "Esiste",
|
||||||
"Add condition": "Aggiungi condizione",
|
"Add condition": "Aggiungi condizione",
|
||||||
"Add condition group": "Aggiungi gruppo di condizioni",
|
"Add condition group": "Aggiungi gruppo di condizioni",
|
||||||
@ -570,11 +565,8 @@
|
|||||||
"<": "<",
|
"<": "<",
|
||||||
"≤": "≤",
|
"≤": "≤",
|
||||||
"Role UID": "Ruolo UID",
|
"Role UID": "Ruolo UID",
|
||||||
"Precision": "Precisione",
|
"Precision": "Precisione",
|
||||||
"Formula mode": "Modalità formula",
|
"Expression": "Espressione",
|
||||||
"Expression": "Espressione",
|
|
||||||
"Input +, -, *, /, ( ) to calculate, input @ to open field variables.": "Input +, -, *, /, () per calcolare, input @ per aprire le variabili campo.",
|
|
||||||
"Formula error.": "Errore formula.",
|
|
||||||
"Rich Text": "Testo ricco",
|
"Rich Text": "Testo ricco",
|
||||||
"Junction collection": "Raccolta giunzione",
|
"Junction collection": "Raccolta giunzione",
|
||||||
"Leave it blank, unless you need a custom intermediate table": "Lascialo vuoto, a meno che tu non abbia bisogno di una tabella intermedia personalizzata",
|
"Leave it blank, unless you need a custom intermediate table": "Lascialo vuoto, a meno che tu non abbia bisogno di una tabella intermedia personalizzata",
|
||||||
@ -595,7 +587,7 @@
|
|||||||
"Tab name": "Nome della scheda",
|
"Tab name": "Nome della scheda",
|
||||||
"Current record blocks": "Blocchi record attuale",
|
"Current record blocks": "Blocchi record attuale",
|
||||||
"Popup message": "Messaggio popup",
|
"Popup message": "Messaggio popup",
|
||||||
"Delete role": "Elimina il ruolo",
|
"Delete role": "Elimina ruolo",
|
||||||
"Role display name": "Nome visualizzato ruolo",
|
"Role display name": "Nome visualizzato ruolo",
|
||||||
"Default role": "Ruolo predefinito",
|
"Default role": "Ruolo predefinito",
|
||||||
"All collections use general action permissions by default; permission configured individually will override the default one.": "Tutte le raccolte utilizzano i permessi di operazioni generali per impostazione predefinita; I permessi configurati individualmente sovrascriveranno quelli predefiniti.",
|
"All collections use general action permissions by default; permission configured individually will override the default one.": "Tutte le raccolte utilizzano i permessi di operazioni generali per impostazione predefinita; I permessi configurati individualmente sovrascriveranno quelli predefiniti.",
|
||||||
@ -612,11 +604,11 @@
|
|||||||
"Allows to configure interface": "Consente di configurare l'interfaccia",
|
"Allows to configure interface": "Consente di configurare l'interfaccia",
|
||||||
"Allows to install, activate, disable plugins": "Consente di installare, attivare, disabilitare i plugin",
|
"Allows to install, activate, disable plugins": "Consente di installare, attivare, disabilitare i plugin",
|
||||||
"Allows to configure plugins": "Consente di configurare i plugin",
|
"Allows to configure plugins": "Consente di configurare i plugin",
|
||||||
"Action display name": "Nome visualizzato operazione",
|
"Action display name": "Nome visualizzato azione",
|
||||||
"Allow": "Permetti",
|
"Allow": "Permetti",
|
||||||
"Data scope": "Ambito dei dati",
|
"Data scope": "Ambito dei dati",
|
||||||
"Action on new records": "Operazione su nuovi record",
|
"Action on new records": "Azione su nuovi record",
|
||||||
"Action on existing records": "Operazione su record esistenti",
|
"Action on existing records": "Azione su record esistenti",
|
||||||
"All records": "Tutti i record",
|
"All records": "Tutti i record",
|
||||||
"Own records": "Record propri",
|
"Own records": "Record propri",
|
||||||
"Permission policy": "Policy di autorizzazione",
|
"Permission policy": "Policy di autorizzazione",
|
||||||
@ -624,14 +616,14 @@
|
|||||||
"General": "Generale",
|
"General": "Generale",
|
||||||
"Accessible": "Accessibile",
|
"Accessible": "Accessibile",
|
||||||
"Configure permission": "Configura permesso",
|
"Configure permission": "Configura permesso",
|
||||||
"Action permission": "Permesso operazione",
|
"Action permission": "Permesso azione",
|
||||||
"Field permission": "Permesso campo",
|
"Field permission": "Permesso campo",
|
||||||
"Scope name": "Nome ambito",
|
"Scope name": "Nome ambito",
|
||||||
"Unsaved changes": "Modifiche non salvate",
|
"Unsaved changes": "Modifiche non salvate",
|
||||||
"Are you sure you don't want to save?": "Sei sicuro di non voler salvare?",
|
"Are you sure you don't want to save?": "Sei sicuro di non voler salvare?",
|
||||||
"Dragging": "Trascina",
|
"Dragging": "Trascina",
|
||||||
"Popup": "Popup",
|
"Popup": "Popup",
|
||||||
"Trigger workflow": "Trigger flusso di lavoro",
|
"Trigger workflow": "Trigger workflow",
|
||||||
"Request API": "Richiesta API",
|
"Request API": "Richiesta API",
|
||||||
"Assign field values": "Assegna valori del campo",
|
"Assign field values": "Assegna valori del campo",
|
||||||
"Constant value": "Valore costante",
|
"Constant value": "Valore costante",
|
||||||
@ -762,12 +754,7 @@
|
|||||||
"Please fill in the iframe URL": "Si prega di compilare l'URL iFrame",
|
"Please fill in the iframe URL": "Si prega di compilare l'URL iFrame",
|
||||||
"Fix block": "Fissa blocco",
|
"Fix block": "Fissa blocco",
|
||||||
"Plugin name": "Nome plugin",
|
"Plugin name": "Nome plugin",
|
||||||
"Plugin tab name": "Nome scheda plugin",
|
"Plugin tab name": "Nome scheda plugin",
|
||||||
"AutoGenId": "Campo ID generato automaticamente",
|
|
||||||
"CreatedBy": "Creato da",
|
|
||||||
"UpdatedBy": "Aggiornato da",
|
|
||||||
"CreatedAt": "Creato il",
|
|
||||||
"UpdatedAt": "Aggiornato il",
|
|
||||||
"Column width": "Larghezza colonna",
|
"Column width": "Larghezza colonna",
|
||||||
"Sortable": "Ordinabile",
|
"Sortable": "Ordinabile",
|
||||||
"Enable link": "Abilita link",
|
"Enable link": "Abilita link",
|
||||||
@ -796,9 +783,8 @@
|
|||||||
"Current form": "Modulo corrente",
|
"Current form": "Modulo corrente",
|
||||||
"Current object": "Oggetto corrente",
|
"Current object": "Oggetto corrente",
|
||||||
"Linkage with form fields": "Collegamento con i campi del modulo",
|
"Linkage with form fields": "Collegamento con i campi del modulo",
|
||||||
"Allow add new, update and delete actions": "Consenti operazioni aggiungi nuovo, aggiorna ed elimina",
|
"Allow add new, update and delete actions": "Consenti azioni aggiungi nuovo, aggiorna ed elimina",
|
||||||
"Date display format": "Formato di visualizzazione della data",
|
"Date display format": "Formato di visualizzazione della data",
|
||||||
"Assign data scope for the template": "Assegna l'ambito dei dati per il modello",
|
|
||||||
"Table selected records": "Tabella record selezionati",
|
"Table selected records": "Tabella record selezionati",
|
||||||
"Tag": "Etichetta",
|
"Tag": "Etichetta",
|
||||||
"Tag color field": "Campo colore etichetta",
|
"Tag color field": "Campo colore etichetta",
|
||||||
@ -813,8 +799,7 @@
|
|||||||
"Please confirm the SQL statement first": "Si prega di confermare prima l'istruzione SQL",
|
"Please confirm the SQL statement first": "Si prega di confermare prima l'istruzione SQL",
|
||||||
"Automatically drop objects that depend on the collection (such as views), and in turn all objects that depend on those objects": "Elimina automaticamente gli oggetti che dipendono dalla raccolta (come le viste) e, a loro volta, tutti gli oggetti che dipendono da tali oggetti",
|
"Automatically drop objects that depend on the collection (such as views), and in turn all objects that depend on those objects": "Elimina automaticamente gli oggetti che dipendono dalla raccolta (come le viste) e, a loro volta, tutti gli oggetti che dipendono da tali oggetti",
|
||||||
"Sign in with another account": "Accedi con un altro account",
|
"Sign in with another account": "Accedi con un altro account",
|
||||||
"Return to the main application": "Torna alla applicazione principale",
|
"Return to the main application": "Torna alla applicazione principale",
|
||||||
"Permission deined": "Permesso negato",
|
|
||||||
"loading": "caricamento",
|
"loading": "caricamento",
|
||||||
"name is required": "nome richiesto",
|
"name is required": "nome richiesto",
|
||||||
"data source": "sorgente dati",
|
"data source": "sorgente dati",
|
||||||
@ -843,7 +828,7 @@
|
|||||||
"URL search params": "Parametri di ricerca URL",
|
"URL search params": "Parametri di ricerca URL",
|
||||||
"Expand All": "Espandi tutto",
|
"Expand All": "Espandi tutto",
|
||||||
"Search": "Ricerca",
|
"Search": "Ricerca",
|
||||||
"Clear default value": "Cancella il valore predefinito",
|
"Clear default value": "Cancella valore predefinito",
|
||||||
"Open in new window": "Apri in una nuova finestra",
|
"Open in new window": "Apri in una nuova finestra",
|
||||||
"Sorry, the page you visited does not exist.": "Spiacente, la pagina che hai visitato non esiste.",
|
"Sorry, the page you visited does not exist.": "Spiacente, la pagina che hai visitato non esiste.",
|
||||||
"is none of": "non è nessuno di",
|
"is none of": "non è nessuno di",
|
||||||
|
@ -1088,5 +1088,11 @@
|
|||||||
"Full permissions": "全部权限",
|
"Full permissions": "全部权限",
|
||||||
"Enable index column": "启用序号列",
|
"Enable index column": "启用序号列",
|
||||||
"Date scope": "日期范围",
|
"Date scope": "日期范围",
|
||||||
"Icon only": "仅显示图标"
|
"Icon only": "仅显示图标",
|
||||||
|
"Valid range: 100-900": "有效范围:100-900",
|
||||||
|
"Valid range: 10-40": "有效范围:10-40",
|
||||||
|
"Font Size(px)": "字体大小(像素)",
|
||||||
|
"Font Weight": "字体粗细",
|
||||||
|
"Font Style": "字体样式",
|
||||||
|
"Italic": "斜体"
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,54 @@
|
|||||||
|
/**
|
||||||
|
* This file is part of the NocoBase (R) project.
|
||||||
|
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
||||||
|
* Authors: NocoBase Team.
|
||||||
|
*
|
||||||
|
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
||||||
|
* For more information, please refer to: https://www.nocobase.com/agreement.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { expect, test } from '@nocobase/test/e2e';
|
||||||
|
import { oneDetailBlockFieldWidthFieldStyle } from './templates';
|
||||||
|
|
||||||
|
test.describe('field style linkage rule', () => {
|
||||||
|
test('field style support Color、Background Color、Text Align、Font Size、Font Weight、Font Style', async ({
|
||||||
|
page,
|
||||||
|
mockPage,
|
||||||
|
}) => {
|
||||||
|
await mockPage(oneDetailBlockFieldWidthFieldStyle).goto();
|
||||||
|
await page.getByLabel('block-item-CardItem-users-').hover();
|
||||||
|
await page.getByLabel('block-item-CollectionField-users-details-users.nickname-Nickname').hover();
|
||||||
|
await page
|
||||||
|
.getByLabel('designer-schema-settings-CollectionField-fieldSettings:FormItem-users-users.nickname', {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
await page.getByText('Style').click();
|
||||||
|
await page.getByRole('button', { name: 'plus Add linkage rule' }).click();
|
||||||
|
await page.getByText('Add property').click();
|
||||||
|
await page.locator('div').filter({ hasText: 'Style Linkage' }).nth(2).click();
|
||||||
|
await page.getByTestId('select-linkage-properties').click();
|
||||||
|
await expect(page.getByText('Color', { exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByText('Background Color')).toBeVisible();
|
||||||
|
await expect(page.getByText('Text Align')).toBeVisible();
|
||||||
|
await expect(page.getByText('Font Size(px)')).toBeVisible();
|
||||||
|
await expect(page.getByText('Font Weight')).toBeVisible();
|
||||||
|
await expect(page.getByText('Font Style')).toBeVisible();
|
||||||
|
// 配置字段样式
|
||||||
|
await page.getByText('Font Size(px)').click();
|
||||||
|
|
||||||
|
await page.getByPlaceholder('Valid range: 10-').click();
|
||||||
|
await page.getByPlaceholder('Valid range: 10-').fill('40');
|
||||||
|
await page.getByRole('button', { name: 'OK' }).click();
|
||||||
|
// 获取元素并断言其 font-size 为 40px
|
||||||
|
const fontSize = await page
|
||||||
|
.locator('.ant-formily-item-control-content-component')
|
||||||
|
.first()
|
||||||
|
.evaluate((element) => {
|
||||||
|
return window.getComputedStyle(element).fontSize;
|
||||||
|
});
|
||||||
|
|
||||||
|
// 断言 font-size 是 40px
|
||||||
|
expect(fontSize).toBe('40px');
|
||||||
|
});
|
||||||
|
});
|
@ -2476,3 +2476,227 @@ export const shouldImmediatelyShowDrawerWhenClickingEnableLinkForTheFirstTime =
|
|||||||
'x-index': 1,
|
'x-index': 1,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const oneDetailBlockFieldWidthFieldStyle = {
|
||||||
|
pageSchema: {
|
||||||
|
_isJSONSchemaObject: true,
|
||||||
|
version: '2.0',
|
||||||
|
type: 'void',
|
||||||
|
'x-component': 'Page',
|
||||||
|
'x-app-version': 'v1.7.0-beta.5',
|
||||||
|
properties: {
|
||||||
|
j5rf9qdpszc: {
|
||||||
|
type: 'void',
|
||||||
|
'x-component': 'Grid',
|
||||||
|
'x-initializer': 'page:addBlock',
|
||||||
|
properties: {
|
||||||
|
x72noji3ol7: {
|
||||||
|
_isJSONSchemaObject: true,
|
||||||
|
version: '2.0',
|
||||||
|
type: 'void',
|
||||||
|
'x-component': 'Grid.Row',
|
||||||
|
'x-app-version': '1.7.0-beta.5',
|
||||||
|
properties: {
|
||||||
|
'6klgaiwxs8q': {
|
||||||
|
_isJSONSchemaObject: true,
|
||||||
|
version: '2.0',
|
||||||
|
type: 'void',
|
||||||
|
'x-component': 'Grid.Col',
|
||||||
|
'x-app-version': '1.7.0-beta.5',
|
||||||
|
properties: {
|
||||||
|
dpj7gevoiqw: {
|
||||||
|
_isJSONSchemaObject: true,
|
||||||
|
version: '2.0',
|
||||||
|
type: 'void',
|
||||||
|
'x-acl-action': 'users:view',
|
||||||
|
'x-decorator': 'DetailsBlockProvider',
|
||||||
|
'x-use-decorator-props': 'useDetailsWithPaginationDecoratorProps',
|
||||||
|
'x-decorator-props': {
|
||||||
|
dataSource: 'main',
|
||||||
|
collection: 'users',
|
||||||
|
readPretty: true,
|
||||||
|
action: 'list',
|
||||||
|
params: {
|
||||||
|
pageSize: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'x-toolbar': 'BlockSchemaToolbar',
|
||||||
|
'x-settings': 'blockSettings:detailsWithPagination',
|
||||||
|
'x-component': 'CardItem',
|
||||||
|
'x-app-version': '1.7.0-beta.5',
|
||||||
|
properties: {
|
||||||
|
'5zo8ay6xu74': {
|
||||||
|
_isJSONSchemaObject: true,
|
||||||
|
version: '2.0',
|
||||||
|
type: 'void',
|
||||||
|
'x-component': 'Details',
|
||||||
|
'x-read-pretty': true,
|
||||||
|
'x-use-component-props': 'useDetailsWithPaginationProps',
|
||||||
|
'x-app-version': '1.7.0-beta.5',
|
||||||
|
properties: {
|
||||||
|
'2u7t8s8zffc': {
|
||||||
|
_isJSONSchemaObject: true,
|
||||||
|
version: '2.0',
|
||||||
|
type: 'void',
|
||||||
|
'x-initializer': 'details:configureActions',
|
||||||
|
'x-component': 'ActionBar',
|
||||||
|
'x-component-props': {
|
||||||
|
style: {
|
||||||
|
marginBottom: 24,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'x-app-version': '1.7.0-beta.5',
|
||||||
|
'x-uid': 'ajfbilj1eas',
|
||||||
|
'x-async': false,
|
||||||
|
'x-index': 1,
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
_isJSONSchemaObject: true,
|
||||||
|
version: '2.0',
|
||||||
|
type: 'void',
|
||||||
|
'x-component': 'Grid',
|
||||||
|
'x-initializer': 'details:configureFields',
|
||||||
|
'x-app-version': '1.7.0-beta.5',
|
||||||
|
properties: {
|
||||||
|
g1jwsjkiks0: {
|
||||||
|
_isJSONSchemaObject: true,
|
||||||
|
version: '2.0',
|
||||||
|
type: 'void',
|
||||||
|
'x-component': 'Grid.Row',
|
||||||
|
'x-app-version': '1.7.0-beta.5',
|
||||||
|
properties: {
|
||||||
|
gi5z3ss61t2: {
|
||||||
|
_isJSONSchemaObject: true,
|
||||||
|
version: '2.0',
|
||||||
|
type: 'void',
|
||||||
|
'x-component': 'Grid.Col',
|
||||||
|
'x-app-version': '1.7.0-beta.5',
|
||||||
|
properties: {
|
||||||
|
nickname: {
|
||||||
|
'x-uid': '2a4om1os4i8',
|
||||||
|
_isJSONSchemaObject: true,
|
||||||
|
version: '2.0',
|
||||||
|
type: 'string',
|
||||||
|
'x-toolbar': 'FormItemSchemaToolbar',
|
||||||
|
'x-settings': 'fieldSettings:FormItem',
|
||||||
|
'x-component': 'CollectionField',
|
||||||
|
'x-decorator': 'FormItem',
|
||||||
|
'x-collection-field': 'users.nickname',
|
||||||
|
'x-component-props': {},
|
||||||
|
'x-app-version': '1.7.0-beta.5',
|
||||||
|
// 'x-linkage-style-rules': [
|
||||||
|
// {
|
||||||
|
// condition: {
|
||||||
|
// $and: [],
|
||||||
|
// },
|
||||||
|
// actions: [
|
||||||
|
// {
|
||||||
|
// operator: 'fontSize',
|
||||||
|
// value: {
|
||||||
|
// mode: 'constant',
|
||||||
|
// value: 40,
|
||||||
|
// },
|
||||||
|
// },
|
||||||
|
// ],
|
||||||
|
// },
|
||||||
|
// ],
|
||||||
|
'x-async': false,
|
||||||
|
'x-index': 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'x-uid': 'ki6424bbnoa',
|
||||||
|
'x-async': false,
|
||||||
|
'x-index': 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'x-uid': '387m3183ea3',
|
||||||
|
'x-async': false,
|
||||||
|
'x-index': 1,
|
||||||
|
},
|
||||||
|
'1rhnbs2gcca': {
|
||||||
|
_isJSONSchemaObject: true,
|
||||||
|
version: '2.0',
|
||||||
|
type: 'void',
|
||||||
|
'x-component': 'Grid.Row',
|
||||||
|
'x-app-version': '1.7.0-beta.5',
|
||||||
|
properties: {
|
||||||
|
d5ma1xl6j2i: {
|
||||||
|
_isJSONSchemaObject: true,
|
||||||
|
version: '2.0',
|
||||||
|
type: 'void',
|
||||||
|
'x-component': 'Grid.Col',
|
||||||
|
'x-app-version': '1.7.0-beta.5',
|
||||||
|
properties: {
|
||||||
|
username: {
|
||||||
|
_isJSONSchemaObject: true,
|
||||||
|
version: '2.0',
|
||||||
|
type: 'string',
|
||||||
|
'x-toolbar': 'FormItemSchemaToolbar',
|
||||||
|
'x-settings': 'fieldSettings:FormItem',
|
||||||
|
'x-component': 'CollectionField',
|
||||||
|
'x-decorator': 'FormItem',
|
||||||
|
'x-collection-field': 'users.username',
|
||||||
|
'x-component-props': {},
|
||||||
|
'x-app-version': '1.7.0-beta.5',
|
||||||
|
'x-uid': '1ayny4b2ylm',
|
||||||
|
'x-async': false,
|
||||||
|
'x-index': 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'x-uid': 'cdkqplw5ec7',
|
||||||
|
'x-async': false,
|
||||||
|
'x-index': 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'x-uid': 'k35rh0ef681',
|
||||||
|
'x-async': false,
|
||||||
|
'x-index': 2,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'x-uid': 'erulf9efwvv',
|
||||||
|
'x-async': false,
|
||||||
|
'x-index': 2,
|
||||||
|
},
|
||||||
|
pagination: {
|
||||||
|
_isJSONSchemaObject: true,
|
||||||
|
version: '2.0',
|
||||||
|
type: 'void',
|
||||||
|
'x-component': 'Pagination',
|
||||||
|
'x-use-component-props': 'useDetailsPaginationProps',
|
||||||
|
'x-app-version': '1.7.0-beta.5',
|
||||||
|
'x-uid': 'rcmvkgxvob9',
|
||||||
|
'x-async': false,
|
||||||
|
'x-index': 3,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'x-uid': 'jra1fx1jp0k',
|
||||||
|
'x-async': false,
|
||||||
|
'x-index': 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'x-uid': '3u4qbg33yhg',
|
||||||
|
'x-async': false,
|
||||||
|
'x-index': 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'x-uid': 'g126n7qmm1k',
|
||||||
|
'x-async': false,
|
||||||
|
'x-index': 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'x-uid': 'ftxf3gxjwxs',
|
||||||
|
'x-async': false,
|
||||||
|
'x-index': 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
name: 'j8dv3zpp2l7',
|
||||||
|
'x-uid': 'n9tpyozmuz9',
|
||||||
|
'x-async': true,
|
||||||
|
'x-index': 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'x-uid': 'u3njequ14zz',
|
||||||
|
'x-async': true,
|
||||||
|
'x-index': 1,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
@ -50,7 +50,7 @@ describe('CollectionSelect', () => {
|
|||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
aria-label="block-item-demo title"
|
aria-label="block-item-demo title"
|
||||||
class="nb-block-item nb-form-item css-1elzyjx ant-nb-block-item css-dev-only-do-not-override-1rquknz"
|
class="nb-block-item nb-form-item css-9qorhu ant-nb-block-item css-dev-only-do-not-override-11aiz3o"
|
||||||
role="button"
|
role="button"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
@ -191,7 +191,7 @@ describe('CollectionSelect', () => {
|
|||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
aria-label="block-item-demo title"
|
aria-label="block-item-demo title"
|
||||||
class="nb-block-item nb-form-item css-1elzyjx ant-nb-block-item css-dev-only-do-not-override-1rquknz"
|
class="nb-block-item nb-form-item css-9qorhu ant-nb-block-item css-dev-only-do-not-override-11aiz3o"
|
||||||
role="button"
|
role="button"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
|
@ -985,12 +985,11 @@ function useFormItemCollectionField() {
|
|||||||
|
|
||||||
export function useIsAssociationField() {
|
export function useIsAssociationField() {
|
||||||
const collectionField = useFormItemCollectionField();
|
const collectionField = useFormItemCollectionField();
|
||||||
const isAssociationField = ['obo', 'oho', 'o2o', 'o2m', 'm2m', 'm2o', 'updatedBy', 'createdBy', 'mbm'].includes(
|
const isAssociationField =
|
||||||
collectionField?.interface,
|
collectionField &&
|
||||||
);
|
['hasOne', 'hasMany', 'belongsTo', 'belongsToMany', 'belongsToArray'].includes(collectionField.type);
|
||||||
return isAssociationField;
|
return isAssociationField;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function useIsFileField() {
|
export function useIsFileField() {
|
||||||
const cm = useCollectionManager();
|
const cm = useCollectionManager();
|
||||||
const collectionField = useFormItemCollectionField();
|
const collectionField = useFormItemCollectionField();
|
||||||
|
@ -100,6 +100,9 @@ export const FormItem: any = withDynamicSchemaProps(
|
|||||||
? '100% !important'
|
? '100% !important'
|
||||||
: null};
|
: null};
|
||||||
}
|
}
|
||||||
|
.ant-formily-item-control {
|
||||||
|
padding: ${showTitle === false ? '5px' : '0px'};
|
||||||
|
}
|
||||||
`,
|
`,
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
|
@ -29,10 +29,10 @@ export const mapTimeFormat = function () {
|
|||||||
...props,
|
...props,
|
||||||
format,
|
format,
|
||||||
inputReadOnly: true,
|
inputReadOnly: true,
|
||||||
value: dayjsable(props.value, format),
|
value: dayjsable(props.value, 'HH:mm:ss'),
|
||||||
onChange: (value: dayjs.Dayjs | dayjs.Dayjs[]) => {
|
onChange: (value: dayjs.Dayjs | dayjs.Dayjs[]) => {
|
||||||
if (onChange) {
|
if (onChange) {
|
||||||
onChange(formatDayjsValue(value, format) || null);
|
onChange(formatDayjsValue(value, 'HH:mm:ss') || null);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -0,0 +1,171 @@
|
|||||||
|
/**
|
||||||
|
* This file is part of the NocoBase (R) project.
|
||||||
|
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
||||||
|
* Authors: NocoBase Team.
|
||||||
|
*
|
||||||
|
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
||||||
|
* For more information, please refer to: https://www.nocobase.com/agreement.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { CloseCircleOutlined } from '@ant-design/icons';
|
||||||
|
import { css } from '@emotion/css';
|
||||||
|
import { observer } from '@formily/react';
|
||||||
|
import { uid } from '@formily/shared';
|
||||||
|
import { Select, Space } from 'antd';
|
||||||
|
import React, { useCallback, useContext, useMemo } from 'react';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
|
import { useCompile } from '../..';
|
||||||
|
import { ValueDynamicComponent } from './ValueDynamicComponent';
|
||||||
|
import { RemoveActionContext } from './context';
|
||||||
|
import { ActionType } from './type';
|
||||||
|
import { useValues } from './useValues';
|
||||||
|
|
||||||
|
const colorSchema = {
|
||||||
|
type: 'string',
|
||||||
|
'x-decorator': 'FormItem',
|
||||||
|
'x-component': 'ColorPicker',
|
||||||
|
'x-component-props': {
|
||||||
|
defaultValue: '',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
const textAlignSchema = {
|
||||||
|
type: 'string',
|
||||||
|
'x-decorator': 'FormItem',
|
||||||
|
'x-component': 'Select',
|
||||||
|
'x-component-props': {
|
||||||
|
defaultValue: '',
|
||||||
|
},
|
||||||
|
enum: [
|
||||||
|
{
|
||||||
|
label: 'left',
|
||||||
|
value: 'left',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'right',
|
||||||
|
value: 'right',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'center',
|
||||||
|
value: 'center',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
const fontSizeSchema = {
|
||||||
|
type: 'number',
|
||||||
|
'x-decorator': 'FormItem',
|
||||||
|
'x-component': 'InputNumber',
|
||||||
|
'x-component-props': {
|
||||||
|
precision: 0,
|
||||||
|
min: 10,
|
||||||
|
max: 40,
|
||||||
|
placeholder: '{{t("Valid range: 10-40")}}',
|
||||||
|
},
|
||||||
|
'x-validator': {
|
||||||
|
maximum: 40,
|
||||||
|
minimum: 10,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const fontWeightSchema = {
|
||||||
|
type: 'number',
|
||||||
|
'x-decorator': 'FormItem',
|
||||||
|
'x-component': 'InputNumber',
|
||||||
|
'x-component-props': {
|
||||||
|
precision: 0,
|
||||||
|
placeholder: '{{t("Valid range: 100-900")}}',
|
||||||
|
max: 900,
|
||||||
|
min: 100,
|
||||||
|
},
|
||||||
|
'x-validator': {
|
||||||
|
maximum: 900,
|
||||||
|
minimum: 100,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const fontStyleSchema = {
|
||||||
|
type: 'string',
|
||||||
|
'x-decorator': 'FormItem',
|
||||||
|
'x-component': 'Select',
|
||||||
|
'x-component-props': {
|
||||||
|
defaultValue: '',
|
||||||
|
},
|
||||||
|
enum: [
|
||||||
|
{
|
||||||
|
label: "{{t('Normal')}}",
|
||||||
|
value: 'normal',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "{{t('Italic')}}",
|
||||||
|
value: 'italic',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
const schemas = new Map();
|
||||||
|
schemas.set(ActionType.Color, colorSchema);
|
||||||
|
schemas.set(ActionType.BackgroundColor, colorSchema);
|
||||||
|
schemas.set(ActionType.TextAlign, textAlignSchema);
|
||||||
|
schemas.set(ActionType.FontSize, fontSizeSchema);
|
||||||
|
schemas.set(ActionType.FontWeight, fontWeightSchema);
|
||||||
|
schemas.set(ActionType.FontStyle, fontStyleSchema);
|
||||||
|
|
||||||
|
export const FieldStyleLinkageRuleAction = observer(
|
||||||
|
(props: any) => {
|
||||||
|
const { options, collectionName } = props;
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const compile = useCompile();
|
||||||
|
const remove = useContext(RemoveActionContext);
|
||||||
|
const { operator, setOperator, value: fieldValue, setValue } = useValues(options);
|
||||||
|
const operators = useMemo(
|
||||||
|
() =>
|
||||||
|
compile([
|
||||||
|
{ label: t('Color'), value: ActionType.Color, schema: {} },
|
||||||
|
{ label: t('Background Color'), value: ActionType.BackgroundColor, schema: {} },
|
||||||
|
{ label: t('Text Align'), value: ActionType.TextAlign, schema: {} },
|
||||||
|
{ label: t('Font Size(px)'), value: ActionType.FontSize, schema: {} },
|
||||||
|
{ label: t('Font Weight'), value: ActionType.FontWeight, schema: {} },
|
||||||
|
{ label: t('Font Style'), value: ActionType.FontStyle, schema: {} },
|
||||||
|
]),
|
||||||
|
[compile, t],
|
||||||
|
);
|
||||||
|
|
||||||
|
const onChange = useCallback(
|
||||||
|
(value) => {
|
||||||
|
setOperator(value);
|
||||||
|
},
|
||||||
|
[setOperator],
|
||||||
|
);
|
||||||
|
|
||||||
|
const closeStyle = useMemo(() => ({ color: '#bfbfbf' }), []);
|
||||||
|
return (
|
||||||
|
<div style={{ marginBottom: 8 }}>
|
||||||
|
<Space>
|
||||||
|
<Select
|
||||||
|
data-testid="select-linkage-properties"
|
||||||
|
popupMatchSelectWidth={false}
|
||||||
|
value={operator}
|
||||||
|
options={operators}
|
||||||
|
onChange={onChange}
|
||||||
|
placeholder={t('action')}
|
||||||
|
/>
|
||||||
|
{operator && (
|
||||||
|
<ValueDynamicComponent
|
||||||
|
fieldValue={fieldValue}
|
||||||
|
schema={schemas.get(operator)}
|
||||||
|
setValue={setValue}
|
||||||
|
collectionName={collectionName}
|
||||||
|
inputModes={['constant']}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
{!props.disabled && (
|
||||||
|
<a role="button" aria-label="icon-close">
|
||||||
|
<CloseCircleOutlined onClick={remove} style={closeStyle} />
|
||||||
|
</a>
|
||||||
|
)}
|
||||||
|
</Space>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
{ displayName: 'FormStyleLinkageRuleAction' },
|
||||||
|
);
|
@ -208,96 +208,3 @@ export const FormButtonLinkageRuleAction = observer(
|
|||||||
},
|
},
|
||||||
{ displayName: 'FormButtonLinkageRuleAction' },
|
{ displayName: 'FormButtonLinkageRuleAction' },
|
||||||
);
|
);
|
||||||
|
|
||||||
const colorSchema = {
|
|
||||||
type: 'string',
|
|
||||||
'x-decorator': 'FormItem',
|
|
||||||
'x-component': 'ColorPicker',
|
|
||||||
'x-component-props': {
|
|
||||||
defaultValue: '',
|
|
||||||
},
|
|
||||||
};
|
|
||||||
const textAlignSchema = {
|
|
||||||
type: 'string',
|
|
||||||
'x-decorator': 'FormItem',
|
|
||||||
'x-component': 'Select',
|
|
||||||
'x-component-props': {
|
|
||||||
defaultValue: '',
|
|
||||||
},
|
|
||||||
enum: [
|
|
||||||
{
|
|
||||||
label: 'left',
|
|
||||||
value: 'left',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'right',
|
|
||||||
value: 'right',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'center',
|
|
||||||
value: 'center',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
const schemas = new Map();
|
|
||||||
schemas.set(ActionType.Color, colorSchema);
|
|
||||||
schemas.set(ActionType.BackgroundColor, colorSchema);
|
|
||||||
schemas.set(ActionType.TextAlign, textAlignSchema);
|
|
||||||
|
|
||||||
export const FormStyleLinkageRuleAction = observer(
|
|
||||||
(props: any) => {
|
|
||||||
const { options, collectionName } = props;
|
|
||||||
const { t } = useTranslation();
|
|
||||||
const compile = useCompile();
|
|
||||||
const remove = useContext(RemoveActionContext);
|
|
||||||
const { operator, setOperator, value: fieldValue, setValue } = useValues(options);
|
|
||||||
const operators = useMemo(
|
|
||||||
() =>
|
|
||||||
compile([
|
|
||||||
{ label: t('Color'), value: ActionType.Color, schema: {} },
|
|
||||||
{ label: t('Background Color'), value: ActionType.BackgroundColor, schema: {} },
|
|
||||||
{ label: t('Text Align'), value: ActionType.TextAlign, schema: {} },
|
|
||||||
]),
|
|
||||||
[compile, t],
|
|
||||||
);
|
|
||||||
|
|
||||||
const onChange = useCallback(
|
|
||||||
(value) => {
|
|
||||||
setOperator(value);
|
|
||||||
},
|
|
||||||
[setOperator],
|
|
||||||
);
|
|
||||||
|
|
||||||
const closeStyle = useMemo(() => ({ color: '#bfbfbf' }), []);
|
|
||||||
return (
|
|
||||||
<div style={{ marginBottom: 8 }}>
|
|
||||||
<Space>
|
|
||||||
<Select
|
|
||||||
data-testid="select-linkage-properties"
|
|
||||||
popupMatchSelectWidth={false}
|
|
||||||
value={operator}
|
|
||||||
options={operators}
|
|
||||||
onChange={onChange}
|
|
||||||
placeholder={t('action')}
|
|
||||||
/>
|
|
||||||
{[ActionType.Color, ActionType.BackgroundColor, ActionType.TextAlign].includes(operator) && (
|
|
||||||
<ValueDynamicComponent
|
|
||||||
fieldValue={fieldValue}
|
|
||||||
schema={schemas.get(operator)}
|
|
||||||
setValue={setValue}
|
|
||||||
collectionName={collectionName}
|
|
||||||
inputModes={['constant']}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
{!props.disabled && (
|
|
||||||
<a role="button" aria-label="icon-close">
|
|
||||||
<CloseCircleOutlined onClick={remove} style={closeStyle} />
|
|
||||||
</a>
|
|
||||||
)}
|
|
||||||
</Space>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
},
|
|
||||||
{ displayName: 'FormStyleLinkageRuleAction' },
|
|
||||||
);
|
|
||||||
|
@ -14,11 +14,8 @@ import React, { useCallback, useMemo } from 'react';
|
|||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { withDynamicSchemaProps } from '../../hoc/withDynamicSchemaProps';
|
import { withDynamicSchemaProps } from '../../hoc/withDynamicSchemaProps';
|
||||||
import { useProps } from '../../schema-component/hooks/useProps';
|
import { useProps } from '../../schema-component/hooks/useProps';
|
||||||
import {
|
import { FormButtonLinkageRuleAction, FormFieldLinkageRuleAction } from './LinkageRuleAction';
|
||||||
FormButtonLinkageRuleAction,
|
import { FieldStyleLinkageRuleAction } from './FieldStyleLinkageRuleAction';
|
||||||
FormFieldLinkageRuleAction,
|
|
||||||
FormStyleLinkageRuleAction,
|
|
||||||
} from './LinkageRuleAction';
|
|
||||||
import { RemoveActionContext } from './context';
|
import { RemoveActionContext } from './context';
|
||||||
export const LinkageRuleActions = observer(
|
export const LinkageRuleActions = observer(
|
||||||
(props: any): any => {
|
(props: any): any => {
|
||||||
@ -30,7 +27,7 @@ export const LinkageRuleActions = observer(
|
|||||||
} = {
|
} = {
|
||||||
button: FormButtonLinkageRuleAction,
|
button: FormButtonLinkageRuleAction,
|
||||||
field: FormFieldLinkageRuleAction,
|
field: FormFieldLinkageRuleAction,
|
||||||
style: FormStyleLinkageRuleAction,
|
style: FieldStyleLinkageRuleAction,
|
||||||
};
|
};
|
||||||
return field?.value?.map((item, index) => {
|
return field?.value?.map((item, index) => {
|
||||||
return (
|
return (
|
||||||
|
@ -18,7 +18,14 @@ const getActionValue = (operator, value) => {
|
|||||||
} else return null;
|
} else return null;
|
||||||
};
|
};
|
||||||
switch (true) {
|
switch (true) {
|
||||||
case [ActionType.Color, ActionType.BackgroundColor, ActionType.TextAlign].includes(operator):
|
case [
|
||||||
|
ActionType.Color,
|
||||||
|
ActionType.BackgroundColor,
|
||||||
|
ActionType.TextAlign,
|
||||||
|
ActionType.FontSize,
|
||||||
|
ActionType.FontWeight,
|
||||||
|
ActionType.FontStyle,
|
||||||
|
].includes(operator):
|
||||||
return getValueByMode(value);
|
return getValueByMode(value);
|
||||||
default:
|
default:
|
||||||
return null;
|
return null;
|
||||||
|
@ -24,6 +24,9 @@ export enum ActionType {
|
|||||||
TextAlign = 'textAlign',
|
TextAlign = 'textAlign',
|
||||||
Options = 'options',
|
Options = 'options',
|
||||||
DateScope = 'dateScope',
|
DateScope = 'dateScope',
|
||||||
|
FontSize = 'fontSize',
|
||||||
|
FontWeight = 'fontWeight',
|
||||||
|
FontStyle = 'fontStyle',
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum LinkageRuleCategory {
|
export enum LinkageRuleCategory {
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
"Data": "Dati",
|
"Data": "Dati",
|
||||||
"Task": "Attività",
|
"Task": "Attività",
|
||||||
"Status": "Stato",
|
"Status": "Stato",
|
||||||
"Actions": "Operazioni",
|
"Actions": "Azioni",
|
||||||
"Created at": "Creato alle",
|
"Created at": "Creato alle",
|
||||||
"Type": "Tipo",
|
"Type": "Tipo",
|
||||||
"Waiting": "In attesa",
|
"Waiting": "In attesa",
|
||||||
|
@ -40,5 +40,11 @@
|
|||||||
"custom.description": "Dati di raccolta personalizzati",
|
"custom.description": "Dati di raccolta personalizzati",
|
||||||
"skipped.description": "Dati ignorati",
|
"skipped.description": "Dati ignorati",
|
||||||
"unknown.description": "Dati senza regole di dump configurate",
|
"unknown.description": "Dati senza regole di dump configurate",
|
||||||
"third-party.description": "Informazioni sul servizio di terze parti"
|
"third-party.description": "Informazioni sul servizio di terze parti",
|
||||||
|
"Select Import data": "Seleziona dati da importare",
|
||||||
|
"Select Import Plugins": "Seleziona plugin di importazione",
|
||||||
|
"Select User Collections": "Seleziona raccolte utente",
|
||||||
|
"Basic Data": "Dati di base",
|
||||||
|
"Optional Data": "Dati opzionali",
|
||||||
|
"User Data": "Dati utente"
|
||||||
}
|
}
|
||||||
|
@ -6,14 +6,27 @@
|
|||||||
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
||||||
* For more information, please refer to: https://www.nocobase.com/agreement.
|
* For more information, please refer to: https://www.nocobase.com/agreement.
|
||||||
*/
|
*/
|
||||||
|
import { useApp } from '@nocobase/client';
|
||||||
|
import MobileManager from '@nocobase/plugin-mobile/client';
|
||||||
import { Html5Qrcode, Html5QrcodeScannerState } from 'html5-qrcode';
|
import { Html5Qrcode, Html5QrcodeScannerState } from 'html5-qrcode';
|
||||||
import { useState, useCallback, useMemo, useEffect } from 'react';
|
import { useCallback, useEffect, useMemo, useState } from 'react';
|
||||||
import { useNavigate } from 'react-router-dom';
|
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
import { useNavigate } from 'react-router-dom';
|
||||||
|
|
||||||
|
function removeStringIfStartsWith(text: string, prefix: string): string {
|
||||||
|
if (text.startsWith(prefix)) {
|
||||||
|
return text.slice(prefix.length);
|
||||||
|
}
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
export function useScanner({ onScannerSizeChanged, elementId }) {
|
export function useScanner({ onScannerSizeChanged, elementId }) {
|
||||||
|
const app = useApp();
|
||||||
|
const mobileManager = app.pm.get(MobileManager);
|
||||||
|
const basename = mobileManager.mobileRouter.basename.replace(/\/+$/, '');
|
||||||
|
|
||||||
const [scanner, setScanner] = useState<Html5Qrcode>();
|
const [scanner, setScanner] = useState<Html5Qrcode>();
|
||||||
|
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const { t } = useTranslation('block-workbench');
|
const { t } = useTranslation('block-workbench');
|
||||||
const viewPoint = useMemo(() => {
|
const viewPoint = useMemo(() => {
|
||||||
@ -37,12 +50,12 @@ export function useScanner({ onScannerSizeChanged, elementId }) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
(text) => {
|
(text) => {
|
||||||
navigate(text);
|
navigate(removeStringIfStartsWith(text, basename));
|
||||||
},
|
},
|
||||||
undefined,
|
undefined,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
[navigate, onScannerSizeChanged, viewPoint],
|
[navigate, onScannerSizeChanged, viewPoint, basename],
|
||||||
);
|
);
|
||||||
const stopScanner = useCallback(async (scanner: Html5Qrcode) => {
|
const stopScanner = useCallback(async (scanner: Html5Qrcode) => {
|
||||||
const state = scanner.getState();
|
const state = scanner.getState();
|
||||||
@ -56,13 +69,13 @@ export function useScanner({ onScannerSizeChanged, elementId }) {
|
|||||||
await stopScanner(scanner);
|
await stopScanner(scanner);
|
||||||
try {
|
try {
|
||||||
const { decodedText } = await scanner.scanFileV2(file, false);
|
const { decodedText } = await scanner.scanFileV2(file, false);
|
||||||
navigate(decodedText);
|
navigate(removeStringIfStartsWith(decodedText, basename));
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
alert(t('QR code recognition failed, please scan again'));
|
alert(t('QR code recognition failed, please scan again'));
|
||||||
startScanCamera(scanner);
|
startScanCamera(scanner);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[scanner, stopScanner, startScanCamera, t, navigate],
|
[stopScanner, scanner, navigate, basename, t, startScanCamera],
|
||||||
);
|
);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
@ -23,8 +23,8 @@
|
|||||||
"Calendar collection": "Raccolta calendario",
|
"Calendar collection": "Raccolta calendario",
|
||||||
"Create calendar block": "Crea blocco calendario",
|
"Create calendar block": "Crea blocco calendario",
|
||||||
"Filter": "Filtro",
|
"Filter": "Filtro",
|
||||||
"Configure actions": "Configura operazioni",
|
"Configure actions": "Configura azioni",
|
||||||
"Enable actions": "Abilita operazioni",
|
"Enable actions": "Abilita azioni",
|
||||||
"Turn pages": "Cambia pagina",
|
"Turn pages": "Cambia pagina",
|
||||||
"Select view": "Seleziona vista",
|
"Select view": "Seleziona vista",
|
||||||
"Add new": "Aggiungi nuovo",
|
"Add new": "Aggiungi nuovo",
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
"Delete": "Elimina",
|
"Delete": "Elimina",
|
||||||
"Cancel": "Annulla",
|
"Cancel": "Annulla",
|
||||||
"Submit": "Invia",
|
"Submit": "Invia",
|
||||||
"Actions": "Operazioni",
|
"Actions": "Azioni",
|
||||||
"Title": "Titolo",
|
"Title": "Titolo",
|
||||||
"Enable": "Abilita",
|
"Enable": "Abilita",
|
||||||
"Chart": "Grafico",
|
"Chart": "Grafico",
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
"Delete": "Elimina",
|
"Delete": "Elimina",
|
||||||
"Cancel": "Annulla",
|
"Cancel": "Annulla",
|
||||||
"Submit": "Invia",
|
"Submit": "Invia",
|
||||||
"Actions": "Operazioni",
|
"Actions": "Azioni",
|
||||||
"Title": "Titolo",
|
"Title": "Titolo",
|
||||||
"Enable": "Abilita",
|
"Enable": "Abilita",
|
||||||
"Chart": "Grafico",
|
"Chart": "Grafico",
|
||||||
@ -76,7 +76,7 @@
|
|||||||
"Expand": "Espandi",
|
"Expand": "Espandi",
|
||||||
"Current filter": "Filtro corrente",
|
"Current filter": "Filtro corrente",
|
||||||
"Add custom field": "Aggiungi campo personalizzato",
|
"Add custom field": "Aggiungi campo personalizzato",
|
||||||
"To filter with custom fields, use \"Current filter\" variables in the chart configuration.": "Per filtrare con campi personalizzati, utilizza le variabili \"Current filter\" nella configurazione del grafico.",
|
"To filter with custom fields, use \"Current filter\" variables in the chart configuration.": "Per filtrare con campi personalizzati, utilizza le variabili \"Filtro corrente\" nella configurazione del grafico.",
|
||||||
"Input": "Input",
|
"Input": "Input",
|
||||||
"Date range": "Intervallo date",
|
"Date range": "Intervallo date",
|
||||||
"Time range": "Intervallo tempo",
|
"Time range": "Intervallo tempo",
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
{
|
{
|
||||||
"unique violation": "{{field}} già esiste",
|
"unique violation": "{{field}} già esiste",
|
||||||
"notNull violation": "{{field}} non può essere vuoto",
|
"notNull violation": "{{field}} non può essere vuoto",
|
||||||
"Validation error": "{{field}} errore di convalida",
|
"Validation error": "{{field}} errore di convalida"
|
||||||
"notNull Violation": "{{field}} non può essere vuoto"
|
|
||||||
}
|
}
|
||||||
|
@ -4,5 +4,5 @@
|
|||||||
"Expression": "Espressione",
|
"Expression": "Espressione",
|
||||||
"Expression syntax error": "Errore sintassi espressione",
|
"Expression syntax error": "Errore sintassi espressione",
|
||||||
"Syntax references": "Riferimenti sintassi",
|
"Syntax references": "Riferimenti sintassi",
|
||||||
"Compute a value based on the other fields": "Calcola un valore in base a un altro campo"
|
"Configure and store the results of calculations between multiple field values in the same record, supporting both Math.js and Excel formula functions.": "Configura e memorizza i risultati dei calcoli tra più valori dei campi nello stesso record, supportando sia funzioni delle formule Math.js che quelli Excel."
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
{
|
{
|
||||||
"File manager": "Gestore file",
|
"File manager": "Gestore file",
|
||||||
"Attachment": "Allegato",
|
"Attachment": "Allegato",
|
||||||
"MIME type": "Tipo MIME",
|
"MIME type": "Tipo MIME",
|
||||||
"Storage display name": "Nome visualizzato archivio",
|
|
||||||
"Storage name": "Nome archivio",
|
"Storage name": "Nome archivio",
|
||||||
"Storage type": "Tipo archivio",
|
"Storage type": "Tipo archivio",
|
||||||
"Default storage": "Archivio predefinito",
|
"Default storage": "Archivio predefinito",
|
||||||
"Storage base URL": "URL base archivio",
|
|
||||||
"Destination": "Destinazione",
|
"Destination": "Destinazione",
|
||||||
"Use the built-in static file server": "Usa il server di file statici integrato",
|
"Use the built-in static file server": "Usa il server di file statici integrato",
|
||||||
"Local storage": "Archivio locale",
|
"Local storage": "Archivio locale",
|
||||||
|
@ -59,7 +59,7 @@ export async function getFileData(ctx: Context) {
|
|||||||
mimetype: file.mimetype,
|
mimetype: file.mimetype,
|
||||||
meta: ctx.request.body,
|
meta: ctx.request.body,
|
||||||
storageId: storage.id,
|
storageId: storage.id,
|
||||||
...(storageInstance.getFileData ? storageInstance.getFileData(file) : {}),
|
...StorageType?.['getFileData']?.(file),
|
||||||
};
|
};
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
import { isURL } from '@nocobase/utils';
|
import { isURL } from '@nocobase/utils';
|
||||||
import { StorageEngine } from 'multer';
|
import { StorageEngine } from 'multer';
|
||||||
import urlJoin from 'url-join';
|
import urlJoin from 'url-join';
|
||||||
import { encodeURL } from '../utils';
|
import { encodeURL, ensureUrlEncoded } from '../utils';
|
||||||
|
|
||||||
export interface StorageModel {
|
export interface StorageModel {
|
||||||
id?: number;
|
id?: number;
|
||||||
@ -54,7 +54,7 @@ export abstract class StorageType {
|
|||||||
const keys = [
|
const keys = [
|
||||||
this.storage.baseUrl,
|
this.storage.baseUrl,
|
||||||
file.path && encodeURI(file.path),
|
file.path && encodeURI(file.path),
|
||||||
encodeURIComponent(file.filename),
|
ensureUrlEncoded(file.filename),
|
||||||
preview && this.storage.options.thumbnailRule,
|
preview && this.storage.options.thumbnailRule,
|
||||||
].filter(Boolean);
|
].filter(Boolean);
|
||||||
return urlJoin(keys);
|
return urlJoin(keys);
|
||||||
|
@ -7,11 +7,13 @@
|
|||||||
* For more information, please refer to: https://www.nocobase.com/agreement.
|
* For more information, please refer to: https://www.nocobase.com/agreement.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import { isURL } from '@nocobase/utils';
|
||||||
|
import path from 'path';
|
||||||
|
import urlJoin from 'url-join';
|
||||||
import { promisify } from 'util';
|
import { promisify } from 'util';
|
||||||
|
|
||||||
import { AttachmentModel, StorageType } from '.';
|
import { AttachmentModel, StorageType } from '.';
|
||||||
import { STORAGE_TYPE_TX_COS } from '../../constants';
|
import { STORAGE_TYPE_TX_COS } from '../../constants';
|
||||||
import { getFilename, getFileKey } from '../utils';
|
import { getFileKey, getFilename } from '../utils';
|
||||||
|
|
||||||
export default class extends StorageType {
|
export default class extends StorageType {
|
||||||
static defaults() {
|
static defaults() {
|
||||||
|
@ -30,7 +30,7 @@ export function getFileKey(record) {
|
|||||||
return [record.path.replace(/^\/|\/$/g, ''), record.filename].filter(Boolean).join('/');
|
return [record.path.replace(/^\/|\/$/g, ''), record.filename].filter(Boolean).join('/');
|
||||||
}
|
}
|
||||||
|
|
||||||
function ensureUrlEncoded(value) {
|
export function ensureUrlEncoded(value) {
|
||||||
try {
|
try {
|
||||||
// 如果解码后与原字符串不同,说明已经被转义过
|
// 如果解码后与原字符串不同,说明已经被转义过
|
||||||
if (decodeURIComponent(value) !== value) {
|
if (decodeURIComponent(value) !== value) {
|
||||||
|
@ -7,8 +7,8 @@
|
|||||||
"description.zh-CN": "地图区块,支持高德地图和 Google 地图,你也可以扩展更多地图类型。",
|
"description.zh-CN": "地图区块,支持高德地图和 Google 地图,你也可以扩展更多地图类型。",
|
||||||
"license": "AGPL-3.0",
|
"license": "AGPL-3.0",
|
||||||
"main": "./dist/server/index.js",
|
"main": "./dist/server/index.js",
|
||||||
"homepage": "https://docs.nocobase.com/handbook/map",
|
"homepage": "https://docs.nocobase.com/handbook/block-map",
|
||||||
"homepage.zh-CN": "https://docs-cn.nocobase.com/handbook/map",
|
"homepage.zh-CN": "https://docs-cn.nocobase.com/handbook/block-map",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@amap/amap-jsapi-loader": "^1.0.1",
|
"@amap/amap-jsapi-loader": "^1.0.1",
|
||||||
"@amap/amap-jsapi-types": "^0.0.10",
|
"@amap/amap-jsapi-types": "^0.0.10",
|
||||||
|
@ -32,7 +32,8 @@ const BaseConfiguration: React.FC<BaseConfigurationProps> = ({ type, children })
|
|||||||
return apiClient.resource(MapConfigurationResourceKey);
|
return apiClient.resource(MapConfigurationResourceKey);
|
||||||
}, [apiClient]);
|
}, [apiClient]);
|
||||||
|
|
||||||
const onSubmit = (values) => {
|
const onSubmit = async (values) => {
|
||||||
|
await form.validateFields();
|
||||||
resource
|
resource
|
||||||
.set({
|
.set({
|
||||||
...values,
|
...values,
|
||||||
@ -62,10 +63,18 @@ const AMapConfiguration = () => {
|
|||||||
const { t } = useMapTranslation();
|
const { t } = useMapTranslation();
|
||||||
return (
|
return (
|
||||||
<BaseConfiguration type="amap">
|
<BaseConfiguration type="amap">
|
||||||
<Form.Item required name="accessKey" label={t('Access key')}>
|
<Form.Item
|
||||||
|
rules={[{ required: true, message: t('Access key is required') }]}
|
||||||
|
name="accessKey"
|
||||||
|
label={t('Access key')}
|
||||||
|
>
|
||||||
<TextAreaWithGlobalScope />
|
<TextAreaWithGlobalScope />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item required name="securityJsCode" label={t('securityJsCode or serviceHost')}>
|
<Form.Item
|
||||||
|
rules={[{ required: true, message: t('securityJsCode or serviceHost is required') }]}
|
||||||
|
name="securityJsCode"
|
||||||
|
label={t('securityJsCode or serviceHost')}
|
||||||
|
>
|
||||||
<TextAreaWithGlobalScope />
|
<TextAreaWithGlobalScope />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
</BaseConfiguration>
|
</BaseConfiguration>
|
||||||
@ -76,7 +85,7 @@ const GoogleMapConfiguration = () => {
|
|||||||
const { t } = useMapTranslation();
|
const { t } = useMapTranslation();
|
||||||
return (
|
return (
|
||||||
<BaseConfiguration type="google">
|
<BaseConfiguration type="google">
|
||||||
<Form.Item required name="accessKey" label={t('Api key')}>
|
<Form.Item rules={[{ required: true, message: t('Api key is required') }]} name="accessKey" label={t('Api key')}>
|
||||||
<TextAreaWithGlobalScope />
|
<TextAreaWithGlobalScope />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
</BaseConfiguration>
|
</BaseConfiguration>
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
"Enter keywords to search": "Inserisci parole chiave per la ricerca",
|
"Enter keywords to search": "Inserisci parole chiave per la ricerca",
|
||||||
"The AccessKey is incorrect, please check it": "La chiave di accesso non è corretta, controllala",
|
"The AccessKey is incorrect, please check it": "La chiave di accesso non è corretta, controllala",
|
||||||
"Please configure the AMap securityCode or serviceHost correctly": "Configura correttamente AMap securityCode o serviceHost",
|
"Please configure the AMap securityCode or serviceHost correctly": "Configura correttamente AMap securityCode o serviceHost",
|
||||||
"Map Manager": "Gestore Mappe",
|
"Map manager": "Gestore Mappe",
|
||||||
"Configuration": "Configurazione",
|
"Configuration": "Configurazione",
|
||||||
"Saved successfully": "Salvataggio riuscito",
|
"Saved successfully": "Salvataggio riuscito",
|
||||||
"Saved failed": "Salvataggio fallito",
|
"Saved failed": "Salvataggio fallito",
|
||||||
|
@ -47,5 +47,8 @@
|
|||||||
"Create map block": "创建地图区块",
|
"Create map block": "创建地图区块",
|
||||||
"Start point": "起点",
|
"Start point": "起点",
|
||||||
"End point": "终点",
|
"End point": "终点",
|
||||||
"Concatenation order field": "连接顺序字段"
|
"Concatenation order field": "连接顺序字段",
|
||||||
|
"securityJsCode or serviceHost is required": "securityJsCode 或 serviceHost 是必填",
|
||||||
|
"Access key is required": "访问密钥是必填",
|
||||||
|
"Api key is required": "Api key 是必填"
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,8 @@ import React from 'react';
|
|||||||
|
|
||||||
const { apiClient, mockRequest } = mockAPIClient();
|
const { apiClient, mockRequest } = mockAPIClient();
|
||||||
|
|
||||||
|
apiClient.auth.setToken('test');
|
||||||
|
|
||||||
mockRequest.onGet('/roles:check').reply(() => {
|
mockRequest.onGet('/roles:check').reply(() => {
|
||||||
return [
|
return [
|
||||||
200,
|
200,
|
||||||
|
@ -42,7 +42,7 @@ export const ChannelConfigForm = () => {
|
|||||||
type: 'void',
|
type: 'void',
|
||||||
'x-component': 'Grid.Col',
|
'x-component': 'Grid.Col',
|
||||||
'x-component-props': {
|
'x-component-props': {
|
||||||
width: 50,
|
width: 45,
|
||||||
},
|
},
|
||||||
properties: {
|
properties: {
|
||||||
host: {
|
host: {
|
||||||
@ -62,7 +62,7 @@ export const ChannelConfigForm = () => {
|
|||||||
type: 'void',
|
type: 'void',
|
||||||
'x-component': 'Grid.Col',
|
'x-component': 'Grid.Col',
|
||||||
'x-component-props': {
|
'x-component-props': {
|
||||||
width: 25,
|
width: 20,
|
||||||
},
|
},
|
||||||
properties: {
|
properties: {
|
||||||
port: {
|
port: {
|
||||||
@ -92,7 +92,7 @@ export const ChannelConfigForm = () => {
|
|||||||
type: 'void',
|
type: 'void',
|
||||||
'x-component': 'Grid.Col',
|
'x-component': 'Grid.Col',
|
||||||
'x-component-props': {
|
'x-component-props': {
|
||||||
width: 25,
|
width: 35,
|
||||||
},
|
},
|
||||||
properties: {
|
properties: {
|
||||||
secure: {
|
secure: {
|
||||||
@ -100,6 +100,8 @@ export const ChannelConfigForm = () => {
|
|||||||
title: '{{t("Secure")}}',
|
title: '{{t("Secure")}}',
|
||||||
'x-decorator': 'FormItem',
|
'x-decorator': 'FormItem',
|
||||||
'x-component': 'TextAreaWithGlobalScope',
|
'x-component': 'TextAreaWithGlobalScope',
|
||||||
|
description:
|
||||||
|
'{{t("In most cases, if using port 465, set it to true; otherwise, set it to false.")}}',
|
||||||
'x-component-props': {
|
'x-component-props': {
|
||||||
boolean: true,
|
boolean: true,
|
||||||
useTypedConstant: [['boolean', { style: { width: '100%' } }]],
|
useTypedConstant: [['boolean', { style: { width: '100%' } }]],
|
||||||
|
@ -18,5 +18,6 @@
|
|||||||
"SMTP server host": "SMTP 服务器主机",
|
"SMTP server host": "SMTP 服务器主机",
|
||||||
"Content type": "内容格式",
|
"Content type": "内容格式",
|
||||||
"Plain text": "纯文本",
|
"Plain text": "纯文本",
|
||||||
"Transport": "传输方式"
|
"Transport": "传输方式",
|
||||||
|
"In most cases, if using port 465, set it to true; otherwise, set it to false.": "通常情况下,如果使用端口 465 ,请设置为 true ;否则,请设置为 false 。"
|
||||||
}
|
}
|
||||||
|
@ -7,28 +7,36 @@
|
|||||||
* For more information, please refer to: https://www.nocobase.com/agreement.
|
* For more information, please refer to: https://www.nocobase.com/agreement.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React, { useState, useCallback } from 'react';
|
|
||||||
import { observer } from '@formily/reactive-react';
|
|
||||||
import { Schema } from '@formily/react';
|
import { Schema } from '@formily/react';
|
||||||
import { Card, Descriptions, Button, Spin, Tag, ConfigProvider, Typography, Tooltip, theme } from 'antd';
|
import { observer } from '@formily/reactive-react';
|
||||||
import { dayjs } from '@nocobase/utils/client';
|
import { dayjs } from '@nocobase/utils/client';
|
||||||
|
import { Button, Card, ConfigProvider, Descriptions, Spin, Tag, Tooltip, Typography, theme } from 'antd';
|
||||||
|
import React, { useCallback, useState } from 'react';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
import { useLocalTranslation } from '../../locale';
|
import { useLocalTranslation } from '../../locale';
|
||||||
|
|
||||||
|
import { useApp } from '@nocobase/client';
|
||||||
import {
|
import {
|
||||||
selectedChannelNameObs,
|
|
||||||
channelMapObs,
|
channelMapObs,
|
||||||
fetchMessages,
|
fetchMessages,
|
||||||
|
inboxVisible,
|
||||||
isFecthingMessageObs,
|
isFecthingMessageObs,
|
||||||
|
selectedChannelNameObs,
|
||||||
selectedMessageListObs,
|
selectedMessageListObs,
|
||||||
showMsgLoadingMoreObs,
|
showMsgLoadingMoreObs,
|
||||||
updateMessage,
|
updateMessage,
|
||||||
inboxVisible,
|
|
||||||
} from '../observables';
|
} from '../observables';
|
||||||
import { useApp } from '@nocobase/client';
|
|
||||||
|
function removeStringIfStartsWith(text: string, prefix: string): string {
|
||||||
|
if (text.startsWith(prefix)) {
|
||||||
|
return text.slice(prefix.length);
|
||||||
|
}
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
const MessageList = observer(() => {
|
const MessageList = observer(() => {
|
||||||
const app = useApp();
|
const app = useApp();
|
||||||
|
const basename = app.router.basename.replace(/\/+$/, '');
|
||||||
const { t } = useLocalTranslation();
|
const { t } = useLocalTranslation();
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const { token } = theme.useToken();
|
const { token } = theme.useToken();
|
||||||
@ -51,7 +59,7 @@ const MessageList = observer(() => {
|
|||||||
if (message.options?.url) {
|
if (message.options?.url) {
|
||||||
inboxVisible.value = false;
|
inboxVisible.value = false;
|
||||||
const url = message.options.url;
|
const url = message.options.url;
|
||||||
if (url.startsWith('/')) navigate(url);
|
if (url.startsWith('/')) navigate(removeStringIfStartsWith(url, basename));
|
||||||
else {
|
else {
|
||||||
window.location.href = url;
|
window.location.href = url;
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
"No more": "Non c'è altro",
|
"No more": "Non c'è altro",
|
||||||
"Loading failed,": "Caricamento fallito,",
|
"Loading failed,": "Caricamento fallito,",
|
||||||
"please reload": "ricarica",
|
"please reload": "ricarica",
|
||||||
"Detail": "Dettaglio",
|
"Detail": "Dettagli",
|
||||||
"Content": "Contenuto",
|
"Content": "Contenuto",
|
||||||
"Datetime": "Data e ora",
|
"Datetime": "Data e ora",
|
||||||
"Status": "Stato",
|
"Status": "Stato",
|
||||||
@ -14,11 +14,11 @@
|
|||||||
"Read": "Letto",
|
"Read": "Letto",
|
||||||
"Unread": "Non letto",
|
"Unread": "Non letto",
|
||||||
"In-app message": "Messaggio in-app",
|
"In-app message": "Messaggio in-app",
|
||||||
"Receivers": "Destinatari",
|
"Receivers": "Destinatari",
|
||||||
"Channel name": "Nome canale",
|
|
||||||
"Message group name": "Nome gruppo messaggi",
|
"Message group name": "Nome gruppo messaggi",
|
||||||
"Message title": "Titolo messaggio",
|
"Message title": "Titolo messaggio",
|
||||||
"Message content": "Contenuto messaggio",
|
"Message content": "Contenuto messaggio",
|
||||||
|
"detail URL": "dettagli URL",
|
||||||
"Details page for desktop": "Pagina dettagli per desktop",
|
"Details page for desktop": "Pagina dettagli per desktop",
|
||||||
"Support two types of links: internal links and external links. If using an internal link, the link starts with\"/\", for example, \"/admin\". If using an external link, the link starts with \"http\", for example, \"https://example.com\".": "Supporta due tipi di link: link interni e link esterni. Se si utilizza un link interno, il link inizia con \"/\", ad esempio, \"/admin\". Se si utilizza un link esterno, il link inizia con \"http\", ad esempio, \"https://example.com\".",
|
"Support two types of links: internal links and external links. If using an internal link, the link starts with\"/\", for example, \"/admin\". If using an external link, the link starts with \"http\", for example, \"https://example.com\".": "Supporta due tipi di link: link interni e link esterni. Se si utilizza un link interno, il link inizia con \"/\", ad esempio, \"/admin\". Se si utilizza un link esterno, il link inizia con \"http\", ad esempio, \"https://example.com\".",
|
||||||
"Mark as read": "Segna come letto",
|
"Mark as read": "Segna come letto",
|
||||||
|
@ -18,9 +18,9 @@
|
|||||||
"Channel display name": "Nome visualizzato canale",
|
"Channel display name": "Nome visualizzato canale",
|
||||||
"Configure": "Configura",
|
"Configure": "Configura",
|
||||||
"Add new": "Aggiungi nuovo",
|
"Add new": "Aggiungi nuovo",
|
||||||
"Trigger From": "Attivato da",
|
"Trigger from": "Attivato da",
|
||||||
"Status": "Stato",
|
"Status": "Stato",
|
||||||
"Created At": "Creato il",
|
"Created at": "Creato il",
|
||||||
"Delete record": "Elimina record",
|
"Delete record": "Elimina record",
|
||||||
"Are you sure you want to delete it?": "Sei sicuro di volerlo eliminare?",
|
"Are you sure you want to delete it?": "Sei sicuro di volerlo eliminare?",
|
||||||
"Deleted successfully!": "Eliminato con successo!",
|
"Deleted successfully!": "Eliminato con successo!",
|
||||||
@ -32,7 +32,7 @@
|
|||||||
"Select user": "Seleziona utente",
|
"Select user": "Seleziona utente",
|
||||||
"No channel enabled yet": "Nessun canale ancora abilitato",
|
"No channel enabled yet": "Nessun canale ancora abilitato",
|
||||||
"Success": "Successo",
|
"Success": "Successo",
|
||||||
"Fail": "Fallito",
|
"Failure": "Fallimento",
|
||||||
"Reason": "Motivo",
|
"Reason": "Motivo",
|
||||||
"Failed reason": "Motivo fallimento",
|
"Failed reason": "Motivo fallimento",
|
||||||
"Log detail": "Dettaglio registro",
|
"Log detail": "Dettaglio registro",
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
"Detail": "Dettaglio",
|
"Detail": "Dettaglio",
|
||||||
"Snapshot": "Snapshot",
|
"Snapshot": "Snapshot",
|
||||||
"Add block": "Aggiungi blocco",
|
"Add block": "Aggiungi blocco",
|
||||||
"When adding a new record, create a snapshot for its relational record and save in the current record. The snapshot is not updated when the record is subsequently updated.": "Quando si aggiunge un nuovo record, crea uno snapshot del suo record relazionale e salvalo nel record corrente. Lo snapshot non viene aggiornato quando il record viene successivamente aggiornato.",
|
"When adding a new record, create a snapshot for its relational record and save in the new record. The snapshot will not be updated when the relational record is updated.": "Quando si aggiunge un nuovo record, crea uno snapshot del suo record relazionale e salvalo nel nuovo record. Quando il record relazionale viene aggiornato lo snapshot non verrà aggiornato .",
|
||||||
"View record": "Visualizza record",
|
"View record": "Visualizza record",
|
||||||
"Allow linking to multiple records": "Consenti collegamento a più record",
|
"Allow linking to multiple records": "Consenti collegamento a più record",
|
||||||
"The association field to snapshot": "Campo di associazione per lo snapshot",
|
"The association field to snapshot": "Campo di associazione per lo snapshot",
|
||||||
|
@ -1,9 +1,17 @@
|
|||||||
{
|
{
|
||||||
"Form event": "Evento modulo",
|
"Post-action event": "Evento post-azione",
|
||||||
"Event triggers when submitted a workflow bound form action.": "L'evento si attiva quando viene inviata un'azione di un modulo associato a un workflow.",
|
"Triggered after the completion of a request initiated through an action button or API, such as after adding or updating data. Suitable for data processing, sending notifications, etc., after actions are completed.":
|
||||||
"Form data model": "Modello dati modulo",
|
"Attivato dopo il completamento con esito positivo di una richiesta avviata tramite un pulsante di azione o un'API, ad esempio dopo l'aggiunta o l'aggiornamento di dati. Adatto per l'elaborazione dei dati, l'invio di notifiche, ecc. dopo il completamento delle azioni.",
|
||||||
"Use a collection to match form data.": "Utilizza una raccolta per abbinare i dati del modulo.",
|
"Collection": "Raccolta",
|
||||||
|
"The collection to which the triggered data belongs.": "La raccolta a cui appartengono i dati attivati.",
|
||||||
|
"Trigger mode": "Modalità di attivazione",
|
||||||
|
"Local mode, triggered after the completion of actions bound to this workflow": "Modalità locale, attivata dopo il completamento delle azioni associate a questo workflow",
|
||||||
|
"Global mode, triggered after the completion of the following actions": "Modalità globale, attivata dopo il completamento delle seguenti azioni",
|
||||||
|
"Select actions": "Seleziona azioni",
|
||||||
|
"Create record action": "Azione di creazione record",
|
||||||
|
"Update record action": "Azione di aggiornamento record",
|
||||||
"Associations to use": "Associazioni da utilizzare",
|
"Associations to use": "Associazioni da utilizzare",
|
||||||
"User submitted form": "Modulo inviato dall'utente",
|
"Trigger data": "Dati attivazione",
|
||||||
"Role of user submitted form": "Ruolo del modulo inviato dall'utente"
|
"User acted": "Utente che ha agito",
|
||||||
|
"Role of user acted": "Ruolo dell'utente che ha agito"
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
{
|
{
|
||||||
"Dynamic Calculation": "Calcolo dinamico",
|
"Expression": "Espressione",
|
||||||
|
"Dynamic expression calculation": "Calcolo dinamico",
|
||||||
"Calculate an expression based on a calculation engine and obtain a value as the result. Variables in the upstream nodes can be used in the expression. The expression is dynamic one from an expression collections.": "Calcola un'espressione basata su un motore di calcolo e ottiene un valore come risultato. Nell'espressione è possibile utilizzare variabili dai nodi upstream. L'espressione è ottenuta dinamicamente da una raccolta di espressioni.",
|
"Calculate an expression based on a calculation engine and obtain a value as the result. Variables in the upstream nodes can be used in the expression. The expression is dynamic one from an expression collections.": "Calcola un'espressione basata su un motore di calcolo e ottiene un valore come risultato. Nell'espressione è possibile utilizzare variabili dai nodi upstream. L'espressione è ottenuta dinamicamente da una raccolta di espressioni.",
|
||||||
"Select dynamic expression": "Seleziona espressione dinamica",
|
"Select dynamic expression": "Seleziona espressione dinamica",
|
||||||
"Select the dynamic expression queried from the upstream node. You need to query it from an expression collection.": "Seleziona l'espressione dinamica interrogata dal nodo upstream. È necessario interrogarla da una raccolta di espressioni.",
|
"Select the dynamic expression queried from the upstream node. You need to query it from an expression collection.": "Seleziona l'espressione dinamica interrogata dal nodo upstream. È necessario interrogarla da una raccolta di espressioni.",
|
||||||
"Variable datasource": "Origine dati variabile",
|
"Variable datasource": "Origine dati variabile",
|
||||||
"Dynamic expression": "Espressione dinamica",
|
"Dynamic expression": "Espressione dinamica",
|
||||||
"An expression for calculation in each rows": "Un'espressione per il calcolo in ogni riga",
|
"Used to store expressions for use in workflows so that different expressions can be called for different data.": "Utilizzato per memorizzare espressioni da usare nei workflow in modo che per dati diversi possano essere chiamate espressioni diverse",
|
||||||
"Unconfigured": "Non configurato",
|
"Unconfigured": "Non configurato",
|
||||||
"Calculation result": "Risultato del calcolo"
|
"Calculation result": "Risultato del calcolo"
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,22 @@
|
|||||||
{
|
{
|
||||||
"Loop": "Ciclo",
|
"Loop": "Ciclo",
|
||||||
"Loop target": "Destinazione ciclo",
|
"Loop target": "Destinazione ciclo",
|
||||||
"Loop index": "Indice ciclo",
|
"Loop index (starts from 0)": "Indice del ciclo (inizia da 0)",
|
||||||
|
"Loop sequence (starts from 1)": "Sequenza del ciclo (inizia da 1)",
|
||||||
"Loop length": "Lunghezza ciclo",
|
"Loop length": "Lunghezza ciclo",
|
||||||
"By using a loop node, you can perform the same operation on multiple sets of data. The source of these sets can be either multiple records from a query node or multiple associated records of a single record. Loop node can also be used for iterating a certain number of times or for looping through each character in a string. However, excessive looping may cause performance issues, so use with caution.": "Utilizzando un nodo ciclo, puoi eseguire la stessa operazione su più insiemi di dati. L' origine di questi insiemi può essere costituita da record multipli di un nodo query o da record multipli associati di singolo record. Il nodo ciclo può essere utilizzato anche per iterare un certo numero di volte o per scorrere ogni carattere in una stringa. Tuttavia, un numero eccessivamente elevato di cicli può causare problemi di prestazioni, quindi usalo con cautela.",
|
"By using a loop node, you can perform the same operation on multiple sets of data. The source of these sets can be either multiple records from a query node or multiple associated records of a single record. Loop node can also be used for iterating a certain number of times or for looping through each character in a string. However, excessive looping may cause performance issues, so use with caution.": "Utilizzando un nodo ciclo, puoi eseguire la stessa operazione su più insiemi di dati. L' origine di questi insiemi può essere costituita da record multipli di un nodo query o da record multipli associati di singolo record. Il nodo ciclo può essere utilizzato anche per iterare un certo numero di volte o per scorrere ogni carattere in una stringa. Tuttavia, un numero eccessivamente elevato di cicli può causare problemi di prestazioni, quindi usalo con cautela.",
|
||||||
"Scope variables": "Variabili ambito",
|
"A single number will be treated as a loop count, a single string will be treated as an array of characters, and other non-array values will be converted to arrays. The loop node ends when the loop count is reached, or when the array loop is completed. You can also add condition nodes to the loop to terminate it.": "Un singolo numero verrà trattato come conteggio del ciclo, una singola stringa verrà trattata come un array di caratteri e altri valori non-array verranno convertiti in array. Il nodo ciclo termina quando viene raggiunto il conteggio del ciclo o quando il ciclo dell'array è completato. Puoi anche aggiungere nodi condizione al ciclo per terminarlo.",
|
||||||
"A single number will be treated as a loop count, a single string will be treated as an array of characters, and other non-array values will be converted to arrays. The loop node ends when the loop count is reached, or when the array loop is completed. You can also add condition nodes to the loop to terminate it.": "Un singolo numero verrà trattato come conteggio del ciclo, una singola stringa verrà trattata come un array di caratteri e altri valori non-array verranno convertiti in array. Il nodo ciclo termina quando viene raggiunto il conteggio del ciclo o quando il ciclo dell'array è completato. Puoi anche aggiungere nodi condizione al ciclo per terminarlo."
|
"Enable loop condition": "Abilita condizione del ciclo",
|
||||||
|
"Loop condition on each item": "Condizione del ciclo su ciascun elemento",
|
||||||
|
"When to check": "Quando controllare",
|
||||||
|
"Before each starts": "Prima dell'inizio di ogni ciclo",
|
||||||
|
"After each ends": "Dopo la fine di ogni ciclo",
|
||||||
|
"When condition is not met on item": "Quando la condizione non è soddisfatta sull'elemento",
|
||||||
|
"Exit loop": "Esci dal ciclo",
|
||||||
|
"Continue on next item": "Continua con l'elemento successivo",
|
||||||
|
"Condition": "Condizione",
|
||||||
|
"When node inside loop failed": "Quando il nodo all'interno del ciclo fallisce",
|
||||||
|
"Continue loop on next item": "Continua il ciclo con l'elemento successivo",
|
||||||
|
"Exit loop and continue workflow": "Esci dal ciclo e continua il workflow",
|
||||||
|
"Exit workflow": "Esci dal workflow"
|
||||||
}
|
}
|
||||||
|
@ -7,9 +7,9 @@
|
|||||||
* For more information, please refer to: https://www.nocobase.com/agreement.
|
* For more information, please refer to: https://www.nocobase.com/agreement.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React from 'react';
|
|
||||||
import { MailOutlined } from '@ant-design/icons';
|
import { MailOutlined } from '@ant-design/icons';
|
||||||
import { ArrayItems } from '@formily/antd-v5';
|
import { ArrayItems } from '@formily/antd-v5';
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
import { SchemaComponentContext, css } from '@nocobase/client';
|
import { SchemaComponentContext, css } from '@nocobase/client';
|
||||||
import {
|
import {
|
||||||
@ -112,6 +112,7 @@ export default class extends Instruction {
|
|||||||
secure: {
|
secure: {
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
title: `{{t("Secure", { ns: "${NAMESPACE}" })}}`,
|
title: `{{t("Secure", { ns: "${NAMESPACE}" })}}`,
|
||||||
|
description: `{{t("In most cases, if using port 465, set it to true; otherwise, set it to false.", { ns: "${NAMESPACE}" })}}`,
|
||||||
'x-decorator': 'FormItem',
|
'x-decorator': 'FormItem',
|
||||||
'x-component': 'WorkflowVariableInput',
|
'x-component': 'WorkflowVariableInput',
|
||||||
'x-component-props': {
|
'x-component-props': {
|
||||||
|
@ -15,5 +15,6 @@
|
|||||||
"Content": "Content",
|
"Content": "Content",
|
||||||
"Content type": "Content type",
|
"Content type": "Content type",
|
||||||
"Plain text": "Plain text",
|
"Plain text": "Plain text",
|
||||||
"Ignore failed sending and continue workflow": "Ignore failed sending and continue workflow"
|
"Ignore failed sending and continue workflow": "Ignore failed sending and continue workflow",
|
||||||
|
"In most cases, if using port 465, set it to true; otherwise, set it to false.": "In most cases, if using port 465, set it to true; otherwise, set it to false."
|
||||||
}
|
}
|
||||||
|
@ -15,5 +15,6 @@
|
|||||||
"Content": "内容",
|
"Content": "内容",
|
||||||
"Content type": "内容格式",
|
"Content type": "内容格式",
|
||||||
"Plain text": "纯文本",
|
"Plain text": "纯文本",
|
||||||
"Ignore failed sending and continue workflow": "忽略失败的发送并继续工作流"
|
"Ignore failed sending and continue workflow": "忽略失败的发送并继续工作流",
|
||||||
|
"In most cases, if using port 465, set it to true; otherwise, set it to false.": "通常情况下,如果使用端口 465 ,请设置为 true ;否则,请设置为 false 。"
|
||||||
}
|
}
|
||||||
|
@ -174,10 +174,7 @@ test.describe('field data', () => {
|
|||||||
await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
|
await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
|
||||||
await page.mouse.move(300, 0, { steps: 100 });
|
await page.mouse.move(300, 0, { steps: 100 });
|
||||||
await page.waitForTimeout(300);
|
await page.waitForTimeout(300);
|
||||||
await page
|
await page.locator('.itemCss', { hasText: preManualNodeTitle }).getByLabel('action-Action.Link-View-view-').click();
|
||||||
.locator('.itemCss', { hasText: preManualNodeTitle })
|
|
||||||
.getByLabel('action-Action.Link-View-view-')
|
|
||||||
.click();
|
|
||||||
const preManualNodeRecord = triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
const preManualNodeRecord = triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
||||||
await page.getByRole('textbox').fill(preManualNodeRecord);
|
await page.getByRole('textbox').fill(preManualNodeRecord);
|
||||||
await page.getByRole('button', { name: 'Continue the process' }).click();
|
await page.getByRole('button', { name: 'Continue the process' }).click();
|
||||||
@ -334,10 +331,7 @@ test.describe('field data', () => {
|
|||||||
await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
|
await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
|
||||||
await page.mouse.move(300, 0, { steps: 100 });
|
await page.mouse.move(300, 0, { steps: 100 });
|
||||||
await page.waitForTimeout(300);
|
await page.waitForTimeout(300);
|
||||||
await page
|
await page.locator('.itemCss', { hasText: preManualNodeTitle }).getByLabel('action-Action.Link-View-view-').click();
|
||||||
.locator('.itemCss', { hasText: preManualNodeTitle })
|
|
||||||
.getByLabel('action-Action.Link-View-view-')
|
|
||||||
.click();
|
|
||||||
const preManualNodeRecord = triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
const preManualNodeRecord = triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
||||||
await page.getByRole('textbox').fill(preManualNodeRecord);
|
await page.getByRole('textbox').fill(preManualNodeRecord);
|
||||||
await page.getByRole('button', { name: 'Continue the process' }).click();
|
await page.getByRole('button', { name: 'Continue the process' }).click();
|
||||||
@ -542,10 +536,7 @@ test.describe('field data', () => {
|
|||||||
await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
|
await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
|
||||||
await page.mouse.move(300, 0, { steps: 100 });
|
await page.mouse.move(300, 0, { steps: 100 });
|
||||||
await page.waitForTimeout(300);
|
await page.waitForTimeout(300);
|
||||||
await page
|
await page.locator('.itemCss', { hasText: preManualNodeTitle }).getByLabel('action-Action.Link-View-view-').click();
|
||||||
.locator('.itemCss', { hasText: preManualNodeTitle })
|
|
||||||
.getByLabel('action-Action.Link-View-view-')
|
|
||||||
.click();
|
|
||||||
const preManualNodeRecord = triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
const preManualNodeRecord = triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
||||||
await page.getByRole('textbox').fill(preManualNodeRecord);
|
await page.getByRole('textbox').fill(preManualNodeRecord);
|
||||||
await page.getByRole('button', { name: 'Continue the process' }).click();
|
await page.getByRole('button', { name: 'Continue the process' }).click();
|
||||||
|
@ -7,10 +7,10 @@
|
|||||||
"User interface": "Interfaccia utente",
|
"User interface": "Interfaccia utente",
|
||||||
"Configure user interface": "Configura interfaccia utente",
|
"Configure user interface": "Configura interfaccia utente",
|
||||||
"View user interface": "Visualizza interfaccia utente",
|
"View user interface": "Visualizza interfaccia utente",
|
||||||
"Separately": "Separato",
|
"Separately": "Separato",
|
||||||
"Each user has own task": "Ogni utente ha il proprio compito",
|
"Each user has own task": "Ogni utente ha la propria attività",
|
||||||
"Collaboratively": "Collaborativo",
|
"Collaboratively": "Collaborativo",
|
||||||
"Everyone shares one task": "Tutti condividono un compito",
|
"Everyone shares one task": "Tutti condividono un attività",
|
||||||
"Negotiation": "Negoziazione",
|
"Negotiation": "Negoziazione",
|
||||||
"All pass": "Tutti passano",
|
"All pass": "Tutti passano",
|
||||||
"Everyone should pass": "Tutti dovrebbero passare",
|
"Everyone should pass": "Tutti dovrebbero passare",
|
||||||
@ -25,6 +25,11 @@
|
|||||||
"Create record form": "Modulo creazione record",
|
"Create record form": "Modulo creazione record",
|
||||||
"Update record form": "Modulo aggiornamento record",
|
"Update record form": "Modulo aggiornamento record",
|
||||||
"Filter settings": "Impostazioni filtro",
|
"Filter settings": "Impostazioni filtro",
|
||||||
"Workflow todos": "'Da fare' del workflow",
|
"Workflow todos": "Da fare",
|
||||||
"Task": "Compito"
|
"Task node": "Nodo attività",
|
||||||
|
"Unprocessed": "Non elaborato",
|
||||||
|
"Please check one of your update record form, and add at least one filter condition in form settings.": "Verifica uno dei tuoi moduli di aggiornamento record e aggiungi almeno una condizione nel filtro nelle impostazioni del modulo.",
|
||||||
|
"My manual tasks": "Le mie attività manuali",
|
||||||
|
"Task title": "Titolo attività",
|
||||||
|
"Title of each task item. Default to node title.": "Titolo di ogni elemento attività. Predefinito: titolo del nodo."
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
{
|
{
|
||||||
"Send email. You can use the variables in the upstream nodes as receivers, subject and content of the email.": "Invia email chiamando il servizio SMTP. Puoi usare le variabili nei nodi upstream come destinatari, oggetto e contenuto dell'email.",
|
"Notification": "Notifiche",
|
||||||
"Ignore failed sending and continue workflow": "Ignora l'invio fallito e continua il workflow"
|
"Send notification. You can use the variables in the upstream nodes as content and ohter config.": "Invia notifica. Puoi usare le variabili nei nodi upstream come contenuto e altre configurazioni"
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
"Parallel branch": "Ramo parallelo",
|
"Parallel branch": "Ramo parallelo",
|
||||||
"Run multiple branch processes in parallel.": "Esegui più processi del ramo in parallelo.",
|
"Run multiple branch processes in parallel.": "Esegui più processi del ramo in parallelo.",
|
||||||
"Add branch": "Aggiungi ramo",
|
"Add branch": "Aggiungi ramo",
|
||||||
|
"Mode": "Modalità di esecuzione",
|
||||||
"All succeeded": "Tutti riusciti",
|
"All succeeded": "Tutti riusciti",
|
||||||
"Any succeeded": "Qualsiasi riuscito",
|
"Any succeeded": "Qualsiasi riuscito",
|
||||||
"Any succeeded or failed": "Qualsiasi riuscito o fallito",
|
"Any succeeded or failed": "Qualsiasi riuscito o fallito",
|
||||||
|
@ -9,12 +9,16 @@
|
|||||||
"Add parameter": "Aggiungi parametro",
|
"Add parameter": "Aggiungi parametro",
|
||||||
"Body": "Corpo",
|
"Body": "Corpo",
|
||||||
"Use variable": "Usa variabile",
|
"Use variable": "Usa variabile",
|
||||||
|
"Add key-value pairs": "Aggiungi coppie chiave-valore",
|
||||||
"Format": "Formato",
|
"Format": "Formato",
|
||||||
"Insert": "Inserisci",
|
"Insert": "Inserisci",
|
||||||
"Timeout config": "Configurazione timeout",
|
"Timeout": "Timeout",
|
||||||
"ms": "ms",
|
"Milliseconds": "ms",
|
||||||
"Input request data": "Inserisci dati richiesta",
|
"Input request data": "Inserisci dati richiesta",
|
||||||
"Only support standard JSON data": "Supporta solo dati JSON standard",
|
"Only support standard JSON data": "Supporta solo dati JSON standard",
|
||||||
"\"Content-Type\" only support \"application/json\", and no need to specify": "\"Content-Type\" supporta solo \"application/json\", e non è necessario specificarlo",
|
"\"Content-Type\" will be ignored from headers.": "\"Content-Type\" sarà ignorato dall'intestazione",
|
||||||
"Ignore failed request and continue workflow": "Ignora la richiesta fallita e continua il workflow"
|
"Ignore failed request and continue workflow": "Ignora la richiesta fallita e continua il workflow",
|
||||||
|
"Status code": "Codice stato",
|
||||||
|
"Data": "Dati",
|
||||||
|
"Response headers": "Intestazioni risposta"
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"SQL action": "Azione SQL",
|
"SQL action": "Azione SQL",
|
||||||
"Execute a SQL statement in database": "Esegui un'istruzione SQL nel database",
|
"Execute a SQL statement in database.": "Esegui un'istruzione SQL nel database.",
|
||||||
"Usage of SQL query result is not supported yet.": "L'utilizzo del risultato della query SQL non è ancora supportato."
|
"Select a data source to execute SQL.": "Seleziona un origine dati per eseguire SQL.",
|
||||||
|
"SQL query result could be used through <1>JSON query node</1> (Commercial plugin).": "Il risultato della query SQL potrebbe essere utilizzato tramite il <1>nodo JSON query</1>(plugin commerciale).",
|
||||||
|
"Include meta information of this query in result": "Includi meta informazioni di questa query nel risultato"
|
||||||
}
|
}
|
||||||
|
@ -115,7 +115,9 @@ export class ApprovalTriggerNode {
|
|||||||
.getByLabel('block-item-DataSourceCollectionCascader-workflows-Collection')
|
.getByLabel('block-item-DataSourceCollectionCascader-workflows-Collection')
|
||||||
.locator('.ant-select-selection-search-input');
|
.locator('.ant-select-selection-search-input');
|
||||||
this.dataBlocksInitiationRadio = page.getByRole('radio', { name: 'Initiate in data blocks only' });
|
this.dataBlocksInitiationRadio = page.getByRole('radio', { name: 'Initiate in data blocks only' });
|
||||||
this.dataBlocksAndGlobalApprovalBlocksInitiationRadio = page.getByRole('radio', { name: 'Initiate in both data blocks' });
|
this.dataBlocksAndGlobalApprovalBlocksInitiationRadio = page.getByRole('radio', {
|
||||||
|
name: 'Initiate in both data blocks',
|
||||||
|
});
|
||||||
this.allowedToBeWithdrawnCheckbox = page.getByLabel('Allowed to be withdrawn');
|
this.allowedToBeWithdrawnCheckbox = page.getByLabel('Allowed to be withdrawn');
|
||||||
this.goToconfigureButton = page.getByRole('button', { name: 'Go to configure' });
|
this.goToconfigureButton = page.getByRole('button', { name: 'Go to configure' });
|
||||||
this.addBlockButton = page.getByLabel(`schema-initializer-Grid-ApprovalApplyAddBlockButton-${collectionName}`);
|
this.addBlockButton = page.getByLabel(`schema-initializer-Grid-ApprovalApplyAddBlockButton-${collectionName}`);
|
||||||
|
@ -53,13 +53,8 @@
|
|||||||
"By custom date": "Per data personalizzata",
|
"By custom date": "Per data personalizzata",
|
||||||
"Advanced": "Avanzato",
|
"Advanced": "Avanzato",
|
||||||
"End": "Fine",
|
"End": "Fine",
|
||||||
"Node result": "Risultato nodo",
|
"Node result": "Risultato nodo",
|
||||||
"Constant": "Costante",
|
"Operator": "Operatore",
|
||||||
"Null": "Null",
|
|
||||||
"Boolean": "Booleano",
|
|
||||||
"String": "Stringa",
|
|
||||||
"Operator": "Operatore",
|
|
||||||
"Arithmetic calculation": "Calcolo aritmetico",
|
|
||||||
"String operation": "Operazione stringa",
|
"String operation": "Operazione stringa",
|
||||||
"Executed at": "Eseguito alle",
|
"Executed at": "Eseguito alle",
|
||||||
"Queueing": "In coda",
|
"Queueing": "In coda",
|
||||||
@ -73,28 +68,138 @@
|
|||||||
"Collection operations": "Operazioni raccolta",
|
"Collection operations": "Operazioni raccolta",
|
||||||
"Extended types": "Tipi estesi",
|
"Extended types": "Tipi estesi",
|
||||||
"Node type": "Tipo nodo",
|
"Node type": "Tipo nodo",
|
||||||
"Calculation": "Calcolo",
|
"Calculation": "Calcolo",
|
||||||
"Configure calculation": "Configura calcolo",
|
|
||||||
"Calculation result": "Risultato calcolo",
|
"Calculation result": "Risultato calcolo",
|
||||||
"True": "Vero",
|
"True": "Vero",
|
||||||
"False": "Falso",
|
"False": "Falso",
|
||||||
"concat": "concatena",
|
"concat": "concatena",
|
||||||
"Condition": "Condizione",
|
"Condition": "Condizione",
|
||||||
"Mode": "Modalità",
|
"Mode": "Modalità",
|
||||||
"Continue when \"Yes\"": "Continua quando \"Yes\"",
|
"Continue when \"Yes\"": "Continua quando \"Sì\"",
|
||||||
"Branch into \"Yes\" and \"No\"": "Dirama in \"Yes\" e \"No\"",
|
"Branch into \"Yes\" and \"No\"": "Dirama in \"Sì\" e \"No\"",
|
||||||
"Conditions": "Condizioni",
|
|
||||||
"Create record": "Crea record",
|
"Create record": "Crea record",
|
||||||
"Update record": "Aggiorna record",
|
"Update record": "Aggiorna record",
|
||||||
"Query record": "Interroga record",
|
"Query record": "Interroga record",
|
||||||
"Multiple records": "Record multipli",
|
"Multiple records": "Record multipli",
|
||||||
"Please select collection first": "Seleziona prima la raccolta",
|
"Please select collection first": "Seleziona prima la raccolta",
|
||||||
"Only update records matching conditions": "Aggiorna solo i record che corrispondono alle condizioni",
|
"Only update records matching conditions": "Aggiorna solo i record che corrispondono alle condizioni",
|
||||||
"Fields that are not assigned a value will be set to the default value, and those that do not have a default value are set to null.": "I campi a cui non è assegnato un valore verranno impostati sul valore predefinito, e quelli che non hanno un valore predefinito verranno impostati su null.",
|
|
||||||
"Trigger in executed workflow cannot be modified": "Il trigger nel workflow eseguito non può essere modificato",
|
|
||||||
"Node in executed workflow cannot be modified": "Il nodo nel workflow eseguito non può essere modificato",
|
|
||||||
"Can not delete": "Impossibile eliminare",
|
"Can not delete": "Impossibile eliminare",
|
||||||
"The result of this node has been referenced by other nodes ({{nodes}}), please remove the usage before deleting.": "Il risultato di questo nodo è stato referenziato da altri nodi ({{nodes}}), rimuovi l'utilizzo prima di eliminare.",
|
"The result of this node has been referenced by other nodes ({{nodes}}), please remove the usage before deleting.": "Il risultato di questo nodo è stato referenziato da altri nodi ({{nodes}}), rimuovi l'utilizzo prima di eliminare.",
|
||||||
"Maximum number of loop calls": "Numero massimo di chiamate ciclo",
|
"Clear all executions": "Cancella tutte le esecuzioni",
|
||||||
"If the number of loop calls is too large, there will be performance issues.": "Se il numero di chiamate ciclo è troppo grande, ci saranno problemi di prestazioni."
|
"Clear executions will not reset executed count, and started executions will not be deleted, are you sure you want to delete them all?": "La cancellazione delle esecuzioni non reimposta il conteggio delle esecuzioni e le esecuzioni avviate non verranno eliminate. Sei sicuro di volerle eliminare tutte?",
|
||||||
|
"Sync": "Sincronizza",
|
||||||
|
"Sync enabled status of all workflows from database": "Sincronizza lo stato abilitato di tutti i workflow dal database",
|
||||||
|
"Duplicate to new workflow": "Duplica in un nuovo workflow",
|
||||||
|
"Delete a main version will cause all other revisions to be deleted too.": "L'eliminazione di una versione principale comporterà l'eliminazione anche di tutte le altre revisioni.",
|
||||||
|
"Execute manually": "Esegui manualmente",
|
||||||
|
"The trigger is not configured correctly, please check the trigger configuration.": "Il trigger non è configurato correttamente, controlla la configurazione del trigger.",
|
||||||
|
"This type of trigger has not been supported to be executed manually.": "Questo tipo di trigger non è supportato per l'esecuzione manuale.",
|
||||||
|
"Trigger variables need to be filled for executing.": "Le variabili del trigger devono essere compilate per l'esecuzione.",
|
||||||
|
"A new version will be created automatically after execution if current version is not executed.": "Se la versione corrente non è stata eseguita, verrà creata automaticamente una nuova versione dopo l'esecuzione.",
|
||||||
|
"This will perform all the actions configured in the workflow. Are you sure you want to continue?": "Verranno eseguite tutte le azioni configurate nel workflow. Sei sicuro di voler continuare?",
|
||||||
|
"Automatically create a new version after execution": "Crea automaticamente una nuova versione dopo l'esecuzione",
|
||||||
|
"Workflow executed, the result status is <1>{{statusText}}</1><2>View the execution</2>": "Workflow eseguito, lo stato del risultato è <1>{{statusText}}</1><2>Visualizza l'esecuzione</2>",
|
||||||
|
"Use transaction": "Usa transazione",
|
||||||
|
"Data operation nodes in workflow will run in a same transaction until any interruption. Any failure will cause data rollback, and will also rollback the history of the execution.": "I nodi di operazione dati nel workflow verranno eseguiti nella stessa transazione fino a qualsiasi interruzione. Qualsiasi errore causerà il rollback dei dati e ripristinerà anche la cronologia dell'esecuzione.",
|
||||||
|
"Auto delete history when execution is on end status": "Elimina automaticamente la cronologia quando l'esecuzione è in stato finale",
|
||||||
|
"Maximum number of cycling triggers": "Numero massimo di trigger ciclici",
|
||||||
|
"The triggers of same workflow by some node (create, update and sub-flow etc.) more than this number will be ignored. Large number may cause performance issues. Please use with caution.": "I trigger dello stesso workflow da un nodo (crea, aggiorna e sub-flow ecc.) superiori a questo numero verranno ignorati. Un numero elevato può causare problemi di prestazioni. Si prega di usare con cautela.",
|
||||||
|
"Unknown trigger": "Trigger sconosciuto",
|
||||||
|
"Workflow with unknown type will cause error. Please delete it or check plugin which provide this type.": "Un workflow con tipo sconosciuto causerà un errore. Si prega di eliminarlo o controllare il plugin che fornisce questo tipo.",
|
||||||
|
"Execute mode": "Modalità di esecuzione",
|
||||||
|
"Execute workflow asynchronously or synchronously based on trigger type, and could not be changed after created.": "Esegui il workflow in modo asincrono o sincrono in base al tipo di trigger e non può essere modificato dopo la creazione.",
|
||||||
|
"Asynchronously": "Asincrono",
|
||||||
|
"Synchronously": "Sincrono",
|
||||||
|
"Will be executed in the background as a queued task.": "Verrà eseguito in background come attività in coda.",
|
||||||
|
"For user actions that require immediate feedback. Can not use asynchronous nodes in such mode, and it is not recommended to perform time-consuming operations under synchronous mode.": "Per le azioni dell'utente che richiedono un feedback immediato. Non è possibile utilizzare nodi asincroni in questa modalità e non è consigliabile eseguire operazioni che richiedono tempo in modalità sincrona.",
|
||||||
|
"Go back": "Torna indietro",
|
||||||
|
"Bind workflows": "Collega workflow",
|
||||||
|
"Support pre-action event (local mode), post-action event (local mode), and approval event here.": "Qui sono supportati evento pre-azione (modalità locale), evento post-azione (modalità locale) e evento di approvazione.",
|
||||||
|
"Workflow will be triggered directly once the button clicked, without data saving. Only supports to be bound with \"Custom action event\".": "Il workflow verrà attivato direttamente una volta cliccato il pulsante, senza salvataggio dei dati. Supporta solo il collegamento con \"evento azione personalizzata\".",
|
||||||
|
"\"Submit to workflow\" to \"Post-action event\" is deprecated, please use \"Custom action event\" instead.": "\"Invia a workflow\" a \"evento post-azione\" è obsoleto, si prega di utilizzare invece \"evento azione personalizzata\".",
|
||||||
|
"Workflow will be triggered before deleting succeeded (only supports pre-action event in local mode).": "Il workflow verrà attivato prima dell'eliminazione riuscita (supporta solo l'evento pre-azione in modalità locale).",
|
||||||
|
"Submit to workflow": "Invia a workflow",
|
||||||
|
"Add workflow": "Aggiungi workflow",
|
||||||
|
"Select workflow": "Seleziona workflow",
|
||||||
|
"Trigger data context": "Contesto dati trigger",
|
||||||
|
"Full form data": "Dati completi del modulo",
|
||||||
|
"Select context": "Seleziona contesto",
|
||||||
|
"Triggered when data changes in the collection, such as after adding, updating, or deleting a record. Unlike \"Post-action event\", Collection event listens for data changes rather than HTTP requests. Unless you understand the exact meaning, it is recommended to use \"Post-action event\".": "Attivato quando i dati cambiano nella raccolta, ad esempio dopo l'aggiunta, l'aggiornamento o l'eliminazione di un record. A differenza dell' \"evento post-azione\", l'evento raccolta ascolta le modifiche dei dati anziché le richieste HTTP. A meno che tu non capisca il significato esatto, si consiglia di utilizzare \"Evento post-azione\".",
|
||||||
|
"Preload associations": "Precarica associazioni",
|
||||||
|
"Please select the associated fields that need to be accessed in subsequent nodes. With more than two levels of to-many associations may cause performance issue, please use with caution.": "Seleziona i campi associati a cui è necessario accedere nei nodi successivi. Con più di due livelli di associazioni molti-a-molti possono verificarsi problemi di prestazioni, si prega di usare con cautela.",
|
||||||
|
"Choose a record or primary key of a record in the collection to trigger.": "Scegli un record o la chiave primaria di un record nella raccolta per attivare.",
|
||||||
|
"Triggered according to preset time conditions. Suitable for one-time or periodic tasks, such as sending notifications and cleaning data on a schedule.": "Attivato secondo condizioni di tempo preimpostate. Adatto per attività una tantum o periodiche, come l'invio di notifiche e la pulizia dei dati in base a una pianificazione.",
|
||||||
|
"Execute on": "Esegui su",
|
||||||
|
"Current time": "Ora corrente",
|
||||||
|
"Variable key of node": "Chiave variabile del nodo",
|
||||||
|
"Scope variables": "Variabili di ambito",
|
||||||
|
"Calculate an expression based on a calculation engine and obtain a value as the result. Variables in the upstream nodes can be used in the expression.": "Calcola un'espressione basata su un motore di calcolo e ottieni un valore come risultato. Le variabili nei nodi upstream possono essere utilizzate nell'espressione.",
|
||||||
|
"System variables": "Variabili di sistema",
|
||||||
|
"System time": "Ora di sistema",
|
||||||
|
"Date variables": "Variabili data",
|
||||||
|
"Date range": "Intervallo date",
|
||||||
|
"Resolved": "Risolto",
|
||||||
|
"Error": "Errore",
|
||||||
|
"Aborted": "Interrotto",
|
||||||
|
"Rejected": "Rifiutato",
|
||||||
|
"Retry needed": "Richiesto nuovo tentativo",
|
||||||
|
"Completed": "Completato",
|
||||||
|
"All": "Tutto",
|
||||||
|
"View result": "Visualizza risultato",
|
||||||
|
"Triggered but still waiting in queue to execute.": "Attivato ma ancora in attesa in coda per l'esecuzione.",
|
||||||
|
"Started and executing, maybe waiting for an async callback (manual, delay etc.).": "Avviato ed in esecuzione, forse in attesa di un callback asincrono (manuale, ritardo ecc.).",
|
||||||
|
"Successfully finished.": "Terminato con successo.",
|
||||||
|
"Failed to satisfy node configurations.": "Fallito nel soddisfare le configurazioni del nodo.",
|
||||||
|
"Some node meets error.": "Qualche nodo presenta un errore.",
|
||||||
|
"Running of some node was aborted by program flow.": "L'esecuzione di qualche nodo è stata interrotta dal flusso del programma.",
|
||||||
|
"Manually canceled whole execution when waiting.": "L'intera esecuzione è stata cancellata manualmente durante l'attesa.",
|
||||||
|
"Rejected from a manual node.": "Rifiutato da un nodo manuale.",
|
||||||
|
"General failed but should do another try.": "Fallimento generico, ma dovrebbe essere fatto un altro tentativo.",
|
||||||
|
"Cancel the execution": "Annulla l'esecuzione",
|
||||||
|
"Are you sure you want to cancel the execution?": "Sei sicuro di voler annullare l'esecuzione?",
|
||||||
|
"Operations": "Operazioni",
|
||||||
|
"Manual": "Manuale",
|
||||||
|
"Unknown node": "Nodo sconosciuto",
|
||||||
|
"Node with unknown type will cause error. Please delete it or check plugin which provide this type.": "Un nodo con tipo sconosciuto causerà un errore. Si prega di eliminarlo o controllare il plugin che fornisce questo tipo.",
|
||||||
|
"Calculation engine": "Motore di calcolo",
|
||||||
|
"Basic": "Base",
|
||||||
|
"Calculation expression": "Espressione di calcolo",
|
||||||
|
"Expression syntax error": "Errore di sintassi dell'espressione",
|
||||||
|
"Syntax references: ": "Riferimenti di sintassi:",
|
||||||
|
"Based on boolean result of the calculation to determine whether to \"continue\" or \"exit\" the process, or continue on different branches of \"yes\" and \"no\".": "Basato sul risultato booleano del calcolo per determinare se \"continuare\" o \"uscire\" dal processo, o continuare su rami diversi di \"sì\" e \"no\".",
|
||||||
|
"Condition expression": "Espressione di condizione",
|
||||||
|
"Inside of \"Yes\" branch": "All'interno del ramo \"Sì\"",
|
||||||
|
"Inside of \"No\" branch": "All'interno del ramo \"No\"",
|
||||||
|
"Add new record to a collection. You can use variables from upstream nodes to assign values to fields.": "Aggiungi un nuovo record a una raccolta. Puoi usare variabili dai nodi upstream per assegnare valori ai campi.",
|
||||||
|
"Update records of a collection. You can use variables from upstream nodes as query conditions and field values.": "Aggiorna i record di una raccolta. Puoi usare variabili dai nodi upstream come condizioni di query e valori campo.",
|
||||||
|
"Update mode": "Modalità di aggiornamento",
|
||||||
|
"Update in a batch": "Aggiornamento in batch",
|
||||||
|
"Update one by one": "Aggiornamento uno per uno",
|
||||||
|
"Update all eligible data at one time, which has better performance when the amount of data is large. But association fields are not supported (unless foreign key in current collection), and the updated data will not trigger other workflows.": "Aggiorna tutti i dati idonei in una volta, il che ha prestazioni migliori quando la quantità di dati è grande. Ma i campi di associazione non sono supportati (a meno che la chiave esterna non sia nella raccolta corrente), e i dati aggiornati non attiveranno altri workflow.",
|
||||||
|
"The updated data can trigger other workflows, and the audit log will also be recorded. But it is usually only applicable to several or dozens of pieces of data, otherwise there will be performance problems.": "I dati aggiornati possono attivare altri workflow, e il registro eventi sarà anche registrato. Ma di solito è applicabile solo a diverse o decine di dati, altrimenti ci saranno problemi di prestazioni.",
|
||||||
|
"Query records from a collection. You can use variables from upstream nodes as query conditions.": "Interroga i record da una raccolta. Puoi usare variabili dai nodi upstream come condizioni di query.",
|
||||||
|
"Allow multiple records as result": "Consenti più record come risultato",
|
||||||
|
"If checked, when there are multiple records in the query result, an array will be returned as the result, which can be operated on one by one using a loop node. Otherwise, only one record will be returned.": "Se selezionato, quando ci sono più record nel risultato della query, sarà restituito come risultato un array, che può essere operato uno per uno usando un nodo ciclo. Altrimenti, sarà restituito solo un record.",
|
||||||
|
"Result type": "Tipo risultato",
|
||||||
|
"Single record": "Record singolo",
|
||||||
|
"The result will be an object of the first matching record only, or null if no matched record.": "Il risultato sarà un oggetto solo del primo record corrispondente, oppure null se non vi è alcun record corrispondente.",
|
||||||
|
"The result will be an array containing matched records, or an empty one if no matching records. This can be used to be processed in a loop node.": "Il risultato sarà un array contenente record corrispondenti, o uno vuoto se non ci sono record corrispondenti. Questo può essere usato per essere elaborato in un nodo ciclo.",
|
||||||
|
"Exit when query result is null": "Esci quando il risultato della query è null",
|
||||||
|
"Please add at least one condition": "Si prega di aggiungere almeno una condizione",
|
||||||
|
"Unassigned fields will be set to default values, and those without default values will be set to null.": "I campi non assegnati saranno impostati ai valori predefiniti, e quelli senza valori predefiniti saranno impostati a null.",
|
||||||
|
"Delete record": "Elimina record",
|
||||||
|
"Delete records of a collection. Could use variables in workflow context as filter. All records match the filter will be deleted.": "Elimina i record di una raccolta. Potrebbe usare variabili nel contesto del workflow come filtro. Tutti i record che corrispondono al filtro saranno eliminati.",
|
||||||
|
"Executed workflow cannot be modified. Could be copied to a new version to modify.": "Il workflow eseguito non può essere modificato. Potrebbe essere copiato in una nuova versione per essere modificato.",
|
||||||
|
"End process": "Termina processo",
|
||||||
|
"End the process immediately, with set status.": "Termina il processo immediatamente, con stato impostato.",
|
||||||
|
"End status": "Stato finale",
|
||||||
|
"Test run": "Test run",
|
||||||
|
"Test run will do the actual data manipulating or API calling, please use with caution.": "Il test run farà l'effettiva manipolazione dei dati o la chiamata API, si prega di usare con cautela.",
|
||||||
|
"No variable": "Nessuna variabile",
|
||||||
|
"Add node": "Aggiungi nodo",
|
||||||
|
"Move all downstream nodes to": "Sposta tutti i nodi downstream a",
|
||||||
|
"After end of branches": "Dopo la fine dei rami",
|
||||||
|
"Inside of branch": "All'interno del ramo",
|
||||||
|
"Workflow todos": "Da fare",
|
||||||
|
"New version enabled": "Nuova versione abilitata"
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user