From de49b7f6c79a32e0031ddbeb1c84bfbee1ff6bca Mon Sep 17 00:00:00 2001 From: Vijay Kumar Rathore Date: Fri, 11 Feb 2022 13:21:50 +0100 Subject: [PATCH 01/49] correct uidt check to preserve select column options after metadata sync Signed-off-by: Vijay Kumar Rathore --- .../nocodb/src/lib/sqlMgr/code/models/xc/BaseModelXcMeta.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/nocodb/src/lib/sqlMgr/code/models/xc/BaseModelXcMeta.ts b/packages/nocodb/src/lib/sqlMgr/code/models/xc/BaseModelXcMeta.ts index 46fd890bd5..7cf4a2ad09 100644 --- a/packages/nocodb/src/lib/sqlMgr/code/models/xc/BaseModelXcMeta.ts +++ b/packages/nocodb/src/lib/sqlMgr/code/models/xc/BaseModelXcMeta.ts @@ -64,8 +64,8 @@ abstract class BaseModelXcMeta extends BaseRender { columnObj._cn = oldColMeta._cn || columnObj._cn; columnObj.uidt = oldColMeta.uidt; if ( - (columnObj.dtxp === UITypes.MultiSelect || - columnObj.dtxp === UITypes.SingleSelect) && + (columnObj.uidt === UITypes.MultiSelect || + columnObj.uidt === UITypes.SingleSelect) && columnObj.dt !== 'set' && columnObj.dt !== 'enum' ) { From 222915917724e1c9a8ed65fc80d940e56ba00879 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 12 Feb 2022 17:58:32 +0000 Subject: [PATCH 02/49] chore(deps): bump follow-redirects in /packages/nc-gui Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.6 to 1.14.8. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.6...v1.14.8) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] --- packages/nc-gui/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/nc-gui/package-lock.json b/packages/nc-gui/package-lock.json index 0ccfa95b5a..4ed401c444 100644 --- a/packages/nc-gui/package-lock.json +++ b/packages/nc-gui/package-lock.json @@ -5474,9 +5474,9 @@ } }, "follow-redirects": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.6.tgz", - "integrity": "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==" + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==" }, "for-in": { "version": "1.0.2", From 5cf3a236fefb51d86a07f2e844d03348c82cc874 Mon Sep 17 00:00:00 2001 From: Wing-Kam Wong Date: Tue, 22 Feb 2022 19:40:14 +0800 Subject: [PATCH 03/49] wip: cater fk not pk case Signed-off-by: Wing-Kam Wong --- .../components/virtualCell/hasManyCell.vue | 28 +++++++++++++++---- .../lib/dataMapper/lib/sql/BaseModelSql.ts | 3 +- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/packages/nc-gui/components/project/spreadsheet/components/virtualCell/hasManyCell.vue b/packages/nc-gui/components/project/spreadsheet/components/virtualCell/hasManyCell.vue index 43cbf9a830..7921571148 100644 --- a/packages/nc-gui/components/project/spreadsheet/components/virtualCell/hasManyCell.vue +++ b/packages/nc-gui/components/project/spreadsheet/components/virtualCell/hasManyCell.vue @@ -2,7 +2,7 @@
@@ -441,7 +441,7 @@ v-ge="['columns','scale']" :disabled="!sqlUi.columnEditable(props.item)" :rules="[max25chars]" - label="Edit" + :label="$t('general.edit')" single-line /> @@ -641,7 +641,7 @@ v-model="props.item.cdf" v-ge="['columns','default']" :disabled="!sqlUi.columnEditable(props.item)" - label="Edit" + :label="$t('general.edit')" counter class="caption" :placeholder="`${sqlUi.getDefaultValueForDatatype(props.item.dt)}`" diff --git a/packages/nc-gui/components/project/tableTabs/columnsMock.vue b/packages/nc-gui/components/project/tableTabs/columnsMock.vue index 4e95f83dc8..bf2605c2e3 100644 --- a/packages/nc-gui/components/project/tableTabs/columnsMock.vue +++ b/packages/nc-gui/components/project/tableTabs/columnsMock.vue @@ -122,7 +122,7 @@ v-model="props.item.cn" :disabled="props.item.rcn" :rules="[max25chars]" - label="Edit" + :label="$t('general.edit')" single-line /> @@ -180,7 +180,7 @@ @@ -201,7 +201,7 @@ @@ -304,7 +304,7 @@ @@ -326,7 +344,7 @@ - Available context variables are data, user, payload and env + Available context variables are data and user - + mdi-drag From 02dbaf418c3b658b1e58315a103ca51554e1bf72 Mon Sep 17 00:00:00 2001 From: Raju Udava <86527202+dstala@users.noreply.github.com> Date: Tue, 1 Mar 2022 11:29:28 +0530 Subject: [PATCH 33/49] chore: docs (slack webhook link) --- .../content/en/developer-resources/webhooks.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/noco-docs/content/en/developer-resources/webhooks.md b/packages/noco-docs/content/en/developer-resources/webhooks.md index c9e630662d..996e91b300 100644 --- a/packages/noco-docs/content/en/developer-resources/webhooks.md +++ b/packages/noco-docs/content/en/developer-resources/webhooks.md @@ -118,6 +118,17 @@ Detailed procedure for discord webhook described [here](https://support.discord. - Handlebars {{ }} +## Slack +### 1. Create WebHook +- Details to create slack webhook are captured [here](https://api.slack.com/messaging/webhooks) + +### 2. Install Plugin +- Procedure remain same as listed for DISCORD channel configuration above + +### 3. Configure Webhook +- Procedure remain same as listed for DISCORD channel configuration above + + ## Microsoft Teams ### 1. Create WebHook From 06caf0f034d6661ebcfdc5e8ae2b56f9cd0208b6 Mon Sep 17 00:00:00 2001 From: Raju Udava <86527202+dstala@users.noreply.github.com> Date: Wed, 2 Mar 2022 12:25:57 +0530 Subject: [PATCH 34/49] chore: i18n corrections to de.json Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> --- packages/nc-gui/lang/de.json | 134 +++++++++++++++++------------------ 1 file changed, 67 insertions(+), 67 deletions(-) diff --git a/packages/nc-gui/lang/de.json b/packages/nc-gui/lang/de.json index fc51656b37..dcb7cea4d3 100644 --- a/packages/nc-gui/lang/de.json +++ b/packages/nc-gui/lang/de.json @@ -14,23 +14,23 @@ "remove": "Entfernen", "save": "Speichern", "cancel": "Abbrechen", - "submit": "Übermitteln", + "submit": "Übertragen", "create": "Erstellen", - "insert": "Einfügung", + "insert": "Einfügen", "delete": "Löschen", "update": "Aktualisieren", "rename": "Umbenennen", "reload": "Neu laden", "reset": "Zurücksetzen", "install": "Installieren", - "show": "Zeigen", + "show": "Anzeigen", "hide": "Verstecken", - "showAll": "Alles zeigen", + "showAll": "Alles anzeigen", "hideAll": "Alles verstecken", "showMore": "Mehr anzeigen", - "showOptions": "Optionen anzeigen", + "showOptions": "Optionen einblenden", "hideOptions": "Optionen ausblenden", - "showMenu": "Menü anzeigen", + "showMenu": "Menü einblenden", "hideMenu": "Menü ausblenden", "addAll": "Alles hinzufügen", "removeAll": "Alles entfernen", @@ -47,8 +47,8 @@ "default": "Standard", "more": "Mehr", "less": "Weniger", - "event": "Fall", - "condition": "Zustand", + "event": "Ereignis", + "condition": "Bedingung", "after": "Nach dem", "before": "Vor", "search": "Suche", @@ -107,7 +107,7 @@ "Time": "Zeit", "PhoneNumber": "Telefonnummer", "Email": "Email", - "URL": "URL.", + "URL": "URL", "Number": "Nummer", "Decimal": "Dezimal", "Currency": "Währung", @@ -129,8 +129,8 @@ "noAction": "Keine Aktion", "cascade": "Kaskade", "restrict": "Beschränken", - "setNull": "Null einstellen", - "setDefault": "Standard setzen" + "setNull": "Auf Null setzen", + "setDefault": "Auf Standard setzen" } }, "filterOperation": { @@ -147,12 +147,12 @@ "newProj": "Neues Projekt", "myProject": "Meine Projekte", "formTitle": "Formular Titel", - "collabView": "Mitarbeitersicht", - "lockedView": "Gesperrter Blick", + "collabView": "Mitarbeiteransicht", + "lockedView": "Gesperrte Ansicht", "personalView": "Persönliche Ansicht", - "appStore": "Appstore", - "team&auth": "Team & Auth.", - "rolesUserMgmt": "Rollen & Benutzermanagement", + "appStore": "App-Store", + "team&auth": "Team & Auth", + "rolesUserMgmt": "Rollen- & Benutzermanagement", "userMgmt": "Benutzermanagement", "apiTokenMgmt": "API-Tokens-Management", "rolesMgmt": "Rollenmanagement", @@ -160,7 +160,7 @@ "metaMgmt": "Meta-Management", "metadata": "Metadaten", "exportImportMeta": "Metadaten exportieren / importieren", - "uiACL": "UI-Zugangskontrolle.", + "uiACL": "UI-Zugangskontrolle", "metaOperations": "Metadatenoperationen", "audit": "Audit", "auditLogs": "Audit-Log", @@ -172,10 +172,10 @@ "resetPassword": "Passwort zurücksetzen" }, "labels": { - "notifyVia": "Benachrichtigen Sie die via", + "notifyVia": "Benachrichtigen mit", "projName": "Projektname", "tableName": "Tabellenname", - "viewName": "Name anzeigen", + "viewName": "Namen anzeigen", "viewLink": "Link anzeigen", "columnName": "Spaltenname", "columnType": "Spaltentyp", @@ -204,11 +204,11 @@ "storage": "Speicher", "uiAcl": "UI-ACL", "models": "Modelle", - "syncState": "Sync-Stand", + "syncState": "Sync-Status", "created": "Erstellt", "sqlOutput": "SQL-Ausgabe", "addOption": "Option hinzufügen", - "aggregateFunction": "Aggregat-Funktion.", + "aggregateFunction": "Globale Funktion", "dbCreateIfNotExists": "Datenbank: Erstellen, falls nicht vorhanden", "clientKey": "Client-Schlüssel", "clientCert": "Client Cert", @@ -222,18 +222,18 @@ "community": { "starUs1": "Stern", "starUs2": "uns auf Github", - "bookDemo": "Buchen Sie eine kostenlose Demo", + "bookDemo": "Eine kostenlose Demo buchen", "getAnswered": "Erhalten Sie Antworten auf Ihre Fragen", "joinDiscord": "Discord beitreten", - "joinReddit": "Join /r/NocoDB", + "joinReddit": "/r/NocoDB beitreten", "followNocodb": "Folgen Sie NocoDB" }, - "docReference": "Dokumentverweis", - "selectUserRole": "Wählen Sie die Benutzerrolle aus", - "childTable": "Kindertisch", - "childColumn": "Kindersäule", - "onUpdate": "Update.", - "onDelete": "Auf löschen" + "docReference": "Dokumentenverweis", + "selectUserRole": "Benutzerrolle auswählen", + "childTable": "Child-Tabelle", + "childColumn": "Child-Spalte", + "onUpdate": "Update", + "onDelete": "Löschen" }, "activity": { "createProject": "Projekt erstellen", @@ -251,7 +251,7 @@ "excel": "Projekt aus Excel erstellen", "template": "Projekt aus Vorlage erstellen" }, - "OkSaveProject": "OK & Project speichern", + "OkSaveProject": "OK & Projekt speichern", "upgrade": { "available": "Upgrade verfügbar", "releaseNote": "Versionshinweise", @@ -293,12 +293,12 @@ "createTable": "Tabelle erstellen", "refreshTable": "Tabellen aktualisieren", "renameTable": "Tabelle umbenennen", - "deleteTable": "Tabelle löschen.", + "deleteTable": "Tabelle löschen", "addField": "Neues Feld zu dieser Tabelle hinzufügen", "setPrimary": "Als Primärwert festlegen", - "addRow": "Neue Spalte hinzufügen", - "saveRow": "Spalte speichern", - "insertRow": "Neue Reihe einfügen", + "addRow": "Neue Zeile hinzufügen", + "saveRow": "Zeile speichern", + "insertRow": "Neue Zeile einfügen", "deleteRow": "Zeile löschen", "deleteSelectedRow": "Ausgewählte Zeilen löschen", "importExcel": "Import Excel", @@ -312,12 +312,12 @@ "changePwd": "Kennwort ändern", "createView": "Ansicht erstellen", "shareView": "Ansicht teilen", - "listSharedView": "Geteilte Ansichtsliste", + "listSharedView": "Geteilte Ansichtenliste", "ListView": "Ansichtenliste", "copyView": "Ansicht kopieren", "renameView": "Ansicht umbenennen", "deleteView": "Ansicht löschen", - "createGrid": "Raster-Ansicht erstellen", + "createGrid": "Gitter-Ansicht erstellen", "createGallery": "Galerie-Ansicht erstellen", "createCalendar": "Kalender-Ansicht erstellen", "createKanban": "Kanban-Ansicht erstellen", @@ -325,7 +325,7 @@ "showSystemFields": "Systemfelder anzeigen", "copyUrl": "URL kopieren", "openTab": "Neue Registerkarte öffnen", - "iFrame": "Eingebettete HTML-Code kopieren", + "iFrame": "Eingebetteten HTML-Code kopieren", "addWebhook": "Neuen WebHook hinzufügen", "newToken": "Neuen Token hinzufügen", "exportZip": "Zip-Datei exportieren", @@ -337,7 +337,7 @@ "testDbConn": "Datenbankverbindung testen", "removeDbFromEnv": "Datenbank aus der Umgebung entfernen", "editConnJson": "Verbindung JSON bearbeiten", - "sponsorUs": "Sponsor uns.", + "sponsorUs": "Sponsor uns", "sendEmail": "E-MAIL SENDEN" }, "tooltip": { @@ -361,7 +361,7 @@ "sqlMigration": "Migrationen neu laden", "updateRestart": "Update & Neustart", "cancelReturn": "Abbrechen und Zurück", - "exportMetadata": "Alle Metadaten von den Metatabellen in Meta-Verzeichnis exportieren.", + "exportMetadata": "Alle Metadaten von Metatabellen in Meta-Verzeichnis exportieren.", "importMetadata": "Alle Metadaten vom Meta-Verzeichnis in Metatabellen importieren.", "clearMetadata": "Alle Metadaten aus Meta-Tabellen löschen.", "clientKey": "Auswahl .key-Datei", @@ -379,67 +379,67 @@ }, "searchProjectTree": "Tabellen suchen", "searchFields": "Felder suchen", - "searchColumn": "Suche {search} Spalte", + "searchColumn": "Spalten {search} suchen", "searchApps": "Apps suchen", - "searchModels": "Suche Modelle", + "searchModels": "Modelle suchen", "noItemsFound": "Keine Elemente gefunden", "defaultValue": "Standardwert", "filterByEmail": "Filtern nach E-Mail" }, "msg": { "info": { - "footerInfo": "Reihen pro Seite", + "footerInfo": "Zeilen pro Seite", "upload": "Datei zum Hochladen auswählen", "upload_sub": "oder Drag & Drop Datei", "excelSupport": "Unterstützt: .xls ,.xlsx ,.xlsm, .ods, .ots", "excelURL": "Excel-Datei-URL eingeben", "footMsg": "Anzahl der Zeilen, um den Datentyp analysieren zu können", - "excelImport": "Blatt (s) stehen für den Import zur Verfügung", + "excelImport": "Blatt/Blätter stehen für den Import zur Verfügung", "exportMetadata": "Möchten Sie Metadaten von Meta-Tabellen exportieren?", "importMetadata": "Möchten Sie Metadaten von Metatabellen importieren?", "clearMetadata": "Möchten Sie Metadaten von Meta-Tabellen löschen?", - "projectEmptyMessage": "Beginnen mit dem Erstellen eines neuen Projekts", + "projectEmptyMessage": "Mit dem Erstellen eines neuen Projektes beginnen", "stopProject": "Möchten Sie das Projekt beenden?", "startProject": "Möchten Sie das Projekt starten?", "restartProject": "Möchten Sie das Projekt neu starten?", "deleteProject": "Möchten Sie das Projekt löschen?", "shareBasePrivate": "Öffentlich freigegebene Nur-Lese-Datenbank generieren", - "shareBasePublic": "Jeder im Internet mit diesem Link kann sehen", - "userInviteNoSMTP": "Sieht aus, als hätten Sie den Mailer noch nicht konfiguriert! \\ n Bitte kopieren Sie den obigen Einladungs-Link und senden Sie ihn an", + "shareBasePublic": "Für Jeden im Internet mit diesem Link sichtbar", + "userInviteNoSMTP": "Es sieht so aus, als hätten Sie den Mailer noch nicht konfiguriert! \\ n Bitte kopieren Sie den obigen Einladungs-Link und senden Sie ihn an", "dragDropHide": "Ziehen Sie die Felder hierher, um sie zu verstecken", "formInput": "Formularbezeichnung eingeben", - "formHelpText": "Fügen Sie einen Hilfs-Text hinzu", + "formHelpText": "Einen Hilfs-Text hinzufügen", "onlyCreator": "Nur für den Ersteller sichtbar", "formDesc": "Formularbeschreibung hinzufügen", "beforeEnablePwd": "Den Zugriff mit einem Passwort einschränken", "afterEnablePwd": "Zugriff ist Passwort-geschützt", - "privateLink": "Diese Ansicht wird durch einen privaten Link geteilt", - "privateLinkAdditionalInfo": "Personen mit einem privatem Link können nur Zellen sehen, die in dieser Ansicht angezeigt werden", + "privateLink": "Diese Ansicht wird durch einen persönlichen Link geteilt", + "privateLinkAdditionalInfo": "Personen mit einem persönlichen Link können nur Zellen sehen, die in dieser Ansicht angezeigt werden", "afterFormSubmitted": "Nachdem das Formular übermittelt wurde", "apiOptions": "Zugriff auf das Projekt via", "submitAnotherForm": "Weiteres Formular übermitteln'-Button anzeigen", "showBlankForm": "Ein leeres Formular nach 5 Sekunden anzeigen", - "emailForm": "E-Mail mich unter", + "emailForm": "E-Mail an mich unter", "showSysFields": "Systemfelder anzeigen", "filterAutoApply": "Automatisch anwenden", "showMessage": "Diese Nachricht anzeigen", "viewNotShared": "Aktuelle Ansicht wird nicht geteilt!", "showAllViews": "Alle geteilten Ansichten dieser Tabelle anzeigen", - "collabView": "Mitarbeitern mit Bearbeitungsberechtigung oder höher können die Ansichtskonfiguration ändern", - "lockedView": "Niemand kann die Ansichtskonfiguration bearbeiten, bis sie freigeschaltet ist.", - "personalView": "Nur Sie können die Ansichtskonfiguration bearbeiten. Weitere Mitarbeiter-Ansichten sind standardmäßig ausgeblendet.", + "collabView": "Mitarbeitern mit Bearbeitungsberechtigung oder höher können die Ansichtenkonfiguration ändern", + "lockedView": "Niemand kann die Ansichtenkonfiguration bearbeiten, bis sie freigeschaltet ist.", + "personalView": "Nur Sie können die Ansichtenkonfiguration bearbeiten. Weitere Mitarbeiter-Ansichten sind standardmäßig ausgeblendet.", "ownerDesc": "Kann Ersteller hinzufügen / entfernen und Datenbankstrukturen und -felder voll bearbeiten.", "creatorDesc": "Kann Datenbankstrukturen und Werte vollständig bearbeiten.", "editorDesc": "Kann Datensätze bearbeiten, aber die Struktur von Datenbanken / Feldern nicht ändern.", - "commenterDesc": "Kann die Datensätze anzeigen und kommentieren, aber nichts bearbeiten", - "viewerDesc": "Kann die Einträge anzeigen, aber nichts bearbeiten", + "commenterDesc": "Kann die Datensätze anzeigen und kommentieren, aber nicht bearbeiten", + "viewerDesc": "Kann die Einträge anzeigen, aber nicht bearbeiten", "addUser": "Neuen Benutzer hinzufügen", "staticRoleInfo": "Systemdefinierte Rollen können nicht bearbeitet werden", "exportZip": "Projekt-Meta in ZIP-Datei exportieren und downloaden", "importZip": "Projekt Meta-ZIP-Datei importieren und neu starten.", - "importText": "Importieren von NOCODB-Projekt durch Hochladen von Metadaten-ZIP-Datei", + "importText": "Importieren von NocoDB-Projekt durch Hochladen von Metadaten-ZIP-Datei", "metaNoChange": "Keine Änderung identifiziert", - "sqlMigration": "Schema-Migrationen werden automatisch erstellt. Tabelle erstellen und diese Seite aktualisieren.", + "sqlMigration": "Schemen-Migrationen werden automatisch erstellt. Tabelle erstellen und diese Seite aktualisieren.", "dbConnectionStatus": "Umgebung validiert", "dbConnected": "Verbindung war erfolgreich", "notifications": { @@ -448,7 +448,7 @@ }, "sponsor": { "header": "Sie können uns helfen!", - "message": "Wir sind ein winziges Team, das Vollzeit arbeitet, um die NOCODB-Open-Source zu machen. Wir glauben, daß ein Werkzeug wie NOCODB für jeden Problemlöser im Internet frei verfügbar sein sollte." + "message": "Wir sind ein winziges Team, welches Vollzeit arbeitet, um NocoDB Open-Source zu machen. Wir glauben, daß ein Werkzeug wie NocoDB für jeden Problemlöser im Internet frei verfügbar sein sollte." }, "loginMsg": "In NocoDB einloggen", "passwordRecovery": { @@ -457,7 +457,7 @@ "success": "Bitte überprüfen Sie Ihre E-Mail, um das Passwort zurückzusetzen" }, "signUp": { - "superAdmin": "Du wirst der \"Super Admin\" sein", + "superAdmin": "Sie werden der \"Super Admin\" sein", "alreadyHaveAccount": "Sie haben bereits ein Konto ?", "workEmail": "Geben Sie Ihre Arbeits-E-Mail ein", "enterPassword": "Geben Sie Ihr Passwort ein", @@ -471,10 +471,10 @@ "kanban": "Kanban-Ansicht hinzufügen", "calendar": "Kalender-Ansicht hinzufügen" }, - "tablesMetadataInSync": "Tische Metadaten sind synchron", - "addMultipleUsers": "Sie können mehrere COMMA (,) getrennte E-Mails hinzufügen", - "enterTableName": "Geben Sie den Namen ein", - "addDefaultColumns": "Standardspalten hinzufügen.", + "tablesMetadataInSync": "Tabellen-Metadaten sind synchron", + "addMultipleUsers": "Sie können mehrere kommagetrennte (,) E-Mails hinzufügen", + "enterTableName": "Geben Sie den Tabellennamen ein", + "addDefaultColumns": "Standardspalten hinzufügen", "tableNameInDb": "Tabellenname wie in der Datenbank gespeichert" }, "error": { @@ -482,7 +482,7 @@ "invalidChar": "Ungültiges Zeichen im Ordnerpfad.", "invalidDbCredentials": "Ungültige Datenbankanmeldeinformationen.", "unableToConnectToDb": "Es kann keine Verbindung zur Datenbank hergestellt werden, bitte überprüfen Sie Ihre Datenbank.", - "userDoesntHaveSufficientPermission": "Den Benutzer gibt es nicht oder er hat keine ausreichenden Rechte, das Schema zu erstellen.", + "userDoesntHaveSufficientPermission": "Den Benutzer gibt es nicht oder er hat keine ausreichenden Rechte, um das Schema zu erstellen.", "dbConnectionStatus": "Ungültige Datenbankparameter", "dbConnectionFailed": "Verbindungsfehler:", "signUpRules": { @@ -496,15 +496,15 @@ "exportMetadata": "Projektmetadaten erfolgreich exportiert", "importMetadata": "Projektmetadaten erfolgreich importiert", "clearMetadata": "Projektmetadaten erfolgreich gelöscht", - "stopProject": "Projekt wurde erfolgreich angehalten", - "startProject": "Projekt begann erfolgreich", + "stopProject": "Projekt wurde erfolgreich gestoppt", + "startProject": "Projekt erfolgreich gestartet", "restartProject": "Projekt neu gestartet", "deleteProject": "Projekt erfolgreich gelöscht", "authToken": "Auth-Token in die Zwischenablage kopiert", "projInfo": "Projektinformationen in die Zwischenablage kopiert", "inviteUrlCopy": "Einladungs-URL in die Zwischenablage kopiert", "createView": "Ansicht erfolgreich erstellt", - "formEmailSMTP": "Bitte aktivieren Sie das SMTP-Plugin im App Store, um die E-Mail-Benachrichtigung zu aktivieren", + "formEmailSMTP": "Bitte aktivieren Sie das SMTP-Plugin im App-Store, um die E-Mail-Benachrichtigung zu aktivieren", "collabView": "Erfolgreich auf die kollaborative Ansicht gewechselt", "lockedView": "Erfolgreich auf gesperrte Ansicht gewechselt", "futureRelease": "Kommt bald!" From 02af19071b4fb5aa380a2b1c43424fef4e95127c Mon Sep 17 00:00:00 2001 From: Werner Date: Wed, 2 Mar 2022 11:04:12 +0100 Subject: [PATCH 35/49] Update german.md Updated translation for german Read.Me-file in 02.03.2022. Is it possible to have a look on visual effects? I am not really familiar with the code for that. --- scripts/markdown/readme/languages/german.md | 113 ++++++++++++++------ 1 file changed, 82 insertions(+), 31 deletions(-) diff --git a/scripts/markdown/readme/languages/german.md b/scripts/markdown/readme/languages/german.md index d2d99f0fb3..5b1366d76b 100644 --- a/scripts/markdown/readme/languages/german.md +++ b/scripts/markdown/readme/languages/german.md @@ -6,7 +6,7 @@

-Verwandelt jeden MySQL, PostgreSQL, SQL Server, SQLite & Mariadb in eine Smart-Tabelle. +Verwandelt jeden MySQL, PostgreSQL, SQL Server, SQLite & MariaDB in eine Smart-Tabelle.

@@ -17,11 +17,11 @@ Verwandelt jeden MySQL, PostgreSQL, SQL Server, SQLite & Mariadb in eine Smart-T

- Website • + WebseiteDiscordTwitterReddit • - Documentation + Dokumentation

![OpenSourceAirtableAlternative](https://user-images.githubusercontent.com/5435402/133762127-e94da292-a1c3-4458-b09a-02cd5b57be53.png) @@ -32,9 +32,9 @@ Verwandelt jeden MySQL, PostgreSQL, SQL Server, SQLite & Mariadb in eine Smart-T NocoDB - The Open Source Airtable alternative | Product Hunt

-# Schneller Try +# Schneller Versuch -### 1-Click Deploy +### 1-Klick-Bereitstellung #### Heroku @@ -53,10 +53,10 @@ Verwandelt jeden MySQL, PostgreSQL, SQL Server, SQLite & Mariadb in eine Smart-T docker run -d --name nocodb -p 8080:8080 nocodb/nocodb:latest ``` -- NocoDB needs a database as input : See [Production Setup](https://github.com/nocodb/nocodb/blob/master/README.md#production-setup). -- If this input is absent, we fallback to SQLite. In order too persist sqlite, you can mount `/usr/app/data/`. +- NocoDB benötigt eine Datenbank zur Eingabe: Siehe [Production Setup](https://github.com/nocodb/nocodb/blob/master/README.md#production-setup). +- Fehlt diese Eingabe, wird aus SQLite zurückgegriffen. Um SQLite dauerhaft zu machen, kann `/usr/app/data/` gemountet werden. - Example: + Beispiel: ``` docker run -d -p 8080:8080 --name nocodb -v /local/path:/usr/app/data/ nocodb/nocodb:latest @@ -65,10 +65,10 @@ docker run -d --name nocodb -p 8080:8080 nocodb/nocodb:latest ### Verwenden von NPM ``` -npx create-nocodb-app +npm create-nocodb-app ``` -### Mit git +### Verwenden von Git ``` git clone https://github.com/nocodb/nocodb-seed @@ -128,32 +128,32 @@ Zugriff auf Dashboard mit. : [http://localhost:8080/dashboard](http://localhost: ### Rich-Tabellenschnittstelle -- ⚡ Suchen, sortieren, filtern, Spalten mit Uber-Leichtigkeit ausblenden -- ⚡ Ansichten erstellen: Gitter, Galerie, Kanban, Form -- ⚡ Teilen von Ansichten: Öffentliche und Passwort geschützt +- ⚡ Einfaches Suchen, Sortieren, Filtern und Ausblenden von Spalten +- ⚡ Ansichten erstellen: Gitter, Galerie, Kanban, Formular +- ⚡ Teilen von Ansichten: Öffentlich und passwortgeschützt - ⚡ Persönliche und gesperrte Ansichten -- ⚡ Laden Sie Bilder in Zellen hoch (funktioniert mit S3, Minio, GCP, Azure, Digitalocean, Linode, OVH, Backraze) !! -- ⚡ Rollen: Besitzer, Ersteller, Herausgeber, Kommentator, Viewer, Kommentator, benutzerdefinierte Rollen. -- ⚡ Zugriffskontrolle: Granulare Zugangskontrolle auch bei Datenbank-, Tabellen- und Spaltenebene. +- ⚡ Bilder in Zellen hochladen (funktioniert mit S3, Minio, GCP, Azure, Digitalocean, Linode, OVH, Backraze) !! +- ⚡ Rollen: Eigentümer, Ersteller, Bearbeiter, Betrachter, Kommentator, Benutzerdefinierte Rollen. +- ⚡ Zugriffskontrolle: Feingliedrige Zugangskontrolle auch bei Datenbank-, Tabellen- und Spaltenebene. -### App Store für Workflow-Automationen +### App-Store für Workflow-Automationen -- ⚡ Chat: Microsoft-Teams, Slack, Discord, Materie +- ⚡ Chat: Microsoft Teams, Slack, Discord, Mattermost - ⚡ E-Mail: SMTP, SES, MailChimp -- ⚡ SMS: TWILIO -- ⚡ WhatsApp. +- ⚡ SMS: Twilio +- ⚡ WhatsApp - ⚡ Jede 3rd-Party-APIs ### Programmatischer API-Zugriff über - ⚡ Rest APIs (Swagger) -- ⚡ Graphql-APIs. -- ⚡ Enthält die JWT-Authentifizierung & Social Auth -- ⚡ API-Token, um mit Zapier, Integromat zu integrieren. +- ⚡ Graphql-APIs +- ⚡ Enthält JWT-Authentifizierung & Social Auth +- ⚡ API-Tokens für die Integration mit Zapier, Integromat. -# Produktionseinrichtung +# Produktivaufbau -NOCODB erfordert eine Datenbank zum Speichern von Metadaten, Tabellenkalkulationen und externen Datenbanken. Verbindungsparameter für diese Datenbank können in der Umgebungsvariablen der NC_DB angegeben werden. +NocoDB erfordert eine Datenbank, um Metadaten von Tabellenansichten und externen Datenbanken zu speichern. Verbindungsparameter für diese Datenbank können in der Umgebungsvariablen `NC_DB` spezifiziert werden. ## Docker @@ -196,20 +196,71 @@ docker-compose up -d ## Umgebungsvariablen -Please refer to [Environment variables](https://docs.nocodb.com/getting-started/installation#environment-variables) +Siehe [Environment variables](https://docs.nocodb.com/getting-started/installation#environment-variables) # Entwicklungsaufbau -Please refer to [Development Setup](https://github.com/nocodb/nocodb/tree/master#development-setup) +## Projekt kopieren -# Beitragen +```shell +git clone https://github.com/nocodb/nocodb +cd nocodb +``` + +## Backend lokal ausführen + +```shell +cd packages/nocodb +npm install +npm run watch:run +# localhost:8080/dashboard im Browser aufrufen +``` + +## Frontend lokal ausführen + +```shell +cd packages/nc-gui +npm install +npm run dev +# localhost:3000/dashboard iM Browser aufrufen +``` + +Änderungen am Code starten automatisch neu. + +> nocodb/packages/nocodb enthält nc-lib-gui, die entwickelte Version von nc-gui, die in der npm-Registry gehostet wird. Sie können localhost:8000/dashboard im Browser aufrufen, nachdem Sie das Backend lokal gestartet haben, wenn Sie nur das Backend ändern möchten. + + +## Cypress-Tests lokal ausführen + +```shell +# install dependencies (cypress) +npm install + +# MySQL-Datenbank mit der benötigten Datenbank mit Docker Compose ausführen +docker-compose -f ./scripts/docker-compose-cypress.yml up + +# Backend API mit folgendem Befehl ausführen +npm run start:api + +# Frontend Web-UI mit folgendem Befehl ausführen +npm run start:web + +# Warten, bis die beiden Ports 3000 und 8000 verfügbar sind, +# dann Cypress Test mit diesem Befehl ausführen +npm run cypress:run + +# Oder diesen Befehl ausführen, um die GUI auszuführen +npm run cypress:open +``` + +# Beiträge -Please refer to [Contribution Guide](https://github.com/nocodb/nocodb/blob/master/.github/CONTRIBUTING.md). +Siehe [Contribution Guide](https://github.com/nocodb/nocodb/blob/master/.github/CONTRIBUTING.md). # Warum bauen wir das auf? -Die meisten Internet-Unternehmen rüsten sich mit einer Tabelle oder einer Datenbank aus, um ihre Geschäftsanforderungen zu lösen. Die Tabellenkalkulationen werden von einer Milliarde + Menschen mit einem jeden Tag kollaborativ verwendet. Wir arbeiten jedoch mit ähnlichen Geschwindigkeiten in Datenbanken, die in Bezug auf das Berechnen viel stärkere Werkzeuge sind. Versuche, dies mit SaaS-Angeboten zu lösen, bedeutete schreckliche Zugangskontrollen, Anbieter-Lockin, Daten-Lockin, abrupte Preisänderungen und vor allem eine Glaskugel, was in Zukunft möglich ist. +Die meisten Internet-Unternehmen verwenden entweder eine Tabellenkalkulation oder eine Datenbank, um ihre Geschäftsanforderungen zu erfüllen. Tabellenkalkulationen werden jeden Tag von mehr als einer Milliarde Menschen für die Zusammenarbeit genutzt. Wir sind jedoch weit davon entfernt, mit einer ähnlichen Geschwindigkeit an Datenbanken zu arbeiten, die weitaus leistungsfähigere Werkzeuge für die Datenverarbeitung sind. Versuche, dieses Problem mit SaaS-Angeboten zu lösen, bedeutete schreckliche Zugangskontrollen, Anbieterbindungen, Datenbindungen, plötzliche Preisänderungen und vor allem einen Blick in die Glaskugel, was in Zukunft möglich sein wird. # Unsere Aufgabe -Unsere Mission ist es, die leistungsstärkste No-Code-Schnittstelle für Datenbanken bereitzustellen, die für jedes einzelne Internetgeschäft der Welt nutzbar ist. Dies würde nicht nur den Zugang zu einem leistungsstarken Computing-Tool demokratisieren, sondern auch eine Milliarde + Menschen hervorbringen, die im Internet radikale Bastel- und Baufähigkeiten haben werden. +Unser Ziel ist es, die leistungsstärkste No-Code-Schnittstelle für Datenbanken, welche Open Source ist, für jedes einzelne Internet-Unternehmen in der Welt bereitzustellen. Dies würde nicht nur den Zugang zu einem leistungsstarken Computerwerkzeug demokratisieren, sondern auch mehr als eine Milliarde Menschen hervorbringen, die über radikale Bastel- und Konstruktionsfähigkeiten im Internet verfügen werden. From 947570e265da3ab5f4c8e07a2e1a9cd11862f1d8 Mon Sep 17 00:00:00 2001 From: Raju Udava <86527202+dstala@users.noreply.github.com> Date: Thu, 3 Mar 2022 10:37:48 +0530 Subject: [PATCH 36/49] chore: i18n translations-fr Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> --- packages/nc-gui/lang/fr.json | 288 +++++++++++++++++------------------ 1 file changed, 144 insertions(+), 144 deletions(-) diff --git a/packages/nc-gui/lang/fr.json b/packages/nc-gui/lang/fr.json index 4e66cc383b..cd3d9de657 100644 --- a/packages/nc-gui/lang/fr.json +++ b/packages/nc-gui/lang/fr.json @@ -27,14 +27,14 @@ "hide": "Cacher", "showAll": "Afficher tout", "hideAll": "Cacher tout", - "showMore": "Montre plus", + "showMore": "Montrer plus", "showOptions": "Afficher les options", "hideOptions": "Masquer les options", "showMenu": "Afficher le menu", "hideMenu": "Masquer le menu", "addAll": "Tout ajouter", - "removeAll": "Enlever tout", - "signUp": "Déconnexion", + "removeAll": "Tout retirer", + "signUp": "Inscription", "signIn": "Connexion", "signOut": "Se déconnecter", "required": "Requise", @@ -42,36 +42,36 @@ "mandatory": "Obligatoire", "loading": "Chargement ...", "title": "Titre", - "upload": "Télécharger", + "upload": "Téléverser", "download": "Télécharger", "default": "Défaut", - "more": "Suite", + "more": "Plus", "less": "Moins", "event": "Événement", - "condition": "État", + "condition": "Condition", "after": "Après", - "before": "Avant de", + "before": "Avant", "search": "Rechercher", "notification": "Notification", "reference": "Référence", - "function": "Une fonction" + "function": "Fonction" }, "objects": { "project": "Projet", "projects": "Projets", "table": "Tableau", - "tables": "les tables", - "field": "Domaine", - "fields": "Des champs", + "tables": "Tableaux", + "field": "Champ", + "fields": "Champs", "column": "Colonne", "columns": "Colonnes", "page": "Page", "pages": "Pages", - "record": "Enregistrement", - "records": "Record", + "record": "Entrée", + "records": "Entrées", "webhook": "Webhook", "webhooks": "Webhooks", - "view": "Voir", + "view": "Vue", "views": "Vues", "viewType": { "grid": "Grille", @@ -83,31 +83,31 @@ "user": "Utilisateur", "users": "Utilisateurs", "role": "Rôle", - "roles": "Les rôles", + "roles": "Rôles", "roleType": { "owner": "Propriétaire", "creator": "Créateur", "editor": "Éditeur", "commenter": "Commentateur", - "viewer": "Téléspectateur" + "viewer": "Spectateur" } }, "datatype": { - "ID": "identifiant", + "ID": "Identifiant", "ForeignKey": "Clé étrangère", - "SingleLineText": "Texte unique", + "SingleLineText": "Texte court (une ligne)", "LongText": "Texte long", - "Attachment": "Attachement", + "Attachment": "Pièce jointe", "Checkbox": "Case à cocher", "MultiSelect": "Sélection multiple", - "SingleSelect": "Sélectionner un seul", + "SingleSelect": "Menu déroulant", "Collaborator": "Collaborateur", "Date": "Date", - "Year": "An", + "Year": "Année", "Time": "Temps", "PhoneNumber": "Numéro de téléphone", - "Email": "E-mail", - "URL": "URL", + "Email": "Couriel", + "URL": "Lien URL", "Number": "Nombre", "Decimal": "Décimal", "Currency": "Devise", @@ -115,27 +115,27 @@ "Duration": "Durée", "Rating": "Évaluation", "Formula": "Formule", - "Rollup": "Rouler", - "Count": "Compter", + "Rollup": "Synthèse", + "Count": "Compteur", "Lookup": "Chercher", "DateTime": "Heure", - "CreateTime": "Créer du temps", - "LastModifiedTime": "Dernière heure modifiée", - "AutoNumber": "Numéro automatique", - "Barcode": "code à barre", + "CreateTime": "Date de création", + "LastModifiedTime": "Dernière modification", + "AutoNumber": "Numérotation automatique", + "Barcode": "Code barre", "Button": "Bouton", "Password": "Mot de passe", "relationProperties": { "noAction": "Pas d'action", - "cascade": "Cascade", - "restrict": "Restreindre", - "setNull": "Se mettre de null", + "cascade": "Chevauchement", + "restrict": "Limité", + "setNull": "Laisser vide", "setDefault": "Définir par defaut" } }, "filterOperation": { - "isEqual": "est égal", - "isNotEqual": "n'est pas égal", + "isEqual": "est égale", + "isNotEqual": "n'est pas égale", "isLike": "est comme", "isNot like": "N'est pas comme", "isEmpty": "est vide", @@ -146,21 +146,21 @@ "title": { "newProj": "Nouveau projet", "myProject": "Mes projets", - "formTitle": "Titre de formulaire", + "formTitle": "Intitulé du formulaire", "collabView": "Vue collaborative", "lockedView": "Vue verrouillée", "personalView": "Vue personnelle", "appStore": "Magasin d'applications", "team&auth": "Équipe & Authentification", - "rolesUserMgmt": "Roles & Gestion utilisateurs", + "rolesUserMgmt": "Rôles & Gestion utilisateurs", "userMgmt": "Gestion des utilisateurs", "apiTokenMgmt": "Gestion des jetons API", "rolesMgmt": "Gestion des rôles", "projMeta": "Métadonnées du projet", "metaMgmt": "Gestion des métadonnées", "metadata": "Métadonnées", - "exportImportMeta": "Metadata d'exportation / importation", - "uiACL": "Contrôle d'accès interface utilisateur", + "exportImportMeta": "Exporter / importer les métadonnées", + "uiACL": "Contrôle d'accès à l'interface utilisateur", "metaOperations": "Opérations de métadonnées", "audit": "Audit", "auditLogs": "Journal d'audit", @@ -169,7 +169,7 @@ "advancedParameters": "SSL et paramètres avancés", "headCreateProject": "Créer un projet | Nocodb", "headLogin": "Connexion | Nocodb", - "resetPassword": "réinitialisez votre mot de passe" + "resetPassword": "Réinitialiser le mot de passe" }, "labels": { "notifyVia": "Notifier via", @@ -177,123 +177,123 @@ "tableName": "Nom de la table", "viewName": "Vue", "viewLink": "Lien de vue", - "columnName": "Nom de colonne", + "columnName": "Nom de la colonne", "columnType": "Type de colonne", "roleName": "Nom de rôle", "roleDescription": "Description du rôle", - "databaseType": "Tapez la base de données", + "databaseType": "Écrire dans la base de données", "lengthValue": "Longueur / valeur", "dbType": "Type de base de données", - "sqliteFile": "Fichier sqlite", + "sqliteFile": "Fichier SQLite", "hostAddress": "Adresse de l'hôte", "port": "Numéro de port", "username": "Utilisateur", "password": "Mot de passe", - "action": "action", + "action": "Action", "actions": "Actions", "operation": "Opération", - "operationType": "Type de fonctionnement", - "operationSubType": "Fonctionnement Sous-type", - "description": "La description", + "operationType": "Type d'opération", + "operationSubType": "Sous-type d'opération", + "description": "Description", "authentication": "Authentification", "token": "Jeton", "where": "Où", "cache": "Cache", - "chat": "Discuter", - "email": "E-mail", + "chat": "Discussion", + "email": "Courriel", "storage": "Stockage", "uiAcl": "UI-ACL", - "models": "Des modèles", + "models": "Modèles", "syncState": "État de synchronisation", - "created": "Établi", + "created": "Créé", "sqlOutput": "Sortie SQL", "addOption": "Ajouter une option", - "aggregateFunction": "Fonction globale", - "dbCreateIfNotExists": "Base de données : la créér si elle n'existe pas", + "aggregateFunction": "Fonction agrégée", + "dbCreateIfNotExists": "Base de données : la créer si elle n'existe pas", "clientKey": "Clé client", "clientCert": "Certificat Client", - "serverCA": "serveur d'AC", - "requriedCa": "AC requise", + "serverCA": "Serveur d'authentification", + "requriedCa": "Authentification requise", "requriedIdentity": "Identité requise", "inflection": { "tableName": "Inflexion - Nom de la table", "columnName": "Inflexion - Nom de la colonne" }, "community": { - "starUs1": "Donner nous une étoile", + "starUs1": "Étoile", "starUs2": "sur Github", - "bookDemo": "Planifier une démo gratuite", + "bookDemo": "Planifier une démonstration gratuite", "getAnswered": "Obtenir des réponses à vos questions", - "joinDiscord": "Join Discord", - "joinReddit": "Join /r/NocoDB", + "joinDiscord": "Rejoindre le serveur Discord", + "joinReddit": "Rejoindre /r/NocoDB", "followNocodb": "Suivre NocoDB" }, "docReference": "Référence de document", "selectUserRole": "Sélectionnez le rôle d'utilisateur", "childTable": "Table enfant", "childColumn": "Colonne enfant", - "onUpdate": "Sur la mise à jour", - "onDelete": "Sur Supprimer" + "onUpdate": "Mise à jour en cours", + "onDelete": "Suppression en cours" }, "activity": { "createProject": "Créer un projet", - "importProject": "Projet d'importation", + "importProject": "Importer un projet", "searchProject": "Rechercher un projet", - "editProject": "Editer le projet", + "editProject": "Éditer le projet", "stopProject": "Arrêter le projet", "startProject": "Démarrer le projet", "restartProject": "Redémarrer le projet", "deleteProject": "Supprimer le projet", - "refreshProject": "Rafraichir les projets", + "refreshProject": "Actualiser les projets", "saveProject": "Enregistrer le projet", "createProjectExtended": { - "extDB": "Créer en se connectant
à une base de données", - "excel": "Créer un projet d'Excel", - "template": "Créer un projet à partir du modèle" + "extDB": "Créer en se connectant
à une base de données externe", + "excel": "Créer un projet depuis Excel", + "template": "Créer un projet à partir d'un modèle" }, - "OkSaveProject": "Projet OK et sauvegarder", + "OkSaveProject": "Valider et enregistrer le projet", "upgrade": { - "available": "Mise à niveau disponible", + "available": "Mise à jour disponible", "releaseNote": "Notes de version", - "howTo": "Comment mettre à niveau?" + "howTo": "Comment mettre à jour ?" }, - "translate": "Aide à traduire", + "translate": "Aider à la traduction", "account": { - "authToken": "Copier Auth Jeton", + "authToken": "Copier le jeton d'authentification", "swagger": "APIS SWAGGER DOC", "projInfo": "Copier les informations du projet", "themes": "Thèmes" }, - "sort": "Sorte", + "sort": "Trier", "addSort": "Ajouter une option de tri", "filter": "Filtre", - "addFilter": "Filtre", + "addFilter": "Ajouter un filtre", "share": "Partager", "shareBase": { "disable": "Désactiver la base partagée", "enable": "N'importe qui avec le lien", - "link": "Lien de base partagé" + "link": "Partager le lien de la base" }, "invite": "Inviter", "inviteMore": "Inviter plus", "inviteTeam": "Inviter une équipe", - "inviteToken": "Inviter jeton", + "inviteToken": "Inviter via un jeton", "newUser": "Nouvel utilisateur", "editUser": "Modifier l'utilisateur", "deleteUser": "Supprimer l'utilisateur du projet", "resendInvite": "Renvoyer une invitation par e-mail", "copyInviteURL": "Copier l'URL d'invitation", "newRole": "Nouveau rôle", - "reloadRoles": "Rôles de rechargement", + "reloadRoles": "Actualiser les rôles", "nextPage": "Page suivante", "prevPage": "Page précédente", - "nextRecord": "Record", - "previousRecord": "Enregistrement précédent", + "nextRecord": "Prochain enregistrement", + "previousRecord": "Précédent enregistrement", "copyApiURL": "Copier l'URL de l'API", - "createTable": "Créer une table", - "refreshTable": "Tables rafraîchir", - "renameTable": "Table Renommer", - "deleteTable": "Tableau Supprimer", + "createTable": "Créer un tableau", + "refreshTable": "Actualiser le tableau", + "renameTable": "Renommer le tableau", + "deleteTable": "Supprimer le tableau", "addField": "Ajouter un nouveau champ à cette table", "setPrimary": "Définir comme valeur primaire", "addRow": "Ajouter une nouvelle ligne", @@ -301,9 +301,9 @@ "insertRow": "Insérer une nouvelle ligne", "deleteRow": "Supprimer la ligne", "deleteSelectedRow": "Supprimer les lignes sélectionnées", - "importExcel": "Importer Excel", + "importExcel": "Importer depuis Excel", "downloadCSV": "Télécharger comme CSV", - "uploadCSV": "Télécharger csv", + "uploadCSV": "Téléverser un CSV", "import": "Importer", "importMetadata": "Importer les métadonnées", "exportMetadata": "Exporter les métadonnées", @@ -312,33 +312,33 @@ "changePwd": "Changer le mot de passe", "createView": "Créer une vue", "shareView": "Partager la vue", - "listSharedView": "Liste de visualisation partagée", + "listSharedView": "Liste de vues partagées", "ListView": "Liste des vues", "copyView": "Copier la vue", "renameView": "Renommer la vue", "deleteView": "Supprimer la vue", - "createGrid": "Créer une vue de grille", - "createGallery": "Créer une vue de la galerie", + "createGrid": "Créer une vue grille", + "createGallery": "Créer une vue galerie", "createCalendar": "Créer une vue calendrier", "createKanban": "Créer une vue kanban", - "createForm": "Créer une vue de formulaire", + "createForm": "Créer une vue formulaire", "showSystemFields": "Afficher les champs système", "copyUrl": "Copier le lien", "openTab": "Ouvrir nouvel onglet", - "iFrame": "Copier le code HTML incorporable", - "addWebhook": "Ajouter une nouvelle webhook", - "newToken": "Ajouter de nouveaux jetons", - "exportZip": "Exportation zip", - "importZip": "Importer zip", + "iFrame": "Copier le code HTML intégré", + "addWebhook": "Ajout de webhook", + "newToken": "Ajout de nouveau jeton", + "exportZip": "Exporter un zip", + "importZip": "Importer un zip", "metaSync": "Synchroniser maintenant", "settings": "Paramètres", - "previewAs": "Aperçu comme", + "previewAs": "Aperçu", "resetReview": "Réinitiliser l'aperçu", - "testDbConn": "Test la connexion à la base de données", + "testDbConn": "Tester la connexion à la base de données", "removeDbFromEnv": "Supprimer la base de données de l'environement", - "editConnJson": "Editer le JSON de la connexion", - "sponsorUs": "Parrainez-nous", - "sendEmail": "Envoyer un email" + "editConnJson": "Éditer le JSON de connexion", + "sponsorUs": "Nous Parrainer", + "sendEmail": "ENVOYER UN EMAIL" }, "tooltip": { "saveChanges": "Sauvegarder les modifications", @@ -347,8 +347,8 @@ "apiRest": "Accessible via l'API REST", "apiGQL": "Accessible via l'API GraphQL", "theme": { - "dark": "Il vient en noir (^ ^b)", - "light": "Vient-il en noir? (^ ⇧b)" + "dark": "Nuit (^⇧B)", + "light": "Jour (^⇧B)" }, "addTable": "Ajouter une nouvelle table", "inviteMore": "Inviter plus d'utilisateurs", @@ -356,17 +356,17 @@ "reloadApiToken": "Recharger les jetons API", "generateNewApiToken": "Générer de nouveaux jetons d'API", "addRole": "Ajouter un nouveau rôle", - "reloadList": "Liste de rechargement", + "reloadList": "Actualiser la liste", "metaSync": "Synchroniser des métadonnées", "sqlMigration": "Recharger des migrations", "updateRestart": "Mettre à jour et redémarrer", - "cancelReturn": "Annuler et revenir", + "cancelReturn": "Annuler et revenir en arrière", "exportMetadata": "Exportez toutes les métadonnées des méta-tables vers le répertoire Meta.", "importMetadata": "Importer toutes les métadonnées du répertoire Meta en méta-tables.", "clearMetadata": "Effacer toutes les métadonnées des méta-tables.", - "clientKey": "Selectionner le fichier .key", - "clientCert": "Selectionner le fichier .cert", - "clientCA": "Selectionner le fichier CA" + "clientKey": "Selectionner un fichier .key", + "clientCert": "Selectionner un fichier .cert", + "clientCA": "Selectionner un fichier d'authentification" }, "placeholder": { "projName": "Saisir le nom du projet", @@ -377,20 +377,20 @@ "save": "Enregistrer le mot de passe", "confirm": "Confirmer le nouveau mot de passe" }, - "searchProjectTree": "Tables de recherche", + "searchProjectTree": "Chercher un tableau", "searchFields": "Champ de recherche", "searchColumn": "Recherche {recherche} colonne", - "searchApps": "Applications de recherche", - "searchModels": "Modèles de recherche", + "searchApps": "Chercher une application", + "searchModels": "Chercher un modèle", "noItemsFound": "Aucun élément trouvé", "defaultValue": "Valeur par défaut", - "filterByEmail": "Filtrer par e-mail" + "filterByEmail": "Filtrer par courriel" }, "msg": { "info": { - "footerInfo": "Rangées par page", - "upload": "Sélectionnez Fichier pour télécharger", - "upload_sub": "ou fichier glisser-déposer", + "footerInfo": "Lignes par page", + "upload": "Sélectionnez un fichier à téléverser", + "upload_sub": "ou glisser-déposer un fichier", "excelSupport": "Pris en charge: .xls, .xlsx, .xlsm, .Ods, .ots", "excelURL": "Entrez l'URL du fichier Excel", "footMsg": "Nombre de lignes à analyser pour déduire le type de données", @@ -399,27 +399,27 @@ "importMetadata": "Voulez-vous importer des métadonnées des méta-tables?", "clearMetadata": "Voulez-vous effacer les métadonnées des méta-tables?", "projectEmptyMessage": "Commencer par créer un nouveau projet", - "stopProject": "Voulez-vous arrêter le projet?", - "startProject": "Voulez-vous commencer le projet?", - "restartProject": "Voulez-vous redémarrer le projet?", - "deleteProject": "Voulez-vous supprimer le projet?", - "shareBasePrivate": "Générer une base réadonnée partageable partageable", - "shareBasePublic": "Toute personne sur Internet avec ce lien peut voir", - "userInviteNoSMTP": "On dirait que vous n'avez pas encore configuré Mailer! \\ n S'il vous plaît copier ci-dessus inviter lien et l'envoyer à", + "stopProject": "Voulez-vous arrêter le projet ?", + "startProject": "Voulez-vous démarrer le projet ?", + "restartProject": "Voulez-vous redémarrer le projet ?", + "deleteProject": "Voulez-vous supprimer le projet ?", + "shareBasePrivate": "Générer une base partagée en lecture seule", + "shareBasePublic": "Toute personne avec ce lien peut consulter", + "userInviteNoSMTP": "On dirait que vous n'avez pas encore configuré Mailer! \\ n Merci de copier-coller le lien d'invitation ci-dessous et l'envoyer à", "dragDropHide": "Glisser et déposer des champs ici pour masquer", - "formInput": "Entrez le formulaire étiquette d'entrée", - "formHelpText": "Ajouter du texte d'aide", + "formInput": "Entrer le libelé du formulaire", + "formHelpText": "Ajouter du texte d'assitance", "onlyCreator": "Visible uniquement pour les créateurs", - "formDesc": "Ajouter un formulaire Description", + "formDesc": "Ajouter un formulaire de description", "beforeEnablePwd": "Restreindre l’accès à l’aide d’un mot de passe", "afterEnablePwd": "L’accès est restreint par un mot de passe", - "privateLink": "Cette vue est partagée via un lien privé", + "privateLink": "Cette vue est partagée avec un lien privé", "privateLinkAdditionalInfo": "Les personnes ayant le lien privé peuvent voir uniquement les cellules visibles de cette vue", - "afterFormSubmitted": "Après le formulaire est soumis", + "afterFormSubmitted": "Après que le formulaire est soumis", "apiOptions": "Accéder au projet via", "submitAnotherForm": "Afficher le bouton \"Soumettre un autre formulaire\"", "showBlankForm": "Montrer un formulaire vierge après 5 secondes", - "emailForm": "E-mail moi à", + "emailForm": "Écrivez-moi à", "showSysFields": "Afficher les champs système", "filterAutoApply": "Appliquer automatiquement", "showMessage": "Montrer ce message", @@ -435,19 +435,19 @@ "viewerDesc": "Peut voir les enregistrements mais ne peut rien éditer", "addUser": "Ajouter un nouvel utilisateur", "staticRoleInfo": "Les rôles définis du système ne peuvent pas être modifiés", - "exportZip": "Export Project Meta vers Zip Fichier et télécharger.", - "importZip": "Importer le projet META ZIP et redémarrer.", + "exportZip": "Exporter le meta projet dans un fichier Zip et le télécharger.", + "importZip": "Importer le fichier ZIP du meta projet et redémarrer.", "importText": "Importer un projet NocoDB à partir d'un fichier ZIP de métadonnées", "metaNoChange": "Aucun changement identifié", "sqlMigration": "Les migrations de schéma seront créées automatiquement. Créez une table et rafraîchissez cette page.", "dbConnectionStatus": "Environnement validé", "dbConnected": "Connexion réussi", "notifications": { - "no_new": "pas de nouvelles notifications", - "clear": "Dégager" + "no_new": "Pas de nouvelles notifications", + "clear": "Effacer" }, "sponsor": { - "header": "Vous pouvez nous aider!", + "header": "Vous pouvez nous aider !", "message": "Nous sommes une petite équipe travaillant à plein temps pour rendre Nocodb Open-Source. Nous croyons qu'un outil comme Nocodb devrait être disponible librement à chaque solveur de problèmes sur Internet." }, "loginMsg": "Se connecter à NocoDB", @@ -458,7 +458,7 @@ }, "signUp": { "superAdmin": "Vous serez le 'super admin'", - "alreadyHaveAccount": "Vous avez déjà un compte ?", + "alreadyHaveAccount": "Avez-vous déjà un compte ?", "workEmail": "Saisir votre adresse email professionnel", "enterPassword": "Saisir votre mot de passe", "forgotPassword": "Mot de passe oublié ?", @@ -486,28 +486,28 @@ "dbConnectionStatus": "Paramètres de base de données non valides", "dbConnectionFailed": "Echec de connexion :", "signUpRules": { - "emailReqd": "Adresse Email requise", - "emailInvalid": "L'adresse Email doit être valide", + "emailReqd": "Adresse mail requise", + "emailInvalid": "L'adresse mail doit être valide", "passwdRequired": "Mot de passe requis", "passwdLength": "Votre mot de passe doit contenir au moins 8 caractères" } }, "toast": { - "exportMetadata": "Les métadonnées de projet ont exporté avec succès", - "importMetadata": "Les métadonnées du projet ont importé avec succès", - "clearMetadata": "Les métadonnées du projet ont effacé avec succès", + "exportMetadata": "Les métadonnées de projet sont exportée avec succès", + "importMetadata": "Les métadonnées du projet sont importée avec succès", + "clearMetadata": "Les métadonnées du projet sont effacée avec succès", "stopProject": "Projet arrêté avec succès", - "startProject": "Projet a commencé avec succès", + "startProject": "Projet démarré avec succès", "restartProject": "Projet redémarré avec succès", "deleteProject": "Projet supprimé avec succès", - "authToken": "Auth Token copié dans le presse-papiers", - "projInfo": "Informations de projet copiées au presse-papier", - "inviteUrlCopy": "Envoi d'une URL d'invitation copiée dans le presse-papier", - "createView": "Voir créé avec succès", + "authToken": "Auth Token copié dans le presse-papier", + "projInfo": "Informations de projet copiées dans le presse-papier", + "inviteUrlCopy": "URL d'invitation copiée dans le presse-papier", + "createView": "Vue créé avec succès", "formEmailSMTP": "Veuillez activer le plugin SMTP dans l'App Store pour permettre la notification par courrier électronique", - "collabView": "Passé avec succès à la vision collaborative", - "lockedView": "Passé avec succès à la vue verrouillée", - "futureRelease": "Bientôt disponible!" + "collabView": "Vous êtes bien dans la vue collaborative", + "lockedView": "Vous êtes bien dans la vue vérouillée", + "futureRelease": "Bientôt disponible !" } } } From 8ce5622ff70a7e42af98ce49dbdbfaf9d7c4a214 Mon Sep 17 00:00:00 2001 From: Oskars Pakers Date: Fri, 4 Mar 2022 09:40:55 +0200 Subject: [PATCH 37/49] feat: #1405 Latvian language support Signed-off-by: Oskars Pakers --- packages/nc-gui/lang/lv.json | 513 +++++++++++++++++++++++++++++++++++ 1 file changed, 513 insertions(+) create mode 100644 packages/nc-gui/lang/lv.json diff --git a/packages/nc-gui/lang/lv.json b/packages/nc-gui/lang/lv.json new file mode 100644 index 0000000000..3024041c1a --- /dev/null +++ b/packages/nc-gui/lang/lv.json @@ -0,0 +1,513 @@ +{ + "general": { + "home": "Sākumlapa", + "load": "Ielādēt", + "open": "Atvērt", + "close": "Aizvērt", + "yes": "Jā", + "no": "Nē", + "ok": "OK", + "and": "Un", + "or": "Vai", + "add": "Pievienot", + "edit": "Labot", + "remove": "Noņemt", + "save": "Saglabāt", + "cancel": "Atcelt", + "submit": "Iesniegt", + "create": "Izveidot", + "insert": "Ievietot", + "delete": "Izdzēst", + "update": "Atjaunot", + "rename": "Pārsaukt", + "reload": "Pātlādēt", + "reset": "Atiestatīt", + "install": "Instalēt", + "show": "Parādīt", + "hide": "Paslēpt", + "showAll": "Parādīt visu", + "hideAll": "Paslēpt visu", + "showMore": "Parādīt vairāk", + "showOptions": "Parādīt iespējas", + "hideOptions": "Paslēpt iespējas", + "showMenu": "Parādīt izvēlni", + "hideMenu": "Paslēpt izvēlni", + "addAll": "Pievienot visu", + "removeAll": "Paslēpt visu", + "signUp": "PIEREĢISTRĒTIES", + "signIn": "PIESLĒGTIES", + "signOut": "Atteikties", + "required": "Obligāts", + "preferred": "Vēlams", + "mandatory": "Obligāts", + "loading": "Uzgaidiet ...", + "title": "Nosaukums", + "upload": "Augšupielādēt", + "download": "Lejupielādēt", + "default": "Noklusējums", + "more": "Vairāk", + "less": "Mazāk", + "event": "Notikums", + "condition": "Nosacījums", + "after": "Pēc", + "before": "Pirms", + "search": "Meklēt", + "notification": "Paziņojums", + "reference": "Atsauce", + "function": "Funkcija" + }, + "objects": { + "project": "Projekts", + "projects": "Projekti", + "table": "Tabula", + "tables": "Tabulas", + "field": "Lauks", + "fields": "Lauki", + "column": "Kolonna", + "columns": "Kolonnas", + "page": "Lapa", + "pages": "Lapas", + "record": "Ieraksts", + "records": "Ieraksti", + "webhook": "Webhook", + "webhooks": "Webhooks", + "view": "Skatījums", + "views": "Skatījumi", + "viewType": { + "grid": "Režģis", + "gallery": "Galerija", + "form": "Forma", + "kanban": "Kanban", + "calendar": "Kalendārs" + }, + "user": "Lietotājs", + "users": "Lietotāji", + "role": "Loma", + "roles": "Lomas", + "roleType": { + "owner": "Īpašnieks", + "creator": "Autors", + "editor": "Redaktors", + "commenter": "Komentētājs", + "viewer": "Skatītājs" + } + }, + "datatype": { + "ID": "ID", + "ForeignKey": "Ārējā atslēga", + "SingleLineText": "Vienrindas teksts", + "LongText": "Garš teksts", + "Attachment": "Pielikums", + "Checkbox": "Izvēles rūtiņa", + "MultiSelect": "Vairākas izvēles", + "SingleSelect": "Viena izvēle", + "Collaborator": "Līdzstrādnieks", + "Date": "Datums", + "Year": "Gads", + "Time": "Laiks", + "PhoneNumber": "Tālruņa numurs", + "Email": "E-pasts", + "URL": "URL", + "Number": "Skaitlis", + "Decimal": "Decimālskaitlis", + "Currency": "Valūta", + "Percent": "Procenti", + "Duration": "Ilgums", + "Rating": "Vērtējums", + "Formula": "Formula", + "Rollup": "Apkopojums", + "Count": "Skaits", + "Lookup": "Uzmeklēšana", + "DateTime": "Datums un laiks", + "CreateTime": "Izveidošanas laiks", + "LastModifiedTime": "Modificēšanas laiks", + "AutoNumber": "Automātiska numerācija", + "Barcode": "Svītru kods", + "Button": "Poga", + "Password": "Parole", + "relationProperties": { + "noAction": "nekāda darbība", + "cascade": "Kaskāde", + "restrict": "Ierobežot", + "setNull": "Iestatīt NULL", + "setDefault": "Iestatīt Noklusēto vērtību" + } + }, + "filterOperation": { + "isEqual": "ir vienāds", + "isNotEqual": "nav vienāds", + "isLike": "ir līdzīgs", + "isNot like": "nav līdzīgs", + "isEmpty": "ir tukšs", + "isNotEmpty": "nav tukšs", + "isNull": "ir null", + "isNotNull": "nav null" + }, + "title": { + "newProj": "Jauns projekts", + "myProject": "Mani projekti", + "formTitle": "Formas nosaukums", + "collabView": "Līdzstrādnieka skats", + "lockedView": "Bloķētais skats", + "personalView": "Personīgais skats", + "appStore": "Veikals", + "team&auth": "Komanda & Autentifikācija", + "rolesUserMgmt": "Lomas & Lietotāju pārvaldība", + "userMgmt": "Lietotāju pārvaldība", + "apiTokenMgmt": "API Atslēgu pārvaldība", + "rolesMgmt": "Lomu pārvaldība", + "projMeta": "Projekta metadati", + "metaMgmt": "Meta pārvaldība", + "metadata": "Metadati", + "exportImportMeta": "Eksportēt/ Importēt Metadatus", + "uiACL": "UI Pieejas kontrole", + "metaOperations": "Metadatu operācijas", + "audit": "Auditācija", + "auditLogs": "Auditācijas pieraksti", + "sqlMigrations": "SQL Migrācijas", + "dbCredentials": "Datubāzes pieslēguma parametri", + "advancedParameters": "SSL & Paplašinātie parametri", + "headCreateProject": "Izveidot projektu | NocoDB", + "headLogin": "Pieslēgties | NocoDB", + "resetPassword": "Atjaunot paroli" + }, + "labels": { + "notifyVia": "Paziņot izmantojot", + "projName": "Projekta nosaukums", + "tableName": "Tabulas nosaukums", + "viewName": "Skata nosaukums", + "viewLink": "Skata saite", + "columnName": "Kolonnas nosaukums", + "columnType": "Kolonnas tips", + "roleName": "Lomas nosaukums", + "roleDescription": "Lomas apraksts", + "databaseType": "Tips datubāzē", + "lengthValue": "Garums/ Vērtība", + "dbType": "Datubāzes tips", + "sqliteFile": "SQLite Datne", + "hostAddress": "Saimniekdatora adrese", + "port": "Porta numurs", + "username": "Lietotājvārds", + "password": "Parole", + "action": "Darbība", + "actions": "Darbības", + "operation": "Operācija", + "operationType": "Operācijas tips", + "operationSubType": "Operācijas apakštips", + "description": "Apraksts", + "authentication": "Autentifikācija", + "token": "Atslēga", + "where": "Kur", + "cache": "Kešatmiņa", + "chat": "Čats", + "email": "E-pasts", + "storage": "Glabātuve", + "uiAcl": "UI-ACL", + "models": "Modeļi", + "syncState": "Sinhronizācijas stāvoklis", + "created": "Izveidots", + "sqlOutput": "SQL izvade", + "addOption": "Pievienot iespēju", + "aggregateFunction": "Agregācijas funkcija", + "dbCreateIfNotExists": "Datubāze : izveidotm ja neeksistē", + "clientKey": "Klienta atslēga", + "clientCert": "Klienta sertifikāts", + "serverCA": "Server CA", + "requriedCa": "Required-CA", + "requriedIdentity": "Required-IDENTITY", + "inflection": { + "tableName": "Inflection - Table name", + "columnName": "Inflection - Column name" + }, + "community": { + "starUs1": "Atzīmē", + "starUs2": "mūs Github", + "bookDemo": "Rezervē bezmaksas DEMO", + "getAnswered": "Saņemt atbildi uz jautājumiem", + "joinDiscord": "Pievienoties Discord", + "joinReddit": "Pievienoties /r/NocoDB", + "followNocodb": "Sekot NocoDB" + }, + "docReference": "Dokumenta atsauce", + "selectUserRole": "Izvēlēties lietotāja lomu", + "childTable": "Apakštabula", + "childColumn": "Apakškolonna", + "onUpdate": "Atjaunojot", + "onDelete": "Dzēšot" + }, + "activity": { + "createProject": "Izveidot projektu", + "importProject": "Importēt projektu", + "searchProject": "Meklēt projektu", + "editProject": "Rediģēt projektu", + "stopProject": "Apturēt projektu", + "startProject": "Sākt projektu", + "restartProject": "Pārstartēt projektu", + "deleteProject": "Dzēst projektu", + "refreshProject": "Atjaunot projektu", + "saveProject": "Saglabāt projektu", + "createProjectExtended": { + "extDB": "Izveidot pieslēdzoties
ārējai datubāzei", + "excel": "Izveidot projektu no Excel", + "template": "Izveidot projektu no šablona" + }, + "OkSaveProject": "Apstiprināt & Saglabāt projektu", + "upgrade": { + "available": "Pieejams atjauninājums", + "releaseNote": "Laidiena piezīmes", + "howTo": "Kā atjaunot ?" + }, + "translate": "Palīdzi ar tulkojumu", + "account": { + "authToken": "Kopēt pieslēgšanās talonu", + "swagger": "Swagger APIs Doc", + "projInfo": "Kopēt projekta informāciju", + "themes": "Tēmas" + }, + "sort": "Kārtot", + "addSort": "Pievienot kārtošanas iespēju", + "filter": "Filtrēt", + "addFilter": "Pievienot filtru", + "share": "Koplietot", + "shareBase": { + "disable": "Atspējot koplietošanu", + "enable": "Jebkurš ar saiti", + "link": "Koplietota pamatsaite" + }, + "invite": "Uzaicināt", + "inviteMore": "Uzaicināt vēl", + "inviteTeam": "Uzaicināt komandu", + "inviteToken": "Uzaicināšanas talons", + "newUser": "Jauns lietotājs", + "editUser": "Rediģēt lietotāju", + "deleteUser": "Noņemt lietotāju no projektu", + "resendInvite": "Atkārtoti nosūtīt uzaicinājumu", + "copyInviteURL": "Kopēt uzaicinājuma saiti", + "newRole": "Jauna loma", + "reloadRoles": "Pārlādēt lomas", + "nextPage": "Nākošā lapa", + "prevPage": "Iepriekšējā lapa", + "nextRecord": "Nākošais ieraksts", + "previousRecord": "Iepriekšējais ieraksts", + "copyApiURL": "Kopēt API saiti", + "createTable": "Tabulas izveidošana", + "refreshTable": "Tabulas atsvaidzināšana", + "renameTable": "Tabulas pārdēvēšana", + "deleteTable": "Tabulas dzēšana", + "addField": "Jauna lauka pievienošana", + "setPrimary": "Uzstādīt kā primāro atslēgu", + "addRow": "Pievienot ierakstu", + "saveRow": "Saglabāt ierakstu", + "insertRow": "Pievienot jaunu ierakstu", + "deleteRow": "Dzēst ierakstu", + "deleteSelectedRow": "Dzēst izvēlētos ierakstus", + "importExcel": "Importēt Excel", + "downloadCSV": "Lejupielādēt kā CSV", + "uploadCSV": "Augšupielādēt CSV", + "import": "Importēt", + "importMetadata": "Importēt metadatus", + "exportMetadata": "Eksportēt metadatus", + "clearMetadata": "Nodzēst metadatus", + "exportToFile": "Eksportēt failā", + "changePwd": "Mainīt paroli", + "createView": "Veidot skatu", + "shareView": "Koplietot skatu", + "listSharedView": "Koplietoto skatu saraksts", + "ListView": "Skatu saraksts", + "copyView": "Kopēt skatu", + "renameView": "Pārsaukt skatu", + "deleteView": "Dzēst skatu", + "createGrid": "Izveidot režģa skatu", + "createGallery": "Izveidot galerijas skatu", + "createCalendar": "Izveidot kalendāra skatu", + "createKanban": "Izveidot Kanban skatu", + "createForm": "Izveidot formas skatu", + "showSystemFields": "Rādīt sistēmas laukus", + "copyUrl": "Kopēt saiti", + "openTab": "Atvērt jaunā cilnē", + "iFrame": "Kopēt ieguļamo HTML kodu", + "addWebhook": "Pievienot Webhook", + "newToken": "Jauns talons", + "exportZip": "Eksportēt zip", + "importZip": "Importēt zip", + "metaSync": "Sinhronizēt", + "settings": "Iestatījumi", + "previewAs": "Priekšskatīt kā", + "resetReview": "Atiestatīt priekšskatu", + "testDbConn": "Pārbaudīt datubāzes pieslēgumu", + "removeDbFromEnv": "Noņemt datubāzi no vides", + "editConnJson": "Rediģēt pieslēguma JSON", + "sponsorUs": "Atbalstīt mūs", + "sendEmail": "SŪTĪT E-PASTU" + }, + "tooltip": { + "saveChanges": "Saglabāt izmaiņas", + "xcDB": "Izveidot jaunu projektu", + "extDB": "Atbalsta MySQL, PostgreSQL, SQL Server & SQLite", + "apiRest": "Piekļūstams caur REST saskarnēm", + "apiGQL": "Piekļūstams caur GraphQL saskarnēm", + "theme": { + "dark": "Tumšais režīms (^⇧B)", + "light": "Gaišais režīms (^⇧B)" + }, + "addTable": "Pievienot jaunu tabulu", + "inviteMore": "Uzaicināt vairāk lietotāju", + "toggleNavDraw": "Pārslēgt izvēlni", + "reloadApiToken": "Pārlādēt API talonus", + "generateNewApiToken": "Ģenerēt jaunu API talonu", + "addRole": "Pievienot jaunu lomu", + "reloadList": "Atjaunot sarakstu", + "metaSync": "Sinhronizēt metadatus", + "sqlMigration": "Atjaunot migrācijas", + "updateRestart": "Atjaunot & pārstartēt", + "cancelReturn": "Atcelt un atgriezties", + "exportMetadata": "Eksportēt visus metadatus no tabulām uz direktoriju.", + "importMetadata": "Importēt visus metadatus no direktorija uz tabulām.", + "clearMetadata": "Notīrīt visus metadatus no tabulām.", + "clientKey": "Izvēlēties .key datni", + "clientCert": "Izvēlēties .cert datni", + "clientCA": "Izvēlēties CA datni" + }, + "placeholder": { + "projName": "Ievadīt projekta nosaukumu", + "password": { + "enter": "Ievadīt paroli", + "current": "Pašreizējā parole", + "new": "Jauna parole", + "save": "Saglabāt paroli", + "confirm": "Parole atkārtoti" + }, + "searchProjectTree": "Meklēt tabulas", + "searchFields": "Meklēt laukus", + "searchColumn": "Meklēt {search} tabulu", + "searchApps": "Meklēt lietotnes", + "searchModels": "Meklēt modeļus", + "noItemsFound": "Nav ierakstu", + "defaultValue": "Noklusētā vērtība", + "filterByEmail": "Filtrēt pēc e-pasta" + }, + "msg": { + "info": { + "footerInfo": "ieraksti lapā", + "upload": "Izvēlēties datni augšupielādei", + "upload_sub": "vai vilkt un nomest datni", + "excelSupport": "Atbalsta: .xls, .xlsx, .xlsm, .ods, .ots", + "excelURL": "Ievadīt Excel datnes saiti", + "footMsg": "# ierakstu analizēšanai lai secinātu datu tipus", + "excelImport": "lapa(s) ir pieejamas importēšanai", + "exportMetadata": "Vai tu vēlies eksportēt metadatus no tabulām?", + "importMetadata": "Vai tu vēlies importēt metadatus no tabulām?", + "clearMetadata": "Vai tu vēlies notīrīt metadatus no tabulām?", + "projectEmptyMessage": "Sāciet darbu izveidojot jaunu projektu", + "stopProject": "Vai tu vēlies pārtraukt projektu?", + "startProject": "Vai tu vēlies uzsākt projektu?", + "restartProject": "Vai tu vēlies restartēt projektu?", + "deleteProject": "Vai tu vēlies dzēst projektu?", + "shareBasePrivate": "Izveidot koplietojamu saiti", + "shareBasePublic": "Jebkurš ar šo saiti varēs skatīt", + "userInviteNoSMTP": "E-pasta nosūtītājs vēl nav konfigurēts! \\n Lūdzu kopējiet uzaicinājuma saiti augstāk un nosūtiet to", + "dragDropHide": "Vilkt un nomest laukus šeit lai noņemtu", + "formInput": "Ievadiet formas ievades lauka birku", + "formHelpText": "Pievienot norādījumus", + "onlyCreator": "Redzams tikai autoram", + "formDesc": "Pievienot formas aprakstu", + "beforeEnablePwd": "Ierobežot piekļuvi ar paroli", + "afterEnablePwd": "Piekļuve ir ierobežota ar paroli", + "privateLink": "Šis skats ir koplietots izmantojot privātu saiti", + "privateLinkAdditionalInfo": "Cilvēkiar privātu saiti var redzēt tikai šūnas šajā skatā", + "afterFormSubmitted": "Pēc formas iesniegšanas", + "apiOptions": "Piekļūt projektam caur", + "submitAnotherForm": "Parādīt 'Iesniegt vēl vienu formu' pogu", + "showBlankForm": "Parādīt tukšu formu pēc 5 sekundēm", + "emailForm": "Nosūtīt epastu man uz", + "showSysFields": "Parādīt sistēmas laukus", + "filterAutoApply": "Automātiski pielietot", + "showMessage": "Parādīt šo ziņojumu", + "viewNotShared": "Esošais skats nav koplietots!", + "showAllViews": "Parādīt visus šīs tabulas koplietotos skatus", + "collabView": "Līdzautori ar rediģēšanas vai augstākām atļaujām var mainīt šī skata konfigurāciju.", + "lockedView": "Neviens nevar rediģēt skata konfigurāciju kamēr tas ir aizslēgts.", + "personalView": "Tikai tu vari rediģēt skata konfigurāciju. Citu līdzautoru personīgie skati ir paslēpti pēc noklusējuma.", + "ownerDesc": "Var pievienot/dzēst autorus. Un pilnībā rediģēt datubāzes struktūru un laukus.", + "creatorDesc": "Var pilnībā rediģēt datubāzes struktūru un laukus.", + "editorDesc": "Var rediģēt ierakstus, bet nevar mainīt datubāzes struktūru un laukus.", + "commenterDesc": "Var skatīt un komentēt ierakstus, bet nevar neko labot", + "viewerDesc": "Var skatīt ierakstus, bet nevar neko labot", + "addUser": "Pievienot jaunu lietotāju", + "staticRoleInfo": "Sistēmas definētās lomas nevar labot", + "exportZip": "Eksportēt projekta metadatus zip arhīvā un lejupielādēt.", + "importZip": "Importēt projekta metadatus zip arhīvu un restartēt.", + "importText": "Importēt NocoDB projektu augšupielādējot metadatu zip arhīvu", + "metaNoChange": "Izmaiņas nav identificētas", + "sqlMigration": "Shēmas migrācijas tiks izveidotas automātiski. Izveidot tabulu un pārlādēt šo lapu.", + "dbConnectionStatus": "Vide apstiprināta", + "dbConnected": "Pieslēgums veiksmīgs", + "notifications": { + "no_new": "Nav jaunu paziņojumu", + "clear": "Notīrīt" + }, + "sponsor": { + "header": "Tu vari mums palīdzēt!", + "message": "Mēs esam sīka komanda, kas strādā nepārtraukti, lai nodrošinātu NocoDB atvērtā kodā. Mēs ticam, ka NocoDB rīkam ir jābūt pieejamam neierobežoti visiem problēmu risinātājiem internetā." + }, + "loginMsg": "Pieslēgties NocoDB", + "passwordRecovery": { + "message_1": "Lūdzu norādiet epasta adresi, ko izmantojāt reģistrējoties.", + "message_2": "Mēs nosūtīsim jums epastu ar saiti, lai atjaunotu paroli.", + "success": "Lūdzu pārbaudiet savu epastu, lai atjaunotu paroli" + }, + "signUp": { + "superAdmin": "Jūs būsiet 'Super Administrators'", + "alreadyHaveAccount": "Tev jau ir konts ?", + "workEmail": "Ievadiet darba epastu", + "enterPassword": "Ievadiet paroli", + "forgotPassword": "Aizmirsāt paroli ?", + "dontHaveAccount": "Tev nav konta ?" + }, + "addView": { + "grid": "Pievienot režģa skatu", + "gallery": "Pievienot galerijas skatu", + "form": "Pievienot formas skatu", + "kanban": "Pievienot Kanban skatu", + "calendar": "Pievienot kalendāra skatu" + }, + "tablesMetadataInSync": "Tabulu metadati ir sinhronizācijā", + "addMultipleUsers": "Tu vari pievienot vairākas epasta adreses atdalītas ar komatu(,)", + "enterTableName": "Ievadiet tabulas nosaukumu", + "addDefaultColumns": "Pievienot noklusētās kolonnas", + "tableNameInDb": "Tabulas nosaukums ar kādu tā tiks saglabāta datubāzē" + }, + "error": { + "searchProject": "Nav atrasti rezultāti meklējot pēc atslēgvārda {search}", + "invalidChar": "Nederīgs simbols mapes ceļā.", + "invalidDbCredentials": "Nederīgi datubāzes lietotājvārds un/vai parole.", + "unableToConnectToDb": "Nevar pieslēgties datubāzei, lūdzu pārlieciniets vai tava datubāze darbojas.", + "userDoesntHaveSufficientPermission": "Lietotājs neeksistē vai tam nav pietiekamas atļaujas lai izveidotu shēmu.", + "dbConnectionStatus": "Nederīgi datubāzes parametri", + "dbConnectionFailed": "Pieslēguma kļūda:", + "signUpRules": { + "emailReqd": "E-pasts ir obligāts", + "emailInvalid": "E-pastam ir jābūt korektam", + "passwdRequired": "Parole ir obligāta", + "passwdLength": "Parolei jābūt vismaz 8 simboli" + } + }, + "toast": { + "exportMetadata": "Projekta metadati eksportēti veiksmīgi", + "importMetadata": "Projekta metadati importēti veiksmīgi", + "clearMetadata": "Projekta metadati notīrīti veiksmīgi", + "stopProject": "Projekts apstādināts veiksmīgi", + "startProject": "Projekts uzsākts veiksmīgi", + "restartProject": "Projekts restartēts veiksmīgi", + "deleteProject": "Projekts dzēsts veiksmīgi", + "authToken": "Pieslēgšanās talons nokopēts starpliktuvē", + "projInfo": "Projekta informācija nokopēta starpliktuvē", + "inviteUrlCopy": "Uzaicinājuma saite nokopēta starpliktuvē", + "createView": "Skats izveidots veiksmīgi", + "formEmailSMTP": "Lūdzu aktivizējiet SMTP spraudni Lietotņu veikalā, lai iespējotu epasta paziņojumus", + "collabView": "Veiksmīgi pārslēgts uz sadarbības skatu", + "lockedView": "Veiksmīgi pārslēgts uz aizslēgto skatu", + "futureRelease": "Drīzumā!" + } + } +} From 37fd1a2a9c21590aebf8b5323c4d12558cf2d6bf Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 4 Mar 2022 19:05:43 +0000 Subject: [PATCH 38/49] docs: update README.md [skip ci] --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 72080a679d..126c96b08d 100644 --- a/README.md +++ b/README.md @@ -393,6 +393,9 @@ Our mission is to provide the most powerful no-code interface for databases whic
mertmit

