Compare commits
4 Commits
pkg/dev/ub
...
develop
Author | SHA1 | Date | |
---|---|---|---|
4ee3de773c | |||
d4ca478b44 | |||
d10ce7c7ad | |||
655ecd1a0f |
@ -2,6 +2,8 @@ import React, { FunctionComponent } from "react";
|
|||||||
|
|
||||||
export const AppLoader:FunctionComponent = () => {
|
export const AppLoader:FunctionComponent = () => {
|
||||||
return (
|
return (
|
||||||
<div className="loader"></div>
|
<div className="app-loader">
|
||||||
|
<i className="fas fa-spinner fa-spin fa-5x"></i>
|
||||||
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
@ -1,6 +1,5 @@
|
|||||||
import React, { FunctionComponent, useState, useEffect } from "react";
|
import React, { FunctionComponent, useState, useEffect } from "react";
|
||||||
import { Link } from "react-router-dom";
|
import { Link } from "react-router-dom";
|
||||||
import { WithLoader } from "./WithLoader";
|
|
||||||
|
|
||||||
export interface Item {
|
export interface Item {
|
||||||
id: string
|
id: string
|
||||||
|
@ -2,19 +2,16 @@ import React from 'react';
|
|||||||
import { Page } from '../Page';
|
import { Page } from '../Page';
|
||||||
import { UserForm } from '../UserForm';
|
import { UserForm } from '../UserForm';
|
||||||
import { User } from '../../types/user';
|
import { User } from '../../types/user';
|
||||||
import { useUserProfileQuery } from '../../gql/queries/profile';
|
import { useUserProfile } from '../../gql/queries/profile';
|
||||||
import { useUpdateUserProfileMutation } from '../../gql/mutations/profile';
|
import { useUpdateUserProfileMutation } from '../../gql/mutations/profile';
|
||||||
import { WithLoader } from '../WithLoader';
|
|
||||||
|
|
||||||
export function ProfilePage() {
|
export function ProfilePage() {
|
||||||
const userProfileQuery = useUserProfileQuery();
|
const { user, loading } = useUserProfile();
|
||||||
const [ updateProfile, updateUserProfileMutation ] = useUpdateUserProfileMutation();
|
const [ updateProfile, updateUserProfileMutation ] = useUpdateUserProfileMutation();
|
||||||
const isLoading = updateUserProfileMutation.loading || userProfileQuery.loading;
|
const isLoading = updateUserProfileMutation.loading || loading;
|
||||||
|
|
||||||
const { userProfile } = (userProfileQuery.data || {});
|
|
||||||
|
|
||||||
const onUserChange = (user: User) => {
|
const onUserChange = (user: User) => {
|
||||||
if (userProfile.name !== user.name) {
|
if (user.name !== user.name) {
|
||||||
updateProfile({ variables: {changes: { name: user.name }}});
|
updateProfile({ variables: {changes: { name: user.name }}});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -27,11 +24,7 @@ export function ProfilePage() {
|
|||||||
<div className="column is-6 is-offset-3">
|
<div className="column is-6 is-offset-3">
|
||||||
<div className="box">
|
<div className="box">
|
||||||
<h2 className="is-size-2 subtitle">Mon profil</h2>
|
<h2 className="is-size-2 subtitle">Mon profil</h2>
|
||||||
<WithLoader loading={isLoading || !userProfile}>
|
{ !isLoading ? <UserForm onChange={onUserChange} user={user} /> : null }
|
||||||
{
|
|
||||||
<UserForm onChange={onUserChange} user={userProfile} />
|
|
||||||
}
|
|
||||||
</WithLoader>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,18 +0,0 @@
|
|||||||
import React, { Fragment, PropsWithChildren, FunctionComponent } from 'react';
|
|
||||||
|
|
||||||
export interface WithLoaderProps {
|
|
||||||
loading?: boolean|boolean[]
|
|
||||||
}
|
|
||||||
|
|
||||||
export const WithLoader: FunctionComponent<WithLoaderProps> = ({ loading, children }) => {
|
|
||||||
const isLoading = Array.isArray(loading) ? loading.some(l => l) : loading;
|
|
||||||
return (
|
|
||||||
<Fragment>
|
|
||||||
{
|
|
||||||
isLoading ?
|
|
||||||
<div>Chargement</div> :
|
|
||||||
children
|
|
||||||
}
|
|
||||||
</Fragment>
|
|
||||||
)
|
|
||||||
}
|
|
@ -1,8 +1,6 @@
|
|||||||
import React, { FunctionComponent } from 'react';
|
import React, { FunctionComponent } from 'react';
|
||||||
import { User } from '../../types/user';
|
|
||||||
import { Workgroup } from '../../types/workgroup';
|
import { Workgroup } from '../../types/workgroup';
|
||||||
import { InfoForm } from './InfoForm';
|
import { InfoForm } from './InfoForm';
|
||||||
import { WithLoader } from '../WithLoader';
|
|
||||||
import { useUpdateWorkgroupMutation, useCreateWorkgroupMutation } from '../../gql/mutations/workgroups';
|
import { useUpdateWorkgroupMutation, useCreateWorkgroupMutation } from '../../gql/mutations/workgroups';
|
||||||
import { useHistory } from 'react-router';
|
import { useHistory } from 'react-router';
|
||||||
|
|
||||||
@ -43,9 +41,7 @@ export const InfoPanel: FunctionComponent<InfoPanelProps> = ({ workgroup }) => {
|
|||||||
Informations
|
Informations
|
||||||
</p>
|
</p>
|
||||||
<div className="panel-block">
|
<div className="panel-block">
|
||||||
<WithLoader loading={isLoading}>
|
{ !isLoading ? <InfoForm workgroup={workgroup} onChange={onWorkgroupChange} /> : null }
|
||||||
<InfoForm workgroup={workgroup} onChange={onWorkgroupChange} />
|
|
||||||
</WithLoader>
|
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
);
|
);
|
||||||
|
@ -1,44 +1,16 @@
|
|||||||
.loader-container {
|
.app-loader {
|
||||||
display: flex;
|
@extend body;
|
||||||
width: 100%;
|
|
||||||
justify-content: center;
|
|
||||||
height: 100%;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.lds-ripple {
|
display: flex;
|
||||||
display: inline-block;
|
position: absolute;
|
||||||
position: relative;
|
z-index: 10000;
|
||||||
width: 80px;
|
top: 0;
|
||||||
height: 80px;
|
bottom: 0;
|
||||||
transform: scale(2);
|
left: 0;
|
||||||
}
|
right: 0;
|
||||||
|
height: 100vh;
|
||||||
.lds-ripple div {
|
width: 100vw;
|
||||||
position: absolute;
|
align-items: center;
|
||||||
border: 4px solid $grey;
|
justify-content: center;
|
||||||
opacity: 1;
|
flex-direction: column;
|
||||||
border-radius: 50%;
|
}
|
||||||
animation: lds-ripple 1s cubic-bezier(0, 0.2, 0.8, 1) infinite;
|
|
||||||
}
|
|
||||||
|
|
||||||
.lds-ripple div:nth-child(2) {
|
|
||||||
animation-delay: -0.5s;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes lds-ripple {
|
|
||||||
0% {
|
|
||||||
top: 36px;
|
|
||||||
left: 36px;
|
|
||||||
width: 0;
|
|
||||||
height: 0;
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
top: 0px;
|
|
||||||
left: 0px;
|
|
||||||
width: 72px;
|
|
||||||
height: 72px;
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
}
|
|
@ -79,8 +79,9 @@ func getServiceContainer(ctx context.Context, conf *config.Config) (*service.Con
|
|||||||
// Define default cookie options
|
// Define default cookie options
|
||||||
sessionStore.SessionOpts.Path = "/"
|
sessionStore.SessionOpts.Path = "/"
|
||||||
sessionStore.SessionOpts.HttpOnly = true
|
sessionStore.SessionOpts.HttpOnly = true
|
||||||
|
sessionStore.SessionOpts.Secure = conf.HTTP.CookieSecure
|
||||||
sessionStore.SessionOpts.MaxAge = conf.HTTP.CookieMaxAge
|
sessionStore.SessionOpts.MaxAge = conf.HTTP.CookieMaxAge
|
||||||
sessionStore.SessionOpts.SameSite = http.SameSiteStrictMode
|
sessionStore.SessionOpts.SameSite = http.SameSiteLaxMode
|
||||||
|
|
||||||
ctn.Provide(
|
ctn.Provide(
|
||||||
session.ServiceName,
|
session.ServiceName,
|
||||||
|
1
debian/compat
vendored
1
debian/compat
vendored
@ -1 +0,0 @@
|
|||||||
9
|
|
14
debian/control
vendored
14
debian/control
vendored
@ -1,14 +0,0 @@
|
|||||||
Source: daddy
|
|
||||||
Section: unknown
|
|
||||||
Priority: optional
|
|
||||||
Maintainer: Cadoles <contact@cadoles.com>
|
|
||||||
Build-Depends: debhelper (>= 8.0.0), wget, ca-certificates, tar
|
|
||||||
Standards-Version: 3.9.4
|
|
||||||
Homepage: http://forge.cadoles.com/Cadoles/daddy
|
|
||||||
Vcs-Git: http://forge.cadoles.com/Cadoles/daddy.git
|
|
||||||
Vcs-Browser: http://forge.cadoles.com/Cadoles/daddy
|
|
||||||
|
|
||||||
Package: daddy
|
|
||||||
Architecture: amd64
|
|
||||||
Depends: ${shlibs:Depends}, ${misc:Depends}
|
|
||||||
Description: Daddy app
|
|
1
debian/daddy.links
vendored
1
debian/daddy.links
vendored
@ -1 +0,0 @@
|
|||||||
/etc/daddy/client-config.js /usr/share/daddy/public/config.js
|
|
11
debian/daddy.service
vendored
11
debian/daddy.service
vendored
@ -1,11 +0,0 @@
|
|||||||
[Unit]
|
|
||||||
Description=Daddy app
|
|
||||||
After=network-online.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
ExecStart=/usr/bin/daddy -workdir /usr/share/daddy -config /etc/daddy/config.yml
|
|
||||||
Restart=on-failure
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
56
debian/rules
vendored
56
debian/rules
vendored
@ -1,56 +0,0 @@
|
|||||||
#!/usr/bin/make -f
|
|
||||||
# -*- makefile -*-
|
|
||||||
|
|
||||||
# Uncomment this to turn on verbose mode.
|
|
||||||
export DH_VERBOSE=1
|
|
||||||
|
|
||||||
GO_VERSION := 1.13.5
|
|
||||||
OS := linux
|
|
||||||
ARCH := amd64
|
|
||||||
GOPATH=$(HOME)/go
|
|
||||||
|
|
||||||
ifeq (, $(shell which go 2>/dev/null))
|
|
||||||
override_dh_auto_build: install-go
|
|
||||||
|
|
||||||
override_dh_auto_clean: install-go
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq (, $(shell which node 2>/dev/null))
|
|
||||||
override_dh_auto_build: install-nodejs
|
|
||||||
endif
|
|
||||||
|
|
||||||
%:
|
|
||||||
dh $@ --with systemd
|
|
||||||
|
|
||||||
override_dh_auto_build: $(GOPATH)
|
|
||||||
GOPATH=$(GOPATH) PATH="$(PATH):/usr/local/go/bin:$(GOPATH)/bin" make deps
|
|
||||||
GOPATH=$(GOPATH) PATH="$(PATH):/usr/local/go/bin:$(GOPATH)/bin" ARCH_TARGETS=$(ARCH) make release
|
|
||||||
|
|
||||||
$(GOPATH):
|
|
||||||
mkdir -p $(GOPATH)
|
|
||||||
|
|
||||||
install-go:
|
|
||||||
wget -nc https://dl.google.com/go/go$(GO_VERSION).$(OS)-$(ARCH).tar.gz
|
|
||||||
tar -C /usr/local -xzf go$(GO_VERSION).$(OS)-$(ARCH).tar.gz
|
|
||||||
|
|
||||||
install-nodejs:
|
|
||||||
wget -O- https://deb.nodesource.com/setup_12.x | bash -
|
|
||||||
apt-get install -y nodejs
|
|
||||||
|
|
||||||
override_dh_auto_install:
|
|
||||||
|
|
||||||
mkdir -p debian/daddy/usr/share/daddy
|
|
||||||
mkdir -p debian/daddy/etc/daddy
|
|
||||||
mkdir -p debian/daddy/usr/bin
|
|
||||||
|
|
||||||
cp -r release/server-$(OS)-$(ARCH)/* debian/daddy/usr/share/daddy/
|
|
||||||
|
|
||||||
mv debian/daddy/usr/share/daddy/bin/server debian/daddy/usr/bin/daddy
|
|
||||||
mv debian/daddy/usr/share/daddy/server.conf debian/daddy/etc/daddy/config.yml
|
|
||||||
mv debian/daddy/usr/share/daddy/public/config.js debian/daddy/etc/daddy/client-config.js
|
|
||||||
|
|
||||||
install -d debian/daddy
|
|
||||||
|
|
||||||
override_dh_strip:
|
|
||||||
|
|
||||||
override_dh_auto_test:
|
|
1
debian/source/format
vendored
1
debian/source/format
vendored
@ -1 +0,0 @@
|
|||||||
3.0 (native)
|
|
2
go.mod
2
go.mod
@ -3,7 +3,7 @@ module forge.cadoles.com/Cadoles/daddy
|
|||||||
go 1.14
|
go 1.14
|
||||||
|
|
||||||
require (
|
require (
|
||||||
forge.cadoles.com/wpetit/goweb-oidc v0.0.0-20201013111944-d43b43b636ed
|
forge.cadoles.com/wpetit/goweb-oidc v0.0.0-20201013125038-8d8d1519a52d
|
||||||
forge.cadoles.com/wpetit/hydra-passwordless v0.0.0-20200908094025-38ac4422dddc // indirect
|
forge.cadoles.com/wpetit/hydra-passwordless v0.0.0-20200908094025-38ac4422dddc // indirect
|
||||||
github.com/99designs/gqlgen v0.11.3
|
github.com/99designs/gqlgen v0.11.3
|
||||||
github.com/alecthomas/chroma v0.8.1 // indirect
|
github.com/alecthomas/chroma v0.8.1 // indirect
|
||||||
|
2
go.sum
2
go.sum
@ -41,6 +41,8 @@ forge.cadoles.com/wpetit/goweb-oidc v0.0.0-20201013085949-5d5592098f13 h1:gZCo9p
|
|||||||
forge.cadoles.com/wpetit/goweb-oidc v0.0.0-20201013085949-5d5592098f13/go.mod h1:phGAWHUGKNZj044478BvRg0jk049uK1IiX2Amh8krAk=
|
forge.cadoles.com/wpetit/goweb-oidc v0.0.0-20201013085949-5d5592098f13/go.mod h1:phGAWHUGKNZj044478BvRg0jk049uK1IiX2Amh8krAk=
|
||||||
forge.cadoles.com/wpetit/goweb-oidc v0.0.0-20201013111944-d43b43b636ed h1:7dTCXOGxvAulu9vnOjpt2cTgsuxMHX4FH795/JJgo08=
|
forge.cadoles.com/wpetit/goweb-oidc v0.0.0-20201013111944-d43b43b636ed h1:7dTCXOGxvAulu9vnOjpt2cTgsuxMHX4FH795/JJgo08=
|
||||||
forge.cadoles.com/wpetit/goweb-oidc v0.0.0-20201013111944-d43b43b636ed/go.mod h1:phGAWHUGKNZj044478BvRg0jk049uK1IiX2Amh8krAk=
|
forge.cadoles.com/wpetit/goweb-oidc v0.0.0-20201013111944-d43b43b636ed/go.mod h1:phGAWHUGKNZj044478BvRg0jk049uK1IiX2Amh8krAk=
|
||||||
|
forge.cadoles.com/wpetit/goweb-oidc v0.0.0-20201013125038-8d8d1519a52d h1:o+Ppy/MyT5UgbtUYI2J1YqS3iuThxOuNFenYoPgKZKk=
|
||||||
|
forge.cadoles.com/wpetit/goweb-oidc v0.0.0-20201013125038-8d8d1519a52d/go.mod h1:phGAWHUGKNZj044478BvRg0jk049uK1IiX2Amh8krAk=
|
||||||
forge.cadoles.com/wpetit/hydra-passwordless v0.0.0-20200908094025-38ac4422dddc h1:9gc/1qizPtK6/iMVlizknWUFii75ntl2xSUV/FSC92Y=
|
forge.cadoles.com/wpetit/hydra-passwordless v0.0.0-20200908094025-38ac4422dddc h1:9gc/1qizPtK6/iMVlizknWUFii75ntl2xSUV/FSC92Y=
|
||||||
forge.cadoles.com/wpetit/hydra-passwordless v0.0.0-20200908094025-38ac4422dddc/go.mod h1:nANHORi270d5jDXjeJ7B3pMgK9R4J0/17p1IIc+rhOk=
|
forge.cadoles.com/wpetit/hydra-passwordless v0.0.0-20200908094025-38ac4422dddc/go.mod h1:nANHORi270d5jDXjeJ7B3pMgK9R4J0/17p1IIc+rhOk=
|
||||||
github.com/99designs/gqlgen v0.11.3 h1:oFSxl1DFS9X///uHV3y6CEfpcXWrDUxVblR4Xib2bs4=
|
github.com/99designs/gqlgen v0.11.3 h1:oFSxl1DFS9X///uHV3y6CEfpcXWrDUxVblR4Xib2bs4=
|
||||||
|
@ -47,6 +47,7 @@ type HTTPConfig struct {
|
|||||||
CookieAuthenticationKey string `yaml:"cookieAuthenticationKey" env:"HTTP_COOKIE_AUTHENTICATION_KEY"`
|
CookieAuthenticationKey string `yaml:"cookieAuthenticationKey" env:"HTTP_COOKIE_AUTHENTICATION_KEY"`
|
||||||
CookieEncryptionKey string `yaml:"cookieEncryptionKey" env:"HTTP_COOKIE_ENCRYPTION_KEY"`
|
CookieEncryptionKey string `yaml:"cookieEncryptionKey" env:"HTTP_COOKIE_ENCRYPTION_KEY"`
|
||||||
CookieMaxAge int `yaml:"cookieMaxAge" env:"HTTP_COOKIE_MAX_AGE"`
|
CookieMaxAge int `yaml:"cookieMaxAge" env:"HTTP_COOKIE_MAX_AGE"`
|
||||||
|
CookieSecure bool `yaml:"cookieSecure" env:"HTTP_COOKIE_SECURE"`
|
||||||
TemplateDir string `yaml:"templateDir" env:"HTTP_TEMPLATE_DIR"`
|
TemplateDir string `yaml:"templateDir" env:"HTTP_TEMPLATE_DIR"`
|
||||||
PublicDir string `yaml:"publicDir" env:"HTTP_PUBLIC_DIR"`
|
PublicDir string `yaml:"publicDir" env:"HTTP_PUBLIC_DIR"`
|
||||||
FrontendURL string `yaml:"frontendURL" env:"HTTP_FRONTEND_URL"`
|
FrontendURL string `yaml:"frontendURL" env:"HTTP_FRONTEND_URL"`
|
||||||
|
@ -1,15 +0,0 @@
|
|||||||
server {
|
|
||||||
listen 80 default_server;
|
|
||||||
server_name daddy.local;
|
|
||||||
|
|
||||||
root /usr/share/daddy/client/public;
|
|
||||||
index index.html;
|
|
||||||
|
|
||||||
location / {
|
|
||||||
try_files $uri /index.html =404;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /api/v1/graphql {
|
|
||||||
proxy_pass http://127.0.0.1:8080/api/v1/graphql;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1 +0,0 @@
|
|||||||
GO_ENV=prod
|
|
Reference in New Issue
Block a user