Merge branch 'master' into release/hubl-618

This commit is contained in:
Jean-Baptiste Pasquier 2020-10-28 11:30:16 +01:00
commit f8cf5c4772
33 changed files with 1788 additions and 230 deletions

1107
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -13,20 +13,34 @@
"build:jscomponents": "babel \"src/components/*.js\" --out-dir dist/components/",
"build:pug": "pug src/index.pug -o dist/ --obj config.json",
"build:manifest": "node --experimental-modules make-webmanifest.mjs",
"build:i18n": "copyfiles -u 2 src/locales/*.json dist/locales",
"copy:font": "copyfiles -f src/fonts/* dist/fonts",
"copy:image": "copyfiles -f src/images/* dist/images",
"copy:sw": "copyfiles -f src/sw.js dist",
"serve": "pushstate-server -d ./dist -p 3000",
"watch": "run-p copy:* build:manifest watch:* serve",
"watch:css": "npm run build:css && npm run build:css -- -w",
"watch:js": "babel --watch \"src/scripts/*.js\" -o dist/scripts/index.js",
"watch:jscomponents": "babel --watch \"src/components/*.js\" --out-dir dist/components/",
"watch": "run-p build watch:* serve",
"watch:css": "npm-watch build:css",
"watch:js": "npm-watch build:js",
"watch:jscomponents": "npm-watch build:jscomponents",
"watch:manifest": "npm-watch build:manifest",
"watch:pug": "pug --watch src/index.pug -o dist/ --obj config.json",
"watch:i18n": "npm-watch build:i18n",
"watch:font": "npm-watch copy:font",
"watch:image": "npm-watch copy:image",
"cypress:open": "cypress open",
"cypress:verify": "cypress verify",
"cypress:info": "cypress info",
"test": "cypress run"
},
"watch": {
"build:css": "src/styles/*",
"build:manifest": "make-webmanifest.mjs",
"build:i18n": "src/locales/*",
"copy:images": "src/fonts/*.js",
"copy:fonts": "src/images/*.js",
"build:js": "src/scripts/*.js",
"build:jscomponents": "src/components/*.js"
},
"release": {
"branches": [
"master"
@ -71,6 +85,7 @@
"devDependencies": {
"cypress": "^4.5.0",
"cypress-localstorage-commands": "^1.2.1",
"cypress-terminal-report": "^1.2.1"
"cypress-terminal-report": "^1.2.1",
"npm-watch": "^0.7.0"
}
}

View File

@ -11,10 +11,10 @@ const HublStatus = widgetFactory(
name="\${name}">
<option
value="Public"
\${value=="Public" ? 'selected' : ''}>Public</option>
\${value=="Public" ? 'selected' : ''} data-trans="hublStatus.public">Public</option>
<option
value="Private"
\${value=="Private" ? 'selected' : ''}>Privé</option>
\${value=="Private" ? 'selected' : ''} data-trans="hublStatus.private">Privé</option>
</select>
</label>`,
'',

View File

@ -3,6 +3,6 @@ if(typeof Sentry !== 'undefined') {
dsn: 'https://b4b29557689049a39168599577adb940@sentry.startinblox.com/4',
integrations: [new Sentry.Integrations.BrowserTracing()],
environment: document.location.hostname,
tracesSampleRate: 1.0,
tracesSampleRate: 0.2,
});
}

View File

@ -10,7 +10,7 @@ script(type="module" src="https://unpkg.com/@startinblox/core@0.12" defer)
script(type="module" src="https://unpkg.com/@startinblox/oidc@0.10" defer)
//- script(type="module" src="/lib/sib-auth/index.js" defer)
script(type="module" src="https://unpkg.com/@startinblox/router@0.9" defer)
script(type="module" src="https://unpkg.com/@startinblox/router@0.10" defer)
//- script(type="module" src="/lib/sib-router/src/index.js" defer)
script(type="module" src="https://unpkg.com/@startinblox/component-notifications@0.7" defer)
@ -25,11 +25,11 @@ if (endpoints.resources || (endpoints.get && endpoints.get.resources)) && (endpo
//- script(type="module" src="/lib/sib-resource/sib-resource.js" defer)
if endpoints.joboffers || (endpoints.get && endpoints.get.joboffers)
script(type="module" src="https://unpkg.com/@startinblox/component-job-board@0.8" defer)
script(type="module" src="https://unpkg.com/@startinblox/component-job-board@1.0" defer)
//- script(type="module" src="/lib/solid-job-board/dist/index.js" defer)
if (endpoints.uploads || (endpoints.get && endpoints.get.uploads)) && (endpoints.skills || (endpoints.get && endpoints.get.skills)) && (endpoints.users || (endpoints.get && endpoints.get.users))
script(type="module" src="https://unpkg.com/@startinblox/component-directory@0.10" defer)
script(type="module" src="https://unpkg.com/@startinblox/component-directory@1.0" defer)
//- script(type="module" src="/lib/solid-directory/dist/index.js" defer)
if endpoints.dashboards || (endpoints.get && endpoints.get.dashboards)
@ -37,7 +37,7 @@ if endpoints.dashboards || (endpoints.get && endpoints.get.dashboards)
//- script(type="module" src="/lib/solid-dashboard/dist/index.js" defer)
if endpoints.users || (endpoints.get && endpoints.get.users)
script(type="module" src="https://unpkg.com/@startinblox/component-chat@1.1" defer)
script(type="module" src="https://unpkg.com/@startinblox/component-chat@1.2" defer)
//- script(type="module" src="/lib/solid-xmpp-chat/dist/index.js" defer)
if endpoints.polls || (endpoints.get && endpoints.get.polls)

View File

@ -3,7 +3,7 @@
solid-link(next='dashboard')
img(src=`${clientLogo || '/images/logo.png'}` style=`max-height:${clientLogoHeight || '32px'}`)
span.beta-tag Beta
span.beta-tag(data-trans='header.beta')
solid-notifications.notLoggedIn(
nested-field="inbox"
@ -30,14 +30,14 @@ details#user-controls.notLoggedIn
ul
if (endpoints.uploads || (endpoints.get && endpoints.get.uploads)) && (endpoints.skills || (endpoints.get && endpoints.get.skills)) && (endpoints.users || (endpoints.get && endpoints.get.users))
li
solid-link(next='profile') Mon profil
solid-link(next='profile' data-trans='header.myProfile')
li
solid-link(next='admin') Administration
solid-link(next='admin' data-trans='header.admin')
li
solid-link(next='about') A propos
button(role='log out' onclick="document.querySelector('sib-auth').logout();") Se déconnecter
solid-link(next='about' data-trans='header.about')
button(role='log out' onclick="document.querySelector('sib-auth').logout();" data-trans='header.logOut')
button.loggedIn(role='log in' onclick="document.querySelector('sib-auth').login();") Se connecter
button.loggedIn(role='log in' onclick="document.querySelector('sib-auth').login();" data-trans='header.logIn')
button.notLoggedIn.mobile-menu-icon.icon-menu#toggleMainMenu

View File

@ -27,15 +27,15 @@ html(lang="en")
main#viewport.content.notLoggedIn
if endpoints.dashboards || (endpoints.get && endpoints.get.dashboards)
#dashboard(hidden).no-sidebar.with-padding
#dashboard(hidden, data-view="dashboard").no-sidebar.with-padding
include page-dashboard.pug
if publicDirectory && (endpoints.users || (endpoints.get && endpoints.get.users))
#members(hidden).no-sidebar.with-padding
#members(hidden, data-view="members").no-sidebar.with-padding
include page-directory.pug
if endpoints.joboffers || (endpoints.get && endpoints.get.joboffers)
#job-offers(hidden).no-sidebar.with-padding
#job-offers(hidden, data-view="job-offers").no-sidebar.with-padding
if (endpoints.post && endpoints.post.joboffers) && (endpoints.get && endpoints.get.joboffers)
hubl-reactivity(data-src=`${endpoints.post.joboffers}current/` target-src=`${endpoints.get.joboffers}`)
hubl-reactivity(data-src=`${endpoints.post.joboffers}expired/` target-src=`${endpoints.get.joboffers}`)
@ -49,7 +49,7 @@ html(lang="en")
include page-job-offers.pug
if endpoints.projects || (endpoints.get && endpoints.get.projects)
#project(hidden).with-sidebar
#project(hidden, data-view="project").with-sidebar
if (endpoints.post && endpoints.post.projects) && (endpoints.get && endpoints.get.projects)
hubl-reactivity(data-src=`${endpoints.post.projects}joinable/` target-src=`${endpoints.get.projects}`)
hubl-reactivity(data-src=`${endpoints.post.projects}` target-src=`${endpoints.get.projects}`)
@ -61,7 +61,7 @@ html(lang="en")
include page-project.pug
if endpoints.circles || (endpoints.get && endpoints.get.circles)
#circle(hidden).with-sidebar
#circle(hidden, data-view="circle").with-sidebar
if (endpoints.post && endpoints.post.circles) && (endpoints.get && endpoints.get.circles)
hubl-reactivity(data-src=`${endpoints.post.circles}joinable/` target-src=`${endpoints.get.circles}`)
hubl-reactivity(data-src=`${endpoints.post.circles}` target-src=`${endpoints.get.circles}`)
@ -72,29 +72,29 @@ html(lang="en")
hubl-reactivity(bind-user nested-field="circles" target-src=`${endpoints.circles || endpoints.get.circles}joinable/`)
include page-circle.pug
if endpoints.users || (endpoints.get && endpoints.get.users)
#messages(hidden).with-sidebar
#messages(hidden, data-view="messages").with-sidebar
include page-messages.pug
if endpoints.polls || (endpoints.get && endpoints.get.polls)
#polls(hidden).with-sidebar
#polls(hidden, data-view="polls").with-sidebar
include page-polls.pug
if endpoints.events || (endpoints.get && endpoints.get.events)
#events(hidden)
#events(hidden, data-view="events")
include page-events.pug
if endpoints.resources || (endpoints.get && endpoints.get.resources)
#resources(hidden)
#resources(hidden, data-view="resources")
include page-resources.pug
#admin(hidden).with-sidebar
#admin(hidden, data-view="admin").with-sidebar
include page-admin.pug
#about.no-sidebar.with-padding
#about(data-view="about").no-sidebar.with-padding
include page-about.pug
if (endpoints.skills || (endpoints.get && endpoints.get.skills)) && (endpoints.uploads || (endpoints.post && endpoints.post.uploads)) && (endpoints.users || (endpoints.post && endpoints.post.users))
#profile(hidden).no-sidebar
#profile(hidden, data-view="profile").no-sidebar
include page-profile.pug
if analytics

208
src/locales/fr.json Normal file
View File

@ -0,0 +1,208 @@
{
"header": {
"beta": "Beta",
"myProfile": "Mon profil",
"admin": "Administration",
"about": "A propos",
"logOut": "Se déconnecter",
"logIn": "Se connecter"
},
"menuLeft": {
"emptyCircleProject": {
"notPartOf": "Tu ne fais partie d'aucun",
"createNew": "Pour en créer un nouveau, tu peux te rendre dans le",
"adminPanel": "panneau d'administration",
"project": "projet",
"circle": "cercle"
},
"dashboard": "Tableau de bord",
"events": "Evènements",
"gov": "Gouvernance",
"resources": "Ressources",
"jobBoard": "Offres de mission",
"profileDirectory": "Annuaire des membres",
"projects": "Projets",
"circles": "Circles",
"messages": "Messages",
"search": "Rechercher..."
},
"about": {
"title": "A propos",
"card1": {
"subTitle": "Cette application est développée par Startin'blox",
"paragraph1": "Startinblox est une coopérative qui développe des outils libres pour construire facilement et à moindre coût des applications fédérées et interopérables basées sur les derniers standards du web poussés par le projet SOLID.",
"paragraph2": "Sa mission est de redonner le pouvoir aux utilisateurs en leur permettant de reprendre la main sur leur outil numérique et de bénéficier dun effet de réseau au sein dun écosystème choisi afin de sémanciper des grandes plateformes."
},
"card2": {
"title": "Contacte-nous",
"paragraph-1": "Tu veux contribuer, nous remonter un bug, nous suggérer une amélioration, travailler avec nous ?",
"link": "Contact"
}
},
"admin": {
"menuRight": {
"fold": "Replier le menu",
"community": "Communautés",
"circles": "Cercles",
"projects": "Projets"
}
},
"dashboard": {
"title": "Tableau de bord"
},
"circle": {
"menuRight": {
"buttonMobile": "MENU",
"fold": "Replier le menu",
"chat": "Chat",
"information": "Information",
"resources": "Resources",
"events": "Events",
"polls": "Polls"
},
"create": {
"backlink": "Retour",
"title": "Créer un cercle",
"labelStatus": "Statut du cercle",
"labelName": "Nom du cercle *",
"labelDescription": "Sous-titre du cercle *",
"buttonSubmit": "Enregistrer"
},
"edit": {
"buttonDelete": "Retirer",
"backlink": "Retour",
"title": "Modifie ton cercle",
"labelStatus": "Statut du cercle",
"labelName": "Nom du cercle *",
"labelOwner": "Administrateur ou administratrice *",
"labelDescription": "Sous-titre du cercle *",
"subTitle": "Liste des membres :",
"tableHeader1": "Nom",
"tableHeader2": "Accès",
"buttonSubmit": "Enregistrer",
"buttonAddMember": "Ajouter un membre"
},
"list": {
"title": "Administration",
"buttonMobile": "MENU",
"subTitle": "Cercles",
"buttonCreate": "Créer un cercle",
"tableHeader1": "Nom",
"tableHeader2": "Administrateurs",
"tableHeader3": "Rejoindre",
"buttonQuit": "Quitter",
"buttonJoin": "Rejoindre"
},
"left": {
"paragraphQuit": "Tu as quitté ce cercle.",
"paragraphJoin": "Pour le rejoindre à nouveau, rends-toi dans le panneau",
"paragraphContact": "ou contacte un administrateur.",
"admin": "d'administration"
},
"profile": {
"creationDate": "Date de création : ",
"buttonModify": "Modifier et ajouter un membre",
"buttonAdd": "Ajouter un membre",
"buttonDelete": "Supprimer le cercle",
"buttonQuit": "Quitter le cercle",
"buttonJoin": "Rejoindre le cercle",
"subTitle": "Membres :"
}
},
"communities": {
"title": "Administration",
"menuMobile": "MENU",
"linkInvite": "Inviter un nouvel utilisateur",
"noPermission": "Membre, aucune permission",
"subTitle": "Communautés",
"tableHeader1": "Nom",
"tableHeader2": "Action"
},
"project": {
"menuRight": {
"buttonMobile": "MENU",
"fold": "Replier le menu",
"chat": "Chat",
"information": "Information"
},
"create": {
"backlink": "Retour",
"title": "Créer un nouveau projet",
"labelName": "Nom du projet *",
"labelCustomer": "Nom du client*",
"labelCaptain": "Capitaine du projet*",
"buttonSubmit": "Enregistrer"
},
"edit": {
"buttonDelete": "Retirer",
"backlink": "Retour",
"title": "Modifie ton projet",
"labelName": "Nom du projet *",
"labelCustomer": "Nom du client *",
"subTitle": "Liste des membres :",
"tableHeader1": "Nom",
"tableHeader2": "Accès",
"buttonSubmit": "Enregistrer",
"buttonAddMember": "Ajouter un membre"
},
"modifyPicture": {
"backlink": "Retour",
"title": "Modifier l'image du projet"
},
"list": {
"title": "Administration",
"buttonMobile": "MENU",
"subTitle": "Projets",
"buttonCreate": "Créer un nouveau projet",
"tableHeader1": "Nom",
"tableHeader2": "Administrateurs",
"tableHeader3": "Capitaines",
"tableHeader4": "Rejoindre",
"buttonQuit": "Quitter",
"buttonJoin":"Rejoindre"
},
"left": {
"paragraphQuit": "Tu as quitté ce projet.",
"paragraphJoin": "Ceci est un projet privé. Pour le joindre à nouveau, rends-toi dans le panneau",
"paragraphContact": "et demande une invitation.",
"admin": "d'administration"
},
"profile": {
"creationDate": "Date de création : ",
"buttonModify": "Modifier et ajouter un membre",
"buttonAdd": "Ajouter un membre",
"buttonDelete": "Supprimer le projet",
"buttonQuit": "Quitter le projet",
"buttonJoin": "Rejoindre le projet",
"captain": "Capitaine :",
"subTitle": "Equipe :"
}
},
"user": {
"create": {
"backlink": "Retour",
"title": "Inviter un utilisateur à ",
"labelUsername": "Nom d'utilisateur*",
"labelUsernameTitle": "Caractères alphanumérique uniquement",
"labelEmail": "E-mail *",
"labelFirstname": "Prénom *",
"labelLastname": "Nom *",
"buttonSubmit": "Inviter"
}
},
"notification": {
"circle": {
"in": "dans"
},
"private": {
"private": "en privé"
}
},
"template-captain": {
"isLead": "Capitaine"
},
"hublStatus": {
"private": "Privé",
"public": "Public"
}
}

View File

@ -14,10 +14,13 @@ solid-widget(name='hubl-menu-publicprivate')
solid-widget(name='hubl-create')
template
p.create Tu ne fais partie d'aucun ${value}.
p.create
span(data-trans="menuLeft.emptyCircleProject.notPartOf")
span &nbsp;${value}.
br
| Pour en créer un nouveau, tu peux te rendre dans le
solid-link(next='admin') panneau d'administration
span(data-trans="menuLeft.emptyCircleProject.createNew")
span &nbsp;
solid-link(next="${value == 'projet' ? 'admin-projects' : 'admin-circles'}", data-trans="menuLeft.emptyCircleProject.adminPanel")
solid-widget(name='hubl-menu-fix-url-circle')
template
@ -53,32 +56,32 @@ solid-widget(name='hubl-menu-fix-url-project')
solid-router#navbar-router(default-route='dashboard')
if endpoints.dashboards || (endpoints.get && endpoints.get.dashboards)
solid-route.menu(name='dashboard')
div.menu-label Tableau de bord
div.menu-label(data-trans="menuLeft.dashboard")
div.menu-icon.icon-home
div.divider
if publicDirectory && (endpoints.users || (endpoints.get && endpoints.get.users))
solid-route.menu(name='members')
div.menu-label Annuaire des membres
div.menu-label(data-trans="menuLeft.profileDirectory")
div.menu-icon.icon-people
div.divider
if endpoints.joboffers || (endpoints.get && endpoints.get.joboffers)
solid-route.menu(name='job-offers', rdf-type='hd:joboffer')
div.menu-label Offres de mission
div.menu-label(data-trans="menuLeft.jobBoard")
div.menu-icon.icon-briefcase
div.divider
if endpoints.resources || (endpoints.get && endpoints.get.resources)
solid-route.menu(name='resources')
div.menu-label Ressources
div.menu-label(data-trans="menuLeft.resources")
div.menu-icon.icon-docs
div.divider
if endpoints.polls || (endpoints.get && endpoints.get.polls)
solid-route.menu(name='polls')
div.menu-label Gouvernance
div.menu-label(data-trans="menuLeft.gov")
div.menu-icon.icon-bubbles
div.divider
if endpoints.events || (endpoints.get && endpoints.get.events)
solid-route.menu(name='events')
div.menu-label Evènements
div.menu-label(data-trans="menuLeft.events")
div.menu-icon.icon-calendar
div.divider
if endpoints.projects || (endpoints.get && endpoints.get.projects)
@ -89,7 +92,7 @@ solid-router#navbar-router(default-route='dashboard')
div.menu-chevron
div.menu-icon.icon-arrow-up
//- div.menu-icon.icon-arrow-right-circle
div.menu-label Projets
div.menu-label(data-trans="menuLeft.projects")
div.menu-icon.icon-folder-alt
solid-route(name='project', rdf-type='hd:project', use-id='', hidden)
div.sub-menu.menu-notification
@ -104,7 +107,8 @@ solid-router#navbar-router(default-route='dashboard')
fields='project'
loader-id='loader-projects'
empty-widget='hubl-create'
empty-value='projet'
empty-value=''
data-trans="empty-value=menuLeft.emptyCircleProject.project"
widget-project='hubl-menu-fix-url-project'
order-by="project.customer.name"
)
@ -117,7 +121,7 @@ solid-router#navbar-router(default-route='dashboard')
div.menu-chevron
div.menu-icon.icon-arrow-up
//- div.menu-icon.icon-arrow-right-circle
div.menu-label Cercles
div.menu-label(data-trans="menuLeft.circles")
div.menu-icon.icon-folder-alt
solid-route(name='circle', rdf-type='hd:circle', use-id='', hidden)
div.sub-menu.menu-notification
@ -132,7 +136,8 @@ solid-router#navbar-router(default-route='dashboard')
fields='circle'
loader-id='loader-circles'
empty-widget='hubl-create'
empty-value='cercle'
empty-value=''
data-trans="empty-value=menuLeft.emptyCircleProject.circle"
widget-circle='hubl-menu-fix-url-circle'
order-by="circle.name"
)
@ -142,7 +147,7 @@ solid-router#navbar-router(default-route='dashboard')
div.menu
div.menu-chevron
div.menu-icon.icon-arrow-up
div.menu-label Messages
div.menu-label(data-trans="menuLeft.messages")
div.menu-icon.icon-envelope-letter
solid-route(name='messages', rdf-type='foaf:user', use-id='', hidden)
div.sub-menu.menu-notification
@ -156,7 +161,8 @@ solid-router#navbar-router(default-route='dashboard')
fields='name, chatProfile.jabberID, badge'
loader-id='loader-messages'
search-fields="name"
search-label-name="Rechercher..."
search-label-name=""
data-trans="search-label-name=menuLeft.search"
search-widget-name="hubl-search-users"
widget-name='solid-display-div'
widget-badge='hubl-counter'

View File

@ -1,17 +1,17 @@
.views-container
h2 A propos
h2(data-trans='about.title')
div.flex-content-white
div
div
h3 Cette application est développée par Startin'blox
p Startinblox est une coopérative qui développe des outils libres pour construire facilement et à moindre coût des applications fédérées et interopérables basées sur les derniers standards du web poussés par le projet SOLID.
p Sa mission est de redonner le pouvoir aux utilisateurs en leur permettant de reprendre la main sur leur outil numérique et de bénéficier dun effet de réseau au sein dun écosystème choisi afin de sémanciper des grandes plateformes.
h3(data-trans='about.card1.subTitle')
p(data-trans='about.card1.paragraph1')
p(data-trans='about.card1.paragraph2')
div
a(href="https://startinblox.com/fr/" target="_blank") https://startinblox.com/fr/
div
div
h3 Contacte-nous
p Tu veux contribuer, nous remonter un bug, nous suggérer une amélioration, travailler avec nous ?
h3(data-trans='about.card2.subTitle')
p(data-trans='about.card2.paragraph1')
div
a(href="https://startinblox.com/fr/#home-contact" target="_blank").main-cta Contact
a(href="https://startinblox.com/fr/#home-contact" target="_blank" data-trans='about.card2.link').main-cta

View File

@ -1,27 +1,27 @@
.views-container.sidebar-is-closed
if endpoints.circles || (endpoints.get && endpoints.get.circles)
#admin-circles(hidden)
#admin-circles(hidden, data-view="admin-circles")
include views/admin/page-admin-circles.pug
if endpoints.projects || (endpoints.get && endpoints.get.projects)
#admin-projects(hidden)
#admin-projects(hidden, data-view="admin-projects")
include views/admin/page-admin-projects.pug
if (endpoints.users || (endpoints.get && endpoints.get.users))
#admin-communities(hidden)
#admin-communities(hidden, data-view="admin-communities")
include views/admin/page-admin-communities.pug
nav.jsRightMenu(role='navigation')
solid-router(default-route='admin-circles')
ul
li.jsOffsiteToggle
a Replier le menu
a(data-trans='admin.menuRight.fold')
if (endpoints.users || (endpoints.get && endpoints.get.users))
solid-route(name='admin-communities')
li
a Communautés
a(data-trans='admin.menuRight.community')
if endpoints.circles || (endpoints.get && endpoints.get.circles)
solid-route(name='admin-circles')
li
a Cercles
a(data-trans='admin.menuRight.circles')
if endpoints.projects || (endpoints.get && endpoints.get.projects)
solid-route(name='admin-projects')
li
a Projets
a(data-trans='admin.menuRight.projects')

View File

@ -9,41 +9,41 @@
class-name='h1-like'
class-description='h1-aside description'
)
button.mobile-sidebar-button.jsMobileSidebarOpenButton.icon-arrow-left-circle MENU
button.mobile-sidebar-button.jsMobileSidebarOpenButton.icon-arrow-left-circle(data-trans='circle.menuRight.buttonMobile')
div.content-box__height
solid-ac-checker(permission='acl:Read', bind-resources)
#circle-chat(hidden)
#circle-chat(hidden, data-view="circle-chat")
include views/circle/page-circle-chat.pug
#circle-information.content-box__height(hidden)
#circle-information.content-box__height(hidden, data-view="circle-information")
include views/circle/page-circle-profile.pug
#circle-events(hidden)
#circle-events(hidden, data-view="circle-events")
include views/circle/page-circle-events.pug
#circle-resources(hidden)
#circle-resources(hidden, data-view="circle-resources")
include views/circle/page-circle-resources.pug
#circle-polls(hidden)
#circle-polls(hidden, data-view="circle-polls")
include views/circle/page-circle-polls.pug
nav.jsRightMenu(role='navigation')
solid-router(default-route='circle-chat')
ul
li.jsOffsiteToggle
a Replier le menu
a(data-trans='circle.menuRight.fold')
solid-route(name='circle-chat')
li
a Chat
a(data-trans='circle.menuRight.chat')
solid-route(name='circle-information')
li
a Information
a(data-trans='circle.menuRight.information')
if (endpoints.resources || (endpoints.get && endpoints.get.resources)) && (endpoints.resourceskeywords || (endpoints.get && endpoints.get.resourceskeywords)) && (endpoints.resourcestypes || (endpoints.get && endpoints.get.resourcestypes))
solid-route(name='circle-resources' use-id)
li
a Resources
a(data-trans='circle.menuRight.resources')
if (endpoints.events || (endpoints.get && endpoints.get.events)) && (endpoints.typeevents || (endpoints.get && endpoints.get.typeevents))
solid-route(name='circle-events' use-id)
li
a Events
a(data-trans='circle.menuRight.events')
if endpoints.polls || (endpoints.get && endpoints.get.polls)
solid-route(name='circle-polls' use-id)
li
a Polls
a(data-trans='circle.menuRight.polls')

View File

@ -1,5 +1,5 @@
.views-container
h1 Tableau de bord
h1(data-trans='dashboard.title')
solid-dashboard(
data-src=`${endpoints.dashboards || endpoints.get.dashboards}`
)

View File

@ -13,25 +13,25 @@
value-const-title1='N°'
)
button.mobile-sidebar-button.jsMobileSidebarOpenButton.icon-arrow-left-circle MENU
button.mobile-sidebar-button.jsMobileSidebarOpenButton.icon-arrow-left-circle(data-trans='project.menuRight.buttonMobile')
div.content-box__height
solid-ac-checker(permission='acl:Read', bind-resources)
#project-chat(hidden)
#project-chat(hidden, data-view="project-chat")
include views/project/page-project-chat.pug
#project-information.content-box__height(hidden)
#project-information.content-box__height(hidden, data-view="project-information")
include views/project/page-project-profile.pug
#project-picture(hidden)
#project-picture(hidden, data-view="project-picture")
include views/project/page-project-picture.pug
nav.jsRightMenu(role='navigation')
solid-router(default-route='project-chat')
ul
li.jsOffsiteToggle
a Replier le menu
a(data-trans='project.menuRight.fold')
solid-route(name='project-chat')
li
a Chat
a(data-trans='project.menuRight.chat')
solid-route(name='project-information')
li
a Information
a(data-trans='project.menuRight.information')
solid-route(name='project-picture' use-id)

View File

@ -0,0 +1,55 @@
document.addEventListener("DOMContentLoaded", () => {
const resizeChat = () => {
let chatBox = Array.from(document.querySelectorAll("solid-xmpp-chat"))
.map((el) => el.shadowRoot ? el.shadowRoot.getElementById("conversejs") : false)
.filter((el) => el)
.pop();
if (chatBox) {
let chatTextArea = chatBox.querySelector(".message-form-container");
let ischatTextArea = setInterval(() => {
chatTextArea = chatBox.querySelector(".message-form-container");
if (chatTextArea) {
clearInterval(ischatTextArea);
if (
chatBox.getBoundingClientRect().height -
chatTextArea.getBoundingClientRect().height !=
chatTextArea.offsetTop
) {
let viewportChat = Array.from(
document.querySelectorAll("#viewport .chat-view")
);
viewportChat.forEach(
(c) => (c.style.height = "calc(100vh - 106px - 57px - 4px)")
);
}
}
}, 15);
}
};
resizeChat();
let isbody = setInterval(() => {
if (document.body) {
clearInterval(isbody);
resizeChat();
}
}, 15);
window.addEventListener("load", () => {
setTimeout(() => {
resizeChat();
}, 0);
});
window.addEventListener("resize", () => {
setTimeout(() => {
resizeChat();
}, 0);
});
document.addEventListener("navigate", () => {
setTimeout(() => {
resizeChat();
}, 0);
});
});

198
src/scripts/intl.js Normal file
View File

@ -0,0 +1,198 @@
/*
js intl, inspired by danabr/jsI18n
*/
class JsI18n {
constructor() {
this.locale = ""; //Current locale
this.locales = new Array(); //Available locales
}
/*
Method for automatically detecting the language, does not work in every browser.
*/
detectLanguage() {
if (localStorage.getItem('language') || (window.navigator.language !== null && window.navigator.language !== undefined)) {
this.setLocale(localStorage.getItem('language') || window.navigator.language.slice(0, 2));
} else {
console.error('Language not found');
this.setLocale('fr');
}
};
/*
Translates tag contents and
attributes depending on the
value of key.
*/
translateTag(node, key) {
if (key.indexOf("=") == -1) { //Simple key
this.translateNodeContent(node, key);
} else { //Attribute/key pairs
var parts = key.split(";");
for (var i = 0; i < parts.length; i++) {
var pair = parts[i].split("=");
var attr = pair[0].toLowerCase().trim();
var k = pair[1].trim();
if (attr == "html") {
this.translateNodeContent(node, k);
} else {
if(node.tagName == "SOLID-DELETE") {
let button = node.querySelector('button');
if(button != null) {
this.translateNodeContent(button, k);
}
}
this.translateNodeContent(node.attributes[attr], k);
}
}
}
}
/**
Replace the content of the given node
if there is a translation for the given key.
**/
translateNodeContent(node, key) {
var translation = this.t(key);
if (node != null && translation != undefined) {
if (node.nodeType == 1) { //Element
try {
node.innerHTML = translation;
} catch (e) {
node.text = translation;
}
} else if (node.nodeType == 2) { //Attribute
node.value = translation;
}
}
}
/*
Helper for translating a node
and all its child nodes.
*/
processNode(node) {
if (node != undefined) {
if (node.nodeType == 1) { //Element node
var key = node.attributes["data-trans"];
if (key != null) {
this.translateTag(node, key.nodeValue);
}
}
//Process child nodes
var children = node.childNodes;
for (var i = 0; i < children.length; i++) {
this.processNode(children[i]);
}
}
}
/*
Adds a locale to the list,
replacing the translations
if the locale is already defined.
*/
addLocale(locale, translations) {
this.locales[locale.toString()] = translations;
}
/*
Sets the locale to use when translating.
*/
setLocale(locale) {
try {
fetch(`/locales/${locale}.json`).then((result) => {
if (result.ok) {
result.json().then(e => {
this.addLocale(locale, e);
this.processPage();
}).catch(() => {
if (locale != "fr") {
console.warn(`Locale not found: ${locale}, fallback to french`);
this.setLocale("fr");
} else {
console.error("Language not found");
}
});
} else {
if (locale != "fr") {
console.warn(`Locale not found: ${locale}, fallback to french`);
this.setLocale("fr");
} else {
console.error("Language not found");
}
}
});
this.locale = locale;
} catch {
if (locale != "fr") {
console.warn(`Locale not found: ${locale}, fallback to french`);
this.setLocale("fr");
} else {
console.error("Language not found");
}
}
}
/*
Fetches the translation associated with the given key.
*/
t(key) {
var translations = this.locales[this.locale];
if (translations != undefined) {
let translation = key.toString().split('.').reduce((o, i) => (o ? o[i] : undefined), translations);
if(typeof translation == "string") {
return translation;
} else {
return translations[key.toString()];
}
}
return undefined;
}
/*
Alias for JsI18n.t
*/
translate(key) {
this.t(key);
}
/**
Replaces the contents of all tags
that have the data-trans attribute set.
**/
processPage() {
this.processNode(document.getElementsByTagName("html")[0]);
}
}
//Global
jsI18n = new JsI18n;
document.addEventListener("DOMContentLoaded", () => {
// Detect the lang & initialize, based on the browser or "language" item from localstorage
jsI18n.detectLanguage();
/*
recursivePopulate(DOMElement)
Will listen for the populate event of any sib element
Process the changed node every time it populate
Recursively add a populate listener for children elements
*/
function recursivePopulate(element) {
Array.from(element.querySelectorAll('*')).forEach((e) => {
e.addEventListener("populate", (e) => {
recursivePopulate(e.target);
jsI18n.processNode(e.target);
});
});
}
// Process every children from document
recursivePopulate(document);
});

View File

@ -49,6 +49,9 @@
text-align: center;
vertical-align: middle;
}
solid-multiple[name="user.communities"] {
text-align: left;
}
}
}

View File

@ -11,5 +11,6 @@ solid-widget(name='hubl-captain')
class-is_lead='user-thumb__lead'
widget-account.picture='hubl-user-avatar'
value-is_lead='Capitaine'
value-is_lead=''
data-trans='value-is_lead=template-captain.isLead'
)

View File

@ -1,7 +1,7 @@
div.content-box__info.flex
solid-link(class="backlink right", next='admin-circle-list') Retour
solid-link(class="backlink right", next='admin-circle-list' data-trans='circle.create.backlink')
h1.centered Créer un cercle
h1.centered(data-trans='circle.create.title')
div#loader-circles-create.loader.loader-top
div
@ -22,13 +22,15 @@ div.content-box__info.flex
class-name='form-label is-light is-full-width input-text-like'
class-description='form-label is-light is-full-width input-text-like'
label-status='Statut du cercle'
label-name='Nom du cercle *'
label-description='Sous-titre du cercle *'
label-status=''
label-name=''
label-description=''
widget-status='hubl-status'
next='circle'
submit-button='Enregistrer'
submit-button=''
data-trans='label-status=circle.create.labelStatus;label-name=circle.create.labelName;label-description=circle.create.labelDescription;submit-button=circle.create.buttonSubmit'
)

View File

@ -5,12 +5,12 @@
solid-route(name='circle-left')
div.content-box__header.flex.space-between
h1.without-margin Administration
button.mobile-sidebar-button.jsMobileSidebarOpenButton.icon-arrow-left-circle MENU
h1.without-margin(data-trans='circle.list.title')
button.mobile-sidebar-button.jsMobileSidebarOpenButton.icon-arrow-left-circle(data-trans='circle.list.buttonMobile')
include ../circle/page-circle-left.pug
#admin-circle-list.content-box__height(hidden)
#admin-circle-list.content-box__height(hidden, data-view="admin-circle-list")
include ../../templates/hubl-user-avatar.pug
solid-widget(name='hubl-circle-owner')
@ -31,27 +31,29 @@
div.admin-header.flex
h3 Cercles
h3(data-trans='circle.list.subTitle')
solid-link(
class='button text-bold text-uppercase reversed button-primary bordered with-icon icon-plus'
next='admin-circle-create'
) Créer un cercle
solid-ac-checker(data-src=`${endpoints.circles || (endpoints.post && endpoints.post.circles)}`, permission='acl:Append')
solid-link(
class='button text-bold text-uppercase reversed button-primary bordered with-icon icon-plus'
next='admin-circle-create' data-trans='circle.list.buttonCreate'
)
.table-wrapper
.table
div.table-header.grey-color
div.w280 Nom
div.w280 Administrateurs
div.w280 Rejoindre
div.w280(data-trans='circle.list.tableHeader1')
div.w280(data-trans='circle.list.tableHeader2')
div.w280(data-trans='circle.list.tableHeader3')
solid-widget(name='hubl-admin-circle-leave-button')
template
solid-delete(
class='circle-leave button text-bold text-uppercase reversed button-secondary bordered with-icon icon-close'
data-src="${src}"
data-label='Quitter'
data-label=''
data-trans='data-label=circle.list.buttonQuit'
)
hubl-reactivity(data-src=`${endpoints.circles || endpoints.get.circles}` target-src='${src}')
hubl-reactivity(data-src=`${endpoints.circles || endpoints.get.circles}joinable/` target-src='${src}')
@ -89,6 +91,7 @@
widget-user.username='solid-form-hidden'
submit-button='Rejoindre'
data-trans='submit-button=circle.list.buttonJoin'
)
hubl-reactivity(data-src=`${endpoints.circles || endpoints.get.circles}` target-src='${value}')
hubl-reactivity(data-src=`${endpoints.circles || endpoints.get.circles}joinable/` target-src='${value}')
@ -120,5 +123,5 @@
div
div
#admin-circle-create.content-box__height(hidden)
#admin-circle-create.content-box__height(hidden, data-view="admin-circle-create")
include page-admin-circles-create.pug

View File

@ -4,8 +4,8 @@
solid-route(name='admin-users-create', use-id)
div.content-box__header.flex.space-between
h1.without-margin Administration
button.mobile-sidebar-button.jsMobileSidebarOpenButton.icon-arrow-left-circle MENU
h1.without-margin(data-trans='communities.title')
button.mobile-sidebar-button.jsMobileSidebarOpenButton.icon-arrow-left-circle(data-trans='communities.menuMobile')
solid-widget(name='hubl-action-community')
template
@ -14,20 +14,21 @@
class='button text-bold text-uppercase reversed button-primary bordered with-icon icon-plus'
data-src="${value}"
next="admin-users-create"
) Inviter un nouvel utilisateur
data-trans='communities.linkInvite'
)
solid-ac-checker(data-src="${value}", nested-field="members", no-permission='acl:Append')
div.button.text-bold.text-uppercase.button-disabled Membre, aucune permission
div.button.text-bold.text-uppercase.button-disabled(data-trans='communities.noPermission')
#admin-communities-list.content-box__height(hidden)
#admin-communities-list.content-box__height(hidden, data-view="admin-communities-list")
div.content-box__info.flex
div.admin-header.flex
h3 Communautés
h3(data-trans='communities.subTitle')
.table-wrapper
.table
div.table-header.grey-color
div.w450 Nom
div.w370 Action
div.w450(data-trans='communities.tableHeader1')
div.w370(data-trans='communities.tableHeader2')
solid-display(
class='table-body'
@ -49,5 +50,5 @@
div
div
#admin-users-create.content-box__height(hidden)
#admin-users-create.content-box__height(hidden, data-view="admin-users-create")
include page-admin-users-create.pug

View File

@ -1,7 +1,7 @@
div.content-box__info.flex
solid-link(class="backlink right" next='admin-project-list') Retour
solid-link(class="backlink right" next='admin-project-list' data-trans='project.create.backlink')
h1.centered Créer un nouveau projet
h1.centered(data-trans='project.create.title')
div#loader-projects-create.loader.loader-top
div
@ -19,18 +19,18 @@ div.content-box__info.flex
required-captain
loader-id='loader-projects-create'
label-status='Statut du cercle*'
label-status=''
widget-status='solid-form-hidden'
class-status='form-label is-light is-full-width'
value-status="Private"
label-customer.name='Nom du client*'
label-customer.name=''
class-customer.name='form-label is-light is-half-width input-text-like'
label-name='Nom du projet*'
label-name=''
class-name='form-label is-light is-half-width input-text-like'
label-captain='Capitaine du projet*'
label-captain=''
range-captain=`${endpoints.users || endpoints.get.users}`
class-captain='form-label is-light is-half-width'
widget-captain='solid-form-dropdown-autocompletion-label'
@ -39,5 +39,7 @@ div.content-box__info.flex
next='project'
submit-button='Enregistrer'
submit-button=''
data-trans='label-status=project.create.labelStatus;label-customer.name=project.create.labelCustomer;label-name=project.create.labelName;label-captain=project.create.labelCaptain;submit-button=project.create.buttonSubmit'
)

View File

@ -5,37 +5,40 @@
solid-route(name='project-left')
div.content-box__header.flex.space-between
h1.without-margin Administration
button.mobile-sidebar-button.jsMobileSidebarOpenButton.icon-arrow-left-circle MENU
h1.without-margin(data-trans='project.list.title')
button.mobile-sidebar-button.jsMobileSidebarOpenButton.icon-arrow-left-circle(data-trans='project.list.buttonMobile')
#project-left(hidden)
#project-left(hidden, data-view="project-left")
include ../project/page-project-left.pug
#admin-project-list.content-box__height(hidden)
#admin-project-list.content-box__height(hidden, data-view="admin-project-list")
include ../../templates/hubl-user-avatar.pug
div.content-box__info.flex
div.admin-header.flex
h3 Projets
solid-link(
class='button text-bold text-uppercase reversed button-primary bordered with-icon icon-plus'
next='admin-project-create'
) Créer un nouveau projet
h3(data-trans='project.list.subTitle')
solid-ac-checker(data-src=`${endpoints.projects || (endpoints.post && endpoints.post.projects)}`, permission='acl:Append')
solid-link(
class='button text-bold text-uppercase reversed button-primary bordered with-icon icon-plus'
next='admin-project-create'
data-trans='project.list.buttonCreate'
)
.table-wrapper
.table
div.table-header.grey-color
div.w280 Nom
div.w280 Administrateurs
div.w280 Capitaines
div.w230 Rejoindre
div.w280(data-trans='project.list.tableHeader1')
div.w280(data-trans='project.list.tableHeader2')
div.w280(data-trans='project.list.tableHeader3')
div.w230(data-trans='project.list.tableHeader4')
solid-widget(name="hubl-admin-project-leave-button")
template
solid-delete(
class='button text-bold text-uppercase reversed button-secondary bordered with-icon icon-close'
data-src="${src}"
data-label='Quitter'
data-label=''
data-trans='data-label=project.list.buttonQuit'
)
hubl-reactivity(data-src=`${endpoints.projects || endpoints.get.projects}` target-src='${src}')
hubl-reactivity(data-src=`${endpoints.projects || endpoints.get.projects}joinable/` target-src='${src}')
@ -73,7 +76,8 @@
solid-delete(
class='button text-bold text-uppercase reversed button-secondary bordered with-icon icon-close'
data-src="${src}"
data-label='Quitter'
data-label=''
data-trans='data-label=project.list.buttonQuit'
)
solid-display(
@ -108,7 +112,8 @@
value-user.username='hubl-workaround-493'
widget-user.username='solid-form-hidden'
submit-button='Rejoindre'
submit-button=''
data-trans='submit-button=project.list.buttonJoin'
)
hubl-reactivity(data-src=`${endpoints.projects || endpoints.get.projects}` target-src='${src}')
hubl-reactivity(data-src=`${endpoints.projects || endpoints.get.projects}joinable/` target-src='${src}')
@ -144,5 +149,5 @@
div
div
#admin-project-create(hidden)
include page-admin-projects-create.pug
#admin-project-create(hidden, data-view="admin-project-create")
include page-admin-projects-create.pug

View File

@ -1,10 +1,11 @@
div.content-box__info.flex
solid-link(class='backlink right', next='admin-communities-list') Retour
solid-link(class='backlink right', next='admin-communities-list' data-trans='user.create.backlink')
solid-display.h1-like.centered(
bind-resources
fields='text, name'
value-text="Inviter un utilisateur à "
value-text=''
data-trans='value-text=user.create.title'
loader-id='loader-users-title'
)
@ -22,13 +23,13 @@ div.content-box__info.flex
solid-widget(name='hubl-username-field')
template
label Nom d'utilisateur*
input(type="text" title='Caractères alphanumérique uniquement' pattern="[a-zA-Z0-9]+" label="Nom d'utilisateur *" name="username" required value="\${value}" data-holder)
label(data-trans='user.create.labelUsername')
input(type="text" title='' pattern="[a-zA-Z0-9]+" label="" data-trans='title=user.create.labelUsernameTitle;label=user.create.labelUsername' name="username" required value="\${value}" data-holder)
solid-widget(name='hubl-email-field')
template
label E-mail *
input(type="email" label="E-mail *" name="email" required value="\${value}" data-holder)
label(data-trans='user.create.labelEmail')
input(type="email" label='' data-trans='label=user.create.labelEmail' name="email" required value="\${value}" data-holder)
solid-form.form.button-register#selected-community(
bind-resources
@ -46,10 +47,10 @@ div.content-box__info.flex
class-user.username='form-label is-light is-half-width input-text-like'
class-user.email='form-label is-light is-half-width input-text-like'
label-user.first_name='Prénom *'
label-user.last_name='Nom *'
label-user.username='Nom d\'utilisateur *'
label-user.email='E-mail *'
label-user.first_name=''
label-user.last_name=''
label-user.username=''
label-user.email=''
value-user.password=''
widget-user.password='solid-form-hidden'
@ -59,5 +60,6 @@ div.content-box__info.flex
next='admin-communities-list'
submit-button='Inviter'
submit-button=''
data-trans='label-user.first_name=user.create.labelFirstname;label-user.last_name=user.create.labelLastname;label-user.username=user.create.labelUsername;label-user.email=user.create.labelEmail;submit-button=user.create.buttonSubmit'
)

View File

@ -8,13 +8,14 @@ div.content-box__info
solid-delete(
class='button text-bold text-uppercase reversed button-secondary bordered with-icon icon-close'
data-src="${src}"
data-label='Retirer'
data-label=''
data-trans='data-label=circle.edit.buttonDelete'
)
solid-link(class="backlink right", bind-resources, next='circle-profile') Retour
solid-link(class="backlink right", bind-resources, next='circle-profile' data-trans='circle.edit.backlink')
solid-ac-checker(permission='acl:Write', bind-resources)
h1 Modifie ton cercle
h1(data-trans='circle.edit.title')
div#loader-circle-edit.loader.loader-top
div
@ -32,12 +33,12 @@ div.content-box__info
required-description
range-owner=`${endpoints.users || endpoints.get.users}`
label-status='Statut du cercle'
label-status=''
widget-status='hubl-status'
label-name='Nom du cercle *'
label-owner='Administrateur ou administratrice *'
label-description='Sous-titre du cercle *'
label-name=''
label-owner=''
label-description=''
class-name='form-label is-light is-half-width input-text-like'
class-owner='form-label is-light is-half-width member-select color'
@ -50,9 +51,11 @@ div.content-box__info
submit-button='Enregistrer'
next='circle-information'
data-trans='label-name=circle.edit.labelStatus;label-name=circle.edit.labelName;label-owner=circle.edit.labelOwner;label-description=circle.edit.labelDescription;submit-button=circle.edit.buttonSubmit'
)
h2 Liste des membres :
h2(data-trans='circle.edit.subTitle')
solid-ac-checker(permission='acl:Append', bind-resources, nested-field='members')
solid-form.block.select-add(
@ -64,14 +67,15 @@ div.content-box__info
class-user='team'
widget-user='solid-form-dropdown-autocompletion'
submit-button='Ajouter un membre'
submit-button=''
data-trans='submit-button=circle.edit.buttonAddMember'
)
.table-wrapper
.table
div.table-header.grey-color
div.w280 Nom
div.w162 Accès
div.w280(data-trans='circle.edit.tableHeader1')
div.w162(data-trans='circle.edit.tableHeader2')
solid-display(
class='table-body'

View File

@ -1,5 +1,10 @@
#circle-left(hidden)
#circle-left(hidden, data-view="circle-left")
div.content-box__info.flex(style="padding: 15px")
p Tu as quitté ce cercle.
p Pour le rejoindre à nouveau, rends-toi dans le panneau <solid-link next="admin-circle-list">administration</solid-link> ou contacte un administrateur.
p(data-trans='circle.left.paragraphQuit')
p
span(data-trans='circle.left.paragraphJoin')
span &nbsp;
solid-link(next="admin-circle-list" data-trans='circle.left.admin')
span &nbsp;
span(data-trans='circle.left.paragraphContact')

View File

@ -2,7 +2,7 @@ solid-router(default-route='circle-profile', hidden)
solid-route(name='circle-profile')
solid-route(name='circle-edit')
#circle-profile(hidden)
#circle-profile(hidden, data-view="circle-profile")
solid-widget(name='hubl-circle-team-contact')
template
@ -24,15 +24,16 @@ solid-router(default-route='circle-profile', hidden)
class-title='word-spacing-right'
value-title='Date de création : '
value-title=''
data-trans='value-title=circle.profile.creationDate'
widget-creationDate='solid-display-value-date'
)
solid-ac-checker(permission='acl:Append', bind-resources, nested-field='members')
solid-ac-checker(permission='acl:Delete', bind-resources)
solid-link(class='button mobile-full-width text-bold text-uppercase reversed button-primary bordered with-icon icon-pencil' next='circle-edit' bind-resources) Modifier et ajouter un membre
solid-link(class='button mobile-full-width text-bold text-uppercase reversed button-primary bordered with-icon icon-pencil' next='circle-edit' bind-resources data-trans='circle.profile.buttonModify')
solid-ac-checker(no-permission='acl:Delete', bind-resources)
solid-link(class='button mobile-full-width text-bold text-uppercase reversed button-primary bordered with-icon icon-pencil' next='circle-edit' bind-resources) Ajouter un membre
solid-link(class='button mobile-full-width text-bold text-uppercase reversed button-primary bordered with-icon icon-pencil' next='circle-edit' bind-resources data-trans='circle.profile.buttonAdd')
div.flex.desktop-button__end
@ -40,7 +41,8 @@ solid-router(default-route='circle-profile', hidden)
solid-delete(
class='button mobile-full-width text-bold text-uppercase button-primary bordered with-icon icon-trash'
bind-resources
data-label='Supprimer le cercle'
data-label=''
data-trans='data-label=circle.profile.buttonDelete'
next='admin-circles'
)
@ -50,7 +52,8 @@ solid-router(default-route='circle-profile', hidden)
solid-delete(
class='button mobile-full-width desktop-btn-margin__left text-bold text-uppercase reversed button-secondary bordered with-icon icon-close'
data-src="${src}"
data-label='Quitter le cercle'
data-label=''
data-trans='data-label=circle.profile.buttonQuit'
next='circle-left'
)
@ -65,7 +68,8 @@ solid-router(default-route='circle-profile', hidden)
value-user.username='hubl-workaround-493'
widget-user.username='solid-form-hidden'
submit-button='Rejoindre le cercle'
submit-button=''
data-trans='submit-button=circle.profile.buttonJoin'
)
solid-display(
@ -82,7 +86,7 @@ solid-router(default-route='circle-profile', hidden)
hubl-inherit-user-id="search-value-user"
)
h2 Membres :
h2(data-trans='circle.profile.subTitle')
solid-widget(name='hubl-circle-user-admin')
template ${value ? "Administrateur" : ""}
@ -109,5 +113,5 @@ solid-router(default-route='circle-profile', hidden)
)
#circle-edit.content-box__height(hidden)
#circle-edit.content-box__height(hidden, data-view="circle-edit")
include page-circle-edit.pug

View File

@ -4,7 +4,8 @@ solid-notifications-template(data-rdf-type='hd:circle')
| ${await author['account.foaf:depiction'] ? `<img src="${await author['account.foaf:depiction']}" style="max-width:100%; max-height: 100%;" />` : `<object type="image/svg+xml" data="/images/alien.svg"></object>`}
.solid-notification__content
.solid-notification__title ${await author.name}
span.solid-notification__title__side dans
span.solid-notification__title__side
span(data-trans='notification.circle.in')
span.solid-notification__title__icon ${(await object.status) == 'Public' ? '#' : ''}
| ${await object.name}
p.solid-notification__summary ${summary}

View File

@ -4,5 +4,5 @@ solid-notifications-template(data-rdf-type='foaf:user')
| ${await author['account.foaf:depiction'] ? `<img src="${await author['account.foaf:depiction']}" style="max-width:100%; max-height: 100%;" />` : `<object type="image/svg+xml" data="/images/alien.svg"></object>`}
.solid-notification__content
.solid-notification__title ${await author.name}
span.solid-notification__title__side en privé
span.solid-notification__title__side(data-trans='notification.private.private')
p.solid-notification__summary ${summary}

View File

@ -8,13 +8,14 @@ div.content-box__info
solid-delete(
class='button text-bold text-uppercase reversed button-secondary bordered with-icon icon-close'
data-src="${src}"
data-label='Retirer'
data-label=''
data-trans='data-label=project.edit.buttonDelete'
)
solid-link(class='backlink right', bind-resources, next='project-profile') Retour
solid-link(class='backlink right', bind-resources, next='project-profile' data-trans='project.edit.backlink')
solid-ac-checker(permission='acl:Write', bind-resources)
h1 Modifie ton projet
h1(data-trans='project.edit.title')
div#loader-project-edit.loader.loader-top
div
@ -29,20 +30,21 @@ div.content-box__info
required-customer.name
required-name
label-name='Nom du projet*'
label-name=''
class-name='form-label is-light is-half-width input-text-like'
label-customer.name='Nom du client*'
label-customer.name=''
class-customer.name='form-label is-light is-half-width input-text-like'
partial=""
submit-button='Enregistrer'
next='project-information'
data-trans='label-name=project.edit.labelName;label-customer.name=project.edit.labelCustomer;submit-button=project.edit.buttonSubmit'
)
h2 Liste des membres :
h2(data-trans='project.edit.subTitle')
solid-ac-checker(permission='acl:Append', bind-resources, nested-field='members')
solid-form.block.select-add(
@ -55,14 +57,15 @@ div.content-box__info
label-user=''
widget-user='solid-form-dropdown-autocompletion'
submit-button='Ajouter un membre'
submit-button=''
data-trans='submit-button=project.edit.buttonAddMember'
)
.table-wrapper
.table
div.table-header.grey-color
div.w280 Nom
div.w162 Accès
div.w280(data-trans='project.edit.tableHeader1')
div.w162(data-trans='project.edit.tableHeader2')
//-class='table-body'
solid-display(

View File

@ -1,5 +1,10 @@
#project-left
div.content-box__info.flex(style="padding: 15px")
p Tu as quitté ce projet.
p Ceci est un projet privé. Pour le rejoindre, rends-toi dans le panneau <solid-link next="admin-project-list">administration</solid-link> et demande une invitation.
p(data-trans='circle.left.paragraphQuit')
p
span(data-trans='project.left.paragraphJoin')
span &nbsp;
solid-link(next="admin-project-list" data-trans='project.left.admin')
span &nbsp;
span(data-trans='project.left.paragraphContact')

View File

@ -1,8 +1,8 @@
div.content-box__info
solid-link(class='backlink right', bind-resources, next='project-edit') Retour
solid-link(class='backlink right', bind-resources, next='project-edit' data-trans='project.modifyPicture.backlink')
h1 Modifier l'image du projet
h1(data-trans='project.modifyPicture.title')
solid-picture.project-edit-picture(
bind-resources

View File

@ -2,7 +2,7 @@ solid-router(default-route='project-profile', hidden)
solid-route(name='project-profile')
solid-route(name='project-edit')
#project-profile(hidden)
#project-profile(hidden, data-view="project-profile")
include ../../templates/hubl-captain.pug
solid-widget(name='hubl-project-team-contact')
@ -25,22 +25,24 @@ solid-router(default-route='project-profile', hidden)
class-title='word-spacing-right'
value-title='Date de création : '
value-title=''
data-trans='value-title=project.profile.creationDate'
widget-creationDate='solid-display-value-date'
)
solid-ac-checker(permission='acl:Append', bind-resources, nested-field='members')
solid-ac-checker(permission='acl:Delete', bind-resources)
solid-link(class='button mobile-full-width text-bold text-uppercase reversed button-primary bordered with-icon icon-pencil' next='project-edit' bind-resources) Modifier et ajouter un membre
solid-link(class='button mobile-full-width text-bold text-uppercase reversed button-primary bordered with-icon icon-pencil' next='project-edit' bind-resources data-trans='project.profile.buttonModify')
solid-ac-checker(no-permission='acl:Delete', bind-resources)
solid-link(class='button mobile-full-width text-bold text-uppercase reversed button-primary bordered with-icon icon-pencil' next='project-edit' bind-resources) Ajouter un membre
solid-link(class='button mobile-full-width text-bold text-uppercase reversed button-primary bordered with-icon icon-pencil' next='project-edit' bind-resources data-trans='project.profile.buttonAdd')
div.flex.desktop-button__end
solid-ac-checker(permission='acl:Delete', bind-resources)
solid-delete(
class='button mobile-full-width text-bold text-uppercase button-primary bordered with-icon icon-trash'
bind-resources
data-label='Supprimer le projet'
data-label=''
data-trans='data-label=project.profile.buttonDelete'
next='admin-projects'
)
@ -49,7 +51,8 @@ solid-router(default-route='project-profile', hidden)
solid-delete(
class='button mobile-full-width desktop-btn-margin__left text-bold text-uppercase reversed button-secondary bordered with-icon icon-close'
data-src="${src}"
data-label='Quitter le projet'
data-label=''
data-trans='data-label=project.profile.buttonQuit'
next='project-left'
)
@ -74,14 +77,15 @@ solid-router(default-route='project-profile', hidden)
bind-resources
fields='label-captain, captain'
value-label-captain='Capitaine :'
value-label-captain=''
data-trans='value-label-captain=project.profile.captain',
class-label-captain='h2-like'
widget-captain='hubl-captain'
)
br
h2 Equipe :
h2(data-trans:'project.profile.subTitle')
solid-widget(name='hubl-project-user-admin')
template ${value ? "Administrateur" : ""}
@ -107,5 +111,5 @@ solid-router(default-route='project-profile', hidden)
widget-is_admin='hubl-project-user-admin'
)
#project-edit.content-box__height(hidden)
#project-edit.content-box__height(hidden, data-view="project-edit")
include page-project-edit.pug