💻
Atom Pi

💻 + +
Oskars

💻 + From 4068a4025d80c38c6930702b16f9e3bb7a3c4d4a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 4 Mar 2022 19:05:44 +0000 Subject: [PATCH 39/49] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 2e3118c10c..aa7c308192 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -639,6 +639,15 @@ "contributions": [ "code" ] + }, + { + "login": "OskarsPakers", + "name": "Oskars", + "avatar_url": "https://avatars.githubusercontent.com/u/3343347?v=4", + "profile": "https://github.com/OskarsPakers", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, From bc03f73408d11b8a13135b8e3a344df696814462 Mon Sep 17 00:00:00 2001 From: Mert Ersoy Date: Mon, 7 Mar 2022 03:06:16 +0300 Subject: [PATCH 40/49] fix: incorrect datetime for MySQL Signed-off-by: Mert Ersoy --- .../components/editableCell/dateTimePickerCell.vue | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/nc-gui/components/project/spreadsheet/components/editableCell/dateTimePickerCell.vue b/packages/nc-gui/components/project/spreadsheet/components/editableCell/dateTimePickerCell.vue index b61e32c277..1501cc7ce2 100644 --- a/packages/nc-gui/components/project/spreadsheet/components/editableCell/dateTimePickerCell.vue +++ b/packages/nc-gui/components/project/spreadsheet/components/editableCell/dateTimePickerCell.vue @@ -42,7 +42,11 @@ export default { .format('YYYY-MM-DD HH:mm') }, set(val) { - this.$emit('input', val && dayjs(val).format('YYYY-MM-DD HH:mm:ssZ')) + if(this.$parent.sqlUi.name == 'MysqlUi') { + this.$emit('input', val && dayjs(val).format('YYYY-MM-DD HH:mm:ss')) + } else { + this.$emit('input', val && dayjs(val).format('YYYY-MM-DD HH:mm:ssZ')) + } } }, parentListeners() { From 99d2c77c5e0e05ca7b6b8af6796f8326e9caba99 Mon Sep 17 00:00:00 2001 From: Mert Ersoy Date: Mon, 7 Mar 2022 03:06:33 +0300 Subject: [PATCH 41/49] feat: DATEADD formula for date arithmetics Signed-off-by: Mert Ersoy --- packages/nc-gui/helpers/formulaList.js | 1 + .../lib/sql/formulaQueryBuilderFromString.ts | 9 +++++++ .../lib/sql/functionMappings/mssql.ts | 24 +++++++++++++++++ .../lib/sql/functionMappings/mysql.ts | 26 +++++++++++++++++++ .../dataMapper/lib/sql/functionMappings/pg.ts | 24 +++++++++++++++++ .../lib/sql/functionMappings/sqlite.ts | 24 +++++++++++++++++ 6 files changed, 108 insertions(+) diff --git a/packages/nc-gui/helpers/formulaList.js b/packages/nc-gui/helpers/formulaList.js index 6a2135dc96..cf6d2b5e7b 100644 --- a/packages/nc-gui/helpers/formulaList.js +++ b/packages/nc-gui/helpers/formulaList.js @@ -55,6 +55,7 @@ const validations = { IF: { validation: { args: { min: 2, max: 3 } } }, SWITCH: { validation: { args: { min: 3 } } }, URL: { validation: { args: { rqd: 1 } } }, + DATEADD: { validation: { args: { rqd: 3 } } }, }; export default Object.keys(validations); diff --git a/packages/nocodb/src/lib/dataMapper/lib/sql/formulaQueryBuilderFromString.ts b/packages/nocodb/src/lib/dataMapper/lib/sql/formulaQueryBuilderFromString.ts index d31310403d..20d0a7d271 100644 --- a/packages/nocodb/src/lib/dataMapper/lib/sql/formulaQueryBuilderFromString.ts +++ b/packages/nocodb/src/lib/dataMapper/lib/sql/formulaQueryBuilderFromString.ts @@ -90,6 +90,15 @@ export default function formulaQueryBuilder( prevBinaryOp ); break; + case 'DATEADD': + if(pt.arguments[1].value) { + pt.callee.name = "DATE_ADD"; + return fn(pt, a, prevBinaryOp); + } else if(pt.arguments[1].operator == '-') { + pt.callee.name = "DATE_SUB"; + return fn(pt, a, prevBinaryOp); + } + break; default: { const res = mapFunctionName({ diff --git a/packages/nocodb/src/lib/dataMapper/lib/sql/functionMappings/mssql.ts b/packages/nocodb/src/lib/dataMapper/lib/sql/functionMappings/mssql.ts index dd7a207851..cc06d88561 100644 --- a/packages/nocodb/src/lib/dataMapper/lib/sql/functionMappings/mssql.ts +++ b/packages/nocodb/src/lib/dataMapper/lib/sql/functionMappings/mssql.ts @@ -88,6 +88,30 @@ const mssql = { return args.knex .raw(`CAST(${args.fn(args.pt.arguments[0])} as FLOAT)${args.colAlias}`) .wrap('(', ')'); + }, + DATE_ADD: (args: MapFnArgs) => { + return args.knex.raw( + `CASE + WHEN ${args.fn(args.pt.arguments[0])} LIKE '%:%' THEN + FORMAT(DATEADD(${String(args.fn(args.pt.arguments[2])).replace(/["']/g, "")}, + +${args.fn(args.pt.arguments[1])}, ${args.fn(args.pt.arguments[0])}), 'yyyy-MM-dd HH:mm') + ELSE + FORMAT(DATEADD(${String(args.fn(args.pt.arguments[2])).replace(/["']/g, "")}, + +${args.fn(args.pt.arguments[1])}, ${args.fn(args.pt.arguments[0])}), 'yyyy-MM-dd') + END${args.colAlias}` + ); + }, + DATE_SUB: (args: MapFnArgs) => { + return args.knex.raw( + `CASE + WHEN ${args.fn(args.pt.arguments[0])} LIKE '%:%' THEN + FORMAT(DATEADD(${String(args.fn(args.pt.arguments[2])).replace(/["']/g, "")}, + -${args.fn(args.pt.arguments[1])}.argument.value, ${args.fn(args.pt.arguments[0])}), 'yyyy-MM-dd HH:mm') + ELSE + FORMAT(DATEADD(${String(args.fn(args.pt.arguments[2])).replace(/["']/g, "")}, + -${args.fn(args.pt.arguments[1])}.argument.value, ${args.fn(args.pt.arguments[0])}), 'yyyy-MM-dd') + END${args.colAlias}` + ); } }; diff --git a/packages/nocodb/src/lib/dataMapper/lib/sql/functionMappings/mysql.ts b/packages/nocodb/src/lib/dataMapper/lib/sql/functionMappings/mysql.ts index 73e00d3ae3..c8d47834a5 100644 --- a/packages/nocodb/src/lib/dataMapper/lib/sql/functionMappings/mysql.ts +++ b/packages/nocodb/src/lib/dataMapper/lib/sql/functionMappings/mysql.ts @@ -36,6 +36,32 @@ const mysql2 = { return args.knex .raw(`CAST(${args.fn(args.pt.arguments[0])} as DOUBLE)${args.colAlias}`) .wrap('(', ')'); + }, + DATE_ADD: (args: MapFnArgs) => { + return args.knex.raw( + `CASE + WHEN ${args.fn(args.pt.arguments[0])} LIKE '%:%' THEN + DATE_FORMAT(DATE_ADD(${args.fn(args.pt.arguments[0])}, INTERVAL + ${args.fn(args.pt.arguments[1])} ${String(args.fn(args.pt.arguments[2])).replace(/["']/g, "")}), '%Y-%m-%d %H:%i') + ELSE + DATE(DATE_ADD(${args.fn(args.pt.arguments[0])}, INTERVAL + ${args.fn(args.pt.arguments[1])} ${String(args.fn(args.pt.arguments[2])).replace(/["']/g, "")})) + END${args.colAlias}` + ); + }, + DATE_SUB: (args: MapFnArgs) => { + return args.knex.raw( + `CASE + WHEN ${args.fn(args.pt.arguments[0])} LIKE '%:%' THEN + DATE_FORMAT(DATE_ADD(${args.fn(args.pt.arguments[0])}, INTERVAL + ${args.fn(args.pt.arguments[1])}.argument.value + ${String(args.fn(args.pt.arguments[2])).replace(/["']/g, "")}), '%Y-%m-%d %H:%i') + ELSE + DATE(DATE_ADD(${args.fn(args.pt.arguments[0])}, INTERVAL + ${args.fn(args.pt.arguments[1])}.argument.value + ${String(args.fn(args.pt.arguments[2])).replace(/["']/g, "")})) + END${args.colAlias}` + ); } }; diff --git a/packages/nocodb/src/lib/dataMapper/lib/sql/functionMappings/pg.ts b/packages/nocodb/src/lib/dataMapper/lib/sql/functionMappings/pg.ts index 41519fa11c..ef7fe9a091 100644 --- a/packages/nocodb/src/lib/dataMapper/lib/sql/functionMappings/pg.ts +++ b/packages/nocodb/src/lib/dataMapper/lib/sql/functionMappings/pg.ts @@ -36,6 +36,30 @@ const pg = { }` ) .wrap('(', ')'); + }, + DATE_ADD: (args: MapFnArgs) => { + return args.knex.raw( + `CASE + WHEN CAST(${args.fn(args.pt.arguments[0])} AS text) LIKE '%:%' THEN + to_char(${args.fn(args.pt.arguments[0])} + INTERVAL '${args.fn(args.pt.arguments[1])} + ${String(args.fn(args.pt.arguments[2])).replace(/["']/g, "")}', 'YYYY-MM-DD HH24:MI') + ELSE + to_char(${args.fn(args.pt.arguments[0])} + INTERVAL '${args.fn(args.pt.arguments[1])} + ${String(args.fn(args.pt.arguments[2])).replace(/["']/g, "")}', 'YYYY-MM-DD') + END${args.colAlias}` + ); + }, + DATE_SUB: (args: MapFnArgs) => { + return args.knex.raw( + `CASE + WHEN CAST(${args.fn(args.pt.arguments[0])} AS text) LIKE '%:%' THEN + to_char(${args.fn(args.pt.arguments[0])} - INTERVAL '${args.fn(args.pt.arguments[1]).argument.value} + ${String(args.fn(args.pt.arguments[2])).replace(/["']/g, "")}', 'YYYY-MM-DD HH24:MI') + ELSE + to_char(${args.fn(args.pt.arguments[0])} - INTERVAL '${args.fn(args.pt.arguments[1]).argument.value} + ${String(args.fn(args.pt.arguments[2])).replace(/["']/g, "")}', 'YYYY-MM-DD') + END${args.colAlias}` + ); } }; diff --git a/packages/nocodb/src/lib/dataMapper/lib/sql/functionMappings/sqlite.ts b/packages/nocodb/src/lib/dataMapper/lib/sql/functionMappings/sqlite.ts index d8ca5564de..74dfaa8f32 100644 --- a/packages/nocodb/src/lib/dataMapper/lib/sql/functionMappings/sqlite.ts +++ b/packages/nocodb/src/lib/dataMapper/lib/sql/functionMappings/sqlite.ts @@ -55,6 +55,30 @@ const sqlite3 = { return args.knex .raw(`CAST(${args.fn(args.pt.arguments[0])} as FLOAT)${args.colAlias}`) .wrap('(', ')'); + }, + DATE_ADD: (args: MapFnArgs) => { + return args.knex.raw( + `CASE + WHEN ${args.fn(args.pt.arguments[0])} LIKE '%:%' THEN + STRFTIME('%Y-%m-%d %H:%M', DATETIME(DATETIME(${args.fn(args.pt.arguments[0])}, 'localtime'), + '+${args.fn(args.pt.arguments[1])} ${String(args.fn(args.pt.arguments[2])).replace(/["']/g, "")}')) + ELSE + DATE(DATETIME(${args.fn(args.pt.arguments[0])}, 'localtime'), + '+${args.fn(args.pt.arguments[1])} ${String(args.fn(args.pt.arguments[2])).replace(/["']/g, "")}') + END${args.colAlias}` + ); + }, + DATE_SUB: (args: MapFnArgs) => { + return args.knex.raw( + `CASE + WHEN ${args.fn(args.pt.arguments[0])} LIKE '%:%' THEN + STRFTIME('%Y-%m-%d %H:%M', DATETIME(DATETIME(${args.fn(args.pt.arguments[0])}, 'localtime'), + '-${args.fn(args.pt.arguments[1]).argument.value} ${String(args.fn(args.pt.arguments[2])).replace(/["']/g, "")}')) + ELSE + DATE(DATETIME(${args.fn(args.pt.arguments[0])}, 'localtime'), + '-${args.fn(args.pt.arguments[1]).argument.value} ${String(args.fn(args.pt.arguments[2])).replace(/["']/g, "")}') + END${args.colAlias}` + ); } }; From b84918110c35adca035cbfd8a4cae03b45317b6e Mon Sep 17 00:00:00 2001 From: Raju Udava <86527202+dstala@users.noreply.github.com> Date: Tue, 8 Mar 2022 10:12:50 +0530 Subject: [PATCH 42/49] refactor: file indentation alignment Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> --- .../integration/common/3d_rollup_column.js | 268 +++--- .../integration/common/4b_table_view_share.js | 177 ++-- .../common/4c_form_view_detailed.js | 883 +++++++++--------- .../common/4d_table_view_grid_locked.js | 162 ++-- .../integration/common/6f_attachments.js | 224 ++--- .../integration/spec/roleValidation.spec.js | 444 ++++----- scripts/cypress/integration/test/gqlRoles.js | 18 +- .../cypress/integration/test/gqlTableOps.js | 36 +- scripts/cypress/integration/test/gqlViews.js | 26 +- scripts/cypress/integration/test/restRoles.js | 18 +- .../cypress/integration/test/restTableOps.js | 36 +- scripts/cypress/integration/test/restViews.js | 26 +- .../cypress/integration/test/xcdb-gqlRoles.js | 18 +- .../integration/test/xcdb-gqlTableOps.js | 36 +- .../cypress/integration/test/xcdb-gqlViews.js | 26 +- .../integration/test/xcdb-restRoles.js | 18 +- .../integration/test/xcdb-restTableOps.js | 36 +- scripts/cypress/support/index.js | 12 +- .../cypress/support/page_objects/mainPage.js | 4 +- 19 files changed, 1279 insertions(+), 1189 deletions(-) diff --git a/scripts/cypress/integration/common/3d_rollup_column.js b/scripts/cypress/integration/common/3d_rollup_column.js index a6ec1055c9..a6048d32e5 100644 --- a/scripts/cypress/integration/common/3d_rollup_column.js +++ b/scripts/cypress/integration/common/3d_rollup_column.js @@ -1,142 +1,140 @@ import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; export const genTest = (apiType, dbType) => { - if (!isTestSuiteActive(apiType, dbType)) return; - - describe(`${apiType.toUpperCase()} api - RollUp column`, () => { - // to retrieve few v-input nodes from their label - // - const fetchParentFromLabel = (label) => { - cy.get("label").contains(label).parents(".v-input").click(); - }; - - // Run once before test- create project (rest/graphql) - // - before(() => { - // open a table to work on views - // - cy.openTableTab("Country", 25); + if (!isTestSuiteActive(apiType, dbType)) return; + + describe(`${apiType.toUpperCase()} api - RollUp column`, () => { + // to retrieve few v-input nodes from their label + // + const fetchParentFromLabel = (label) => { + cy.get("label").contains(label).parents(".v-input").click(); + }; + + // Run once before test- create project (rest/graphql) + // + before(() => { + // open a table to work on views + // + cy.openTableTab("Country", 25); + }); + + after(() => { + cy.closeTableTab("Country"); + }); + + // Routine to create a new look up column + // + const addLookUpColumn = ( + columnName, + childTable, + childCol, + aggregateFunc + ) => { + // (+) icon at end of column header (to add a new column) + // opens up a pop up window + // + cy.get(".new-column-header").click(); + + // Column name + cy.get(".nc-column-name-input input").clear().type(`${columnName}`); + + // Column data type: to be set to rollup in this context + // Type 'Rollup' ensures item outside view is also listed (note, rollup is at bottom of scroll list) + cy.get(".nc-ui-dt-dropdown").click().type("Rollup"); + cy.getActiveMenu().contains("Rollup").click({ force: true }); + + // Configure Child table & column names + fetchParentFromLabel("Child table"); + cy.getActiveMenu().contains(childTable).click(); + + fetchParentFromLabel("Child column"); + cy.getActiveMenu().contains(childCol).click(); + + fetchParentFromLabel("Aggregate function"); + cy.getActiveMenu().contains(aggregateFunc).click(); + + cy.snipActiveMenu("RollUp"); + + // click on Save + cy.get(".nc-col-create-or-edit-card").contains("Save").click(); + + // Verify if column exists. + // + cy.get(`th:contains(${columnName})`).should("exist"); + }; + + // routine to delete column + // + const deleteColumnByName = (columnName) => { + // verify if column exists before delete + cy.get(`th:contains(${columnName})`).should("exist"); + + // delete opiton visible on mouse-over + cy.get(`th:contains(${columnName}) .mdi-menu-down`) + .trigger("mouseover") + .click(); + + // delete/ confirm on pop-up + cy.get(".nc-column-delete").click(); + cy.getActiveModal().find("button:contains(Confirm)").click(); + + // validate if deleted (column shouldnt exist) + cy.get(`th:contains(${columnName})`).should("not.exist"); + }; + + // routine to edit column + // + const editColumnByName = (oldName, newName) => { + // verify if column exists before delete + cy.get(`th:contains(${oldName})`).should("exist"); + + // delete opiton visible on mouse-over + cy.get(`th:contains(${oldName}) .mdi-menu-down`) + .trigger("mouseover") + .click(); + + // edit/ save on pop-up + cy.get(".nc-column-edit").click(); + cy.get(".nc-column-name-input input").clear().type(newName); + cy.get(".nc-col-create-or-edit-card").contains("Save").click(); + + cy.toastWait("Successfully updated alias"); + + // validate if deleted (column shouldnt exist) + cy.get(`th:contains(${oldName})`).should("not.exist"); + cy.get(`th:contains(${newName})`).should("exist"); + }; + + /////////////////////////////////////////////////// + // Test case + + it("Add Rollup column (City, CityId, sum) & Delete", () => { + addLookUpColumn("RollUpCol_2", "City", "CityId", "sum"); + + // Verify first entry, will be displayed as alias here 'childColumn (from childTable)' + // intentionally verifying 4th item, as initial items are being masked out by list scroll down + // to be fixed + // + cy.get(`tbody > :nth-child(4) > [data-col="RollUpCol_2"]`) + .contains("427") + .should("exist"); + + editColumnByName("RollUpCol_2", "RollUpCol_New"); + deleteColumnByName("RollUpCol_New"); + }); + + it.skip("Add Rollup column (City, CountryId, count) & Delete", () => { + addLookUpColumn("RollUpCol_1", "City", "CountryId", "count"); + + // Verify first entry, will be displayed as alias here 'childColumn (from childTable)' + cy.get(`tbody > :nth-child(4) > [data-col="RollUpCol_1"]`) + .contains("2") + .should("exist"); + + editColumnByName("RollUpCol_1", "RollUpCol_New"); + deleteColumnByName("RollUpCol_New"); + }); }); - - after(() => { - cy.closeTableTab("Country"); - }); - - // Routine to create a new look up column - // - const addLookUpColumn = ( - columnName, - childTable, - childCol, - aggregateFunc - ) => { - // (+) icon at end of column header (to add a new column) - // opens up a pop up window - // - cy.get(".new-column-header").click(); - - // Column name - cy.get(".nc-column-name-input input") - .clear() - .type(`${columnName}`); - - // Column data type: to be set to rollup in this context - // Type 'Rollup' ensures item outside view is also listed (note, rollup is at bottom of scroll list) - cy.get(".nc-ui-dt-dropdown").click().type("Rollup"); - cy.getActiveMenu().contains("Rollup").click({ force: true }); - - // Configure Child table & column names - fetchParentFromLabel("Child table"); - cy.getActiveMenu().contains(childTable).click(); - - fetchParentFromLabel("Child column"); - cy.getActiveMenu().contains(childCol).click(); - - fetchParentFromLabel("Aggregate function"); - cy.getActiveMenu().contains(aggregateFunc).click(); - - cy.snipActiveMenu("RollUp"); - - // click on Save - cy.get(".nc-col-create-or-edit-card").contains("Save").click(); - - // Verify if column exists. - // - cy.get(`th:contains(${columnName})`).should("exist"); - }; - - // routine to delete column - // - const deleteColumnByName = (columnName) => { - // verify if column exists before delete - cy.get(`th:contains(${columnName})`).should("exist"); - - // delete opiton visible on mouse-over - cy.get(`th:contains(${columnName}) .mdi-menu-down`) - .trigger("mouseover") - .click(); - - // delete/ confirm on pop-up - cy.get(".nc-column-delete").click(); - cy.getActiveModal().find("button:contains(Confirm)").click(); - - // validate if deleted (column shouldnt exist) - cy.get(`th:contains(${columnName})`).should("not.exist"); - }; - - // routine to edit column - // - const editColumnByName = (oldName, newName) => { - // verify if column exists before delete - cy.get(`th:contains(${oldName})`).should("exist"); - - // delete opiton visible on mouse-over - cy.get(`th:contains(${oldName}) .mdi-menu-down`) - .trigger("mouseover") - .click(); - - // edit/ save on pop-up - cy.get(".nc-column-edit").click(); - cy.get(".nc-column-name-input input").clear().type(newName); - cy.get(".nc-col-create-or-edit-card").contains("Save").click(); - - cy.toastWait("Successfully updated alias"); - - // validate if deleted (column shouldnt exist) - cy.get(`th:contains(${oldName})`).should("not.exist"); - cy.get(`th:contains(${newName})`).should("exist"); - }; - - /////////////////////////////////////////////////// - // Test case - - it("Add Rollup column (City, CityId, sum) & Delete", () => { - addLookUpColumn("RollUpCol_2", "City", "CityId", "sum"); - - // Verify first entry, will be displayed as alias here 'childColumn (from childTable)' - // intentionally verifying 4th item, as initial items are being masked out by list scroll down - // to be fixed - // - cy.get(`tbody > :nth-child(4) > [data-col="RollUpCol_2"]`) - .contains("427") - .should("exist"); - - editColumnByName("RollUpCol_2", "RollUpCol_New"); - deleteColumnByName("RollUpCol_New"); - }); - - it.skip("Add Rollup column (City, CountryId, count) & Delete", () => { - addLookUpColumn("RollUpCol_1", "City", "CountryId", "count"); - - // Verify first entry, will be displayed as alias here 'childColumn (from childTable)' - cy.get(`tbody > :nth-child(4) > [data-col="RollUpCol_1"]`) - .contains("2") - .should("exist"); - - editColumnByName("RollUpCol_1", "RollUpCol_New"); - deleteColumnByName("RollUpCol_New"); - }); - }); }; /** diff --git a/scripts/cypress/integration/common/4b_table_view_share.js b/scripts/cypress/integration/common/4b_table_view_share.js index e69b7bbcf1..0a2a055b19 100644 --- a/scripts/cypress/integration/common/4b_table_view_share.js +++ b/scripts/cypress/integration/common/4b_table_view_share.js @@ -5,100 +5,105 @@ let storedURL = ""; let linkText = ""; const generateLinkWithPwd = () => { - // cy.get(".v-navigation-drawer__content > .container") - // .find(".v-list > .v-list-item") - // .contains("Share View") - // .click(); - mainPage.shareView().click(); - - cy.snipActiveModal("Modal_ShareView") - - // enable checkbox & feed pwd, save - cy.getActiveModal() - .find('[role="switch"][type="checkbox"]') - .click({ force: true }); - cy.getActiveModal().find('input[type="password"]').type("1"); - - cy.snipActiveModal("Modal_ShareView_Password"); - - cy.getActiveModal().find('button:contains("Save password")').click(); - - cy.toastWait("Successfully updated"); - - // copy link text, visit URL - cy.getActiveModal() - .find(".share-link-box") - .then(($obj) => { - linkText = $obj.text().trim(); - cy.log(linkText); - }); -}; - -export const genTest = (apiType, dbType) => { - if (!isTestSuiteActive(apiType, dbType)) return; - - describe(`${apiType.toUpperCase()} api - Shared VIEWs (GRID)`, () => { - // Run once before test- create project (rest/graphql) - // - before(() => { - cy.openTableTab("City", 25); + // cy.get(".v-navigation-drawer__content > .container") + // .find(".v-list > .v-list-item") + // .contains("Share View") + // .click(); + mainPage.shareView().click(); - // store base URL- to re-visit and delete form view later - cy.url().then((url) => { - storedURL = url; - }); + cy.snipActiveModal("Modal_ShareView"); - generateLinkWithPwd(); - }); - - beforeEach(() => { - cy.restoreLocalStorage(); - }); - - afterEach(() => { - cy.saveLocalStorage(); - }); + // enable checkbox & feed pwd, save + cy.getActiveModal() + .find('[role="switch"][type="checkbox"]') + .click({ force: true }); + cy.getActiveModal().find('input[type="password"]').type("1"); - it("Share view with incorrect password", () => { - cy.visit(linkText, { - baseUrl: null, - }); + cy.snipActiveModal("Modal_ShareView_Password"); - cy.getActiveModal().should("exist"); + cy.getActiveModal().find('button:contains("Save password")').click(); - // feed password - cy.getActiveModal().find('input[type="password"]').type("a"); - cy.getActiveModal().find('button:contains("Unlock")').click(); + cy.toastWait("Successfully updated"); - // if pwd is incorrect, active modal requesting to feed in password again will persist - cy.get("body").find(".v-dialog.v-dialog--active").should("exist"); - }); - - // fallover test- use previously opened view & continue verification instead of opening again - it("Share view with correct password", () => { - // cy.visit(linkText, { - // baseUrl: null - // }) - - // feed password - cy.getActiveModal().find('input[type="password"]').clear().type("1"); - cy.getActiveModal().find('button:contains("Unlock")').click(); - - // if pwd is incorrect, active modal requesting to feed in password again will persist - cy.get("body").find(".v-dialog.v-dialog--active").should("not.exist"); - }); - - it("Delete view", () => { - cy.visit(storedURL, { - baseUrl: null, - }); - mainPage.deleteCreatedViews(); - }); + // copy link text, visit URL + cy.getActiveModal() + .find(".share-link-box") + .then(($obj) => { + linkText = $obj.text().trim(); + cy.log(linkText); + }); +}; - after(() => { - cy.closeTableTab("City"); +export const genTest = (apiType, dbType) => { + if (!isTestSuiteActive(apiType, dbType)) return; + + describe(`${apiType.toUpperCase()} api - Shared VIEWs (GRID)`, () => { + // Run once before test- create project (rest/graphql) + // + before(() => { + cy.openTableTab("City", 25); + + // store base URL- to re-visit and delete form view later + cy.url().then((url) => { + storedURL = url; + }); + + generateLinkWithPwd(); + }); + + beforeEach(() => { + cy.restoreLocalStorage(); + }); + + afterEach(() => { + cy.saveLocalStorage(); + }); + + it("Share view with incorrect password", () => { + cy.visit(linkText, { + baseUrl: null, + }); + + cy.getActiveModal().should("exist"); + + // feed password + cy.getActiveModal().find('input[type="password"]').type("a"); + cy.getActiveModal().find('button:contains("Unlock")').click(); + + // if pwd is incorrect, active modal requesting to feed in password again will persist + cy.get("body").find(".v-dialog.v-dialog--active").should("exist"); + }); + + // fallover test- use previously opened view & continue verification instead of opening again + it("Share view with correct password", () => { + // cy.visit(linkText, { + // baseUrl: null + // }) + + // feed password + cy.getActiveModal() + .find('input[type="password"]') + .clear() + .type("1"); + cy.getActiveModal().find('button:contains("Unlock")').click(); + + // if pwd is incorrect, active modal requesting to feed in password again will persist + cy.get("body") + .find(".v-dialog.v-dialog--active") + .should("not.exist"); + }); + + it("Delete view", () => { + cy.visit(storedURL, { + baseUrl: null, + }); + mainPage.deleteCreatedViews(); + }); + + after(() => { + cy.closeTableTab("City"); + }); }); - }); }; // genTest('rest', false) diff --git a/scripts/cypress/integration/common/4c_form_view_detailed.js b/scripts/cypress/integration/common/4c_form_view_detailed.js index 2c8ed55119..dd0aee0fe5 100644 --- a/scripts/cypress/integration/common/4c_form_view_detailed.js +++ b/scripts/cypress/integration/common/4c_form_view_detailed.js @@ -4,434 +4,477 @@ import { mainPage } from "../../support/page_objects/mainPage"; let formViewURL; export const genTest = (apiType, dbType) => { - if (!isTestSuiteActive(apiType, dbType)) return; + if (!isTestSuiteActive(apiType, dbType)) return; - describe(`${apiType.toUpperCase()} api - FORM view`, () => { - const name = "Test" + Date.now(); + describe(`${apiType.toUpperCase()} api - FORM view`, () => { + const name = "Test" + Date.now(); - // Run once before test- create project (rest/graphql) - // - before(() => { - // open a table to work on views - // - cy.openTableTab("Country", 25); - }); - - beforeEach(() => { - cy.restoreLocalStorage(); - }); - - afterEach(() => { - cy.saveLocalStorage(); - }); + // Run once before test- create project (rest/graphql) + // + before(() => { + // open a table to work on views + // + cy.openTableTab("Country", 25); + }); - after(() => { - cy.closeTableTab("Country"); - }); + beforeEach(() => { + cy.restoreLocalStorage(); + }); - // Common routine to create/edit/delete GRID & GALLERY view - // Input: viewType - 'grid'/'gallery' - // - const viewTest = (viewType) => { - it(`Create ${viewType} view`, () => { - // click on 'Grid/Gallery' button on Views bar - cy.get(`.nc-create-${viewType}-view`).click(); - - // Pop up window, click Submit (accepting default name for view) - cy.getActiveModal().find("button:contains(Submit)").click(); - - cy.toastWait("View created successfully"); - - // validate if view was creted && contains default name 'Country1' - cy.get(`.nc-view-item.nc-${viewType}-view-item`) - .contains("Country1") - .should("exist"); - }); - - it(`Validate ${viewType} view: Drag & drop for re-order items`, () => { - // default order: Country, LastUpdate, Country => City - cy.get(".nc-field-wrapper").eq(0).contains("Country").should("exist"); - cy.get(".nc-field-wrapper") - .eq(1) - .contains("LastUpdate") - .should("exist"); - - // move Country field down (drag, drop) - cy.get("#data-table-form-Country").drag("#data-table-form-LastUpdate"); - - // Verify if order is: LastUpdate, Country, Country => City - cy.get(".nc-field-wrapper") - .eq(0) - .contains("LastUpdate") - .should("exist"); - cy.get(".nc-field-wrapper").eq(1).contains("Country").should("exist"); - }); - - it(`Validate ${viewType} view: Drag & drop for add/remove items`, () => { - // default, only one item in menu-bar; ensure LastUpdate field was present in form view - cy.get(".col-md-4").find(".pointer.item").should("not.exist"); - cy.get(".nc-field-wrapper") - .eq(0) - .contains("LastUpdate") - .should("exist"); - - // drag 'LastUpdate' & drop into menu bar drag-drop box - cy.get("#data-table-form-LastUpdate").drag(".nc-drag-n-drop-to-hide"); - - // validate- fields count in menu bar to be increased by 1 && - // first member in 'formView' is Country - cy.get(".nc-field-wrapper").eq(0).contains("Country").should("exist"); - cy.get(".col-md-4").find(".pointer.item").its("length").should("eq", 1); - }); - - it(`Validate ${viewType} view: Inverted order field member addition from menu`, () => { - cy.get(".col-md-4") - .find(".pointer.caption") - .contains("Remove all") - .click(); - - // click fields in inverted order: LastUpdate, Country => City - cy.get(".col-md-4").find(".pointer.item").eq(1).click(); - cy.get(".col-md-4").find(".pointer.item").eq(0).click(); - - // verify if order of appearance in form is right - // Country was never removed as its required field. Other two will appear in inverted order - cy.get(".nc-field-wrapper").eq(0).contains("Country").should("exist"); - cy.get(".nc-field-wrapper") - .eq(1) - .contains("Country => City") - .should("exist"); - cy.get(".nc-field-wrapper") - .eq(2) - .contains("LastUpdate") - .should("exist"); - }); - - it(`Validate ${viewType}: Form header & description validation`, () => { - // Header & description should exist - cy.get(".nc-form").find('[placeholder="Form Title"]').should("exist"); - cy.get(".nc-form") - .find('[placeholder="Add form description"]') - .should("exist"); - - // Update header & add some description, verify - cy.get(".nc-form").find('[placeholder="Form Title"]').type("A B C D"); - cy.get(".nc-form") - .find('[placeholder="Add form description"]') - .type("Some description about form comes here"); - - // validate new contents - cy.get(".nc-form") - .find('[placeholder="Form Title"]') - .contains("A B C D") - .should("exist"); - cy.get(".nc-form") - .find('[placeholder="Add form description"]') - .contains("Some description about form comes here") - .should("exist"); - }); - - it(`Validate ${viewType}: Add all, Remove all validation`, () => { - // .col-md-4 : left hand menu - // .nc-form : form view (right hand side) - - // ensure buttons exist on left hand menu - cy.get(".col-md-4") - .find(".pointer.caption") - .contains("Add all") - .should("not.exist"); - cy.get(".col-md-4") - .find(".pointer.caption") - .contains("Remove all") - .should("exist"); - - // click: remove-all - cy.get(".col-md-4") - .find(".pointer.caption") - .contains("Remove all") - .click(); - // form should not contain any "field remove icons" -- except for mandatory field (Country) - cy.get(".nc-form") - .find(".nc-field-remove-icon") - .its("length") - .should("eq", 1); - // menu bar should contain 3 .pointer.item (LastUpdate, County->City) - cy.get(".col-md-4").find(".pointer.item").its("length").should("eq", 2); - - // click: Add all - // cy.get('.col-md-4').find('.pointer.caption').contains('Remove all').should('not.exist') - cy.get(".col-md-4") - .find(".pointer.caption") - .contains("Add all") - .click(); - cy.get(".col-md-4") - .find(".pointer.caption") - .contains("Remove all") - .should("exist"); - // form should contain "field remove icons" - cy.get(".nc-form").find(".nc-field-remove-icon").should("exist"); - // Fix me: a dummy remove icon is left over on screen - cy.get(".nc-form") - .find(".nc-field-remove-icon") - .its("length") - .should("eq", 3); - // menu bar should not contain .pointer.item (column name/ field name add options) - cy.get(".col-md-4").find(".pointer.item").should("not.exist"); - }); - - it(`Validate ${viewType}: Submit default, empty show this message textbox`, () => { - // fill up mandatory fields - cy.get("#data-table-form-Country").type("_abc"); - cy.get("#data-table-form-LastUpdate").click(); - cy.getActiveModal().find("button").contains("19").click(); - cy.getActiveModal().find("button").contains("OK").click(); - - // default message, no update - - // submit button & validate - cy.get(".nc-form").find("button").contains("Submit").click(); - cy.toastWait("Saved successfully"); - cy.get(".v-alert") - .contains("Successfully submitted form data") - .should("exist"); - - // end of test removes newly added rows from table. that step validates if row was successfully added. - }); - - it(`Validate ${viewType}: Submit default, with valid Show message entry`, () => { - // clicking again on view name shows blank still. work around- toggling between two views - // cy.get(`.nc-view-item.nc-${viewType}-view-item`).contains('Country').click() - cy.get(`.nc-view-item.nc-${viewType}-view-item`) - .contains("Country1") - .click(); - - // fill up mandatory fields - cy.get("#data-table-form-Country").type("_abc"); - cy.get("#data-table-form-LastUpdate").click(); - cy.getActiveModal().find("button").contains("19").click(); - cy.getActiveModal().find("button").contains("OK").click(); - - // add message - cy.get(".nc-form > .mx-auto").find("textarea").type("Congratulations!"); - - // submit button & validate - cy.get(".nc-form").find("button").contains("Submit").click(); - cy.toastWait("Congratulations"); - cy.get(".v-alert").contains("Congratulations").should("exist"); - - // end of test removes newly added rows from table. that step validates if row was successfully added. - }); - - it(`Validate ${viewType}: Submit default, Enable checkbox "Submit another form`, () => { - // clicking again on view name shows blank still. work around- toggling between two views - // cy.get(`.nc-view-item.nc-${viewType}-view-item`).contains('Country').click() - cy.get(`.nc-view-item.nc-${viewType}-view-item`) - .contains("Country1") - .click(); - - // fill up mandatory fields - cy.get("#data-table-form-Country").type("_abc"); - cy.get("#data-table-form-LastUpdate").click(); - cy.getActiveModal().find("button").contains("19").click(); - cy.getActiveModal().find("button").contains("OK").click(); - - // enable "Submit another form" check box - cy.get(".nc-form > .mx-auto").find('[type="checkbox"]').eq(0).click(); - - // submit button & validate - cy.get(".nc-form").find("button").contains("Submit").click(); - cy.toastWait("Congratulations"); - cy.get(".v-alert").contains("Congratulations").should("exist"); - cy.get("button").contains("Submit Another Form").should("exist"); - - cy.get("button").contains("Submit Another Form").click(); - cy.get(".nc-form").should("exist"); - // New form appeared? Header & description should exist - cy.get(".nc-form") - .find('[placeholder="Form Title"]') - .contains("A B C D") - .should("exist"); - cy.get(".nc-form") - .find('[placeholder="Add form description"]') - .contains("Some description about form comes here") - .should("exist"); - - // end of test removes newly added rows from table. that step validates if row was successfully added. - }); - - it(`Validate ${viewType}: Submit default, Enable checkbox "blank form after 5 seconds"`, () => { - // cy.get(`.nc-view-item.nc-${viewType}-view-item`).contains('Country').click() - // cy.get(`.nc-view-item.nc-${viewType}-view-item`).contains('Country1').click() - - cy.get("#data-table-form-Country").type("_abc"); - cy.get("#data-table-form-LastUpdate").click(); - cy.getActiveModal().find("button").contains("19").click(); - cy.getActiveModal().find("button").contains("OK").click(); - - // enable "New form after 5 seconds" button - cy.get(".nc-form > .mx-auto") - .find('[type="checkbox"]') - .eq(0) - .click({ force: true }); - cy.get(".nc-form > .mx-auto").find('[type="checkbox"]').eq(1).click(); - - // submit button & validate - cy.get(".nc-form").find("button").contains("Submit").click(); - cy.toastWait("Congratulations"); - cy.get(".v-alert") - .contains("Congratulations") - .should("exist") - .then(() => { - // wait for 5 seconds - cy.get(".nc-form").should("exist"); - - // validate if form has appeared again - cy.get(".nc-form") - .find('[placeholder="Form Title"]') - .contains("A B C D") - .should("exist"); - cy.get(".nc-form") - .find('[placeholder="Add form description"]') - .contains("Some description about form comes here") - .should("exist"); - }); - - // end of test removes newly added rows from table. that step validates if row was successfully added. - }); - - it(`Validate ${viewType}: Email me verification, without SMTP configuration`, () => { - // open formview & enable "email me" option - cy.get(`.nc-view-item.nc-${viewType}-view-item`) - .contains("Country1") - .click(); - cy.get(".nc-form > .mx-auto") - .find('[type="checkbox"]') - .eq(2) - .click({ force: true }); - // validate if toaster pops up requesting to activate SMTP - cy.toastWait( - "Please activate SMTP plugin in App store for enabling email notification" - ); - }); - - it(`Validate ${viewType}: Email me verification, with SMTP configuration`, () => { - // activate SMTP, dummy profile - mainPage.navigationDraw(mainPage.APPSTORE).click(); - mainPage.configureSMTP("admin@ex.com", "smtp.ex.com", "8080", "TLS"); - - // open form view & enable "email me" option - cy.openTableTab("Country", 25); - - cy.get(`.nc-view-item.nc-${viewType}-view-item`) - .contains("Country1") - .click(); - cy.get(".nc-form > .mx-auto") - .find('[type="checkbox"]') - .eq(2) - .click({ force: true }); - // validate if toaster pops up informing installation of email notification - // cy.get('.toasted:visible', { timout: 6000 }) - // .contains('Successfully installed and email notification will use SMTP configuration') - // .should('exist') - // reset SMPT config's - mainPage.navigationDraw(mainPage.APPSTORE).click(); - mainPage.resetSMTP(); - cy.openTableTab("Country", 25); - }); - - it(`Validate ${viewType}: Add/ remove field verification"`, () => { - cy.get(`.nc-view-item.nc-${viewType}-view-item`) - .contains("Country1") - .click(); - - cy.get("#data-table-form-LastUpdate").should("exist"); - // remove "LastUpdate field" - cy.get(".nc-form").find(".nc-field-remove-icon").eq(1).click(); - cy.get("#data-table-form-lastUpdate").should("not.exist"); - cy.get(".col-md-4") - .find(".pointer.item") - .contains("LastUpdate") - .should("exist"); - - // add it back - cy.get(".col-md-4") - .find(".pointer.item") - .contains("LastUpdate") - .click(); - cy.get("#data-table-form-LastUpdate").should("exist"); - }); - - it(`Validate ${viewType}: URL verification`, () => { - cy.get(`.nc-view-item.nc-${viewType}-view-item`) - .contains("Country1") - .click(); - // verify URL & copy it for subsequent test - cy.url().should("contain", `&view=Country1`); - cy.url().then((url) => { - cy.log(url); - formViewURL = url; + afterEach(() => { + cy.saveLocalStorage(); }); - }); - it(`Validate ${viewType}: URL validation after re-access`, () => { - // visit URL - cy.log(formViewURL); - cy.visit(formViewURL, { - baseUrl: null, + after(() => { + cy.closeTableTab("Country"); }); - // New form appeared? Header & description should exist - cy.get(".nc-form", { timeout: 10000 }) - .find('[placeholder="Form Title"]') - .contains("A B C D") - .should("exist"); - cy.get(".nc-form", { timeout: 10000 }) - .find('[placeholder="Add form description"]') - .contains("Some description about form comes here") - .should("exist"); - }); - - it(`Delete ${viewType} view`, () => { - // number of view entries should be 2 before we delete - cy.get(".nc-view-item").its("length").should("eq", 2); - - // click on delete icon (becomes visible on hovering mouse) - cy.get(".nc-view-delete-icon").click({ force: true }); - cy.toastWait("View deleted successfully"); - - // confirm if the number of veiw entries is reduced by 1 - cy.get(".nc-view-item").its("length").should("eq", 1); - - // clean up newly added rows into Country table operations - // this auto verifies successfull addition of rows to table as well - mainPage.getPagination(5).click(); - cy.get(".nc-grid-row").should("have.length", 13); - mainPage - .getRow(10) - .find(".mdi-checkbox-blank-outline") - .click({ force: true }); - mainPage - .getRow(11) - .find(".mdi-checkbox-blank-outline") - .click({ force: true }); - mainPage - .getRow(12) - .find(".mdi-checkbox-blank-outline") - .click({ force: true }); - mainPage - .getRow(13) - .find(".mdi-checkbox-blank-outline") - .click({ force: true }); - - mainPage.getCell("Country", 10).rightclick(); - cy.getActiveMenu().contains("Delete Selected Row").click(); - // cy.toastWait('Deleted selected rows successfully') - }); - }; - - // below scenario's will be invoked twice, once for rest & then for graphql - viewTest("form"); - }); + // Common routine to create/edit/delete GRID & GALLERY view + // Input: viewType - 'grid'/'gallery' + // + const viewTest = (viewType) => { + it(`Create ${viewType} view`, () => { + // click on 'Grid/Gallery' button on Views bar + cy.get(`.nc-create-${viewType}-view`).click(); + + // Pop up window, click Submit (accepting default name for view) + cy.getActiveModal().find("button:contains(Submit)").click(); + + cy.toastWait("View created successfully"); + + // validate if view was creted && contains default name 'Country1' + cy.get(`.nc-view-item.nc-${viewType}-view-item`) + .contains("Country1") + .should("exist"); + }); + + it(`Validate ${viewType} view: Drag & drop for re-order items`, () => { + // default order: Country, LastUpdate, Country => City + cy.get(".nc-field-wrapper") + .eq(0) + .contains("Country") + .should("exist"); + cy.get(".nc-field-wrapper") + .eq(1) + .contains("LastUpdate") + .should("exist"); + + // move Country field down (drag, drop) + cy.get("#data-table-form-Country").drag( + "#data-table-form-LastUpdate" + ); + + // Verify if order is: LastUpdate, Country, Country => City + cy.get(".nc-field-wrapper") + .eq(0) + .contains("LastUpdate") + .should("exist"); + cy.get(".nc-field-wrapper") + .eq(1) + .contains("Country") + .should("exist"); + }); + + it(`Validate ${viewType} view: Drag & drop for add/remove items`, () => { + // default, only one item in menu-bar; ensure LastUpdate field was present in form view + cy.get(".col-md-4").find(".pointer.item").should("not.exist"); + cy.get(".nc-field-wrapper") + .eq(0) + .contains("LastUpdate") + .should("exist"); + + // drag 'LastUpdate' & drop into menu bar drag-drop box + cy.get("#data-table-form-LastUpdate").drag( + ".nc-drag-n-drop-to-hide" + ); + + // validate- fields count in menu bar to be increased by 1 && + // first member in 'formView' is Country + cy.get(".nc-field-wrapper") + .eq(0) + .contains("Country") + .should("exist"); + cy.get(".col-md-4") + .find(".pointer.item") + .its("length") + .should("eq", 1); + }); + + it(`Validate ${viewType} view: Inverted order field member addition from menu`, () => { + cy.get(".col-md-4") + .find(".pointer.caption") + .contains("Remove all") + .click(); + + // click fields in inverted order: LastUpdate, Country => City + cy.get(".col-md-4").find(".pointer.item").eq(1).click(); + cy.get(".col-md-4").find(".pointer.item").eq(0).click(); + + // verify if order of appearance in form is right + // Country was never removed as its required field. Other two will appear in inverted order + cy.get(".nc-field-wrapper") + .eq(0) + .contains("Country") + .should("exist"); + cy.get(".nc-field-wrapper") + .eq(1) + .contains("Country => City") + .should("exist"); + cy.get(".nc-field-wrapper") + .eq(2) + .contains("LastUpdate") + .should("exist"); + }); + + it(`Validate ${viewType}: Form header & description validation`, () => { + // Header & description should exist + cy.get(".nc-form") + .find('[placeholder="Form Title"]') + .should("exist"); + cy.get(".nc-form") + .find('[placeholder="Add form description"]') + .should("exist"); + + // Update header & add some description, verify + cy.get(".nc-form") + .find('[placeholder="Form Title"]') + .type("A B C D"); + cy.get(".nc-form") + .find('[placeholder="Add form description"]') + .type("Some description about form comes here"); + + // validate new contents + cy.get(".nc-form") + .find('[placeholder="Form Title"]') + .contains("A B C D") + .should("exist"); + cy.get(".nc-form") + .find('[placeholder="Add form description"]') + .contains("Some description about form comes here") + .should("exist"); + }); + + it(`Validate ${viewType}: Add all, Remove all validation`, () => { + // .col-md-4 : left hand menu + // .nc-form : form view (right hand side) + + // ensure buttons exist on left hand menu + cy.get(".col-md-4") + .find(".pointer.caption") + .contains("Add all") + .should("not.exist"); + cy.get(".col-md-4") + .find(".pointer.caption") + .contains("Remove all") + .should("exist"); + + // click: remove-all + cy.get(".col-md-4") + .find(".pointer.caption") + .contains("Remove all") + .click(); + // form should not contain any "field remove icons" -- except for mandatory field (Country) + cy.get(".nc-form") + .find(".nc-field-remove-icon") + .its("length") + .should("eq", 1); + // menu bar should contain 3 .pointer.item (LastUpdate, County->City) + cy.get(".col-md-4") + .find(".pointer.item") + .its("length") + .should("eq", 2); + + // click: Add all + // cy.get('.col-md-4').find('.pointer.caption').contains('Remove all').should('not.exist') + cy.get(".col-md-4") + .find(".pointer.caption") + .contains("Add all") + .click(); + cy.get(".col-md-4") + .find(".pointer.caption") + .contains("Remove all") + .should("exist"); + // form should contain "field remove icons" + cy.get(".nc-form") + .find(".nc-field-remove-icon") + .should("exist"); + // Fix me: a dummy remove icon is left over on screen + cy.get(".nc-form") + .find(".nc-field-remove-icon") + .its("length") + .should("eq", 3); + // menu bar should not contain .pointer.item (column name/ field name add options) + cy.get(".col-md-4").find(".pointer.item").should("not.exist"); + }); + + it(`Validate ${viewType}: Submit default, empty show this message textbox`, () => { + // fill up mandatory fields + cy.get("#data-table-form-Country").type("_abc"); + cy.get("#data-table-form-LastUpdate").click(); + cy.getActiveModal().find("button").contains("19").click(); + cy.getActiveModal().find("button").contains("OK").click(); + + // default message, no update + + // submit button & validate + cy.get(".nc-form").find("button").contains("Submit").click(); + cy.toastWait("Saved successfully"); + cy.get(".v-alert") + .contains("Successfully submitted form data") + .should("exist"); + + // end of test removes newly added rows from table. that step validates if row was successfully added. + }); + + it(`Validate ${viewType}: Submit default, with valid Show message entry`, () => { + // clicking again on view name shows blank still. work around- toggling between two views + // cy.get(`.nc-view-item.nc-${viewType}-view-item`).contains('Country').click() + cy.get(`.nc-view-item.nc-${viewType}-view-item`) + .contains("Country1") + .click(); + + // fill up mandatory fields + cy.get("#data-table-form-Country").type("_abc"); + cy.get("#data-table-form-LastUpdate").click(); + cy.getActiveModal().find("button").contains("19").click(); + cy.getActiveModal().find("button").contains("OK").click(); + + // add message + cy.get(".nc-form > .mx-auto") + .find("textarea") + .type("Congratulations!"); + + // submit button & validate + cy.get(".nc-form").find("button").contains("Submit").click(); + cy.toastWait("Congratulations"); + cy.get(".v-alert").contains("Congratulations").should("exist"); + + // end of test removes newly added rows from table. that step validates if row was successfully added. + }); + + it(`Validate ${viewType}: Submit default, Enable checkbox "Submit another form`, () => { + // clicking again on view name shows blank still. work around- toggling between two views + // cy.get(`.nc-view-item.nc-${viewType}-view-item`).contains('Country').click() + cy.get(`.nc-view-item.nc-${viewType}-view-item`) + .contains("Country1") + .click(); + + // fill up mandatory fields + cy.get("#data-table-form-Country").type("_abc"); + cy.get("#data-table-form-LastUpdate").click(); + cy.getActiveModal().find("button").contains("19").click(); + cy.getActiveModal().find("button").contains("OK").click(); + + // enable "Submit another form" check box + cy.get(".nc-form > .mx-auto") + .find('[type="checkbox"]') + .eq(0) + .click(); + + // submit button & validate + cy.get(".nc-form").find("button").contains("Submit").click(); + cy.toastWait("Congratulations"); + cy.get(".v-alert").contains("Congratulations").should("exist"); + cy.get("button") + .contains("Submit Another Form") + .should("exist"); + + cy.get("button").contains("Submit Another Form").click(); + cy.get(".nc-form").should("exist"); + // New form appeared? Header & description should exist + cy.get(".nc-form") + .find('[placeholder="Form Title"]') + .contains("A B C D") + .should("exist"); + cy.get(".nc-form") + .find('[placeholder="Add form description"]') + .contains("Some description about form comes here") + .should("exist"); + + // end of test removes newly added rows from table. that step validates if row was successfully added. + }); + + it(`Validate ${viewType}: Submit default, Enable checkbox "blank form after 5 seconds"`, () => { + // cy.get(`.nc-view-item.nc-${viewType}-view-item`).contains('Country').click() + // cy.get(`.nc-view-item.nc-${viewType}-view-item`).contains('Country1').click() + + cy.get("#data-table-form-Country").type("_abc"); + cy.get("#data-table-form-LastUpdate").click(); + cy.getActiveModal().find("button").contains("19").click(); + cy.getActiveModal().find("button").contains("OK").click(); + + // enable "New form after 5 seconds" button + cy.get(".nc-form > .mx-auto") + .find('[type="checkbox"]') + .eq(0) + .click({ force: true }); + cy.get(".nc-form > .mx-auto") + .find('[type="checkbox"]') + .eq(1) + .click(); + + // submit button & validate + cy.get(".nc-form").find("button").contains("Submit").click(); + cy.toastWait("Congratulations"); + cy.get(".v-alert") + .contains("Congratulations") + .should("exist") + .then(() => { + // wait for 5 seconds + cy.get(".nc-form").should("exist"); + + // validate if form has appeared again + cy.get(".nc-form") + .find('[placeholder="Form Title"]') + .contains("A B C D") + .should("exist"); + cy.get(".nc-form") + .find('[placeholder="Add form description"]') + .contains("Some description about form comes here") + .should("exist"); + }); + + // end of test removes newly added rows from table. that step validates if row was successfully added. + }); + + it(`Validate ${viewType}: Email me verification, without SMTP configuration`, () => { + // open formview & enable "email me" option + cy.get(`.nc-view-item.nc-${viewType}-view-item`) + .contains("Country1") + .click(); + cy.get(".nc-form > .mx-auto") + .find('[type="checkbox"]') + .eq(2) + .click({ force: true }); + // validate if toaster pops up requesting to activate SMTP + cy.toastWait( + "Please activate SMTP plugin in App store for enabling email notification" + ); + }); + + it(`Validate ${viewType}: Email me verification, with SMTP configuration`, () => { + // activate SMTP, dummy profile + mainPage.navigationDraw(mainPage.APPSTORE).click(); + mainPage.configureSMTP( + "admin@ex.com", + "smtp.ex.com", + "8080", + "TLS" + ); + + // open form view & enable "email me" option + cy.openTableTab("Country", 25); + + cy.get(`.nc-view-item.nc-${viewType}-view-item`) + .contains("Country1") + .click(); + cy.get(".nc-form > .mx-auto") + .find('[type="checkbox"]') + .eq(2) + .click({ force: true }); + // validate if toaster pops up informing installation of email notification + // cy.get('.toasted:visible', { timout: 6000 }) + // .contains('Successfully installed and email notification will use SMTP configuration') + // .should('exist') + // reset SMPT config's + mainPage.navigationDraw(mainPage.APPSTORE).click(); + mainPage.resetSMTP(); + cy.openTableTab("Country", 25); + }); + + it(`Validate ${viewType}: Add/ remove field verification"`, () => { + cy.get(`.nc-view-item.nc-${viewType}-view-item`) + .contains("Country1") + .click(); + + cy.get("#data-table-form-LastUpdate").should("exist"); + // remove "LastUpdate field" + cy.get(".nc-form").find(".nc-field-remove-icon").eq(1).click(); + cy.get("#data-table-form-lastUpdate").should("not.exist"); + cy.get(".col-md-4") + .find(".pointer.item") + .contains("LastUpdate") + .should("exist"); + + // add it back + cy.get(".col-md-4") + .find(".pointer.item") + .contains("LastUpdate") + .click(); + cy.get("#data-table-form-LastUpdate").should("exist"); + }); + + it(`Validate ${viewType}: URL verification`, () => { + cy.get(`.nc-view-item.nc-${viewType}-view-item`) + .contains("Country1") + .click(); + // verify URL & copy it for subsequent test + cy.url().should("contain", `&view=Country1`); + cy.url().then((url) => { + cy.log(url); + formViewURL = url; + }); + }); + + it(`Validate ${viewType}: URL validation after re-access`, () => { + // visit URL + cy.log(formViewURL); + cy.visit(formViewURL, { + baseUrl: null, + }); + + // New form appeared? Header & description should exist + cy.get(".nc-form", { timeout: 10000 }) + .find('[placeholder="Form Title"]') + .contains("A B C D") + .should("exist"); + cy.get(".nc-form", { timeout: 10000 }) + .find('[placeholder="Add form description"]') + .contains("Some description about form comes here") + .should("exist"); + }); + + it(`Delete ${viewType} view`, () => { + // number of view entries should be 2 before we delete + cy.get(".nc-view-item").its("length").should("eq", 2); + + // click on delete icon (becomes visible on hovering mouse) + cy.get(".nc-view-delete-icon").click({ force: true }); + cy.toastWait("View deleted successfully"); + + // confirm if the number of veiw entries is reduced by 1 + cy.get(".nc-view-item").its("length").should("eq", 1); + + // clean up newly added rows into Country table operations + // this auto verifies successfull addition of rows to table as well + mainPage.getPagination(5).click(); + cy.get(".nc-grid-row").should("have.length", 13); + mainPage + .getRow(10) + .find(".mdi-checkbox-blank-outline") + .click({ force: true }); + mainPage + .getRow(11) + .find(".mdi-checkbox-blank-outline") + .click({ force: true }); + mainPage + .getRow(12) + .find(".mdi-checkbox-blank-outline") + .click({ force: true }); + mainPage + .getRow(13) + .find(".mdi-checkbox-blank-outline") + .click({ force: true }); + + mainPage.getCell("Country", 10).rightclick(); + cy.getActiveMenu().contains("Delete Selected Row").click(); + // cy.toastWait('Deleted selected rows successfully') + }); + }; + + // below scenario's will be invoked twice, once for rest & then for graphql + viewTest("form"); + }); }; /** diff --git a/scripts/cypress/integration/common/4d_table_view_grid_locked.js b/scripts/cypress/integration/common/4d_table_view_grid_locked.js index ccd14a3d2e..9d41031205 100644 --- a/scripts/cypress/integration/common/4d_table_view_grid_locked.js +++ b/scripts/cypress/integration/common/4d_table_view_grid_locked.js @@ -2,92 +2,104 @@ import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; import { mainPage } from "../../support/page_objects/mainPage"; export const genTest = (apiType, dbType) => { - if (!isTestSuiteActive(apiType, dbType)) return; + if (!isTestSuiteActive(apiType, dbType)) return; - describe(`${apiType.toUpperCase()} api - Lock view`, () => { - // Run once before test- create project (rest/graphql) - // - before(() => { - // open a table to work on views - // - cy.openTableTab("Country", 25); - }); + describe(`${apiType.toUpperCase()} api - Lock view`, () => { + // Run once before test- create project (rest/graphql) + // + before(() => { + // open a table to work on views + // + cy.openTableTab("Country", 25); + }); - after(() => { - cy.closeTableTab("Country"); - }); + after(() => { + cy.closeTableTab("Country"); + }); - const lockViewTest = (enabled) => { - it(`Grid: lock view set to ${enabled}: validation`, () => { - let vString = enabled ? "not." : ""; - let menuOption = enabled ? 1 : 0; + const lockViewTest = (enabled) => { + it(`Grid: lock view set to ${enabled}: validation`, () => { + let vString = enabled ? "not." : ""; + let menuOption = enabled ? 1 : 0; - // on menu, collaboration view appears first (at index 0) - // followed by Locked view (at index 1) - cy.get(".xc-toolbar").find(".nc-view-lock-menu:enabled").click(); - cy.snipActiveMenu("Menu_Collaboration") - cy.getActiveMenu().find('[role="menuitem"]').eq(menuOption).click(); + // on menu, collaboration view appears first (at index 0) + // followed by Locked view (at index 1) + cy.get(".xc-toolbar") + .find(".nc-view-lock-menu:enabled") + .click(); + cy.snipActiveMenu("Menu_Collaboration"); + cy.getActiveMenu() + .find('[role="menuitem"]') + .eq(menuOption) + .click(); - // expected toolbar for Lock view: Only lock-view menu, reload, toggle-nav-drawer to be enabled - // - cy.get(".xc-toolbar") - .find(".nc-view-lock-menu:enabled") - .should("exist"); - cy.get(".xc-toolbar") - .find(".nc-table-reload-btn:enabled") - .should("exist"); - cy.get(".xc-toolbar") - .find(".nc-add-new-row-btn:enabled") - .should(`${vString}exist`); - // cy.get('.xc-toolbar').find('.nc-save-new-row-btn:disabled') .should('exist') - cy.get(".xc-toolbar") - .find(".nc-fields-menu-btn:enabled") - .should(`${vString}exist`); - cy.get(".xc-toolbar") - .find(".nc-sort-menu-btn:enabled") - .should(`${vString}exist`); - cy.get(".xc-toolbar") - .find(".nc-filter-menu-btn:enabled") - .should(`${vString}exist`); - cy.get(".xc-toolbar") - .find(".nc-table-delete-btn:enabled") - .should(`${vString}exist`); - cy.get(".xc-toolbar") - .find(".nc-toggle-nav-drawer:enabled") - .should("exist"); + // expected toolbar for Lock view: Only lock-view menu, reload, toggle-nav-drawer to be enabled + // + cy.get(".xc-toolbar") + .find(".nc-view-lock-menu:enabled") + .should("exist"); + cy.get(".xc-toolbar") + .find(".nc-table-reload-btn:enabled") + .should("exist"); + cy.get(".xc-toolbar") + .find(".nc-add-new-row-btn:enabled") + .should(`${vString}exist`); + // cy.get('.xc-toolbar').find('.nc-save-new-row-btn:disabled') .should('exist') + cy.get(".xc-toolbar") + .find(".nc-fields-menu-btn:enabled") + .should(`${vString}exist`); + cy.get(".xc-toolbar") + .find(".nc-sort-menu-btn:enabled") + .should(`${vString}exist`); + cy.get(".xc-toolbar") + .find(".nc-filter-menu-btn:enabled") + .should(`${vString}exist`); + cy.get(".xc-toolbar") + .find(".nc-table-delete-btn:enabled") + .should(`${vString}exist`); + cy.get(".xc-toolbar") + .find(".nc-toggle-nav-drawer:enabled") + .should("exist"); - // dblClick on a cell & see if we can edit - mainPage.getCell("Country", 1).dblclick(); - mainPage.getCell("Country", 1).find("input").should(`${vString}exist`); + // dblClick on a cell & see if we can edit + mainPage.getCell("Country", 1).dblclick(); + mainPage + .getCell("Country", 1) + .find("input") + .should(`${vString}exist`); - // check if expand row option is available? - cy.get("td").find(".nc-row-expand-icon").should(`${vString}exist`); - // alt validation: mainPage.getRow(1).find('.nc-row-expand-icon').should(`${vString}exist`) + // check if expand row option is available? + cy.get("td") + .find(".nc-row-expand-icon") + .should(`${vString}exist`); + // alt validation: mainPage.getRow(1).find('.nc-row-expand-icon').should(`${vString}exist`) - // check if add/ expand options available for 'has many' column type - mainPage - .getCell("Country => City", 1) - .click() - .find("button.mdi-plus") - .should(`${vString}exist`); - mainPage - .getCell("Country => City", 1) - .click() - .find("button.mdi-arrow-expand") - .should(`${vString}exist`); + // check if add/ expand options available for 'has many' column type + mainPage + .getCell("Country => City", 1) + .click() + .find("button.mdi-plus") + .should(`${vString}exist`); + mainPage + .getCell("Country => City", 1) + .click() + .find("button.mdi-arrow-expand") + .should(`${vString}exist`); - // update row option (right click) - should not be available for Lock view - mainPage.getCell("Country => City", 1).rightclick(); - cy.get(".menuable__content__active").should(`${vString}be.visible`); - }); - }; + // update row option (right click) - should not be available for Lock view + mainPage.getCell("Country => City", 1).rightclick(); + cy.get(".menuable__content__active").should( + `${vString}be.visible` + ); + }); + }; - // Locked view - lockViewTest(true); + // Locked view + lockViewTest(true); - // collaboration view - lockViewTest(false); - }); + // collaboration view + lockViewTest(false); + }); }; /** diff --git a/scripts/cypress/integration/common/6f_attachments.js b/scripts/cypress/integration/common/6f_attachments.js index 9fc8e48285..03b9f9ee69 100644 --- a/scripts/cypress/integration/common/6f_attachments.js +++ b/scripts/cypress/integration/common/6f_attachments.js @@ -3,122 +3,134 @@ import { loginPage } from "../../support/page_objects/navigation"; import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; export const genTest = (apiType, dbType) => { - if (!isTestSuiteActive(apiType, dbType)) return; + if (!isTestSuiteActive(apiType, dbType)) return; - describe(`${apiType.toUpperCase()} Columns of type attachment`, () => { - before(() => { - loginPage.loginAndOpenProject(apiType, dbType); - cy.openTableTab("Country", 25); - }); + describe(`${apiType.toUpperCase()} Columns of type attachment`, () => { + before(() => { + loginPage.loginAndOpenProject(apiType, dbType); + cy.openTableTab("Country", 25); + }); - after(() => { - mainPage.deleteColumn("testAttach"); + after(() => { + mainPage.deleteColumn("testAttach"); - // clean up newly added rows into Country table operations - // this auto verifies successfull addition of rows to table as well - mainPage.getPagination(5).click(); - // wait for page rendering to complete - cy.get(".nc-grid-row").should("have.length", 10); - mainPage - .getRow(10) - .find(".mdi-checkbox-blank-outline") - .click({ force: true }); + // clean up newly added rows into Country table operations + // this auto verifies successfull addition of rows to table as well + mainPage.getPagination(5).click(); + // wait for page rendering to complete + cy.get(".nc-grid-row").should("have.length", 10); + mainPage + .getRow(10) + .find(".mdi-checkbox-blank-outline") + .click({ force: true }); - mainPage.getCell("Country", 10).rightclick(); - cy.getActiveMenu().contains("Delete Selected Row").click(); + mainPage.getCell("Country", 10).rightclick(); + cy.getActiveMenu().contains("Delete Selected Row").click(); - cy.closeTableTab("Country"); - }); + cy.closeTableTab("Country"); + }); - it(`Add column of type attachments`, () => { - mainPage.addColumnWithType("testAttach", "Attachment", "Country"); - - for (let i = 1; i <= 2; i++) { - let filepath = `sampleFiles/${i}.json`; - mainPage - .getCell("testAttach", i) - .click() - .find('input[type="file"]') - .attachFile(filepath); - mainPage.getCell("testAttach", i).find(".mdi-file").should("exist"); - } - }); + it(`Add column of type attachments`, () => { + mainPage.addColumnWithType("testAttach", "Attachment", "Country"); + + for (let i = 1; i <= 2; i++) { + let filepath = `sampleFiles/${i}.json`; + mainPage + .getCell("testAttach", i) + .click() + .find('input[type="file"]') + .attachFile(filepath); + mainPage + .getCell("testAttach", i) + .find(".mdi-file") + .should("exist"); + } + }); - it(`Form view with Attachment field- Submit & verify`, () => { - // create form-view - cy.get(`.nc-create-form-view`).click(); - cy.getActiveModal().find("button:contains(Submit)").click(); - - cy.toastWait("View created successfully"); - - cy.get(`.nc-view-item.nc-form-view-item`).contains("Country1").click(); - - // cy.get(".v-navigation-drawer__content > .container") - // .should("exist") - // .find(".v-list > .v-list-item") - // .contains("Share View") - // .click(); - mainPage.shareView().click(); - - // copy link text, visit URL - cy.getActiveModal() - .find(".share-link-box") - .contains("/nc/form/", { timeout: 10000 }) - .then(($obj) => { - let linkText = $obj.text().trim(); - cy.log(linkText); - cy.visit(linkText, { - baseUrl: null, - }); - - // wait for share view page to load! - - cy.get("#data-table-form-Country").should("exist").type("_abc"); - cy.get("#data-table-form-LastUpdate").click(); - cy.getActiveModal().find("button").contains("19").click(); - cy.getActiveModal().find("button").contains("OK").click(); - - cy.get(".nc-field-editables") - .last() - .find('input[type="file"]') - .attachFile(`sampleFiles/1.json`); - - // submit button & validate - cy.get(".nc-form").find("button").contains("Submit").click(); - cy.toastWait("Saved successfully"); + it(`Form view with Attachment field- Submit & verify`, () => { + // create form-view + cy.get(`.nc-create-form-view`).click(); + cy.getActiveModal().find("button:contains(Submit)").click(); + + cy.toastWait("View created successfully"); + + cy.get(`.nc-view-item.nc-form-view-item`) + .contains("Country1") + .click(); + + // cy.get(".v-navigation-drawer__content > .container") + // .should("exist") + // .find(".v-list > .v-list-item") + // .contains("Share View") + // .click(); + mainPage.shareView().click(); + + // copy link text, visit URL + cy.getActiveModal() + .find(".share-link-box") + .contains("/nc/form/", { timeout: 10000 }) + .then(($obj) => { + let linkText = $obj.text().trim(); + cy.log(linkText); + cy.visit(linkText, { + baseUrl: null, + }); + + // wait for share view page to load! + + cy.get("#data-table-form-Country") + .should("exist") + .type("_abc"); + cy.get("#data-table-form-LastUpdate").click(); + cy.getActiveModal().find("button").contains("19").click(); + cy.getActiveModal().find("button").contains("OK").click(); + + cy.get(".nc-field-editables") + .last() + .find('input[type="file"]') + .attachFile(`sampleFiles/1.json`); + + // submit button & validate + cy.get(".nc-form") + .find("button") + .contains("Submit") + .click(); + cy.toastWait("Saved successfully"); + }); }); - }); - it(`Filter column which contain only attachments, download CSV`, () => { - // come back to main window - loginPage.loginAndOpenProject(apiType, dbType); - cy.openTableTab("Country", 25); - - mainPage.filterField("testAttach", "is not null", null); - mainPage.hideField("LastUpdate"); - - const verifyCsv = (retrievedRecords) => { - let storedRecords = [ - `Country,Country => City,testAttach`, - `Afghanistan,Kabul,1.json(http://localhost:8080/dl/externalrest_5agd/db/country/testAttach_VWk3fz_1.json)`, - ]; - - expect(retrievedRecords[0]).to.be.equal(storedRecords[0]); - for (let i = 1; i < storedRecords.length; i++) { - const columns = retrievedRecords[i].split(","); - expect(columns[2]).to.contain(".json(http://localhost:8080/dl/"); - } - - cy.log(retrievedRecords[109]); - cy.log(retrievedRecords[110]); - cy.log(retrievedRecords[111]); - }; - - mainPage.downloadAndVerifyCsv(`Country_exported_1.csv`, verifyCsv); - mainPage.unhideField("LastUpdate"); - mainPage.filterReset(); + it(`Filter column which contain only attachments, download CSV`, () => { + // come back to main window + loginPage.loginAndOpenProject(apiType, dbType); + cy.openTableTab("Country", 25); + + mainPage.filterField("testAttach", "is not null", null); + mainPage.hideField("LastUpdate"); + + const verifyCsv = (retrievedRecords) => { + let storedRecords = [ + `Country,Country => City,testAttach`, + `Afghanistan,Kabul,1.json(http://localhost:8080/dl/externalrest_5agd/db/country/testAttach_VWk3fz_1.json)`, + ]; + + expect(retrievedRecords[0]).to.be.equal(storedRecords[0]); + for (let i = 1; i < storedRecords.length; i++) { + const columns = retrievedRecords[i].split(","); + expect(columns[2]).to.contain( + ".json(http://localhost:8080/dl/" + ); + } + + cy.log(retrievedRecords[109]); + cy.log(retrievedRecords[110]); + cy.log(retrievedRecords[111]); + }; + + mainPage.downloadAndVerifyCsv(`Country_exported_1.csv`, verifyCsv); + mainPage.unhideField("LastUpdate"); + mainPage.filterReset(); + }); }); - }); }; /** diff --git a/scripts/cypress/integration/spec/roleValidation.spec.js b/scripts/cypress/integration/spec/roleValidation.spec.js index 696243c714..449f2d48aa 100644 --- a/scripts/cypress/integration/spec/roleValidation.spec.js +++ b/scripts/cypress/integration/spec/roleValidation.spec.js @@ -7,115 +7,129 @@ import { roles } from "../../support/page_objects/projectConstants"; // 3. Preview mode menu // export function _advSettings(roleType, previewMode) { - let validationString = - true == roles[roleType].validations.advSettings ? "exist" : "not.exist"; - - // audit/advance settings menu visible only for owner/ creator - mainPage.navigationDraw(mainPage.AUDIT).should(validationString); - mainPage.navigationDraw(mainPage.APPSTORE).should(validationString); - mainPage.navigationDraw(mainPage.TEAM_N_AUTH).should(validationString); - mainPage.navigationDraw(mainPage.PROJ_METADATA).should(validationString); - - // option to add new user conditionally visible only to owner/ creator - cy.get('button:contains("New User")').should(validationString); - - if (true == previewMode) { - // preview mode, role toggle menubar is visible - mainPage.navigationDraw(mainPage.ROLE_VIEW_EDITOR).should("exist"); - mainPage.navigationDraw(mainPage.ROLE_VIEW_COMMENTER).should("exist"); - mainPage.navigationDraw(mainPage.ROLE_VIEW_VIEWER).should("exist"); - mainPage.navigationDraw(mainPage.ROLE_VIEW_RESET).should("exist"); - } else { - // normal mode, role toggle menubar is visible only for owner/ creator - mainPage.navigationDraw(mainPage.ROLE_VIEW_EDITOR).should(validationString); - mainPage - .navigationDraw(mainPage.ROLE_VIEW_COMMENTER) - .should(validationString); - mainPage.navigationDraw(mainPage.ROLE_VIEW_VIEWER).should(validationString); - } + let validationString = + true == roles[roleType].validations.advSettings ? "exist" : "not.exist"; + + // audit/advance settings menu visible only for owner/ creator + mainPage.navigationDraw(mainPage.AUDIT).should(validationString); + mainPage.navigationDraw(mainPage.APPSTORE).should(validationString); + mainPage.navigationDraw(mainPage.TEAM_N_AUTH).should(validationString); + mainPage.navigationDraw(mainPage.PROJ_METADATA).should(validationString); + + // option to add new user conditionally visible only to owner/ creator + cy.get('button:contains("New User")').should(validationString); + + if (true == previewMode) { + // preview mode, role toggle menubar is visible + mainPage.navigationDraw(mainPage.ROLE_VIEW_EDITOR).should("exist"); + mainPage.navigationDraw(mainPage.ROLE_VIEW_COMMENTER).should("exist"); + mainPage.navigationDraw(mainPage.ROLE_VIEW_VIEWER).should("exist"); + mainPage.navigationDraw(mainPage.ROLE_VIEW_RESET).should("exist"); + } else { + // normal mode, role toggle menubar is visible only for owner/ creator + mainPage + .navigationDraw(mainPage.ROLE_VIEW_EDITOR) + .should(validationString); + mainPage + .navigationDraw(mainPage.ROLE_VIEW_COMMENTER) + .should(validationString); + mainPage + .navigationDraw(mainPage.ROLE_VIEW_VIEWER) + .should(validationString); + } } export function _editSchema(roleType, previewMode) { - let columnName = "City"; - let validationString = - true == roles[roleType].validations.editSchema ? "exist" : "not.exist"; + let columnName = "City"; + let validationString = + true == roles[roleType].validations.editSchema ? "exist" : "not.exist"; - if (false == previewMode) { - cy.openTableTab(columnName, 25); - } - - // create table options - // - cy.get(".add-btn").should(validationString); - cy.get(".v-tabs-bar") - .eq(0) - .find("button.mdi-plus-box") - .should(validationString); - - // delete table option - // - cy.get(".nc-table-delete-btn").should(validationString); - - // add new column option - // - cy.get(".new-column-header").should(validationString); - - // update column (edit/ delete menu) - // - cy.get(`th:contains(${columnName}) .mdi-menu-down`).should(validationString); -} + if (false == previewMode) { + cy.openTableTab(columnName, 25); + } -export function _editData(roleType, previewMode) { - let columnName = "City"; - let validationString = - true == roles[roleType].validations.editData ? "exist" : "not.exist"; + // create table options + // + cy.get(".add-btn").should(validationString); + cy.get(".v-tabs-bar") + .eq(0) + .find("button.mdi-plus-box") + .should(validationString); - cy.openTableTab(columnName, 25); + // delete table option + // + cy.get(".nc-table-delete-btn").should(validationString); - // add new row option (from menu header) - // - cy.get(".nc-add-new-row-btn").should(validationString); + // add new column option + // + cy.get(".new-column-header").should(validationString); - // update row option (right click) - // - cy.get(`tbody > :nth-child(4) > [data-col="City"]`).rightclick(); - cy.get(".menuable__content__active").should(validationString); + // update column (edit/ delete menu) + // + cy.get(`th:contains(${columnName}) .mdi-menu-down`).should( + validationString + ); +} - if (validationString == "exist") { - // right click options will exist (only for 'exist' case) +export function _editData(roleType, previewMode) { + let columnName = "City"; + let validationString = + true == roles[roleType].validations.editData ? "exist" : "not.exist"; + + cy.openTableTab(columnName, 25); + + // add new row option (from menu header) // - cy.getActiveMenu().contains("Insert New Row").should(validationString); - cy.getActiveMenu().contains("Delete Row").should(validationString); - cy.getActiveMenu() - .contains("Delete Selected Rows") - .should(validationString); - cy.get("body").type("{esc}"); + cy.get(".nc-add-new-row-btn").should(validationString); - // update cell contents option using row expander should be enabled + // update row option (right click) // - //cy.get('.nc-row-expand-icon').eq(4).click({ force: true }) - cy.get(".v-input.row-checkbox").eq(4).next().next().click({ force: true }); - cy.getActiveModal().find("button").contains("Save row").should("exist"); - cy.get("body").type("{esc}"); - } else { - // update cell contents option using row expander should be disabled + cy.get(`tbody > :nth-child(4) > [data-col="City"]`).rightclick(); + cy.get(".menuable__content__active").should(validationString); + + if (validationString == "exist") { + // right click options will exist (only for 'exist' case) + // + cy.getActiveMenu().contains("Insert New Row").should(validationString); + cy.getActiveMenu().contains("Delete Row").should(validationString); + cy.getActiveMenu() + .contains("Delete Selected Rows") + .should(validationString); + cy.get("body").type("{esc}"); + + // update cell contents option using row expander should be enabled + // + //cy.get('.nc-row-expand-icon').eq(4).click({ force: true }) + cy.get(".v-input.row-checkbox") + .eq(4) + .next() + .next() + .click({ force: true }); + cy.getActiveModal().find("button").contains("Save row").should("exist"); + cy.get("body").type("{esc}"); + } else { + // update cell contents option using row expander should be disabled + // + //cy.get('.nc-row-expand-icon').eq(4).click({ force: true }) + cy.get(".v-input.row-checkbox") + .eq(4) + .next() + .next() + .click({ force: true }); + cy.getActiveModal() + .find("button:disabled") + .contains("Save row") + .should("exist"); + cy.getActiveModal().find("button").contains("Cancel").click(); + cy.get("body").type("{esc}"); + } + + // double click cell entries to edit // - //cy.get('.nc-row-expand-icon').eq(4).click({ force: true }) - cy.get(".v-input.row-checkbox").eq(4).next().next().click({ force: true }); - cy.getActiveModal() - .find("button:disabled") - .contains("Save row") - .should("exist"); - cy.getActiveModal().find("button").contains("Cancel").click(); - cy.get("body").type("{esc}"); - } - - // double click cell entries to edit - // - cy.get(`tbody > :nth-child(4) > [data-col="City"]`) - .dblclick() - .find("input") - .should(validationString); + cy.get(`tbody > :nth-child(4) > [data-col="City"]`) + .dblclick() + .find("input") + .should(validationString); } // read &/ update comment @@ -123,146 +137,152 @@ export function _editData(roleType, previewMode) { // Everyone else: read &/ update // export function _editComment(roleType, previewMode) { - let columnName = "City"; - let validationString = - true == roles[roleType].validations.editComment - ? "Comment added successfully" - : "Not allowed"; + let columnName = "City"; + let validationString = + true == roles[roleType].validations.editComment + ? "Comment added successfully" + : "Not allowed"; - cy.openTableTab(columnName, 25); + cy.openTableTab(columnName, 25); - // click on comment icon & type comment - // + // click on comment icon & type comment + // - cy.get(".v-input.row-checkbox").eq(4).next().next().click({ force: true }); + cy.get(".v-input.row-checkbox").eq(4).next().next().click({ force: true }); - // Expected response: - // Viewer: Not able to see comment option - // Everyone else: Comment added/read successfully - // + // Expected response: + // Viewer: Not able to see comment option + // Everyone else: Comment added/read successfully + // + + if ("viewer" == roleType) { + cy.getActiveModal() + .find(".mdi-comment-multiple-outline") + .should("not.exist"); + } else { + cy.getActiveModal() + .find(".mdi-comment-multiple-outline") + .should("exist") + .click(); + cy.getActiveModal().find(".comment-box").type("Comment-1{enter}"); + // cy.toastWait('Comment added successfully') + cy.getActiveModal().find(".mdi-door-open").click(); + + cy.get("body") + .contains(validationString, { timeout: 2000 }) + .should("exist"); + } - if ("viewer" == roleType) { - cy.getActiveModal() - .find(".mdi-comment-multiple-outline") - .should("not.exist"); - } else { cy.getActiveModal() - .find(".mdi-comment-multiple-outline") - .should("exist") - .click(); - cy.getActiveModal().find(".comment-box").type("Comment-1{enter}"); - // cy.toastWait('Comment added successfully') - cy.getActiveModal().find(".mdi-door-open").click(); - - cy.get("body") - .contains(validationString, { timeout: 2000 }) - .should("exist"); - } - - cy.getActiveModal().find("button").contains("Cancel").should("exist").click(); - cy.get("body").type("{esc}"); + .find("button") + .contains("Cancel") + .should("exist") + .click(); + cy.get("body").type("{esc}"); } // right navigation menu bar // Editor/Viewer/Commenter : can only view 'existing' views // Rest: can create/edit export function _viewMenu(roleType, previewMode) { - let columnName = "City"; - let navDrawListCnt = 2; - let actionsMenuItemsCnt = 1; - - cy.openTableTab(columnName, 25); - - let validationString = - true == roles[roleType].validations.shareView ? "exist" : "not.exist"; - - // validate if Share button is visible at header tool bar - cy.get("header.v-toolbar") - .eq(0) - .find('button:contains("Share")') - .should(validationString); - - // Owner, Creator will have two navigation drawer (on each side of center panel) - if (roleType == "owner" || roleType == "creator") { - navDrawListCnt = 3; - actionsMenuItemsCnt = 4; - } - - cy.get(".v-navigation-drawer__content") - .eq(1) - .find('[role="list"]') - .should("have.length", navDrawListCnt); - - // view list field (default GRID view) - cy.get(`.nc-view-item`).should("exist"); - - // view create option, exists only for owner/ creator - cy.get(`.nc-create-gallery-view`).should(validationString); - cy.get(`.nc-create-grid-view`).should(validationString); - cy.get(`.nc-create-form-view`).should(validationString); - - // share view & automations, exists only for owner/creator - // cy.get(`.nc-share-view`).should(validationString); - // cy.get(`.nc-automations`).should(validationString); - // mainPage.shareView().should(validationString); - // mainPage.automations().should(validationString); - - // share view permissions are role specific - cy.get('.nc-btn-share-view').should(validationString); - - // actions menu (more), only download csv should be visible for non-previlaged users - cy.get('.nc-actions-menu-btn').click(); - cy.getActiveMenu().find('[role="menuitem"]').should("have.length", actionsMenuItemsCnt); + let columnName = "City"; + let navDrawListCnt = 2; + let actionsMenuItemsCnt = 1; + + cy.openTableTab(columnName, 25); + + let validationString = + true == roles[roleType].validations.shareView ? "exist" : "not.exist"; + + // validate if Share button is visible at header tool bar + cy.get("header.v-toolbar") + .eq(0) + .find('button:contains("Share")') + .should(validationString); + + // Owner, Creator will have two navigation drawer (on each side of center panel) + if (roleType == "owner" || roleType == "creator") { + navDrawListCnt = 3; + actionsMenuItemsCnt = 4; + } + + cy.get(".v-navigation-drawer__content") + .eq(1) + .find('[role="list"]') + .should("have.length", navDrawListCnt); + + // view list field (default GRID view) + cy.get(`.nc-view-item`).should("exist"); + + // view create option, exists only for owner/ creator + cy.get(`.nc-create-gallery-view`).should(validationString); + cy.get(`.nc-create-grid-view`).should(validationString); + cy.get(`.nc-create-form-view`).should(validationString); + + // share view & automations, exists only for owner/creator + // cy.get(`.nc-share-view`).should(validationString); + // cy.get(`.nc-automations`).should(validationString); + // mainPage.shareView().should(validationString); + // mainPage.automations().should(validationString); + + // share view permissions are role specific + cy.get(".nc-btn-share-view").should(validationString); + + // actions menu (more), only download csv should be visible for non-previlaged users + cy.get(".nc-actions-menu-btn").click(); + cy.getActiveMenu() + .find('[role="menuitem"]') + .should("have.length", actionsMenuItemsCnt); } export function _topRightMenu(roleType, previewMode) { - let validationString = - true == roles[roleType].validations.shareView ? "exist" : "not.exist"; - cy.get(".nc-topright-menu").find(".nc-menu-share").should(validationString); - - // cy.get(".nc-topright-menu").find(".nc-menu-theme").should("exist"); - // cy.get(".nc-topright-menu").find(".nc-menu-dark-theme").should("exist"); - cy.get(".nc-topright-menu").find(".nc-menu-translate").should("exist"); - cy.get(".nc-topright-menu").find(".nc-menu-account").should("exist"); - cy.get(".nc-topright-menu").find(".nc-menu-alert").should("exist"); + let validationString = + true == roles[roleType].validations.shareView ? "exist" : "not.exist"; + cy.get(".nc-topright-menu").find(".nc-menu-share").should(validationString); + + // cy.get(".nc-topright-menu").find(".nc-menu-theme").should("exist"); + // cy.get(".nc-topright-menu").find(".nc-menu-dark-theme").should("exist"); + cy.get(".nc-topright-menu").find(".nc-menu-translate").should("exist"); + cy.get(".nc-topright-menu").find(".nc-menu-account").should("exist"); + cy.get(".nc-topright-menu").find(".nc-menu-alert").should("exist"); } // Access control list // export function disableTableAccess(tbl, role) { - const cls = `.nc-acl-${tbl}-${role}-chkbox`; - cy.get(cls).find("input").should("be.checked").click({ force: true }); - cy.get(cls).find("input").should("not.be.checked"); - cy.get(".nc-acl-save").next().click({ force: true }); - cy.toastWait("Updated UI ACL for tables successfully"); + const cls = `.nc-acl-${tbl}-${role}-chkbox`; + cy.get(cls).find("input").should("be.checked").click({ force: true }); + cy.get(cls).find("input").should("not.be.checked"); + cy.get(".nc-acl-save").next().click({ force: true }); + cy.toastWait("Updated UI ACL for tables successfully"); } export function enableTableAccess(tbl, role) { - const cls = `.nc-acl-${tbl}-${role}-chkbox`; - cy.get(cls).find("input").should("not.be.checked").click({ force: true }); - cy.get(cls).find("input").should("be.checked"); - cy.get(".nc-acl-save").next().click({ force: true }); - cy.toastWait("Updated UI ACL for tables successfully"); + const cls = `.nc-acl-${tbl}-${role}-chkbox`; + cy.get(cls).find("input").should("not.be.checked").click({ force: true }); + cy.get(cls).find("input").should("be.checked"); + cy.get(".nc-acl-save").next().click({ force: true }); + cy.toastWait("Updated UI ACL for tables successfully"); } export function _accessControl(roleType, previewMode) { - let validationString = roleType == "creator" ? "exist" : "not.exist"; - cy.get(".nc-project-tree") - .find(".v-list-item__title:contains(Tables)", { timeout: 10000 }) - .should("exist") - .first() - .click({ force: true }); - - cy.get(".nc-project-tree") - .contains("Language", { timeout: 6000 }) - .should(validationString); - - cy.get(".nc-project-tree") - .contains("CustomerList", { timeout: 6000 }) - .should(validationString); - - cy.get(".nc-project-tree") - .find(".v-list-item__title:contains(Tables)", { timeout: 10000 }) - .first() - .click({ force: true }); + let validationString = roleType == "creator" ? "exist" : "not.exist"; + cy.get(".nc-project-tree") + .find(".v-list-item__title:contains(Tables)", { timeout: 10000 }) + .should("exist") + .first() + .click({ force: true }); + + cy.get(".nc-project-tree") + .contains("Language", { timeout: 6000 }) + .should(validationString); + + cy.get(".nc-project-tree") + .contains("CustomerList", { timeout: 6000 }) + .should(validationString); + + cy.get(".nc-project-tree") + .find(".v-list-item__title:contains(Tables)", { timeout: 10000 }) + .first() + .click({ force: true }); } diff --git a/scripts/cypress/integration/test/gqlRoles.js b/scripts/cypress/integration/test/gqlRoles.js index 0bae85e8ca..e1dd1e8c96 100644 --- a/scripts/cypress/integration/test/gqlRoles.js +++ b/scripts/cypress/integration/test/gqlRoles.js @@ -3,7 +3,7 @@ let t01 = require("../common/00_pre_configurations"); let t5a = require("../common/5a_user_role"); let t5b = require("../common/5b_preview_role"); const { - setCurrentMode, + setCurrentMode, } = require("../../support/page_objects/projectConstants"); // use 0 as mode to execute individual files (debug mode, skip pre-configs) @@ -11,15 +11,15 @@ const { const executionMode = 1; const nocoTestSuite = (apiType, dbType) => { - setCurrentMode(apiType, dbType); - if (0 == executionMode) { - t0.genTest(apiType, dbType); - } else { - t01.genTest(apiType, dbType); - } + setCurrentMode(apiType, dbType); + if (0 == executionMode) { + t0.genTest(apiType, dbType); + } else { + t01.genTest(apiType, dbType); + } - t5a.genTest(apiType, dbType); - t5b.genTest(apiType, dbType); + t5a.genTest(apiType, dbType); + t5b.genTest(apiType, dbType); }; nocoTestSuite("graphql", "mysql"); diff --git a/scripts/cypress/integration/test/gqlTableOps.js b/scripts/cypress/integration/test/gqlTableOps.js index 9fc51bf759..4bf3c30a23 100644 --- a/scripts/cypress/integration/test/gqlTableOps.js +++ b/scripts/cypress/integration/test/gqlTableOps.js @@ -12,7 +12,7 @@ let t3b = require("../common/3b_formula_column"); let t3c = require("../common/3c_lookup_column"); let t3d = require("../common/3d_rollup_column"); const { - setCurrentMode, + setCurrentMode, } = require("../../support/page_objects/projectConstants"); // use 0 as mode to execute individual files (debug mode, skip pre-configs) @@ -20,24 +20,24 @@ const { const executionMode = 1; const nocoTestSuite = (apiType, dbType) => { - if (0 == executionMode) { - setCurrentMode(apiType, dbType); - t0.genTest(apiType, dbType); - } else { - t01.genTest(apiType, dbType); - } + if (0 == executionMode) { + setCurrentMode(apiType, dbType); + t0.genTest(apiType, dbType); + } else { + t01.genTest(apiType, dbType); + } - t1a.genTest(apiType, dbType); - t1b.genTest(apiType, dbType); - t1c.genTest(apiType, dbType); - t1d.genTest(apiType, dbType); - t1e.genTest(apiType, dbType); - t2a.genTest(apiType, dbType); - t2b.genTest(apiType, dbType); - t3a.genTest(apiType, dbType); - t3b.genTest(apiType, dbType); - t3c.genTest(apiType, dbType); - t3d.genTest(apiType, dbType); + t1a.genTest(apiType, dbType); + t1b.genTest(apiType, dbType); + t1c.genTest(apiType, dbType); + t1d.genTest(apiType, dbType); + t1e.genTest(apiType, dbType); + t2a.genTest(apiType, dbType); + t2b.genTest(apiType, dbType); + t3a.genTest(apiType, dbType); + t3b.genTest(apiType, dbType); + t3c.genTest(apiType, dbType); + t3d.genTest(apiType, dbType); }; nocoTestSuite("graphql", "mysql"); diff --git a/scripts/cypress/integration/test/gqlViews.js b/scripts/cypress/integration/test/gqlViews.js index 5cca1d2a00..6005036e0a 100644 --- a/scripts/cypress/integration/test/gqlViews.js +++ b/scripts/cypress/integration/test/gqlViews.js @@ -7,7 +7,7 @@ let t4d = require("../common/4d_table_view_grid_locked"); let t4e = require("../common/4e_form_view_share"); let t4f = require("../common/4f_grid_view_share"); const { - setCurrentMode, + setCurrentMode, } = require("../../support/page_objects/projectConstants"); // use 0 as mode to execute individual files (debug mode, skip pre-configs) @@ -15,19 +15,19 @@ const { const executionMode = 1; const nocoTestSuite = (apiType, dbType) => { - setCurrentMode(apiType, dbType); - if (0 == executionMode) { - t0.genTest(apiType, dbType); - } else { - t01.genTest(apiType, dbType); - } + setCurrentMode(apiType, dbType); + if (0 == executionMode) { + t0.genTest(apiType, dbType); + } else { + t01.genTest(apiType, dbType); + } - t4a.genTest(apiType, dbType); - t4b.genTest(apiType, dbType); - t4c.genTest(apiType, dbType); - t4d.genTest(apiType, dbType); - t4e.genTest(apiType, dbType); - t4f.genTest(apiType, dbType); + t4a.genTest(apiType, dbType); + t4b.genTest(apiType, dbType); + t4c.genTest(apiType, dbType); + t4d.genTest(apiType, dbType); + t4e.genTest(apiType, dbType); + t4f.genTest(apiType, dbType); }; nocoTestSuite("graphql", "mysql"); diff --git a/scripts/cypress/integration/test/restRoles.js b/scripts/cypress/integration/test/restRoles.js index 769476b911..4124bcba6a 100644 --- a/scripts/cypress/integration/test/restRoles.js +++ b/scripts/cypress/integration/test/restRoles.js @@ -3,7 +3,7 @@ let t01 = require("../common/00_pre_configurations"); let t5a = require("../common/5a_user_role"); let t5b = require("../common/5b_preview_role"); const { - setCurrentMode, + setCurrentMode, } = require("../../support/page_objects/projectConstants"); // use 0 as mode to execute individual files (debug mode, skip pre-configs) @@ -11,15 +11,15 @@ const { const executionMode = 1; const nocoTestSuite = (apiType, dbType) => { - setCurrentMode(apiType, dbType); - if (0 == executionMode) { - t0.genTest(apiType, dbType); - } else { - t01.genTest(apiType, dbType); - } + setCurrentMode(apiType, dbType); + if (0 == executionMode) { + t0.genTest(apiType, dbType); + } else { + t01.genTest(apiType, dbType); + } - t5a.genTest(apiType, dbType); - t5b.genTest(apiType, dbType); + t5a.genTest(apiType, dbType); + t5b.genTest(apiType, dbType); }; nocoTestSuite("rest", "mysql"); diff --git a/scripts/cypress/integration/test/restTableOps.js b/scripts/cypress/integration/test/restTableOps.js index fe243d382d..750cf629f1 100644 --- a/scripts/cypress/integration/test/restTableOps.js +++ b/scripts/cypress/integration/test/restTableOps.js @@ -12,7 +12,7 @@ let t3b = require("../common/3b_formula_column"); let t3c = require("../common/3c_lookup_column"); let t3d = require("../common/3d_rollup_column"); const { - setCurrentMode, + setCurrentMode, } = require("../../support/page_objects/projectConstants"); // use 0 as mode to execute individual files (debug mode, skip pre-configs) @@ -20,24 +20,24 @@ const { const executionMode = 1; const nocoTestSuite = (apiType, dbType) => { - setCurrentMode(apiType, dbType); - if (0 == executionMode) { - t0.genTest(apiType, dbType); - } else { - t01.genTest(apiType, dbType); - } + setCurrentMode(apiType, dbType); + if (0 == executionMode) { + t0.genTest(apiType, dbType); + } else { + t01.genTest(apiType, dbType); + } - t1a.genTest(apiType, dbType); - t1b.genTest(apiType, dbType); - t1c.genTest(apiType, dbType); - t1d.genTest(apiType, dbType); - t1e.genTest(apiType, dbType); - t2a.genTest(apiType, dbType); - t2b.genTest(apiType, dbType); - t3a.genTest(apiType, dbType); - t3b.genTest(apiType, dbType); - t3c.genTest(apiType, dbType); - t3d.genTest(apiType, dbType); + t1a.genTest(apiType, dbType); + t1b.genTest(apiType, dbType); + t1c.genTest(apiType, dbType); + t1d.genTest(apiType, dbType); + t1e.genTest(apiType, dbType); + t2a.genTest(apiType, dbType); + t2b.genTest(apiType, dbType); + t3a.genTest(apiType, dbType); + t3b.genTest(apiType, dbType); + t3c.genTest(apiType, dbType); + t3d.genTest(apiType, dbType); }; nocoTestSuite("rest", "mysql"); diff --git a/scripts/cypress/integration/test/restViews.js b/scripts/cypress/integration/test/restViews.js index 7920dd74fb..d413dc2866 100644 --- a/scripts/cypress/integration/test/restViews.js +++ b/scripts/cypress/integration/test/restViews.js @@ -7,7 +7,7 @@ let t4d = require("../common/4d_table_view_grid_locked"); let t4e = require("../common/4e_form_view_share"); let t4f = require("../common/4f_grid_view_share"); const { - setCurrentMode, + setCurrentMode, } = require("../../support/page_objects/projectConstants"); // use 0 as mode to execute individual files (debug mode, skip pre-configs) @@ -15,19 +15,19 @@ const { const executionMode = 1; const nocoTestSuite = (apiType, dbType) => { - setCurrentMode(apiType, dbType); - if (0 == executionMode) { - t0.genTest(apiType, dbType); - } else { - t01.genTest(apiType, dbType); - } + setCurrentMode(apiType, dbType); + if (0 == executionMode) { + t0.genTest(apiType, dbType); + } else { + t01.genTest(apiType, dbType); + } - t4a.genTest(apiType, dbType); - t4b.genTest(apiType, dbType); - t4c.genTest(apiType, dbType); - t4d.genTest(apiType, dbType); - t4e.genTest(apiType, dbType); - t4f.genTest(apiType, dbType); + t4a.genTest(apiType, dbType); + t4b.genTest(apiType, dbType); + t4c.genTest(apiType, dbType); + t4d.genTest(apiType, dbType); + t4e.genTest(apiType, dbType); + t4f.genTest(apiType, dbType); }; nocoTestSuite("rest", "mysql"); diff --git a/scripts/cypress/integration/test/xcdb-gqlRoles.js b/scripts/cypress/integration/test/xcdb-gqlRoles.js index 2747267b81..ef418410b5 100644 --- a/scripts/cypress/integration/test/xcdb-gqlRoles.js +++ b/scripts/cypress/integration/test/xcdb-gqlRoles.js @@ -3,7 +3,7 @@ let t01 = require("../common/00_pre_configurations"); let t5a = require("../common/5a_user_role"); let t5b = require("../common/5b_preview_role"); const { - setCurrentMode, + setCurrentMode, } = require("../../support/page_objects/projectConstants"); // use 0 as mode to execute individual files (debug mode, skip pre-configs) @@ -11,15 +11,15 @@ const { const executionMode = 1; const nocoTestSuite = (apiType, dbType) => { - setCurrentMode(apiType, dbType); - if (0 == executionMode) { - t0.genTest(apiType, dbType); - } else { - t01.genTest(apiType, dbType); - } + setCurrentMode(apiType, dbType); + if (0 == executionMode) { + t0.genTest(apiType, dbType); + } else { + t01.genTest(apiType, dbType); + } - t5a.genTest(apiType, dbType); - t5b.genTest(apiType, dbType); + t5a.genTest(apiType, dbType); + t5b.genTest(apiType, dbType); }; nocoTestSuite("graphql", "xcdb"); diff --git a/scripts/cypress/integration/test/xcdb-gqlTableOps.js b/scripts/cypress/integration/test/xcdb-gqlTableOps.js index 3a8969de40..7b8c2bed1d 100644 --- a/scripts/cypress/integration/test/xcdb-gqlTableOps.js +++ b/scripts/cypress/integration/test/xcdb-gqlTableOps.js @@ -12,7 +12,7 @@ let t3b = require("../common/3b_formula_column"); let t3c = require("../common/3c_lookup_column"); let t3d = require("../common/3d_rollup_column"); const { - setCurrentMode, + setCurrentMode, } = require("../../support/page_objects/projectConstants"); // use 0 as mode to execute individual files (debug mode, skip pre-configs) @@ -20,24 +20,24 @@ const { const executionMode = 1; const nocoTestSuite = (apiType, dbType) => { - setCurrentMode(apiType, dbType); - if (0 == executionMode) { - t0.genTest(apiType, dbType); - } else { - t01.genTest(apiType, dbType); - } + setCurrentMode(apiType, dbType); + if (0 == executionMode) { + t0.genTest(apiType, dbType); + } else { + t01.genTest(apiType, dbType); + } - t1a.genTest(apiType, dbType); - t1b.genTest(apiType, dbType); - t1c.genTest(apiType, dbType); - t1d.genTest(apiType, dbType); - t1e.genTest(apiType, dbType); - t2a.genTest(apiType, dbType); - t2b.genTest(apiType, dbType); - t3a.genTest(apiType, dbType); - t3b.genTest(apiType, dbType); - t3c.genTest(apiType, dbType); - t3d.genTest(apiType, dbType); + t1a.genTest(apiType, dbType); + t1b.genTest(apiType, dbType); + t1c.genTest(apiType, dbType); + t1d.genTest(apiType, dbType); + t1e.genTest(apiType, dbType); + t2a.genTest(apiType, dbType); + t2b.genTest(apiType, dbType); + t3a.genTest(apiType, dbType); + t3b.genTest(apiType, dbType); + t3c.genTest(apiType, dbType); + t3d.genTest(apiType, dbType); }; nocoTestSuite("graphql", "xcdb"); diff --git a/scripts/cypress/integration/test/xcdb-gqlViews.js b/scripts/cypress/integration/test/xcdb-gqlViews.js index 295c1160ea..0459053cf1 100644 --- a/scripts/cypress/integration/test/xcdb-gqlViews.js +++ b/scripts/cypress/integration/test/xcdb-gqlViews.js @@ -7,7 +7,7 @@ let t4d = require("../common/4d_table_view_grid_locked"); let t4e = require("../common/4e_form_view_share"); let t4f = require("../common/4f_grid_view_share"); const { - setCurrentMode, + setCurrentMode, } = require("../../support/page_objects/projectConstants"); // use 0 as mode to execute individual files (debug mode, skip pre-configs) @@ -15,19 +15,19 @@ const { const executionMode = 1; const nocoTestSuite = (apiType, dbType) => { - setCurrentMode(apiType, dbType); - if (0 == executionMode) { - t0.genTest(apiType, dbType); - } else { - t01.genTest(apiType, dbType); - } + setCurrentMode(apiType, dbType); + if (0 == executionMode) { + t0.genTest(apiType, dbType); + } else { + t01.genTest(apiType, dbType); + } - t4a.genTest(apiType, dbType); - t4b.genTest(apiType, dbType); - t4c.genTest(apiType, dbType); - t4d.genTest(apiType, dbType); - t4e.genTest(apiType, dbType); - t4f.genTest(apiType, dbType); + t4a.genTest(apiType, dbType); + t4b.genTest(apiType, dbType); + t4c.genTest(apiType, dbType); + t4d.genTest(apiType, dbType); + t4e.genTest(apiType, dbType); + t4f.genTest(apiType, dbType); }; nocoTestSuite("graphql", "xcdb"); diff --git a/scripts/cypress/integration/test/xcdb-restRoles.js b/scripts/cypress/integration/test/xcdb-restRoles.js index 0b1a93a70c..2857ac18dc 100644 --- a/scripts/cypress/integration/test/xcdb-restRoles.js +++ b/scripts/cypress/integration/test/xcdb-restRoles.js @@ -3,7 +3,7 @@ let t01 = require("../common/00_pre_configurations"); let t5a = require("../common/5a_user_role"); let t5b = require("../common/5b_preview_role"); const { - setCurrentMode, + setCurrentMode, } = require("../../support/page_objects/projectConstants"); // use 0 as mode to execute individual files (debug mode, skip pre-configs) @@ -11,15 +11,15 @@ const { const executionMode = 1; const nocoTestSuite = (apiType, dbType) => { - setCurrentMode(apiType, dbType); - if (0 == executionMode) { - t0.genTest(apiType, dbType); - } else { - t01.genTest(apiType, dbType); - } + setCurrentMode(apiType, dbType); + if (0 == executionMode) { + t0.genTest(apiType, dbType); + } else { + t01.genTest(apiType, dbType); + } - t5a.genTest(apiType, dbType); - t5b.genTest(apiType, dbType); + t5a.genTest(apiType, dbType); + t5b.genTest(apiType, dbType); }; nocoTestSuite("rest", "xcdb"); diff --git a/scripts/cypress/integration/test/xcdb-restTableOps.js b/scripts/cypress/integration/test/xcdb-restTableOps.js index 9f9c64342e..89a9121c1e 100644 --- a/scripts/cypress/integration/test/xcdb-restTableOps.js +++ b/scripts/cypress/integration/test/xcdb-restTableOps.js @@ -12,7 +12,7 @@ let t3b = require("../common/3b_formula_column"); let t3c = require("../common/3c_lookup_column"); let t3d = require("../common/3d_rollup_column"); const { - setCurrentMode, + setCurrentMode, } = require("../../support/page_objects/projectConstants"); // use 0 as mode to execute individual files (debug mode, skip pre-configs) @@ -20,24 +20,24 @@ const { const executionMode = 1; const nocoTestSuite = (apiType, dbType) => { - setCurrentMode(apiType, dbType); - if (0 == executionMode) { - t0.genTest(apiType, dbType); - } else { - t01.genTest(apiType, dbType); - } + setCurrentMode(apiType, dbType); + if (0 == executionMode) { + t0.genTest(apiType, dbType); + } else { + t01.genTest(apiType, dbType); + } - t1a.genTest(apiType, dbType); - t1b.genTest(apiType, dbType); - t1c.genTest(apiType, dbType); - t1d.genTest(apiType, dbType); - t1e.genTest(apiType, dbType); - t2a.genTest(apiType, dbType); - t2b.genTest(apiType, dbType); - t3a.genTest(apiType, dbType); - t3b.genTest(apiType, dbType); - t3c.genTest(apiType, dbType); - t3d.genTest(apiType, dbType); + t1a.genTest(apiType, dbType); + t1b.genTest(apiType, dbType); + t1c.genTest(apiType, dbType); + t1d.genTest(apiType, dbType); + t1e.genTest(apiType, dbType); + t2a.genTest(apiType, dbType); + t2b.genTest(apiType, dbType); + t3a.genTest(apiType, dbType); + t3b.genTest(apiType, dbType); + t3c.genTest(apiType, dbType); + t3d.genTest(apiType, dbType); }; nocoTestSuite("rest", "xcdb"); diff --git a/scripts/cypress/support/index.js b/scripts/cypress/support/index.js index 87f8976576..3e3773f432 100644 --- a/scripts/cypress/support/index.js +++ b/scripts/cypress/support/index.js @@ -23,10 +23,10 @@ import "cypress-iframe"; // require('./commands') Cypress.on("uncaught:exception", (err, runnable) => { - // returning false here prevents Cypress from - // failing the test - console.log("uncaught:exception"); - console.log(err); - console.log(runnable); - return false; + // returning false here prevents Cypress from + // failing the test + console.log("uncaught:exception"); + console.log(err); + console.log(runnable); + return false; }); diff --git a/scripts/cypress/support/page_objects/mainPage.js b/scripts/cypress/support/page_objects/mainPage.js index e182165a58..8a783a55b4 100644 --- a/scripts/cypress/support/page_objects/mainPage.js +++ b/scripts/cypress/support/page_objects/mainPage.js @@ -89,9 +89,9 @@ export class _mainPage { // click on New User button, feed details cy.get('button:contains("New User")').first().click(); - + cy.snip("NewUser"); - + cy.get('label:contains("E-mail")') .next("input") .type(userCred.username) From 5511671426875c5aea5c117fc0ea8197b7713f40 Mon Sep 17 00:00:00 2001 From: Raju Udava <86527202+dstala@users.noreply.github.com> Date: Wed, 9 Mar 2022 08:20:39 +0530 Subject: [PATCH 43/49] chore: i18n translation for persian (wip) Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> --- packages/nc-gui/lang/fa.json | 513 ++++++++++++++++++++++++++++++++ packages/nc-gui/plugins/i18n.js | 69 ++--- 2 files changed, 548 insertions(+), 34 deletions(-) create mode 100644 packages/nc-gui/lang/fa.json diff --git a/packages/nc-gui/lang/fa.json b/packages/nc-gui/lang/fa.json new file mode 100644 index 0000000000..457ffce991 --- /dev/null +++ b/packages/nc-gui/lang/fa.json @@ -0,0 +1,513 @@ +{ + "general": { + "home": "خانه", + "load": "لود کردن", + "open": "باز کردن", + "close": "بستن", + "yes": "بله", + "no": "خیر", + "ok": "باشه", + "and": "و", + "or": "یا", + "add": "افزودن", + "edit": "ویرایش", + "remove": "حذف", + "save": "ذخیره", + "cancel": "لغو", + "submit": "ارسال", + "create": "ایجاد", + "insert": "درج کردن", + "delete": "حذف", + "update": "به‌روزرسانی", + "rename": "تغییر نام", + "reload": "بارگذاری مجدد", + "reset": "ریست", + "install": "نصب", + "show": "نمایش", + "hide": "پنهان کردن", + "showAll": "نمایش همه", + "hideAll": "پنهان کردن همه", + "showMore": "بیشتر", + "showOptions": "نمایش گزینه‌ها", + "hideOptions": "پنهان کردن گزینه‌ها", + "showMenu": "نمایش منو", + "hideMenu": "پنهان کردن منو", + "addAll": "اضافه کردن همه", + "removeAll": "حذف همه", + "signUp": "ثبت نام", + "signIn": "ورود", + "signOut": "خروج", + "required": "ضروری", + "preferred": "ارجح", + "mandatory": "اجباری", + "loading": "بارگیری...", + "title": "عنوان", + "upload": "بارگذاری", + "download": "دانلود", + "default": "پیش فرض", + "more": "بیشتر", + "less": "کمتر", + "event": "رویداد", + "condition": "شرایط. شرط", + "after": "بعد از", + "before": "قبل از", + "search": "جستجو کردن", + "notification": "اطلاع", + "reference": "ارجاع", + "function": "تابع" + }, + "objects": { + "project": "پروژه", + "projects": "پروژه‌ها", + "table": "جدول", + "tables": "جداول", + "field": "فیلد", + "fields": "فیلدها", + "column": "ستون", + "columns": "ستون‌ها", + "page": "صفحه", + "pages": "صفحات", + "record": "سابقه", + "records": "سوابق", + "webhook": "وب‌هوک", + "webhooks": "وب‌هوک‌ها", + "view": "نمایش", + "views": "نمایش‌ها", + "viewType": { + "grid": "شبکه‌ای", + "gallery": "گالری", + "form": "فرم", + "kanban": "کانبان", + "calendar": "تقویم" + }, + "user": "کاربر", + "users": "کاربران", + "role": "نقش", + "roles": "نقش‌ها", + "roleType": { + "owner": "مالک", + "creator": "ایجادکننده", + "editor": "ویرایش‌گر", + "commenter": "نظردهنده", + "viewer": "بیننده" + } + }, + "datatype": { + "ID": "شناسه (ID)", + "ForeignKey": "کلید خارجی", + "SingleLineText": "متن تک‌خطی", + "LongText": "متن طولانی", + "Attachment": "پیوست", + "Checkbox": "چک‌باکس", + "MultiSelect": "چندگزینه‌ای", + "SingleSelect": "تک‌گزینه‌ای", + "Collaborator": "همکار", + "Date": "تاریخ", + "Year": "سال", + "Time": "زمان", + "PhoneNumber": "شماره تلفن", + "Email": "پست الکترونیکی", + "URL": "URL", + "Number": "عدد", + "Decimal": "د‌ه‌دهی", + "Currency": "واحد پول", + "Percent": "درصد", + "Duration": "مدت زمان", + "Rating": "امتیاز", + "Formula": "فرمول", + "Rollup": "تجمیع کردن", + "Count": "شمردن", + "Lookup": "جست‌وجو", + "DateTime": "تاریخ و زمان", + "CreateTime": "ایجاد زمان", + "LastModifiedTime": "زمان آخرین اصلاح", + "AutoNumber": "شماره خودکار", + "Barcode": "بارکد", + "Button": "دکمه", + "Password": "کلمه عبور", + "relationProperties": { + "noAction": "هیچ اقدام", + "cascade": "آبشار", + "restrict": "محدود کردن", + "setNull": "تنظیم صفر", + "setDefault": "مجموعه پیش فرض" + } + }, + "filterOperation": { + "isEqual": "برابر هستند", + "isNotEqual": "برابر نیستند", + "isLike": "شامل است", + "isNot like": "شامل نیست", + "isEmpty": "خالی است", + "isNotEmpty": "خالی نیست", + "isNull": "تهی است", + "isNotNull": "تهی نیست" + }, + "title": { + "newProj": "پروژه جدید", + "myProject": "پروژه‌های من", + "formTitle": "عنوان فرم", + "collabView": "نمایش مشارکتی", + "lockedView": "نمایش قفل‌شده", + "personalView": "نمایش شخصی", + "appStore": "اپلیکیشن‌ها", + "team&auth": "تیم و نویسندگان", + "rolesUserMgmt": "مدیریت نقش‌ها و کاربران", + "userMgmt": "مدیریت کاربران", + "apiTokenMgmt": "مدیریت توکن‌های API", + "rolesMgmt": "مدیریت نقش‌ها", + "projMeta": "فرداده‌های پروژه", + "metaMgmt": "فرا مدیریت", + "metadata": "فراداده", + "exportImportMeta": "ورود و خروج فراداده", + "uiACL": "کنترل دسترسی UI", + "metaOperations": "عملیات فراداده", + "audit": "بازرسی", + "auditLogs": "گزارش‌های بازرسی", + "sqlMigrations": "مهاجرت‌های SQL", + "dbCredentials": "اعتبارنامه‌های پایگاه داده", + "advancedParameters": "SSL و پارامترهای پیشرفته", + "headCreateProject": "ایجاد پروژه | NocoDB", + "headLogin": "ورود | NocoDB", + "resetPassword": "بازنشانی کلمه عبور شما" + }, + "labels": { + "notifyVia": "از طریق اطلاع", + "projName": "نام پروژه", + "tableName": "نام جدول", + "viewName": "نام نمایش", + "viewLink": "لینک نمایش", + "columnName": "نام ستون", + "columnType": "نوع ستون", + "roleName": "نام نقش", + "roleDescription": "توضیحات نقش", + "databaseType": "پایگاه داده را وارد کنید", + "lengthValue": "طول/ مقدار", + "dbType": "نوع پایگاه داده", + "sqliteFile": "فایل SQLite", + "hostAddress": "نشانی Host", + "port": "شماره Port", + "username": "نام کاربری", + "password": "کلمه عبور", + "action": "اقدام", + "actions": "اقدامات", + "operation": "عملیات", + "operationType": "نوع عملیات", + "operationSubType": "زیرگونه عملیات", + "description": "شرح", + "authentication": "اعتبارسنجی", + "token": "توکن", + "where": "جایی که", + "cache": "Cache", + "chat": "چت", + "email": "پست الکترونیکی", + "storage": "فضای ذخیره‌سازی", + "uiAcl": "UI-ACL", + "models": "مدل‌ها", + "syncState": "حالت همگام‌سازی", + "created": "ایجاد شده", + "sqlOutput": "خروجی SQL", + "addOption": "گزینه اضافه کردن", + "aggregateFunction": "تابع جمع", + "dbCreateIfNotExists": "پایگاه داده: ایجاد در صورت عدم وجود", + "clientKey": "کلید Client", + "clientCert": "گواهینامه Client", + "serverCA": "Server CA", + "requriedCa": "اجباری-CA", + "requriedIdentity": "اجباری-IDENTITY", + "inflection": { + "tableName": "Inflection - نام جدول", + "columnName": "Inflection - نام ستون" + }, + "community": { + "starUs1": "ستاره دهید", + "starUs2": "به ما در Github", + "bookDemo": "رزرو دموی رایگان", + "getAnswered": "پاسخ سوالات خود را دریافت کنید", + "joinDiscord": "به Discord بپیوندید", + "joinReddit": "به NocoDB بپیوندید", + "followNocodb": "NocoDB را دنبال کنید" + }, + "docReference": "مرجع سند", + "selectUserRole": "نقش کاربر را انتخاب کنید", + "childTable": "جدول کودک", + "childColumn": "ستون کودک", + "onUpdate": "در به روز رسانی", + "onDelete": "در حذف" + }, + "activity": { + "createProject": "ایجاد پروژه", + "importProject": "وارد کردن پروژه", + "searchProject": "جستجوی پروژه", + "editProject": "ویرایش پروژه", + "stopProject": "توقف پروژه", + "startProject": "شروع پروژه", + "restartProject": "راه‌اندازی مجدد پروژه", + "deleteProject": "حذف پروژه", + "refreshProject": "نوسازی پروژه‌ها", + "saveProject": "ذخیره پروژه", + "createProjectExtended": { + "extDB": "ایجاد با اتصال
به یک پایگاه داده خارجی", + "excel": "ایجاد پروژه از Excel", + "template": "ایجاد پروژه از قالب" + }, + "OkSaveProject": "تأیید و ذخیره پروژه", + "upgrade": { + "available": "ارتقاء نرم‌افزار موجود است", + "releaseNote": "یادداشت‌های نسخه‌های ارائه شده", + "howTo": "چگونه نرم‌افزار را ارتقاء دهم؟" + }, + "translate": "کمک به ترجمه", + "account": { + "authToken": "کپی توکن اعتبارسنجی", + "swagger": "مستندات API های Swagger", + "projInfo": "کپی‌کردن اطلاعات پروژه", + "themes": "قالب‌ها" + }, + "sort": "مرتب سازی", + "addSort": "افزودن گزینه مرتب‌سازی", + "filter": "فیلتر", + "addFilter": "افزودن فیلتر", + "share": "اشتراک گذاری", + "shareBase": { + "disable": "غیرفعال کردن پایگاه مشترک", + "enable": "هر کسی لینک را داشته باشد", + "link": "لینک پایگاه مشترک" + }, + "invite": "دعوت", + "inviteMore": "دعوت از افراد بیشتر", + "inviteTeam": "دعوت از تیم", + "inviteToken": "توکن دعوت‌نامه", + "newUser": "کاربر جدید", + "editUser": "ویرایش کاربر", + "deleteUser": "حذف کاربر از پروژه", + "resendInvite": "ارسال مجدد پست الکترونیکی دعوت", + "copyInviteURL": "URL دعوت را کپی کنید", + "newRole": "نقش جدید", + "reloadRoles": "بارگذاری مجدد نقش‌ها", + "nextPage": "صفحه بعدی", + "prevPage": "صفحه قبلی", + "nextRecord": "رکورد بعدی", + "previousRecord": "رکورد قبلی", + "copyApiURL": "کپی کردن API URL", + "createTable": "ایجاد جدول", + "refreshTable": "نوسازی جداول", + "renameTable": "تغییر نام جدول", + "deleteTable": "حذف جدول", + "addField": "اضافه کردن فیلد جدید به این جدول", + "setPrimary": "تنظیم به عنوان مقدار اولیه", + "addRow": "اضافه کردن ردیف جدید", + "saveRow": "دخیره ردیف", + "insertRow": "وارد کردن ردیف جدید", + "deleteRow": "حذف ردیف جدید", + "deleteSelectedRow": "حذف ردیف‌های انتخاب شده", + "importExcel": "وارد کردن فایل Excel", + "downloadCSV": "دانلود به‌عنوان CSV", + "uploadCSV": "بارگذاری CSV", + "import": "وارد کردن", + "importMetadata": "وارد کردن فراداده", + "exportMetadata": "دریافت خروجی فراداده", + "clearMetadata": "پاک کردن فرداده", + "exportToFile": "دریافت خروجی به صورت فایل", + "changePwd": "تغییر کلمه عبور", + "createView": "ایجاد یک نمایش", + "shareView": "اشتراک گذاری نمایش", + "listSharedView": "فهرست نمایش‌های اشتراک گذاشته شده", + "ListView": "لیست نمایش‌ها", + "copyView": "کپی نمایش", + "renameView": "تغییر نام نمایش", + "deleteView": "حذف نمایش", + "createGrid": "ایجاد نمایش شبکه‌ای", + "createGallery": "ایجاد نمایش گالری", + "createCalendar": "ایجاد نمایش تقویم", + "createKanban": "ایجاد نمایش کانبان", + "createForm": "ایجاد نمایش فرم", + "showSystemFields": "نمایش فیلد‌های سیستم", + "copyUrl": "کپی کردن URL", + "openTab": "باز کردن برگه جدید", + "iFrame": "کپی کردن کد HTML توکار", + "addWebhook": "اضافه کردن وب‌هوک جدید", + "newToken": "اضافه کردن توکن جدید", + "exportZip": "دریافت خروجی به صورت فایل فشرده", + "importZip": "وارد کردن فایل فشرده", + "metaSync": "هم‌اکنون همگام‌سازی کن", + "settings": "تنظیمات", + "previewAs": "پیش‌نمایش به عنوان", + "resetReview": "تغییر پیش‌نمایش", + "testDbConn": "آزمایش اتصال به پایگاه داده", + "removeDbFromEnv": "حذف پایگاه داده از محیط", + "editConnJson": "ویرایش اتصال JSON", + "sponsorUs": "حمایت از ما", + "sendEmail": "ارسال پست الکترونیکی" + }, + "tooltip": { + "saveChanges": "ذخیره تغییرات", + "xcDB": "ایجاد یک پروژه جدید", + "extDB": "پشتیبانی از MySQL ،PostgreSQL ،SQL Server و SQLite", + "apiRest": "قابل دسترسی از API های REST", + "apiGQL": "قابل دسترسی از API های GraphQL", + "theme": { + "dark": "سیاه نمایش داده می‌شود (^⇧B)", + "light": "آیا سیاه نمایش داده می‌شود؟ (^⇧B)" + }, + "addTable": "افزودن جدول جدید", + "inviteMore": "دعوت کاربران بیشتر", + "toggleNavDraw": "تغییر کشوی جهت‌یابی", + "reloadApiToken": "بارگیری مجدد توکن‌های API", + "generateNewApiToken": "ایجاد توکن API جدید", + "addRole": "افزودن نقش جدید", + "reloadList": "بارگیری مجدد لیست", + "metaSync": "همگام‌سازی فراداده", + "sqlMigration": "بارگیری مجدد مهاجرت‌ها", + "updateRestart": "به‌روزرسانی و شروع مجدد", + "cancelReturn": "لغو و بازگشت", + "exportMetadata": "خارج کردن همه فراداده‌ها از فراجدول‌ها به فرادایرکتوری", + "importMetadata": "وارد کردن همه فراداده‌ها از فرادایرکتوری به فراجدول‌ها", + "clearMetadata": "پاک‌سازی همه فراداده‌ها از فراجدول‌ها", + "clientKey": "انتخاب فایل key.", + "clientCert": "انتخاب فایل cert.", + "clientCA": "انتخاب فایل CA" + }, + "placeholder": { + "projName": "نام پروژه را وارد کنید", + "password": { + "enter": "کلمه عبور را وارد کنید", + "current": "کلمه عبور فعلی", + "new": "کلمه عبور جدید", + "save": "ذخیره کلمه عبور", + "confirm": "تایید کلمه عبور جدید" + }, + "searchProjectTree": "جست‌وجو در جداول", + "searchFields": "جست‌وجو در فیلدها", + "searchColumn": "جست‌وجو در ستون {search}", + "searchApps": "جست‌وجوی برنامه‌ها", + "searchModels": "مدل‌های جست‌وجو", + "noItemsFound": "مواردی یافت نشد", + "defaultValue": "مقدار پیش‌فرض", + "filterByEmail": "فیلترکردن بر مبنای پست الکترونیکی" + }, + "msg": { + "info": { + "footerInfo": "تعداد ردیف‌ها در هر صفحه", + "upload": "فایل را برای بارگذاری انتخاب کنید", + "upload_sub": "یا فایل را بکشید و رها کنید", + "excelSupport": "فرمت‌های پشتیبانی شده: xls - xlsx - xlsm - ods - ots", + "excelURL": "URL فایل Excel را انتخاب کنید", + "footMsg": "تعداد ردیف‌ها برای parse جهت یافتن نوع داده", + "excelImport": "صفحه(های) آماده برای ورود", + "exportMetadata": "آیا می‌خواهید فراداده را از فراجدول‌ها خارج کنید؟", + "importMetadata": "آیا می‌خواهید فراداده را به فراجدول‌ها وارد کنید؟", + "clearMetadata": "آیا می‌خواهید فراداده را از فراجدول‌ها حذف کنید؟", + "projectEmptyMessage": "با ایجاد یک پروژه جدید شروع به کار کنید", + "stopProject": "آیا می‌خواهید پروژه را متوقف کنید؟", + "startProject": "آیا می‌خواهید پروژه را آغاز کنید؟", + "restartProject": "آیا می‌خواهید پروژه را مجددا آغاز کنید؟", + "deleteProject": "آیا می‌خواهید پروژه را حذف کنید؟", + "shareBasePrivate": "ایجاد پایگاه فقط-خواندنی قابل اشتراک گذاری عمومی", + "shareBasePublic": "هر کسی در اینترنت با این لینک می‌تواند تنها مشاهده کند", + "userInviteNoSMTP": "به نظر می‌رسد هنوز mailer را پیکربندی نکرده‌اید! \\n لطفاْ کد دعوت بالا را کپی کرده و ارسال کنید برای", + "dragDropHide": "فیلدها را بکشید و در این‌جا رها کنید تا مخفی شوند", + "formInput": "برچسب ورودی فرم را وارد کنید", + "formHelpText": "مقداری متن راهنما اضافه کنید", + "onlyCreator": "فقط برای نقش ایجادکننده قابل مشاهده است", + "formDesc": "توضیحات فرم را اضافه کنید", + "beforeEnablePwd": "محدود کردن دسترسی با لزوم ورود کلمه عبور", + "afterEnablePwd": "دسترسی با لزوم ورود کلمه عبور محدود شده", + "privateLink": "این نمایش از طریق لینک خصوصی به اشتراک گذاشته شده", + "privateLinkAdditionalInfo": "افراد با لینک خصوصی تنها می‌توانند سلول‌هایی که در این نمایش قابل مشاهده است را ببینند", + "afterFormSubmitted": "بعد از ارسال فرم", + "apiOptions": "دسترسی به پروژه از طریق", + "submitAnotherForm": "نمایش دکمه \"ارسال فرمی دیگر\"", + "showBlankForm": "نمایش فرم خالی پس از 5 ثانیه", + "emailForm": "به این آدرس پست الکترونیکی من پیام ارسال کنید", + "showSysFields": "نمایش فیلدهای سیستم", + "filterAutoApply": "اعمال خودکار", + "showMessage": "نمایش این پیام", + "viewNotShared": "نمایش فعلی به اشتراک گذاشته نشده!", + "showAllViews": "مشاهده تمام نمایش های به اشتراک گذاشته شده از این جدول", + "collabView": "همکاران با دسترسی ویرایش یا فراتر می‌توانند پیکربندی نمایش را تغییر دهند.", + "lockedView": "تا هنگامی‌که نمایش قفل باشد، هیچ‌کس نمی‌تواند پیکربندی آن را تغییر دهد.", + "personalView": "فقط شما می‌توانید پیکربندی نمایش را تغییر دهید. نمایش‌های شخصی مربوط به سایر همکاران به‌طور پیش‌فرض پنهان شده‌اند.", + "ownerDesc": "می‌توان ایجادکنندگان را اضافه یا حذف کرد. و به ویرایش کامل ساختارها و فیلدهای پایگاه داده پرداخت.", + "creatorDesc": "می‌توان به ویرایش کامل ساختار و مقادیر پایگاه داده پرداخت.", + "editorDesc": "می‌توان سوابق را ویرایش کرد اما اختیار تغییر ساختار پایگاه داده/فیلدها وجود ندارد.", + "commenterDesc": "می‌توان سوابق را دید و در رابطه با آن‌ها اظهار نظر کرد اما امکان ویرایش هیچ چیز وجود ندارد", + "viewerDesc": "می‌توان سوابق را دید اما اختیار ویرایش هیچ چیز وجود ندارد", + "addUser": "افزودن کاربر جدید", + "staticRoleInfo": "نقش های تعریف شده سیستم قابل ویرایش نیستند", + "exportZip": "خروج فراداده پروژه به عنوان فایل فشرده و دریافت آن.", + "importZip": "ورود فایل فشرده فراداده پروژه و شروع مجدد.", + "importText": "ورود پروژه NocoDB با بارگذاری فایل فشرده فراداده", + "metaNoChange": "هیچ تغییری شناسایی نشد", + "sqlMigration": "مهاجرت‌های شِما به طور خودکار ساخته خواهند شد. جدولی ایجاد و صفحه را مجددا لود کن.", + "dbConnectionStatus": "فضا معتبر است", + "dbConnected": "اتصال موفقیت آمیز بود", + "notifications": { + "no_new": "هیچ اعلان جدیدی وجود ندارد", + "clear": "پاک سازی" + }, + "sponsor": { + "header": "شما می‌توانید از ما حمایت کنید!", + "message": "ما گروه کوچکی هستیم که تمام وقت کار می‌کنیم تا NocoDB یک ابزار Open-Source باشد؛ ما معتقدیم ابزاری مانند NocoDB باید به صورت رایگان برای هر حل کننده مساله ای روی اینترنت در دسترس باشد." + }, + "loginMsg": "ورود به NocoDB", + "passwordRecovery": { + "message_1": "لطفا پست الکترونیکی خود را که در هنگام ثبت نام استفاده کردید وارد کنید.", + "message_2": "ما یک لینک جهت تغییر کلمه عبور به پست الکترونیکی شما ارسال خواهیم‌کرد.", + "success": "لطفا برای تغییر کلمه عبور به پست الکترونیکی خود مراجعه کنید" + }, + "signUp": { + "superAdmin": "شما \"مدیر ارشد\" خواهید بود", + "alreadyHaveAccount": "هم‌اکنون حساب کاربری دارید؟", + "workEmail": "پست الکترونیکی کاری خود را وارد کنید", + "enterPassword": "کلمه عبور خود را وارد کنید", + "forgotPassword": "کلمه عبور خود را فراموش کرده‌اید؟", + "dontHaveAccount": "حساب کاربری ندارید؟" + }, + "addView": { + "grid": "افزودن نمایش شبکه‌ای", + "gallery": "افزودن نمایش گالری", + "form": "افزودن نمایش فرم", + "kanban": "افزودن نمایش کانبان", + "calendar": "افزودن نمایش تقویم" + }, + "tablesMetadataInSync": "متاداده جداول همگام سازی است", + "addMultipleUsers": "شما می توانید چندین ایمیل جداگانه کاما (،) را اضافه کنید", + "enterTableName": "نام جدول را وارد کنید", + "addDefaultColumns": "ستون های پیش فرض را اضافه کنید", + "tableNameInDb": "نام جدول به عنوان ذخیره شده در پایگاه داده" + }, + "error": { + "searchProject": "جست‌وجوی شما برای {search} نتیجه‌ای نداشت", + "invalidChar": "کاراکتر نامعتبر در مسیر پوشه.", + "invalidDbCredentials": "اعتبارنامه پایگاه داده نامعتبر است.", + "unableToConnectToDb": "دسترسی به پایگاه داده امکان پذیر نیست، لطفا بررسی کنید پایگاه داده شما در حال اجرا باشد.", + "userDoesntHaveSufficientPermission": "کاربر وجود ندارد یا اجازه کافی برای ایجاد شِما موجود نیست.", + "dbConnectionStatus": "پارامترهای پایگاه داده نامعتبر است", + "dbConnectionFailed": "قطع ارتباط:", + "signUpRules": { + "emailReqd": "پست الکترونیکی مورد نیاز است", + "emailInvalid": "پست الکترونیکی باید معتبر باشد", + "passwdRequired": "کلمه عبور مورد نیاز است", + "passwdLength": "کلمه عبور شما باید حداقل 8 کاراکتر داشته باشد" + } + }, + "toast": { + "exportMetadata": "فراداده پروژه با موفقیت خارج شد", + "importMetadata": "فراداده پروژه با موفقیت وارد شد", + "clearMetadata": "فراداده پروژه با موفقیت پاک‌سازی شد", + "stopProject": "پروژه با موفقیت متوقف شد", + "startProject": "پروژه با موفقیت آغاز گردید", + "restartProject": "پروژه با موفقیت مجددا آغاز گردید", + "deleteProject": "پروژه با موفقیت حذف گردید", + "authToken": "توکن معتبر در کلیپ بورد ذخیره شد", + "projInfo": "اطلاعات پروژه در کلیپ بورد ذخیره شد", + "inviteUrlCopy": "URL دعوت نامه در کلیپ بورد ذخیره شده", + "createView": "نمایش با موفقیت ایجاد شد", + "formEmailSMTP": "لطفاْ جهت فعال‌سازی اعلان پست الکترونیکی، پلاگین SMTP را در قسمت اپلیکیشن‌ها فعال کنید", + "collabView": "با موفقیت به نمایش مشارکتی تغییر یافت", + "lockedView": "با موفقیت به نمایش قفل‌شده تغییر یافت", + "futureRelease": "به زودی!" + } + } +} diff --git a/packages/nc-gui/plugins/i18n.js b/packages/nc-gui/plugins/i18n.js index ecf3771323..e08c319c1d 100644 --- a/packages/nc-gui/plugins/i18n.js +++ b/packages/nc-gui/plugins/i18n.js @@ -1,10 +1,10 @@ // plugins/i18n.js -import Vue from 'vue' -import VueI18n from 'vue-i18n' +import Vue from "vue"; +import VueI18n from "vue-i18n"; // Tell Vue to use our plugin -Vue.use(VueI18n) +Vue.use(VueI18n); export default ({ app, store }) => { // Set the i18n instance on app @@ -14,46 +14,47 @@ export default ({ app, store }) => { locale: store.state.windows.language, // Set the fallback locale in case the current locale can't be found - fallbackLocale: 'en', + fallbackLocale: "en", // Associate each locale to a content file messages: { - en: require('~/lang/en.json'), - zh_HK: require('~/lang/zh_HK.json'), - zh_TW: require('~/lang/zh_TW.json'), - zh_CN: require('~/lang/zh_CN.json'), - ja: require('~/lang/ja.json'), - fr: require('~/lang/fr.json'), - es: require('~/lang/es.json'), - de: require('~/lang/de.json'), - id: require('~/lang/id.json'), - it_IT: require('~/lang/it_IT.json'), - ko: require('~/lang/ko.json'), - nl: require('~/lang/nl.json'), - ru: require('~/lang/ru.json'), - sv: require('~/lang/sv.json'), - da: require('~/lang/da.json'), - vi: require('~/lang/vi.json'), - no: require('~/lang/no.json'), - iw: require('~/lang/iw.json'), - fi: require('~/lang/fi.json'), - uk: require('~/lang/uk.json'), - hr: require('~/lang/hr.json'), - th: require('~/lang/th.json'), - sl: require('~/lang/sl.json'), - pt_BR: require('~/lang/pt_BR.json') - } - }) + en: require("~/lang/en.json"), + zh_HK: require("~/lang/zh_HK.json"), + zh_TW: require("~/lang/zh_TW.json"), + zh_CN: require("~/lang/zh_CN.json"), + ja: require("~/lang/ja.json"), + fr: require("~/lang/fr.json"), + es: require("~/lang/es.json"), + de: require("~/lang/de.json"), + id: require("~/lang/id.json"), + it_IT: require("~/lang/it_IT.json"), + ko: require("~/lang/ko.json"), + nl: require("~/lang/nl.json"), + ru: require("~/lang/ru.json"), + sv: require("~/lang/sv.json"), + da: require("~/lang/da.json"), + vi: require("~/lang/vi.json"), + no: require("~/lang/no.json"), + iw: require("~/lang/iw.json"), + fi: require("~/lang/fi.json"), + uk: require("~/lang/uk.json"), + hr: require("~/lang/hr.json"), + th: require("~/lang/th.json"), + sl: require("~/lang/sl.json"), + pt_BR: require("~/lang/pt_BR.json"), + fa: require("~/lang/fa.json"), + }, + }); store.watch( - state => state.windows.language, + (state) => state.windows.language, (language) => { if (app.i18n.availableLocales.includes(language)) { - app.i18n.locale = language + app.i18n.locale = language; } } - ) -} + ); +}; /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd * From 1bff7133cfdffe13b8adb59d53503655f4a090a9 Mon Sep 17 00:00:00 2001 From: Vijay Kumar Rathore Date: Thu, 10 Mar 2022 16:13:14 +0100 Subject: [PATCH 44/49] fix distinct api Signed-off-by: Vijay Kumar Rathore --- .../src/lib/dataMapper/lib/BaseModel.ts | 12 +++- .../lib/dataMapper/lib/sql/BaseModelSql.ts | 66 +++++++++++++++++-- 2 files changed, 71 insertions(+), 7 deletions(-) diff --git a/packages/nocodb/src/lib/dataMapper/lib/BaseModel.ts b/packages/nocodb/src/lib/dataMapper/lib/BaseModel.ts index f29ae30d7b..e70f329eed 100644 --- a/packages/nocodb/src/lib/dataMapper/lib/BaseModel.ts +++ b/packages/nocodb/src/lib/dataMapper/lib/BaseModel.ts @@ -924,10 +924,18 @@ abstract class BaseModel { * @memberof BaseModel * @throws {Error} */ - async distinct({ cn, fields = '', where, limit, offset, sort, condition }) { + async distinct({ + column_name, + fields = '', + where, + limit, + offset, + sort, + condition + }) { try { const query = this.$db; - query.distinct(cn, ...fields.split(',').filter(Boolean)); + query.distinct(column_name, ...fields.split(',').filter(Boolean)); query.xwhere(where).condition(condition); this._paginateAndSort(query, { limit, offset, sort }); return await this._run(query); diff --git a/packages/nocodb/src/lib/dataMapper/lib/sql/BaseModelSql.ts b/packages/nocodb/src/lib/dataMapper/lib/sql/BaseModelSql.ts index bc77c4b808..9e5fe01677 100644 --- a/packages/nocodb/src/lib/dataMapper/lib/sql/BaseModelSql.ts +++ b/packages/nocodb/src/lib/dataMapper/lib/sql/BaseModelSql.ts @@ -1205,8 +1205,7 @@ class BaseModelSql extends BaseModel { * @throws {Error} */ async distinct({ - cn, - fields = '', + column_name, where, limit, offset, @@ -1214,9 +1213,8 @@ class BaseModelSql extends BaseModel { conditionGraph = null }) { try { - const query = this.$db; - query.distinct( - this.selectQuery([cn, ...fields.split(',').filter(Boolean)].join(',')) + const query = this._buildDistinctQuery( + column_name ? column_name.split(',') : [] ); query.xwhere(where, this.selectQuery('')).conditionGraph(conditionGraph); this._paginateAndSort(query, { limit, offset, sort }); @@ -1227,6 +1225,64 @@ class BaseModelSql extends BaseModel { } } + /** + * Builds a query string that will return distinct values for the given column + * @param {string[]} columns - the column to query for distinct values + * @returns {object} the query. + */ + private _buildDistinctQuery(columns: string[]) { + const query = this.$db; + const formulaColumns = this.filterFormulaColumns(columns); + const otherColumns = _.difference(columns, formulaColumns); + if (!otherColumns.length && !formulaColumns.length) { + query.distinct(this.selectQuery('')).distinct(...this.selectFormulas); + } + if (otherColumns.length) { + query.distinct(this.selectQuery(otherColumns.join(','))); + } + if (formulaColumns.length) { + query.distinct(...this.selectFormulasForColumns(formulaColumns)); + } + return query; + } + + /** + * Selects the formulas for the give columns. + * @param {Array} sheet - The colums to select formulas for. + * @returns Array of formulas. + */ + private selectFormulasForColumns(columns: string[]) { + return (this.virtualColumns || [])?.reduce((arr, v) => { + if ( + v.formula?.value && + !v.formula?.error?.length && + columns.includes(v._cn) + ) { + arr.push( + formulaQueryBuilder( + v.formula?.tree, + v._cn, + this.dbDriver, + this.aliasToColumn + ) + ); + } + return arr; + }, []); + } + + /** + * Returns an array of the columns that are of formula type. + * @returns {Array} - an array of the formula columns. + */ + private filterFormulaColumns(columns: string[]) { + return columns.filter(column => { + return this.virtualColumns.find( + col => col._cn === column && col?.formula + ); + }); + } + /** * Runs raw query on database * From 4ce06defb5219e524eddfa559afaf8b9bbfbac3a Mon Sep 17 00:00:00 2001 From: Raju Udava <86527202+dstala@users.noreply.github.com> Date: Thu, 10 Mar 2022 23:20:37 +0530 Subject: [PATCH 45/49] chore: i18n disable persian language from menu Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> --- packages/nc-gui/plugins/i18n.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/nc-gui/plugins/i18n.js b/packages/nc-gui/plugins/i18n.js index e08c319c1d..03bbaa90aa 100644 --- a/packages/nc-gui/plugins/i18n.js +++ b/packages/nc-gui/plugins/i18n.js @@ -42,7 +42,6 @@ export default ({ app, store }) => { th: require("~/lang/th.json"), sl: require("~/lang/sl.json"), pt_BR: require("~/lang/pt_BR.json"), - fa: require("~/lang/fa.json"), }, }); From 5e0b2feb0c7511db8ce218992bc4ce0daafafab3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 12 Mar 2022 04:30:45 +0000 Subject: [PATCH 46/49] chore(deps): bump url-parse from 1.5.4 to 1.5.10 in /packages/nocodb Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.4 to 1.5.10. - [Release notes](https://github.com/unshiftio/url-parse/releases) - [Commits](https://github.com/unshiftio/url-parse/compare/1.5.4...1.5.10) --- updated-dependencies: - dependency-name: url-parse dependency-type: indirect ... Signed-off-by: dependabot[bot] --- packages/nocodb/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/nocodb/package-lock.json b/packages/nocodb/package-lock.json index e0d3d56898..a131032b6c 100644 --- a/packages/nocodb/package-lock.json +++ b/packages/nocodb/package-lock.json @@ -23244,9 +23244,9 @@ } }, "node_modules/url-parse": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.4.tgz", - "integrity": "sha512-ITeAByWWoqutFClc/lRZnFplgXgEZr3WJ6XngMM/N9DMIm4K8zXPCZ1Jdu0rERwO84w1WC5wkle2ubwTA4NTBg==", + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -42969,9 +42969,9 @@ } }, "url-parse": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.4.tgz", - "integrity": "sha512-ITeAByWWoqutFClc/lRZnFplgXgEZr3WJ6XngMM/N9DMIm4K8zXPCZ1Jdu0rERwO84w1WC5wkle2ubwTA4NTBg==", + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "requires": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" From 7ffd16aec117efccb30923017e16c11d07220f7c Mon Sep 17 00:00:00 2001 From: Wing-Kam Wong Date: Sat, 12 Mar 2022 13:39:48 +0800 Subject: [PATCH 47/49] fix: missing labels Signed-off-by: Wing-Kam Wong --- .github/workflows/release-npm.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/release-npm.yml b/.github/workflows/release-npm.yml index 3827d3e3cf..f50b70831c 100644 --- a/.github/workflows/release-npm.yml +++ b/.github/workflows/release-npm.yml @@ -70,6 +70,7 @@ jobs: title: 'Release ${{ github.event.inputs.tag || inputs.tag }}' labels: | Bot: Automated PR + Bot: Automerge - name: Check outputs if: ${{ github.event.inputs.targetEnv == 'PROD' || inputs.targetEnv == 'PROD' }} run: | @@ -80,3 +81,4 @@ jobs: env: GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" PULL_REQUEST: "${{ steps.cpr.outputs.pull-request-number }}" + MERGE_LABELS: "Bot: Automerge" From 597356f03556b11aacd1660c9481398052c0c454 Mon Sep 17 00:00:00 2001 From: Raju Udava <86527202+dstala@users.noreply.github.com> Date: Sat, 12 Mar 2022 19:00:19 +0530 Subject: [PATCH 48/49] chore: i18n corrections for ru.json (contributor:insanehunter) Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> --- packages/nc-gui/lang/ru.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/nc-gui/lang/ru.json b/packages/nc-gui/lang/ru.json index a177447191..d97cd79938 100644 --- a/packages/nc-gui/lang/ru.json +++ b/packages/nc-gui/lang/ru.json @@ -60,7 +60,7 @@ "project": "Проект", "projects": "Проекты", "table": "Таблица", - "tables": "Столы", + "tables": "Таблицы", "field": "Поле", "fields": "Поля", "column": "Столбец", @@ -489,7 +489,7 @@ "emailReqd": "E-mail требуется", "emailInvalid": "Электронная почта должна быть действительной", "passwdRequired": "необходим пароль", - "passwdLength": "Вас пароль должен быть по крайней мере 8 символов" + "passwdLength": "Ваш пароль должен быть не короче 8 символов" } }, "toast": { @@ -497,12 +497,12 @@ "importMetadata": "Метаданные проекта успешно импортированы", "clearMetadata": "Метаданные проекта успешно очищены", "stopProject": "Проект успешно остановлен", - "startProject": "Проект начался успешно", + "startProject": "Проект запущен успешно", "restartProject": "Проект перезапущен успешно", "deleteProject": "Проект удален успешно", - "authToken": "Автор токен скопирован в буфер обмена", - "projInfo": "Скопированная информация о проекте в буфер обмена", - "inviteUrlCopy": "Копированная приглашение URL в буфер обмена", + "authToken": "Токен скопирован в буфер обмена", + "projInfo": "Информация о проекте скопирована в буфер обмена", + "inviteUrlCopy": "Ссылка скопирована в буфер обмена", "createView": "Вид создан успешно", "formEmailSMTP": "Пожалуйста, активируйте плагин SMTP в App Store для включения уведомления по электронной почте", "collabView": "Успешно перешел на совместное представление", From 45c6f9624fdae29bf1aa096466b7796d56dbb258 Mon Sep 17 00:00:00 2001 From: Wing-Kam Wong Date: Mon, 14 Mar 2022 13:31:45 +0800 Subject: [PATCH 49/49] docs: add date functions in formulas.md Signed-off-by: Wing-Kam Wong --- .../noco-docs/content/en/setup-and-usages/formulas.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/noco-docs/content/en/setup-and-usages/formulas.md b/packages/noco-docs/content/en/setup-and-usages/formulas.md index 42304dc131..911708d5db 100644 --- a/packages/noco-docs/content/en/setup-and-usages/formulas.md +++ b/packages/noco-docs/content/en/setup-and-usages/formulas.md @@ -78,6 +78,15 @@ menuTitle: "Formulas" | **UPPER** | `UPPER(str)` | `UPPER(Title)` | Upper case converted string of input parameter | | **URL** | `URL(str)` | `URL(Column)` | Convert to a hyperlink if it is a valid URL | +### Date Functions + +| Name | Syntax | Sample | Output | +|-------------|-----------------------------------------------------------|-------------------------------------------------------|-------------------------------------------------------------------------------------------------------| +| **DATEADD** | `DATEADD(DATE_COL, 1, 'day')` | `DATEADD(date, 1, 'day')` | Supposing the DATE_COL is 2022-03-14. The result is 2022-03-15. | +| | `DATEADD(DATE_TIME_COL, 2, 'month')` | `DATEADD(datetime, 2, 'month')` | Supposing the DATE_COL is 2022-03-14 03:14. The result is 2022-05-14 03:14. | +| | `IF(NOW() < DATE_COL, "true", "false")` | `IF(NOW() < date, "true", "false")` | If current date is less than DATE_COL, it returns true. Otherwise, it returns false. | +| | `IF(NOW() < DATEADD(DATE_COL,10,'day'), "true", "false")` | `IF(NOW() < DATEADD(date,10,'day'), "true", "false")` | If the current date is less than DATE_COL plus 10 days, it returns true. Otherwise, it returns false. | + ### Logical Operators | Operator | Sample | Description |