diff --git a/qortal-ui-core/language/de.json b/qortal-ui-core/language/de.json index 253020f4..b8b04d8a 100644 --- a/qortal-ui-core/language/de.json +++ b/qortal-ui-core/language/de.json @@ -596,7 +596,8 @@ "pchange22": "Berechnung des Arbeitsnachweises ... dies kann einige Zeit dauern ...", "pchange23": "Transaktion Erfolgreich!", "pchange24": "Transaktion kann nicht signiert und verarbeitet werden", - "pchange25": "Datei wählen" + "pchange25": "Datei wählen", + "pchange26": "Daten werden hochgeladen... dies kann einige Zeit dauern..." }, "browserpage": { "bchange1": "Vorwärts", @@ -627,7 +628,14 @@ "bchange26": "Immer automatisch authentifizieren", "bchange27": "Ablehnen", "bchange28": "Akzeptieren", - "bchange29": "Sofortige Veröffentlichung (erfordert 0,001 QORT-Gebühr)" + "bchange29": "Sofortige Veröffentlichung (erfordert 0,001 QORT-Gebühr)", + "bchange30": "Dienst", + "bchange31": "Name", + "bchange32": "Kennung", + "bchange33": "Sofortige Veröffentlichung", + "bchange34": "Dateiname", + "bchange35": "Erteilen Sie dieser Anwendung die Erlaubnis, Coins zu senden?", + "bchange36": "Möchten Sie sofort auf QDN veröffentlichen, ohne einen Proof-of-Work zu berechnen?" }, "datapage": { "dchange1": "Datenmanagement", diff --git a/qortal-ui-core/language/es.json b/qortal-ui-core/language/es.json index 52be60fe..c4b25b94 100644 --- a/qortal-ui-core/language/es.json +++ b/qortal-ui-core/language/es.json @@ -596,7 +596,8 @@ "pchange22": "Computando prueba de trabajo... esto puede tomar un tiempo...", "pchange23": "Transacción realizada con éxito!", "pchange24": "No se pudo firmar y procesar la transacción", - "pchange25": "Elegir archivo" + "pchange25": "Elegir archivo", + "pchange26": "Cargando datos... esto puede llevar algo de tiempo..." }, "browserpage": { "bchange1": "Avanzar", @@ -627,7 +628,14 @@ "bchange26": "Autenticar siempre automáticamente", "bchange27": "Rechazar", "bchange28": "Aceptar", - "bchange29": "Publicación instantánea (requiere una tarifa de 0.001 QORT)" + "bchange29": "Publicación instantánea (requiere una tarifa de 0.001 QORT)", + "bchange30": "Servicio", + "bchange31": "Nombre", + "bchange32": "Identificador", + "bchange33": "Publicación instantánea", + "bchange34": "Nombre de archivo", + "bchange35": "¿Le das permiso a esta aplicación para enviar monedas?", + "bchange36": "¿Desea publicar instantáneamente en QDN sin calcular la prueba de trabajo?" }, "datapage": { "dchange1": "Gestión de datos", diff --git a/qortal-ui-core/language/fr.json b/qortal-ui-core/language/fr.json index cea21ca9..568be163 100644 --- a/qortal-ui-core/language/fr.json +++ b/qortal-ui-core/language/fr.json @@ -596,7 +596,8 @@ "pchange22": "Calcul de la preuve de travail... cela peut prendre un certain temps...", "pchange23": "Transaction réussie!", "pchange24": "Impossible de signer et de traiter la transaction", - "pchange25": "Choisissez un fichier" + "pchange25": "Choisissez un fichier", + "pchange26": "Télécharger des données... cela peut prendre un certain temps..." }, "browserpage": { "bchange1": "En avant", @@ -627,7 +628,14 @@ "bchange26": "Toujours s'authentifier automatiquement", "bchange27": "Rejeter", "bchange28": "Accepter", - "bchange29": "Publication instantanée (nécessite des frais de 0,001 QORT)" + "bchange29": "Publication instantanée (nécessite des frais de 0,001 QORT)", + "bchange30": "Service", + "bchange31": "Nom", + "bchange32": "Identifiant", + "bchange33": "Publication instantanée", + "bchange34": "Nom de fichier", + "bchange35": "Autorisez-vous cette application à envoyer des pièces ?", + "bchange36": "Voulez-vous publier instantanément sur QDN sans calculer de preuve de travail ?" }, "datapage": { "dchange1": "Gestion de données", diff --git a/qortal-ui-core/language/hindi.json b/qortal-ui-core/language/hindi.json index 459c7b5b..38444556 100644 --- a/qortal-ui-core/language/hindi.json +++ b/qortal-ui-core/language/hindi.json @@ -597,7 +597,8 @@ "pchange22": "काम का सबूत कंप्यूटिंग... इसमें कुछ समय लग सकता है...", "pchange23": "लेनदेन सफल!", "pchange24": "लेन-देन पर हस्ताक्षर करने और संसाधित करने में असमर्थ", - "pchange25": "फ़ाइल चुनें" + "pchange25": "फ़ाइल चुनें", + "pchange26": "डेटा अपलोड हो रहा है... इसमें कुछ समय लग सकता है..." }, "browserpage": { "bchange1": "आगे भेजना", @@ -628,7 +629,14 @@ "bchange26": "हमेशा स्वचालित रूप से प्रमाणित करें", "bchange27": "अस्वीकार करें", "bchange28": "स्वीकार करें", - "bchange29": "तत्काल प्रकाशन (0.001 QORT शुल्क की आवश्यकता है)" + "bchange29": "तत्काल प्रकाशन (0.001 QORT शुल्क की आवश्यकता है)", + "bchange30": "सेवा", + "bchange31": "नाम", + "bchange32": "पहचानकर्ता", + "bchange33": "तत्काल प्रकाशन", + "bchange34": "फ़ाइल का नाम", + "bchange35": "क्या आप इस एप्लिकेशन को सिक्के भेजने की अनुमति देते हैं?", + "bchange36": "क्या आप कार्य-प्रमाण की गणना किए बिना QDN पर तुरंत प्रकाशित करना चाहते हैं?" }, "datapage": { "dchange1": "डाटा प्रबंधन", diff --git a/qortal-ui-core/language/hr.json b/qortal-ui-core/language/hr.json index 8746ca9a..94de36a4 100644 --- a/qortal-ui-core/language/hr.json +++ b/qortal-ui-core/language/hr.json @@ -596,7 +596,8 @@ "pchange22": "Računalni dokaz o poslu ... ovo može potrajati neko vrijeme ...", "pchange23": "Transakcija uspješna!", "pchange24": "Nije moguće potpisati i obraditi transakciju", - "pchange25": "Odaberite datoteku" + "pchange25": "Odaberite datoteku", + "pchange26": "Učitavanje podataka... ovo može potrajati..." }, "browserpage": { "bchange1": "Naprijed", @@ -627,7 +628,14 @@ "bchange26": "Uvijek autentificiraj automatski", "bchange27": "Odbaci", "bchange28": "Prihvati", - "bchange29": "Trenutno objavljivanje (zahtijeva naknadu od 0,001 QORT)" + "bchange29": "Trenutno objavljivanje (zahtijeva naknadu od 0,001 QORT)", + "bchange30": "Usluga", + "bchange31": "Ime", + "bchange32": "Identifikator", + "bchange33": "Trenutno objavljivanje", + "bchange34": "Naziv datoteke", + "bchange35": "Dajete li ovoj aplikaciji dopuštenje za slanje novčića?", + "bchange36": "Želite li objaviti instant na QDN bez izračunavanja dokaza o radu?" }, "datapage": { "dchange1": "Upravljanje podacima", diff --git a/qortal-ui-core/language/hu.json b/qortal-ui-core/language/hu.json index f39e5a6f..f1d202f7 100644 --- a/qortal-ui-core/language/hu.json +++ b/qortal-ui-core/language/hu.json @@ -596,7 +596,8 @@ "pchange22": "A munka igazolásának számítása... Ez eltarthat egy ideig...", "pchange23": "A tranzakció sikeres!", "pchange24": "Nem lehet aláírni és feldolgozni a tranzakciót", - "pchange25": "Fájl Kiválasztása" + "pchange25": "Fájl Kiválasztása", + "pchange26": "Adatok feltöltése... ez eltarthat egy ideig..." }, "browserpage": { "bchange1": "Előre", @@ -627,7 +628,14 @@ "bchange26": "Mindig automatikus hitelesítés", "bchange27": "Elutasítás", "bchange28": "Elfogadás", - "bchange29": "Azonnali közzététel (0,001 QORT díj szükséges)" + "bchange29": "Azonnali közzététel (0,001 QORT díj szükséges)", + "bchange30": "Szolgáltatás", + "bchange31": "Név", + "bchange32": "Azonosító", + "bchange33": "Azonnali közzététel", + "bchange34": "Fájlnév", + "bchange35": "Engedélyt ad ennek az alkalmazásnak érmék küldésére?", + "bchange36": "Szeretne azonnal közzétenni a QDN-ben a munkaigazolás kiszámítása nélkül?" }, "datapage": { "dchange1": "Adatkezelés", diff --git a/qortal-ui-core/language/it.json b/qortal-ui-core/language/it.json index 9dbdafbf..9990dab9 100644 --- a/qortal-ui-core/language/it.json +++ b/qortal-ui-core/language/it.json @@ -596,7 +596,8 @@ "pchange22": "Prova di calcolo del lavoro... questo può richiedere del tempo...", "pchange23": "Transazione riuscita!", "pchange24": "Impossibile firmare ed elaborare la transazione", - "pchange25": "Scegli file" + "pchange25": "Scegli file", + "pchange26": "Caricamento dei dati... questo può richiedere del tempo..." }, "browserpage": { "bchange1": "Avanti", @@ -627,7 +628,14 @@ "bchange26": "Autenticati sempre automaticamente", "bchange27": "Rifiuta", "bchange28": "Accetta", - "bchange29": "Pubblicazione istantanea (richiede una quota di 0,001 QORT)" + "bchange29": "Pubblicazione istantanea (richiede una quota di 0,001 QORT)", + "bchange30": "Servizio", + "bchange31": "Nome", + "bchange32": "Identificativo", + "bchange33": "Pubblicazione istantanea", + "bchange34": "Nome file", + "bchange35": "Concedi a questa applicazione il permesso di inviare monete?", + "bchange36": "Vuoi pubblicare istantaneamente su QDN senza calcolare la prova del lavoro?" }, "datapage": { "dchange1": "Gestione dati", diff --git a/qortal-ui-core/language/ko.json b/qortal-ui-core/language/ko.json index 02d8cedf..e071b9f0 100644 --- a/qortal-ui-core/language/ko.json +++ b/qortal-ui-core/language/ko.json @@ -596,7 +596,8 @@ "pchange22": "작업 증명 계산 중... 시간이 좀 걸릴 수 있어...", "pchange23": "트랜잭션이 성공했습니다!", "pchange24": "트랜잭션 서명 및 처리 불가", - "pchange25": "파일 선택" + "pchange25": "파일 선택", + "pchange26": "데이터 업로드 중... 시간이 좀 걸릴 수 있습니다..." }, "browserpage": { "bchange1": "앞으로", @@ -627,7 +628,14 @@ "bchange26": "항상 자동으로 인증", "bchange27": "거부", "bchange28": "수락", - "bchange29": "즉시 게시(0.001QORT 수수료 필요)" + "bchange29": "즉시 게시(0.001QORT 수수료 필요)", + "bchange30": "서비스", + "bchange31": "이름", + "bchange32": "식별자", + "bchange33": "즉시 게시", + "bchange34": "파일 이름", + "bchange35": "이 애플리케이션에 코인을 보낼 수 있는 권한을 부여하시겠습니까?", + "bchange36": "작업 증명을 계산하지 않고 QDN에 즉시 게시하시겠습니까?" }, "datapage": { "dchange1": "데이터 관리", diff --git a/qortal-ui-core/language/no.json b/qortal-ui-core/language/no.json index e09f8292..d8952d51 100644 --- a/qortal-ui-core/language/no.json +++ b/qortal-ui-core/language/no.json @@ -596,7 +596,8 @@ "pchange22": "Databehandler proof of work... dette kan ta litt tid...", "pchange23": "Transaksjon vellykket!", "pchange24": "Kan ikke signere og behandle transaksjonen", - "pchange25": "Velg fil" + "pchange25": "Velg fil", + "pchange26": "Laster opp data... dette kan ta litt tid..." }, "browserpage": { "bchange1": "Frem", @@ -627,7 +628,14 @@ "bchange26": "Autentiser alltid automatisk", "bchange27": "Avvis", "bchange28": "Godta", - "bchange29": "Øyeblikkelig publisering (krever 0,001 QORT-avgift)" + "bchange29": "Øyeblikkelig publisering (krever 0,001 QORT-avgift)", + "bchange30": "Tjeneste", + "bchange31": "Navn", + "bchange32": "Identifikator", + "bchange33": "Øyeblikkelig publisering", + "bchange34": "Filnavn", + "bchange35": "Gir du denne applikasjonen tillatelse til å sende mynter?", + "bchange36": "Vil du publisere øyeblikkelig til QDN uten å regne ut bevis på arbeid?" }, "datapage": { "dchange1": "Data-administrasjon", diff --git a/qortal-ui-core/language/pl.json b/qortal-ui-core/language/pl.json index edf68d4b..1a3d0bcb 100644 --- a/qortal-ui-core/language/pl.json +++ b/qortal-ui-core/language/pl.json @@ -596,7 +596,8 @@ "pchange22": "Obliczanie dowodu pracy... może to zająć trochę czasu...", "pchange23": "Transakcja powiodła się!", "pchange24": "Nie można podpisać i przetworzyć transakcji", - "pchange25": "Wybierz plik" + "pchange25": "Wybierz plik", + "pchange26": "Ładowanie danych... może to trochę potrwać..." }, "browserpage": { "bchange1": "Naprzód", @@ -627,7 +628,14 @@ "bchange26": "Zawsze uwierzytelniaj automatycznie", "bchange27": "Odrzuć", "bchange28": "Akceptuj", - "bchange29": "Natychmiastowa publikacja (wymagana opłata QORT 0,001)" + "bchange29": "Natychmiastowa publikacja (wymagana opłata QORT 0,001)", + "bchange30": "Usługa", + "bchange31": "Nazwa", + "bchange32": "Identyfikator", + "bchange33": "Natychmiastowa publikacja", + "bchange34": "Nazwa pliku", + "bchange35": "Czy zezwalasz tej aplikacji na wysyłanie monet?", + "bchange36": "Czy chcesz natychmiast opublikować w QDN bez obliczania dowodu pracy?" }, "datapage": { "dchange1": "Zarządzanie danymi", diff --git a/qortal-ui-core/language/pt.json b/qortal-ui-core/language/pt.json index 979c7f9c..81f3d193 100644 --- a/qortal-ui-core/language/pt.json +++ b/qortal-ui-core/language/pt.json @@ -596,7 +596,8 @@ "pchange22": "Computando prova de trabalho... isso pode levar algum tempo...", "pchange23": "Transação bem sucedida!", "pchange24": "Não foi possível assinar e processar a transação", - "pchange25": "Escolha um Arqivo" + "pchange25": "Escolha um Arqivo", + "pchange26": "Carregando dados... isso pode levar algum tempo..." }, "browserpage": { "bchange1": "Encaminhar", @@ -627,7 +628,14 @@ "bchange26": "Sempre autenticar automaticamente", "bchange27": "Rejeitar", "bchange28": "Aceitar", - "bchange29": "Publicação instantânea (requer taxa QORT de 0,001)" + "bchange29": "Publicação instantânea (requer taxa QORT de 0,001)", + "bchange30": "Serviço", + "bchange31": "Nome", + "bchange32": "Identificador", + "bchange33": "Publicação instantânea", + "bchange34": "Nome do arquivo", + "bchange35": "Você dá permissão a este aplicativo para enviar moedas?", + "bchange36": "Deseja publicar instantaneamente em QDN sem calcular a prova de trabalho?" }, "datapage": { "dchange1": "Gerenciamento de Dados", diff --git a/qortal-ui-core/language/ro.json b/qortal-ui-core/language/ro.json index 4204be46..f62b2f8f 100644 --- a/qortal-ui-core/language/ro.json +++ b/qortal-ui-core/language/ro.json @@ -596,7 +596,8 @@ "pchange22": "Se calculeaza evidenta contributiei in retea... acest lucru poate dura ceva timp...", "pchange23": "Tranzactie reusita!", "pchange24": "Nu s-a putut semna si procesa tranzactia", - "pchange25": "Alege fisier" + "pchange25": "Alege fisier", + "pchange26": "Încărcarea datelor... poate dura ceva timp..." }, "browserpage": { "bchange1": "Inainte", @@ -627,7 +628,14 @@ "bchange26": "Autentificați-vă întotdeauna automat", "bchange27": "Respinge", "bchange28": "Accept", - "bchange29": "Publicare instantanee (necesită o taxă QORT de 0,001)" + "bchange29": "Publicare instantanee (necesită o taxă QORT de 0,001)", + "bchange30": "Serviciul", + "bchange31": "Nume", + "bchange32": "Identificator", + "bchange33": "Publicare instantanee", + "bchange34": "Nume fișier", + "bchange35": "Acordați acestei aplicații permisiunea de a trimite monede?", + "bchange36": "Doriți să publicați instant în QDN fără a calcula dovada de lucru?" }, "datapage": { "dchange1": "Gestionare date", diff --git a/qortal-ui-core/language/rs.json b/qortal-ui-core/language/rs.json index 8d0763f0..d51aa26a 100644 --- a/qortal-ui-core/language/rs.json +++ b/qortal-ui-core/language/rs.json @@ -596,7 +596,8 @@ "pchange22": "Proračunavanje dokaza o radu... ovo može potrajati...", "pchange23": "Transakcija uspešna!", "pchange24": "Nemogućnost potpisa i izvršenja transakcije", - "pchange25": "Izaberite Datoteku" + "pchange25": "Izaberite Datoteku", + "pchange26": "Otpremanje podataka... ovo može potrajati..." }, "browserpage": { "bchange1": "Prosledite", @@ -627,7 +628,14 @@ "bchange26": "Uvek automatski autentifikovati", "bchange27": "Odbaci", "bchange28": "Prihvatam", - "bchange29": "Trenutno objavljivanje (zahteva 0,001 QORT naknade)" + "bchange29": "Trenutno objavljivanje (zahteva 0,001 QORT naknade)", + "bchange30": "Usluga", + "bchange31": "Ime", + "bchange32": "Identifikator", + "bchange33": "Objavljivanje odmah", + "bchange34": "Ime datoteke", + "bchange35": "Da li ovoj aplikaciji dajete dozvolu za slanje novčića?", + "bchange36": "Da li želite da objavite instant na QDN bez izračunavanja dokaza o radu?" }, "datapage": { "dchange1": "Upravljanje podacima", diff --git a/qortal-ui-core/language/ru.json b/qortal-ui-core/language/ru.json index ae04ae3d..9046fcfd 100644 --- a/qortal-ui-core/language/ru.json +++ b/qortal-ui-core/language/ru.json @@ -596,7 +596,8 @@ "pchange22": "Вычисление доказательства работы... это может занять некоторое время...", "pchange23": "Транзакция прошла успешно!", "pchange24": "Невозможно подписать и обработать транзакцию", - "pchange25": "Выбрать файл" + "pchange25": "Выбрать файл", + "pchange26": "Выгрузка данных... это может занять некоторое время..." }, "browserpage": { "bchange1": "Вперед", @@ -627,7 +628,14 @@ "bchange26": "Всегда аутентифицироваться автоматически", "bchange27": "Отклонить", "bchange28": "Принять", - "bchange29": "Мгновенная публикация (требуется плата в размере 0,001 QORT)" + "bchange29": "Мгновенная публикация (требуется плата в размере 0,001 QORT)", + "bchange30": "Сервис", + "bchange31": "Имя", + "bchange32": "Идентификатор", + "bchange33": "Мгновенная публикация", + "bchange34": "Имя файла", + "bchange35": "Вы разрешаете этому приложению отправлять монеты?", + "bchange36": "Вы хотите опубликовать мгновенную публикацию в QDN без вычисления доказательства работы?" }, "datapage": { "dchange1": "Управление данными", diff --git a/qortal-ui-core/language/us.json b/qortal-ui-core/language/us.json index ec9efb54..33ce763e 100644 --- a/qortal-ui-core/language/us.json +++ b/qortal-ui-core/language/us.json @@ -597,7 +597,8 @@ "pchange22": "Computing proof of work... this can take some time...", "pchange23": "Transaction successful!", "pchange24": "Unable to sign and process transaction", - "pchange25": "Choose File" + "pchange25": "Choose File", + "pchange26": "Uploading data... this can take some time..." }, "browserpage": { "bchange1": "Forward", @@ -634,7 +635,8 @@ "bchange32": "Identifier", "bchange33": "Instant publish", "bchange34": "Filename", - "bchange35": "Do you give this application permission to send coins?" + "bchange35": "Do you give this application permission to send coins?", + "bchange36": "Do you want to publish instant to QDN without computing proof-of-work?" }, "datapage": { "dchange1": "Data Management", diff --git a/qortal-ui-core/language/zhc.json b/qortal-ui-core/language/zhc.json index 38c9eedd..24990890 100644 --- a/qortal-ui-core/language/zhc.json +++ b/qortal-ui-core/language/zhc.json @@ -596,7 +596,8 @@ "pchange22": "计算工作量证明中... 请稍等...", "pchange23": "发布成功!", "pchange24": "发布失败!", - "pchange25": "选择文件" + "pchange25": "选择文件", + "pchange26": "正在上传数据...这可能需要一些时间..." }, "browserpage": { "bchange1": "下一页", @@ -627,7 +628,14 @@ "bchange26": "始终自动验证", "bchange27": "拒绝", "bchange28": "接受", - "bchange29": "即时发布(需要 0.001 QORT 费用)" + "bchange29": "即时发布(需要 0.001 QORT 费用)", + "bchange30": "服务", + "bchange31": "姓名", + "bchange32": "标识符", + "bchange33": "即时发布", + "bchange34": "文件名", + "bchange35": "你允许这个应用程序发送硬币吗?", + "bchange36": "你想在不计算工作证明的情况下即时发布到 QDN 吗?" }, "datapage": { "dchange1": "资料管理", diff --git a/qortal-ui-core/language/zht.json b/qortal-ui-core/language/zht.json index d8a44903..fb665b06 100644 --- a/qortal-ui-core/language/zht.json +++ b/qortal-ui-core/language/zht.json @@ -596,7 +596,8 @@ "pchange22": "計算工作量證明中... 請稍等...", "pchange23": "發佈成功!", "pchange24": "發佈失敗!", - "pchange25": "選擇文件" + "pchange25": "選擇文件", + "pchange26": "正在上傳數據...這可能需要一些時間..." }, "browserpage": { "bchange1": "下一頁", @@ -627,7 +628,14 @@ "bchange26": "始終自動驗證", "bchange27": "拒絕", "bchange28": "接受", - "bchange29": "即時發布(需要 0.001 QORT 費用)" + "bchange29": "即時發布(需要 0.001 QORT 費用)", + "bchange30": "服務", + "bchange31": "姓名", + "bchange32": "標識符", + "bchange33": "即時發布", + "bchange34": "文件名", + "bchange35": "你允許這個應用程序發送硬幣嗎?", + "bchange36": "你想在不計算工作證明的情況下即時發佈到 QDN 嗎?" }, "datapage": { "dchange1": "資料管理", diff --git a/qortal-ui-core/src/components/settings-view/security-view.js b/qortal-ui-core/src/components/settings-view/security-view.js index a09b5fbe..f9facaea 100644 --- a/qortal-ui-core/src/components/settings-view/security-view.js +++ b/qortal-ui-core/src/components/settings-view/security-view.js @@ -1,8 +1,10 @@ import { LitElement, html, css } from 'lit' import { connect } from 'pwa-helpers' import { store } from '../../store.js' +import { allowQAPPAutoAuth, removeQAPPAutoAuth } from '../../redux/app/app-actions.js' import { use, get, translate, translateUnsafeHTML, registerTranslateConfig } from 'lit-translate' +import '@material/mwc-checkbox' import '@material/mwc-textfield' import '@material/mwc-icon' import '@vaadin/password-field/vaadin-password-field.js' @@ -27,6 +29,10 @@ class SecurityView extends connect(store)(LitElement) { --lumo-body-text-color: var(--black); --lumo-secondary-text-color: var(--sectxt); --lumo-contrast-60pct: var(--vdicon); + --mdc-checkbox-unchecked-color: var(--black); + --mdc-theme-on-surface: var(--black); + --mdc-checkbox-disabled-color: var(--black); + --mdc-checkbox-ink-color: var(--black); } .center-box { @@ -37,6 +43,16 @@ class SecurityView extends connect(store)(LitElement) { text-align: center; } + .checkbox-row { + position: relative; + display: flex; + align-items: center; + align-content: center; + font-family: Montserrat, sans-serif; + font-weight: 600; + color: var(--black); + } + .q-button { display: inline-flex; flex-direction: column; @@ -92,6 +108,13 @@ class SecurityView extends connect(store)(LitElement) {
this.checkForDownload()} class="q-button"> ${translate("settings.download")}
+
+
+ + this.checkForAuth(e)} ?checked=${store.getState().app.qAPPAutoAuth}> +
` } @@ -99,6 +122,14 @@ class SecurityView extends connect(store)(LitElement) { stateChanged(state) { } + checkForAuth(e) { + if (e.target.checked) { + store.dispatch(removeQAPPAutoAuth(false)) + } else { + store.dispatch(allowQAPPAutoAuth(true)) + } + } + checkForDownload() { const checkPass = this.shadowRoot.getElementById('downloadBackupPassword').value if (checkPass === '') { diff --git a/qortal-ui-plugins/plugins/core/qdn/browser/browser.src.js b/qortal-ui-plugins/plugins/core/qdn/browser/browser.src.js index 0201cb27..8e69858b 100644 --- a/qortal-ui-plugins/plugins/core/qdn/browser/browser.src.js +++ b/qortal-ui-plugins/plugins/core/qdn/browser/browser.src.js @@ -42,7 +42,8 @@ class WebBrowser extends LitElement { dogeFeePerByte: { type: Number }, dgbFeePerByte: { type: Number }, rvnFeePerByte: { type: Number }, - arrrWalletAddress: { type: String } + arrrWalletAddress: { type: String }, + theme: { type: String, reflect: true } } } @@ -56,6 +57,10 @@ class WebBrowser extends LitElement { --mdc-theme-primary: rgb(3, 169, 244); --mdc-theme-secondary: var(--mdc-theme-primary); --paper-input-container-focus-color: var(--mdc-theme-primary); + --mdc-checkbox-unchecked-color: var(--black); + --mdc-theme-on-surface: var(--black); + --mdc-checkbox-disabled-color: var(--black); + --mdc-checkbox-ink-color: var(--black); } #websitesWrapper paper-button { @@ -136,9 +141,7 @@ class WebBrowser extends LitElement { this.preview = urlParams.get('preview'); this.followedNames = []; this.blockedNames = []; - this.theme = localStorage.getItem('qortalTheme') - ? localStorage.getItem('qortalTheme') - : 'light'; + this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light' this.loader = new Loader(); // Build initial display URL let displayUrl = 'qortal://' + this.service + '/' + this.name; @@ -241,42 +244,81 @@ class WebBrowser extends LitElement { render() { return html` -
-
-
- this.goBack()} title="${translate( - 'general.back' - )}" class="address-bar-button">arrow_back_ios - this.goForward()} title="${translate( - 'browserpage.bchange1' - )}" class="address-bar-button">arrow_forward_ios - this.refresh()} title="${translate( - 'browserpage.bchange2' - )}" class="address-bar-button">refresh - this.goBackToList()} title="${translate( - 'browserpage.bchange3' - )}" class="address-bar-button">home - - this.delete()} title="${translate( - 'browserpage.bchange4' - )} ${this.service} ${this.name} ${translate( - 'browserpage.bchange5' - )}" class="address-bar-button float-right">delete - ${this.renderBlockUnblockButton()} - ${this.renderFollowUnfollowButton()} -
-
- +
+
+
+ this.goBack()} title="${translate('general.back')}" class="address-bar-button">arrow_back_ios + this.goForward()} title="${translate('browserpage.bchange1')}" class="address-bar-button">arrow_forward_ios + this.refresh()} title="${translate('browserpage.bchange2')}" class="address-bar-button">refresh + this.goBackToList()} title="${translate('browserpage.bchange3')}" class="address-bar-button">home + + ${this.renderFullScreen()} + this.delete()} title="${translate('browserpage.bchange4')} ${this.service} ${this.name} ${translate('browserpage.bchange5')}" class="address-bar-button float-right">delete + ${this.renderBlockUnblockButton()} + ${this.renderFollowUnfollowButton()} +
+
+ +
-
- `; + `; + } + + renderFullScreen() { + if (window.innerHeight == screen.height) { + return html` + this.exitFullScreen()} + title="${translate('browserpage.bchange9')} ${this.name}" + class="address-bar-button float-right" + > + fullscreen_exit + + ` + } else { + return html` + this.goFullScreen()} + title="${translate('browserpage.bchange9')} ${this.name}" + class="address-bar-button float-right" + > + fullscreen + + ` + } + } + + goFullScreen() { + var elem = this.shadowRoot.getElementById('websitesWrapper') + + if (elem.requestFullscreen) { + elem.requestFullscreen() + } else if (elem.mozRequestFullScreen) { + elem.mozRequestFullScreen() + } else if (elem.webkitRequestFullscreen) { + elem.webkitRequestFullscreen() + } else if (elem.msRequestFullscreen) { + elem.msRequestFullscreen() + } + + this.renderFullScreen() + } + + exitFullScreen() { + if(document.exitFullscreen) { + document.exitFullscreen() + } else if (document.mozCancelFullScreen) { + document.mozCancelFullScreen() + } else if (document.webkitExitFullscreen) { + document.webkitExitFullscreen() + } else if (document.msExitFullscreen) { + document.msExitFullscreen() + } + + this.renderFullScreen() } async unitJoinFee() { @@ -2165,9 +2207,11 @@ class WebBrowser extends LitElement { goBackToList() { if (this.service == "APP") { + this.exitFullScreen() window.location = '../../q-app/index.html'; } else { // Default to websites list + this.exitFullScreen() window.location = '../index.html'; } } @@ -2516,7 +2560,7 @@ async function showModalAndWait(type, data) { window.parent.reduxStore.dispatch( window.parent.reduxAction.removeQAPPAutoAuth(false)) return } - window.parent.reduxStore.dispatch( window.parent.reduxAction.allowQAPPAutoAuth(true)) + window.parent.reduxStore.dispatch(window.parent.reduxAction.allowQAPPAutoAuth(true)) }) } }); @@ -2608,6 +2652,16 @@ async function showErrorAndWait(type, data, data1) { // Add the styles for the modal const styles = ` + * { + --mdc-theme-primary: rgb(3, 169, 244); + --mdc-theme-secondary: var(--mdc-theme-primary); + --paper-input-container-focus-color: var(--mdc-theme-primary); + --mdc-checkbox-unchecked-color: var(--black); + --mdc-theme-on-surface: var(--black); + --mdc-checkbox-disabled-color: var(--black); + --mdc-checkbox-ink-color: var(--black); + } + .backdrop { position: fixed; top: 0; @@ -2723,7 +2777,7 @@ const styles = ` align-items: center; font-family: Montserrat, sans-serif; font-weight: 600; - color: black; + color: var(--black); } .modal-buttons { diff --git a/qortal-ui-plugins/plugins/core/qdn/publish/publish.src.js b/qortal-ui-plugins/plugins/core/qdn/publish/publish.src.js index 4be8bf2b..602704d1 100644 --- a/qortal-ui-plugins/plugins/core/qdn/publish/publish.src.js +++ b/qortal-ui-plugins/plugins/core/qdn/publish/publish.src.js @@ -10,6 +10,7 @@ registerTranslateConfig({ import '@material/mwc-button' import '@material/mwc-textfield' import '@material/mwc-select' +import '@material/mwc-dialog' import '@material/mwc-list/mwc-list-item.js' import '@polymer/paper-progress/paper-progress.js' @@ -55,6 +56,10 @@ class PublishData extends LitElement { * { --mdc-theme-primary: rgb(3, 169, 244); --mdc-theme-secondary: var(--mdc-theme-primary); + --mdc-dialog-content-ink-color: var(--black); + --mdc-theme-surface: var(--white); + --mdc-dialog-min-width: 400px; + --mdc-dialog-max-width: 1024px; --paper-input-container-focus-color: var(--mdc-theme-primary); --lumo-primary-text-color: rgb(0, 167, 245); --lumo-primary-color-50pct: rgba(0, 167, 245, 0.5); @@ -68,7 +73,6 @@ class PublishData extends LitElement { --_lumo-grid-secondary-border-color: var(--border2); } - input[type=text] { padding: 6px 6px 6px 6px; color: var(--black); @@ -94,7 +98,10 @@ class PublishData extends LitElement { } #publishWrapper .buttons { - width: auto !important; + display: flex; + justify-content: space-between; + max-width:100%; + width:100%; } mwc-textfield { @@ -124,16 +131,24 @@ class PublishData extends LitElement { .address-bar-button mwc-icon { width: 30px; } + + .red { + --mdc-theme-primary: #F44336; + } + + .green { + --mdc-theme-primary: #198754; + } ` } constructor() { super() - this.showName = false; + this.showName = false this.showService = false this.showIdentifier = false - this.showMetadata = false + this.showMetadata = false const urlParams = new URLSearchParams(window.location.search) this.name = urlParams.get('name') @@ -182,7 +197,7 @@ class PublishData extends LitElement { setTimeout(() => { this.names = res if (res[0] != null) { - this.myRegisteredName = res[0].name; + this.myRegisteredName = res[0].name } }, 1) }) @@ -201,7 +216,7 @@ class PublishData extends LitElement { const fetchPeersSummary = () => { parentEpml.request('apiCall', {url: `/peers/summary`}).then(res => { setTimeout(() => { - this.portForwardingEnabled = (res.inboundConnections != null && res.inboundConnections > 0); + this.portForwardingEnabled = (res.inboundConnections != null && res.inboundConnections > 0) }, 1) }) setTimeout(fetchPeersSummary, this.config.user.nodeSettings.pingInterval) @@ -252,7 +267,7 @@ class PublishData extends LitElement {

this.selectName(e)} style="min-width: 130px; max-width:100%; width:100%;"> - ${this.myRegisteredName} + ${this.myRegisteredName}

@@ -269,13 +284,13 @@ class PublishData extends LitElement { `)}

-

+

-

+
${this.renderUploadField()}

@@ -289,14 +304,22 @@ class PublishData extends LitElement {

${this.successMessage}

${this.loading ? html` ` : ''}
-
- this.doPublish(e, true)}> ${translate("appspage.schange40")} - this.doPublish(e, false)}> ${translate("publishpage.pchange11")} -
+ this.doPublish(e, true, false)}> ${translate("appspage.schange40")} + this.shadowRoot.querySelector('#publishWithFeeDialog').show()}> ${translate("publishpage.pchange11")}
- ` + + +
${translate("browserpage.bchange36")}
${translate("browserpage.bchange29")}
+ + ${translate("general.no")} + + + ${translate("general.yes")} + +
+ ` } firstUpdated() { @@ -337,11 +360,11 @@ class PublishData extends LitElement { changeTheme() { const checkTheme = localStorage.getItem('qortalTheme') if (checkTheme === 'dark') { - this.theme = 'dark'; + this.theme = 'dark' } else { - this.theme = 'light'; + this.theme = 'light' } - document.querySelector('html').setAttribute('theme', this.theme); + document.querySelector('html').setAttribute('theme', this.theme) } changeLanguage() { @@ -357,7 +380,7 @@ class PublishData extends LitElement { // Navigation goBack() { - window.history.back(); + window.history.back() } @@ -386,8 +409,17 @@ class PublishData extends LitElement { } } + feeDialogYes(e, preview, fee) { + this.doPublish(e, preview, fee) + this.shadowRoot.querySelector('#publishWithFeeDialog').close() + } - doPublish(e, preview) { + feeDialogNo(e, preview, fee) { + this.doPublish(e, preview, fee) + this.shadowRoot.querySelector('#publishWithFeeDialog').close() + } + + doPublish(e, preview, fee) { let registeredName = this.shadowRoot.getElementById('registeredName').value let service = this.shadowRoot.getElementById('service').value let identifier = this.shadowRoot.getElementById('identifier').value @@ -397,8 +429,8 @@ class PublishData extends LitElement { registeredName = this.name } - let file; - let path; + let file + let path if (this.uploadType === "file" || this.uploadType === "zip") { file = this.shadowRoot.getElementById('file').files[0] @@ -433,11 +465,11 @@ class PublishData extends LitElement { parentEpml.request('showSnackBar', `${err5string}`) } else { - this.publishData(registeredName, path, file, service, identifier, preview) + this.publishData(registeredName, path, file, service, identifier, preview, fee) } } - async publishData(registeredName, path, file, service, identifier, preview) { + async publishData(registeredName, path, file, service, identifier, preview, fee) { this.loading = true this.btnDisable = true @@ -463,48 +495,55 @@ class PublishData extends LitElement { if (validNameRes.error) { this.errorMessage = "Error: " + validNameRes.message showError(this.errorMessage) - throw new Error(this.errorMessage); + throw new Error(this.errorMessage) } let err6string = get("publishpage.pchange19") this.generalMessage = `${err6string}` - let transactionBytes; - let previewUrlPath; + let transactionBytes + let previewUrlPath + + let uploadDataRes = await uploadData(registeredName, path, file, preview, fee) - let uploadDataRes = await uploadData(registeredName, path, file, preview) if (uploadDataRes.error) { let err7string = get("publishpage.pchange20") this.errorMessage = `${err7string}` + uploadDataRes.message showError(this.errorMessage) - throw new Error(this.errorMessage); + throw new Error(this.errorMessage) } else if (uploadDataRes.includes("Error 500 Internal Server Error")) { let err8string = get("publishpage.pchange21") this.errorMessage = `${err8string}` showError(this.errorMessage) - throw new Error(this.errorMessage); + throw new Error(this.errorMessage) } if (preview) { // uploadData() returns preview URL path when in preview mode - previewUrlPath = uploadDataRes; - window.location = `../browser/index.html?service=${this.service}&name=Preview&preview=${previewUrlPath}`; - return; + previewUrlPath = uploadDataRes + window.location = `../browser/index.html?service=${this.service}&name=Preview&preview=${previewUrlPath}` + return } else { // uploadData() returns transaction bytes when not in preview mode - transactionBytes = uploadDataRes; + transactionBytes = uploadDataRes } - let err9string = get("publishpage.pchange22") - this.generalMessage = `${err9string}` + if (fee) { + let err9string = get("publishpage.pchange26") + this.generalMessage = `${err9string}` + } else { + let err9string = get("publishpage.pchange22") + this.generalMessage = `${err9string}` + } + + let signAndProcessRes = await signAndProcess(transactionBytes, fee) - let signAndProcessRes = await signAndProcess(transactionBytes) if (signAndProcessRes.error) { let err10string = get("publishpage.pchange20") this.errorMessage = `${err10string}` + signAndProcessRes.message showError(this.errorMessage) - throw new Error(this.errorMessage); + throw new Error(this.errorMessage) } let err11string = get("publishpage.pchange23") @@ -516,7 +555,7 @@ class PublishData extends LitElement { this.successMessage = `${err11string}` } - const uploadData = async (registeredName, path, file, preview) => { + const uploadData = async (registeredName, path, file, preview, fee) => { let postBody = path let urlSuffix = "" if (file != null) { @@ -532,24 +571,37 @@ class PublishData extends LitElement { // Base64 encode the file to work around compatibility issues between javascript and java byte arrays let fileBuffer = new Uint8Array(await file.arrayBuffer()) - postBody = Buffer.from(fileBuffer).toString('base64'); + postBody = Buffer.from(fileBuffer).toString('base64') } // Optional metadata - let title = encodeURIComponent(this.shadowRoot.getElementById('title').value); - let description = encodeURIComponent(this.shadowRoot.getElementById('description').value); - let category = encodeURIComponent(this.shadowRoot.getElementById('category').value); - let tag1 = encodeURIComponent(this.shadowRoot.getElementById('tag1').value); - let tag2 = encodeURIComponent(this.shadowRoot.getElementById('tag2').value); - let tag3 = encodeURIComponent(this.shadowRoot.getElementById('tag3').value); - let tag4 = encodeURIComponent(this.shadowRoot.getElementById('tag4').value); - let tag5 = encodeURIComponent(this.shadowRoot.getElementById('tag5').value); + let title = encodeURIComponent(this.shadowRoot.getElementById('title').value) + let description = encodeURIComponent(this.shadowRoot.getElementById('description').value) + let category = encodeURIComponent(this.shadowRoot.getElementById('category').value) + let tag1 = encodeURIComponent(this.shadowRoot.getElementById('tag1').value) + let tag2 = encodeURIComponent(this.shadowRoot.getElementById('tag2').value) + let tag3 = encodeURIComponent(this.shadowRoot.getElementById('tag3').value) + let tag4 = encodeURIComponent(this.shadowRoot.getElementById('tag4').value) + let tag5 = encodeURIComponent(this.shadowRoot.getElementById('tag5').value) let metadataQueryString = `title=${title}&description=${description}&category=${category}&tags=${tag1}&tags=${tag2}&tags=${tag3}&tags=${tag4}&tags=${tag5}` + let uploadDataUrl = `` - let uploadDataUrl = `/arbitrary/${this.service}/${registeredName}${urlSuffix}?${metadataQueryString}&apiKey=${this.getApiKey()}&preview=${new Boolean(preview).toString()}` - if (identifier != null && identifier.trim().length > 0) { - uploadDataUrl = `/arbitrary/${service}/${registeredName}/${this.identifier}${urlSuffix}?${metadataQueryString}&apiKey=${this.getApiKey()}&preview=${new Boolean(preview).toString()}` + if (preview) { + uploadDataUrl = `/arbitrary/${this.service}/${registeredName}${urlSuffix}?${metadataQueryString}&apiKey=${this.getApiKey()}&preview=${new Boolean(preview).toString()}` + if (identifier != null && identifier.trim().length > 0) { + uploadDataUrl = `/arbitrary/${service}/${registeredName}/${this.identifier}${urlSuffix}?${metadataQueryString}&apiKey=${this.getApiKey()}&preview=${new Boolean(preview).toString()}` + } + } else if (fee) { + uploadDataUrl = `/arbitrary/${this.service}/${registeredName}${urlSuffix}?${metadataQueryString}&fee=100000&apiKey=${this.getApiKey()}` + if (identifier != null && identifier.trim().length > 0) { + uploadDataUrl = `/arbitrary/${service}/${registeredName}/${this.identifier}${urlSuffix}?${metadataQueryString}&fee=100000&apiKey=${this.getApiKey()}` + } + } else { + uploadDataUrl = `/arbitrary/${this.service}/${registeredName}${urlSuffix}?${metadataQueryString}&apiKey=${this.getApiKey()}` + if (identifier != null && identifier.trim().length > 0) { + uploadDataUrl = `/arbitrary/${service}/${registeredName}/${this.identifier}${urlSuffix}?${metadataQueryString}&apiKey=${this.getApiKey()}` + } } let uploadDataRes = await parentEpml.request('apiCall', { @@ -571,38 +623,47 @@ class PublishData extends LitElement { return convertedBytes } - const signAndProcess = async (transactionBytesBase58) => { + const signAndProcess = async (transactionBytesBase58, fee) => { let convertedBytesBase58 = await convertBytesForSigning(transactionBytesBase58) if (convertedBytesBase58.error) { let err12string = get("publishpage.pchange20") this.errorMessage = `${err12string}` + convertedBytesBase58.message showError(this.errorMessage) - throw new Error(this.errorMessage); + throw new Error(this.errorMessage) } - const convertedBytes = window.parent.Base58.decode(convertedBytesBase58); - const _convertedBytesArray = Object.keys(convertedBytes).map(function (key) { return convertedBytes[key]; }); + const convertedBytes = window.parent.Base58.decode(convertedBytesBase58) + const _convertedBytesArray = Object.keys(convertedBytes).map(function (key) { return convertedBytes[key] }) const convertedBytesArray = new Uint8Array(_convertedBytesArray) const convertedBytesHash = new window.parent.Sha256().process(convertedBytesArray).finish().result - const hashPtr = window.parent.sbrk(32, window.parent.heap); - const hashAry = new Uint8Array(window.parent.memory.buffer, hashPtr, 32); - hashAry.set(convertedBytesHash); + const hashPtr = window.parent.sbrk(32, window.parent.heap) + const hashAry = new Uint8Array(window.parent.memory.buffer, hashPtr, 32) + hashAry.set(convertedBytesHash) - const difficulty = 14; - const workBufferLength = 8 * 1024 * 1024; - const workBufferPtr = window.parent.sbrk(workBufferLength, window.parent.heap); + const difficulty = 14 + const workBufferLength = 8 * 1024 * 1024 + const workBufferPtr = window.parent.sbrk(workBufferLength, window.parent.heap) - this.errorMessage = ''; - this.successMessage = ''; + this.errorMessage = '' + this.successMessage = '' let nonce = window.parent.computePow(hashPtr, workBufferPtr, workBufferLength, difficulty) - - let response = await parentEpml.request('sign_arbitrary', { - nonce: this.selectedAddress.nonce, - arbitraryBytesBase58: transactionBytesBase58, - arbitraryBytesForSigningBase58: convertedBytesBase58, - arbitraryNonce: nonce - }) + let response = false + + if (fee) { + response = await parentEpml.request('sign_arbitrary_with_fee', { + nonce: this.selectedAddress.nonce, + arbitraryBytesBase58: transactionBytesBase58, + arbitraryBytesForSigningBase58: convertedBytesBase58 + }) + } else { + response = await parentEpml.request('sign_arbitrary', { + nonce: this.selectedAddress.nonce, + arbitraryBytesBase58: transactionBytesBase58, + arbitraryBytesForSigningBase58: convertedBytesBase58, + arbitraryNonce: nonce + }) + } let myResponse = { error: '' } if (response === false) { @@ -641,7 +702,7 @@ class PublishData extends LitElement { fetchResourceMetadata() { - let identifier = this.identifier != null ? this.identifier : "default"; + let identifier = this.identifier != null ? this.identifier : "default" parentEpml.request('apiCall', { url: `/arbitrary/metadata/${this.service}/${this.name}/${identifier}?apiKey=${this.getApiKey()}` @@ -650,10 +711,10 @@ class PublishData extends LitElement { setTimeout(() => { this.metadata = res if (this.metadata != null && this.metadata.category != null) { - this.shadowRoot.getElementById('category').value = this.metadata.category; + this.shadowRoot.getElementById('category').value = this.metadata.category } else { - this.shadowRoot.getElementById('category').value = ""; + this.shadowRoot.getElementById('category').value = "" } }, 1) }) @@ -666,13 +727,13 @@ class PublishData extends LitElement { if (name.value.length > 0) { this.name = (name.value) } - this.fetchResourceMetadata(); + this.fetchResourceMetadata() } getApiKey() { - const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]; - let apiKey = myNode.apiKey; - return apiKey; + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + let apiKey = myNode.apiKey + return apiKey } clearSelection() {