コード例 #1
0
ファイル: addCustomerForm.py プロジェクト: JennaSys/pymui
def AddCustomerVu(props):
    # enqueueSnackbar, closeSnackbar = useSnackbar()

    def onAdd(event):
        success = props['onClick'](event)
        if success:
            props.enqueueSnackbar('Successfully added  the customer!',
                                  {'variant': 'success'})
        else:
            props.enqueueSnackbar('There was a problem adding the customer!',
                                  {'variant': 'error'})

    return el(
        'form',
        None,
        el(
            'div',
            None,
            el(
                TextField, {
                    'label': "First Name",
                    'type': 'text',
                    'name': 'fname',
                    'value': props['fname'],
                    'onChange': props['onChange']
                }),
        ),
        el(
            'div',
            None,
            el(
                TextField, {
                    'label': "Last Name",
                    'type': 'text',
                    'name': 'lname',
                    'value': props['lname'],
                    'onChange': props['onChange']
                }),
        ),
        el(
            'div',
            None,
            el(
                TextField, {
                    'label': "Amount",
                    'type': 'number',
                    'name': 'amount',
                    'value': props['amount'],
                    'onChange': props['onChange']
                }),
        ),
        el(Box, {
            'display': 'flex',
            'justifyContent': 'center'
        }, el(Button, {'onClick': onAdd}, "Add Customer")),
    )
コード例 #2
0
ファイル: urlutils.py プロジェクト: JennaSys/pcra
def Link(props):
    """Internal SPA link with browser history"""
    def onClick(event):
        event.preventDefault()
        spaRedirect(props['to'])

    def onClickAlt(event):
        event.preventDefault()
        props['onClick']()

    if props['onClick']:
        return el(MuiLink, {
            'href': props['to'],
            'onClick': onClickAlt
        }, props['children'])
    else:
        return el(MuiLink, {
            'href': props['to'],
            'onClick': onClick
        }, props['children'])
コード例 #3
0
ファイル: landingPageMenu.py プロジェクト: JennaSys/pcra
def LandingPageMenu(props):
    mainMenu = props['mainMenu']
    mainMenuClose = props['mainMenuClose']
    aboutModalOpen = props['aboutModalOpen']

    ctx = useContext(UserCtx)
    logout = ctx['logout']
    isLoggedIn = ctx['isLoggedIn']

    def handleAbout():
        mainMenuClose()
        aboutModalOpen()

    def handleLogout():
        mainMenuClose()
        logout()

    return el(
        Fragment,
        None,
        el(
            Menu,
            {
                'id': 'main-menu',
                'anchorEl': mainMenu,
                'keepMounted': True,
                'open': bool(mainMenu),
                'onClose': mainMenuClose,
            },
            el(MenuItem, {'onClick': handleAbout}, "About"),
            el(MenuItem, {
                'onClick': handleLogout,
                'disabled': not isLoggedIn
            }, "Logout"),
        ),
    )
コード例 #4
0
ファイル: aboutModal.py プロジェクト: JennaSys/pcra
def About(props):
    modalState = props['modalState']
    onClose = props['onClose']

    return el(Modal, {'isOpen': modalState,
                      'onRequestClose': onClose,
                      'style': modalStyles,
                      'ariaHideApp': False,
                      },
              el(Flexbox, {'justifyContent': 'space-between',
                           'alignItems': 'center'
                           },
                 el(Typography, {'variant': 'h6', 'color': 'primary'}, "About"),
                 el(IconButton, {'edge': 'end',
                                 'color': 'primary',
                                 'onClick': onClose
                                 }, el(CloseIcon, None)
                    ),
                 ),
              el(Paper, {'style': {'padding': '1rem'}},
                 el(FlexboxCenter, {'maxWidth': '400px'},
                    el('img', {'src': applogo, 'width': '80%'})
                    ),
                 ),
              el(Paper, {'style': {'padding': '0.5rem', 'marginTop': '1rem'}},
                 el(FlexboxCenter, None,
                    el(Typography, {'variant': 'h5'}, appname)
                    ),
                 el(Divider, {'style': {'marginTop': '0.5rem',
                                        'marginBottom': '0.5rem'}
                              }
                    ),
                 el(FlexboxCenter, None,
                    el(Typography, {'variant': 'h5'}, f"Version: {version}")
                    ),
                 )
              )
