def copylink(self): ti = TextInput() self.linktexthook.a(ti) ti.setText("https://fbserv.herokuapp.com/analysis/atomic/" + self.fen.replace(" ", "%20")) ti.e.select() document.execCommand("copy") self.linktexthook.x()
def build(self): self.x().ac("schema") self.itemdiv = Div(["item", self.disposition]) self.valuediv = Div(["value", self.disposition]) if self.kind == "scalar": if self.disposition == "string": self.stringvalueinput = TextInput().ac("string").setText( self.value) self.stringvalueinput.ae("keyup", self.stringvalueinputchanged) self.valuediv.a(self.stringvalueinput) self.helpdiv = Div(["box", "help"]).html("?") self.copydiv = Div(["box", "copy"]).html("C").ae("mousedown", self.copydivclicked) if isdict(self.parent): self.keydiv = Div("key") self.keyinput = TextInput().ac("key").setText(self.key) self.keyinput.ae("keyup", self.keyinputchanged) self.keydiv.a(self.keyinput) self.itemdiv.a(self.keydiv) self.itemdiv.a([self.valuediv, self.helpdiv, self.copydiv]) if self.parent: self.deletediv = Div(["box", "delete" ]).html("X").ae("mousedown", self.deletedivclicked) self.itemdiv.a(self.deletediv) if iscollection(self): self.openbutton = Div("openbutton").ae("mousedown", self.openbuttonclicked) self.valuediv.a(self.openbutton) self.childsdiv = Div("childs") if self.childsopened: self.creatediv = Div("create") cc = self.createcombo self.createcombo = ComboBox().setoptions( [["create", "Create new"], ["scalar", "Scalar"], ["dict", "Dict"], ["list", "List"]], "create", self.createcombochanged).ac("createcombo") self.creatediv.a(self.createcombo) self.pastebutton = Button("Paste", self.pastebuttonpushed).ac("pastebutton") self.creatediv.a(self.pastebutton) self.childsdiv.a(self.creatediv) for child in self.childs: self.childsdiv.a(child) self.container = Div("container") self.container.a([self.itemdiv, self.childsdiv]) self.a(self.container) return self
def __init__(self, args = {}): super().__init__("div") self.container = Div("processinput") self.buttonlabel = args.get("buttonlabel", "Submit") self.entercallback = args.get("entercallback", None) self.textinput = TextInput().setentercallback(self.entercallback) self.submitbutton = Button(self.buttonlabel, self.onenter) self.container.a([self.textinput, self.submitbutton]) self.a(self.container)
def buildsignupdiv(self): self.signupdiv = Div() self.signupmaildiv = Div("signupmaildiv") self.emaillabel = Span().html("Email:") self.emailinput = TextInput().ac("profiletextinput").w(250) self.passwordlabel = Span().html("Password:"******"profiletextinput").w(100) self.signinbutton = Button("Sign in", self.signincallback) self.signoutbutton = Button("Sign out", self.signoutcallback) self.signupbutton = Button("Sign up", self.signupcallback) self.sendverificationbutton = Button("Send verification", self.sendverificationcallback) self.resetpasswordbutton = Button("Reset password", self.resetpasswordcallback) self.userinfodiv = Div("userinfodiv") self.signupmaildiv.a([self.emaillabel, self.emailinput, self.passwordlabel, self.passwordinput, self.signinbutton, self.signoutbutton, self.signupbutton, self.sendverificationbutton, self.resetpasswordbutton]) self.userdetailsdiv = Div("userdetailsdiv") self.displaynamelabel = Span().html("Display name:") self.displaynameinput = TextInput().ac("profiletextinput").w(250) self.photourllabel = Span().html("Photo url:") self.photourlinput = TextInput().ac("profiletextinput").w(250) self.updatedetailsbutton = Button("Update details", self.updatedetailscallback) self.userdetailsdiv.a([self.displaynamelabel, self.displaynameinput, self.photourllabel, self.photourlinput, self.updatedetailsbutton]) self.photodiv = Div("photodiv") self.signupdiv.a([self.signupmaildiv, self.userdetailsdiv, self.userinfodiv, self.photodiv]) self.firebaseuidiv = Div().sa("id", "firebaseuidiv") self.signupdiv.a(self.firebaseuidiv)
class Connection: def signincallback(self): email = self.emailinput.getText() password = self.passwordinput.getText() print("signing in user with", email, password) firebase.auth().signInWithEmailAndPassword(email, password).then( lambda: print("ok"), lambda error: window.alert("{}".format(error))) def signoutcallback(self): if firebase.auth().currentUser: print("signing out") firebase.auth().signOut() else: window.alert("Already signed out.") def signupcallback(self): email = self.emailinput.getText() password = self.passwordinput.getText() print("signing up user with", email, password) firebase.auth().createUserWithEmailAndPassword(email, password).then( lambda: print("ok"), lambda error: window.alert("{}".format(error))) def sendverificationcallback(self): email = self.emailinput.getText() firebase.auth().currentUser.sendEmailVerification().then( lambda: window.alert("Verification email has been sent to {} !". format(email)), lambda error: window.alert("{}".format(error))) def resetpasswordcallback(self): email = self.emailinput.getText() firebase.auth().sendPasswordResetEmail(email).then( lambda: window.alert("Password reset email has been sent to {} !". format(email)), lambda error: window.alert("{}".format(error))) def updatedisplaynamecallback(self): getconn().sioreq({ "kind": "updateuserdisplayname", "displayname": self.displaynameinput.getText(), "uid": self.uid }) def updatephotourlcallback(self): getconn().sioreq({ "kind": "updateuserphotourl", "photourl": self.photourlinput.getText(), "uid": self.uid }) def linkgoogleok(self, result): print(result) window.alert("Account linked with Google !") location.reload() def linkmailok(self, usercred): print(usercred) window.alert("Account linked with Email !") location.reload() def linkgooglecallback(self): provider = __new__(firebase.auth.GoogleAuthProvider()) firebase.auth().currentUser.linkWithPopup(provider).then( self.linkgoogleok, lambda err: window.alert("Link Google failed: {}".format(err))) def linkmailcallback(self): credential = firebase.auth.EmailAuthProvider.credential( self.emailinput.getText(), self.passwordinput.getText()) firebase.auth().currentUser.linkAndRetrieveDataWithCredential( credential).then( self.linkmailok, lambda err: window.alert("Link Email failed: {}".format(err))) def helpcallback(self): self.sioreq({"kind": "getdoc", "data": "profilehelp", "owner": "doc"}) def buildsignupdiv(self): self.signupdiv = Div() self.signupmaildiv = Div("signupmaildiv") self.emaillabel = Span().html("Email:") self.emailinput = TextInput().ac("profiletextinput").w(250) self.passwordlabel = Span().html("Password:"******"profiletextinput").w(100) self.helpbutton = Button("Help", self.helpcallback).ac("helpbutton") self.signinbutton = Button("Sign in", self.signincallback) self.signoutbutton = Button("Sign out", self.signoutcallback) self.signupbutton = Button("Sign up", self.signupcallback) self.sendverificationbutton = Button("Send verification", self.sendverificationcallback) self.resetpasswordbutton = Button("Reset password", self.resetpasswordcallback) self.linkgooglebutton = Button("Link Google", self.linkgooglecallback) self.linkmailbutton = Button("Link Email", self.linkmailcallback) self.userinfodiv = Div("userinfodiv") self.signupmaildiv.a([ self.helpbutton, self.emaillabel, self.emailinput, self.passwordlabel, self.passwordinput, self.signinbutton, self.signoutbutton, self.signupbutton, self.sendverificationbutton, self.resetpasswordbutton, self.linkgooglebutton, self.linkmailbutton ]) self.userdetailsdiv = Div("userdetailsdiv") self.displaynamelabel = Span().html("Display name:") self.displaynameinput = TextInput().ac("profiletextinput").w(250) self.photourllabel = Span().html("Photo url:") self.photourlinput = TextInput().ac("profiletextinput").w(250) self.updatedisplaynamebutton = Button("Update display name", self.updatedisplaynamecallback) self.updatephotourlbutton = Button("Update photo url", self.updatephotourlcallback) self.userdetailsdiv.a([ self.displaynamelabel, self.displaynameinput, self.updatedisplaynamebutton, self.photourllabel, self.photourlinput, self.updatephotourlbutton ]) self.photodiv = Div("photodiv") self.signupdiv.a([ self.signupmaildiv, self.userdetailsdiv, self.userinfodiv, self.photodiv ]) self.firebaseuidiv = Div().sa("id", "firebaseuidiv") self.signupdiv.a(self.firebaseuidiv) def logobj(self, logkind, obj, prompt): objstr = JSON.stringify(obj) if self.log: li = LogItem({"text": objstr, "kind": logkind, "prompt": prompt}) li.container.ac("socketlog") self.log.log(li) def emit(self, kind, obj): self.logobj("info", obj, "-> ") if self.rawsocket: self.rawsocket.emit(kind, obj) def sioreq(self, obj): obj["uid"] = self.getuid() #print("sioreq", obj) self.emit("sioreq", obj) def onconnect(self): if self.log: self.logobj("success", "socket connected ok", "socket message: ") if not self.configloaded: self.sioreq({"kind": "sendfirebaseconfig"}) if self.connectcallback: self.connectcallback() def siores(self, obj): if self.log: self.logobj("normal", obj, "<- ") if self.configloaded: if self.siorescallback: self.siorescallback(obj) else: kind = obj["kind"] if kind == "firebaseconfig": self.configloaded = True self.startfirebase(obj["firebaseconfig"]) def getuserdisplayname(self): if self.user: if self.displayName: return self.displayName return self.email return None def setprofiletab(self): self.profiletab.rc(["profilelogged", "profileanon"]) dn = self.getuserdisplayname() if dn: self.profiletab.container.html(dn) self.profiletab.ac("profilelogged") else: if self.user: self.profiletab.container.html("Anonymous") self.profiletab.ac("profileanon") else: self.profiletab.container.html("Profile") def signinanonymously(self): firebase.auth().signInAnonymously().then(lambda: print("ok"), lambda error: print(error)) def userstatusverbal(self): if not self.user: return "[logged out]" if self.user.isAnonymous: return "anonymous" return cpick(self.emailVerified, "verified", "not verified") def userverified(self): if not self.user: return False if self.user.isAnonymous: return False return self.user.emailVerified def authstatechanged(self, user): self.user = user self.passwordinput.setText("") if user: self.displayName = user.displayName self.email = user.email self.emailVerified = user.emailVerified self.photoURL = user.photoURL self.isAnonymous = user.isAnonymous self.uid = user.uid self.providerData = user.providerData print("user:"******"name : <span class='{}'>{}</span>".format( cpick(self.displayName, "uiinfo", "uiinfored"), getelse(self.displayName, "<NA>"))).pt(5) self.emailinfodiv = Div().html( "email : <span class='{}'>{}</span>".format( cpick(self.email, "uiinfo", "uiinfored"), getelse(self.email, "<NA>"))) self.verifiedinfodiv = Div().html( "status : <span class='{}'>{}</span>".format( cpick(self.userverified(), "uiinfo", "uiinfored"), self.userstatusverbal())) self.photourldiv = Div().html( "photo url : <span class='{}'>{}</span>".format( cpick(self.photoURL, "uiinfo", "uiinfored"), getelse(self.photoURL, "<NA>"))) self.uidinfodiv = Div().html( "uid : <span class='uiinfo'>{}</span>".format(self.uid)).pb(8) self.userinfodiv.x().a([ self.nameinfodiv, self.emailinfodiv, self.verifiedinfodiv, self.photourldiv, self.uidinfodiv ]) self.emailinput.setText(self.email) self.displaynameinput.setText(self.displayName) self.photourlinput.setText(self.photoURL) self.photodiv.x() if self.photoURL: self.photodiv.html( "<img src='{}' class='userphotoimg'></img>".format( self.photoURL)) else: print("no user") self.userinfodiv.x().a([ Div().html("Please sign up or sign in !"), Button("Sign in anonymously", self.signinanonymously()) ]) self.setprofiletab() self.userinfodiv.fs(cpick(self.user, 10, 14)) if user: if self.authcallback: self.authcallback() def initializefirebase(self): print("initializing firebase from", self.firebaseconfig) firebase.initializeApp(self.firebaseconfig) firebase.auth().onAuthStateChanged(self.authstatechanged) def initializefirebaseui(self): self.uiConfig = { "signInSuccessUrl": '/', "signInOptions": [ firebase.auth.GoogleAuthProvider.PROVIDER_ID, #firebase.auth.FacebookAuthProvider.PROVIDER_ID, #firebase.auth.TwitterAuthProvider.PROVIDER_ID, #firebase.auth.GithubAuthProvider.PROVIDER_ID, firebase.auth.EmailAuthProvider.PROVIDER_ID, #firebase.auth.PhoneAuthProvider.PROVIDER_ID ], "tosUrl": '/tos' } print("initializing firebase ui from", self.uiConfig) self.ui = __new__(firebaseui.auth.AuthUI(firebase.auth())) self.ui.start(self.firebaseuidiv.e, self.uiConfig) def startfirebase(self, firebaseconfig): self.firebaseconfig = firebaseconfig self.initializefirebase() self.initializefirebaseui() def getuid(self): if self.user: return self.uid return "mockuser" def __init__(self, args={}): self.configloaded = False self.user = None if window.location.protocol == "https:": self.ws_scheme = "wss://" else: self.ws_scheme = "ws://" self.SUBMIT_URL = self.ws_scheme + window.location.host print("creating socket {}".format(self.SUBMIT_URL)) self.rawsocket = io.connect(self.SUBMIT_URL) print("socket created ok") self.log = Log() self.connectcallback = args.get("connectcallback", None) self.authcallback = args.get("authcallback", None) self.siorescallback = args.get("siorescallback", None) self.buildsignupdiv() self.profiletab = Tab("profile", "Profile", self.signupdiv) if self.rawsocket: self.rawsocket.on("connect", self.onconnect) self.rawsocket.on("siores", self.siores)
def build(self): self.sectioncontainer = Div().ac("boardsectioncontainer").w(self.outerwidth) self.sectioncontainer.bci(self.background) self.outercontainer = Div().ac("boardoutercontainer").w(self.outerwidth).h(self.outerheight) self.outercontainer.bci(self.background) self.container = Div().ac("boardcontainer").w(self.width).h(self.height).t(self.margin).l(self.margin) self.container.bci(self.background) self.outercontainer.a(self.container) self.buildsquares() self.turndiv = Div().pa().w(self.turndivsize).h(self.turndivsize).bc(cpick(self.iswhitesturn(), "#fff", "#000")) if self.variantkey == "racingKings": self.turndiv.t(cpick(self.flip, 0, self.outerheight - self.turndivsize)) if xor(self.isblacksturn(), self.flip): self.turndiv.l(0) else: self.turndiv.l(self.outerwidth - self.turndivsize) else: self.turndiv.l(self.outerwidth - self.turndivsize).t(cpick(xor(self.isblacksturn(), self.flip), 0, self.outerheight - self.turndivsize)) self.outercontainer.a(self.turndiv) if self.promoting: self.buildprominput() self.container.ae("mousedown", self.promotecancelclick) self.fentext = TextInput({}).w(self.width).fs(10).setText(self.fen) self.fentext.changecallback = self.fentextchanged self.fendiv = Div().ac("boardfendiv").h(self.fendivheight).a(self.fentext) if self.variantkey == "crazyhouse": self.whitestorediv = Div().ac("boardstorediv").h(self.squaresize).w(self.outerwidth) self.whitestorediv.bci(self.background) self.blackstorediv = Div().ac("boardstorediv").h(self.squaresize).w(self.outerwidth) self.blackstorediv.bci(self.background) self.whitestore = PieceStore({ "show": self.show, "parent": self, "color": WHITE, "store": self.crazyfen, "containerdiv": self.whitestorediv }) self.blackstore = PieceStore({ "show": self.show, "parent": self, "color": BLACK, "store": self.crazyfen, "containerdiv": self.blackstorediv }) if self.flip: self.sectioncontainer.a([self.whitestorediv, self.outercontainer, self.blackstorediv]) else: self.sectioncontainer.a([self.blackstorediv, self.outercontainer, self.whitestorediv]) else: self.sectioncontainer.a([self.outercontainer]) if self.showfen: self.sectioncontainer.a(self.fendiv) self.x().a(self.sectioncontainer) self.movecanvas = Canvas(self.width, self.height).pa().t(0).l(0) self.movecanvashook = Div().pa().t(0).l(0).zi(5).op(0.5) self.piececanvashook = Div().pa().t(0).l(0).zi(11).op(0.5) self.arrowdiv = Div().pa() self.container.a([self.movecanvashook, self.arrowdiv, self.piececanvashook]) self.movecanvashook.a(self.movecanvas) self.buildgenmove() return self
class Client: def __init__(self): self.socket = None self.root = ge("clientroot") def signincallback(self): email = self.emailinput.getText() password = self.passwordinput.getText() print("signing in user with", email, password) firebase.auth().signInWithEmailAndPassword(email, password).then( lambda: print("ok"), lambda error: window.alert("{}".format(error)) ) def signoutcallback(self): if firebase.auth().currentUser: print("signing out") firebase.auth().signOut() else: window.alert("Already signed out.") def signupcallback(self): email = self.emailinput.getText() password = self.passwordinput.getText() print("signing up user with", email, password) firebase.auth().createUserWithEmailAndPassword(email, password).then( lambda: print("ok"), lambda error: window.alert("{}".format(error)) ) def sendverificationcallback(self): email = self.emailinput.getText() firebase.auth().currentUser.sendEmailVerification().then( lambda: window.alert("Verification email has been sent to {} !".format(email)), lambda error: window.alert("{}".format(error)) ) def resetpasswordcallback(self): email = self.emailinput.getText() firebase.auth().sendPasswordResetEmail(email).then( lambda: window.alert("Password reset email has been sent to {} !".format(email)), lambda error: window.alert("{}".format(error)) ) def updatedetailscallback(self): userdetails = { "displayname": self.displaynameinput.getText(), "photourl": self.photourlinput.getText() } self.sioreq({ "kind": "updateuserdetails", "uid": self.uid, "userdetails": userdetails }) def buildsignupdiv(self): self.signupdiv = Div() self.signupmaildiv = Div("signupmaildiv") self.emaillabel = Span().html("Email:") self.emailinput = TextInput().ac("profiletextinput").w(250) self.passwordlabel = Span().html("Password:"******"profiletextinput").w(100) self.signinbutton = Button("Sign in", self.signincallback) self.signoutbutton = Button("Sign out", self.signoutcallback) self.signupbutton = Button("Sign up", self.signupcallback) self.sendverificationbutton = Button("Send verification", self.sendverificationcallback) self.resetpasswordbutton = Button("Reset password", self.resetpasswordcallback) self.userinfodiv = Div("userinfodiv") self.signupmaildiv.a([self.emaillabel, self.emailinput, self.passwordlabel, self.passwordinput, self.signinbutton, self.signoutbutton, self.signupbutton, self.sendverificationbutton, self.resetpasswordbutton]) self.userdetailsdiv = Div("userdetailsdiv") self.displaynamelabel = Span().html("Display name:") self.displaynameinput = TextInput().ac("profiletextinput").w(250) self.photourllabel = Span().html("Photo url:") self.photourlinput = TextInput().ac("profiletextinput").w(250) self.updatedetailsbutton = Button("Update details", self.updatedetailscallback) self.userdetailsdiv.a([self.displaynamelabel, self.displaynameinput, self.photourllabel, self.photourlinput, self.updatedetailsbutton]) self.photodiv = Div("photodiv") self.signupdiv.a([self.signupmaildiv, self.userdetailsdiv, self.userinfodiv, self.photodiv]) self.firebaseuidiv = Div().sa("id", "firebaseuidiv") self.signupdiv.a(self.firebaseuidiv) def serializeconfig(self): self.sioreq({ "kind": "serializeconfig", "data": self.configschema.toargs() }) def storecloud(self): self.sioreq({ "kind": "storecloudconfig", "data": self.configschema.toargs() }) def retrievecloud(self): self.sioreq({ "kind": "retrievecloudconfig" }) def buildconfigdiv(self): self.configdiv = Div() self.configdiv.a(Button("Serialize", self.serializeconfig)) self.configdiv.a(Button("Store cloud", self.storecloud)) self.configdiv.a(Button("Retrieve cloud", self.retrievecloud)) self.configschema = Schema(self.schemaconfig) self.configdiv.a(self.configschema) def build(self): self.root.innerHTML = "" self.buildconfigdiv() self.signupdiv = Div() if self.authenabled: self.buildsignupdiv() self.profiletab = Tab("profile", "Profile", self.signupdiv) self.mainelement = TabPane({ "id": "maintabpane", "fillwindow": True, "tabs": [ Tab("main", "Main", Div("contentplaceholder").html("Main.")), Tab("config", "Config", self.configdiv), Tab("upload", "Upload", FileUploader({"url": "/upload"})), Tab("log", "Log", Div("contentplaceholder").html("Log.")), self.profiletab, Tab("about", "About", Div("contentplaceholder").html("About.")) ], "selected": "upload" }) self.root.appendChild(self.mainelement.e) def onconnect(self): self.sioreq({"kind": "connected"}) def sioreq(self, obj): print("->", obj) self.socket.emit("sioreq", obj) def getuserdisplayname(self): if self.user: if self.displayName: return self.displayName return self.email return None def setprofiletab(self): self.profiletab.rc(["profilelogged", "profileanon"]) dn = self.getuserdisplayname() if dn: self.profiletab.container.html(dn) self.profiletab.ac("profilelogged") else: if self.user: self.profiletab.container.html("Anonymous") self.profiletab.ac("profileanon") else: self.profiletab.container.html("Profile") def signinanonymously(self): firebase.auth().signInAnonymously().then( lambda: print("ok"), lambda error: print(error) ) def userstatusverbal(self): if not self.user: return "[logged out]" if self.user.isAnonymous: return "anonymous" return cpick(self.emailVerified, "verified", "not verified") def userverified(self): if not self.user: return False if self.user.isAnonymous: return False return self.user.emailVerified def authstatechanged(self, user): self.user = user self.passwordinput.setText("") if user: self.displayName = user.displayName self.email = user.email self.emailVerified = user.emailVerified self.photoURL = user.photoURL self.isAnonymous = user.isAnonymous self.uid = user.uid self.providerData = user.providerData print("user", self.displayName, self.email) print(self.providerData) self.nameinfodiv = Div().html("name : <span class='{}'>{}</span>".format(cpick(self.displayName, "uiinfo", "uiinfored"), getelse(self.displayName,"<NA>"))).pt(5) self.emailinfodiv = Div().html("email : <span class='{}'>{}</span>".format(cpick(self.email, "uiinfo", "uiinfored"), getelse(self.email, "<NA>"))) self.verifiedinfodiv = Div().html("status : <span class='{}'>{}</span>".format(cpick(self.userverified(), "uiinfo", "uiinfored"), self.userstatusverbal())) self.photourldiv = Div().html("photo url : <span class='{}'>{}</span>".format(cpick(self.photoURL, "uiinfo", "uiinfored"), getelse(self.photoURL,"<NA>"))) self.uidinfodiv = Div().html("uid : <span class='uiinfo'>{}</span>".format(self.uid)).pb(8) self.userinfodiv.x().a([self.nameinfodiv, self.emailinfodiv, self.verifiedinfodiv, self.photourldiv, self.uidinfodiv]) self.emailinput.setText(self.email) self.displaynameinput.setText(self.displayName) self.photourlinput.setText(self.photoURL) self.photodiv.x() if self.photoURL: self.photodiv.html("<img src='{}'></img>".format(self.photoURL)) else: print("no user") self.userinfodiv.x().a([ Div().html("Please sign up or sign in !"), Button("Sign in anonymously", self.signinanonymously()) ]) self.setprofiletab() self.userinfodiv.fs(cpick(self.user, 10, 14)) def getschemaconfigfromobj(self, obj): self.schemaconfig = { "kind": "collection", "disposition": "dict" } if "schemaconfig" in obj: self.schemaconfig = obj["schemaconfig"] self.authenabled = ( getrec("global/auth/enabled", self.schemaconfig) == "true" ) def initializefirebase(self): print("initializing firebase from", self.firebaseconfig) firebase.initializeApp(self.firebaseconfig) firebase.auth().onAuthStateChanged(self.authstatechanged) def initializefirebaseui(self): self.uiConfig = { "signInSuccessUrl": '/', "signInOptions": [ firebase.auth.GoogleAuthProvider.PROVIDER_ID, #firebase.auth.FacebookAuthProvider.PROVIDER_ID, #firebase.auth.TwitterAuthProvider.PROVIDER_ID, #firebase.auth.GithubAuthProvider.PROVIDER_ID, firebase.auth.EmailAuthProvider.PROVIDER_ID, #firebase.auth.PhoneAuthProvider.PROVIDER_ID ], "tosUrl": '/tos' } print("initializing firebase ui from", self.uiConfig) self.ui = __new__(firebaseui.auth.AuthUI(firebase.auth())) self.ui.start(self.firebaseuidiv.e, self.uiConfig) def startfirebase(self): self.initializefirebase() self.initializefirebaseui() def siores(self, obj): print("<-", obj) if "kind" in obj: kind = obj["kind"] if kind == "connectedack": self.getschemaconfigfromobj(obj) self.build() if self.authenabled: self.firebaseconfig = obj["firebaseconfig"] setTimeout(self.startfirebase, 50) elif kind == "configsaved": window.alert("Config saved, {} characters".format(obj["size"])) elif kind == "setcloudconfig": self.getschemaconfigfromobj(obj) self.build() setTimeout(lambda: window.alert("Config set from cloud."), 10) elif kind == "alert": window.alert(obj["data"]) if obj["reload"]: location.reload() def startup(self): print("creating socket {}".format(SUBMIT_URL)) self.socket = io.connect(SUBMIT_URL) print("socket created ok") self.socket.on('connect', self.onconnect) self.socket.on('siores', self.siores) ######################################################
class Schema(e): def copydivclicked(self): global clipboard clipboard = self.toargs() def openbuttonclicked(self): self.childsopened = not self.childsopened self.build() def createcombochanged(self, v): if v == "scalar": sch = Schema({"parent": self, "kind": "scalar"}) elif v == "dict": sch = Schema({ "parent": self, "kind": "collection", "disposition": "dict" }) elif v == "list": sch = Schema({ "parent": self, "kind": "collection", "disposition": "list" }) self.childs.append(sch) self.build() def stringvalueinputchanged(self): self.value = self.stringvalueinput.getText() def keyinputchanged(self): self.key = self.keyinput.getText() def deletechild(self, child): global clipboard newchilds = [] for currchild in self.childs: if not (currchild == child): newchilds.append(currchild) else: clipboard = child.toargs() self.childs = newchilds self.build() def deletedivclicked(self): self.parent.deletechild(self) def pastebuttonpushed(self): global clipboard if clipboard: clipboard["parent"] = self sch = Schema(clipboard) self.childs.append(sch) self.build() def build(self): self.x().ac("schema") self.itemdiv = Div(["item", self.disposition]) self.valuediv = Div(["value", self.disposition]) if self.kind == "scalar": if self.disposition == "string": self.stringvalueinput = TextInput().ac("string").setText( self.value) self.stringvalueinput.ae("keyup", self.stringvalueinputchanged) self.valuediv.a(self.stringvalueinput) self.helpdiv = Div(["box", "help"]).html("?") self.copydiv = Div(["box", "copy"]).html("C").ae("mousedown", self.copydivclicked) if isdict(self.parent): self.keydiv = Div("key") self.keyinput = TextInput().ac("key").setText(self.key) self.keyinput.ae("keyup", self.keyinputchanged) self.keydiv.a(self.keyinput) self.itemdiv.a(self.keydiv) self.itemdiv.a([self.valuediv, self.helpdiv, self.copydiv]) if self.parent: self.deletediv = Div(["box", "delete" ]).html("X").ae("mousedown", self.deletedivclicked) self.itemdiv.a(self.deletediv) if iscollection(self): self.openbutton = Div("openbutton").ae("mousedown", self.openbuttonclicked) self.valuediv.a(self.openbutton) self.childsdiv = Div("childs") if self.childsopened: self.creatediv = Div("create") cc = self.createcombo self.createcombo = ComboBox().setoptions( [["create", "Create new"], ["scalar", "Scalar"], ["dict", "Dict"], ["list", "List"]], "create", self.createcombochanged).ac("createcombo") self.creatediv.a(self.createcombo) self.pastebutton = Button("Paste", self.pastebuttonpushed).ac("pastebutton") self.creatediv.a(self.pastebutton) self.childsdiv.a(self.creatediv) for child in self.childs: self.childsdiv.a(child) self.container = Div("container") self.container.a([self.itemdiv, self.childsdiv]) self.a(self.container) return self def tojsontext(self): return JSON.stringify(self.toargs(), None, 2) def toargs(self): args = {} for arg in SCHEMA_DEFAULT_ARGS: args[arg[0]] = self[arg[0]] args["childsarg"] = [] for child in self.childs: args["childsarg"].append(child.toargs()) return args def __init__(self, args={}): super().__init__("div") self.parent = getitem(args, "parent", None) for arg in SCHEMA_DEFAULT_ARGS: self[arg[0]] = getitem(args, arg[0], arg[1]) self.childs = [] for childarg in self.childsarg: childarg["parent"] = self child = Schema(childarg) self.childs.append(child) self.build()
class Schema(e): def copydivclicked(self): global clipboard clipboard = self.toargs() def openbuttonclicked(self): self.childsopened = not self.childsopened self.build() def createcombochanged(self, v): if v == "scalar": sch = Schema({ "parent": self, "kind": "scalar", "disposition": "string" }) elif v == "slider": sch = Schema({ "parent": self, "kind": "scalar", "disposition": "slider" }) elif v == "checkbox": sch = Schema({ "parent": self, "kind": "scalar", "disposition": "checkbox" }) elif v == "textarea": sch = Schema({ "parent": self, "kind": "scalar", "disposition": "textarea" }) elif v == "date": sch = Schema({ "parent": self, "kind": "scalar", "disposition": "date", "value": dateToDateInputStr(__new__(Date())) }) elif v == "color": sch = Schema({ "parent": self, "kind": "scalar", "disposition": "color", "value": "#ffffff" }) elif v == "dict": sch = Schema({ "parent": self, "kind": "collection", "disposition": "dict" }) elif v == "list": sch = Schema({ "parent": self, "kind": "collection", "disposition": "list" }) elif v == "combo": sch = Schema({ "parent": self, "kind": "collection", "disposition": "combo" }) elif v == "radio": sch = Schema({ "parent": self, "kind": "collection", "disposition": "radio" }) elif v == "process": sch = Schema({ "parent": self, "kind": "collection", "disposition": "dict", "childsopened": True, "childsarg": [{ "kind": "scalar", "disposition": "string", "key": "key" }, { "kind": "scalar", "disposition": "string", "key": "displayname" }, { "kind": "scalar", "disposition": "string", "key": "command" }, { "kind": "collection", "disposition": "list", "key": "command_args" }] }) self.childs.append(sch) self.build() def stringvalueinputchanged(self): self.value = self.stringvalueinput.getText() def keyinputchanged(self): self.key = self.keyinput.getText() def deletechild(self, child): global clipboard newchilds = [] for currchild in self.childs: if not (currchild == child): newchilds.append(currchild) else: clipboard = child.toargs() self.childs = newchilds self.build() def deletedivclicked(self): self.parent.deletechild(self) def pastebuttonpushed(self): global clipboard if clipboard: clipboard["parent"] = self sch = Schema(clipboard) self.childs.append(sch) self.build() def setslidervalue(self, value, doslider=True): self.value = float(value) if self.value < self.minvalue: self.value = self.minvalue if self.value > self.maxvalue: self.value = self.maxvalue if doslider: self.slider.sv(self.value) self.slidervalueinput.setText("{}".format(self.value)) def minvalueinputchanged(self): self.minvalue = texttofloat(self.minvalueinput.getText(), self.minvalue) self.slider.setmin(self.minvalue) self.setslidervalue(self.value) def maxvalueinputchanged(self): self.maxvalue = texttofloat(self.maxvalueinput.getText(), self.maxvalue) self.slider.setmax(self.maxvalue) self.setslidervalue(self.value) def sliderstepinputhchanged(self): self.valuestep = texttofloat(self.sliderstepinput.getText(), self.valuestep) self.slider.setstep(self.valuestep) self.setslidervalue(self.value) def sliderchanged(self): self.setslidervalue(self.slider.v(), False) def slidervalueinputchanged(self): self.setslidervalue( texttofloat(self.slidervalueinput.getText(), self.value)) def checkboxchanged(self): self.value = self.checkbox.getchecked() def combocheckboxchanged(self): self.selected = self.combocheckbox.getchecked() def radioradioclicked(self): for child in self.parent.childs: isme = (child == self) child.radioradio.setchecked(isme) child.selected = isme print(isme) def textareachanged(self): self.value = self.textarea.getText() def setdatelabel(self): self.datelabel.html("{}".format( dateInputStrToDate(self.value).getTime())) def datechanged(self): self.value = self.date.v() self.setdatelabel() def colorchanged(self): self.value = self.color.v() self.colorlabel.html(self.value) def build(self): self.x().ac("schema") self.itemdiv = Div(["item", self.disposition]) self.valuediv = Div(["value", self.disposition]) if self.kind == "scalar": if self.disposition == "dict": if type(self.value) == bool: self.disposition = "checkbox" else: self.disposition = "string" if self.disposition == "string": self.stringvalueinput = TextInput().ac("string").setText( self.value) self.stringvalueinput.ae("keyup", self.stringvalueinputchanged) self.valuediv.a(self.stringvalueinput) elif self.disposition == "slider": self.slidervalueinput = TextInput().ac("slidervalue").setText( self.value).setchangecallback(self.slidervalueinputchanged) self.minvalueinput = TextInput().ac("sliderminmax").setText( self.minvalue).setchangecallback(self.minvalueinputchanged) self.slider = Slider().ac("sliderslider").ae( "change", self.sliderchanged) self.maxvalueinput = TextInput().ac("sliderminmax").setText( self.maxvalue).setchangecallback(self.maxvalueinputchanged) self.sliderstepinput = TextInput().ac("sliderstep").setText( self.valuestep).setchangecallback( self.sliderstepinputhchanged) self.valuediv.a([ self.slidervalueinput, self.minvalueinput, self.slider, self.maxvalueinput, self.sliderstepinput ]) self.slider.setmin(self.minvalue).setmax( self.maxvalue).setstep(self.valuestep) self.setslidervalue( texttofloat(self.value, SCHEMA_SLIDER_DEFAULT_VALUE)) elif self.disposition == "checkbox": self.value = (self.value is True) self.checkbox = CheckBox().ac("checkbox").setchecked( self.value).ae("change", self.checkboxchanged) self.valuediv.a(self.checkbox) elif self.disposition == "textarea": self.textarea = TextArea().ac("textarea").setText(self.value) self.textarea.ae(["keyup", "change"], self.textareachanged) self.valuediv.a(self.textarea) elif self.disposition == "date": self.date = DateInput().ac("date").sv(self.value) self.date.ae(["keyup", "change"], self.datechanged) self.datelabel = Label().ac("datelabel") self.setdatelabel() self.valuediv.a([self.date, self.datelabel]) elif self.disposition == "color": self.color = ColorInput().ac("color").sv(self.value) self.color.ae(["keyup", "change"], self.colorchanged) self.colorlabel = Label().ac("colorlabel").html(self.value) self.valuediv.a([self.color, self.colorlabel]) self.helpdiv = Div(["box", "help"]).html("?") self.copydiv = Div(["box", "copy"]).html("C").ae("mousedown", self.copydivclicked) if isdict(self.parent): self.keydiv = Div("key") self.keyinput = TextInput().ac("key").setText(self.key) self.keyinput.ae("keyup", self.keyinputchanged) self.keydiv.a(self.keyinput) self.itemdiv.a(self.keydiv) if iscombo(self.parent): self.combodiv = Div(["box", "combo"]) self.combocheckbox = CheckBox().ac("checkbox").setchecked( self.selected).ae("change", self.combocheckboxchanged) self.combodiv.a(self.combocheckbox) self.itemdiv.a(self.combodiv) if isradio(self.parent): self.radiodiv = Div(["box", "radio"]) self.radioradio = Radio().ac("radio").setchecked(self.selected).ae( "mousedown", self.radioradioclicked) self.radiodiv.a(self.radioradio) self.itemdiv.a(self.radiodiv) self.itemdiv.a([self.valuediv, self.helpdiv, self.copydiv]) if self.parent: self.deletediv = Div(["box", "delete" ]).html("X").ae("mousedown", self.deletedivclicked) self.itemdiv.a(self.deletediv) if iscollection(self): self.openbutton = Div("openbutton").ae("mousedown", self.openbuttonclicked) self.valuediv.a(self.openbutton) self.childsdiv = Div("childs") if self.childsopened: self.creatediv = Div("create") cc = self.createcombo self.createcombo = ComboBox().setoptions( [["create", "Create new"], ["scalar", "Scalar"], ["slider", "Slider"], ["checkbox", "Checkbox"], ["textarea", "Textarea"], ["date", "Date"], [ "color", "Color" ], ["dict", "Dict"], ["list", "List"], ["combo", "Combo"], ["radio", "Radio"], ["process", "Process"]], "create", self.createcombochanged).ac("createcombo") self.creatediv.a(self.createcombo) self.pastebutton = Button("Paste", self.pastebuttonpushed).ac("pastebutton") self.creatediv.a(self.pastebutton) self.childsdiv.a(self.creatediv) for child in self.childs: self.childsdiv.a(child) self.container = Div("container") self.container.a([self.itemdiv, self.childsdiv]) self.a(self.container) return self def tojsontext(self): return JSON.stringify(self.toargs(), None, 2) def toargs(self): args = {} for arg in SCHEMA_DEFAULT_ARGS: args[arg[0]] = self[arg[0]] args["childsarg"] = [] for child in self.childs: args["childsarg"].append(child.toargs()) return args def __init__(self, args={}): super().__init__("div") self.parent = getitem(args, "parent", None) for arg in SCHEMA_DEFAULT_ARGS: self[arg[0]] = getitem(args, arg[0], arg[1]) self.childs = [] for childarg in self.childsarg: childarg["parent"] = self child = Schema(childarg) self.childs.append(child) self.build() def getchildbykey(self, key): for child in self.childs: if child.key == key: return child return None def getpathrec(self, sch, pathparts): if not sch: return None if len(pathparts) == 0: return sch key = pathparts[0] pathparts = pathparts[1:] if self.disposition == "dict": return self.getpathrec(self.getchildbykey(key), pathparts) else: return None def getpath(self, path): if path == "": pathparts = [] else: pathparts = path.split("/") return self.getpathrec(self, pathparts)
def build(self): self.x().ac("schema") self.itemdiv = Div(["item", self.disposition]) self.valuediv = Div(["value", self.disposition]) if self.kind == "scalar": if self.disposition == "dict": if type(self.value) == bool: self.disposition = "checkbox" else: self.disposition = "string" if self.disposition == "string": self.stringvalueinput = TextInput().ac("string").setText( self.value) self.stringvalueinput.ae("keyup", self.stringvalueinputchanged) self.valuediv.a(self.stringvalueinput) elif self.disposition == "slider": self.slidervalueinput = TextInput().ac("slidervalue").setText( self.value).setchangecallback(self.slidervalueinputchanged) self.minvalueinput = TextInput().ac("sliderminmax").setText( self.minvalue).setchangecallback(self.minvalueinputchanged) self.slider = Slider().ac("sliderslider").ae( "change", self.sliderchanged) self.maxvalueinput = TextInput().ac("sliderminmax").setText( self.maxvalue).setchangecallback(self.maxvalueinputchanged) self.sliderstepinput = TextInput().ac("sliderstep").setText( self.valuestep).setchangecallback( self.sliderstepinputhchanged) self.valuediv.a([ self.slidervalueinput, self.minvalueinput, self.slider, self.maxvalueinput, self.sliderstepinput ]) self.slider.setmin(self.minvalue).setmax( self.maxvalue).setstep(self.valuestep) self.setslidervalue( texttofloat(self.value, SCHEMA_SLIDER_DEFAULT_VALUE)) elif self.disposition == "checkbox": self.value = (self.value is True) self.checkbox = CheckBox().ac("checkbox").setchecked( self.value).ae("change", self.checkboxchanged) self.valuediv.a(self.checkbox) elif self.disposition == "textarea": self.textarea = TextArea().ac("textarea").setText(self.value) self.textarea.ae(["keyup", "change"], self.textareachanged) self.valuediv.a(self.textarea) elif self.disposition == "date": self.date = DateInput().ac("date").sv(self.value) self.date.ae(["keyup", "change"], self.datechanged) self.datelabel = Label().ac("datelabel") self.setdatelabel() self.valuediv.a([self.date, self.datelabel]) elif self.disposition == "color": self.color = ColorInput().ac("color").sv(self.value) self.color.ae(["keyup", "change"], self.colorchanged) self.colorlabel = Label().ac("colorlabel").html(self.value) self.valuediv.a([self.color, self.colorlabel]) self.helpdiv = Div(["box", "help"]).html("?") self.copydiv = Div(["box", "copy"]).html("C").ae("mousedown", self.copydivclicked) if isdict(self.parent): self.keydiv = Div("key") self.keyinput = TextInput().ac("key").setText(self.key) self.keyinput.ae("keyup", self.keyinputchanged) self.keydiv.a(self.keyinput) self.itemdiv.a(self.keydiv) if iscombo(self.parent): self.combodiv = Div(["box", "combo"]) self.combocheckbox = CheckBox().ac("checkbox").setchecked( self.selected).ae("change", self.combocheckboxchanged) self.combodiv.a(self.combocheckbox) self.itemdiv.a(self.combodiv) if isradio(self.parent): self.radiodiv = Div(["box", "radio"]) self.radioradio = Radio().ac("radio").setchecked(self.selected).ae( "mousedown", self.radioradioclicked) self.radiodiv.a(self.radioradio) self.itemdiv.a(self.radiodiv) self.itemdiv.a([self.valuediv, self.helpdiv, self.copydiv]) if self.parent: self.deletediv = Div(["box", "delete" ]).html("X").ae("mousedown", self.deletedivclicked) self.itemdiv.a(self.deletediv) if iscollection(self): self.openbutton = Div("openbutton").ae("mousedown", self.openbuttonclicked) self.valuediv.a(self.openbutton) self.childsdiv = Div("childs") if self.childsopened: self.creatediv = Div("create") cc = self.createcombo self.createcombo = ComboBox().setoptions( [["create", "Create new"], ["scalar", "Scalar"], ["slider", "Slider"], ["checkbox", "Checkbox"], ["textarea", "Textarea"], ["date", "Date"], [ "color", "Color" ], ["dict", "Dict"], ["list", "List"], ["combo", "Combo"], ["radio", "Radio"], ["process", "Process"]], "create", self.createcombochanged).ac("createcombo") self.creatediv.a(self.createcombo) self.pastebutton = Button("Paste", self.pastebuttonpushed).ac("pastebutton") self.creatediv.a(self.pastebutton) self.childsdiv.a(self.creatediv) for child in self.childs: self.childsdiv.a(child) self.container = Div("container") self.container.a([self.itemdiv, self.childsdiv]) self.a(self.container) return self