Merge branch 'develop' of https://github.com/Superalgos/Superalgos into develop

This commit is contained in:
EvaMaria70 committed 2021-11-05 10:14:17 +01:00
commit c7878074ba
63 files changed
+8462 -1332

No files matched your search

+26 -103
View File
@@ -1,126 +1,49 @@
exports.newDesktopApp = function newDesktopApp() {
let thisObject = {
socialGraph: undefined,
p2pMetwork: undefined,
webSocketsClient: undefined,
webSocketsInterface: undefined,
run: run
}
DK.desktopApp = thisObject
return thisObject
async function run() {
/*
Here we will store our running objects:
*/
DK.running = {}
/*
This is the Personal Social Graph for the user running this App.
*/
DK.running.socialGraph = DK.projects.socialTrading.modules.socialGraph.newSocialTradingModulesSocialGraph()
await DK.running.socialGraph.initialize()
thisObject.socialGraph = DK.projects.socialTrading.modules.socialGraph.newSocialTradingModulesSocialGraph()
await thisObject.socialGraph.initialize()
/*
We can join now the P2P Network as a client app.
*/
thisObject.p2pMetwork = SA.projects.network.modules.p2pNetwork.newNetworkModulesP2PNetwork()
await thisObject.p2pMetwork.initialize('Network Client')
/*
Here we will pick a Network Node from all users profiles available that do have a Network Node running.
*/
let selectedNetworkNode = thisObject.p2pMetwork.p2pNodesToConnect[0]
/*
This is the Web Sockets client that interacts with the Superalgos Network.
*/
DK.running.webSocketsClient = SA.projects.network.modules.webSocketsAppClient.newNetworkModulesWebSocketsAppClient()
await DK.running.webSocketsClient.initialize()
thisObject.webSocketsClient = SA.projects.network.modules.webSocketsNetworkClient.newNetworkModulesWebSocketsNetworkClient()
await thisObject.webSocketsClient.initialize('Network Client', selectedNetworkNode)
console.log('Desktop Client Connected to Network Node via Web Sockets ................... Connected to port ' + global.env.NETWORK_WEB_SOCKETS_INTERFACE_PORT)
/* These are the Network Interfaces by which the Web App interacts with this Desktop Client.*/
DK.running.webSocketsInterface = DK.projects.socialTrading.modules.webSocketsInterface.newDesktopModulesWebSocketsInterface()
DK.running.webSocketsInterface.initialize()
/*
These are the Network Interfaces by which the Web App interacts with this Desktop Client.
*/
thisObject.webSocketsInterface = DK.projects.socialTrading.modules.webSocketsInterface.newDesktopModulesWebSocketsInterface()
thisObject.webSocketsInterface.initialize()
console.log('Desktop Client Web Sockets Interface ....................................... Listening at port ' + global.env.DESKTOP_WEB_SOCKETS_INTERFACE_PORT)
DK.running.httpInterface = DK.projects.socialTrading.modules.httpInterface.newDesktopModulesHttpInterface()
DK.running.httpInterface.initialize()
thisObject.httpInterface = DK.projects.socialTrading.modules.httpInterface.newDesktopModulesHttpInterface()
thisObject.httpInterface.initialize()
console.log('Desktop Client Http Interface .............................................. Listening at port ' + global.env.DESKTOP_HTTP_INTERFACE_PORT)
return
let queryMessage
let query
/*
Test Query User Profiles.
*/
queryMessage = {
queryType: SA.projects.socialTrading.globals.queryTypes.USER_PROFILES,
emitterUserProfileId: SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileId,
initialIndex: 'Last',
amountRequested: 10,
direction: 'Past'
}
query = {
requestType: 'Query',
queryMessage: JSON.stringify(queryMessage)
}
await DK.webSocketsClient.sendMessage(
JSON.stringify(query)
)
.then(showProfiles)
.catch(onError)
async function showProfiles(profiles) {
console.log(profiles)
for (let i = 0; i < profiles.length; i++) {
let profile = profiles[i]
/*
Test Following Profiles.
*/
let eventMessage = {
eventId: SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId(),
eventType: SA.projects.socialTrading.globals.eventTypes.FOLLOW_USER_PROFILE,
emitterUserProfileId: SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileId,
targetUserProfileId: profile.userProfileId
}
let event = {
requestType: 'Event',
eventMessage: JSON.stringify(eventMessage)
}
await DK.webSocketsClient.sendMessage(
JSON.stringify(event)
)
.then(followAdded)
.catch(onError)
function followAdded() {
console.log("User Profile " + profile.userProfileHandle + " followed.")
}
}
}
/*
Test Query User Profile Stats.
*/
queryMessage = {
queryType: SA.projects.socialTrading.globals.queryTypes.USER_PROFILE_STATS,
emitterUserProfileId: SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileId,
targetUserProfileId: SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileId
}
query = {
requestType: 'Query',
queryMessage: JSON.stringify(queryMessage)
}
await DK.webSocketsClient.sendMessage(
JSON.stringify(query)
)
.then(showProfilesStats)
.catch(onError)
function showProfilesStats(profile) {
console.log(profile)
}
/*
Error Handling
*/
function onError(errorMessage) {
console.log('[ERROR] Query not executed. ' + errorMessage)
}
}
}
+6
View File
@@ -3,6 +3,7 @@ exports.newNetworkNode = function newNetworkNode() {
let thisObject = {
socialGraphService: undefined,
storage: undefined,
p2pMetwork: undefined,
run: run
}
@@ -24,5 +25,10 @@ exports.newNetworkNode = function newNetworkNode() {
*/
thisObject.storage = NT.projects.socialTrading.modules.storage.newSocialTradingModulesStorage()
thisObject.storage.initialize()
/*
We can join now the P2P Network as a new peer there.
*/
thisObject.p2pMetwork = SA.projects.network.modules.p2pNetwork.newNetworkModulesP2PNetwork()
await thisObject.p2pMetwork.initialize('Network Peer')
}
}
+5
View File
@@ -515,6 +515,11 @@ function newCanvas() {
return
}
}
if (nodeOnFocus.payload.uiObject.listSelector !== undefined) {
if (nodeOnFocus.payload.uiObject.listSelector.visible === true) {
return
}
}
if (nodeOnFocus.payload.uiObject.conditionEditor !== undefined) {
if (nodeOnFocus.payload.uiObject.conditionEditor.visible === true) {
return
Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

@@ -12,6 +12,17 @@
"actionProject": "Governance",
"relatedUiObjectProject": "Governance"
},
{
"action": "Add Specified User Profile",
"label": "Add Specified User Profile",
"iconPathOn": "user-profile",
"iconPathOff": "user-profile",
"iconProject": "Governance",
"actionProject": "Governance",
"relatedUiObject": "User Profile",
"dontShowAtFullscreen": true,
"actionFunction": "payload.executeAction"
},
{
"action": "Delete UI Object",
"actionProject": "Visual-Scripting",
@@ -30,6 +41,9 @@
"attachingRules": {
"compatibleTypes": "->Plugin Project->"
},
"editors": {
"list": true
},
"childrenNodesProperties": [
{
"name": "pluginFiles",
File diff suppressed because it is too large. Load diff
@@ -1,4 +1,4 @@
function newEducationFunctionLibraryDocsStats() {
function newEducationFunctionLibraryDocsStatisticsFunctions() {
let thisObject = {
printDocsStats: printDocsStats
}
@@ -23,6 +23,7 @@ function newEducationFunctionLibraryDocsStats() {
for (let i = 0; i < UI.projects.education.spaces.docsSpace.searchEngine.docsIndex.length; i++) {
documentPage = UI.projects.education.spaces.docsSpace.searchEngine.docsIndex[i]
pagesCount += 1
let lastValue
if (projectStats[documentPage.project] !== undefined) {
lastValue = projectStats[documentPage.project]
}
@@ -135,6 +135,12 @@ function newFoundationsDocsFooter() {
}
HTML = HTML + '"></a>'
HTML = HTML + '<a href="#" onClick="UI.projects.education.spaces.docsSpace.changeLanguage(\'AR\')"><img src="Images/Languages/AR.png" title="Arabic" class="docs-footer-language'
if (languageCode === 'AR') {
HTML = HTML + '-selected'
}
HTML = HTML + '"></a>'
HTML = HTML + '</div>'
HTML = HTML + '<div class="docs-footer-cell">'
@@ -48,6 +48,10 @@ function newEducationUtilitiesLanguages() {
languageLabel = 'Dutch'
break
}
case 'AR': {
languageLabel = 'Arabic'
break
}
}
return languageLabel
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

@@ -10,6 +10,11 @@
"language": "ES",
"text": "Time Machines cuentan con un Time Scale, un Rate Scale, y un Time Frame Scale. Los gráficos de línea de tiempo pueden implementar los dos últimos.",
"updated": 1627309210785
},
{
"language": "TR",
"text": "Zaman Makinelerinde Zaman Ölçeği, Hız Ölçeği ve Zaman Çerçevesi Ölçeği bulunur. Zaman çizelgesi çizelgeleri son ikisini uygulayabilir.",
"updated": 1636095803708
}
]
},
@@ -38,6 +38,11 @@
"text": "Я не буду вдаваться в подробности по мере продвижения, но если Вам нужна дополнительная информауия об узле, кнопка Help в меню приведет Вас прямо к его документации.",
"updated": 1635613175051,
"style": "Definition"
},
{
"language": "TR",
"text": "Devam ederken her ayrıntıya girmeyeceğim, ancak bir düğüm hakkında daha fazla bilgiye ihtiyacınız varsa, menüdeki yardım düğmesi (Düğümü geniletiğinizde görebilirsiniz) sizi doğrudan belgelerine götürür.",
"updated": 1636012819082
}
]
},
@@ -75,6 +80,11 @@
"text": "Документация узла модет включать один или несколько из следующих разделов:",
"updated": 1635613205233,
"style": "Text"
},
{
"language": "TR",
"text": "Bir düğümün dokümantasyonu aşağıdaki bölümlerden bir veya daha fazlasını içerebilir:",
"updated": 1636012836829
}
]
},
@@ -111,6 +121,11 @@
"text": "Difinition: описывает, что представляет собой узел и его функции.",
"updated": 1635613299355,
"style": "List"
},
{
"language": "TR",
"text": "Tanım (Definition): düğümün ne olduğunu veya ne yaptığını açıklar.",
"updated": 1636012877511
}
]
},
@@ -147,6 +162,11 @@
"text": "Content: описывает, как работает узел.",
"updated": 1635613497534,
"style": "List"
},
{
"language": "TR",
"text": "İçerik (Content): düğümün nasıl çalıştığını açıklar.",
"updated": 1636012909187
}
]
},
@@ -184,6 +204,11 @@
"text": "Configuration: некоторые узлы могут иметь один узел.",
"updated": 1635613523569,
"style": "List"
},
{
"language": "TR",
"text": "Yapılandırma (Configuration): bazı düğümlerde bir tane olabilir.",
"updated": 1636012944710
}
]
},
@@ -221,6 +246,11 @@
"text": "Technical: основная информация обычно носит технический характер и ориентирована на разработчиков.",
"updated": 1635613576536,
"style": "List"
},
{
"language": "TR",
"text": "Teknik (Technical): Bilginin geri kalanı genellikle geliştiricilere yönelik teknik niteliktedir.",
"updated": 1636012987852
}
]
},
@@ -255,7 +285,13 @@
{
"language": "RU",
"text": "Нажмите кнопку на узле Data Tasks!",
"updated": 1635627454333
"updated": 1635627454333,
"style": "Callout"
},
{
"language": "TR",
"text": "Veri Görevleri ( Data Tasks ) düğümündeki yardım düğmesine tıklayın!",
"updated": 1636013020909
}
]
}
@@ -36,7 +36,13 @@
{
"language": "RU",
"text": "Если Вы когда-нибудь что-то нарушили, например, удалили узел или изменили конфигурацию и не знаете, как дальше действовать...",
"updated": 1635627557596
"updated": 1635627557596,
"style": "Definition"
},
{
"language": "TR",
"text": "Bir düğümü silmek veya bir konfigürasyonu değiştirmek gibi bir şeyi bozarsanız ve sonuçla nasıl başa çıkacağınızı bilmiyorsanız...",
"updated": 1636013094366
}
]
},
@@ -72,7 +78,13 @@
{
"language": "RU",
"text": "... Вы можете легко начать все сначала с исходного рабочего пространства Getting Started Tutorials Plugin Workspace!",
"updated": 1635628049167
"updated": 1635628049167,
"style": "Callout"
},
{
"language": "TR",
"text": "... orijinal Getting Started Tutorials Plugin Workspace! ile kolayca baştan başlayabilirsiniz!...",
"updated": 1636013152834
}
],
"updated": 1622196973760
@@ -108,7 +120,13 @@
{
"language": "RU",
"text": "В таком случае просто потяните вкладку с левой стороны, прокрутите, найдите плагин Getting Started Tutorials и нажмите на него! Загрузится исходный Plugin Workspace и учебное пособие появится снова, с самого начала!",
"updated": 1635629001422
"updated": 1635629001422,
"style": "Text"
},
{
"language": "TR",
"text": "Böyle bir durumda, sol taraftaki sekmeyi çekin, kaydırın, Getting Started Tutorials Plugin'i bulun ve tıklayın! Orijinal Eklenti Çalışma Alanı ( Plugin Workspace ) yüklenecek ve öğretici, baştan yeni bir şekilde yeniden görünecek!",
"updated": 1636013239148
}
],
"updated": 1622634394712
@@ -133,7 +151,13 @@
{
"language": "RU",
"text": "Plugin Workspaces поставляются вместе с системой. Давайте посмотрим, как вы можете сделать их своими собственными или создать новые рабочие пространства!",
"updated": 1635629610043
"updated": 1635629610043,
"style": "Success"
},
{
"language": "TR",
"text": "Eklenti Çalışma Alanları ( Plugin Workspaces ) sistemle birlikte gönderilir. Şimdi bunları nasıl kendinize ait hale getirebileceğinizi veya yeni çalışma alanları oluşturabileceğinizi görelim!",
"updated": 1636013279897
}
]
}
@@ -30,7 +30,13 @@
{
"language": "DE",
"text": "Plugin Workspaces, die mit dem System ausgeliefert werden, haben einen schwarzen Hintergrund in der Registerkarte Workspaces auf der linken Seite.",
"updated": 1634167337552
"updated": 1634167337552,
"style": "Definition"
},
{
"language": "TR",
"text": "Sistemle birlikte gönderilen Eklenti Çalışma Alanları ( Plugin Workspaces ), soldaki Çalışma Alanları (Workspaces) Sekmesinde siyah bir arka plana sahiptir. ",
"updated": 1636013396906
}
],
"updated": 1629803469668
@@ -62,7 +68,13 @@
{
"language": "DE",
"text": "Workspaces speichern alle Informationen zu den Datenstrukturen, die im Arbeitsbereich enthalten sind.",
"updated": 1634167346842
"updated": 1634167346842,
"style": "Text"
},
{
"language": "TR",
"text": "Çalışma alanları ( Workspaces ), çalışma alanına dahil edilen veri yapılarına ilişkin tüm bilgileri kaydeder.",
"updated": 1636013436668
}
]
},
@@ -80,7 +92,13 @@
{
"language": "DE",
"text": "Erstellen Sie eine Kopie dieses Plugin Workspace um ihn zu Ihrem eigenen zu machen! Drücken Sie dazu: Ctrl + Shift + Key-S",
"updated": 1634167512053
"updated": 1634167512053,
"style": "Callout"
},
{
"language": "TR",
"text": "Gelin bu Plugin Workspace'in bir kopyasını oluşturalım ve sizin için yapalım! Aşağıdaki tuş kombinasyonuna basın: Ctrl + Shift + Key-S",
"updated": 1636013459404
}
]
},
@@ -109,7 +127,13 @@
{
"language": "DE",
"text": "Öffnen Sie nun die Registerkarte Workspaces auf der linken Seite, scrollen Sie ganz nach unten und suchen Sie den einzigen Workspace mit einem lila Hintergrund! Das ist Ihr Arbeitsbereich! Sie brauchen ihn aber nicht anzuklicken!",
"updated": 1634167411161
"updated": 1634167411161,
"style": "Important"
},
{
"language": "TR",
"text": "Şimdi soldaki Çalışma Alanları Sekmesini açın, aşağı kaydırın ve mor arka plana sahip tek çalışma alanını bulun! Bu sizin çalışma alanınız! Ama üzerine tıklamanıza gerek yok!",
"updated": 1636013495006
}
],
"updated": 1629803460646
@@ -36,7 +36,13 @@
{
"language": "RU",
"text": "Теперь, когда Вам удобно передвигаться, я хочу, чтобы Вы отправились в небольшую экскурсию по Network Node раздела Data Tasks.",
"updated": 1635630043831
"updated": 1635630043831,
"style": "Definition"
},
{
"language": "TR",
"text": "Artık rahatça dolaşabildiğinize göre, Ağ Düğümü'nün ( Network Node ) Veri Görevleri ( Data Tasks ) bölümünü keşfetmek için küçük bir tura çıkmanızı istiyorum.",
"updated": 1636014280941
}
],
"updated": 1622194034630
@@ -73,7 +79,13 @@
{
"language": "RU",
"text": "Обратите внимание на следующее:",
"updated": 1635630070775
"updated": 1635630070775,
"style": "Text"
},
{
"language": "TR",
"text": "Aşağıdakilere dikkat edin:",
"updated": 1636014296432
}
]
},
@@ -108,7 +120,13 @@
{
"language": "RU",
"text": "Раздел делится, в первую очередь, на проекты, биржи и рынки. Он поможет Вам организованно работать со множеством бирж и рынков.",
"updated": 1635630220075
"updated": 1635630220075,
"style": "List"
},
{
"language": "TR",
"text": "Bölüm, her şeyden önce proje, borsa ve pazara göre düzenlenmiştir. Bu, birden fazla borsa ve birden fazla pazarla düzenli bir şekilde çalışmanıza yardımcı olacaktır.",
"updated": 1636014356317
}
]
},
@@ -143,7 +161,13 @@
{
"language": "RU",
"text": "Узлы Exchange Data Tasks и Мarket Data Tasks могут управлять всеми задачами на бирже и рынке соответственно.",
"updated": 1635630313880
"updated": 1635630313880,
"style": "List"
},
{
"language": "TR",
"text": "Borsa Veri Görevleri ( Exchance Data Tasks ) ve Piyasa Veri Görevleri ( Market Data Tasks ) düğümleri, sırasıyla borsadaki ve pazardaki tüm görevleri kontrol edebilir.",
"updated": 1636014775744
}
]
},
@@ -178,7 +202,13 @@
{
"language": "RU",
"text": "Выйдите и проверьте эти узлы и их меню!",
"updated": 1635630414259
"updated": 1635630414259,
"style": "Callout"
},
{
"language": "TR",
"text": "Şimdi bu düğümleri ve menülerini kontrol edin!",
"updated": 1636014827396
}
]
}
@@ -30,7 +30,13 @@
{
"language": "DE",
"text": "Innerhalb jedes Marktes ist die Operation nach Data Mine organisiert. Superalgos wird mit mehreren quelloffenen Data Mines ausgeliefert, die jeweils mehrere Indikatoren enthalten.",
"updated": 1634168232166
"updated": 1634168232166,
"style": "Definition"
},
{
"language": "TR",
"text": "Her pazarda, operasyon Data Mine tarafından organize edilir. Superalgos, her biri birden fazla göstergeye sahip birkaç açık kaynaklı veri madeni ile birlikte gelir.",
"updated": 1636014963314
}
]
},
@@ -60,7 +66,13 @@
{
"language": "DE",
"text": "Betrachten Sie Data Mines als Plugins, die Entwickler erstellen können, um die Datenanalysekapazität des Systems zu erweitern. Ein Indicator Bot kann Daten verarbeiten, die von anderen Indikatoren erzeugt werden, und so einen Mehrwert und eine tiefere und reichhaltigere Analyse liefern.",
"updated": 1634168218271
"updated": 1634168218271,
"style": "Text"
},
{
"language": "TR",
"text": "Veri madenlerini, geliştiricilerin sistemin veri analiz kapasitesini genişletmek için oluşturabilecekleri eklentiler olarak düşünün. Bir Gösterge Botu ( Indicator Bot ), diğer göstergelerin ürettiği verileri işleyebilir, dolayısıyla değer katabilir ve daha derin ve daha zengin analizler üretebilir.",
"updated": 1636015012141
}
]
},
@@ -89,7 +101,13 @@
{
"language": "DE",
"text": "Wenn Sie ein Grundverständnis von JavaScript haben, können Sie auch Indikatoren erstellen! Wenn Sie eine Data Mine beitragen, verdienen Sie Superalgos SA Tokens!",
"updated": 1634168241958
"updated": 1634168241958,
"style": "Callout"
},
{
"language": "TR",
"text": "Temel bir JavaScript bilginiz varsa, göstergeler de oluşturabilirsiniz! Bir Veri Madenine ( Data Mine ) katkıda bulunursanız, Superalgos SA Jetonları kazanırsınız!",
"updated": 1636015059999
}
],
"updated": 1622196189467
@@ -30,7 +30,13 @@
{
"language": "DE",
"text": "Das Herzstück einer Data-Mining-Operation sind Tasks, die Bots ausführen. Ein Task steuert einen Bot, und ein Task Manager kann mehrere Tasks steuern.",
"updated": 1634168469674
"updated": 1634168469674,
"style": "Definition"
},
{
"language": "TR",
"text": "Bir veri madenciliği operasyonunun özü, bot çalıştıran görevlerdir. Bir Görev, bir botu kontrol eder ve bir Görev Yöneticisi ( Tasks Manager ) birden fazla görevi kontrol edebilir.",
"updated": 1636015403690
}
]
},
@@ -61,7 +67,13 @@
{
"language": "DE",
"text": "Inzwischen haben Sie sechs verschiedene Geräte kennengelernt, die Sie zur Steuerung der einzelnen Bots in Ihrem Data Mining-Vorgang verwenden können. Auf der höchsten Ebene steuert der Knoten Data Tasks alle Data-Mining-Bots im Netzwerkknoten.",
"updated": 1634168489908
"updated": 1634168489908,
"style": "Text"
},
{
"language": "TR",
"text": "Şimdiye kadar, veri madenciliği operasyonunuzdaki her bir botu kontrol etmek için kullanabileceğiniz altı farklı cihaz hakkında bilgi edindiniz. En üst düzeyde, Veri Görevleri (Data Tasks) düğümü, Ağ Düğümü'ndeki (Network Node) tüm veri madenciliği botlarını kontrol eder.",
"updated": 1636015350802
}
]
},
@@ -90,7 +102,13 @@
{
"language": "DE",
"text": "Wir werden in einer Minute über Netzwerkknoten sprechen...",
"updated": 1634168496945
"updated": 1634168496945,
"style": "Callout"
},
{
"language": "TR",
"text": "Ağ düğümleri hakkında birazdan konuşacağız...",
"updated": 1636015240381
}
]
},
@@ -120,7 +138,13 @@
{
"language": "DE",
"text": "Auf der untersten Ebene steuert ein einzelner Task einen einzelnen Bot. Die Knoten dazwischen sind Organisationsknoten, die für Ordnung sorgen und eine detaillierte Kontrolle über die verschiedenen Bereiche ermöglichen.",
"updated": 1634168505425
"updated": 1634168505425,
"style": "Text"
},
{
"language": "TR",
"text": "En alt düzeyde, tek bir Görev (Task), tek bir botu kontrol eder. Aradaki düğümler, işlemi düzenli tutmaya yardımcı olan ve farklı bölümler üzerinde ayrıntılı kontrole izin veren organizasyon düğümleridir.",
"updated": 1636015306156
}
]
}
@@ -30,7 +30,13 @@
{
"language": "DE",
"text": "Inzwischen sollten alle Prozesse zu 100 % laufen. Wenn dies der Fall ist, bezeichnen wir die Data-Mining-Operation als \"up to date\".",
"updated": 1634170269450
"updated": 1634170269450,
"style": "Definition"
},
{
"language": "TR",
"text": "Şu anda , tüm işlemler %100 olmalıdır. Bu olduğunda, veri madenciliği operasyonuna \"güncel\" diyoruz.",
"updated": 1636015455848
}
],
"updated": 1616415623576
@@ -61,7 +67,13 @@
{
"language": "DE",
"text": "Wenn alle Prozesse auf dem neuesten Stand sind, laufen die Bots weiter und verarbeiten Informationen in Echtzeit, während sie an der Börse produziert werden. Das heißt, die Data-Mining-Operation stoppt nur, wenn Sie sie stoppen!",
"updated": 1634170281567
"updated": 1634170281567,
"style": "Text"
},
{
"language": "TR",
"text": "Tüm süreçler güncel olduğunda, botlar çalışmaya devam eder ve bilgiyi borsada üretildiği gibi gerçek zamanlı olarak işler. Yani, siz durdurmadığınız sürece veri madenciliği işlemi durmaz!",
"updated": 1636015476681
}
]
},
@@ -90,7 +102,13 @@
{
"language": "DE",
"text": "Schauen Sie sich um und prüfen Sie, ob alle Prozesse zu 100% laufen.",
"updated": 1634170288448
"updated": 1634170288448,
"style": "Callout"
},
{
"language": "TR",
"text": "Etrafınıza bakın ve tüm işlemlerin %100 olup olmadığını görün",
"updated": 1636015521214
}
]
},
@@ -119,7 +137,13 @@
{
"language": "DE",
"text": "Um eine Live Trading Session durchzuführen, benötigen Sie eine ständige Zufuhr von Informationen von der Börse, die in Echtzeit verarbeitet werden, damit der Trading Bot die Regeln Ihres Trading System anwenden kann, um Live-Handelsentscheidungen zu treffen.",
"updated": 1634170296952
"updated": 1634170296952,
"style": "Text"
},
{
"language": "TR",
"text": "Canlı Alım Satım Oturumu ( Live Trading Session ) yürütmek için, Alım Satım Botunun ( Trading Bot ) canlı alım satım kararları vermek üzere Alım Satım Sisteminizin ( Trading System ) kurallarını uygulayabilmesi için, gerçek zamanlı olarak işlenen borsadan sürekli bir bilgi akışına ihtiyacınız vardır.",
"updated": 1636016072081
}
],
"updated": 1616415667438
@@ -32,6 +32,11 @@
"text": "Da wir keine Live Trading Session durchführen, macht es grade keinen Sinn, das Data Mining zu diesem Zeitpunkt laufen zu lassen.",
"updated": 1634170784986,
"style": "Definition"
},
{
"language": "TR",
"text": "Henüz bir Canlı İşlem Oturumu ( Live Trading Session ) düzenlemeyeceğiz, bu nedenle veri madenciliğimizi bu noktada çalışır durumda tutmanın bir anlamı yok.",
"updated": 1636016140799
}
]
},
@@ -64,6 +69,11 @@
"text": "Es gibt zwei Anwendungsfälle für die Data Tasks:",
"updated": 1634170835236,
"style": "Text"
},
{
"language": "TR",
"text": "Veri Görevlerini çalıştırmanın iki ana kullanım durumu vardır:",
"updated": 1636016174401
}
]
},
@@ -95,6 +105,11 @@
"text": "Zur Verarbeitung historischer Daten: Sie möchten für einen bestimmten Zeitraum einen bestimmten Market verarbeiten, um eine Backtesting Session durchzuführen oder Indikatoren testen.",
"updated": 1634208005120,
"style": "List"
},
{
"language": "TR",
"text": "Geçmiş verileri işlemek için: Bir Geriye Dönük Test Oturumu (Backtesting Sesion ) yürütmek veya yeni göstergeleri işlemek için belirli bir Piyasanın ( Market ) bir tarih saat aralığını işlemek isteyebilirsiniz.",
"updated": 1636016235514
}
]
},
@@ -126,6 +141,11 @@
"text": "Eine Live-Sitzung durchführen: Die verschiedenen Arten von Live-Sitzungen, wie Paper Trading Session, Forward Testing Session und Live Trading Session, benötigen alle einen Live-Markt-Feed.",
"updated": 1634208020007,
"style": "List"
},
{
"language": "TR",
"text": "Canlı bir oturum yürütmek için: Kağıt Alım Satım Oturumu (Paper Trading Session ), İleriye Yönelik Test Oturumu (Forward Testing Session ) ve Canlı Alım Satım Oturumu ( Live Trading Session ) gibi farklı türlerdeki oturumların tümü canlı bir piyasa akışına ihtiyaç duyar.",
"updated": 1636016605221
}
]
},
@@ -156,6 +176,11 @@
"text": "Wenn alle Prozesse auf dem neuesten Stand sind, wählen Sie \"Stop All Tasks\" im Knoten Market Data Tasks. Beachten Sie, dass die Tasks auch von einem anderen Knoten aus gestoppt werden können als von dem aus, mit dem sie gestartet wurden!",
"updated": 1634172843262,
"style": "Callout"
},
{
"language": "TR",
"text": "Tüm işlemler güncel olduğunda (%100), Piyasa Veri Görevleri ( Market Data Tasks ) düğümünde \"Stop All Tasks\" seçeneğini seçin. Ek bilgi olarak, görevleri başlattığımız düğümden farklı bir düğümden durdurabileceğimizi de unutmayın.",
"updated": 1636016732706
}
],
"updated": 1622197433719
@@ -30,7 +30,13 @@
{
"language": "DE",
"text": "Es kann Minuten dauern, bis alle Aufgaben zum getoppt sind. Sie sollten das System niemals schließen, bevor alle Aufgaben beendet sind.",
"updated": 1634173343328
"updated": 1634173343328,
"style": "Definition"
},
{
"language": "TR",
"text": "Tüm görevlerin durması bir dakika kadar sürebilir. Tüm görevler durmadan sistemi asla kapatmamalısınız.",
"updated": 1636033722512
}
]
},
@@ -60,7 +66,13 @@
{
"language": "DE",
"text": "Überprüfen Sie die Kommandozeile Ihres Systems, um zu sehen, ob die Aufgaben gestoppt wurden!",
"updated": 1634173091261
"updated": 1634173091261,
"style": "Callout"
},
{
"language": "TR",
"text": "Görevlerin durduğunu görmek için konsol uygulamasını kontrol edin! Görevler çalışırken düğümlerin altında 1/1, 1/2 gibi kaç görev olduğu ve kaçının çalıştığına dair bir gösterge görürsünüz.",
"updated": 1636033793821
}
],
"updated": 1616416021973
@@ -84,7 +96,13 @@
{
"language": "DE",
"text": "Der richtige Weg, Superalgos zu schließen, ist:",
"updated": 1634173103809
"updated": 1634173103809,
"style": "Text"
},
{
"language": "TR",
"text": "Superalgos'u kapatmanın doğru yolu şudur:",
"updated": 1636033807278
}
]
},
@@ -108,7 +126,13 @@
{
"language": "DE",
"text": "Alle Aufgaben beenden, ein paar Minuten warten.",
"updated": 1634173410210
"updated": 1634173410210,
"style": "List"
},
{
"language": "TR",
"text": "Tüm görevleri durdurun ve birkaç dakika bekleyin.",
"updated": 1636033819254
}
]
},
@@ -132,7 +156,13 @@
{
"language": "DE",
"text": "Wenn alle Aufgaben beendet sind, können Sie die Konsolenanwendung schließen oder den Prozess mit Ctrl + Key-C beenden.",
"updated": 1634173253123
"updated": 1634173253123,
"style": "List"
},
{
"language": "TR",
"text": "Tüm görevler durduğunda konsol uygulamasını kapatabilir veya Ctrl + Key-C ile işlemi durdurabilirsiniz",
"updated": 1636033864602
}
]
},
@@ -155,7 +185,13 @@
{
"language": "DE",
"text": "Sie können den Browser jederzeit schließen und die Aufgaben im Hintergrund weiterlaufen lassen.",
"updated": 1634173156784
"updated": 1634173156784,
"style": "List"
},
{
"language": "TR",
"text": "Tarayıcıyı istediğiniz zaman kapatabilir ve görevlerin arka planda işlenmesini bırakabilirsiniz.",
"updated": 1636033884326
}
]
},
@@ -179,7 +215,13 @@
{
"language": "DE",
"text": "Wenn Sie den Client schließen, bevor die Tasks beendet sind, können Ihre Daten beschädigt werden!",
"updated": 1634173172953
"updated": 1634173172953,
"style": "Warning"
},
{
"language": "TR",
"text": "Görevler durmadan İstemciyi ( Client ) kapatmak, verilerinizin bozulmasına neden olabilir!",
"updated": 1636033906258
}
]
}
@@ -30,7 +30,13 @@
{
"language": "DE",
"text": "Bislang waren Sie auf die dunkle Seite von Superalgos beschränkt. Machen Sie sich bereit, die helle Seite kennenzulernen: den Charting Space.",
"updated": 1634174936126
"updated": 1634174936126,
"style": "Definition"
},
{
"language": "TR",
"text": "Şimdiye kadar Superalgos'un karanlık tarafıyla sınırlı kaldınız. Parlak tarafa maruz kalmaya hazır olun: Grafik Alanı ( Charting Space )",
"updated": 1636034022706
}
]
},
@@ -61,7 +67,13 @@
{
"language": "DE",
"text": "Der Charting-Bereich befindet sich über dem Design-Bereich, getrennt durch einen türkisfarbenen Schieberegler. Wie Sie es von Superalgos gewohnt sind, ist der Charting Space konfigurierbar und hochflexibel. Alles, was dort geschieht, wird in der Charting Space Hierarchie definiert.",
"updated": 1634174969494
"updated": 1634174969494,
"style": "Text"
},
{
"language": "TR",
"text": "Grafik alanı, turkuaz bir kaydırıcı ile ayrılmış tasarım alanının üstünde bulunur. Superalgos'tan beklendiği gibi, grafik alanı yapılandırılabilir ve oldukça esnektir. Orada olan her şey Grafik Alanı ( Charting Space ) hiyerarşisinde tanımlanır.",
"updated": 1636034080988
}
]
},
@@ -90,7 +102,13 @@
{
"language": "DE",
"text": "Der Charting Space ist dafür bekannt, dass er die Leute umhaut. Bitte fahren Sie mit diesem Tutorial nicht fort, wenn Sie unter dem Einfluss von psychoaktiven Substanzen stehen.",
"updated": 1634174978126
"updated": 1634174978126,
"style": "Warning"
},
{
"language": "TR",
"text": "Grafik alanı, insanların aklını başından almasıyla bilinir. Lütfen şu anda psikoaktif maddelerin etkisi altındaysanız bu eğitime devam etmekten kaçının :)",
"updated": 1636034105076
}
],
"updated": 1616416552336
@@ -30,7 +30,13 @@
{
"language": "DE",
"text": "Ich bringe Sie in kürzester Zeit dazu, sich im Charting Space zu bewegen und zu blättern... Kümmern wir uns zuerst um den Schieberegler!",
"updated": 1634205702474
"updated": 1634205702474,
"style": "Definition"
},
{
"language": "TR",
"text": "Hiç vakit kaybetmeden dolaşarak ve çizelge alanına göz atarak sizi hızlandıracağım... Önce kaydırıcıyı ele alalım!",
"updated": 1636034139286
}
]
},
@@ -60,7 +66,13 @@
{
"language": "DE",
"text": "Klicken Sie ihn an und ziehen Sie ihn nach unten, um den Design Space zu schließen und den Charting Space zu öffnen. Um den umgekehrten Effekt zu erzielen, machen Sie das Gegenteil. Drücken Sie Ctrl + Shift + ↓. um dies mit der Tastatur zu tun. Versuchen Sie auch ↑ ← →",
"updated": 1634205728640
"updated": 1634205728640,
"style": "Callout"
},
{
"language": "TR",
"text": "Tasarım alanını kapatmak ve grafik alanını açmak için turkuaz bölgeyi tıklayarak aşağıya çekin. Kapatmak için tersini yapabilirsiniz. Bunu klavyeyle yapmak için Ctrl + Shift + ↓ tuşlarına basın. ↑ ← →.. Diğer yön tuşlarını da deneyin!",
"updated": 1636034296397
}
]
},
@@ -89,7 +101,13 @@
{
"language": "DE",
"text": "Es ist eine gute Idee, einen der beiden Bereiche vollständig zu schließen, um Ressourcen zu sparen, es sei denn, Sie brauchen beide Bereiche nur teilweise geöffnet zu haben.",
"updated": 1634205372068
"updated": 1634205372068,
"style": "Success"
},
{
"language": "TR",
"text": "Her iki alanın da kısmen açık olmasına ihtiyacınız yoksa, makinenizdeki bilgi işlem kaynaklarından tasarruf etmek için her ikisini de tamamen kapatmak her zaman iyi bir fikirdir.",
"updated": 1636034332675
}
]
}
@@ -30,7 +30,13 @@
{
"language": "DE",
"text": "Genau wie der Design Space bietet auch der Charting Space einen riesigen Bereich, in dem Sie Diagramme einrichten können... so viele, wie Ihre Hardware verkraften kann!",
"updated": 1634205591674
"updated": 1634205591674,
"style": "Definition"
},
{
"language": "TR",
"text": "Tasarım alanı gibi, çizelge alanı da çizelgeler oluşturabileceğiniz devasa bir alana sahiptir... donanımınızın üstesinden gelebileceği kadar!",
"updated": 1636034379426
}
]
},
@@ -61,7 +67,13 @@
{
"language": "DE",
"text": "Um die Dinge für Neulinge einfach zu halten, gibt es in diesem Workspace des Getting Started Tutorials nur zwei Charts. Fortgeschrittene Benutzer überwachen Charts von mehreren Börsen und Märkten.",
"updated": 1634205603337
"updated": 1634205603337,
"style": "Text"
},
{
"language": "TR",
"text": "Yeni başlayanlar için işleri basit tutmak gerektiğinden bu ( Getting Started Tutorial ) alanında yalnızca iki çizelge vardır. İleri düzey kullanıcılar, birden çok borsadan ve birden çok pazardan gelen tabloları izleyebilirler.",
"updated": 1636034464247
}
]
},
@@ -90,7 +102,13 @@
{
"language": "DE",
"text": "Um sich im Viewport zu bewegen, klicken Sie auf einen leeren Bereich und ziehen Sie mit der Maus. Die Tastaturkombination ist Shift plus die Pfeiltasten ↑ ← → ↓",
"updated": 1634205660486
"updated": 1634205660486,
"style": "Callout"
},
{
"language": "TR",
"text": "Görünüm Alanında (Viewport) gezinmek için farenizi kullanarak boş alana tıklayın ve sürükleyin. Klavye ile şu tuş kombinasyonunu kullanarakta gezinebilirsin. Shift artı ok tuşları ↑ ← → ↓",
"updated": 1636034607617
}
],
"updated": 1622198195729
@@ -30,7 +30,13 @@
{
"language": "DE",
"text": "Ich habe bereits erwähnt, dass es in diesem Workspace zwei Diagramme gibt. In Superalgos nennen wir jedes dieser Diagramme eine Time Machine.",
"updated": 1634205940397
"updated": 1634205940397,
"style": "Definition"
},
{
"language": "TR",
"text": "Daha önce bahsetmiştim, bu çalışma alanında iki çizelge var. Superalgos'ta bu çizelgelerin her birine bir Zaman Makinesi ( Time Machine ) diyoruz.",
"updated": 1636035055393
}
]
},
@@ -60,7 +66,13 @@
{
"language": "DE",
"text": "Eine Time Machine kann einen oder mehere Timeline Charts enthalten. Wir nennen sie Time Machines, weil alle Timeline Charts innerhalb einer Time Machine zeitlich synchronisiert sind. Diese Eigenschaft der Time Machines ermöglicht es, verschiedene Datenebenen auf derselben Time Scale zu überlagern.",
"updated": 1634206096721
"updated": 1634206096721,
"style": "Text"
},
{
"language": "TR",
"text": "Bir zaman makinesi, bir veya daha fazla Zaman Çizelgesi Grafiği tutabilir. Onlara zaman makineleri diyoruz çünkü bir zaman makinesindeki tüm zaman çizelgeleri zamanla senkronize edilir. Zaman makinelerinin bu özelliği, aynı Zaman Ölçeğini paylaşan farklı veri katmanlarının üst üste binmesine izin verir.",
"updated": 1636035067580
}
]
},
@@ -89,7 +101,13 @@
{
"language": "DE",
"text": "Fahren Sie mit dem Mauszeiger über die Time Machines!",
"updated": 1634206006623
"updated": 1634206006623,
"style": "Callout"
},
{
"language": "TR",
"text": "Fare imlecinizi zaman makinelerinin üzerine getirin!",
"updated": 1636035197351
}
]
},
@@ -119,7 +137,13 @@
{
"language": "DE",
"text": "Beachten Sie die Beschriftung auf der linken Seite, aus der hervorgeht, mit welchen Börsen und Märkten die Daten verbunden sind. Eine einzige Time Machine kann Daten von mehreren Märkten und mehreren Börsen enthalten!",
"updated": 1634206050433
"updated": 1634206050433,
"style": "Text"
},
{
"language": "TR",
"text": "Sol tarafta beliren ve verilerin hangi borsalar ve pazarlarla ilişkili olduğunu gösteren etikete dikkat edin. Tek bir zaman makinesi birden fazla pazardan ve birden fazla borsadan veri tutabilir!",
"updated": 1636035233840
}
]
}
@@ -30,7 +30,13 @@
{
"language": "DE",
"text": "Ok... vielleicht ist es nicht wirklich wie Raumkrümmung, aber habt Nachsicht mit mir... Du wirst begeistert sein, wie du Zeitmaschinen in jedes beliebige Format bringen kannst.",
"updated": 1634206247154
"updated": 1634206247154,
"style": "Definition"
},
{
"language": "TR",
"text": "Tamam,belki zamanı bükmek gibi değil, ama inan bana bu harika birşey... Zaman makinelerini istediğin formatta şekillendirebiliyor olmana bayılacaksın.",
"updated": 1636035360393
}
]
},
@@ -60,7 +66,13 @@
{
"language": "DE",
"text": "Bewegen Sie Ihren Mauszeiger über einen der Ränder des türkisfarbenen Rahmens, der die Time Machine definiert, und sehen Sie, was passiert. Sehen Sie, wie der Rand gelb hervorgehoben wird?",
"updated": 1634206251264
"updated": 1634206251264,
"style": "Text"
},
{
"language": "TR",
"text": "Fare imlecinizi zaman makinesini tanımlayan turkuaz çerçevenin herhangi bir kenarının üzerine getirin ve ne olduğunu görün. Kenarın sarı ile nasıl vurgulandığını gördünüz mü?",
"updated": 1636035384197
}
]
},
@@ -89,7 +101,13 @@
{
"language": "DE",
"text": "Sehr gut! Klicken Sie nun mit der linken Maustaste auf den Rahmen und ziehen Sie!",
"updated": 1634206263662
"updated": 1634206263662,
"style": "Callout"
},
{
"language": "TR",
"text": "Güzel! Şimdi çerçeveye tıklayın ve çekin!",
"updated": 1636035404981
}
]
},
@@ -118,7 +136,13 @@
{
"language": "DE",
"text": "Auf diese Weise können Sie die Time Machines nach Ihren Wünschen gestalten.",
"updated": 1634206284213
"updated": 1634206284213,
"style": "Note"
},
{
"language": "TR",
"text": "Böylece zaman makinelerini kendi zevkinize veya ihtiyacınıza göre şekillendirebilirsiniz.",
"updated": 1636035425014
}
]
}
@@ -30,7 +30,13 @@
{
"language": "DE",
"text": "Zusammenfassung: Wie wäre es, die Time Machine genau an das Seitenverhältnis Ihres Bildschirms anzupassen?",
"updated": 1634206350448
"updated": 1634206350448,
"style": "Definition"
},
{
"language": "TR",
"text": "Zaman makinesini ekranınızın tam en boy oranına göre şekillendirmeye ne dersiniz?",
"updated": 1636035470271
}
]
},
@@ -60,7 +66,13 @@
{
"language": "DE",
"text": "Die Anpassung des Seitenverhältnisses Ihrer Zeitmaschinen an das Seitenverhältnis Ihres Bildschirms ist entscheidend dafür, dass die Diagramme beim Heranzoomen genau auf Ihren Bildschirm passen!",
"updated": 1634206368643
"updated": 1634206368643,
"style": "Text"
},
{
"language": "TR",
"text": "Zaman makinelerinizin en boy oranını ekranınızın en boy oranıyla eşleştirmek, yakınlaştırırken grafiklerin ekranınıza sığabilmesi için çok önemlidir!",
"updated": 1636035504803
}
],
"updated": 1622198491208
@@ -91,7 +103,13 @@
{
"language": "DE",
"text": "Richten Sie Ihre Maus auf eine der Time Machines und drücken Sie Ctrl + Shift + Alt + Key-A. Machen Sie dasselbe mit der anderen Maschine!",
"updated": 1634206401027
"updated": 1634206401027,
"style": "Callout"
},
{
"language": "TR",
"text": "Farenizi zaman makinelerinden birine yönlendirin ve Ctrl + Shift + Alt + Key-A tuşlarına basın. Aynısını diğeriyle yapın!",
"updated": 1636035527567
}
]
},
@@ -121,7 +139,13 @@
{
"language": "DE",
"text": "Lassen Sie die beiden Time Machines von nun an auf das Seitenverhältnis Ihres Bildschirms abgestimmt!",
"updated": 1634206411265
"updated": 1634206411265,
"style": "Success"
},
{
"language": "TR",
"text": "Şu andan itibaren ekranınızın en boy oranıyla eşleşen iki zaman makinesini görmen lazım.",
"updated": 1636035706936
}
]
}
@@ -30,7 +30,13 @@
{
"language": "DE",
"text": "Bevor wir in die Tabellen eintauchen, noch eine Sache. Sie müssen wissen, wie Sie das Haus in Ordnung bringen können!",
"updated": 1634206589741
"updated": 1634206589741,
"style": "Definition"
},
{
"language": "TR",
"text": "Tablolara girmeden önce bir şey daha var. Bu alanı nasıl düzene sokacağını bilmelisin!",
"updated": 1636035747714
}
]
},
@@ -60,7 +66,13 @@
{
"language": "DE",
"text": "Es wird die Zeit kommen, in der Sie vielleicht mit Dutzenden von Diagrammen arbeiten werden. Sie wissen bereits, wie Sie deren Format ändern können. Jetzt müssen Sie lernen, wie Sie die Diagramme verschieben können, damit Sie die gewünschten Arrangements erstellen können. Das ist ganz einfach:",
"updated": 1634206671224
"updated": 1634206671224,
"style": "Text"
},
{
"language": "TR",
"text": "Onlarca çizelge ile çalışmanız gereken zamanar gelecek. Biçimlerini nasıl değiştireceğinizi öğrenmiştik. Şimdi, ihtiyaç duyduğunuz düzenlemeleri oluşturabilmeniz için onları nasıl hareket ettireceğinizi öğrenmeniz gerekiyor. Oldukça kolay:",
"updated": 1636035803888
}
],
"updated": 1616416902513
@@ -91,7 +103,13 @@
{
"language": "DE",
"text": "Drücken Sie die Shift, klicken Sie mit der linken Maustaste, und ziehen Sie!",
"updated": 1634206723517
"updated": 1634206723517,
"style": "Callout"
},
{
"language": "TR",
"text": "Shift 'e basın, sol tıklayın ve sürükleyin!",
"updated": 1636035874767
}
]
},
@@ -120,7 +138,13 @@
{
"language": "DE",
"text": "Ich glaube, wir haben jetzt alles über die Verwaltung des Charting Space gesagt. Jetzt ist es Zeit, in die Diagramme einzutauchen!",
"updated": 1634206736658
"updated": 1634206736658,
"style": "Success"
},
{
"language": "TR",
"text": "Grafik alanını nasıl yöneteceğimizle ilgili her şeyi ele aldığımıza inanıyorum. Grafiklere dalmanın zamanı geldi!",
"updated": 1636035867318
}
]
}
@@ -30,7 +30,13 @@
{
"language": "DE",
"text": " Es ist an der Zeit, in eine Time Machine einzutauchen und zu sehen, was passiert! Sind Sie bereit für ein umfassendes, immersives Erlebnis?",
"updated": 1634207146163
"updated": 1634207146163,
"style": "Definition"
},
{
"language": "TR",
"text": "Bir Zaman Makinesine ( Time Machine ) dalıp ne olduğunu görmenin zamanı geldi! Tamamen sürükleyici bir deneyime hazır mısınız?",
"updated": 1636036023943
}
]
},
@@ -60,7 +66,13 @@
{
"language": "DE",
"text": "Der Charting Space ist so etwas wie das Google Maps der Marktcharts. Wie Sie bereits wissen, können Sie mit der linken Maustaste klicken und ziehen, um sich in der im Charting Space zu bewegen... aber wie zoomen Sie hinein, um die Details zu sehen?",
"updated": 1634207179395
"updated": 1634207179395,
"style": "Text"
},
{
"language": "TR",
"text": "Grafik alanı, piyasa verilerinin Google Haritaları gibidir. Bildiğiniz gibi, haritalarda gezinmek için sol tıklayıp sürüklersiniz... ama detayları görmek için nasıl yakınlaştırıyorsunuz?",
"updated": 1636036084427
}
]
},
@@ -89,7 +101,13 @@
{
"language": "DE",
"text": "Mit dem Rad der Maus! Probieren Sie es aus!",
"updated": 1634207215883
"updated": 1634207215883,
"style": "Callout"
},
{
"language": "TR",
"text": "Farenin tekerleği ile! Dene!",
"updated": 1636036095610
}
]
},
@@ -119,7 +137,13 @@
{
"language": "DE",
"text": "Ganz genau! Genau wie in Google Maps! Zeigen Sie mit der Maus auf den Bereich, der Sie interessiert, und drehen Sie dann das Mausrad nach vorne, um hineinzuzoomen, und nach hinten, um herauszuzoomen! ",
"updated": 1634207338450
"updated": 1634207338450,
"style": "Text"
},
{
"language": "TR",
"text": "Aynen öyle! Tıpkı Google Haritalar'daki gibi! Fareyi ilgilenilen alana doğrultun, ardından yakınlaştırmak için farenin tekerleğini ileri, uzaklaştırmak için geri çevirin!",
"updated": 1636036116439
}
]
}
@@ -30,7 +30,13 @@
{
"language": "DE",
"text": "Ich weiß! Wenn Sie auf eine beliebige Stelle zoomen, ist es unwahrscheinlich, dass Sie die Karte im rechten Winkel zu Ihrem Bildschirm positionieren, oder? Keine Sorge... versuchen Sie diesen Trick!",
"updated": 1634207830054
"updated": 1634207830054,
"style": "Definition"
},
{
"language": "TR",
"text": "Biliyorum! Rastgele bir noktaya zum yapmak, grafiği ekranınızla kare şeklinde konumlandırmak pek mümkün değil, değil mi? Endişelenme... bu numarayı dene!",
"updated": 1636036151336
}
],
"updated": 1616417516192
@@ -56,7 +62,13 @@
{
"language": "DE",
"text": "Stellen Sie das Seitenverhältnis ein: Zeigen Sie mit der Maus auf den Chart der Backtesting Session (den oberen) und drücken Sie Ctrl + Shift + Alt + Key-A",
"updated": 1634207859976
"updated": 1634207859976,
"style": "List"
},
{
"language": "TR",
"text": "En-boy oranını ayarlayın: Farenizi Backtesting Session grafiğine (üstteki) getirin ve Ctrl + Shift + Alt + Key-A tuşlarına basın",
"updated": 1636036205725
}
]
},
@@ -79,7 +91,13 @@
{
"language": "DE",
"text": "Verkleinern: Benutzen Sie das Mausrad, um zur äußersten Verkleinerungsposition zu gelangen; nur von dieser Position aus funktioniert der nächste Befehl!",
"updated": 1634207868032
"updated": 1634207868032,
"style": "List"
},
{
"language": "TR",
"text": "Uzaklaştır: en uzak uzaklaştırma konumuna gitmek için fare tekerleğini kullanın; sadece bu konumdan sonraki komut çalışacaktır!",
"updated": 1636036274866
}
]
},
@@ -108,7 +126,13 @@
{
"language": "DE",
"text": "Doppelklicken Sie einmal: Dies zentriert das Diagramm und bringt Sie zu einer bestimmten Zoomstufe; es wird ein Rand gelassen, damit der Name und die Registerkarte des Diagramms in die obere linke Ecke passen.",
"updated": 1634207894965
"updated": 1634207894965,
"style": "List"
},
{
"language": "TR",
"text": "Bir kez çift tıklayın: bu, grafiği ortalar ve sizi belirli bir yakınlaştırma düzeyine götürür; sol üst köşede grafiğin adına ve sekmesine uyacak şekilde bir kenar boşluğu bırakılır.",
"updated": 1636037063264
}
],
"updated": 1616418234728
@@ -138,7 +162,13 @@
{
"language": "DE",
"text": "Ein weiterer Doppelklick: bringt Sie weiter in das Diagramm, bis zu einer Zoomstufe, in der das Diagramm perfekt auf den Bildschirm passt und die Layer Manager erscheinen.",
"updated": 1634207914480
"updated": 1634207914480,
"style": "List"
},
{
"language": "TR",
"text": "Tekrar çift tıklayın: bu sizi grafikte daha ileri götürür, grafiğin ekrana tam olarak oturduğu ve Katman Yöneticilerinin ortaya çıktığı yakınlaştırma düzeyine gidersiniz.",
"updated": 1636037090275
}
],
"updated": 1622198926988
@@ -31,6 +31,11 @@
"language": "DE",
"text": "Sie befinden sich also endlich in einem Diagramm. Das erste, was Sie tun möchten, ist, sich zu bewegen und zu lernen, was diese Diagramme für Sie tun können.",
"updated": 1634216714226
},
{
"language": "TR",
"text": "Sonunda bir grafiğin içindesiniz. Yapmak isteyeceğiniz ilk şey, etrafta dolaşmak ve bu çizelgelerin sizin için neler yapabileceğini öğrenmek.",
"updated": 1636092060224
}
]
},
@@ -61,6 +66,11 @@
"language": "DE",
"text": "Fangen wir damit an! Wie im Designbereich - wenn Sie sich in einer Time Machine befinden - bewegen Sie sich mit Hilfe Ihrer Maus und Ihrer Tastatur. So geht's:",
"updated": 1634216711619
},
{
"language": "TR",
"text": "Bununla devam edelim! Tasarım alanında olduğu gibi, bir zaman makinesinin içindeykende farenizi ve klavyenizi kullanarak hareket edersiniz. Nasıl?",
"updated": 1636092104788
}
]
},
@@ -90,6 +100,11 @@
"language": "DE",
"text": "Mit der Maus klicken Sie mit der linken Maustaste und ziehen. Mit der Tastatur benutzt du die Pfeiltasten: ← → ↑ ↓",
"updated": 1634216728013
},
{
"language": "TR",
"text": "Fare ile sol tıklayın ve sürükleyin. Klavye ile ok tuşlarını kullanın: ← → ↑ ↓",
"updated": 1636092129919
}
]
},
@@ -119,6 +134,11 @@
"language": "DE",
"text": "Was? Es funktioniert nicht? Bleiben Sie mit einem eingefrorenen Diagramm hängen? Wie im Video im nächsten Schritt? Keine Sorge! Ich weiß, was hier los ist...",
"updated": 1634216736257
},
{
"language": "TR",
"text": "Ne? Çalışmıyor mu? Donmuş bir çizelgeye mi takıldınız? Bir sonraki adımdaki videodaki gibi mi? Merak etme! Neler olduğunu biliyorum...",
"updated": 1636092166517
}
]
}
@@ -21,6 +21,11 @@
"language": "DE",
"text": "In diesem Schritt wird ein Video im Vollbildmodus abgespielt.",
"updated": 1634216805054
},
{
"language": "TR",
"text": "Bu videoda ne olduğunu görebilirsin.",
"updated": 1636093306641
}
]
},
@@ -25,6 +25,11 @@
"language": "DE",
"text": "Der Grund, warum Sie sich nicht bewegen können, ist, dass die Skalen im automatischen Modus gesperrt sind, damit Sie die Daten nach Ihrer ersten Data-Mining-Operation leicht finden können.",
"updated": 1634216885238
},
{
"language": "TR",
"text": "Hareket edememenizin nedeni, ilk veri madenciliği işleminizden sonra verileri kolayca bulabilmeniz için skalanın otomatik modda kilitli olmasıdır.",
"updated": 1636093218029
}
]
},
@@ -49,6 +54,11 @@
"language": "DE",
"text": "Wenn Sie die Time Scale im automatischen Modus einstellen, wird der gesamte Zeitbereich der verfügbaren Daten in das Diagramm gezwungen.",
"updated": 1634216894224
},
{
"language": "TR",
"text": "Zaman Ölçeğini ( Time Scale ) otomatik modda ayarlamak, mevcut verilerin tümünün tarih-saat aralığında gösterilmesine zorlar.",
"updated": 1636093070726
}
]
},
@@ -72,6 +82,11 @@
"language": "DE",
"text": "Um zwischen den verschiedenen automatischen Modi und dem manuellen Modus hin- und herzuschalten, drücken Sie die Umschalttaste und bewegen Sie das Mausrad über dem Time Scale-Feld in einem Schritt. Alternativ können Sie auch den Mauszeiger auf das Skalenfeld setzen und die Pfeiltasten ↑ ↓ drücken.",
"updated": 1634216938054
},
{
"language": "TR",
"text": "Otomatik mod ve manuel mod arasında geçiş yapmak için Shift 'e basın ve farenizin tekerleği ile zaman ölçeği kutusunun üzerinde birkez döndürün. Alternatif olarak, fare işaretçisini ölçek kutusunun üzerine getirebilir ve yukarı ve aşağı ok tuşlarına ↑ ↓ basabilirsiniz.",
"updated": 1636093154603
}
],
"updated": 1622199287763
@@ -97,6 +112,11 @@
"language": "DE",
"text": "Sie sollten sich nun frei auf der X-Achse, das heißt der Zeitachse des Diagramms, bewegen können.",
"updated": 1634216981937
},
{
"language": "TR",
"text": "Artık X ekseninde , yani grafiğin zaman ekseninde serbestçe hareket edebilmeniz gerekir.",
"updated": 1636093193714
}
]
}
@@ -15,6 +15,11 @@
"language": "DE",
"text": "In diesem Schritt wird ein Video im Vollbildmodus abgespielt.",
"updated": 1634217018735
},
{
"language": "TR",
"text": "Zaman skalasının üzerine gelin ve fare tekerleğini birkez çevirin.",
"updated": 1636093721117
}
]
},
@@ -25,6 +25,11 @@
"language": "DE",
"text": "Haben Sie den Trick mit der Zeitskala aus dem vorherigen Video verstanden? Wenn nicht, gehen Sie zum vorherigen Schritt und schauen Sie aufmerksam zu!",
"updated": 1634217059331
},
{
"language": "TR",
"text": "Önceki videodan zamanı ölçeklendirmesini nasılçalıştığını anlayabildiniz mı? Eğer teredütünüz varsa önceki adıma gidin ve dikkatlice izleyin!",
"updated": 1636094066007
}
]
},
@@ -49,6 +54,11 @@
"language": "DE",
"text": "Wenn Sie das Mausrad über dem Zeitskalenfeld drehen, wird die Zeit verkleinert oder vergrößert! Alternativ können Sie mit der Maus auf das Skalenfeld zeigen und die seitlichen Pfeiltasten ← → drücken.",
"updated": 1634217078292
},
{
"language": "TR",
"text": "Farenin tekerleğini zaman ölçeği kutusunun üzerinde kaydırmak, zamanı küçültür ve genişletir! Alternatif olarak, fareyi ölçek kutusuna yönlendirebilir ve yan ok tuşlarına basabilirsiniz ← →",
"updated": 1636094091641
}
],
"updated": 1616495837967
@@ -73,6 +83,11 @@
"language": "DE",
"text": "Es gibt noch ein weiteres interessantes Detail aus dem vorherigen Video: Wenn die Zeitskala den automatischen Modus verlässt, verschwinden die beiden kleinen grünen Dreiecke, die das Ende der automatischen Skala anzeigen! Die Skala kann auf einer, keiner oder beiden Seiten automatisch eingestellt werden!",
"updated": 1634217088926
},
{
"language": "TR",
"text": "Önceki videoda dikkat çeken ilginç bir ayrıntı daha var: zaman ölçeği otomatik moddan çıktığında, otomatik ölçeğin her iki tafafını gösteren iki küçük yeşil üçgen kaybolur! ",
"updated": 1636094195564
}
],
"updated": 1616504911488
@@ -25,6 +25,11 @@
"language": "DE",
"text": "Muss ich Ihnen erklären, wie die Rate Scale funktioniert, oder können Sie es selbst herausfinden? Ok... Ich gebe Ihnen einen Tipp...",
"updated": 1634217173850
},
{
"language": "TR",
"text": "Size Fiyat Ölçeğinin nasıl çalıştığını söylememe gerek var mı yoksa kendi başınıza çözebilir misiniz? Tamam... Sana bir ipucu vereceğim...",
"updated": 1636094814213
}
]
},
@@ -49,6 +54,11 @@
"language": "DE",
"text": "Die Rate Scale funktioniert wie die Time Scale, aber -wenn du die Tastatur benutzt- musst du die Pfeiltasten umkehren! Mit den Pfeiltasten links und rechts ← → schaltest du zwischen den Automatikmodi um und mit den Pfeiltasten auf und ab ↑ ↓ kannst du die Skala beeinflussen! Schauen Sie sich das nächste Video an, um sich Klarheit zu verschaffen!",
"updated": 1634217218782
},
{
"language": "TR",
"text": "Fiyat ölçeği, zaman ölçeği gibi çalışır, ancak klavyeyi kullanırken ok tuşlarını tersini kullanmanız gerekir! Otomatik modlar arasında geçiş yapmak için sol ve sağ okları ← → ve ölçeği etkilemek için yukarı ve aşağı okları ↑ ↓ kullanın! Anlamak için bir sonraki videoyu kontrol edin!",
"updated": 1636094888142
}
],
"updated": 1616505192799
@@ -73,6 +83,11 @@
"language": "DE",
"text": "Spielen Sie auch mit den halbautomatischen Skalenmodi! Sie wissen schon, wenn ein einziges winziges Dreieck nach ein paar Bewegungen des Mausrads sichtbar bleibt.",
"updated": 1634217227774
},
{
"language": "TR",
"text": "Yarı otomatik ölçek modlarıyla da oynayın! Fare tekerleğinin birkaç hareketinin ardından tek bir küçük üçgen görünür kaldığında yarı otomatik moddasınızdır.",
"updated": 1636094932757
}
]
}
@@ -15,6 +15,11 @@
"language": "DE",
"text": "In diesem Schritt wird ein Video im Vollbildmodus abgespielt.",
"updated": 1634217315985
},
{
"language": "TR",
"text": "Bu adımda bir video izleyeceksiniz.",
"updated": 1636094992004
}
]
},
@@ -25,6 +25,11 @@
"language": "DE",
"text": "Kurzmeldung zur Time Frame Scale: Es gibt keinen automatischen Modus!",
"updated": 1634217396808
},
{
"language": "TR",
"text": "Zaman Çerçevesi Ölçeği ( Time Frame Scale ) hakkında flaş haber: otomatik mod yok!",
"updated": 1636095177127
}
]
},
@@ -49,6 +54,11 @@
"language": "DE",
"text": "Sie können mit dem Mausrad oder den Pfeiltasten ↑ ↓ — in absteigender Reihenfolge - durch alle verfügbaren Zeitrahmen schalten: 24, 12, 8, 6, 4, 3, 2 und 1 Stunde sowie 45, 40, 30, 20, 15, 10, 5, 4, 3, 2 und 1 Minute. ",
"updated": 1634217420841
},
{
"language": "TR",
"text": "Fare tekerleğini veya yukarı ve aşağı okları kullanarak mevcut tüm zaman dilimleri arasında geçiş yapabilirsiniz ↑ ↓ — Sırasıyla: 24, 12, 8, 6, 4, 3, 2 ve 1 saat ve 45, 40, 30, 20, 15, 10, 5, 4, 3, 2 ve 1 dakika.",
"updated": 1636095217975
}
],
"updated": 1616505407890
@@ -73,6 +83,11 @@
"language": "DE",
"text": "Wichtig: Seien Sie vorsichtig, wenn Sie die Time Frame Scale auf niedrigere Zeiträume umstellen! Wenn Sie die Zeitrahmen zu schnell und ohne Anpassung der Time Scale verringern, kann dies dazu führen, dass zu viele Informationen auf einmal auf dem Bildschirm dargestellt werden, was Ihren Computer verlangsamt. Wie viel Informationsdichte Ihre Hardware verarbeiten kann, hängt von ihrer CPU- und GPU-Leistung ab.",
"updated": 1634217436779
},
{
"language": "TR",
"text": "Zaman çerçevesi ölçeğini daha düşük zaman dilimlerine değiştirirken dikkatli olun! Zaman dilimlerini çok hızlı ve zaman ölçeğini ayarlamadan bırakmak, ekranda aynı anda çok fazla bilgi görüntülenmesine neden olarak bilgisayarınızı yavaşlatabilir. Donanımınızın ne kadar bilgi yoğunluğu kaldırabileceği CPU ve GPU performansına bağlıdır.",
"updated": 1636095244874
}
]
}
@@ -25,6 +25,11 @@
"language": "DE",
"text": "Zusammenfassung: Lassen wir die Skalen hinter uns und schauen wir uns an, wie das System Daten in den Diagrammen verfügbar macht.",
"updated": 1634217725509
},
{
"language": "TR",
"text": "Ölçekleri geride bırakarak, sistemin verileri grafiklerde nasıl kullanılabilir hale getirdiğine bir göz atalım.",
"updated": 1636096145748
}
]
},
@@ -49,6 +54,11 @@
"language": "DE",
"text": "Jedem Timeline Chart ist ein Layer Manager zugeordnet, der in Form eines Drop-Down-Menüs mit mehreren Layern dargestellt wird.",
"updated": 1634217734286
},
{
"language": "TR",
"text": "Her Zaman Çizelgesi ( Timeline Chart ) Grafiği, birden çok katmanı listeleyen bir açılır menü olarak temsil edilen ilişkili bir Katman Yöneticisine ( Layer Manager ) sahiptir.",
"updated": 1636096050983
}
]
},
@@ -72,6 +82,11 @@
"language": "DE",
"text": "Um einen Ebenenmanager zu öffnen, fahren Sie mit dem Mausrad über seine Kopfzeile. Verwenden Sie das Mausrad auch, um durch den Inhalt zu blättern!",
"updated": 1634217743759
},
{
"language": "TR",
"text": "Bir katman yöneticisi (sol üstteki siyah kutular) açmak için farenin tekerleğini başlığında kaydırın. İçeriğinde gezinmek için de farenin tekerleğini kullanın!",
"updated": 1636096113075
}
]
},
@@ -95,6 +110,11 @@
"language": "DE",
"text": "Zur Verdeutlichung sehen Sie sich das Video im nächsten Schritt an...",
"updated": 1634217753499
},
{
"language": "TR",
"text": "Netlik için bir sonraki adımdaki videoyu izleyin...",
"updated": 1636096131626
}
]
}
@@ -15,6 +15,11 @@
"language": "DE",
"text": "In diesem Schritt wird ein Video im Vollbildmodus abgespielt.",
"updated": 1634217814739
},
{
"language": "TR",
"text": "Katman yöneticlerine buradan ulaşabilir, genişletebilir ve daraltabilirsiniz.",
"updated": 1636096226759
}
]
},
@@ -26,6 +26,11 @@
"text": "Ihre Data-Mining-Operation umfasst Bots, die Datenprodukte erstellen. Jedes Produkt wird in den Diagrammen durch einen Layer in einem Layer Manager verfügbar gemacht.",
"updated": 1634217919050,
"style": "Definition"
},
{
"language": "TR",
"text": "Veri madenciliği operasyonunuz, veri ürünleri yapan botlara sahiptir. Her ürün, bir Katman Yöneticisindeki ( Layer Manager ) bir Katman ( Layer ) aracılığıyla çizelgelerde kullanılabilir hale getirilir.",
"updated": 1636096341967
}
],
"updated": 1616427338175
@@ -52,6 +57,11 @@
"text": "Der erste Layer-Manager auf der linken Seite dieser Time Machine besteht aus drei Layern. Diese Layer stellen die Datenprodukte dar, die das Handelssystem, das wir später testen werden, verwendet, um Handelsentscheidungen zu treffen.",
"updated": 1634217907919,
"style": "Text"
},
{
"language": "TR",
"text": "Bu zaman makinesinin solundaki ilk katman yöneticisi üç katmana sahiptir. Bu katmanlar, daha sonra test edeceğimiz Ticaret Sisteminin ( Trading System ) ticaret kararları vermek için kullandığı veri ürünlerini temsil eder.",
"updated": 1636096453476
}
]
},
@@ -75,6 +85,11 @@
"language": "DE",
"text": "Um Ebenen ein- und auszuschalten, klicken Sie mit der linken Maustaste auf sie!",
"updated": 1634221550537
},
{
"language": "TR",
"text": "Katmanları açmak ve kapatmak için üzerlerine mouse'un sol tuşuyla tıklayın!",
"updated": 1636096510159
}
]
},
@@ -100,6 +115,11 @@
"text": "Superalgos wird mit vielen weiteren Indikatoren ausgeliefert, die jedoch in diesem Workspace nicht konfiguriert sind. Sie werden sie später kennenlernen!",
"updated": 1634217927340,
"style": "Note"
},
{
"language": "TR",
"text": "Superalgos daha birçok göstergeyle birlikte gelir, ancak bunlar bu Çalışma Alanında yapılandırılmamıştır. Onları daha sonra öğreneceksiniz!",
"updated": 1636096525958
}
]
}
@@ -15,6 +15,11 @@
"language": "DE",
"text": "In diesem Schritt wird ein Video im Vollbildmodus abgespielt.",
"updated": 1634218041634
},
{
"language": "TR",
"text": "Bu video katman yöneticisi ve katanları öğrenmeniz içindir.",
"updated": 1636096574908
}
]
},
@@ -25,6 +25,11 @@
"language": "DE",
"text": "Ein Plotter Panel enthält nicht-grafische Darstellungen von Daten, meist in Form von numerischen Werten oder Text.",
"updated": 1634218122317
},
{
"language": "TR",
"text": "Bir Plotter Paneli, çoğunlukla sayısal değerler veya metin biçiminde verileri içerir.",
"updated": 1636096630769
}
]
},
@@ -49,6 +54,11 @@
"language": "DE",
"text": "Jede Ebene kann ein oder mehrere zugehörige Panels enthalten oder auch nicht. Es liegt im Ermessen des Entwicklers des entsprechenden Indicator Bot, ob er diese definiert oder nicht.",
"updated": 1634218128665
},
{
"language": "TR",
"text": "Her katman, bir veya daha fazla ilişkili panel içerebilir veya içermeyebilir. Bunları tanımlamak veya tanımlamamak ilgili Gösterge Botunun ( Indicator Bot ) geliştiricisine bağlıdır.",
"updated": 1636096681002
}
]
},
@@ -72,6 +82,11 @@
"language": "DE",
"text": "Um auf die Panels zuzugreifen, klicken Sie mit der linken Maustaste auf das Symbol des Plotter-Panels der gewünschten Ebene.",
"updated": 1634218135107
},
{
"language": "TR",
"text": "Panellere erişmek için, seçilen katmanın çizici paneli simgesine sol tıklayın.",
"updated": 1636096699582
}
]
},
@@ -95,6 +110,11 @@
"language": "DE",
"text": "Sie können Ebenen-Manager und Plotter-Panels verschieben, indem Sie mit der linken Maustaste auf ihre Überschriften klicken und sie in eine beliebige Ecke des Bildschirms ziehen.",
"updated": 1634218142345
},
{
"language": "TR",
"text": "Katman yöneticilerini ve çizici panellerini, başlıklarına sol tıklayarak ve ekranın herhangi bir köşesine sürükleyerek taşıyabilirsiniz.",
"updated": 1636096719299
}
]
}
@@ -15,6 +15,11 @@
"language": "DE",
"text": "In diesem Schritt wird ein Video im Vollbildmodus abgespielt.",
"updated": 1634218191658
},
{
"language": "TR",
"text": "Bu videoda Plotter'ın ne olduğunu ve kullanımını görüyorsun.",
"updated": 1636096787151
}
]
},
@@ -0,0 +1,321 @@
function newListSelector() {
const MODULE_NAME = 'List Selector'
let thisObject = {
isVisibleFunction: undefined,
visible: false,
imagePathOK: undefined,
imagePathNOT_OK: undefined,
rawRadius: undefined,
targetRadius: undefined,
currentRadius: undefined,
container: undefined,
payload: undefined,
deactivate: deactivate,
activate: activate,
physics: physics,
drawBackground: drawBackground,
drawForeground: drawForeground,
onMouseClick: onMouseClick,
raiseEventParentChanged: raiseEventParentChanged,
onMouseWheel: onMouseWheel,
getContainer: getContainer,
finalize: finalize,
initialize: initialize
}
thisObject.container = newContainer()
thisObject.container.initialize(MODULE_NAME)
thisObject.container.isClickeable = true
thisObject.container.isDraggeable = false
thisObject.container.isWheelable = true
thisObject.container.detectMouseOver = true
thisObject.container.frame.radius = 0
thisObject.container.frame.position.x = 0
thisObject.container.frame.position.y = 0
let optionsList = {}
let current
let icon
let propertyName
let lastSelected = 0
let SIZE_FACTOR = 1.0
let onMouseWheelEventSubscriptionId
let selfMouseClickEventSubscriptionId
let onMouseClickEventSubscriptionId
const SIZE = 36
const FONT_SIZE = 24
const VISIBLE_LABELS = 7
let selected = Math.ceil(VISIBLE_LABELS / 2) - 1
let wheelDeltaDirection
let wheelDeltaCounter = 0
return thisObject
function finalize() {
thisObject.container.eventHandler.stopListening(onMouseWheelEventSubscriptionId)
thisObject.container.eventHandler.stopListening(selfMouseClickEventSubscriptionId)
thisObject.container.eventHandler.stopListening(onMouseClickEventSubscriptionId)
thisObject.container.finalize()
thisObject.container = undefined
thisObject.payload = undefined
thisObject.isVisibleFunction = undefined
}
function initialize() {
icon = UI.projects.foundations.spaces.designSpace.getIconByProjectAndName( 'Governance', 'user-profile')
onMouseWheelEventSubscriptionId = thisObject.container.eventHandler.listenToEvent('onMouseWheel', onMouseWheel)
selfMouseClickEventSubscriptionId = thisObject.container.eventHandler.listenToEvent('onMouseClick', onMouseClick)
}
function deactivate() {
if (thisObject.payload === undefined) { return }
if (thisObject.visible === true) {
thisObject.visible = false
}
thisObject.payload.uiObject.container.eventHandler.stopListening(onMouseClickEventSubscriptionId)
EDITOR_ON_FOCUS = false
}
function raiseEventParentChanged() {
let event = {
selected: selected,
parent: current,
propertyName: propertyName
}
thisObject.container.eventHandler.raiseEvent('onParentChanged', event)
}
function activate(action, listValues, eventSubscriptionId) {
thisObject.visible = true
thisObject.payload = action.node.payload
thisObject.rawRadius = 8
thisObject.targetRadius = thisObject.container.frame.radius
thisObject.currentRadius = 0
thisObject.payload.uiObject.resetErrorMessage()
thisObject.payload.uiObject.uiObjectTitle.exitEditMode()
onMouseClickEventSubscriptionId = eventSubscriptionId
optionsList = listValues
EDITOR_ON_FOCUS = true
}
function onMouseWheel() {
if (IS_MAC && Math.abs(event.wheelDelta) < MAC_MOUSE_WHEEL_INFINITE_SCROLL_THRESHOLD) {
let sensitivity
if (event.delta < 0) {
if (event.shiftKey === true) {
sensitivity = MAC_SCROLL_SENSITIVITY
} else {
sensitivity = MAC_ZOOM_SENSITIVITY
}
if (wheelDeltaDirection === -1) {
wheelDeltaCounter++
if (wheelDeltaCounter < sensitivity) {
return
} else {
wheelDeltaCounter = 0
}
} else {
wheelDeltaCounter = 0
wheelDeltaDirection = -1
return
}
} else {
if (event.shiftKey === true) {
sensitivity = MAC_SCROLL_SENSITIVITY
} else {
sensitivity = MAC_ZOOM_SENSITIVITY
}
if (wheelDeltaDirection === 1) {
wheelDeltaCounter++
if (wheelDeltaCounter < sensitivity) {
return
} else {
wheelDeltaCounter = 0
}
} else {
wheelDeltaCounter = 0
wheelDeltaDirection = 1
return
}
}
event.delta = - event.delta
}
selected = selected - event.delta
if (selected < Math.ceil(VISIBLE_LABELS / 2)) { selected = Math.ceil(VISIBLE_LABELS / 2) - 1 }
if (selected > optionsList.length - Math.ceil(VISIBLE_LABELS / 2)) { selected = optionsList.length - Math.ceil(VISIBLE_LABELS / 2) }
if (selected !== lastSelected) {
lastSelected = selected
raiseEventParentChanged()
}
}
function onMouseClick(pPoint) {
let tableStartPosition = {
x: thisObject.container.frame.radius,
y: thisObject.container.frame.radius
}
tableStartPosition = thisObject.container.frame.frameThisPoint(tableStartPosition)
let offset = thisObject.container.frame.radius / ( 8 / 5 )
let listSquare = offset * 2
let rowHeight = listSquare / VISIBLE_LABELS
if (pPoint.x >= tableStartPosition.x - offset && pPoint.x <= tableStartPosition.x + offset) {
for (let i = 0; i < VISIBLE_LABELS; i++) {
let upperBoundary = (tableStartPosition.y - offset) + (i * rowHeight)
let lowerBoundary = (tableStartPosition.y - offset) + ((i + 1) * rowHeight)
if (pPoint.y >= upperBoundary && pPoint.y <= lowerBoundary) {
let clickedValue = (i - Math.floor(VISIBLE_LABELS / 2) + selected)
let event = {
point: pPoint,
parent: thisObject,
selectedNode: optionsList[clickedValue]
}
thisObject.payload.uiObject.container.eventHandler.raiseEvent('listSelectorClicked', event)
deactivate()
}
}
}
}
function getContainer(point) {
if (thisObject.visible === true) {
if (point.x === VERY_LARGE_NUMBER) {
/* The the mouse leaves the canvas, and event of mouse over with a ridiculous coordinate is triggered so that
anyone can react. In our case, the code editor has a text area that is not part of the canvas, so the event is
triggered. We compensate recognizing this coordinate and returning our container. */
return thisObject.container
}
if (thisObject.container.frame.isThisPointHere(point, true, false) === true) {
return thisObject.container
} else {
return undefined
}
}
}
function physics() {
if (Math.abs(thisObject.currentRadius - thisObject.targetRadius) >= 0.5) {
if (thisObject.currentRadius < thisObject.targetRadius) {
thisObject.currentRadius = thisObject.currentRadius + 0.5
} else {
thisObject.currentRadius = thisObject.currentRadius - 0.5
}
}
thisObject.container.frame.position.x = -thisObject.container.frame.radius
thisObject.container.frame.position.y = -thisObject.container.frame.radius
thisObject.container.frame.width = thisObject.container.frame.radius * 2 * SIZE_FACTOR
thisObject.container.frame.height = thisObject.container.frame.radius * 2 * SIZE_FACTOR
}
function drawBackground() {
if (thisObject.visible === true) {
let position = {
x: 0,
y: 0
}
position = thisObject.container.frame.frameThisPoint(position)
let radius = thisObject.container.frame.radius * SIZE_FACTOR
if (radius > 0.5) {
browserCanvasContext.beginPath()
browserCanvasContext.arc(position.x + thisObject.container.frame.radius, position.y + thisObject.container.frame.radius, radius + 3, 0, Math.PI * 2, true)
browserCanvasContext.closePath()
browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.WHITE + ', ' + 1 + ')'
browserCanvasContext.fill()
browserCanvasContext.beginPath()
browserCanvasContext.arc(position.x + thisObject.container.frame.radius, position.y + thisObject.container.frame.radius, radius , 0, Math.PI * 2, true)
browserCanvasContext.closePath()
browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.MIDNIGHT_GREEN + ', ' + 1 + ')'
browserCanvasContext.fill()
}
}
}
function drawForeground() {
if (thisObject.visible === true) {
let fontSize
let fontColor
let opacity
for (let i = 0; i < VISIBLE_LABELS; i++) {
let index = i - Math.floor(VISIBLE_LABELS / 2) + selected
let label = ''
if (index >= 0 && index < optionsList.length) {
label = optionsList[index]
}
fontColor = UI_COLOR.BLACK
fontSize = FONT_SIZE
opacity = 1
let offset = thisObject.container.frame.radius / ( 8 / 5 )
let listSquare = offset * 2
let rowOffset = listSquare * ( i / VISIBLE_LABELS )
let rowHeight = listSquare / VISIBLE_LABELS
let rowPosition = {
x: thisObject.container.frame.radius,
y: (thisObject.container.frame.radius - offset) + rowOffset + (rowHeight / 2)
}
rowPosition = thisObject.container.frame.frameThisPoint(rowPosition)
browserCanvasContext.beginPath()
browserCanvasContext.moveTo(rowPosition.x - offset, rowPosition.y - rowHeight / 2);
browserCanvasContext.lineTo(rowPosition.x + offset, rowPosition.y - rowHeight / 2);
browserCanvasContext.lineTo(rowPosition.x + offset, rowPosition.y + rowHeight / 2);
browserCanvasContext.lineTo(rowPosition.x - offset, rowPosition.y + rowHeight / 2);
browserCanvasContext.closePath()
browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.MIDNIGHT_GREEN + ', 1)';
browserCanvasContext.lineWidth = 3
browserCanvasContext.stroke()
if (index % 2) {
browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.OCEAN_GREEN + ', 0.2)';
} else {
browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.OCEAN_GREEN + ', 0.4)';
}
browserCanvasContext.fill();
let middleValue = Math.floor(VISIBLE_LABELS / 2)
UI.projects.foundations.utilities.drawPrint.drawIcon(icon, 1 / 2, 1 / 2, - offset + SIZE, (i - middleValue) * rowHeight, SIZE, thisObject.container)
UI.projects.foundations.utilities.drawPrint.drawLabel(label, 1 / 2, 1 / 2, 0, (SIZE - fontSize) / 2 + (i - middleValue) * rowHeight, fontSize, thisObject.container, fontColor, undefined, undefined, opacity)
}
}
}
}
@@ -18,6 +18,7 @@ function newUiObject() {
configEditor: undefined,
conditionEditor: undefined,
formulaEditor: undefined,
listSelector: undefined,
uiObjectTitle: undefined,
icon: undefined,
uiObjectMessage: undefined,
@@ -210,6 +211,11 @@ function newUiObject() {
thisObject.formulaEditor = undefined
}
if (thisObject.listSelector !== undefined) {
thisObject.listSelector.finalize()
thisObject.listSelector = undefined
}
icon = undefined
chainAttachToNode = undefined
referenceAttachToNode = undefined
@@ -309,6 +315,11 @@ function newUiObject() {
if (container !== undefined) { return container }
}
if (thisObject.listSelector !== undefined) {
container = thisObject.listSelector.getContainer(point)
if (container !== undefined) { return container }
}
let getitle = true
if (thisObject.codeEditor !== undefined) {
@@ -331,6 +342,11 @@ function newUiObject() {
getitle = false
}
}
if (thisObject.listSelector !== undefined) {
if (thisObject.listSelector.visible === true) {
getitle = false
}
}
if (getitle === true) {
container = thisObject.uiObjectTitle.getContainer(point)
@@ -381,6 +397,10 @@ function newUiObject() {
thisObject.formulaEditor.physics()
}
if (thisObject.listSelector !== undefined) {
thisObject.listSelector.physics()
}
if (thisObject.payload.chainParent === undefined || thisObject.payload.chainParent.payload === undefined) {
thisObject.payload.targetPosition.x = thisObject.payload.position.x,
thisObject.payload.targetPosition.y = thisObject.payload.position.y
@@ -1353,6 +1373,9 @@ function newUiObject() {
if (thisObject.formulaEditor !== undefined) {
thisObject.formulaEditor.deactivate()
}
if (thisObject.listSelector !== undefined) {
thisObject.listSelector.deactivate()
}
if (thisObject.payload !== undefined &&
thisObject.isOnFocus === false &&
@@ -1381,6 +1404,9 @@ function newUiObject() {
if (thisObject.formulaEditor !== undefined) {
thisObject.formulaEditor.deactivate()
}
if (thisObject.listSelector !== undefined) {
thisObject.listSelector.deactivate()
}
isDragging = true
if (event.button === 2) {
rightDragging = true
@@ -1468,6 +1494,10 @@ function newUiObject() {
thisObject.formulaEditor.drawBackground()
thisObject.formulaEditor.drawForeground()
}
if (thisObject.listSelector !== undefined) {
thisObject.listSelector.drawBackground()
thisObject.listSelector.drawForeground()
}
let drawMenu = true
let drawTitle = true
@@ -1496,6 +1526,12 @@ function newUiObject() {
drawTitle = false
}
}
if (thisObject.listSelector !== undefined) {
if (thisObject.listSelector.visible === true) {
drawMenu = false
drawTitle = false
}
}
if (drawMenu === true) {
drawBodyAndPicture()
@@ -1673,6 +1709,9 @@ function newUiObject() {
if (thisObject.formulaEditor !== undefined) {
if (thisObject.formulaEditor.visible === true) { return true }
}
if (thisObject.listSelector !== undefined) {
if (thisObject.listSelector.visible === true) { return true }
}
}
function drawNodeType() {
@@ -473,6 +473,12 @@ function newUiObjectConstructor() {
uiObject.formulaEditor.container.connectToParent(uiObject.container, false, false, true, true, false, false, false, false)
uiObject.formulaEditor.initialize()
}
if (schemaDocument.editors.list === true) {
uiObject.listSelector = newListSelector()
uiObject.listSelector.isVisibleFunction = uiObject.isVisibleFunction
uiObject.listSelector.container.connectToParent(uiObject.container, false, false, true, true, false, false, false, false)
uiObject.listSelector.initialize()
}
if (schemaDocument.editors.condition === true) {
uiObject.conditionEditor = newConditionEditor()
uiObject.conditionEditor.isVisibleFunction = uiObject.isVisibleFunction
@@ -127,12 +127,12 @@
"id": "f4d39b02-4324-438d-9f74-2bea2b7272ef",
"savedPayload": {
"position": {
"x": 4797.826086956522,
"y": 23340.192378864667
"x": 33783.333333333336,
"y": 18540.192378864667
},
"targetPosition": {
"x": 4647.826086956522,
"y": 23600
"x": 33633.333333333336,
"y": 18800
},
"floatingObject": {
"isPinned": false,
@@ -516,12 +516,12 @@
"id": "b6e3c87d-a11b-4b2a-b6a6-edc96375f5da",
"savedPayload": {
"position": {
"x": 4907.633708091854,
"y": 23450
"x": 33893.14095446867,
"y": 18650
},
"targetPosition": {
"x": 4647.826086956522,
"y": 23600
"x": 33633.333333333336,
"y": 18800
},
"floatingObject": {
"isPinned": false,
@@ -565,12 +565,12 @@
"id": "2571cea1-2b6d-40f5-9331-8786bf57c184",
"savedPayload": {
"position": {
"x": 5575.05716950933,
"y": 23082.57653858252
"x": 34560.56441588615,
"y": 18282.57653858252
},
"targetPosition": {
"x": 5497.411455978574,
"y": 23372.354286469243
"x": 34482.91870235539,
"y": 18572.354286469243
},
"floatingObject": {
"isPinned": false,
@@ -614,7 +614,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
"name": "Tentacule23 Project Contributor Smidy13 Tentacule23 Governance Project",
"name": "",
"config": "{}",
"project": "Governance",
"id": "ab341408-2073-46aa-9390-2396bdebf79b",
@@ -685,7 +685,7 @@
},
{
"type": "Position Claim Vote",
"name": "Tentacule23 1 Project Contributor Tentacle23 Visual Scripting Project",
"name": "",
"config": "{}",
"project": "Governance",
"id": "ac17837f-37f5-4c27-a1c4-c667afb5153c",
@@ -859,7 +859,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
"name": "NAmorim Team Creator Nuno Distribution Team",
"name": "",
"config": "{}",
"project": "Governance",
"id": "db023ba8-610f-44d8-a72d-62ea45610ef0",
@@ -930,7 +930,7 @@
},
{
"type": "Position Claim Vote",
"name": "NAmorim Team Member Superalgos Blog Team",
"name": "",
"config": "{}",
"project": "Governance",
"id": "d584524b-e869-4ab1-92cc-5778e98220e2",
@@ -1159,7 +1159,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
"name": "alexandrustefan Team Creator Alexandru Forum Team",
"name": "",
"config": "{}",
"project": "Governance",
"id": "122bea90-803d-4d2b-9af0-46197571b24d",
@@ -1300,7 +1300,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
"name": "alexandrustefan 3 Project Contributors Alexandru cozed-gh(Carl) Quantum8 PLuv Data Mining Project",
"name": "",
"config": "{}",
"project": "Governance",
"id": "bf243dfe-b8f5-4d74-83a1-c54ec50fe5b9",
@@ -1507,7 +1507,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
"name": "harrellbm Project Leader Harrell harrellbm Education Project",
"name": "",
"config": "{}",
"project": "Governance",
"id": "e481a337-45e6-4107-8c0b-14f9d5210fe6",
@@ -1666,7 +1666,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
"name": "harrellbm Team Creator Harrell harrellbm Docs Teams",
"name": "",
"config": "{}",
"project": "Governance",
"id": "610fcdec-93ef-4451-a037-f3d4249a2a9e",
@@ -1831,7 +1831,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
"name": "harrellbm Team Creator Harrell harrellbm Tutorials Team",
"name": "",
"config": "{}",
"project": "Governance",
"id": "3d923532-2d84-457e-875b-ed0ad9bcd2f6",
@@ -1996,7 +1996,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
"name": "harrellbm Team Creator Harrell harrellbm Translations Team",
"name": "",
"config": "{}",
"project": "Governance",
"id": "4320a3b2-a698-426c-af85-fdb9e7e772df",
@@ -2161,7 +2161,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
"name": "harrellbm Team Creator Harrell harrellbm Workspaces Team",
"name": "",
"config": "{}",
"project": "Governance",
"id": "faa321ab-73a1-434d-bbec-f6d648d0b7a9",
@@ -2396,7 +2396,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
"name": "harrellbm Team Creator Harrell harrellbm Setup Team",
"name": "",
"config": "{}",
"project": "Governance",
"id": "58fb3da1-002b-4574-8155-4949dc269b9b",
@@ -2549,7 +2549,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
"name": "harrellbm Team Member Superalgos Blog Team",
"name": "",
"config": "{}",
"project": "Governance",
"id": "333f1c9a-1d3f-43f6-95af-7f8bacc4fb28",
@@ -2784,7 +2784,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
"name": "ssplatt Project Leader Brett Ssplatt Social Bots Project",
"name": "",
"config": "{}",
"project": "Governance",
"id": "5d6f2c60-849d-4d5e-b697-a1cbe47dccc7",
@@ -3119,7 +3119,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
"name": "ssplatt Team Member Twitter Team",
"name": "",
"config": "{}",
"project": "Governance",
"id": "36950249-4ad4-4f09-9580-7988cb60f1a1",
@@ -3296,7 +3296,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
"name": "ssplatt Team Leader Brett Reddit Team",
"name": "",
"config": "{}",
"project": "Governance",
"id": "0228c2bf-557e-4512-87b9-36318e534b4c",
@@ -3555,7 +3555,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
"name": "ssplatt Team Creator Brett Brett Live Streaming and Videos Team",
"name": "",
"config": "{}",
"project": "Governance",
"id": "9ffbaebf-d903-4985-b009-4e8f854e9606",
@@ -3644,7 +3644,7 @@
},
{
"type": "Position Claim Vote",
"name": "ssplatt Team Leader Brett Live Streaming and Videos Team",
"name": "",
"config": "{}",
"project": "Governance",
"id": "12cf50a8-2f36-4068-a771-d8eb04a9270d",
@@ -3733,7 +3733,7 @@
},
{
"type": "Position Claim Vote",
"name": "ssplatt Team Member Brett Live Streaming and Videos Team",
"name": "",
"config": "{}",
"project": "Governance",
"id": "3ecebb3b-c21b-4141-baed-2ce0d03cf3b2",
@@ -4062,7 +4062,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
"name": "ssplatt Team Creator Brett Sys Admins Team",
"name": "",
"config": "{}",
"project": "Governance",
"id": "96e4d32a-4e19-489b-82b9-f55ae19e4c21",
@@ -4227,7 +4227,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
"name": "ssplatt Team Creator Brett Docker Team",
"name": "",
"config": "{}",
"project": "Governance",
"id": "816e142a-a1e1-4a6a-8520-5fd143448a5b",
@@ -4392,7 +4392,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
"name": "ssplatt Team Leader Brett Github Team",
"name": "",
"config": "{}",
"project": "Governance",
"id": "5f54dfe8-51af-4356-92a3-f6cb3de62736",
@@ -4691,7 +4691,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
"name": "Smidy13 Team Member Icons Team",
"name": "",
"config": "{}",
"project": "Governance",
"id": "9c58e925-9027-4e87-bb74-d48fb1bc6640",
@@ -4762,7 +4762,7 @@
},
{
"type": "Position Claim Vote",
"name": "Smidy13 Project Contributor Smidy13 Tentacule23 Governance Project",
"name": "",
"config": "{}",
"project": "Governance",
"id": "42afa59d-a9a1-4bac-8ff0-d005a97ee3a1",
@@ -4972,7 +4972,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
"name": "Raplh2502 Team Member Superalgos Blog Team",
"name": "",
"config": "{}",
"project": "Governance",
"id": "3fee7769-885c-47e3-b091-436499e09d3e",
@@ -5043,7 +5043,7 @@
},
{
"type": "Position Claim Vote",
"name": "Raplh2502 ",
"name": "",
"config": "{}",
"project": "Governance",
"id": "26d27773-1c71-4363-a6b2-446d3d4e7495",
@@ -5114,7 +5114,7 @@
},
{
"type": "Position Claim Vote",
"name": "Raplh2502 Project Leader Thomas-Raplh2502 Data Mining Project",
"name": "",
"config": "{}",
"project": "Governance",
"id": "5fee6b1e-3fe5-409b-806c-ecb1fa0cf7e2",
@@ -5185,7 +5185,7 @@
},
{
"type": "Position Claim Vote",
"name": "Raplh2502 1 Team Member Thomas-Raplh2502 Forum Team",
"name": "",
"config": "{}",
"project": "Governance",
"id": "1267b7f2-aed2-4d4f-a69e-29ca5ad50a9f",
@@ -5326,7 +5326,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
"name": "cozed-gh 3 Project Contributors Alexandru cozed-gh(Carl) Quantum8 PLuv Data Mining Project",
"name": "",
"config": "{}",
"project": "Governance",
"id": "758285b2-8324-41f0-907a-3c45ad86fada",
@@ -5462,7 +5462,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
"name": "PLuv 3 Project Contributors Alexandru cozed-gh(Carl) Quantum8 PLuv Data Mining Project",
"name": "",
"config": "{}",
"project": "Governance",
"id": "b30458ee-4426-42db-a066-20755146ba49",
@@ -5592,12 +5592,12 @@
"id": "75487f1d-1ec0-4431-8693-ce9653018e81",
"savedPayload": {
"position": {
"x": 5757.219077113906,
"y": 23222.354286469243
"x": 34742.72632349072,
"y": 18422.354286469243
},
"targetPosition": {
"x": 5497.411455978574,
"y": 23372.354286469243
"x": 34482.91870235539,
"y": 18572.354286469243
},
"floatingObject": {
"isPinned": false,
@@ -7689,12 +7689,12 @@
"id": "800e3388-1ea6-40ee-ace5-1811a3373e39",
"savedPayload": {
"position": {
"x": 5982.87542724873,
"y": 23222.608483056363
"x": 34968.38267362554,
"y": 18422.608483056363
},
"targetPosition": {
"x": 5787.189203865294,
"y": 23450
"x": 34772.69645024211,
"y": 18650
},
"floatingObject": {
"isPinned": false,
@@ -14945,12 +14945,12 @@
"id": "aa848510-1260-46ed-a855-6c0fb9dca9eb",
"savedPayload": {
"position": {
"x": 6062.157880626287,
"y": 23330.032392704077
"x": 35047.66512700311,
"y": 18530.032392704077
},
"targetPosition": {
"x": 5787.189203865294,
"y": 23450
"x": 34772.69645024211,
"y": 18650
},
"floatingObject": {
"isPinned": false,
@@ -15252,12 +15252,12 @@
"id": "12a12abf-c6f9-4a62-a21e-4442b2fbbada",
"savedPayload": {
"position": {
"x": 6086.979415301814,
"y": 23461.2173582829
"x": 35072.48666167863,
"y": 18661.2173582829
},
"targetPosition": {
"x": 5787.189203865294,
"y": 23450
"x": 34772.69645024211,
"y": 18650
},
"floatingObject": {
"isPinned": false,
@@ -15370,12 +15370,12 @@
"id": "f1ef36d6-3284-408b-9601-aa1bf4875c0a",
"savedPayload": {
"position": {
"x": 6052.423821916677,
"y": 23590.18058848192
"x": 35037.931068293496,
"y": 18790.18058848192
},
"targetPosition": {
"x": 5787.189203865294,
"y": 23450
"x": 34772.69645024211,
"y": 18650
},
"floatingObject": {
"isPinned": false,
@@ -15939,12 +15939,12 @@
"id": "4ece8c41-7a25-4514-9ff5-de3f609c7a00",
"savedPayload": {
"position": {
"x": 5965.335259537344,
"y": 23691.37933393
"x": 34950.84250591416,
"y": 18891.37933393
},
"targetPosition": {
"x": 5787.189203865294,
"y": 23450
"x": 34772.69645024211,
"y": 18650
},
"floatingObject": {
"isPinned": false,
@@ -16103,12 +16103,12 @@
"id": "37988155-ac7c-4eb2-937b-6d3b64842a3a",
"savedPayload": {
"position": {
"x": 5842.962686014169,
"y": 23744.769941969986
"x": 34828.46993239099,
"y": 18944.769941969986
},
"targetPosition": {
"x": 5787.189203865294,
"y": 23450
"x": 34772.69645024211,
"y": 18650
},
"floatingObject": {
"isPinned": false,
@@ -16162,12 +16162,12 @@
"id": "1d398124-3f36-40a1-8b3b-6c77ad489b92",
"savedPayload": {
"position": {
"x": 5787.189203865294,
"y": 23450
"x": 34772.69645024211,
"y": 18650
},
"targetPosition": {
"x": 5497.411455978574,
"y": 23372.354286469243
"x": 34482.91870235539,
"y": 18572.354286469243
},
"floatingObject": {
"isPinned": false,
@@ -16188,12 +16188,12 @@
"id": "2b8d3ce7-515c-44ad-8d80-3c2be6d7736f",
"savedPayload": {
"position": {
"x": 5497.411455978574,
"y": 23372.354286469243
"x": 34482.91870235539,
"y": 18572.354286469243
},
"targetPosition": {
"x": 5237.603834843242,
"y": 23522.354286469243
"x": 34223.11108122006,
"y": 18722.354286469243
},
"floatingObject": {
"isPinned": false,
@@ -16216,12 +16216,12 @@
"id": "e9c0e495-7985-4381-bf75-865d87289038",
"savedPayload": {
"position": {
"x": 5537.603834843242,
"y": 23522.354286469243
"x": 34523.11108122006,
"y": 18722.354286469243
},
"targetPosition": {
"x": 5237.603834843242,
"y": 23522.354286469243
"x": 34223.11108122006,
"y": 18722.354286469243
},
"floatingObject": {
"isPinned": false,
@@ -16239,12 +16239,12 @@
"id": "d5ed432e-78bf-432e-be3b-8649932f7a65",
"savedPayload": {
"position": {
"x": 5237.603834843242,
"y": 23522.354286469243
"x": 34223.11108122006,
"y": 18722.354286469243
},
"targetPosition": {
"x": 4947.826086956522,
"y": 23600
"x": 33933.333333333336,
"y": 18800
},
"floatingObject": {
"isPinned": false,
@@ -16400,12 +16400,12 @@
"id": "796dd30f-c90d-4b8d-a63d-89867347407b",
"savedPayload": {
"position": {
"x": 5237.603834843242,
"y": 23677.645713530757
"x": 34223.11108122006,
"y": 18877.645713530757
},
"targetPosition": {
"x": 4947.826086956522,
"y": 23600
"x": 33933.333333333336,
"y": 18800
},
"floatingObject": {
"isPinned": false,
@@ -16423,12 +16423,12 @@
"id": "bb390957-b8a2-4a8a-9fbf-963ea20f6eaf",
"savedPayload": {
"position": {
"x": 4947.826086956522,
"y": 23600
"x": 33933.333333333336,
"y": 18800
},
"targetPosition": {
"x": 4647.826086956522,
"y": 23600
"x": 33633.333333333336,
"y": 18800
},
"floatingObject": {
"isPinned": false,
@@ -16463,7 +16463,7 @@
"userDelegates": [
{
"type": "User Delegate",
"name": "Tentacule23",
"name": "",
"config": "{}",
"project": "Governance",
"id": "7afae430-9aae-4321-949c-0faf68b156f6",
@@ -16504,7 +16504,7 @@
},
{
"type": "User Delegate",
"name": "alexandrustefan",
"name": "",
"config": "{}",
"project": "Governance",
"id": "da1969ba-e1fc-40f6-a246-41b0102b8e22",
@@ -16545,7 +16545,7 @@
},
{
"type": "User Delegate",
"name": "NAmorim",
"name": "",
"config": "{\n \"percentage\": 50\n}",
"project": "Governance",
"id": "d8d3a46a-bcc6-4fdc-88e0-f9a37a5ebaef",
@@ -16617,7 +16617,7 @@
"userDelegates": [
{
"type": "User Delegate",
"name": "harrellbm",
"name": "",
"config": "{}",
"project": "Governance",
"id": "af0bdf1a-acf9-4621-ba01-8cbf7e1be56d",
@@ -16711,12 +16711,12 @@
"id": "4246052a-0eab-43a6-bdc4-d9a42a9bd694",
"savedPayload": {
"position": {
"x": 5167.441329227186,
"y": 23900
"x": 34152.948575604,
"y": 19100
},
"targetPosition": {
"x": 4907.633708091854,
"y": 23750
"x": 33893.14095446867,
"y": 18950
},
"floatingObject": {
"isPinned": false,
@@ -16734,12 +16734,12 @@
"id": "ed112539-01ea-4937-85cf-69612ee6115d",
"savedPayload": {
"position": {
"x": 4907.633708091854,
"y": 23750
"x": 33893.14095446867,
"y": 18950
},
"targetPosition": {
"x": 4647.826086956522,
"y": 23600
"x": 33633.333333333336,
"y": 18800
},
"floatingObject": {
"isPinned": false,
@@ -16929,12 +16929,12 @@
"id": "ba3bc469-3c94-444d-a5d0-8ed851aa3778",
"savedPayload": {
"position": {
"x": 4797.826086956522,
"y": 23859.807621135333
"x": 33783.333333333336,
"y": 19059.807621135333
},
"targetPosition": {
"x": 4647.826086956522,
"y": 23600
"x": 33633.333333333336,
"y": 18800
},
"floatingObject": {
"isPinned": false,
@@ -16952,12 +16952,12 @@
"id": "f8182a9c-f830-4ec1-a238-ac3a5efd69e6",
"savedPayload": {
"position": {
"x": 4647.826086956522,
"y": 23600
"x": 33633.333333333336,
"y": 18800
},
"targetPosition": {
"x": 4347.826086956522,
"y": 23600
"x": 33333.333333333336,
"y": 18800
},
"floatingObject": {
"isPinned": false,
@@ -16979,12 +16979,12 @@
"id": "9870ca2a-cefc-484b-b7fc-206d62782ebc",
"savedPayload": {
"position": {
"x": 4197.826086956522,
"y": 23859.807621135333
"x": 33183.333333333336,
"y": 19059.807621135333
},
"targetPosition": {
"x": 4347.826086956522,
"y": 23600
"x": 33333.333333333336,
"y": 18800
},
"floatingObject": {
"isPinned": false,
@@ -17007,22 +17007,22 @@
{
"type": "Signing Account",
"name": "New Signing Account",
"config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x4f5c0d007a1315fba2eabbab3c1fb4e3f2f457b3a64a263453b5a17a9f4978f6\",\n \"s\": \"0x6d92b391e9382ea649c7d88f1536e545554cf59b925fa23beb78e1695efd5b6e\",\n \"signature\": \"0x4f5c0d007a1315fba2eabbab3c1fb4e3f2f457b3a64a263453b5a17a9f4978f66d92b391e9382ea649c7d88f1536e545554cf59b925fa23beb78e1695efd5b6e1b\"\n }\n}",
"config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0xc321c45055b32456d938c214e00cbfb035efe8bda6fa20268be4683b3b89f64b\",\n \"s\": \"0x053be15689ecf8a29369814c9d6d6be0c1238497d56f6edb6be045d07df4dfea\",\n \"signature\": \"0xc321c45055b32456d938c214e00cbfb035efe8bda6fa20268be4683b3b89f64b053be15689ecf8a29369814c9d6d6be0c1238497d56f6edb6be045d07df4dfea1c\"\n }\n}",
"project": "Governance",
"signingAccountChild": {
"type": "Social Trading Desktop App",
"name": "Social Trading Desktop App # 1",
"config": "{\n \"codeName\": \"Social-Trading-Desktop-App-1\"\n}",
"project": "Governance",
"id": "33df9686-6aa8-4d0d-90b6-d86b9be4f97f",
"id": "012c74dd-1a61-4784-bc8a-e18555b4974e",
"savedPayload": {
"position": {
"x": 3666.8977890580672,
"y": 23418.508094196695
"x": 32588.466416509047,
"y": 18618.508094196695
},
"targetPosition": {
"x": 3964.33124747021,
"y": 23379.35023653068
"x": 32885.89987492119,
"y": 18579.35023653068
},
"floatingObject": {
"isPinned": false,
@@ -17037,15 +17037,15 @@
}
}
},
"id": "d1fa780c-673a-442d-af85-6f1e03179a0e",
"id": "3863ebb9-c69f-40b2-8bbd-eb8f2b60a49c",
"savedPayload": {
"position": {
"x": 3964.33124747021,
"y": 23379.35023653068
"x": 32885.89987492119,
"y": 18579.35023653068
},
"targetPosition": {
"x": 4261.764705882353,
"y": 23340.192378864667
"x": 33183.333333333336,
"y": 18540.192378864667
},
"floatingObject": {
"isPinned": false,
@@ -17063,22 +17063,22 @@
{
"type": "Signing Account",
"name": "New Signing Account",
"config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0xb6529251f39c0b1bd87bfb46e12bd266a27ac5217a932f07587a3a306367fc80\",\n \"s\": \"0x3bfd826e7bbc9b15e6a824e54284ce3f4a39d1d480091973953d0bf63c152f46\",\n \"signature\": \"0xb6529251f39c0b1bd87bfb46e12bd266a27ac5217a932f07587a3a306367fc803bfd826e7bbc9b15e6a824e54284ce3f4a39d1d480091973953d0bf63c152f461b\"\n }\n}",
"config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x4a48ecc069047c7e29af18652948ca7054c7e1bcf66b7bf657f82a7883631262\",\n \"s\": \"0x3cfef2f134a36a8879d64195e96fd2e22627c0363a05a1b4efb6101699b1a669\",\n \"signature\": \"0x4a48ecc069047c7e29af18652948ca7054c7e1bcf66b7bf657f82a78836312623cfef2f134a36a8879d64195e96fd2e22627c0363a05a1b4efb6101699b1a6691b\"\n }\n}",
"project": "Governance",
"signingAccountChild": {
"type": "Social Trading Mobile App",
"name": "Social Trading Mobile App # 1",
"config": "{\n \"codeName\": \"Social-Trading-Mobile-App-1\"\n}",
"project": "Governance",
"id": "da524b16-839a-40cd-b90f-4ed40e745594",
"id": "2d03d11f-b553-4b01-9291-9e13da15dd54",
"savedPayload": {
"position": {
"x": 3682.209210108912,
"y": 23184.900951803153
"x": 32603.777837559894,
"y": 18384.900951803153
},
"targetPosition": {
"x": 3971.9869579956326,
"y": 23262.54666533391
"x": 32893.555585446615,
"y": 18462.54666533391
},
"floatingObject": {
"isPinned": false,
@@ -17093,15 +17093,15 @@
}
}
},
"id": "d57afbcc-f711-4e92-9b5e-8fbf86c12acb",
"id": "c84e9e64-7527-4dec-ac58-93696e19a756",
"savedPayload": {
"position": {
"x": 3971.9869579956326,
"y": 23262.54666533391
"x": 32893.555585446615,
"y": 18462.54666533391
},
"targetPosition": {
"x": 4261.764705882353,
"y": 23340.192378864667
"x": 33183.333333333336,
"y": 18540.192378864667
},
"floatingObject": {
"isPinned": false,
@@ -17119,22 +17119,22 @@
{
"type": "Signing Account",
"name": "New Signing Account",
"config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0xd5cb851afd167250a1735e96c03e7e5a4ebe2829b3e45e545f9a6e53c56360a6\",\n \"s\": \"0x4dcf855cd4fe4d711e8d18fc95ec587343457d985b93bdc7560079f3a42a424c\",\n \"signature\": \"0xd5cb851afd167250a1735e96c03e7e5a4ebe2829b3e45e545f9a6e53c56360a64dcf855cd4fe4d711e8d18fc95ec587343457d985b93bdc7560079f3a42a424c1c\"\n }\n}",
"config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x3d3791843477eb85b7896ccbc55bfb41189c3fa67f5a098f40e2ddf9a2331ffa\",\n \"s\": \"0x09114da1c09e2d064fb07accf58310f2e13400ae564eb52e471d18d955ea9569\",\n \"signature\": \"0x3d3791843477eb85b7896ccbc55bfb41189c3fa67f5a098f40e2ddf9a2331ffa09114da1c09e2d064fb07accf58310f2e13400ae564eb52e471d18d955ea95691b\"\n }\n}",
"project": "Governance",
"signingAccountChild": {
"type": "Social Trading Server App",
"name": "Social Trading Server App # 1",
"config": "{\n \"codeName\": \"Social-Trading-Server-App-1\"\n}",
"project": "Governance",
"id": "0609495c-0248-4f9b-9006-02f0e02c76aa",
"id": "c3d218ee-119f-4bd9-9349-8a194844ecd9",
"savedPayload": {
"position": {
"x": 3785.752701707612,
"y": 22974.935521459432
"x": 32707.321329158593,
"y": 18174.935521459432
},
"targetPosition": {
"x": 4023.7587037949825,
"y": 23157.56395016205
"x": 32945.327331245964,
"y": 18357.56395016205
},
"floatingObject": {
"isPinned": false,
@@ -17149,15 +17149,15 @@
}
}
},
"id": "42cb9bd7-bfc6-47fe-98f5-f56670f53c5d",
"id": "75f17a55-bf33-4e69-b842-b424a6f517e8",
"savedPayload": {
"position": {
"x": 4023.7587037949825,
"y": 23157.56395016205
"x": 32945.327331245964,
"y": 18357.56395016205
},
"targetPosition": {
"x": 4261.764705882353,
"y": 23340.192378864667
"x": 33183.333333333336,
"y": 18540.192378864667
},
"floatingObject": {
"isPinned": false,
@@ -17175,22 +17175,22 @@
{
"type": "Signing Account",
"name": "New Signing Account",
"config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x171d95f1ff727916737828707fe408d656454598480c1c5793df392ba0be288c\",\n \"s\": \"0x7eb1242017caa74ff48251ea4a5d51345b31758f5054c961fd19199a9fb2eab7\",\n \"signature\": \"0x171d95f1ff727916737828707fe408d656454598480c1c5793df392ba0be288c7eb1242017caa74ff48251ea4a5d51345b31758f5054c961fd19199a9fb2eab71b\"\n }\n}",
"config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0x0098b881f17a46a940d6dbb11121217c29330ea1a357ad72ed921448539ceeab\",\n \"s\": \"0x28c9f7cf445ab86caaa01f86d4456f4bdf0a81757dc0a0c80351d481b7df5ad3\",\n \"signature\": \"0x0098b881f17a46a940d6dbb11121217c29330ea1a357ad72ed921448539ceeab28c9f7cf445ab86caaa01f86d4456f4bdf0a81757dc0a0c80351d481b7df5ad31c\"\n }\n}",
"project": "Governance",
"signingAccountChild": {
"type": "Algo Traders Platform",
"name": "Algo Traders Platform # 1",
"config": "{\n \"codeName\": \"Algo-Traders-Platform-1\"\n}",
"project": "Governance",
"id": "baa7d72c-b576-480f-b160-2cc46ce47815",
"id": "bcffb701-754d-4685-ad09-8bf3f09265d9",
"savedPayload": {
"position": {
"x": 3961.764705882353,
"y": 22820.577136594
"x": 32883.333333333336,
"y": 18020.577136594
},
"targetPosition": {
"x": 4111.764705882353,
"y": 23080.384757729335
"x": 33033.333333333336,
"y": 18280.384757729335
},
"floatingObject": {
"isPinned": false,
@@ -17205,15 +17205,15 @@
}
}
},
"id": "47f2db6d-7fe6-456d-aeb0-7128524aaa36",
"id": "377ee3ed-49e4-415d-87b3-946024f0a1ef",
"savedPayload": {
"position": {
"x": 4111.764705882353,
"y": 23080.384757729335
"x": 33033.333333333336,
"y": 18280.384757729335
},
"targetPosition": {
"x": 4261.764705882353,
"y": 23340.192378864667
"x": 33183.333333333336,
"y": 18540.192378864667
},
"floatingObject": {
"isPinned": false,
@@ -17231,22 +17231,22 @@
{
"type": "Signing Account",
"name": "New Signing Account",
"config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0x278999b03f16b7be639bf28e414bb6620f09504fbd5bfe2aa0283044036cdf0c\",\n \"s\": \"0x377237529c066739a79e545d300b911be9c525c0961f8f1edaa7df5e6322d65e\",\n \"signature\": \"0x278999b03f16b7be639bf28e414bb6620f09504fbd5bfe2aa0283044036cdf0c377237529c066739a79e545d300b911be9c525c0961f8f1edaa7df5e6322d65e1c\"\n }\n}",
"config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0xfd5dfc5b7d84dac898c43880c6234c041142dccc5bf6b57e7eb671497e0cafcf\",\n \"s\": \"0x0bc0cc01159b307fa6d5fa46dbd3a1e71e4fbeca349969177014e1e9d204f9f3\",\n \"signature\": \"0xfd5dfc5b7d84dac898c43880c6234c041142dccc5bf6b57e7eb671497e0cafcf0bc0cc01159b307fa6d5fa46dbd3a1e71e4fbeca349969177014e1e9d204f9f31b\"\n }\n}",
"project": "Governance",
"signingAccountChild": {
"type": "P2P Network Node",
"name": "P2P Network Node # 1",
"config": "{\n \"codeName\": \"P2P-Network-Node-1\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"18042\"\n}",
"project": "Governance",
"id": "7c917c18-f13f-41ca-a739-a440421c7bc4",
"id": "bb0f0417-9dfb-47a3-941f-dcfa82fbaea1",
"savedPayload": {
"position": {
"x": 4183.4489905503215,
"y": 22745.325462040382
"x": 33105.0176180013,
"y": 17945.325462040382
},
"targetPosition": {
"x": 4222.606848216337,
"y": 23042.758920452525
"x": 33144.17547566732,
"y": 18242.758920452525
},
"floatingObject": {
"isPinned": false,
@@ -17261,15 +17261,15 @@
}
}
},
"id": "2a499940-eb6f-4328-9f67-7c915b01b3db",
"id": "7c5f14f9-63c2-42fa-98ee-1d4a36590cf4",
"savedPayload": {
"position": {
"x": 4222.606848216337,
"y": 23042.758920452525
"x": 33144.17547566732,
"y": 18242.758920452525
},
"targetPosition": {
"x": 4261.764705882353,
"y": 23340.192378864667
"x": 33183.333333333336,
"y": 18540.192378864667
},
"floatingObject": {
"isPinned": false,
@@ -17287,22 +17287,22 @@
{
"type": "Signing Account",
"name": "New Signing Account",
"config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x901e04cbe4cfd2bdba2429349d74181b953e3c048a9260a9fc27389430de80e2\",\n \"s\": \"0x22f448e151aec1e5cc1c96177fd10e8fea47f3c7a2f001412348b379685728ea\",\n \"signature\": \"0x901e04cbe4cfd2bdba2429349d74181b953e3c048a9260a9fc27389430de80e222f448e151aec1e5cc1c96177fd10e8fea47f3c7a2f001412348b379685728ea1b\"\n }\n}",
"config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0xa4b34d7c9e7644f4fddf7aa2d969eb7dac3b8dbcc36c559b99fa93bc5ea3c6d3\",\n \"s\": \"0x7a5087de3f5470cb173d73949c05c00438bc16138f43c7aebbe2b80d7d45122b\",\n \"signature\": \"0xa4b34d7c9e7644f4fddf7aa2d969eb7dac3b8dbcc36c559b99fa93bc5ea3c6d37a5087de3f5470cb173d73949c05c00438bc16138f43c7aebbe2b80d7d45122b1c\"\n }\n}",
"project": "Governance",
"signingAccountChild": {
"type": "P2P Network Node",
"name": "P2P Network Node # 2",
"config": "{\n \"codeName\": \"P2P-Network-Node-2\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"18042\"\n}",
"config": "{\n \"codeName\": \"P2P-Network-Node-2\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"18043\"\n}",
"project": "Governance",
"id": "b7b14ba1-da1a-4f8b-8fd0-0929bfb9afdf",
"id": "76fa8a24-9ab4-4eaf-82f2-458ba557b204",
"savedPayload": {
"position": {
"x": 4417.056132943866,
"y": 22760.636883091225
"x": 33338.62476039485,
"y": 17960.636883091225
},
"targetPosition": {
"x": 4339.41041941311,
"y": 23050.414630977946
"x": 33260.97904686409,
"y": 18250.414630977946
},
"floatingObject": {
"isPinned": false,
@@ -17317,15 +17317,15 @@
}
}
},
"id": "93fcdc33-1f94-4a07-8838-50205e305a21",
"id": "48544424-5b62-417b-897d-9164b26fcd56",
"savedPayload": {
"position": {
"x": 4339.41041941311,
"y": 23050.414630977946
"x": 33260.97904686409,
"y": 18250.414630977946
},
"targetPosition": {
"x": 4261.764705882353,
"y": 23340.192378864667
"x": 33183.333333333336,
"y": 18540.192378864667
},
"floatingObject": {
"isPinned": false,
@@ -17343,22 +17343,22 @@
{
"type": "Signing Account",
"name": "New Signing Account",
"config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0xc938ab3cadd77fdca413d882b04f0171a46dac0c0e55c72f3c7a84a9552d94ed\",\n \"s\": \"0x1d42a148e5c1380395e79ec66649515b4220baff0d662bbaebbba90e3b71142f\",\n \"signature\": \"0xc938ab3cadd77fdca413d882b04f0171a46dac0c0e55c72f3c7a84a9552d94ed1d42a148e5c1380395e79ec66649515b4220baff0d662bbaebbba90e3b71142f1c\"\n }\n}",
"config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0x700e273467c374fda2062fbaf42fadfd74a0c3995498f75ffd1a66c7376e7c60\",\n \"s\": \"0x3531a0c135fcdd578b5069799b3fc246c9cf1cee325a258f6d2960d20f2a98e6\",\n \"signature\": \"0x700e273467c374fda2062fbaf42fadfd74a0c3995498f75ffd1a66c7376e7c603531a0c135fcdd578b5069799b3fc246c9cf1cee325a258f6d2960d20f2a98e61c\"\n }\n}",
"project": "Governance",
"signingAccountChild": {
"type": "P2P Network Node",
"name": "P2P Network Node # 3",
"config": "{\n \"codeName\": \"P2P-Network-Node-3\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"18042\"\n}",
"config": "{\n \"codeName\": \"P2P-Network-Node-3\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"18044\"\n}",
"project": "Governance",
"id": "47a35fc3-5968-494b-89db-dcbc53d993ea",
"id": "297e57c2-3c1a-4170-b710-d2705804205b",
"savedPayload": {
"position": {
"x": 4627.021563287586,
"y": 22864.180374689924
"x": 33548.59019073856,
"y": 18064.180374689924
},
"targetPosition": {
"x": 4444.39313458497,
"y": 23102.186376777296
"x": 33365.96176203595,
"y": 18302.186376777296
},
"floatingObject": {
"isPinned": false,
@@ -17373,15 +17373,15 @@
}
}
},
"id": "5322bfda-90ae-4f5d-9bd1-3cf2ba67b854",
"id": "b39e1c4d-4170-4134-ae85-fc9fa7f3eb47",
"savedPayload": {
"position": {
"x": 4444.39313458497,
"y": 23102.186376777296
"x": 33365.96176203595,
"y": 18302.186376777296
},
"targetPosition": {
"x": 4261.764705882353,
"y": 23340.192378864667
"x": 33183.333333333336,
"y": 18540.192378864667
},
"floatingObject": {
"isPinned": false,
@@ -17397,20 +17397,20 @@
}
}
],
"id": "1aae1fa4-e5cf-48de-a25e-20001523da70",
"id": "ecf6aa0a-bf05-48e4-a7ee-7a714fbdbce2",
"savedPayload": {
"position": {
"x": 4197.826086956522,
"y": 23340.192378864667
"x": 33183.333333333336,
"y": 18540.192378864667
},
"targetPosition": {
"x": 4347.826086956522,
"y": 23600
"x": 33333.333333333336,
"y": 18800
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": true,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
@@ -17423,17 +17423,17 @@
"id": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
"savedPayload": {
"position": {
"x": 4347.826086956522,
"y": 23600
"x": 33333.333333333336,
"y": 18800
},
"targetPosition": {
"x": 4347.826086956522,
"y": 23600
"x": 33333.333333333336,
"y": 18800
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": true,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
@@ -0,0 +1,619 @@
{
"type": "User Profile",
"name": "NicN11",
"config": "{\n \"signature\": {\n \"message\": \"NicN11\",\n \"messageHash\": \"0xbe81c46b57813a4af2ef951d99fd2ffdd6ab837969858823e9b6a435c47a2b80\",\n \"v\": \"0x1c\",\n \"r\": \"0xacb71eb8660969cd5780e643dd2cb7ad487f02310cf74c0d846458fa50db08ad\",\n \"s\": \"0x48bc5b861a9cf201b71783c6e733b79e891ae7ddccab517ce847b0bb6dba1ff7\",\n \"signature\": \"0xacb71eb8660969cd5780e643dd2cb7ad487f02310cf74c0d846458fa50db08ad48bc5b861a9cf201b71783c6e733b79e891ae7ddccab517ce847b0bb6dba1ff71c\"\n }\n}",
"project": "Governance",
"tokenPowerSwitch": {
"type": "Token Power Switch",
"name": "New Token Power Switch",
"config": "{}",
"project": "Governance",
"tokenPowerSwitch": [],
"onboardingPrograms": {
"type": "Onboarding Programs",
"name": "New Onboarding Programs",
"config": "{\n \"percentage\": 0\n }",
"project": "Governance",
"airdropProgram": {
"type": "Airdrop Program",
"name": "New Airdrop Program",
"config": "{}",
"project": "Governance",
"tokensAwarded": {
"type": "Tokens Awarded",
"name": "New Tokens Awarded",
"project": "Governance",
"id": "f4759d7d-623b-473f-a13c-816c12da6cab",
"savedPayload": {
"position": {
"x": 13849.000000000002,
"y": 4980.635444127544
},
"targetPosition": {
"x": 13999.000000000002,
"y": 5240.443065262876
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"id": "1ec894c7-711b-4403-b2c0-8484f1409908",
"savedPayload": {
"position": {
"x": 13999.000000000002,
"y": 5240.443065262876
},
"targetPosition": {
"x": 14149.000000000002,
"y": 5500.250686398208
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"githubProgram": {
"type": "Github Program",
"name": "New Github Program",
"config": "{}",
"project": "Governance",
"tokensAwarded": {
"type": "Tokens Awarded",
"name": "New Tokens Awarded",
"project": "Governance",
"id": "e47b6ce4-d49e-40ad-8f90-c030c66b4fae",
"savedPayload": {
"position": {
"x": 14749.000000000002,
"y": 5500.250686398208
},
"targetPosition": {
"x": 14449.000000000002,
"y": 5500.250686398208
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"id": "9faf08f2-9e5b-43d9-a4f0-f6fd75e8fd23",
"savedPayload": {
"position": {
"x": 14449.000000000002,
"y": 5500.250686398208
},
"targetPosition": {
"x": 14149.000000000002,
"y": 5500.250686398208
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"id": "6824ec14-68ad-40c6-90b3-d29d0f5a9d17",
"savedPayload": {
"position": {
"x": 14149.000000000002,
"y": 5500.250686398208
},
"targetPosition": {
"x": 13999.000000000002,
"y": 5760.05830753354
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"communityBuildingPrograms": {
"type": "Community Building Programs",
"name": "New Community Building Programs",
"config": "{\n \"percentage\": 100\n }",
"project": "Governance",
"referralProgram": {
"type": "Referral Program",
"name": "New Referral Program",
"config": "{}",
"project": "Governance",
"userReferrers": [
{
"type": "User Referrer",
"name": "Julian-Molina",
"config": "{}",
"project": "Governance",
"id": "3ef87fef-4090-4a05-95bf-4e7f0a75df5e",
"savedPayload": {
"position": {
"x": 14258.807621135333,
"y": 5610.05830753354
},
"targetPosition": {
"x": 14408.807621135333,
"y": 5869.865928668872
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
},
"referenceParent": {
"type": "User Profile",
"name": "Julian-Molina",
"id": "b85aaac1-0708-4aec-97f9-bc3cc70e530a"
},
"referenceParentCombinedNodePath": [
[
"Julian-Molina",
"User Profile"
]
]
}
}
],
"tokensAwarded": {
"type": "Tokens Awarded",
"name": "New Tokens Awarded",
"project": "Governance",
"id": "6e420922-482e-4e86-be7e-ca5ea9766b2e",
"savedPayload": {
"position": {
"x": 14668.615242270664,
"y": 5719.865928668872
},
"targetPosition": {
"x": 14408.807621135333,
"y": 5869.865928668872
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"tokensBonus": {
"type": "Tokens Bonus",
"name": "New Tokens Bonus",
"project": "Governance",
"id": "8e2bf5f7-8028-4ca5-97ac-c781d84703d2",
"savedPayload": {
"position": {
"x": 14558.807621135333,
"y": 6129.6735498042035
},
"targetPosition": {
"x": 14408.807621135333,
"y": 5869.865928668872
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"id": "b325c52b-f905-439d-b0b9-ea3077c9723e",
"savedPayload": {
"position": {
"x": 14408.807621135333,
"y": 5869.865928668872
},
"targetPosition": {
"x": 14149.000000000002,
"y": 6019.865928668872
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": true,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"supportProgram": {
"type": "Support Program",
"name": "New Support Program",
"config": "{}",
"project": "Governance",
"userSupporters": [
{
"type": "User Supporter",
"name": "superharoun",
"config": "{}",
"project": "Governance",
"id": "ba86447f-73c2-4c79-a436-75db25aec088",
"savedPayload": {
"position": {
"x": 14558.807621135333,
"y": 6129.6735498042035
},
"targetPosition": {
"x": 14299.000000000002,
"y": 6279.6735498042035
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
},
"referenceParent": {
"type": "User Profile",
"name": "superharoun",
"id": "47c64eac-831d-4277-b9ce-4bd3d7e803c1"
},
"referenceParentCombinedNodePath": [
[
"superharoun",
"User Profile"
]
]
}
}
],
"tokensAwarded": {
"type": "Tokens Awarded",
"name": "New Tokens Awarded",
"project": "Governance",
"id": "4751c55b-18ef-42d9-bff4-d2b431b3d6f4",
"savedPayload": {
"position": {
"x": 14449.000000000002,
"y": 6539.481170939535
},
"targetPosition": {
"x": 14299.000000000002,
"y": 6279.6735498042035
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"tokensBonus": {
"type": "Tokens Bonus",
"name": "New Tokens Bonus",
"project": "Governance",
"id": "e77dcdd8-f3e0-48dd-8a98-58123ca82956",
"savedPayload": {
"position": {
"x": 14039.19237886467,
"y": 6429.6735498042035
},
"targetPosition": {
"x": 14299.000000000002,
"y": 6279.6735498042035
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"id": "1d566e0c-97f7-4f13-bf42-a443ed4c6d5b",
"savedPayload": {
"position": {
"x": 14299.000000000002,
"y": 6279.6735498042035
},
"targetPosition": {
"x": 14149.000000000002,
"y": 6019.865928668872
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": true,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"mentorshipProgram": {
"type": "Mentorship Program",
"name": "New Mentorship Program",
"config": "{}",
"project": "Governance",
"userMentors": [
{
"type": "User Mentor",
"name": "PLuv",
"config": "{}",
"project": "Governance",
"id": "9aea636c-0631-4503-a672-5d3dbed2b72f",
"savedPayload": {
"position": {
"x": 14039.19237886467,
"y": 6429.6735498042035
},
"targetPosition": {
"x": 13889.19237886467,
"y": 6169.865928668872
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
},
"referenceParent": {
"type": "User Profile",
"name": "PLuv",
"id": "142f5de2-3762-4f55-a839-22eac5c03c8f"
},
"referenceParentCombinedNodePath": [
[
"PLuv",
"User Profile"
]
]
}
}
],
"tokensAwarded": {
"type": "Tokens Awarded",
"name": "New Tokens Awarded",
"project": "Governance",
"id": "9cbfca12-3709-4142-bf8a-60d84eed4cb0",
"savedPayload": {
"position": {
"x": 13629.38475772934,
"y": 6319.865928668872
},
"targetPosition": {
"x": 13889.19237886467,
"y": 6169.865928668872
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"tokensBonus": {
"type": "Tokens Bonus",
"name": "New Tokens Bonus",
"project": "Governance",
"id": "6ab334c1-a43a-43a5-afb4-020ebb8d0440",
"savedPayload": {
"position": {
"x": 13739.19237886467,
"y": 5910.05830753354
},
"targetPosition": {
"x": 13889.19237886467,
"y": 6169.865928668872
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"id": "69f4697d-30b2-4ee5-b249-231861808465",
"savedPayload": {
"position": {
"x": 13889.19237886467,
"y": 6169.865928668872
},
"targetPosition": {
"x": 14149.000000000002,
"y": 6019.865928668872
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": true,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"id": "b728c0b7-7c85-4231-9aef-85d9935a31f0",
"savedPayload": {
"position": {
"x": 14149.000000000002,
"y": 6019.865928668872
},
"targetPosition": {
"x": 13999.000000000002,
"y": 5760.05830753354
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": true,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"id": "61c1d6e1-6a04-44ed-9ffd-eec1c0c05627",
"savedPayload": {
"position": {
"x": 13999.000000000002,
"y": 5760.05830753354
},
"targetPosition": {
"x": 13699.000000000002,
"y": 5760.05830753354
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"tokensMined": {
"type": "Tokens Mined",
"name": "New Tokens Mined",
"project": "Governance",
"id": "05c466c2-ab8f-4186-94d7-1e35d5755e71",
"savedPayload": {
"position": {
"x": 13399.000000000002,
"y": 5760.05830753354
},
"targetPosition": {
"x": 13699.000000000002,
"y": 5760.05830753354
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"id": "a884f5c0-2ffb-4a31-8edc-349430071fbe",
"savedPayload": {
"position": {
"x": 48529.647058823524,
"y": 38002
},
"targetPosition": {
"x": 48529.647058823524,
"y": 38002
},
"floatingObject": {
"isPinned": true,
"isFrozen": false,
"isCollapsed": true,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
}
@@ -68,6 +68,11 @@ function newGovernanceActionSwitch() {
UI.projects.governance.functionLibraries.pluginsFunctions.addMissingPluginUserProfiles(action.node, action.rootNodes)
}
break
case 'Add Specified User Profile':
{
UI.projects.governance.functionLibraries.pluginsFunctions.addSpecifiedUserProfile(action.node, action.rootNodes)
}
break
case 'Add Missing Plugin Pools':
{
UI.projects.governance.functionLibraries.pluginsFunctions.addMissingPluginPools(action.node, action.rootNodes)
@@ -1,6 +1,7 @@
function newGovernanceFunctionLibraryPluginsFunctions() {
let thisObject = {
addMissingPluginUserProfiles: addMissingPluginUserProfiles,
addSpecifiedUserProfile: addSpecifiedUserProfile,
addMissingPluginPools: addMissingPluginPools,
addMissingPluginAssets: addMissingPluginAssets,
addMissingPluginFeatures: addMissingPluginFeatures,
@@ -27,6 +28,35 @@ function newGovernanceFunctionLibraryPluginsFunctions() {
}
}
function addSpecifiedUserProfile(node, rootNodes) {
let action = { node: node}
let projectName = UI.projects.communityPlugins.utilities.plugins.getProjectName(node)
if (projectName === "" || projectName === undefined) {
if (node.payload.parentNode !== undefined) {
node.payload.parentNode.payload.uiObject.setErrorMessage(
"Config codeName must have the name of the project.",
UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
)
return
}
}
UI.projects.communityPlugins.utilities.plugins.getPluginFileNames(projectName, 'User-Profiles', onNamesArrived)
function onNamesArrived(fileNames) {
let eventSubscriptionId = node.payload.uiObject.container.eventHandler.listenToEvent('listSelectorClicked', onListSelect)
node.payload.uiObject.listSelector.activate(action, fileNames, eventSubscriptionId)
function onListSelect(event) {
let selectedArray = []
selectedArray.push(event.selectedNode)
UI.projects.communityPlugins.utilities.plugins.addMissingPluginFiles(node, selectedArray, 'User-Profiles', 'User Profile', 'Governance')
node.payload.uiObject.container.eventHandler.stopListening('listSelectorClicked')
}
}
}
function addMissingPluginPools(node, rootNodes) {
let projectName = UI.projects.communityPlugins.utilities.plugins.getProjectName(node)
if (projectName === "" || projectName === undefined) {
@@ -330,6 +330,7 @@ function newGovernanceFunctionLibraryProfileConstructor() {
}
let secret = {
signingAccountChildId: signingAccountChild.id,
signingAccountChildName: signingAccountChild.name,
signingAccountChildType: targetNodeType,
signingAccountChildCodeName: codeName,
@@ -304,7 +304,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock
/*
The signature gives us the blockchain account, and the account the user profile.
*/
let witnessUserProfile = SA.projects.network.globals.memory.maps.USER_PROFILES_BY_BLOCHAIN_ACCOUNT.get(caller.blockchainAccount)
let witnessUserProfile = SA.projects.network.globals.memory.maps.USER_PROFILES_BY_BLOKCHAIN_ACCOUNT.get(caller.blockchainAccount)
if (witnessUserProfile === undefined) {
let response = {
+2 -1
View File
@@ -6,9 +6,10 @@ exports.newNetworkGlobalsMemory = function () {
maps: {
USER_PROFILES_BY_ID: new Map(), // Here we will store the user profiles by User Profile Id.
USER_PROFILES_BY_HANDLE: new Map(), // Here we will store the user profiles by User Profile Handle.
USER_PROFILES_BY_BLOCHAIN_ACCOUNT: new Map() // Here we will store the user profiles by Blockchain Account.
USER_PROFILES_BY_BLOKCHAIN_ACCOUNT: new Map() // Here we will store the user profiles by Blockchain Account.
},
arrays: {
P2P_NETWORK_NODES: [] // Here we will store the p2p nodes deined under Signing Account node types.
}
}
+52
View File
@@ -0,0 +1,52 @@
exports.newNetworkModulesP2PNetwork = function newNetworkModulesP2PNetwork() {
/*
This module represents the P2P Network and it is needed to enable the connection
of this current node to other peers.
*/
let thisObject = {
joinTheNetworkAsNetworkPeer: joinTheNetworkAsNetworkPeer,
p2pNodesToConnect: undefined,
/* Framework Functions */
initialize: initialize,
finalize: finalize
}
return thisObject
function finalize() {
thisObject.p2pNodesToConnect = undefined
}
async function initialize(callerRole) {
switch (callerRole) {
case 'Network Client': {
thisObject.p2pNodesToConnect = []
for (let i = 0; i < SA.projects.network.globals.memory.arrays.P2P_NETWORK_NODES.length; i++) {
let p2pNetworkNode = SA.projects.network.globals.memory.arrays.P2P_NETWORK_NODES[i]
thisObject.p2pNodesToConnect.push(p2pNetworkNode)
}
break
}
case 'Network Peer': {
thisObject.p2pNodesToConnect = []
let thisP2PNodeId = SA.secrets.map.get(global.env.P2P_NETWORK_NODE_SIGNING_ACCOUNT).signingAccountChildId
for (let i = 0; i < SA.projects.network.globals.memory.arrays.P2P_NETWORK_NODES.length; i++) {
let p2pNetworkNode = SA.projects.network.globals.memory.arrays.P2P_NETWORK_NODES[i]
if (thisP2PNodeId !== p2pNetworkNode.node.id) {
thisObject.p2pNodesToConnect.push(p2pNetworkNode)
}
}
break
}
}
}
function joinTheNetworkAsNetworkPeer() {
/*
To join the network we will need to thorugh the list of Network Nodes and pick one to connect to.
*/
}
}
@@ -0,0 +1,32 @@
exports.newNetworkModulesP2PNetworkNode = function newNetworkModulesP2PNetworkNode() {
/*
This module represents the P2P Network Node.
*/
let thisObject = {
node: undefined,
blockchainAccount: undefined,
userProfile: undefined,
/* Framework Functions */
initialize: initialize,
finalize: finalize
}
return thisObject
function finalize() {
thisObject.node = undefined
thisObject.blockchainAccount = undefined
thisObject.userProfile = undefined
}
async function initialize(node, userProfile, blockchainAccount) {
/*
We will setup here the maps and arryas we will need to operate within the P2P Network.
*/
thisObject.node = node
thisObject.userProfile = userProfile
thisObject.blockchainAccount = blockchainAccount
}
}
+27 -2
View File
@@ -53,7 +53,7 @@ exports.newNetworkModulesUserProfiles = function newNetworkModulesUserProfiles()
SA.projects.network.globals.memory.maps.USER_PROFILES_BY_ID.set(userProfileId, userProfile)
SA.projects.network.globals.memory.maps.USER_PROFILES_BY_HANDLE.set(userHandle, userProfile)
SA.projects.network.globals.memory.maps.USER_PROFILES_BY_BLOCHAIN_ACCOUNT.set(blockchainAccount, userProfile)
SA.projects.network.globals.memory.maps.USER_PROFILES_BY_BLOKCHAIN_ACCOUNT.set(blockchainAccount, userProfile)
/*
Each User Profile might have Signing Accounts, meaning
accounts that can be signed on behalf of the User Profile.
@@ -65,7 +65,32 @@ exports.newNetworkModulesUserProfiles = function newNetworkModulesUserProfiles()
let signatureObject = config.signature
let web3 = new SA.nodeModules.web3()
let blockchainAccount = web3.eth.accounts.recover(signatureObject)
SA.projects.network.globals.memory.maps.USER_PROFILES_BY_BLOCHAIN_ACCOUNT.set(blockchainAccount, userProfile)
SA.projects.network.globals.memory.maps.USER_PROFILES_BY_BLOKCHAIN_ACCOUNT.set(blockchainAccount, userProfile)
/*
If the Signing Account is for a P2P node, we will add the node to the array of available nodes at the p2p network.
*/
if (
signingAccount.signingAccountChild.type === "P2P Network Node" &&
signingAccount.signingAccountChild.config !== undefined
) {
let config
try {
config = JSON.parse(signingAccount.signingAccountChild.config)
} catch (err) {
console.log('P2P Network Node Config not in JSON format. userProfileHandle = ' + userHandle + ' NodeId = ' + signingAccount.signingAccountChild.id)
continue
}
if (config.host === undefined) {
continue
}
if (config.webSocketsPort === undefined) {
continue
}
let p2pNetworkNode = SA.projects.network.modules.p2pNetworkNode.newNetworkModulesP2PNetworkNode()
p2pNetworkNode.initialize(signingAccount.signingAccountChild, userProfile, blockchainAccount)
SA.projects.network.globals.memory.arrays.P2P_NETWORK_NODES.push(p2pNetworkNode)
}
}
}
}
@@ -1,269 +0,0 @@
exports.newNetworkModulesWebSocketsAppClient = function newNetworkModulesWebSocketsAppClient() {
let thisObject = {
sendMessage: sendMessage,
initialize: initialize,
finalize: finalize
}
let socketClient
let web3
let called = {}
let selectedNetworkNode // This is a Network Node we pick to try to connect to.
let onMessageFunctionsMap = new Map()
return thisObject
function finalize() {
socketClient.close()
socketClient = undefined
networkInterface = undefined
peerInterface = undefined
web3 = undefined
called = undefined
onMessageFunctionsMap = undefined
}
async function initialize() {
/*
Here we will pick a Network Node from all users profiles available that do have a Network Node running. // TODO
In the meantime, we will assume that we have chosen the following Network Node to connect to.
*/
web3 = new SA.nodeModules.web3()
selectedNetworkNode = {
userProfileHandle: "Luis-Fernando-Molina",
blockchainAccount: "0xeBDCB7a73c4796ca9F025d005630eCe773dd9e54",
ranking: 0,
host: "localhost",
port: global.env.NETWORK_WEB_SOCKETS_INTERFACE_PORT
}
socketClient = new SA.nodeModules.ws('ws://' + selectedNetworkNode.host + ':' + selectedNetworkNode.port)
await setUpWebsocketClient()
}
async function setUpWebsocketClient() {
return new Promise(connectToNewtwork)
function connectToNewtwork(resolve, reject) {
try {
socketClient.onopen = () => { onConnection() }
socketClient.onerror = err => { onError(err) }
function onConnection() {
handshakeProcedure()
function handshakeProcedure() {
let callerTimestamp
stepOneRequest()
function stepOneRequest() {
/*
Send Handshake Message Step One:
At Step One we will just say hello, identify ourselves
as a Network Client, and send the Network Node our
User Profile Handle.
This Handle will be signed by the Network Node to prove
it's own identity, and later we will sign it's own handle
to prove ours.
*/
socketClient.onmessage = socketMessage => { stepOneResponse(socketMessage) }
callerTimestamp = (new Date()).valueOf()
let message = {
messageType: 'Handshake',
callerRole: 'Network Client',
callerProfileHandle: SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileHandle,
callerTimestamp: callerTimestamp,
step: 'One'
}
socketClient.send(JSON.stringify(message))
}
function stepOneResponse(socketMessage) {
let response = JSON.parse(socketMessage.data)
if (response.result !== 'Ok') {
console.log('[ERROR] Web Sockets Client -> stepOneResponse -> response.message = ' + response.message)
reject()
return
}
let signature = JSON.parse(response.signature)
called.blockchainAccount = web3.eth.accounts.recover(signature)
/*
We will check that the signature received produces a valid Blockchain Account.
*/
if (called.blockchainAccount === undefined) {
console.log('[ERROR] Web Sockets Client -> stepOneResponse -> Signature does not produce a valid Blockchain Account.')
reject()
return
}
/*
We will check that the blockchain account taken from the signature matches
the one we have on record for the user profile of the Network Node we are calling.
*/
if (called.blockchainAccount !== selectedNetworkNode.blockchainAccount) {
console.log('[ERROR] Web Sockets Client -> stepOneResponse -> The Network Node called does not have the expected Profile Handle.')
reject()
return
}
let signedMessage = JSON.parse(signature.message)
/*
We will verify that the signature belongs to the signature.message.
To do this we will hash the signature.message and see if we get
the same hash of the signature.
*/
let hash = web3.eth.accounts.hashMessage(signature.message)
if (hash !== signature.messageHash) {
console.log('[ERROR] Web Sockets Client -> stepOneResponse -> signature.message Hashed Does Not Match signature.messageHash.')
reject()
return
}
/*
We will check that the Network Node that responded has the same User Profile Handle
that we have on record, otherwise something is wrong and we should not proceed.
*/
if (signedMessage.calledProfileHandle !== selectedNetworkNode.userProfileHandle) {
console.log('[ERROR] Web Sockets Client -> stepOneResponse -> The Network Node called does not have the expected Profile Handle.')
reject()
return
}
/*
We will check that the profile handle we sent to the Network Node, is returned at the
signed message, to avoid man in the middle attacks.
*/
if (signedMessage.callerProfileHandle !== SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileHandle) {
console.log('[ERROR] Web Sockets Client -> stepOneResponse -> The Network Node callerProfileHandle does not match my own userProfileHandle.')
reject()
return
}
/*
We will also check that the callerTimestamp we sent to the Network Node, is returned at the
signed message, also to avoid man in the middle attacks.
*/
if (signedMessage.callerTimestamp !== callerTimestamp) {
console.log('[ERROR] Web Sockets Client -> stepOneResponse -> The Network Node callerTimestamp does not match my own callerTimestamp.')
reject()
return
}
/*
All validations passed, it seems we can continue with Step Two.
*/
stepTwoRequest(signedMessage)
}
function stepTwoRequest(signedMessage) {
/*
Send Handshake Message Step Two:
Here we will sign a message with the Network Node profile
handle and timestamp to prove our own identity.
*/
socketClient.onmessage = socketMessage => { stepTwoResponse(socketMessage) }
let signature = web3.eth.accounts.sign(JSON.stringify(signedMessage), SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileHandle)
let message = {
messageType: 'Handshake',
signature: JSON.stringify(signature),
step: 'Two'
}
socketClient.send(JSON.stringify(message))
}
function stepTwoResponse(socketMessage) {
let response = JSON.parse(socketMessage.data)
if (response.result !== 'Ok') {
console.log('[ERROR] Web Sockets Client -> stepOneResponse -> response.message = ' + response.message)
reject()
return
}
/*
This was the end of the Handshake procedure. We are connected to the
Network Node and from now on, all response messages will be received
at this following function.
*/
socketClient.onmessage = socketMessage => { onMenssage(socketMessage) }
resolve()
}
}
}
function onError(err) {
console.log('[ERROR] Web Sockets Client -> onError -> err.message = ' + err.message)
console.log('[ERROR] Web Sockets Client -> onError -> err.stack = ' + err.stack)
}
} catch (err) {
console.log('[ERROR] Web Sockets Client -> setUpWebsocketClient -> err.stack = ' + err.stack)
}
}
}
function sendMessage(message) {
return new Promise(sendSocketMessage)
function sendSocketMessage(resolve, reject) {
if (socketClient.readyState !== 1) { // 1 means connected and ready.
console.log('[ERROR] Web Sockets Client -> sendMessage -> Cannot send message while connection is closed.')
reject('Websockets Connection Not Ready.')
return
}
let socketMessage = {
messageId: SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId(),
messageType: 'Request',
payload: message
}
onMessageFunctionsMap.set(socketMessage.messageId, onMenssageFunction)
socketClient.send(
JSON.stringify(socketMessage)
)
function onMenssageFunction(response) {
try {
if (response.result === 'Ok') {
resolve(response.data)
} else {
console.log('[ERROR] Web Sockets Client -> onMenssageFunction -> response.message = ' + response.message)
reject(response.message)
}
} catch (err) {
callbackFunction = undefined
console.log('[ERROR] Web Sockets Client -> err.stack = ' + err.stack)
}
}
}
}
function onMenssage(socketMessage) {
let response = JSON.parse(socketMessage.data)
/*
We get the function that is going to resolve or reject the promise given.
*/
onMenssageFunction = onMessageFunctionsMap.get(response.messageId)
onMessageFunctionsMap.delete(response.messageId)
onMenssageFunction(response)
}
}
@@ -10,7 +10,6 @@ exports.newNetworkModulesWebSocketsNetworkClient = function newNetworkModulesWeb
let web3
let called = {}
let selectedNetworkNode // This is a Network Node we pick to try to connect to.
let onMessageFunctionsMap = new Map()
return thisObject
@@ -26,27 +25,18 @@ exports.newNetworkModulesWebSocketsNetworkClient = function newNetworkModulesWeb
onMessageFunctionsMap = undefined
}
async function initialize() {
/*
Here we will pick a Network Node from all users profiles available that do have a Network Node running. // TODO
In the meantime, we will assume that we have chosen the following Network Node to connect to.
*/
async function initialize(callerRole, p2pNetworkNode) {
web3 = new SA.nodeModules.web3()
selectedNetworkNode = {
userProfileHandle: "Luis-Fernando-Molina",
blockchainAccount: "0xeBDCB7a73c4796ca9F025d005630eCe773dd9e54",
ranking: 0,
host: "localhost",
port: global.env.NETWORK_WEB_SOCKETS_INTERFACE_PORT
}
let host = JSON.parse(p2pNetworkNode.node.config).host
let port = JSON.parse(p2pNetworkNode.node.config).webSocketsPort
socketClient = new SA.nodeModules.ws('ws://' + selectedNetworkNode.host + ':' + selectedNetworkNode.port)
await setUpWebsocketClient()
socketClient = new SA.nodeModules.ws('ws://' + host + ':' + port)
await setUpWebsocketClient(callerRole, p2pNetworkNode)
}
async function setUpWebsocketClient() {
async function setUpWebsocketClient(callerRole, p2pNetworkNode) {
return new Promise(connectToNewtwork)
@@ -85,8 +75,8 @@ exports.newNetworkModulesWebSocketsNetworkClient = function newNetworkModulesWeb
let message = {
messageType: 'Handshake',
callerRole: 'Network Node',
callerProfileHandle: SA.secrets.map.get(global.env.P2P_NETWORK_NODE_SIGNING_ACCOUNT).userProfileHandle,
callerRole: callerRole,
callerProfileHandle: SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileHandle,
callerTimestamp: callerTimestamp,
step: 'One'
}
@@ -116,7 +106,7 @@ exports.newNetworkModulesWebSocketsNetworkClient = function newNetworkModulesWeb
We will check that the blockchain account taken from the signature matches
the one we have on record for the user profile of the Network Node we are calling.
*/
if (called.blockchainAccount !== selectedNetworkNode.blockchainAccount) {
if (called.blockchainAccount !== p2pNetworkNode.blockchainAccount) {
console.log('[ERROR] Web Sockets Client -> stepOneResponse -> The Network Node called does not have the expected Profile Handle.')
reject()
return
@@ -138,7 +128,7 @@ exports.newNetworkModulesWebSocketsNetworkClient = function newNetworkModulesWeb
We will check that the Network Node that responded has the same User Profile Handle
that we have on record, otherwise something is wrong and we should not proceed.
*/
if (signedMessage.calledProfileHandle !== selectedNetworkNode.userProfileHandle) {
if (signedMessage.calledProfileHandle !== p2pNetworkNode.userProfile.userProfileHandle) {
console.log('[ERROR] Web Sockets Client -> stepOneResponse -> The Network Node called does not have the expected Profile Handle.')
reject()
return
@@ -147,7 +137,7 @@ exports.newNetworkModulesWebSocketsNetworkClient = function newNetworkModulesWeb
We will check that the profile handle we sent to the Network Node, is returned at the
signed message, to avoid man in the middle attacks.
*/
if (signedMessage.callerProfileHandle !== SA.secrets.map.get(global.env.P2P_NETWORK_NODE_SIGNING_ACCOUNT).userProfileHandle) {
if (signedMessage.callerProfileHandle !== SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileHandle) {
console.log('[ERROR] Web Sockets Client -> stepOneResponse -> The Network Node callerProfileHandle does not match my own userProfileHandle.')
reject()
return
@@ -177,7 +167,7 @@ exports.newNetworkModulesWebSocketsNetworkClient = function newNetworkModulesWeb
*/
socketClient.onmessage = socketMessage => { stepTwoResponse(socketMessage) }
let signature = web3.eth.accounts.sign(JSON.stringify(signedMessage), SA.secrets.map.get(global.env.P2P_NETWORK_NODE_SIGNING_ACCOUNT).privateKey)
let signature = web3.eth.accounts.sign(JSON.stringify(signedMessage), SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).privateKey)
let message = {
messageType: 'Handshake',
+17 -11
View File
@@ -1093,7 +1093,7 @@
{
"name": "Docs Statistics Functions",
"propertyName": "docsStatisticsFunctions",
"functionName": "newEducationFunctionLibraryDocsStats"
"functionName": "newEducationFunctionLibraryDocsStatisticsFunctions"
}
],
"utilities": [
@@ -1376,12 +1376,6 @@
"propertyName": "webSocketsInterface",
"functionName": "newNetworkModulesWebSocketsInterface",
"fileName": "WebSocketsInterface.js"
},
{
"name": "Web Sockets Network Client",
"propertyName": "webSocketsNetworkClient",
"functionName": "newNetworkModulesWebSocketsNetworkClient",
"fileName": "WebSocketsNetworkClient.js"
}
],
"utilities": []
@@ -1397,16 +1391,28 @@
],
"modules": [
{
"name": "Web Sockets App Client",
"propertyName": "webSocketsAppClient",
"functionName": "newNetworkModulesWebSocketsAppClient",
"fileName": "WebSocketsAppClient.js"
"name": "Web Sockets Network Client",
"propertyName": "webSocketsNetworkClient",
"functionName": "newNetworkModulesWebSocketsNetworkClient",
"fileName": "WebSocketsNetworkClient.js"
},
{
"name": "User Profiles",
"propertyName": "userProfiles",
"functionName": "newNetworkModulesUserProfiles",
"fileName": "UserProfiles.js"
},
{
"name": "P2P Network",
"propertyName": "p2pNetwork",
"functionName": "newNetworkModulesP2PNetwork",
"fileName": "P2PNetwork.js"
},
{
"name": "P2P Network Node",
"propertyName": "p2pNetworkNode",
"functionName": "newNetworkModulesP2PNetworkNode",
"fileName": "P2PNetworkNode.js"
}
],
"utilities": [
@@ -58,11 +58,11 @@ exports.newSocialTradingModulesWebAppInterface = function newSocialTradingModule
response = {
result: 'Ok',
message: 'Web App Interface Query Processed.',
data: await DK.running.webSocketsClient.sendMessage(JSON.stringify(messageHeader))
data: await DK.desktopApp.webSocketsClient.sendMessage(JSON.stringify(messageHeader))
}
} else {
let events = await DK.running.webSocketsClient.sendMessage(JSON.stringify(messageHeader))
let events = await DK.desktopApp.webSocketsClient.sendMessage(JSON.stringify(messageHeader))
for (let i = 0; i < events.length; i++) {
let event = events[i]
if (event.eventType === SA.projects.socialTrading.globals.eventTypes.NEW_USER_POST) {
@@ -132,7 +132,7 @@ exports.newSocialTradingModulesWebAppInterface = function newSocialTradingModule
let response = {
result: 'Ok',
message: 'Web App Interface Event Processed.',
data: await DK.running.webSocketsClient.sendMessage(JSON.stringify(messageHeader))
data: await DK.desktopApp.webSocketsClient.sendMessage(JSON.stringify(messageHeader))
}
return response
}