コード例 #5
0
def LandingPage(props):
    params = dict(props['params'])
    pathname = props['pathname']

    show_login = params.get('login', 'hide') == 'show'

    uCtx = useContext(UserCtx)
    isLoggedIn = uCtx['isLoggedIn']
    login = uCtx['login']

    mainMenu, setMainMenu = useState(None)
    aboutShow, setAboutShow = useState(False)
    loginModal, setLoginModal = useState(False)
    username, setUsername = useState("")
    password, setPassword = useState("")

    snack = useSnackbar()

    def doLogin():
        def _login():
            login(username)
            snack.enqueueSnackbar("Login succeeded!", {'variant': 'success'})
            spaRedirect(redir)

        def _loginFailed():
            setLoginModal(True)
            snack.enqueueSnackbar("Login failed, please try again",
                                  {'variant': 'error'}
                                  )

        redir = params.get('redir', f"{pathname}{buildParams(params)}")
        fetch("/api/login", _login,
              data={'username': username, 'password': password},
              method='POST',
              onError=_loginFailed
              )

        setLoginModal(False)

    def clearUser():
        if loginModal:
            setUsername("")
            setPassword("")

    def mainMenuOpen(event):
        setMainMenu(event['currentTarget'])

    def mainMenuClose():
        setMainMenu(None)

    def aboutModalOpen():
        setAboutShow(True)

    useEffect(lambda: setLoginModal(show_login), [show_login])
    useEffect(clearUser, [loginModal])

    return el(Container, {'maxWidth': 'md'},
              el(Paper, {'style': {'padding': '1rem'}},
                 el(Flexbox, {'alignItems': 'center'},
                    el(IconButton, {'edge': 'start',
                                    'color': 'inherit',
                                    'onClick': mainMenuOpen
                                    }, el(MenuIcon, None)
                       ),
                    el(Typography, {'variant': 'h5'}, appname)
                    )
                 ),
              el(LandingPageMenu, {'mainMenu': mainMenu,
                                   'mainMenuClose': mainMenuClose,
                                   'aboutModalOpen': aboutModalOpen}
                 ),
              el(Paper, {'style': {'padding': '0.5rem',
                                   'marginTop': '1rem'}
                         },
                 el(FlexboxCenter, None,
                    el(Typography, {'variant': 'h5'},
                       el(Link, {'to': '#', 'onClick': aboutModalOpen}, "About")
                       ),
                    ),
                 el(FlexboxCenter, None,
                    el(Typography, {'variant': 'h5'},
                       el(Link, {'to': '#',
                                 'onClick': lambda: setLoginModal(True)
                                 }, "Login")
                       ) if not isLoggedIn else None
                    ),
                 ),
              el(Login, {'onClose': lambda: setLoginModal(False),
                         'onLogin': doLogin,
                         'password': password,
                         'username': username,
                         'setUsername': lambda usr: setUsername(usr),
                         'setPassword': lambda pwd: setPassword(pwd),
                         'modalState': loginModal,
                         }
                 ),
              el(About, {'onClose': lambda: setAboutShow(False),
                         'modalState': aboutShow}
                 ),
              )
コード例 #6
0
ファイル: app.py プロジェクト: JennaSys/pcra
def App(props):
    title = props['title']
    pathname = props['pathname']

    user, setUser = useState("")

    setTitle(title)

    router = {
        '/': LandingPage,
    }

    route_is_valid = pathname in router
    isLoggedIn = len(user) > 0

    def login(username):
        setUser(username)

    def logout():
        setUser("")
        fetch('/api/logout', lambda: spaRedirect('/'))

    def validateSession():
        def validated():
            def _setuser(data):
                login(data['user'])

            if not isLoggedIn:
                fetch('/api/whoami',
                      _setuser,
                      onError=console.error,
                      redirect=False)

        def notValidated(error):
            if len(user) > 0:
                setUser("")

        if route_is_valid:
            fetch('/api/ping', validated, onError=notValidated, redirect=False)

    user_ctx = {
        'user': user,
        'login': login,
        'logout': logout,
        'isLoggedIn': isLoggedIn
    }

    useEffect(validateSession, [])
    useEffect(lambda: ReactGA.pageview(pathname), [pathname])

    if route_is_valid:
        return el(
            ThemeProvider, {'theme': theme},
            el(
                SnackbarProvider, {'maxSnack': 3},
                el(UserCtx.Provider, {'value': user_ctx},
                   el(router[pathname], props))))
    else:
        console.error(f"ERROR - Bad pathname for route: {props['pathname']}")
        return el('div', None, el('h1', None, "Page Not Found"),
                  el('p', None, f"Bad pathname: {props['pathname']}"),
                  el('div', None, el('a', {'href': "/"}, "Back to Home")))
コード例 #7
0
def Login(props):
    onClose = props['onClose']
    onLogin = props['onLogin']
    username = props['username']
    password = props['password']
    setUsername = props['setUsername']
    setPassword = props['setPassword']
    modalState = props['modalState']

    def login(event):
        event.preventDefault()
        onLogin()

    def handleUsernameChange(event):
        target = event['target']
        setUsername(target['value'])

    def handlePasswordChange(event):
        target = event['target']
        setPassword(target['value'])

    return el(
        Modal, {
            'isOpen': modalState,
            'onRequestClose': onClose,
            'style': modalStyles,
            'ariaHideApp': False,
        },
        el(
            FlexboxCenter, {'maxWidth': '300px'},
            el(
                Box, None,
                el(
                    Flexbox, {
                        'justifyContent': 'space-between',
                        'alignItems': 'center'
                    },
                    el(Typography, {
                        'variant': 'h6',
                        'width': '40%',
                        'color': 'primary'
                    }, appname),
                    el(IconButton, {
                        'edge': 'end',
                        'color': 'primary',
                        'onClick': onClose
                    }, el(CloseIcon, None))),
                el(
                    Paper, {
                        'elevation': 2,
                        'style': {
                            'padding': '1rem'
                        }
                    },
                    el(
                        'form',
                        {'onSubmit': login},
                        el(
                            TextField, {
                                'label': 'Login Name',
                                'variant': 'outlined',
                                'fullWidth': True,
                                'value': username,
                                'onChange': handleUsernameChange,
                                'autoFocus': True,
                                'placeholder': "admin"
                            }),
                        el(
                            TextField, {
                                'label': 'Password',
                                'variant': 'outlined',
                                'fullWidth': True,
                                'type': 'password',
                                'value': password,
                                'onChange': handlePasswordChange,
                                'placeholder': "123"
                            }),
                        el(
                            Button, {
                                'type': 'submit',
                                'fullWidth': True,
                                'style': {
                                    'minWidth': '10rem',
                                    'marginRight': '1rem',
                                    'marginTop': '1rem'
                                },
                            }, "Login"),
                    )))))