Merge branch 'master' of https://git.startinblox.com/applications/hubl into feature/resource-component

This commit is contained in:
Marjolaine Le Bon 2020-12-02 14:48:34 +01:00
commit f86dff4081
112 changed files with 14045 additions and 2004 deletions

View File

@ -44,6 +44,7 @@ test:e2e:
before_script:
# install missing dependencies
- npm install -g sirv-cli
- npm install cypress-localstorage-commands
# making sure the process is orphan
- sirv dist --port 3000 > /dev/null 2>&1 &
script:
@ -99,6 +100,7 @@ test3:
script:
- echo "$APP_CONFIG_TEST3" > config.json
- echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
- sed -i -E 's/component-chat@([0-9]+).([0-9]+)/component-chat@beta/g' src/dependencies.pug
- npm run build
- scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* test3@astral.startinblox.com:~/front/
only:
@ -553,42 +555,6 @@ apidays:
tags:
- deploy
ejp:
stage: deployment
environment:
name: ejp
url: https://ejp.hubl.world
before_script:
- npm ci --cache .npm --prefer-offline --only=production
script:
- echo "$APP_CONFIG_EJP" > config.json
- echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
- npm run build
- scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* georgetown-uni@astral.startinblox.com:~/front/
only:
- master
when: manual
tags:
- deploy
fichemetierfr:
stage: deployment
environment:
name: fichemetierfr
url: https://fichemetier.fr.hubl.world
before_script:
- npm ci --cache .npm --prefer-offline --only=production
script:
- echo "$APP_CONFIG_FICHEMETIERFR" > config.json
- echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
- npm run build
- scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* fichemetierfr@astral.startinblox.com:~/front/
only:
- master
when: manual
tags:
- deploy
toulouse:
stage: deployment
environment:
@ -606,3 +572,363 @@ toulouse:
when: manual
tags:
- deploy
lepool:
stage: deployment
environment:
name: lepool
url: https://lepool.hubl.world
before_script:
- npm ci --cache .npm --prefer-offline --only=production
script:
- echo "$APP_CONFIG_LEPOOL" > config.json
- echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
- npm run build
- scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* lepool@astral.startinblox.com:~/front/
only:
- master
when: manual
tags:
- deploy
cpe:
stage: deployment
environment:
name: cpe
url: https://cpe.hubl.world
before_script:
- npm ci --cache .npm --prefer-offline --only=production
script:
- echo "$APP_CONFIG_CPE" > config.json
- echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
- npm run build
- scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* cpe@astral.startinblox.com:~/front/
only:
- master
when: manual
tags:
- deploy
lescanumeriques:
stage: deployment
environment:
name: lescanumeriques
url: https://fichemetier.fr.hubl.world
before_script:
- npm ci --cache .npm --prefer-offline --only=production
script:
- echo "$APP_CONFIG_LESCANUMERIQUES" > config.json
- echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
- npm run build
- scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* lescanumeriques@astral.startinblox.com:~/front/
only:
- master
when: manual
tags:
- deploy
phares:
stage: deployment
environment:
name: phares
url: https://le.phares.hubl.world
before_script:
- npm ci --cache .npm --prefer-offline --only=production
script:
- echo "$APP_CONFIG_LE_PHARES" > config.json
- echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
- npm run build
- scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* phares@astral.startinblox.com:~/front/
only:
- master
when: manual
tags:
- deploy
esspace:
stage: deployment
environment:
name: esspace
url: https://ess.pace.hubl.world
before_script:
- npm ci --cache .npm --prefer-offline --only=production
script:
- echo "$APP_CONFIG_ESSPACE" > config.json
- echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
- npm run build
- scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* esspace@astral.startinblox.com:~/front/
only:
- master
when: manual
tags:
- deploy
grandecoco:
stage: deployment
environment:
name: grandecoco
url: https://la.grande.coco.hubl.world
before_script:
- npm ci --cache .npm --prefer-offline --only=production
script:
- echo "$APP_CONFIG_COCO" > config.json
- echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
- npm run build
- scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* grande-coco@astral.startinblox.com:~/front/
only:
- master
when: manual
tags:
- deploy
espaceimaginaire:
stage: deployment
environment:
name: espaceimaginaire
url: https://espace-imaginaire.hubl.world
before_script:
- npm ci --cache .npm --prefer-offline --only=production
script:
- echo "$APP_CONFIG_ESPACEIMAGINAIRE" > config.json
- echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
- npm run build
- scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* espace-imaginaire@astral.startinblox.com:~/front/
only:
- master
when: manual
tags:
- deploy
hallesciviques:
stage: deployment
environment:
name: hallesciviques
url: https://les.halles.civiques.hubl.world
before_script:
- npm ci --cache .npm --prefer-offline --only=production
script:
- echo "$APP_CONFIG_HALLES" > config.json
- echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
- npm run build
- scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* halles-civiques@astral.startinblox.com:~/front/
only:
- master
when: manual
tags:
- deploy
ctc:
stage: deployment
environment:
name: ctc
url: https://collectif.tansition.citoyenne.hubl.world
before_script:
- npm ci --cache .npm --prefer-offline --only=production
script:
- echo "$APP_CONFIG_CTC" > config.json
- echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
- npm run build
- scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* collectif-tansition-citoyenne@astral.startinblox.com:~/front/
only:
- master
when: manual
tags:
- deploy
studiossinguliers:
stage: deployment
environment:
name: studiossinguliers
url: https://studios-singuliers.hubl.world
before_script:
- npm ci --cache .npm --prefer-offline --only=production
script:
- echo "$APP_CONFIG_SINGULIER" > config.json
- echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
- npm run build
- scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* studios-singuliers@astral.startinblox.com:~/front/
only:
- master
when: manual
tags:
- deploy
apluscestmieux:
stage: deployment
environment:
name: apluscestmieux
url: https://apluscestmieux.hubl.world
before_script:
- npm ci --cache .npm --prefer-offline --only=production
script:
- echo "$APP_CONFIG_APLUS" > config.json
- echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
- npm run build
- scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* apluscestmieux@astral.startinblox.com:~/front/
only:
- master
when: manual
tags:
- deploy
projetlerepaire:
stage: deployment
environment:
name: projetlerepaire
url: https://projet.le.repaire.hubl.world
before_script:
- npm ci --cache .npm --prefer-offline --only=production
script:
- echo "$APP_CONFIG_LEREPAIRE" > config.json
- echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
- npm run build
- scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* projetlerepaire@astral.startinblox.com:~/front/
only:
- master
when: manual
tags:
- deploy
oxamyne:
stage: deployment
environment:
name: oxamyne
url: https://oxamyne.hubl.world
before_script:
- npm ci --cache .npm --prefer-offline --only=production
script:
- echo "$APP_CONFIG_OXAMYNE" > config.json
- echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
- npm run build
- scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* oxamyne@astral.startinblox.com:~/front/
only:
- master
when: manual
tags:
- deploy
laruchesaintgermain:
stage: deployment
environment:
name: laruchesaintgermain
url: https://la.ruche.saint-germain.hubl.world
before_script:
- npm ci --cache .npm --prefer-offline --only=production
script:
- echo "$APP_CONFIG_LARUCHE" > config.json
- echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
- npm run build
- scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* laruche-saint-germain@astral.startinblox.com:~/front/
only:
- master
when: manual
tags:
- deploy
artefacts:
stage: deployment
environment:
name: artefacts
url: https://artefacts.hubl.world
before_script:
- npm ci --cache .npm --prefer-offline --only=production
script:
- echo "$APP_CONFIG_ARTEFACTS" > config.json
- echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
- npm run build
- scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* artefacts@astral.startinblox.com:~/front/
only:
- master
when: manual
tags:
- deploy
lab01:
stage: deployment
environment:
name: lab01
url: https://le.lab01.hubl.world
before_script:
- npm ci --cache .npm --prefer-offline --only=production
script:
- echo "$APP_CONFIG_LAB01" > config.json
- echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
- npm run build
- scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* le-lab01@astral.startinblox.com:~/front/
only:
- master
when: manual
tags:
- deploy
makesense:
stage: deployment
environment:
name: makesense
url: https://makesense.hubl.world
before_script:
- npm ci --cache .npm --prefer-offline --only=production
script:
- echo "$APP_CONFIG_MAKESENSE" > config.json
- echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
- npm run build
- scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* makesense@astral.startinblox.com:~/front/
only:
- master
when: manual
tags:
- deploy
moulindepontru:
stage: deployment
environment:
name: moulindepontru
url: https://moulin.de.pont-ru.hubl.world
before_script:
- npm ci --cache .npm --prefer-offline --only=production
script:
- echo "$APP_CONFIG_MOULINPONTRU" > config.json
- echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
- npm run build
- scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* moulin-de-pont-ru@astral.startinblox.com:~/front/
only:
- master
when: manual
tags:
- deploy
latreso:
stage: deployment
environment:
name: latreso
url: https://la.treso.hubl.world
before_script:
- npm ci --cache .npm --prefer-offline --only=production
script:
- echo "$APP_CONFIG_LATRESO" > config.json
- echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
- npm run build
- scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* la-treso@astral.startinblox.com:~/front/
only:
- master
when: manual
tags:
- deploy
montpellier:
stage: deployment
environment:
name: montpellier
url: https://app.montpellier.happy-dev.fr
before_script:
- npm ci --cache .npm --prefer-offline --only=production
script:
- echo "$APP_CONFIG_MONTPELLIER" > config.json
- echo "$SSH_DEPLOY_KEY" | tr -d '\r' > gitlab.key && chmod 600 gitlab.key
- npm run build
- scp -i gitlab.key -o StrictHostKeyChecking=no -r dist/* montpellier@ssh-montpellier.happy-dev.fr:~/front/
only:
- master
when: manual
tags:
- deploy

View File

@ -1,28 +1,24 @@
/label ~BUG
# What's happening?
### What's happening?
Describe in a few words what's happening
*Describe in a few words what's happening*
## Steps to reproduce
### Steps to reproduce
*How one can reproduce the issue - this is very important*
How one can reproduce the issue - this is very important
1. Step 1
2. Step 2
3. Step 3
### Relevant logs and/or screenshots
## Relevant logs and/or screenshots
*If possible, please add a screenshot.*
If possible, please add a screenshot.
### Your Environment
## Your Environment
(Include relevant details about the environment you experienced the bug in)
* Browser name and version:
* Operating System and version (desktop or mobile):
/label ~BUG

View File

@ -1,16 +1,12 @@
## What needs to be done?
/label ~Feature request
# What needs to be done
## Technical details
*Are there any technical details worth mentioning?*
Are there any technical details worth mentioning?
## Test cases
*Describe here the tests needed in order to validate this feature*
Describe here the tests needed in order to validate this feature
1. Step 1
2. Step 2
@ -20,3 +16,5 @@
1. Link to user story in wiki
2. other related Gitlab issues
/label ~Feature request

View File

@ -1,40 +1,16 @@
/label ~"New Instance"
# Please fill all these info:
# Please fill all these info
## General info
- Name of the instance:
- Domain:
## Settings:
- Does the instance allow people to sign up? **Yes / No**
- Does the instance want new people to get a welcome email? **Yes / No**
## Federation:
- Which current instance should see this new instance data? **Please provide the info module by module and include the instance itself.**
- Do those current instances agree to share their public data with this new instance? **Yes / No**
Example:
- *Instance G is the new kid in town*
- *Instance G wants to only see their dashboard, but want to access the circles of A, B, C, D, E & F.*
- *Instance G wants to be able to chat with users from A, B, C, D, E & F.*
- *Instance G wants to be able to see A and B job offers*
Let's say every instances agree to this scenario, the issue should describe the following:
- Dashboard: G
- Circles: A, B, C, D, E, F & G
- Job offers: A, B, F, G
- Users: A, B, C, D, E, F & G
- Profile directory: A, B, C, D, E, F & G
- G agrees that any new instance can see their public data.
- Name of the instance:
- Domain: .hubl.world
## Cosmetics
- Logo:
- Favicon:
- 4 Colors:
- Logo:
- Favicon:
- 4 Colors:
/label ~"New Instance"

View File

@ -1,4 +1,4 @@
## Checklist
# Checklist
<!---
Please, make sure you have changed the topic and also
@ -12,8 +12,6 @@ I have done ...
- [ ] Tests for the changes have been added
- [ ] Docs have been added or updated
- [ ] I have assigned my architect to review this merge request
- [ ] I have checked how to create a [merge request]()
## Issues
@ -25,7 +23,6 @@ Format is: Closes #X or Refs #Y
Docs: https://docs.gitlab.com/ee/user/project/issues/closing_issues.html#via-merge-request
-->
## Time spent
<!---
@ -38,7 +35,6 @@ Docs: https://docs.gitlab.com/ee/workflow/time_tracking.html
/spend Xh
## Assignee
<!---
@ -49,7 +45,6 @@ Docs: https://docs.gitlab.com/ee/user/project/quick_actions.html
/assign
## Feedback
<!---
@ -57,5 +52,4 @@ Did you encounter any other problems you want to share with us?
Optional. Feel free to remove this section if you don't have any feedback.
-->
<!--- Thank you for you contribution! -->

View File

@ -10,23 +10,24 @@ These instructions will get you a copy of the project up and running on your loc
To install Hubl, you'll need:
* A Hubl Server (djangoldp>=0.7.11) with the appropriate modules
* A Prosody Server (with [appropriate modules](https://git.startinblox.com/infra/prosody-modules/)
* A [Hubl Server](https://git.startinblox.com/djangoldp-packages/server-manager/) (djangoldp>1)
* A [Prosody Server](https://prosody.im/) (with [appropriate modules](https://git.startinblox.com/infra/prosody-modules/))
* A SMTP Server (optional)
* NodeJS on your machine
Before diving in you have to check your Hubl Server supports the following LDP packages:
* djangoldp_account
* djangoldp_community
* djangoldp_notification
* djangoldp_profile
* djangoldp_skill
* djangoldp_uploader
* oidc_provider: 'git+https://github.com/jblemee/django-oidc-provider.git@develop'
* oidc_provider: django-webidoidc-provider
Those packages are given with the last stable version tested.
Refer to the [documentation to install a Hubl Server](https://git.startinblox.com/documentation/doc/wikis/devops/install_sib_server) with this configuration.
Refer to the [documentation to install a Hubl Server](https://docs.startinblox.com/import_documentation/install-sib-server.html) with this configuration.
## Build the application
@ -76,6 +77,8 @@ On `config.json`:
```json
{
"xmpp": "https://jabber.happy-dev.fr/http-bind/",
"clientName": "My local Hubl",
"clientLogo": "/images/logo.webp",
"authority": "http://localhost:8000/",
"endpoints": {
"skills": "http://server.url/skills/",
@ -87,9 +90,23 @@ On `config.json`:
Where:
* `clientName` is the name of your Hubl
* `clientLogo` is an URL to an image file
* `xmpp` is your [Prosody](https://prosody.im/) with [appropriate modules](https://git.startinblox.com/infra/prosody-modules/) configured on.
* `authority` is the OpenID Provider. Usually, if you use `djangoldp-account` it's the same as your djangoldp server.
* `endpoints.users` is the API endpoints for Users on your djangoldp server.
* `endpoints.users` is the API endpoints for Users on your djangoldp server. (djangoldp-account)
* `endpoints.skills` is the API endpoints for Skills on your djangoldp server. (djangoldp-skill)
* `endpoints.uploads` is the API endpoints for Uploads on your djangoldp server. (djangoldp-upload)
### Communities
Communities are mandatory to have an Hubl. If you're upgrading an existion Hubl, you can assign all your local users to a community this way:
```bash
./manage.py create_community --name="My community"
```
Don't forget to set some users as admin from the Django Admin if you want to allow them to create new users from app.
### Optional personalisation
@ -97,8 +114,8 @@ On `config.json`:
```json
"clientName": "Hubl",
"clientFavicon": "/images/favicon.png",
"clientLogo": "/images/logo.png",
"clientFavicon": "/images/favicon.webp",
"clientLogo": "/images/logo.webp",
"clientLogoHeight": "32px",
"clientCSS": "/path/to/custom.css",
"authorityName": "djangoldp-server-name"
@ -203,7 +220,7 @@ On `config.json`:
```json
"endpoints": {
"joboffers": "http://server.url/joboffers/",
"joboffers": "http://server.url/job-offers/",
"skills": "http://server.url/skills/",
"uploads": "http://server.url/upload/"
}

View File

@ -1,180 +0,0 @@
:root {
--color-primary: #063B5C;
--color-secondary: #3A3A3A;
--color-complementary: #C4262E;
--color-complementary-darken: #36383B;
--color-white: #FFFFFF;
--color-black-h: 216;
--color-black-s: 4%;
--color-black-l: 22%;
--color-main-background: var(--color-grey-13);
--color-main-text: #7A7F85;
--color-highlight-primary: var(--color-primary);
--color-user-panel: var(--color-black);
--color-bell: var(--color-secondary);
--color-avatar-background: #E4E8ED;
--color-title: #36383B;
--color-h1: var(--color-title);
--color-h2: var(--color-title);
/* Depreciated */
--color-tag-group-text: #9BA0A7;
--color-tag-group-border: var(--color-primary);
--color-label-dark: var(--color-grey-6);
/* Header's elements */
--color-header-background: var(--color-white);
--color-bell: var(--color-complementary-darken);
--color-user-panel-header-text: var(--color-complementary-darken);
--color-user-panel-header-background: var(--color-white);
--color-user-panel-header-text-open: var(--color-white);
--color-user-panel-header-background-open: var(--color-secondary);
--color-user-panel-list-background: var(--color-white);
--color-user-panel-list-text-hover: var(--color-complementary);
--color-user-panel-list-border: #E4E8ED;
/* Left menu */
--color-menu-highlight-primary:var(--color-white);
--color-menu-background: var(--color-secondary);
--color-menu-text: var(--color-white);
--color-menu-text-active: var(--color-complementary);
--color-menu-background-active: var(--color-menu-highlight-primary);
--color-menu-badge-background: var(--color-menu-highlight-primary);
--color-menu-badge-text-active: var(--color-menu-highlight-primary);
--color-menu-badge-background-active: var(--color-secondary);
--color-menu-icon-background-active: var(--color-secondary);
/* Right menu */
--color-right-menu-background: #e8e8e8;
--color-right-menu-text: #3c3F57;
--color-right-menu-link-border: #BDC2D7;
--color-right-menu-active-text: var(--color-white);
--color-right-menu-active-background: var(--color-complementary);
--color-right-menu-active-icon: var(--color-primary);
/* Scrollbar */
--color-scrollbar-right-background: var(--color-white);
--color-scrollbar-right-track: var(--color-grey-6);
--color-scrollbar-left-background: var(--color-secondary);
--color-scrollbar-left-track: var(--color-grey-11);
/* Tags */
--color-tag-admin-text: var(--color-complementary);
--color-tag-admin-border: var(--color-complementary);
/* Form elements */
--color-button-white: var(--color-white);
--color-button-primary: var(--color-primary);
--color-button-secondary: var(--color-complementary);
--color-button-complementary: var(--color-secondary);
--color-input-background: #EDF1FA;
--color-input-text: var(--color-secondary);
--color-input-icon: var(--color-complementary);
--color-input-active: var(--color-complementary);
--color-fieldset: var(--color-title);
--color-fieldset-border: #DAE2F3;
--color-button-modal: var(--color-title);
--color-select-list: var(--color-secondary);
--color-select-add-button: var(--color-button-secondary);
--color-select-add-button-background: var(--color-button-white);
--color-label-light: var(--color-grey-6);
/* Skill */
--color-skill-background: var(--color-primary);
--color-skill-text: var(--color-white);
/* Icon */
--color-icon: var(--color-primary);
/* Table */
--color-table-header-background: #BDC2D7;
--color-table-header-text: var(--color-white);
--color-table-border: #BDC2D7;
/* User thumb */
--color-user-thumb-name: #7A7F85;
--color-backlink: var(--color-secondary);
--color-content-header: #DAE2F3;
/* Chat */
--color-chat-white: var(--color-white);
--color-chat-primary: var(--color-primary);
--color-chat-complementary: var(--color-complementary);
--color-chat-secondary: var(--color-secondary);
--color-chat-complementary-darken: var(--color-complementary-darken);
--color-chat-grey-1: var(--color-grey-4);
--color-chat-grey-2: var(--color-grey-6);
--color-chat-grey-3: var(--color-grey-10);
/* Directory */
--color-directory-grey-4: #7A7F85;
--color-directory-grey-5: #F0F3F6;
--color-directory-avatar-background: #E4E8ED;
--color-directory-back-link: #36383B;
--color-directory-border: #DAE2F3;
--color-directory-content-header-border: #DAE2F3;
--color-directory-h1: var(--color-complementary-darken);
--color-directory-list-icon: var(--color-primary);
--color-directory-text: var(--color-directory-grey-4);
--color-directory-form-input: #EDF1FA;
--color-directory-form-input-text: var(--color-directory-grey-4);
--color-directory-form-input-active: var(--color-complementary);
--color-directory-form-select-icon: var(--color-complementary);
}
#main__menu {
font-family: "RefrigeratorDelxW01Bold";
}
#main__menu .menu {
font-size: 2rem;
}
#main__menu .unread {
font-weight: bold;
}
#main__menu .menu[active=""] {
color: var(--color-complementary);
}
#main__menu .sub-menu.menu-notification {
font-family: Facit;
}
#main__menu solid-router sib-route.menu, #main__menu sib-router sib-route.menu {
padding: 1.2rem 0;
}
#viewport .content-box {
font-family: Facit;
}
#viewport #circle .content-box__header solid-display div {
text-align: center;
}
#viewport #circle .content-box__header .h1-like {
font-family: "RefrigeratorDelxW01Bold";
font-size: 3.2rem;
color: var(--color-primary);
}
#viewport #circle .content-box__header solid-display div .h1-aside {
margin: 10px 0;
}
#viewport .with-sidebar nav > solid-router {
color: #3C3F57;
}
#viewport .with-sidebar nav > solid-router > ul > sib-route[active] {
background-color: var(--color-right-menu-active-background);
color: var(--color-right-menu-active-text);
display: inline-block;
}
@media (min-width: 992px) {
.content-box__height {
min-height: calc(100vh - 83px - 98px);
}
#viewport .chat-view {
height: calc(100vh - 84px - 98px);
}
}

View File

@ -1,6 +1,6 @@
:root {
--color-primary: pink;
--color-secondary: green;
--color-primary: #FFB700;
--color-secondary: #3C3F57;
--color-complementary: #6259E5;
--color-complementary-darken: #36383B;
--color-white: #FFFFFF;
@ -42,7 +42,7 @@
--color-user-panel-list-border: #E4E8ED;
/* Left menu */
--color-menu-highlight-primary: #000c42;
--color-menu-highlight-primary: #FFD759;
--color-menu-background: var(--color-secondary);
--color-menu-text: var(--color-white);
--color-menu-text-active: var(--color-secondary);
@ -144,6 +144,12 @@
--color-directory-form-select-icon: var(--color-complementary) !important;
}
/* Text color for the beta label */
#header>div.header-left>span.beta-tag {
color: var(--color-complementary);
}
/* Button to edit a channel or a project (in project-profile) */
#project solid-link[next="project-edit"],
#circle solid-link[next="circle-edit"] {

View File

@ -1,6 +1,8 @@
{
"xmpp": "https://jabber.happy-dev.fr/http-bind/",
"authority": "http://localhost:8000/",
"clientName": "Hubl",
"clientLogo": "https://cdn.startinblox.com/logos/hubl-logo.png",
"endpoints": {
"get": {
"skills": "http://localhost:8000/skills/",

View File

@ -2,6 +2,8 @@
"xmpp": "https://jabber.happy-dev.fr/http-bind/",
"authority": "http://localhost:8000/",
"authorityName": "djangoldp-server-name",
"clientName": "Hubl",
"clientLogo": "https://cdn.startinblox.com/logos/hubl-logo.png",
"endpoints": {
"groups": "http://localhost:8000/groups/",
"skills": "http://localhost:8000/skills/",

View File

@ -1,7 +1,8 @@
{
"baseUrl": "http://127.0.0.1:3000",
"defaultCommandTimeout": 60000,
"defaultCommandTimeout": 1000,
"chromeWebSecurity": false,
"viewportWidth": 1920,
"viewportHeight": 1080
"viewportHeight": 1080,
"video": false
}

54
cypress/README.md Normal file
View File

@ -0,0 +1,54 @@
## Users:
```
- signin
- signup
- create
- listing
- edit
// TO-FIX: Uncomment workaround (blocked by: nested routing bug)
```
## Job Offers:
```
- create
- edit
- listing
// TO-FIX: Search by title and description (blocked by: no search fields available)
- post
// TO-DO: Entire flow (blocked by: no published / unpublished flag)
```
## Channels:
```
- create
- edit
- leave
- retire
- delete
- join
// TO-DO: Join other user created project (blocked by: can't create new user to create a channel)
- invite
// TO-DO
```
## Projects:
```
- create
- edit
- leave
- retire
- delete
// TO-DO: Delete a project (blocked by: no option to delete a project)
- join
// TO-DO: Join other user created project (blocked by: can't create new user to create a project)
- invite
// TO-DO
```
## Breakdown:
```
DONE: 15
TO-FIX: 2
BLOCKED: 4
NOT DONE: 2
```

View File

@ -0,0 +1,4 @@
{
"username": "admin",
"password": "admin"
}

View File

@ -0,0 +1,116 @@
/// <reference types="Cypress" />
/* globals cy, expect */
context('Create Channel Browser Testing', () => {
before(() => {
cy.clearLocalStorageSnapshot();
cy.clearLocalStorage({ domain: null });
cy.clearCookies({ domain: null });
});
beforeEach(() => cy.restoreLocalStorage());
afterEach(() => cy.saveLocalStorage());
it('should visit user login screen', () => cy.userLogin());
it('should login', () => cy.login());
describe('Channel Creation process #1', () => {
let channelName = 'Test Channel ',
description = 'Test Description ';
it('should visit the channel creation screen', () => {
cy.visit('/admin/admin-circle-create');
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/admin/admin-circle-create');
});
});
it('should enter correct channel data', () => {
cy.randomNum().then(num => {
channelName += num;
description += num;
cy.get('#admin-circle-create input[name="name"]').clear().type(channelName);
cy.get('#admin-circle-create input[name="name"]').should('have.value', channelName);
cy.get('#admin-circle-create input[name="description"]').clear().type(description);
cy.get('#admin-circle-create input[name="description"]').should('have.value', description);
});
});
it('should click on create channel button', () => {
cy.get('#admin-circle-create input[type="submit"]').click();
});
it('should land on channels list screen', () => {
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/admin');
});
});
it('should land newly created channel on channels list screen', () => {
cy.contains('solid-display-value[name="circle.name"]', channelName).should("exist");
cy.fixture('admin.json').then(admin => {
cy.contains('solid-display-value[name="username"]', admin.username).should("exist");
});
});
});
describe('Channel Creation process #2', () => {
let channelName = 'Test Channel ',
description = 'Test Description ';
it('should visit the channel creation screen', () => {
cy.visit('/admin/admin-circle-create');
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/admin/admin-circle-create');
});
});
it('should enter correct channel data', () => {
cy.randomNum().then(num => {
channelName += num;
description += num;
cy.get('#admin-circle-create input[name="name"]').clear().type(channelName);
cy.get('#admin-circle-create input[name="name"]').should('have.value', channelName);
cy.get('#admin-circle-create input[name="description"]').clear().type(description);
cy.get('#admin-circle-create input[name="description"]').should('have.value', description);
});
});
it('should click on create channel button', () => {
cy.get('#admin-circle-create input[type="submit"]').click();
});
it('should land on channels list screen', () => {
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/admin');
});
});
it('should land newly created channel on channels list screen', () => {
cy.contains('solid-display-value[name="circle.name"]', channelName).should("exist");
cy.fixture('admin.json').then(admin => {
cy.contains('solid-display-value[name="username"]', admin.username).should("exist");
});
});
});
describe('Channel Creation process #3', () => {
let channelName = 'Test Channel ',
description = 'Test Description ';
it('should visit the channel creation screen', () => {
cy.visit('/admin/admin-circle-create');
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/admin/admin-circle-create');
});
});
it('should enter correct channel data', () => {
cy.randomNum().then(num => {
channelName += num;
description += num;
cy.get('#admin-circle-create input[name="name"]').clear().type(channelName);
cy.get('#admin-circle-create input[name="name"]').should('have.value', channelName);
cy.get('#admin-circle-create input[name="description"]').clear().type(description);
cy.get('#admin-circle-create input[name="description"]').should('have.value', description);
});
});
it('should click on create channel button', () => {
cy.get('#admin-circle-create input[type="submit"]').click();
});
it('should land on channels list screen', () => {
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/admin');
});
});
it('should land newly created channel on channels list screen', () => {
cy.contains('solid-display-value[name="circle.name"]', channelName).should("exist");
cy.fixture('admin.json').then(admin => {
cy.contains('solid-display-value[name="username"]', admin.username).should("exist");
});
});
});
});

View File

@ -0,0 +1,52 @@
/// <reference types="Cypress" />
/* globals cy, expect */
context('Create Job Offer Browser Testing', () => {
let jobDate = '',
jobTitle = 'Test Job Offer ',
description = 'Test Description ';
before(() => {
cy.nextYear(1).then(year => {
jobDate = year + '-12-31';
});
cy.randomNum().then(num => {
jobTitle += num;
description += num;
});
cy.clearLocalStorageSnapshot();
cy.clearLocalStorage({ domain: null });
cy.clearCookies({ domain: null });
});
beforeEach(() => cy.restoreLocalStorage());
afterEach(() => cy.saveLocalStorage());
it('should visit user login screen', () => cy.userLogin());
it('should login', () => cy.login());
describe('Job Offer Creation process', () => {
it('should visit the job offer creation screen', () => {
cy.visit('/job-offers/job-offers-create');
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/job-offers/job-offers-create');
});
});
it('should enter correct job offer data', () => {
cy.get('#job-offers-create input[name="closingDate"]').clear().type(jobDate);
cy.get('#job-offers-create input[name="closingDate"]').should('have.value', jobDate);
cy.get('#job-offers-create input[name="title"]').clear().type(jobTitle);
cy.get('#job-offers-create input[name="title"]').should('have.value', jobTitle);
cy.get('#job-offers-create textarea[name="description"]').clear().type(description);
cy.get('#job-offers-create textarea[name="description"]').should('have.value', description);
});
it('should click on create job offer button', () => {
cy.get('#job-offers-create input[type="submit"]').click();
});
it('should land on job offers list screen', () => {
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/job-offers');
});
});
it('should land newly created job offer on job offers list screen', () => {
cy.contains('solid-display-value[name="title"]', jobTitle).should("exist");
cy.contains('solid-display-value[name="description"]', description).should("exist");
});
});
});

View File

@ -0,0 +1,90 @@
/// <reference types="Cypress" />
/* globals cy, expect */
context('Create Project Browser Testing', () => {
before(() => {
cy.clearLocalStorageSnapshot();
cy.clearLocalStorage({ domain: null });
cy.clearCookies({ domain: null });
});
beforeEach(() => cy.restoreLocalStorage());
afterEach(() => cy.saveLocalStorage());
it('should visit user login screen', () => cy.userLogin());
it('should login', () => cy.login());
describe('Project Creation process #1', () => {
let projectName = 'Test Project ',
customerName = 'Test Customer ',
description = 'Test Description ';
it('should visit the project creation screen', () => {
cy.visit('/admin/admin-projects/admin-project-create');
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/admin/admin-projects/admin-project-create');
});
});
it('should enter correct project data', () => {
cy.randomNum().then(num => {
projectName += num;
customerName += num;
description += num;
cy.get('#admin-project-create input[name="customer.name"]').clear().type(customerName);
cy.get('#admin-project-create input[name="customer.name"]').should('have.value', customerName);
cy.get('#admin-project-create input[name="name"]').clear().type(projectName);
cy.get('#admin-project-create input[name="name"]').should('have.value', projectName);
cy.get('#admin-project-create textarea[name="description"]').clear().type(description);
cy.get('#admin-project-create textarea[name="description"]').should('have.value', description);
});
});
it('should click on create project button', () => {
cy.get('#admin-project-create input[type="submit"]').click();
});
it('should land on projects list screen', () => {
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/admin/admin-projects');
});
});
it('should land newly created project on projects list screen', () => {
cy.contains('solid-display-value[name="project.name"]', projectName).should("exist");
cy.fixture('admin.json').then(admin => {
cy.contains('solid-display-value[name="username"]', admin.username).should("exist");
});
});
});
describe('Project Creation process #2', () => {
let projectName = 'Test Project ',
customerName = 'Test Customer ',
description = 'Test Description ';
it('should visit the project creation screen', () => {
cy.visit('/admin/admin-projects/admin-project-create');
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/admin/admin-projects/admin-project-create');
});
});
it('should enter correct project data', () => {
cy.randomNum().then(num => {
projectName += num;
customerName += num;
description += num;
cy.get('#admin-project-create input[name="customer.name"]').clear().type(customerName);
cy.get('#admin-project-create input[name="customer.name"]').should('have.value', customerName);
cy.get('#admin-project-create input[name="name"]').clear().type(projectName);
cy.get('#admin-project-create input[name="name"]').should('have.value', projectName);
cy.get('#admin-project-create textarea[name="description"]').clear().type(description);
cy.get('#admin-project-create textarea[name="description"]').should('have.value', description);
});
});
it('should click on create project button', () => {
cy.get('#admin-project-create input[type="submit"]').click();
});
it('should land on projects list screen', () => {
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/admin/admin-projects');
});
});
it('should land newly created project on projects list screen', () => {
cy.contains('solid-display-value[name="project.name"]', projectName).should("exist");
cy.fixture('admin.json').then(admin => {
cy.contains('solid-display-value[name="username"]', admin.username).should("exist");
});
});
});
});

View File

@ -0,0 +1,56 @@
/// <reference types="Cypress" />
/* globals cy, expect */
// Unable to create an user without a community. Unable to create community from app
// context('Create User Browser Testing', () => {
// let firstName = 'First ',
// lastName = 'Last ',
// username = 'testuser_creation_',
// email = '';
// before(() => {
// cy.randomNum().then(num => {
// firstName += num;
// lastName += num;
// username += num;
// email = username + '@testemail.com';
// });
// cy.clearLocalStorageSnapshot();
// cy.clearLocalStorage({ domain: null });
// cy.clearCookies({ domain: null });
// });
// beforeEach(() => cy.restoreLocalStorage());
// afterEach(() => cy.saveLocalStorage());
// it('should visit user login screen', () => cy.userLogin());
// it('should login', () => cy.login());
// describe('User Creation process', () => {
// it('should visit the user creation screen', () => {
// cy.visit('/admin/admin-users/admin-users-create');
// cy.location().should((loc) => {
// expect(loc.pathname).to.eq('/admin/admin-users/admin-users-create');
// });
// });
// it('should enter correct user data', () => {
// cy.get('#admin-users-create input[name="first_name"]').clear().type(firstName);
// cy.get('#admin-users-create input[name="first_name"]').should('have.value', firstName);
// cy.get('#admin-users-create input[name="last_name"]').clear().type(lastName);
// cy.get('#admin-users-create input[name="last_name"]').should('have.value', lastName);
// cy.get('#admin-users-create input[name="username"]').clear().type(username);
// cy.get('#admin-users-create input[name="username"]').should('have.value', username);
// cy.get('#admin-users-create input[name="email"]').clear().type(email);
// cy.get('#admin-users-create input[name="email"]').should('have.value', email);
// });
// it('should click on create user button', () => {
// cy.get('#admin-users-create input[type="submit"]').click();
// });
// it('should land on users list screen', () => {
// cy.location().should((loc) => {
// expect(loc.pathname).to.eq('/admin/admin-users');
// });
// });
// it('should land newly created user on users list screen', () => {
// cy.contains('solid-display-value[name="name"]', firstName + ' ' + lastName).should("exist");
// cy.contains('solid-display-value[name="username"]', username).should("exist");
// });
// });
// });

View File

@ -0,0 +1,63 @@
/// <reference types="Cypress" />
/* globals cy, expect */
context('Delete Channel Browser Testing', () => {
let menuQuery = [
'solid-display.circle-tab',
'solid-display:last-child',
'solid-display[order-by="name"]'
],
menuCountQuery = [
'solid-display.circle-tab',
'solid-display',
'solid-display[order-by="name"]'
];
before(() => {
cy.clearLocalStorageSnapshot();
cy.clearLocalStorage({ domain: null });
cy.clearCookies({ domain: null });
});
beforeEach(() => cy.restoreLocalStorage());
afterEach(() => cy.saveLocalStorage());
it('should visit user login screend', () => cy.userLogin());
it('should login', () => cy.login());
describe('Channel Retirement process', () => {
let channelsLength;
it('should visit the channels list screen', () => {
cy.visit('/admin');
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/admin');
});
});
it('should visit the last channel edit screen', () => {
cy.get(menuQuery.join(' '))
.invoke('attr', 'data-src')
.then(url => cy.encodeUrl(url).then(id => {
cy.visit('/circle/@' + id + '/circle-information');
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/circle/@' + id + '/circle-information');
});
}));
});
it('should count the number of joined channels', () => {
cy.get(menuCountQuery.join(' ')).its('length').then(length => channelsLength = length);
});
it('should click button to retire the channel', () => {
cy.get('#circle-profile solid-delete[data-label="Supprimer le canal"] button').click();
});
it('should stay on channel edit screen', () => {
cy.get(menuQuery.join(' '))
.invoke('attr', 'data-src')
.then(url => cy.encodeUrl(url).then(id => {
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/circle/@' + id + '/circle-information');
});
}));
});
it('should check if chennel was retired', () => {
cy.get(menuCountQuery.join(' ')).its('length').should(length => {
expect(length).to.eq(channelsLength - 1);
});
});
});
});

View File

@ -0,0 +1,65 @@
/// <reference types="Cypress" />
/* globals cy, expect */
context('Edit Channel Browser Testing', () => {
let channelName = 'Edited Test Channel ',
description = 'Edited Test Description ',
menuQuery = [
'solid-display.circle-tab',
'solid-display:last-child',
'solid-display[order-by="name"]'
];
before(() => {
cy.randomNum().then(num => {
channelName += num;
description += num;
});
cy.clearLocalStorageSnapshot();
cy.clearLocalStorage({ domain: null });
cy.clearCookies({ domain: null });
});
beforeEach(() => cy.restoreLocalStorage());
afterEach(() => cy.saveLocalStorage());
it('should visit user login screen', () => cy.userLogin());
it('should login', () => cy.login());
describe('Channel Edition process', () => {
it('should visit the channel list screen', () => {
cy.visit('/admin');
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/admin');
});
});
it('should visit the last channel edit screen', () => {
cy.get(menuQuery.join(' '))
.invoke('attr', 'data-src')
.then(url => cy.encodeUrl(url).then(id => {
cy.visit('/circle/@' + id + '/circle-information/circle-edit');
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/circle/@' + id + '/circle-information/circle-edit');
});
}));
});
it('should enter new channel data', () => {
cy.get('#circle-edit input[name="name"]').clear().type(channelName);
cy.get('#circle-edit input[name="name"]').should('have.value', channelName);
cy.get('#circle-edit input[name="description"]').clear().type(description);
cy.get('#circle-edit input[name="description"]').should('have.value', description);
});
it('should click button to save the channel', () => {
cy.get('#circle-edit input[value="Enregistrer"]').click();
});
it('should land on channel information screen', () => {
cy.get(menuQuery.join(' '))
.invoke('attr', 'data-src')
.then(url => cy.encodeUrl(url).then(id => {
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/circle/@' + id + '/circle-information');
});
}));
});
it('should show edited channel data on channel information screen', () => {
cy.contains('solid-display-value[name="name"]', channelName).should("exist");
cy.contains('solid-display-value[name="description"]', description).should("exist");
});
});
});

View File

@ -0,0 +1,66 @@
/// <reference types="Cypress" />
/* globals cy, expect */
context('Edit Job Offer Browser Testing', () => {
let jobDate = '',
jobTitle = 'Edited Test Job Offer ',
description = 'Edited Test Description ',
menuQuery = [
'solid-display.job-board__list',
'solid-display:last-child'
];
before(() => {
cy.nextYear(2).then(year => {
jobDate = year + '-12-31';
});
cy.randomNum().then(num => {
jobTitle += num;
description += num;
});
cy.clearLocalStorageSnapshot();
cy.clearLocalStorage({ domain: null });
cy.clearCookies({ domain: null });
});
beforeEach(() => cy.restoreLocalStorage());
afterEach(() => cy.saveLocalStorage());
it('should visit user login screen', () => cy.userLogin());
it('should login', () => cy.login());
describe('Job Offer Edition process', () => {
it('should visit the job offers list screen', () => {
cy.visit('/job-offers');
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/job-offers');
});
});
it('should visit the last job offer edit screen', () => {
cy.get(menuQuery.join(' '))
.invoke('attr', 'data-src')
.then(url => cy.encodeUrl(url).then(id => {
cy.visit('/job-offers/job-offers-edit/@' + id);
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/job-offers/job-offers-edit/@' + id);
});
}));
});
it('should enter new job offer data', () => {
cy.get('#job-offers-edit input[name="closingDate"]').clear().type(jobDate);
cy.get('#job-offers-edit input[name="closingDate"]').should('have.value', jobDate);
cy.get('#job-offers-edit input[name="title"]').clear().type(jobTitle);
cy.get('#job-offers-edit input[name="title"]').should('have.value', jobTitle);
cy.get('#job-offers-edit textarea[name="description"]').clear().type(description);
cy.get('#job-offers-edit textarea[name="description"]').should('have.value', description);
});
it('should click button to save the job offer', () => {
cy.get('#job-offers-edit input[type="submit"]').click();
});
it('should land on job offers list screen', () => {
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/job-offers');
});
});
it('should show edited job offer data on job offer information screen', () => {
cy.contains('solid-display-value[name="title"]', jobTitle).should("exist");
cy.contains('solid-display-value[name="description"]', description).should("exist");
});
});
});

View File

@ -0,0 +1,69 @@
/// <reference types="Cypress" />
/* globals cy, expect */
context('Edit Project Browser Testing', () => {
let projectName = 'Edited Test Project ',
customerName = 'Edited Test Customer ',
description = 'Edited Test Description ',
menuQuery = [
'solid-display.project-tab',
'solid-display:last-child',
'solid-display[order-by="customer.name"]'
];
before(() => {
cy.randomNum().then(num => {
projectName += num;
customerName += num;
description += num;
});
cy.clearLocalStorageSnapshot();
cy.clearLocalStorage({ domain: null });
cy.clearCookies({ domain: null });
});
beforeEach(() => cy.restoreLocalStorage());
afterEach(() => cy.saveLocalStorage());
it('should visit user login screen', () => cy.userLogin());
it('should login', () => cy.login());
describe('Project Edition process', () => {
it('should visit the project list screen', () => {
cy.visit('/admin/admin-projects');
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/admin/admin-projects');
});
});
it('should visit the last project edit screen', () => {
cy.get(menuQuery.join(' '))
.invoke('attr', 'data-src')
.then(url => cy.encodeUrl(url).then(id => {
cy.visit('/project/@' + id + '/project-information/project-edit');
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/project/@' + id + '/project-information/project-edit');
});
}));
});
it('should enter new project data', () => {
cy.get('#project-edit input[name="customer.name"]').clear().type(customerName);
cy.get('#project-edit input[name="customer.name"]').should('have.value', customerName);
cy.get('#project-edit input[name="name"]').clear().type(projectName);
cy.get('#project-edit input[name="name"]').should('have.value', projectName);
cy.get('#project-edit textarea[name="description"]').clear().type(description);
cy.get('#project-edit textarea[name="description"]').should('have.value', description);
});
it('should click button to save the project', () => {
cy.get('#project-edit input[value="Enregistrer"]').click();
});
it('should land on project information screen', () => {
cy.get(menuQuery.join(' '))
.invoke('attr', 'data-src')
.then(url => cy.encodeUrl(url).then(id => {
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/project/@' + id + '/project-information');
});
}));
});
it('should show edited project data on project information screen', () => {
cy.contains('solid-display-value[name="customer.name"]', customerName).should("exist");
cy.contains('solid-display-value[name="name"]', projectName).should("exist");
});
});
});

View File

@ -0,0 +1,73 @@
/// <reference types="Cypress" />
/* globals cy, expect */
context('Edit User Browser Testing', () => {
let userFirstName = 'Edited User First Name ',
userLastName = 'Edited User Last Name ',
jobDescription = 'Edited Job Description ',
city = 'Edited City ',
phone = '+1234',
website = 'https://test.site/';
before(() => {
cy.randomNum().then(num => {
userFirstName += num;
userLastName += num;
jobDescription += num;
city += num;
phone += num;
website += num;
});
cy.clearLocalStorageSnapshot();
cy.clearLocalStorage({ domain: null });
cy.clearCookies({ domain: null });
});
beforeEach(() => cy.restoreLocalStorage());
afterEach(() => cy.saveLocalStorage());
it('should visit user login screen', () => cy.userLogin());
it('should login', () => cy.login());
describe('User Edition process', () => {
it('should visit the user edit screen', () => {
cy.visit('/profile/solid-profile-edit-profile');
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/profile/solid-profile-edit-profile');
});
});
/// Workaround - Routing bug - user won't land on edit profile screen
it('should navigate to user edit screen', () => {
cy.get('#solid-profile-my-profile solid-link[next="solid-profile-edit-profile"]').click();
});
/// End workaround
it('should enter new user data', () => {
cy.get('#solid-profile-edit-profile input[name="first_name"]').clear().type(userFirstName);
cy.get('#solid-profile-edit-profile input[name="first_name"]').should('have.value', userFirstName);
cy.get('#solid-profile-edit-profile input[name="last_name"]').clear().type(userLastName);
cy.get('#solid-profile-edit-profile input[name="last_name"]').should('have.value', userLastName);
cy.get('#solid-profile-edit-profile textarea[name="profile.job"]').clear().type(jobDescription);
cy.get('#solid-profile-edit-profile textarea[name="profile.job"]').should('have.value', jobDescription);
cy.get('#solid-profile-edit-profile input[name="profile.city"]').clear().type(city);
cy.get('#solid-profile-edit-profile input[name="profile.city"]').should('have.value', city);
cy.get('#solid-profile-edit-profile input[name="profile.phone"]').clear().type(phone);
cy.get('#solid-profile-edit-profile input[name="profile.phone"]').should('have.value', phone);
cy.get('#solid-profile-edit-profile input[name="profile.website"]').clear().type(website);
cy.get('#solid-profile-edit-profile input[name="profile.website"]').should('have.value', website);
});
it('should click button to save the user', () => {
cy.get('#solid-profile-edit-profile input[value="ENREGISTRER"]').click();
});
it('should land on user information screen', () => {
cy.location().should(location => {
/// Workaround - Routing bug - route pathname won't be /profile as it should
expect(location.pathname).to.eq('/');
// expect(location.pathname).to.eq('/profile');
/// End workaround
});
});
it('should show edited user data on user information screen', () => {
cy.contains('solid-display-value[name="name"]', userFirstName + ' ' + userLastName).should("exist");
cy.contains('solid-display-value[name="profile.job"]', jobDescription).should("exist");
cy.contains('solid-display-value[name="profile.city"]', city).should("exist");
cy.contains('directory-link-tel a', phone).should("exist");
cy.contains('directory-website a', website).should("exist");
});
});
});

View File

@ -0,0 +1,42 @@
/// <reference types="Cypress" />
/* globals cy, expect */
context('Leave Channel Browser Testing', () => {
let tableQuery = [
'solid-display.table-body',
'solid-display:last-child',
'hubl-admin-circle-leave-button',
'solid-delete'
],
tableListQuery = [
'solid-display[nested-field="circles"]',
'div >',
'solid-display'
];
before(() => {
cy.clearLocalStorageSnapshot();
cy.clearLocalStorage({ domain: null });
cy.clearCookies({ domain: null });
});
beforeEach(() => cy.restoreLocalStorage());
afterEach(() => cy.saveLocalStorage());
it('should visit user login screend', () => cy.userLogin());
it('should login', () => cy.login());
describe('Channel Leaving process', () => {
it('should visit the channels list screen', () => {
cy.visit('/admin');
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/admin');
});
});
it('should click the last channel leave button', () => {
cy.get(tableListQuery.join(' ')).its('length').as('channelsLength');
cy.get(tableQuery.join(' ')).click();
});
it('should check if chennel was left', () => {
cy.get(tableListQuery.join(' ')).its('length').should(length => {
expect(length).to.eq(this.channelsLength - 1);
});
});
});
});

View File

@ -0,0 +1,42 @@
/// <reference types="Cypress" />
/* globals cy, expect */
context('Leave Project Browser Testing', () => {
let tableQuery = [
'solid-display.table-body',
'solid-display:last-child',
'hubl-admin-project-leave-button',
'solid-delete'
],
tableListQuery = [
'solid-display[nested-field="projects"]',
'div >',
'solid-display'
];
before(() => {
cy.clearLocalStorageSnapshot();
cy.clearLocalStorage({ domain: null });
cy.clearCookies({ domain: null });
});
beforeEach(() => cy.restoreLocalStorage());
afterEach(() => cy.saveLocalStorage());
it('should visit user login screend', () => cy.userLogin());
it('should login', () => cy.login());
describe('Project Leaving process', () => {
it('should visit the projects list screen', () => {
cy.visit('/admin/admin-projects');
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/admin/admin-projects');
});
});
it('should click the last project leave button', () => {
cy.get(tableListQuery.join(' ')).its('length').as('projectsLength');
cy.get(tableQuery.join(' ')).click();
});
it('should check if project was left', () => {
cy.get(tableListQuery.join(' ')).its('length').should(length => {
expect(length).to.eq(this.projectsLength - 1);
});
});
});
});

View File

@ -0,0 +1,84 @@
/// <reference types="Cypress" />
/* globals cy, expect */
context('List Job Offers Browser Testing', () => {
let listQuery = 'solid-display.job-board__list',
filtersQuery = [
listQuery,
'solid-form',
'input'
],
listingCountQuery = [
listQuery,
'solid-display'
],
firstListingQuery = [
listQuery,
'solid-display:first-child',
'solid-display-value'
];
before(() => {
cy.clearLocalStorageSnapshot();
cy.clearLocalStorage({ domain: null });
cy.clearCookies({ domain: null });
});
beforeEach(() => cy.restoreLocalStorage());
afterEach(() => cy.saveLocalStorage());
it('should visit user login screen', () => cy.userLogin());
it('should login', () => cy.login());
describe('Job Offer Listing process', () => {
let listingTitle,
listingDesccription,
listingCount;
it('should visit the job offers listing screen', () => {
cy.visit('/job-offers');
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/job-offers');
});
});
it('should get the listing count', () => {
cy.get(listingCountQuery.join(' ')).its('length').then(length => listingCount = length);
});
it('should get the first job offer listing data', () => {
cy.get(firstListingQuery.join(' ') + '[name="title"]').invoke('text').then(text => listingTitle = text);
cy.get(firstListingQuery.join(' ') + '[name="description"]').invoke('text').then(text => listingDesccription = text);
});
// TO-DO: Search by title and description
/*it('should filter the listing by first name', () => {
cy.get(filtersQuery.join(' ') + '[name="title"]').clear().type(listingTitle);
cy.get(filtersQuery.join(' ') + '[name="title"]').should('have.value', listingTitle);
});
it('should get filtered listing count', () => {
cy.get(listingCountQuery.join(' ')).its('length').then(length => {
expect(length).to.eq(1);
});
});
it('should clear the first name filter', () => {
cy.get(filtersQuery.join(' ') + '[name="title"]').clear();
cy.get(filtersQuery.join(' ') + '[name="title"]').should('have.value', '');
});
it('should get previous listing count', () => {
cy.get(listingCountQuery.join(' ')).its('length').then(length => {
expect(length).to.eq(listingCount);
});
});
it('should filter the listing by first name', () => {
cy.get(filtersQuery.join(' ') + '[name="description"]').clear().type(listingDesccription);
cy.get(filtersQuery.join(' ') + '[name="description"]').should('have.value', listingDesccription);
});
it('should get filtered listing count', () => {
cy.get(listingCountQuery.join(' ')).its('length').then(length => {
expect(length).to.eq(1);
});
});
it('should clear the first name filter', () => {
cy.get(filtersQuery.join(' ') + '[name="description"]').clear();
cy.get(filtersQuery.join(' ') + '[name="description"]').should('have.value', '');
});
it('should get previous listing count', () => {
cy.get(listingCountQuery.join(' ')).its('length').then(length => {
expect(length).to.eq(listingCount);
});
});*/
});
});

View File

@ -0,0 +1,124 @@
/// <reference types="Cypress" />
/* globals cy, expect */
context('List Users Browser Testing', () => {
let listQuery = 'solid-display#members-list__content',
filtersQuery = [
listQuery,
'solid-form',
'input'
],
listingCountQuery = [
listQuery,
'div:first-child',
'span'
],
firstListingQuery = [
listQuery,
'solid-display:first-child',
'solid-display-value'
];
before(() => {
cy.clearLocalStorageSnapshot();
cy.clearLocalStorage({ domain: null });
cy.clearCookies({ domain: null });
});
beforeEach(() => cy.restoreLocalStorage());
afterEach(() => cy.saveLocalStorage());
it('should visit user login screen', () => cy.userLogin());
it('should login', () => cy.login());
describe('User Listing process', () => {
let listingFirstName,
listingLastName,
listingJob,
listingCity,
listingCount;
it('should visit the users listing screen', () => {
cy.visit('/members');
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/members');
});
});
it('should get the listing count', () => {
cy.get(listingCountQuery.join(' ')).invoke('text').then(text => listingCount = text);
});
it('should get the first user listing data', () => {
cy.get(firstListingQuery.join(' ') + '[name="first_name"]').invoke('text').then(text => listingFirstName = text);
cy.get(firstListingQuery.join(' ') + '[name="last_name"]').invoke('text').then(text => listingLastName = text);
cy.get(firstListingQuery.join(' ') + '[name="profile.job"]').invoke('text').then(text => listingJob = text);
cy.get(firstListingQuery.join(' ') + '[name="profile.city"]').invoke('text').then(text => listingCity = text);
});
it('should filter the listing by first name', () => {
cy.get(filtersQuery.join(' ') + '[name="name"]').clear().type(listingFirstName);
cy.get(filtersQuery.join(' ') + '[name="name"]').should('have.value', listingFirstName);
});
it('should get filtered listing count', () => {
cy.get(listingCountQuery.join(' ')).invoke('text').then(text => {
expect(text).to.eq('1 membres');
});
});
it('should clear the first name filter', () => {
cy.get(filtersQuery.join(' ') + '[name="name"]').clear();
cy.get(filtersQuery.join(' ') + '[name="name"]').should('have.value', '');
});
it('should get previous listing count', () => {
cy.get(listingCountQuery.join(' ')).invoke('text').then(text => {
expect(text).to.eq(listingCount);
});
});
it('should filter the listing by last name', () => {
cy.get(filtersQuery.join(' ') + '[name="name"]').clear().type(listingLastName);
cy.get(filtersQuery.join(' ') + '[name="name"]').should('have.value', listingLastName);
});
it('should get filtered listing count', () => {
cy.get(listingCountQuery.join(' ')).invoke('text').then(text => {
expect(text).to.eq('1 membres');
});
});
it('should clear the last name filter', () => {
cy.get(filtersQuery.join(' ') + '[name="name"]').clear();
cy.get(filtersQuery.join(' ') + '[name="name"]').should('have.value', '');
});
it('should get previous listing count', () => {
cy.get(listingCountQuery.join(' ')).invoke('text').then(text => {
expect(text).to.eq(listingCount);
});
});
it('should filter the listing by job description', () => {
cy.get(filtersQuery.join(' ') + '[name="member-job"]').clear().type(listingJob);
cy.get(filtersQuery.join(' ') + '[name="member-job"]').should('have.value', listingJob);
});
it('should get filtered listing count', () => {
cy.get(listingCountQuery.join(' ')).invoke('text').then(text => {
expect(text).to.eq('1 membres');
});
});
it('should clear the job description filter', () => {
cy.get(filtersQuery.join(' ') + '[name="member-job"]').clear();
cy.get(filtersQuery.join(' ') + '[name="member-job"]').should('have.value', '');
});
it('should get previous listing count', () => {
cy.get(listingCountQuery.join(' ')).invoke('text').then(text => {
expect(text).to.eq(listingCount);
});
});
it('should filter the listing by city', () => {
cy.get(filtersQuery.join(' ') + '[name="member-city"]').clear().type(listingCity);
cy.get(filtersQuery.join(' ') + '[name="member-city"]').should('have.value', listingCity);
});
it('should get filtered listing count', () => {
cy.get(listingCountQuery.join(' ')).invoke('text').then(text => {
expect(text).to.eq('1 membres');
});
});
it('should clear the city filter', () => {
cy.get(filtersQuery.join(' ') + '[name="member-city"]').clear();
cy.get(filtersQuery.join(' ') + '[name="member-city"]').should('have.value', '');
});
it('should get previous listing count', () => {
cy.get(listingCountQuery.join(' ')).invoke('text').then(text => {
expect(text).to.eq(listingCount);
});
});
});
});

View File

@ -0,0 +1,63 @@
/// <reference types="Cypress" />
/* globals cy, expect */
context('Retire Channel Browser Testing', () => {
let menuQuery = [
'solid-display.circle-tab',
'solid-display:last-child',
'solid-display[order-by="name"]'
],
menuCountQuery = [
'solid-display.circle-tab',
'solid-display',
'solid-display[order-by="name"]'
];
before(() => {
cy.clearLocalStorageSnapshot();
cy.clearLocalStorage({ domain: null });
cy.clearCookies({ domain: null });
});
beforeEach(() => cy.restoreLocalStorage());
afterEach(() => cy.saveLocalStorage());
it('should visit user login screend', () => cy.userLogin());
it('should login', () => cy.login());
describe('Channel Retirement process', () => {
let channelsLength;
it('should visit the channels list screen', () => {
cy.visit('/admin');
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/admin');
});
});
it('should visit the last channel edit screen', () => {
cy.get(menuQuery.join(' '))
.invoke('attr', 'data-src')
.then(url => cy.encodeUrl(url).then(id => {
cy.visit('/circle/@' + id + '/circle-information/circle-edit');
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/circle/@' + id + '/circle-information/circle-edit');
});
}));
});
it('should count the number of joined channels', () => {
cy.get(menuCountQuery.join(' ')).its('length').then(length => channelsLength = length);
});
it('should click button to retire the channel', () => {
cy.get('solid-multiple[name="members"] solid-delete[data-label="Retirer"] button').click();
});
it('should stay on channel edit screen', () => {
cy.get(menuQuery.join(' '))
.invoke('attr', 'data-src')
.then(url => cy.encodeUrl(url).then(id => {
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/circle/@' + id + '/circle-information/circle-edit');
});
}));
});
it('should check if chennel was retired', () => {
cy.get(menuCountQuery.join(' ')).its('length').should(length => {
expect(length).to.eq(channelsLength - 1);
});
});
});
});

View File

@ -0,0 +1,63 @@
/// <reference types="Cypress" />
/* globals cy, expect */
context('Retire Project Browser Testing', () => {
let menuQuery = [
'solid-display.project-tab',
'solid-display:last-child',
'solid-display[order-by="customer.name"]'
],
menuCountQuery = [
'solid-display.project-tab',
'solid-display',
'solid-display[order-by="customer.name"]'
];
before(() => {
cy.clearLocalStorageSnapshot();
cy.clearLocalStorage({ domain: null });
cy.clearCookies({ domain: null });
});
beforeEach(() => cy.restoreLocalStorage());
afterEach(() => cy.saveLocalStorage());
it('should visit user login screend', () => cy.userLogin());
it('should login', () => cy.login());
describe('Project Retirement process', () => {
let projectsLength;
it('should visit the projects list screen', () => {
cy.visit('/admin/admin-projects');
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/admin/admin-projects');
});
});
it('should visit the last project edit screen', () => {
cy.get(menuQuery.join(' '))
.invoke('attr', 'data-src')
.then(url => cy.encodeUrl(url).then(id => {
cy.visit('/project/@' + id + '/project-information/project-edit');
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/project/@' + id + '/project-information/project-edit');
});
}));
});
it('should count the number of joined projects', () => {
cy.get(menuCountQuery.join(' ')).its('length').then(length => projectsLength = length);
});
it('should click button to retire the project', () => {
cy.get('solid-multiple[name="members"] solid-delete[data-label="Retirer"] button').click();
});
it('should stay on project edit screen', () => {
cy.get(menuQuery.join(' '))
.invoke('attr', 'data-src')
.then(url => cy.encodeUrl(url).then(id => {
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/project/@' + id + '/project-information/project-edit');
});
}));
});
it('should check if project was retired', () => {
cy.get(menuCountQuery.join(' ')).its('length').should(length => {
expect(length).to.eq(projectsLength - 1);
});
});
});
});

View File

@ -1,43 +1,37 @@
/// <reference types="Cypress" />
/* globals cy, expect */
context('Browser testing', () => {
before(() => {
cy.clearLocalStorage({ domain: null});
cy.clearCookies({ domain: null });
before(() => {
cy.clearLocalStorageSnapshot();
cy.clearLocalStorage({ domain: null});
cy.clearCookies({ domain: null });
});
it('should visit user login screen', () => cy.userLogin());
describe('Login process', () => {
it('should write "admin" on username field and "password" on password field', () => {
cy.get('#id_username').type('admin');
cy.get('#id_username').should('have.value', 'admin');
cy.get('#id_password').type('password');
cy.get('#id_password').should('have.value', 'password');
});
it('visit the homepage', () => {
cy.visit('/');
it('should click on login button', () => {
cy.get(':nth-child(1) > .flex-column > [type="submit"]').click();
});
it('should await for an user login', () => {
it('should provide an error, username and password mismatch.', () => {
cy.get('.error').should('contain.text', 'Ton nom d\'utilisateur et ton mot de passe ne correspondent pas. Réessaye.');
});
it('should write "admin" on password field then press the login button', () => {
cy.get('#id_password').type('admin');
cy.get('#id_password').should('have.value', 'admin');
cy.get(':nth-child(1) > .flex-column > [type="submit"]').click();
});
it('should ask for user permission to access their datas.', () => {
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/auth/login/');
expect(loc.pathname).to.eq('/authorize');
});
cy.get('.accept-button').click();
});
describe('Login process', () => {
it('should write "admin" on username field and "password" on password field', () => {
cy.get('#id_username').type('admin');
cy.get('#id_username').should('have.value', 'admin');
cy.get('#id_password').type('password');
cy.get('#id_password').should('have.value', 'password');
});
it('should click on login button', () => {
cy.get(':nth-child(1) > .flex-column > [type="submit"]').click();
});
it('should provide an error, username and password mismatch.', () => {
cy.get('.error').should('contain.text', 'Ton nom d\'utilisateur et ton mot de passe ne correspondent pas. Réessaye.')
});
it('should write "admin" on password field then press the login button', () => {
cy.get('#id_password').type('admin');
cy.get('#id_password').should('have.value', 'admin');
cy.get(':nth-child(1) > .flex-column > [type="submit"]').click();
});
it('should ask for user permission to access their datas.', () => {
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/authorize')
});
cy.get('.accept-button').click();
});
// it('should redirect the user to the app.', () => {
// cy.get('.accept-button').click();
// cy.location().should((loc) => {
@ -103,6 +97,5 @@ context('Browser testing', () => {
// expect(loc.pathname).to.eq('/auth/login/');
// });
// });
});
});
});

View File

@ -0,0 +1,61 @@
/// <reference types="Cypress" />
/* globals cy */
context('Signup Browser Testing', () => {
let username = 'testuser_creation_',
email = '',
password = 'testpwd';
before(() => {
cy.randomNum().then(num => {
username += num;
email = username + '@testemail.com';
});
cy.clearLocalStorageSnapshot();
cy.clearLocalStorage({ domain: null });
cy.clearCookies({ domain: null });
});
it('should visit user login screen', () => cy.userLogin());
describe('Signup process', () => {
it('should click on signup page link', () => {
cy.get('.sib-link.sib-register-link').click();
});
it('should write incorrect user data', () => {
cy.get('#id_username').type('!"#$%&');
cy.get('#id_username').should('have.value', '!"#$%&');
cy.get('#id_email').type(email.split('.')[0]);
cy.get('#id_email').should('have.value', email.split('.')[0]);
cy.get('#id_password1').type(password + 'wrong1');
cy.get('#id_password1').should('have.value', password + 'wrong1');
cy.get('#id_password2').type(password + 'wrong2');
cy.get('#id_password2').should('have.value', password + 'wrong2');
});
it('should click on signup button', () => {
cy.get('.sib-registration-btn').click();
});
it('should provide errors about incorrect user data', () => {
cy.get('tbody tr:nth-child(1) ul.errorlist li')
.should('contain.text', 'Enter a valid username. This value may contain only letters, numbers, and ./+/-/_ characters.');
cy.get('tbody tr:nth-child(2) ul.errorlist li')
.should('contain.text', 'Enter a valid email address.');
cy.get('tbody tr:nth-child(4) ul.errorlist li')
.should('contain.text', 'The two password fields didn\'t match.');
});
it('should write correct user data', () => {
cy.get('#id_username').clear().type(username);
cy.get('#id_username').should('have.value', username);
cy.get('#id_email').clear().type(email);
cy.get('#id_email').should('have.value', email);
cy.get('#id_password1').clear().type(password);
cy.get('#id_password1').should('have.value', password);
cy.get('#id_password2').clear().type(password);
cy.get('#id_password2').should('have.value', password);
});
it('should click on signup button', () => {
cy.get('.sib-registration-btn').click();
});
it('should show email confirmation dialog', () => {
cy.contains('h1.text-center', 'Un e-mail d\'activation a été envoyé.').should("exist");
cy.contains('p.text-center', 'Vérifie ta boite mail et clique sur le lien pour activer ton compte.').should("exist");
});
});
});

View File

@ -23,3 +23,50 @@
//
// -- This will overwrite an existing command --
// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... })
/* globals Cypress, cy, expect */
import 'cypress-localstorage-commands';
Cypress.Commands.add('login', () => {
cy.fixture('admin.json').then(admin => {
cy.get('#id_username').type(admin.username);
cy.get('#id_username').should('have.value', admin.username);
cy.get('#id_password').type(admin.password);
cy.get('#id_password').should('have.value', admin.password);
cy.get('.connection-btn').click();
cy.location('pathname').should('include', '/authorize');
cy.get('.accept-button').click();
cy.location().should(location => {
expect(location.pathname).to.eq('/');
});
});
});
Cypress.Commands.add('userLogin', () => {
cy.visit('/');
cy.location().should((loc) => {
expect(loc.pathname).to.eq('/auth/login/');
});
});
Cypress.Commands.add('encodeUrl', url => {
const encodeIdReplacement = [
['~', '~~'],
['.', '~!'],
[':', '~@'],
['/', '~_'],
];
encodeIdReplacement.forEach(([char, repl]) => {
url = url.split(char).join(repl);
});
return url;
});
Cypress.Commands.add('randomNum', () => {
return Math.floor(1000 + Math.random() * 9000);
});
Cypress.Commands.add('nextYear', increment => {
return new Date().getFullYear() + ( increment || 1 );
});

View File

@ -13,8 +13,10 @@
// https://on.cypress.io/configuration
// ***********************************************************
/* globals Cypress */
// Import commands.js using ES2015 syntax:
import './commands'
import './commands';
//require('cypress-terminal-report').installSupport();
@ -27,4 +29,9 @@ Cypress.on('uncaught:exception', (err, runnable) => {
return false;
});
Cypress.on('fail', () => Cypress.runner.abort())
Cypress.on('fail', (error) => {
console.log(error);
if ( typeof Cypress.runner.abort == 'function' ) {
Cypress.runner.abort();
}
});

39
make-webmanifest.mjs Normal file
View File

@ -0,0 +1,39 @@
'use strict';
import fs from 'fs';
if(!fs.existsSync("config.json")) throw "[Error] (Mandatory) Missing config.json file";
let config = JSON.parse(fs.readFileSync('config.json'));
if(!config.clientName) throw "[Error] (Mandatory) Missing clientName on config.json";
if(!config.clientLogo) throw "[Error] (Mandatory) Missing clientLogo on config.json";
let manifest = {
"lang": "fr",
"dir": "ltr",
"name": config.clientName,
"description": `Hubl of ${config.clientName}`,
"short_name": config.clientName,
"icons": [{
"src": config.clientLogo,
"purpose": "any"
}, {
"src": "/images/hubl-icon-192.png",
"sizes": "192x192",
"type": "image/png"
}, {
"src": "/images/hubl-icon-512.png",
"sizes": "512x512",
"type": "image/png"
}],
"start_url": ".",
"display": "standalone",
"orientation": "portrait",
"background_color": "#fff",
'theme_color': "white"
}
fs.existsSync("dist") || fs.mkdirSync("dist");
fs.writeFileSync('dist/manifest.webmanifest', JSON.stringify(manifest, null, 2));
console.log(`Created manifest for ${config.clientName}`);

9538
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -9,22 +9,40 @@
"scripts": {
"build": "run-p copy:* build:*",
"build:css": "node-sass src/styles/index.scss -o dist/styles/",
"build:js": "babel 'src/scripts/*.js' -o dist/scripts/index.js",
"build:jscomponents": "babel 'src/components/*.js' --out-dir dist/components/",
"build:html": "pug src/index.pug -o dist/ --obj config.json",
"build:js": "babel \"src/scripts/*.js\" -o dist/scripts/index.js",
"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:* 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",
"watch:sw": "npm-watch copy:sw",
"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",
"copy:sw": "src/sw.js",
"build:js": "src/scripts/*.js",
"build:jscomponents": "src/components/*.js"
},
"release": {
"branches": [
"master"
@ -68,6 +86,8 @@
},
"devDependencies": {
"cypress": "^4.5.0",
"cypress-terminal-report": "^1.2.1"
"cypress-localstorage-commands": "^1.2.1",
"cypress-terminal-report": "^1.2.1",
"npm-watch": "^0.7.0"
}
}

View File

@ -1,6 +1,4 @@
import { store } from 'https://unpkg.com/@startinblox/core@0.10';
import { Sib } from "https://unpkg.com/@startinblox/core@0.10/dist/libs/Sib.js";
import { StoreMixin } from "https://unpkg.com/@startinblox/core@0.10/dist/mixins/storeMixin.js";
import { store, Sib, StoreMixin } from 'https://cdn.skypack.dev/@startinblox/core@0.13';
export const HublReactivity = {
name: 'hubl-reactivity',
@ -13,21 +11,17 @@ export const HublReactivity = {
this.subscribe();
}
},
dataSrc: {
type: String,
default: '',
callback: async function (value) {
this.resourceId = null;
if (this.nestedField) {
const resource = store.get(value) || await store.getData(value, this.context);
const nestedResource = await resource[this.nestedField]
this.resourceId = nestedResource ? nestedResource['@id'] : null;
} else {
this.resourceId = value;
}
this.subscribe();
}
},
},
async fetchData(value) {
this.resourceId = null;
if (this.nestedField) {
const resource = store.get(value) || await store.getData(value, this.context);
const nestedResource = await resource[this.nestedField]
this.resourceId = nestedResource ? nestedResource['@id'] : null;
} else {
this.resourceId = value;
}
this.subscribe();
},
subscribe() {
if (this.resourceId && this.targetSrc) {

View File

@ -1,4 +1,4 @@
import { widgetFactory } from 'https://unpkg.com/@startinblox/core@0.10/dist/widgets/widget-factory.js';
import { widgetFactory } from 'https://cdn.skypack.dev/@startinblox/core@0.13';
const HublSearchUsers = widgetFactory(
'hubl-search-users',

View File

@ -1,6 +1,5 @@
import { widgetFactory } from 'https://unpkg.com/@startinblox/core@0.10/dist/widgets/widget-factory.js';
import { importCSS } from 'https://unpkg.com/@startinblox/core@0.10/dist/libs/helpers.js';
import SlimSelect from 'https://dev.jspm.io/slim-select@1.23';
import { widgetFactory, Helpers } from 'https://cdn.skypack.dev/@startinblox/core@0.13';
import SlimSelect from 'https://cdn.skypack.dev/slim-select@1.23';
const HublStatus = widgetFactory(
'hubl-status',
@ -11,10 +10,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>`,
'',
@ -22,7 +21,7 @@ const HublStatus = widgetFactory(
let select = formWidget.querySelector('select');
if (!select) return;
const slimSelect = new SlimSelect({select: select});
importCSS('https://dev.jspm.io/slim-select/dist/slimselect.min.css');
Helpers.importCSS('https://dev.jspm.io/slim-select/dist/slimselect.min.css');
select.addEventListener('change', () => slimSelect.render());
},
);

8
src/components/sentry.js Normal file
View File

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

View File

@ -1,46 +1,55 @@
script(src="https://browser.sentry-cdn.com/5.25.0/bundle.tracing.min.js" defer)
script(type="module" src="/components/sentry.js" defer)
script(type="module" src="/components/hubl-search-users.js" defer)
script(type="module" src="/components/hubl-status.js" defer)
script(type="module" src="/components/hubl-reactivity.js" defer)
script(type="module" src="https://unpkg.com/@startinblox/core@0.10" defer)
script(type="module" src="https://cdn.skypack.dev/@startinblox/core@0.13" defer)
//- script(type="module" src="/lib/sib-core/dist/index.js" defer)
script(type="module" src="https://unpkg.com/@startinblox/oidc@0.9" defer)
//- script(type="module" src="/lib/sib-oidc/index.js" defer)
script(type="module" src="https://cdn.skypack.dev/@startinblox/oidc@0.11" defer)
//- script(type="module" src="/lib/sib-auth/index.js" defer)
script(type="module" src="https://unpkg.com/@startinblox/router@0.8" defer)
//- script(type="module" src="/lib/solid-router/src/index.js" defer)
script(type="module" src="https://cdn.skypack.dev/@startinblox/router@0.11" defer)
//- script(type="module" src="/lib/sib-router/src/index.js" defer)
script(type="module" src="https://unpkg.com/@startinblox/component-notifications@0.6.2" defer)
//- script(type="module" src="/lib/sib-notifications/index.js" defer)
script(type="module" src="https://cdn.skypack.dev/@startinblox/component-notifications@0.8" defer)
//- script(type="module" src="/lib/sib-notifications/index.js" defer)
if (endpoints.events || (endpoints.get && endpoints.get.events)) && (endpoints.typeevents || (endpoints.get && endpoints.get.typeevents))
script(type="module" src="https://unpkg.com/@startinblox/component-event@1.1" defer)
//- DISABLED - please migrate to dev.skypack.dev + upgrade to core@0.13
//- if (endpoints.events || (endpoints.get && endpoints.get.events)) && (endpoints.typeevents || (endpoints.get && endpoints.get.typeevents))
//- script(type="module" src="https://cdn.skypack.dev/@startinblox/component-event@1.2" defer)
//- script(type="module" src="/lib/sib-event-component/sib-event.js" defer)
if (endpoints.resources || (endpoints.get && endpoints.get.resources)) && (endpoints.resourceskeywords || (endpoints.get && endpoints.get.resourceskeywords)) && (endpoints.resourcestypes || (endpoints.get && endpoints.get.resourcestypes))
script(type="module" src="https://unpkg.com/@startinblox/component-resource@1.0" defer)
//- DISABLED - please migrate to dev.skypack.dev + upgrade to core@0.13
//- if (endpoints.resources || (endpoints.get && endpoints.get.resources)) && (endpoints.resourceskeywords || (endpoints.get && endpoints.get.resourceskeywords)) && (endpoints.resourcestypes || (endpoints.get && endpoints.get.resourcestypes))
//- script(type="module" src="https://cdn.skypack.dev/@startinblox/component-resource@1.0" defer)
//- 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.6" defer)
script(type="module" src="https://cdn.skypack.dev/@startinblox/component-job-board@1.2" 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.7" defer)
script(type="module" src="https://cdn.skypack.dev/@startinblox/component-directory@1.2" defer)
//- script(type="module" src="/lib/solid-directory/dist/index.js" defer)
if endpoints.dashboards || (endpoints.get && endpoints.get.dashboards)
script(type="module" src="https://unpkg.com/@startinblox/component-dashboard@0.3" defer)
script(type="module" src="https://cdn.skypack.dev/@startinblox/component-dashboard@0.6" defer)
//- 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@0.8" defer)
script(type="module" src="https://cdn.skypack.dev/@startinblox/component-chat@1.4" defer)
//- script(type="module" src="/lib/solid-xmpp-chat/dist/index.js" defer)
if endpoints.polls || (endpoints.get && endpoints.get.polls)
script(type="module" src="https://unpkg.com/@startinblox/component-poll@1.0" defer)
//- script(type="module" src="/lib/sib-event-component/sib-event.js" defer)
//- DISABLED - please migrate to dev.skypack.dev + upgrade to core@0.13
//- if endpoints.polls || (endpoints.get && endpoints.get.polls)
//- script(type="module" src="https://cdn.skypack.dev/@startinblox/component-poll@1.0" defer)
//- script(type="module" src="/lib/sib-polls-component/index.js" defer)
//- swal2 does not work with skypack
script(src="https://cdn.jsdelivr.net/npm/sweetalert2@10")
script(src="/scripts/index.js" defer)

View File

@ -1,6 +1,9 @@
.logo
solid-link(next='dashboard')
img(src=`${clientLogo || '/images/logo.png'}` style=`max-height:${clientLogoHeight || '32px'}`)
.header-left
.logo
solid-link(next='dashboard')
img(src=`${clientLogo || '/images/logo.webp'}` style=`max-height:${clientLogoHeight || '74px'}`)
span.beta-tag(data-trans='header.beta')
solid-notifications.notLoggedIn(
nested-field="inbox"
@ -8,8 +11,8 @@ solid-notifications.notLoggedIn(
)
//- Templates for notifications from circles and from other users
include views/circle/page-circle-notifications.pug
include views/user/page-user-notifications.pug
include views/notifications/message-circle.pug
include views/notifications/message-private.pug
include templates/hubl-user-avatar.pug
@ -27,18 +30,18 @@ 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
sib-auth(style='display:none!important')
sib-auth(style='display:none!important', auto-login)
sib-auth-provider(
data-authority=`${authority}`
data-id=`${authorityName || "authority"}`

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

BIN
src/images/favicon.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 832 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

BIN
src/images/logo.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -9,11 +9,11 @@ html(lang="en")
if clientFavicon
link(rel="icon" type="image/png" href=`${clientFavicon}`)
else
link(rel="icon" type="image/png" href="/images/favicon.png")
link(rel="icon" type="image/webp" href="/images/favicon.webp")
include dependencies.pug
if clientCSS
link(rel='stylesheet', href=`${clientCSS}`)
link(rel="manifest" href="/manifest.webmanifest")
body
.wrapper
@ -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-render).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-render).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", no-render).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", no-render).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", no-render).with-sidebar
include page-messages.pug
if endpoints.polls || (endpoints.get && endpoints.get.polls)
#polls(hidden).with-sidebar
#polls(hidden, data-view="polls", no-render).with-sidebar
include page-polls.pug
if endpoints.events || (endpoints.get && endpoints.get.events)
#events(hidden)
#events(hidden, data-view="events", no-render)
include page-events.pug
if endpoints.resources || (endpoints.get && endpoints.get.resources)
#resources(hidden)
#resources(hidden, data-view="resources", no-render)
include page-resources.pug
#admin(hidden).with-sidebar
#admin(hidden, data-view="admin", no-render).with-sidebar
include page-admin.pug
#about(hidden).no-sidebar.with-padding
#about(data-view="about", no-render).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-render).no-sidebar
include page-profile.pug
if analytics

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

@ -0,0 +1,208 @@
{
"header": {
"beta": "Beta",
"myProfile": "My profile",
"admin": "Administration",
"about": "About",
"logOut": "Logout",
"logIn": "Log-in"
},
"menuLeft": {
"emptyCircleProject": {
"notPartOf": "You're not part of",
"createNew": "To create a new one, you can go in the",
"adminPanel": "administration panel",
"project": "project",
"circle": "circle"
},
"dashboard": "Dashboard",
"events": "Events",
"gov": "Governance",
"resources": "Resources",
"jobBoard": "Job offers",
"profileDirectory": "Profiles directory",
"projects": "Projects",
"circles": "Circles",
"messages": "Messages",
"search": "Search..."
},
"about": {
"title": "About",
"card1": {
"subTitle": "This application is developed by Startin'blox",
"paragraph1": "Startin'blox is a cooperative that develops open source tools to easily and cheaply build federated and interoperable applications based on the latest web standards pushed by the SOLID project.",
"paragraph2": "Its mission is to empower users by enabling them to regain control of their digital tools and benefit from a network effect within a chosen ecosystem in order to emancipate themselves from large platforms."
},
"card2": {
"title": "Contact us",
"paragraph-1": "You want to contribute, report a bug, suggest an improvement, work with us?",
"link": "Contact"
}
},
"admin": {
"menuRight": {
"fold": "Fold the menu",
"community": "Communities",
"circles": "Circles",
"projects": "Projects"
}
},
"dashboard": {
"title": "Dashboard"
},
"circle": {
"menuRight": {
"buttonMobile": "MENU",
"fold": "Fold the menu",
"chat": "Chat",
"information": "Information",
"resources": "Resources",
"events": "Events",
"polls": "Polls"
},
"create": {
"backlink": "Back",
"title": " Create a circle",
"labelStatus": "Statut du circle",
"labelName": "Circle name *",
"labelDescription": "Circle headline *",
"buttonSubmit": "Save"
},
"edit": {
"buttonDelete": "Remove",
"backlink": "Back",
"title": "Edit your circle",
"labelStatus": "Circle status",
"labelName": "Circle name *",
"labelOwner": "Admin *",
"labelDescription": "Circle headline *",
"subTitle": "Members list :",
"tableHeader1": "Name",
"tableHeader2": "Access",
"buttonSubmit": "Save",
"buttonAddMember": "Add a member"
},
"list": {
"title": "Administration",
"buttonMobile": "MENU",
"subTitle": "Circles",
"buttonCreate": " Create a circle",
"tableHeader1": "Name",
"tableHeader2": "Admins",
"tableHeader3": "Join",
"buttonQuit": "Leave",
"buttonJoin": "Join"
},
"left": {
"paragraphQuit": "You left this circle.",
"paragraphJoin": "To join it again, go to the panel",
"paragraphContact": "or contact an admin.",
"admin": "administration"
},
"profile": {
"creationDate": "Creation date : ",
"buttonModify": "Edit and add a member",
"buttonAdd": "Add a member",
"buttonDelete": "Remove the circle",
"buttonQuit": "Leave the circle",
"buttonJoin": "Join the circle",
"subTitle": "Members :"
}
},
"communities": {
"title": "Administration",
"menuMobile": "MENU",
"linkInvite": "Invite a new user",
"noPermission": "Member, no permission",
"subTitle": "Communities",
"tableHeader1": "Name",
"tableHeader2": "Action"
},
"project": {
"menuRight": {
"buttonMobile": "MENU",
"fold": "Fold the menu",
"chat": "Chat",
"information": "Information"
},
"create": {
"backlink": "Back",
"title": " Create a nouveau project",
"labelName": "Project name*",
"labelCustomer": "Customer name*",
"labelCaptain": "Project captain*",
"buttonSubmit": "Save"
},
"edit": {
"buttonDelete": "Remove",
"backlink": "Back",
"title": "Edit your project",
"labelName": "Project name *",
"labelCustomer": "Customer name *",
"subTitle": "Team members :",
"tableHeader1": "Name",
"tableHeader2": "Access",
"buttonSubmit": "Save",
"buttonAddMember": "Add a member"
},
"modifyPicture": {
"backlink": "Back",
"title": "Modify the project picture"
},
"list": {
"title": "Administration",
"buttonMobile": "MENU",
"subTitle": "Projects",
"buttonCreate": "Create a new project",
"tableHeader1": "Name",
"tableHeader2": "Admins",
"tableHeader3": "Captains",
"tableHeader4": "Join",
"buttonQuit": "Leave",
"buttonJoin":"Join"
},
"left": {
"paragraphQuit": "You left this project.",
"paragraphJoin": "This is a private project. To join it again, go to the panel",
"paragraphContact": "and request an invitation.",
"admin": "administration"
},
"profile": {
"creationDate": "Creation date : ",
"buttonModify": "Edit and add a member",
"buttonAdd": "Add a member",
"buttonDelete": "Delete the project",
"buttonQuit": "Leave the project",
"buttonJoin": "Join the project",
"captain": "Captain :",
"subTitle": "Team :"
}
},
"user": {
"create": {
"backlink": "Back",
"title": "Invite a user to ",
"labelUsername": "Username*",
"labelUsernameTitle": "Alphanumeric characters only",
"labelEmail": "E-mail *",
"labelFirstname": "Firstname *",
"labelLastname": "Lastname *",
"buttonSubmit": "Invite"
}
},
"notification": {
"circle": {
"in": "in"
},
"private": {
"private": "in private"
}
},
"template-captain": {
"isLead": "Captain"
},
"hublStatus": {
"private": "Private",
"public": "Public"
}
}

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

@ -0,0 +1,208 @@
{
"header": {
"beta": "Beta",
"myProfile": "Mi perfil",
"admin": "Administración",
"about": "Acerca de",
"logOut": "Cerrar sesión",
"logIn": "Iniciar sesión"
},
"menuLeft": {
"emptyCircleProject": {
"notPartOf": "No eres parte de ninguno",
"createNew": "Para crear uno nuevo, puede ir al ",
"adminPanel": "panel de administración",
"project": "proyecto",
"circle": "círculo"
},
"dashboard": "Panel de control",
"events": "Eventos",
"gov": "Gobernanza",
"resources": "Recursos",
"jobBoard": "Ofertas de trabajo",
"profileDirectory": "Directorio de miembrxs",
"projects": "Proyectos",
"circles": "Círculos",
"messages": "Mensajes",
"search": "Buscar..."
},
"about": {
"title": "Acerca de",
"card1": {
"subTitle": "Esta aplicación fue desarrollada por Startin'blox",
"paragraph1": "Startin'blox es una cooperativa que desarrolla herramientas gratuitas para construir de manera fácil y económica aplicaciones federadas e interoperables basadas en los últimos estándares web impulsados por el proyecto SOLID.",
"paragraph2": "Su misión es devolver el poder a los usuarios permitiéndoles recuperar el control de su herramienta digital y beneficiarse de un efecto de red dentro de un ecosistema elegido para emanciparse de las grandes plataformas."
},
"card2": {
"title": "Contactenos",
"paragraph-1": "¿Quieres contribuir, informar de un error, sugerir una mejora, trabajar con nosotrxs?",
"link": "Contacto"
}
},
"admin": {
"menuRight": {
"fold": "Contraer el menú",
"community": "Comunidades",
"circles": "Círculos",
"projects": "Proyectos"
}
},
"dashboard": {
"title": "Panel de control"
},
"circle": {
"menuRight": {
"buttonMobile": "MENÚ",
"fold": "Contraer el menú",
"chat": "Chat",
"information": "Información",
"resources": "Recursos",
"events": "Eventos",
"polls": "Encuentas"
},
"create": {
"backlink": "Atrás",
"title": "Crear un círculo",
"labelStatus": "Estado del círculo",
"labelName": "Nombre del círculo *",
"labelDescription": "Subtítulo del círculo *",
"buttonSubmit": "Guardar"
},
"edit": {
"buttonDelete": "Eliminar",
"backlink": "Atrás",
"title": "Modificá tu círculo",
"labelStatus": "Estado del círculo",
"labelName": "Nombre del círculo *",
"labelOwner": "Administrador/a *",
"labelDescription": "Subtítulo del círculo *",
"subTitle": "Listado de miembrxs: ",
"tableHeader1": "Nombre",
"tableHeader2": "Acceso",
"buttonSubmit": "Guardar",
"buttonAddMember": "Añadir miembrx"
},
"list": {
"title": "Administración",
"buttonMobile": "MENÚ",
"subTitle": "Círculos",
"buttonCreate": "Crear un círculo",
"tableHeader1": "Nombre",
"tableHeader2": "Administradorxs",
"tableHeader3": "Unirse",
"buttonQuit": "Salir",
"buttonJoin": "Unirse"
},
"left": {
"paragraphQuit": "Dejaste este círculo.",
"paragraphJoin": "Para volver a unirse, vaya al panel",
"paragraphContact": "o contacte un/a administrador/a",
"admin": "de administración"
},
"profile": {
"creationDate": "Fecha de creación: ",
"buttonModify": "Editar y agregar un/a miembrx",
"buttonAdd": "Agregar un/a miebro",
"buttonDelete": "Eliminar el círculo",
"buttonQuit": "Salir del círculo",
"buttonJoin": "Unirse al círculo",
"subTitle": "Miembrxs: "
}
},
"communities": {
"title": "Administración",
"menuMobile": "MENÚ",
"linkInvite": "Invita a un/a nuevx usuarix",
"noPermission": "Miembrx sin permiso",
"subTitle": "Comunidades",
"tableHeader1": "Nombre",
"tableHeader2": "Acción"
},
"project": {
"menuRight": {
"buttonMobile": "MENÚ",
"fold": "Contraer el menú",
"chat": "Chat",
"information": "Información"
},
"create": {
"backlink": "Atrás",
"title": "Crear un proyecto nuevo",
"labelName": "Nombre del proyecto *",
"labelCustomer": "Nombre del/la clientx *",
"labelCaptain": "Líder del proyecto *",
"buttonSubmit": "Guardar"
},
"edit": {
"buttonDelete": "Eliminar",
"backlink": "Atrás",
"title": "Modificar tu proyecto",
"labelName": "Nombre del proyecto *",
"labelCustomer": "Nombre del/la clientx *",
"subTitle": "Lista de miembrxs: ",
"tableHeader1": "Nombre",
"tableHeader2": "Acceso",
"buttonSubmit": "Guardar",
"buttonAddMember": "Añadir miembrx"
},
"modifyPicture": {
"backlink": "Atrás",
"title": "Cambiar la imagen del proyecto"
},
"list": {
"title": "Administración",
"buttonMobile": "MENÚ",
"subTitle": "Proyectos",
"buttonCreate": "Crear un proyecto nuevo",
"tableHeader1": "Nombre",
"tableHeader2": "Administradorxs",
"tableHeader3": "Líderes",
"tableHeader4": "Unirse",
"buttonQuit": "Salir",
"buttonJoin": "Unirse"
},
"left": {
"paragraphQuit": "Dejaste este proyecto.",
"paragraphJoin": "Este es un proyecto privado. Para volver a unirse, vaya al panel",
"paragraphContact": "y solicite una invitación.",
"admin": "de administración"
},
"profile": {
"creationDate": "Fecha de creación: ",
"buttonModify": "Editar y agregar un/a miembrx",
"buttonAdd": "Añadir miembrx",
"buttonDelete": "Eliminar el proyecto",
"buttonQuit": "Salir del proyecto",
"buttonJoin": "Unirse al proyecto",
"captain": "Líder : ",
"subTitle": "Equipo : "
}
},
"user": {
"create": {
"backlink": "Atrás",
"title": "Invitar a un/a usuarix",
"labelUsername": "Nombre de usuarix *",
"labelUsernameTitle": "Solo caracteres alfanuméricos",
"labelEmail": "E-mail *",
"labelFirstname": "Nombre *",
"labelLastname": "Apellido *",
"buttonSubmit": "Invitar"
}
},
"notification": {
"circle": {
"in": "dentro"
},
"private": {
"private": "en privado"
}
},
"template-captain": {
"isLead": "Líder"
},
"hublStatus": {
"private": "Privado",
"public": "Público"
}
}

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,78 +14,85 @@ 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
solid-display(
data-src='${value}'
fields='status, name, jabberID, badge'
value-badge='${value}'
widget-status='hubl-menu-publicprivate'
widget-badge='hubl-counter'
widget-jabberID='hubl-menu-jabberid'
widget-name='solid-display-div'
order-by="name"
)
solid-link(data-src="${value}" next="circle")
solid-display(
data-src='${value}'
fields='status, name, jabberID, badge'
value-badge='${value}'
widget-status='hubl-menu-publicprivate'
widget-badge='hubl-counter'
widget-jabberID='hubl-menu-jabberid'
widget-name='solid-display-div'
order-by="name"
)
solid-widget(name='hubl-menu-fix-url-project')
template
solid-display(
data-src='${value}'
fields='status, project(customer.name, name, jabberID), badge'
class-name='project-name'
class-customer.name='project-customer'
value-badge='${value}'
widget-status='hubl-menu-publicprivate'
widget-jabberID='hubl-menu-jabberid'
widget-badge='hubl-counter'
widget-name='solid-display-div'
order-by="customer.name"
)
solid-link(data-src="${value}" next="project")
solid-display(
data-src='${value}'
fields='status, project(customer.name, name, jabberID), badge'
class-name='project-name'
class-customer.name='project-customer'
value-badge='${value}'
widget-status='hubl-menu-publicprivate'
widget-jabberID='hubl-menu-jabberid'
widget-badge='hubl-counter'
widget-name='solid-display-div'
order-by="customer.name"
)
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)
div
solid-link(next='admin-project-list')
div.menu-wrapper
solid-link
//- (next='admin-project-list')
div.menu
div.menu-chevron
div.menu-icon.icon-arrow-right-circle
div.menu-label Projets
div.menu-icon.icon-arrow-up
//- div.menu-icon.icon-arrow-right-circle
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
@ -100,19 +107,21 @@ 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'
next='project'
order-by="project.customer.name"
)
div.divider
if endpoints.circles || (endpoints.get && endpoints.get.circles)
div
solid-link(next='admin-circle-list')
div.menu-wrapper
solid-link
//- (next='admin-circle-list')
div.menu
div.menu-chevron
div.menu-icon.icon-arrow-right-circle
div.menu-label Cercles
div.menu-icon.icon-arrow-up
//- div.menu-icon.icon-arrow-right-circle
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
@ -127,10 +136,10 @@ 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'
next='circle'
order-by="circle.name"
)
div.divider
if endpoints.users || (endpoints.get && endpoints.get.users)
@ -138,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
@ -152,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-users(hidden)
include views/admin/page-admin-users.pug
#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.active-color(name='admin-users')
solid-route(name='admin-communities')
li
a Utilisateurs
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

@ -3,21 +3,23 @@
div.content-box__header
solid-display(
bind-resources
fields='name, parenthesis, username, endParenthesis'
value-parenthesis=" ("
value-endParenthesis=")"
fields='avatar-container(account.picture), text(name, hyphen, at, username)'
value-hyphen=" - "
value-at="@"
class-parenthesis='h1-like'
class-endParenthesis='h1-like'
widget-account.picture='hubl-user-avatar'
class-text="avatar-text"
class-avatar-container="avatar-container"
class-account.picture='avatar'
class-name='h1-like'
class-username='h1-like'
class-hypen='h1-like'
)
.chat-view
solid-xmpp-chat(
data-authentication='login',
data-auto-login='true',
data-bosh-service-url=`${xmpp}`,
data-websocket-url=`${xmppWebsocket || 'wss://jabber.happy-dev.fr/xmpp-websocket'}`,
data-i18n='en',
bind-resources
)

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

@ -1,71 +0,0 @@
include templates/hubl-groups.pug
.content-box.with-form.user-profile__container
.section.user-bio
solid-display.avatar-display(
bind-user=''
fields='account.picture'
label-account.picture=''
widget-account.picture='solid-display-img'
)
solid-display.name-diplay(
bind-user=''
fields='user-name-groups(name, groups), username'
class-name='name'
label-groups=''
multiple-groups=''
widget-groups='hubl-groups-name'
class-username='username'
)
solid-form.info-form(
bind-user=''
fields='profile.bio, inline-1(profile.city, email), inline-2(profile.phone, profile.website), inline-3(profile.available), account.picture, instruction'
class-profile.bio='form-label is-light'
label-profile.bio='short description'
class-profile.city='form-label is-light'
label-profile.city='your cell'
class-email='form-label is-light'
class-profile.phone='form-label is-light'
label-profile.phone='phone'
class-profile.website='form-label is-light'
label-profile.website='your website'
class-profile.available='form-label is-light'
label-profile.available='your availability'
class-account.picture='form-label is-light'
label-account.picture='your picture'
widget-instruction='hubl-instruction'
)
.section.user-skills
solid-form(
bind-user=''
range-skills=`${endpoints.skills || endpoints.get.skills}`
fields='skills'
class-skills='form-label is-dark'
label-skills='Your main skills (4 max.):'
multiple-skills='solid-multiple-select'
widget-skills='solid-form-auto-completion'
)
solid-widget(name='hubl-instruction')
template
span Show us your most beautiful smile
p Pictures help us to know ourselves and also to recognize ourselves, so don't be afraid to show your pretty face and avoid strange avatars.

View File

@ -0,0 +1,60 @@
document.addEventListener("DOMContentLoaded", () => {
const resizeChat = () => {
let isMobile = window.innerWidth < 993;
let isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
let isFirefoxMobile = navigator.platform.toLowerCase().indexOf("mobile") > -1 || navigator.platform.toLowerCase().indexOf("tablet") > -1;
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 = isMobile ? (isFirefox && isFirefoxMobile) ? "calc(100vh - 106px - 57px)" : "calc(100vh - 106px)" : "calc(100vh - 64px - 83px)")
);
}
}
}, 15);
}
};
resizeChat();
let isbody = setInterval(() => {
if (document.body) {
clearInterval(isbody);
resizeChat();
}
}, 50);
window.addEventListener("load", () => {
setTimeout(() => {
resizeChat();
}, 0);
});
let windowResizing;
window.addEventListener("resize", () => {
windowResizing = setTimeout(() => {
clearInterval(windowResizing);
resizeChat();
}, 50);
});
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

@ -1,4 +1,4 @@
document.addEventListener("DOMContentLoaded", function (event) {
document.addEventListener("DOMContentLoaded", function () {
document
.querySelector("sib-auth")
.getUser()
@ -10,8 +10,6 @@ document.addEventListener("DOMContentLoaded", function (event) {
document
.querySelector('.loggedIn')
.setAttribute("style", "display:none !important");
} else {
document.querySelector('sib-auth').login();
}
});
});

View File

@ -0,0 +1,11 @@
document.addEventListener("DOMContentLoaded", () => {
const menuWrappers = Array.from(document.querySelectorAll(".menu-wrapper"));
//- Toggle sub-menus
menuWrappers.forEach(menuWrapper => {
const menu = menuWrapper.querySelector(".menu");
menu.addEventListener("click", e => {
menuWrapper.classList.toggle("is-closed");
});
});
});

View File

@ -27,10 +27,10 @@ function closeUserControls() {
);
}
document.addEventListener("DOMContentLoaded", function(event) {
document.addEventListener("DOMContentLoaded", function() {
//- View change event
window.addEventListener("navigate", event => {
window.addEventListener("navigate", () => {
closeLeftMenu();
closeUserControls();
});
@ -63,7 +63,7 @@ document.addEventListener("DOMContentLoaded", function(event) {
}
};
document.querySelector("#toggleMainMenu").addEventListener("click", event => {
document.querySelector("#toggleMainMenu").addEventListener("click", () => {
let leftMenu = document.querySelector("#main__menu");
if (leftMenu.hasAttribute("open")) {
closeLeftMenu();
@ -75,7 +75,7 @@ document.addEventListener("DOMContentLoaded", function(event) {
const rightMenus = Array.from(document.querySelectorAll("nav.jsRightMenu"));
rightMenus.forEach(rightMenu => {
const btnRightMenu = rightMenu.querySelector("li.jsOffsiteToggle");
btnRightMenu.addEventListener("click", e => {
btnRightMenu.addEventListener("click", () => {
if (rightMenu.hasAttribute("open")) {
closeRightMenu();
} else {
@ -86,7 +86,7 @@ document.addEventListener("DOMContentLoaded", function(event) {
Array.from(document.querySelectorAll(".jsMobileSidebarOpenButton")).forEach(
el => {
el.addEventListener("click", event => {
el.addEventListener("click", () => {
openRightMenu();
});
}

View File

@ -0,0 +1,11 @@
// if('serviceWorker' in navigator) {
// var refreshing;
// navigator.serviceWorker.addEventListener('controllerchange', () => {
// if (refreshing) {
// return;
// }
// refreshing = true;
// window.location.reload();
// });
// navigator.serviceWorker.register('/sw.js');
// }

View File

@ -0,0 +1,19 @@
document.addEventListener("DOMContentLoaded", () => {
const Toast = Swal.mixin({
toast: true,
position: 'top',
showConfirmButton: false,
timer: 3000,
timerProgressBar: true,
didOpen: (toast) => {
toast.addEventListener('mouseenter', Swal.stopTimer)
toast.addEventListener('mouseleave', Swal.resumeTimer)
}
})
document.addEventListener("save", () => {
Toast.fire({
icon: 'success',
title: 'Succès!'
})
});
});

View File

@ -1,7 +1,7 @@
document.addEventListener("DOMContentLoaded", function (event) {
document.addEventListener("DOMContentLoaded", function () {
window.addEventListener('newMessage', event => {
let jid = event.detail.jid;
Array.from(document.querySelectorAll('[data-jabberID="'+jid+'"]')).forEach(el => {
Array.from(document.querySelectorAll('[data-jabberID="' + jid + '"]')).forEach(el => {
el.parentElement.parentElement.classList.add('unread');
});
});
@ -9,7 +9,12 @@ document.addEventListener("DOMContentLoaded", function (event) {
window.addEventListener('read', (event) => {
if (event.detail && event.detail.resource && event.detail.resource['@id']) {
const badge = document.querySelector(`solid-badge[data-src="${event.detail.resource['@id']}"]`);
if (badge) badge.parentElement.parentElement.classList.remove('unread');
if (badge) {
badge.parentElement.parentElement.classList.remove('unread');
const project = badge.parentElement.parentElement.querySelector('.unread');
if (project) project.classList.remove('unread');
}
}
});
});

View File

@ -44,7 +44,7 @@ function recursiveAdaptWidgets(prefix, element, user) {
});
}
document.addEventListener("DOMContentLoaded", function (event) {
document.addEventListener("DOMContentLoaded", function () {
document
.querySelector("sib-auth")
.getUser()

View File

@ -102,6 +102,8 @@
--color-select-list: var(--color-secondary);
--color-select-add-button: var(--color-button-secondary);
--color-select-add-button-background: var(--color-button-white);
--color-add-button-background: var(--color-button-secondary);
--color-add-button: var(--color-white);
--color-label-light: var(--color-grey-6);

View File

@ -1,6 +1,4 @@
#about{
$main-color: rgb(236, 94, 92);
$second-color: white;
h2,h3{
text-transform: uppercase;
}
@ -37,10 +35,10 @@
}
.main-cta{
background: $second-color none repeat scroll 0% 0%;
border: 1px solid $main-color;
background: var(--color-white) none repeat scroll 0% 0%;
border: 1px solid var(--color-primary);
border-radius: 55px;
color: $main-color;
color: var(--color-primary);
cursor: pointer;
font-weight: bold;
text-transform: uppercase;
@ -51,8 +49,8 @@
}
.main-cta:hover{
background: $main-color none repeat scroll 0% 0%;
border : 1px solid $second-color;
color: $second-color;
background: var(--color-primary) none repeat scroll 0% 0%;
border : 1px solid var(--color-primary);
color: var(--color-white);
}
}

View File

@ -1,3 +1,9 @@
solid-form {
[data-id="error"] {
display: none !important; // Hide the default core message, english only with a weird message
}
}
.form form {
display: block;
height: fit-content;
@ -41,16 +47,14 @@
.form-label {
/*flex: 1 1 auto;*/
label {
display: flex;
flex-direction: column; /* To align label and input vertically */
font-weight: 600;
margin-bottom: 0.8rem;
margin-top: 1.8rem;
text-transform: uppercase;
}
display: flex;
flex-direction: column; /* To align label and input vertically */
font-weight: 600;
margin-bottom: 0.8rem;
margin-top: 1.8rem;
text-transform: uppercase;
&.is-light label {
&.is-light {
color: var(--color-label-light);
}
}
@ -130,11 +134,14 @@ textarea {
/* WIDGETS SIB (let in .content-box to override default styles) */
solid-form-auto-completion,
solid-form-dropdown-autocompletion,
solid-form-dropdown-autocompletion-label,
solid-form-multipleselect-autocompletion-label,
hubl-status {
.ss-main {
font-weight: normal;
margin-top: 0.8rem;
text-transform: none;
@ -144,7 +151,6 @@ hubl-status {
border-radius: 0px;
color: var(--color-input-text);
font-weight: normal;
margin-top: 0.8rem;
min-height: 4.6rem;
padding-left: 1.2rem;
@ -179,6 +185,7 @@ hubl-status {
display: flex;
flex-direction: row;
margin-bottom: 2.6rem;
margin-top: 1.8rem;
}
label {
@ -199,6 +206,7 @@ hubl-status {
width: 100%;
@include breakpoint(lg) {
height: 32px;
margin: auto 0 auto 2.2rem;
width: auto;
}
@ -288,13 +296,13 @@ solid-form-file {
}
}
/*solid-multiple-select {
/*solid-form-multipleselect {
&.select-skills .ss-values .ss-disabled::before {
content: "Select skills";
}
solid-form-auto-completion > label {
solid-form-dropdown-autocompletion-label > label {
display: flex;
flex-direction: column;
@ -378,7 +386,8 @@ hubl-member-form {
margin-bottom: 1rem;
}
solid-form-auto-completion {
solid-form-dropdown-autocompletion-label,
solid-form-multipleselect-autocompletion-label {
float: left;
}

View File

@ -26,6 +26,34 @@
}
}
.header-left {
flex-grow: 1;
position: relative;
.logo {
display: inline-block;
}
.beta-tag {
display: none;
@include breakpoint(lg) {
display: inline-block;
font-size: 1.4rem;
font-weight: 600;
line-height: 19px;
letter-spacing: 0.19px;
padding: 3px 13px 3px 15px;
border-radius: 3px;
background: var(--color-primary);
color: var(--color-white);
position: fixed;
top: 12px;
left: 267px;
}
}
}
>*:not(:first-child) {
margin-left: 2rem;
@ -34,15 +62,15 @@
}
}
.logo {
flex: 1 0 0;
align-items: stretch;
}
/* To remove the place taken by this element */
/* Fix: to remove the place taken by these elements */
solid-widget[name='hubl-user-avatar'] {
display: contents;
}
solid-notifications-template[data-rdf-type='hd:circle'],
solid-notifications-template[data-rdf-type='foaf:user'] {
position: absolute;
}
}
/* General styling for both notification and user's panel */

File diff suppressed because it is too large Load Diff

View File

@ -1,263 +1,302 @@
#main__menu {
background-color: var(--color-menu-background);
color: var(--color-menu-text);
/*transition: flex-basis 0.5s ease-in-out;*/
&.open {
transform: translateX(0);
background-color: var(--color-menu-background);
color: var(--color-menu-text);
/*transition: flex-basis 0.5s ease-in-out;*/
&.open {
transform: translateX(0);
}
.unread {
font-weight: bolder;
}
solid-router {
.menu-wrapper {
.menu-icon.icon-arrow-up {
visibility: hidden;
}
@include breakpoint(lg) {
.menu-icon.icon-arrow-up {
visibility: visible;
}
&.is-closed {
.sub-menu {
display: none;
}
.menu-chevron {
transform: rotate(180deg);
}
}
}
}
.unread {
font-weight: bolder;
solid-link {
width: 100%;
}
solid-router {
.menu-wrapper {
&.is-closed {
.sub-menu {
display: none;
}
.menu-chevron {
transform: rotate(180deg);
}
.menu {
cursor: pointer;
display: flex;
flex-direction: row-reverse;
font-weight: bold;
padding: 1.2rem;
&[active] {
background-color: var(--color-menu-highlight-primary);
.menu-icon:before {
background-color: var(--color-menu-icon-background-active);
}
.menu-notification>solid-display>div:first-child {
background-color: var(--color-menu-badge-background);
}
}
.menu-icon {
align-items: center;
display: flex;
justify-content: center;
flex-grow: 0;
flex-shrink: 0;
font-size: 1.7rem;
width: 3.2em;
&:before {
border-radius: 100%;
height: 1.9em;
line-height: 1.9em;
width: 1.9em;
}
}
.menu-label {
display: flex;
flex-direction: column;
flex-grow: 1;
flex-shrink: 0;
font-weight: 600;
justify-content: center;
letter-spacing: 0.017rem;
text-transform: uppercase;
width: 8em;
}
.menu-chevron {
align-items: center;
display: flex;
flex-grow: 0;
flex-shrink: 0;
justify-content: center;
width: 2em;
}
>solid-display {
display: block;
}
}
.sub-menu {
/* Ellipsis for project tab */
.project-tab>div>solid-display>div:nth-child(1) {
solid-set-default[name='project'] {
flex: 3;
.project-customer,
.project-name {
box-sizing: border-box;
display: block;
width: calc(80vw - 96px); /*96px = padding of the element + width and margin of counter */
@include breakpoint(lg) {
width: 150px;
}
}
.project-customer,
.project-name>div {
@include breakpoint(lg) {
display: block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
}
solid-link {
width: 100%;
}
/* Ellipsis for circle tab */
.circle-tab>div>solid-display>div {
solid-display-div[name='name'] {
flex: 3;
>div[name='name'] {
box-sizing: border-box;
padding-left: 0.2em;
width: calc(80vw - 96px); /*96px = padding of the element + width and margin of counter */
@include breakpoint(lg) {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 150px;
}
}
}
.menu {
}
/* Ellipsis for message tab */
.message-tab>div>solid-display>div>solid-display-div>div {
box-sizing: border-box;
width: calc(80vw - 96px); /*96px = padding of the element + width and margin of counter */
@include breakpoint(lg) {
width: 150px;
}
}
solid-display.nosub>solid-form[fields="name"]>hubl-search-users>input {
margin-left: 30px;
margin-bottom: 10px;
width: calc(80vw - 71px);
display: block;
background-color: var(--color-secondary);
color: var(--color-white);
border: 1px solid var(--color-grey-4);
border-radius: 3px;
padding: 4px;
@include breakpoint(lg) {
margin: auto;
margin-bottom: 10px;
width: auto;
}
}
solid-display.nosub>nav {
text-align: center;
overflow: hidden;
display: grid;
grid-template-columns: auto 50% auto;
grid-template-areas: "left middle right";
>* {
color: var(--color-white);
}
>[data-id="prev"] {
grid-area: left;
}
>[data-id="next"] {
grid-area: right;
}
>span {
grid-area: middle;
}
}
hubl-menu-publicprivate {
display: inline-block;
text-align: center;
div {
font-family: simple-line-icons;
width: 20px;
font-size: 0.8em;
padding-top: 0.1em;
}
}
>solid-display.nosub>div>solid-display>div {
padding: 1rem 1rem 1rem 3rem;
}
solid-display>div {
.create {
color: var(--color-white);
margin: 1rem 1rem 2.2rem 3.2rem;
}
&>solid-display {
&:last-child>div {
margin-bottom: 2.2rem;
}
>div {
color: var(--color-white);
cursor: pointer;
display: flex;
flex-direction: row-reverse;
font-weight: bold;
padding: 1.2rem;
&[active] {
background-color: var(--color-menu-highlight-primary);
.menu-icon:before {
background-color: var(--color-menu-icon-background-active);
}
.menu-notification>solid-display>div:first-child {
background-color: var(--color-menu-badge-background);
}
}
&[name="dashboard"][active] .menu-icon:before,
&[name="members"][active] .menu-icon:before,
&[name="resources"][active] .menu-icon:before,
&[name="polls"][active] .menu-icon:before,
&[name="events"][active] .menu-icon:before {
background-color: transparent;
}
.menu-icon {
align-items: center;
display: flex;
justify-content: center;
flex-grow: 0;
flex-shrink: 0;
font-size: 1.7rem;
width: 3.2em;
&:before {
border-radius: 100%;
height: 1.9em;
line-height: 1.9em;
width: 1.9em;
}
}
.menu-label {
display: flex;
flex-direction: column;
flex-grow: 1;
flex-shrink: 0;
font-weight: 600;
justify-content: center;
letter-spacing: 0.017rem;
text-transform: uppercase;
width: 8em;
}
.menu-chevron {
align-items: center;
display: flex;
flex-grow: 0;
flex-shrink: 0;
justify-content: center;
width: 2em;
}
>solid-display {
display: block;
}
&[name="events"],
&[name="resources"],
&[name="polls"],
&[name="dashboard"],
&[name="members"] {
.menu-label {
width: 9.9em;
}
>hubl-menu-fix-url-circle>solid-link>solid-display>div,
>hubl-menu-fix-url-project>solid-link>solid-display>div {
padding: 1rem 1rem 1rem 3rem;
}
}
&[fields="project(customer.name, name), badge"]>div {
padding: 0;
}
}
.sub-menu {
/* Ellipsis for project tab */
.project-tab>div>solid-display>div:nth-child(1) {
solid-set-default[name='project'] {
flex: 3;
.project-customer,
.project-name {
box-sizing: border-box;
display: block;
width: calc(80vw - 96px);
/*96px = padding of the element + width and margin of counter */
@include breakpoint(lg) {
width: 150px;
}
}
.project-customer,
.project-name>div {
@include breakpoint(lg) {
display: block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
}
}
/* Ellipsis for circle tab */
.circle-tab>div>solid-display>div {
solid-display-div[name='name'] {
flex: 3;
>div[name='name'] {
box-sizing: border-box;
padding-left: 0.2em;
width: calc(80vw - 96px);
/*96px = padding of the element + width and margin of counter */
@include breakpoint(lg) {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 150px;
}
}
}
}
/* Ellipsis for message tab */
.message-tab>div>solid-display>div>solid-display-div>div {
box-sizing: border-box;
width: calc(80vw - 96px);
/*96px = padding of the element + width and margin of counter */
@include breakpoint(lg) {
width: 150px;
}
}
solid-display.nosub>solid-form[fields="name"]>hubl-search-users>input {
margin-left: 30px!important;
margin-bottom: 10px;
width: calc(80vw - 71px);
display: block;
background-color: var(--color-secondary);
color: var(--color-grey-6);
border: 1px solid var(--color-grey-4);
border-radius: 3px;
padding: 4px;
@include breakpoint(lg) {
margin: auto;
margin-bottom: 10px;
width: auto;
&::placeholder {
color: var(--color-grey-6);
}
}
}
solid-display.nosub>nav {
text-align: center;
overflow: hidden;
display: grid;
grid-template-columns: auto 50% auto;
grid-template-areas: "left middle right";
>* {
color: var(--color-grey-6);
}
>[data-id="prev"] {
grid-area: left;
}
>[data-id="next"] {
grid-area: right;
}
>span {
grid-area: middle;
}
}
hubl-menu-publicprivate {
display: inline-block;
text-align: center;
div {
font-family: simple-line-icons;
width: 20px;
font-size: 0.8em;
padding-top: 0.1em;
}
}
>solid-display.nosub>div>solid-display>div {
padding: 1rem 1rem 1rem 3rem;
}
solid-display>div {
.create {
color: var(--color-white);
margin: 1rem 1rem 2.2rem 3.2rem;
}
&>solid-display {
&:last-child>div {
margin-bottom: 2.2rem;
}
>div {
color: var(--color-grey-6);
cursor: pointer;
>hubl-menu-fix-url-circle>solid-display>div,
>hubl-menu-fix-url-project>solid-display>div {
padding: 1rem 1rem 1rem 3rem;
}
}
&[fields="project(customer.name, name), badge"]>div {
padding: 0;
}
}
&>solid-display[active]>div,
&>solid-display>div>hubl-menu-fix-url-circle>solid-display[active]>div,
&>solid-display>div>hubl-menu-fix-url-project>solid-display[active]>div {
background-color: var(--color-menu-highlight-primary);
color: var(--color-menu-text-active);
font-weight: bold;
}
}
&.menu-notification {
>solid-display>div>solid-display>div>hubl-menu-fix-url-circle,
>solid-display>div>solid-display>div>hubl-menu-fix-url-project {
flex: 1;
}
>solid-display>div>solid-display>div,
>solid-display>div>solid-display>div>hubl-menu-fix-url-circle>solid-display>div,
>solid-display>div>solid-display>div>hubl-menu-fix-url-project>solid-display>div {
display: flex;
justify-content: space-between;
}
hubl-counter {
height: 20px;
width: 20px;
margin-right: 1em;
div.counter:not([data-nb-unread="0"]) {
text-align: center;
display: block;
background-color: var(--sib-notifications-theme, gray);
border-radius: 50%;
font-size: 12px;
line-height: 20px;
width: 20px;
height: 20px;
padding-bottom: 0;
color: var(--color-secondary);
}
}
}
&>solid-display[active]>div,
&>solid-display>div>hubl-menu-fix-url-circle>solid-link>solid-display[active]>div,
&>solid-display>div>hubl-menu-fix-url-project>solid-link>solid-display[active]>div {
background-color: var(--color-menu-highlight-primary);
color: var(--color-menu-text-active);
font-weight: bold;
}
.divider {
height: 1px;
background-color: var(--color-grey-11);
opacity: 0.2;
}
&.menu-notification {
>solid-display>div>solid-display>div>hubl-menu-fix-url-circle,
>solid-display>div>solid-display>div>hubl-menu-fix-url-project {
flex: 1;
}
>solid-display>div>solid-display>div,
>solid-display>div>solid-display>div>hubl-menu-fix-url-circle>solid-link>solid-display>div,
>solid-display>div>solid-display>div>hubl-menu-fix-url-project>solid-link>solid-display>div {
display: flex;
justify-content: space-between;
}
hubl-counter {
height: 20px;
width: 20px;
margin-right: 1em;
div.counter:not([data-nb-unread="0"]) {
text-align: center;
display: block;
background-color: var(--sib-notifications-theme, gray);
border-radius: 50%;
font-size: 12px;
line-height: 20px;
width: 20px;
height: 20px;
padding-bottom: 0;
color: var(--color-secondary);
}
}
}
}
}
.divider {
height: 1px;
background-color: var(--color-grey-11);
opacity: 0.2;
}
}
}

View File

@ -46,13 +46,17 @@
&>* {
border-bottom: 1px solid var(--color-table-border);
display: table-cell;
text-align: center;
vertical-align: middle;
}
solid-multiple[name="user.communities"] {
text-align: left;
}
}
}
&>solid-multiple {
display: contents;
/*&>solid-multiple {
display: contents;*/
&>div {
display: contents;
@ -68,7 +72,7 @@
}
}
}
}
/*}*/
}
}
}
@ -117,6 +121,14 @@
width: 280px;
}
.w450 {
width: 450px;
}
.w370 {
width: 370px;
}
.w230 {
width: 230px;
}
@ -152,6 +164,10 @@
.desktop-btn-margin__left;
}
}
&.is-spaced {
padding: 0.8rem 2.2rem;
}
}
.cell-with-name {
@ -163,23 +179,11 @@
/* Styles of elements inside cells */
.user-thumb>div,
[name='user-thumb'] {
vertical-align: middle;
text-align: left;
@extend %user-thumb__grid;
padding: 0 2.2rem;
>.user-thumb__picture {
@extend .user-thumb__picture;
}
>[name='sup'] {
@extend %user-thumb__grid-sup;
}
>[name='sub'] {
@extend %user-thumb__grid-inf;
.table {
.user-thumb.is-spaced,
[name='user-thumb'] {
padding: 0.8rem 2.2rem;
}
}

View File

@ -35,6 +35,22 @@
color: var(--color-user-thumb-name);
font-weight: 600;
margin-right: 1rem;
text-align: left;
}
.user-thumb__send {
position: relative;
bottom: 7px;
left: -5px;
solid-link {
@include icon('speech');
&::before {
display: inline-block;
color: var(--color-primary);
}
}
}
.user-thumb__admin:not(:empty) {
@ -50,8 +66,33 @@
content: '@';
}
}
solid-multiple[name="user.communities"] {
* {
display: contents;
}
solid-display-value {
&:after {
content: ",";
margin-right: 5px;
}
display: inline-block!important;
}
>solid-display>div>solid-display:last-child>div>solid-display-value:after {
display: none;
}
>solid-display {
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: calc(50% - 22px - 0.5rem);
line-height: 22px;
}
.user-thumb__city:not(:empty) {
@include mdi('atom');
align-items: center;
display: flex;
@ -76,10 +117,16 @@
margin-right: 0.50rem;
}
}
.user-thumb[name="classGroup"] {
display: block;
margin-top: 15px;
}
/* Apply the grids to all user-thumbs */
.user-thumb>div,
.user-thumb>[name='classGrid'],
[name='user-thumb'] {
@extend %user-thumb__grid;
>[name='sup'] {
@ -90,9 +137,3 @@
@extend %user-thumb__grid-inf;
}
}
/* Add extra spaces to user-thumbs that are inside a table */
.user-thumb.is-spaced>div,
[name='user-thumb'] {
padding: 0.8rem 2.2rem;
}

View File

@ -37,9 +37,9 @@
}
}
solid-conversation.conversation {
sib-conversation.conversation {
.solid-conversation {
.sib-conversation {
font-family: Open Sans;
[name='conversation-wrapper'] {
@ -74,7 +74,7 @@
solid-ac-checker {
border-top: 1px solid $color-210-17-91;
solid-form-textarea {
solid-form-textarea-label {
>label div {
color: $color-210-5-56;

View File

@ -8,6 +8,10 @@
&.with-padding {
padding: 1.3rem;
@include breakpoint(lg) {
padding: 2.5rem;
}
}
}
@ -82,7 +86,8 @@
>solid-route {
&[name*='circle'],
&[name*='project'] {
&[name*='project'],
&[name*='communities'] {
>li::before {
font-size: 4rem;
@ -116,16 +121,8 @@
@include ci('file');
}
&[name='admin-users']>li::before {
background-color: var(--color-secondary);
content: '';
display: inline-block;
height: 40px;
mask: url('/images/add-user.svg') 1% 1% / 1px 1px no-repeat;
mask-size: cover;
-webkit-mask: url('/images/add-user.svg') 1% 1% / 1px 1px no-repeat;
-webkit-mask-size: cover;
width: 40px;
&[name='admin-communities']>li {
@include ci('networking');
}
&[name='admin-circles']>li {

View File

@ -26,4 +26,3 @@
@import 'layout/dashboard/index';
@import 'layout/polls/index';
}
@import '../../client.sample.etuc.scss';

View File

@ -7,20 +7,20 @@ solid-event section {
width: 100%;
font-family: "Facit";
font-weight: 400;
color: #7A7F85;
color: var(--color-main-text);
solid-event {
sib-display div {
solid-display div {
max-width: 1110px;
sib-display {
solid-display {
margin: 0 0 20px 40px;
}
}
.red-button,
.event-type {
background-color: #C4262E;
background-color: var(--color-add-button-background);
}
.black-button {
background-color: #3A3A3A;
background-color: var(--highlight-font-color);
margin-left: 10%;
}
.event-type,
@ -30,23 +30,23 @@ solid-event section {
#listevents,
#circle-listevents {
[name="name"],
solid-display-link-event .mdi::before {
color: #063B5C;
event-display-link-event .mdi::before {
color: var(--color-primary);
}
}
.event-place-name,
.nextevent-startdate,
solid-display-link-event {
color: #3A3A3A;
event-display-link-event {
color: var(--highlight-font-color);
}
.sib-event {
.solid-event {
font-family: "Facit";
font-weight: 400;
.page-title {
font-family: "RefrigeratorDelxW01Bold";
font-size: 3.2rem;
line-height: 3.8rem;
color: #063B5C;
color: var(--color-primary);
}
}
#default-listevents,
@ -56,22 +56,21 @@ solid-event section {
width: max-content;
height: max-content;
padding: 5px 20px;
color: #063B5C;
color: var(--color-primary);
}
sib-form {
sib-form-dropdown {
margin-left: 15px;
label div {
.headline h2 {
float: left;
margin-top: 35px;
color: var(--color-primary);
text-transform: none;
font-family: "RefrigeratorDelxW01Bold";
font-size: 2.4rem;
}
solid-form {
solid-form-dropdown-label {
label {
height: 2.5rem;
}
&::before {
font-family: "RefrigeratorDelxW01Bold";
font-size: 2.4rem;
line-height: 29px;
color: #063B5C;
top: -40px;
content: "Research an event";
}
}
}
[name="name"] {
@ -79,7 +78,7 @@ solid-event section {
font-size: 1.8rem;
line-height: 2.6rem;
letter-spacing: 0.32px;
color: #063B5C;
color: var(--color-primary);
padding: 5px;
max-width: 250px;
margin: 5px auto;
@ -90,12 +89,12 @@ solid-event section {
width: max-content;
height: max-content;
}
solid-display-location-events {
event-display-location-events {
padding: 5px;
}
}
.eventdetail {
sib-display div {
solid-display div {
display: block;
}
.mdi::before {
@ -108,10 +107,10 @@ solid-event section {
font-family: "RefrigeratorDelxW01Bold";
font-size: 3.2rem;
line-height: 3.8rem;
color: #063B5C;
color: var(--color-primary);
display: block;
}
color: #063B5C;
color: var(--color-primary);
.event-type {
width: max-content;
padding: 5px 20px;
@ -124,12 +123,12 @@ solid-event section {
font-size: 1.6rem;
line-height: 2.6rem;
}
solid-display-link-event a {
event-display-link-event a {
font-size: 1.6rem;
}
}
.newevent label div,
.newevent sib-form-file div label {
.newevent solid-form-file-label div label {
line-height: 2.2rem;
text-transform: uppercase;
color: var(--form-title);
@ -165,7 +164,7 @@ solid-event section {
background-color: #f0f3f6;
}
#circle-events solid-event .events sib-form sib-form-dropdown select {
#circle-events solid-event .events solid-form solid-form-dropdown-label select {
background-color: #f0f3f6;
}

View File

@ -180,7 +180,7 @@ solid-job-board {
}
}
.solid-conversation,
.sib-conversation,
.conversation > div {
display: flex;
flex-direction: column-reverse;

View File

@ -1 +1 @@
@import '_polls.scss';
@import 'polls.scss';

View File

@ -12,27 +12,25 @@ solid-poll > div {
margin: auto;
.headline {
h2 {
margin: 0 40px;
font-family: "RefrigeratorDelxW01Bold";
font-size: 2.4rem;
line-height: 3.8rem;
color: #063B5C;
color: var(--color-primary);
float: left;
margin-top: 5px;
}
.add-poll {
solid-link {
float: right;
margin-top: 10px;
display: initial;
margin-right: 75px;
position: relative;
z-index: 1;
solid-link {
display:flex;
justify-content: end;
margin-top: 30px;
margin-right: 70px;
z-index: 1;
position: relative;
.add-poll {
background-color: var(--color-add-button-background);
color: var(--color-add-button);
box-shadow: 0px 0px 4px 1px #CACACA;
height: 2rem;
font-size: 1.4rem;
text-transform: uppercase;
font-weight: 700;
padding: 0.55rem 2.5rem;
width: max-content;
line-height: 20px;
&::before {
font-family: "material-design-icons";
@ -52,9 +50,12 @@ solid-poll > div {
display: block;
border-bottom: solid 1px #cacaca;
height: 90px;
width: 650px;
margin: 16px 25px 25px;
margin: 30px 25px 25px;
max-width: 85%;
solid-form-dropdown-label label {
font-size: 1.4rem;
font-family: "Facit";
}
solid-form-placeholder-text {
margin-left: 15px;
input {
@ -69,7 +70,7 @@ solid-poll > div {
height: 100%;
max-width: 1100px;
margin: auto;
solid-display {
> solid-display {
width: 320px;
height: 520px;
margin: 0 0 20px 40px;
@ -84,7 +85,7 @@ solid-poll > div {
*[name="body"] {
padding: 10px;
/*size of tags of poll card*/
etuc-display-votetags {
poll-display-votetags {
>div {
width: 64px;
height: 24px;
@ -101,7 +102,7 @@ solid-poll > div {
}
[name="title"] {
font-family: "RefrigeratorDelxW01Bold";
color: #063B5C;
color: var(--color-primary);
font-size: 1.8rem;
font-weight: 600;
text-transform: uppercase;
@ -112,7 +113,7 @@ solid-poll > div {
}
[name="hostingOrganisation"],
[name="endDate"] {
color: #3A3A3A;
color: var(--highlight-font-color);
font-family: Facit;
font-size: 14px;
letter-spacing: 0;
@ -122,7 +123,7 @@ solid-poll > div {
&::before {
content: '\e037';
font-family: 'simple-line-icons';
color: #C4262E;
color: var(--color-secondary);
height: 22px;
width: 24px;
font-size: 16px;
@ -136,11 +137,11 @@ solid-poll > div {
display: flex;
flex-direction: row;
margin-top: 10px;
solid-display-div [name="dateImage"]::before {
div [name="dateImage"]::before {
display: inline-block;
font: normal normal normal 24px/1 "Material Design Icons";
content: "\F6AF";
color: #C4262E;
color: var(--color-secondary);
height: 22px;
width: 24px;
font-size: 20px;
@ -149,7 +150,7 @@ solid-poll > div {
}
}
[name="shortDescription"] {
color: #7A7F85;
color: var(--color-main-text);
font-family: Facit;
font-size: 14px;
letter-spacing: 0;
@ -174,6 +175,7 @@ solid-poll > div {
h1 {
font-size: 3.2rem;
line-height: 3.8rem;
margin: 20px auto;
}
h2 {
font-size: 26px;
@ -186,7 +188,7 @@ solid-poll > div {
solid-display.topline {
>div:first-of-type {
*[name="right"] {
etuc-display-votetags {
poll-display-votetags {
>div {
width: 64px;
height: 24px;
@ -200,15 +202,15 @@ solid-poll > div {
}
[name="hostingOrganisation"],
[name="dateLine"] {
color: #3A3A3A;
color: var(--highlight-font-color);
font-family: Facit;
font-size: 16px;
font-weight: bold;
}
[name="dateLine"] solid-set-default {
[name="dateLine"] solid-set-default {
display: flex;
margin-top: 7px;
solid-display-date {
solid-display-value, solid-display-date-value {
margin-left: 7px;
}
}
@ -216,24 +218,24 @@ solid-poll > div {
margin-left: 0;
[name="hostingOrganisation"]::before {
content: '\e037';
font-family: 'simple-line-icons';
font-family: "simple-line-icons";
font-weight: 400;
color: #C4262E;
color: var(--color-secondary);
margin-right: 10px;
font-size: 16px;
}
}
solid-display-div [name="dateImage"]::before {
div [name="dateImage"]::before {
font-family: "Material Design Icons";
font-weight: 400;
content: "\F6AF";
color: #C4262E;
color: var(--color-secondary);
font-size: 20px;
}
[name="shortDescription"],
[name="longDescription"] {
margin: 20px 0;
color: #7A7F85;
color: var(--color-main-text);
font-family: Facit;
}
[name="shortDescription"] {
@ -255,7 +257,7 @@ solid-poll > div {
font-weight: 400;
font-size: 20px;
margin-right: 10px;
color: #3A3A3A;
color: var(--highlight-font-color);
}
.vote-section > h3::before {
content:"\F004";
@ -278,16 +280,15 @@ solid-poll > div {
div[name="progressBar"] div .progressBarValue {
margin: 0;
}
#poll-votes-form input[type="submit"] {
.poll-votes-form input[type="submit"] {
height: 38px;
width: 149px;
border-radius: 19px;
box-shadow: 0 0 7px 0 rgba(0,0,0,0.15);
}
#poll-votes-form input[type="submit"]:disabled {
.poll-votes-form input[type="submit"]:disabled {
opacity: 0.3;
}
#unavailablePoll {
.unavailablePoll {
font-style: italic;
}
.progressBarValue {
@ -297,7 +298,7 @@ solid-poll > div {
}
.send-share,
.back-to-list {
background-color: #3A3A3A;
background-color: var(--highlight-font-color);
padding: 5px 25px;
font-size: 1.4rem;
&::before {
@ -378,9 +379,9 @@ solid-poll > div {
background-color: #f0f3f6;;
}
#circles-add-survey, #default-add-survey {
background-color: white;
padding: 50px 0;
margin: -20px auto;
background-color: white;
padding: 50px 0;
margin: -20px auto;
h2 {
font-family: "RefrigeratorDelxW01Bold";
font-size: 3.2rem;
@ -390,7 +391,7 @@ solid-poll > div {
}
p {
margin-top: 10px;
color: #7A7F85;
color: var(--color-main-text);
font-family: Facit;
font-size: 16px;
}
@ -406,12 +407,14 @@ solid-poll > div {
height: 110px;
}
solid-form-label-text,
solid-form-textarea {
solid-form-textarea,
solid-form-label-textarea,
solid-form-textarea-label {
display: block;
margin: 15px 0;
padding: 0;
}
label > div, solid-form-file-image > div label, solid-form-auto-completion[name="tags"] > label::before {
label > div, solid-form-file-image > div label, solid-form-dropdown-autocompletion[name="tags"] > label::before {
margin-bottom: 5px;
margin-top: 20px;
color: var(--form-title);
@ -451,18 +454,18 @@ solid-poll > div {
display: flex;
width: 100%;
justify-content: space-between;
custom-choix {
poll-custom-choice {
width: calc(100% - 45px);
solid-form-label-text[name="name"] {
margin-bottom: 0;
}
}
button {
border: 1px solid var(--main-color);
border: 1px solid var(--color-primary);
background-color: transparent;
border-radius: 15px;
font-size: 24px;
color: var(--main-color);
color: var(--color-primary);
padding: 0;
height: 30px;
width: 30px;
@ -480,7 +483,7 @@ solid-poll > div {
font-weight: bold;
font-size: 13px;
margin: 10px 0;
color: var(--main-color);
color: var(--color-primary);
&::before {
content: "\F419";
font-family: Material Design Icons;
@ -495,7 +498,7 @@ solid-poll > div {
margin-top: 10px;
.ss-multi-selected .ss-values .ss-value {
border-radius: 14px;
background-color: #C4262E;
background-color: var(--color-secondary);
padding: 5px 10px;
font-size: 11px;
}
@ -510,6 +513,24 @@ solid-poll > div {
text-transform: uppercase;
}
}
.poll-footer {
.back-to-list {
background-color: var(--highlight-font-color);
padding: 5px 25px;
font-size: 1.4rem;
margin-left: 10%;
border-radius: 15px;
color: white;
&::before {
font-family: "Material Design Icons";
font-weight: 400;
font-size: 20px;
vertical-align: middle;
color: white;
content: "\F04D";
}
}
}
}
}

View File

@ -3,27 +3,27 @@
width: 100%;
font-family: "Facit";
font-weight: 400;
color: #7A7F85;
color: var(--content-font-color);
solid-resource {
sib-display div {
solid-display div {
max-width: 1110px;
sib-display {
solid-display {
margin: 0 0 20px 40px;
}
}
.sib-resource {
.solid-resource {
font-family: "Facit";
.page-title {
font-family: "RefrigeratorDelxW01Bold";
font-size: 3.2rem;
line-height: 3.8rem;
color: #063B5C;
color: var(--color-primary);
}
.red-button {
background-color: #C4262E;
background-color: var(--color-add-button-background);
}
.black-button {
background-color: #3A3A3A;
background-color: var(--highlight-font-color);
margin-left: 10%;
}
.lnk-newresource {
@ -33,23 +33,22 @@
position: relative;
}
.listresources .lnk-newkeyword {
top: 133px;
top: 155px;
left: 220px;
.button.thin-button.mdi {
padding: 5px 20px;
}
}
.resources {
margin-top: -35px;
sib-form {
&::before {
content: "Research a resource";
font-family: "RefrigeratorDelxW01Bold";
color: #063B5C;
font-size: 2.4rem;
line-height: 3.8rem;
top: -10px;
}
.listresources {
.headline h2 {
float: left;
margin-top: 5px;
color: var(--color-primary);
text-transform: none;
font-family: "RefrigeratorDelxW01Bold";
font-size: 2.4rem;
}
solid-form {
select {
width: 150px;
}
@ -61,14 +60,16 @@
width: max-content;
height: max-content;
padding: 10px 30px;
color: #063B5C;
color: var(--color-primary);
}
sib-display sib-display {
solid-display solid-display {
[name="name"] {
font-family: "RefrigeratorDelxW01Bold";
color: #063B5C;
color: var(--color-primary);
}
[name="link"] a {
[name="link"] a, [name="document"] a {
width: 75%;
margin-bottom: 10px;
padding-left: 35px;
position: relative;
&::before {
@ -84,7 +85,7 @@
font-family: "RefrigeratorDelxW01Bold";
font-size: 3.2rem;
line-height: 3.8rem;
color: #063B5C;
color: var(--color-primary);
}
[name="infotext"] {
justify-content: flex-start;
@ -97,7 +98,7 @@
}
}
.newresource label div,
.newresource sib-form-file div label {
.newresource solid-form-file div label {
line-height: 2.2rem;
text-transform: uppercase;
color: var(--form-title);
@ -108,11 +109,11 @@
.newresource select,
.newresource textarea,
.newresource input,
.newresource sib-multiple-select .ss-main .ss-multi-selected {
.newresource solid-multiple-select .ss-main .ss-multi-selected {
background-color: var(--form-inputs-background);
}
.newresource input[type="submit"] {
background-color: #3C3F57;
background-color: var(--form-submit-button);
}
.newresource input[type="file"] {
background-color: transparent;
@ -124,7 +125,7 @@
}
}
@media (max-width: 991px) {
.sib-resource {
.solid-resource {
margin-top: 65px;
}
}
@ -134,7 +135,7 @@
background-color: #f0f3f6;
}
#circle-resources .resources sib-form sib-form-dropdown select {
#circle-resources .resources solid-form solid-form-dropdown select {
background-color: #f0f3f6;
}

View File

@ -1 +1 @@
@import 'user-profile';
@import 'messages';

View File

@ -0,0 +1,16 @@
.avatar-container {
display: inline-block;
margin-right: 10px;
.avatar {
height: 40px;
width: 40px;
}
}
.avatar-text {
position: absolute;
top: 7.5rem;
@include breakpoint(lg) {
top: 2.8rem;
}
}

View File

@ -1,76 +0,0 @@
/*.user-profile__container {
.user-bio {
display: grid;
grid-gap: 1rem;
grid-template-areas: "avatar name"
"avatar information";
grid-template-columns: minmax(300px, 400px) 2fr;
.avatar-display {
grid-area: avatar;
overflow: hidden;
position: relative;
img {
border-radius: 50%;
height: 300px;
object-fit: cover;
overflow: hidden;
object-position: center;
width: 300px;
}
}
.name-diplay {
grid-area: name;
[name='user-name-groups'] {
align-items: baseline;
align-self: end;
display: flex;
solid-multiple {
display: flex;
padding-left: 1.4rem;
hubl-groups-name {
@extend %tag-role;
}
}
}
}
.info-form {
grid-area: information; */
/* ces styles disparaitront lorsque l'on aura la fonctionnalité pour uploader une photo */
/*[name="account.picture"] {
margin-bottom: 1rem;
}
hubl-instruction {
margin-left: 1rem;
span {
color: $color-233-18-29;
font-weight: bold;
}
p {
margin-left: 1rem;
}
}*/
/* Fin commentaire sur upload photos */
/*}
[name^="inline-"] {
display: flex;
justify-content: flex-start;
>*:not(:last-child) {
margin-right: 3rem;
}
}
}
}*/

113
src/sw.js Normal file
View File

@ -0,0 +1,113 @@
const CACHE_NAME = 'hubl-store';
self.addEventListener('install', function (e) {
self.skipWaiting();
e.waitUntil(
caches.open(CACHE_NAME).then(function (cache) {
return cache.addAll([
'/locales/es.json',
'/locales/fr.json',
'/scripts/index.js',
'/syles/index.css',
'/index.html',
'/'
]);
})
);
});
self.addEventListener('activate', function (e) {
// invalidate older versions
e.waitUntil(
caches.keys()
.then(function (keyList) {
return Promise.all(keyList.map(function (key) {
if (key !== CACHE_NAME && key !== (CACHE_NAME + "-cdn") && key !== (CACHE_NAME + "-api")) {
return caches.delete(key);
}
}));
}));
self.clients.claim();
});
self.addEventListener('fetch', function (event) {
let requestURL = new URL(event.request.url);
if (requestURL.origin == location.origin) {
// Static asset, cache then network
event.respondWith(
caches.open(CACHE_NAME).then(function (cache) {
return cache.match(event.request).then(function (response) {
var fetchPromise = fetch(event.request).then(function (networkResponse) {
cache.put(event.request, networkResponse.clone());
return networkResponse;
});
return response || fetchPromise;
});
}),
);
} else {
if (
event.request.method == 'POST' ||
event.request.method == 'PUT'
) {
// disabled: lead to cors errors
// // POST/PUT to api, rewrite the cache
// event.respondWith(
// caches.open(CACHE_NAME + '-api').then(function (cache) {
// return fetch(event.request).then(function (response) {
// cache.put(event.request, response.clone());
// return response;
// })
// }));
// api: no cache
event.respondWith(fetch(event.request));
} else if (
/matomo/.test(requestURL.origin) ||
/sentry/.test(requestURL.origin) ||
/jabber/.test(requestURL.origin) ||
/xmpp/.test(requestURL.origin)
) {
// analytics, always distant
event.respondWith(fetch(event.request));
} else {
if (
/unpkg/.test(requestURL.origin) ||
/skypack/.test(request.origin) ||
/jspm/.test(requestURL.origin) ||
/jsdeliver/.test(requestURL.origin) ||
/cdn/.test(requestURL.origin) ||
/googleapis/.test(requestURL.origin)
) {
// cdn: cache then network
event.respondWith(
caches.open(CACHE_NAME + '-cdn').then(function (cache) {
return cache.match(event.request).then(function (response) {
var fetchPromise = fetch(event.request).then(function (networkResponse) {
cache.put(event.request, networkResponse.clone());
return networkResponse;
});
return response || fetchPromise;
});
}),
);
} else {
// disabled: lead to cors errors
// // api: distant then cache
// event.respondWith(
// fetch(event.request)
// .then((response) => {
// caches.open(CACHE_NAME + '-api').then(function (cache) {
// cache.put(event.request, response.clone());
// return response;
// });
// })
// .catch(() => {
// return caches.match(event.request);
// })
// );
// api: no cache
event.respondWith(fetch(event.request));
}
}
}
});

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,20 +0,0 @@
include hubl-user-avatar.pug
solid-widget(name='hubl-circle-team-template')
template
solid-display.user-thumb.is-spaced(
data-src='${await value.user}'
fields='account.picture, sup(name, isadmin), sub(profile.city)'
value-isadmin='${await value.is_admin}'
class-account.picture='avatar user-thumb__picture'
class-name='user-thumb__name'
class-isadmin='user-thumb__admin'
class-profile.city='user-thumb__city'
widget-account.picture='hubl-user-avatar'
widget-isadmin='hubl-circle-user-admin'
)
solid-widget(name='hubl-circle-user-admin')
template ${(await value) != "false" ? "Administrateur" : ""}

View File

@ -1,22 +0,0 @@
include hubl-user-avatar.pug
solid-widget(name='hubl-project-team')
template
solid-display.user-thumb.is-spaced(
data-src='${await value}'
fields='user.account.picture, sup(user.name, isadmin), sub(user.profile.city, name)'
value-isadmin='${await value.is_admin}'
class-user.account.picture='avatar user-thumb__picture'
class-user.name='user-thumb__name'
class-isadmin='user-thumb__admin'
class-user.profile.city='user-thumb__city'
class-name='user-thumb__lead'
widget-user.account.picture='hubl-user-avatar'
widget-isadmin='hubl-project-user-admin'
)
solid-widget(name='hubl-project-user-admin')
template ${(await value) == "false" ? "" : "Administrateur"}

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
@ -13,19 +13,24 @@ div.content-box__info.flex
data-src=`${endpoints.circles || endpoints.post.circles}`
fields='status, name, description'
required-status
required-name
required-description
loader-id='loader-circles-create'
class-status='form-label is-light is-full-width color'
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,17 +5,17 @@
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')
template
solid-display.user-thumb.is-spaced(
solid-display.user-thumb.block.is-spaced(
data-src='${await value}'
fields='account.picture, sup(name), sub(username)'
@ -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}')
@ -70,7 +72,7 @@
class-circle.name='w280 border cell-with-name'
class-circle.owner='w280 border cell-with-id-card'
class-leaveButton='w280 border cell-with-buttons'
class-leaveButton='w280 border cell-with-buttons is-spaced'
action-leaveButton="joinButton"
widget-leaveButton="hubl-admin-circle-leave-button"
@ -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}')
@ -108,7 +111,7 @@
class-owner='w280 border cell-with-id-card'
widget-owner='hubl-circle-owner'
class-members='w280 border cell-with-buttons'
class-members='w280 border cell-with-buttons is-spaced'
widget-members="hubl-admin-circle-join-button"
order-by="name"
@ -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

@ -0,0 +1,54 @@
.content-box.flex.full-width.with-form
solid-router(default-route='admin-communities-list', hidden)
solid-route(name='admin-communities-list')
solid-route(name='admin-users-create', use-id)
div.content-box__header.flex.space-between
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
solid-ac-checker(data-src="${value}", nested-field="members", permission='acl:Append')
solid-link(
class='button text-bold text-uppercase reversed button-primary bordered with-icon icon-plus'
data-src="${value}"
next="admin-users-create"
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(data-trans='communities.noPermission')
#admin-communities-list.content-box__height(hidden, data-view="admin-communities-list")
div.content-box__info.flex
div.admin-header.flex
h3(data-trans='communities.subTitle')
.table-wrapper
.table
div.table-header.grey-color
div.w450(data-trans='communities.tableHeader1')
div.w370(data-trans='communities.tableHeader2')
solid-display(
class='table-body'
bind-user
nested-field='communities'
fields='community.name, community'
loader-id='loader-admin-community'
class-community.name='w450 border cell-with-name'
class-community='w370 border cell-with-buttons is-spaced'
widget-community='hubl-action-community'
order-asc='community.name'
)
div#loader-admin-community.loader.loader-top
div
div
div
div
#admin-users-create.content-box__height(hidden, data-view="admin-users-create")
include page-admin-users-create.pug

View File

@ -1,18 +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')
solid-widget(name="hubl-admin-project-add-user")
template
solid-form(
data-holder
fields='user, project'
range-user=`${endpoints.users || endpoints.get.users}`
value-project='${src}'
widget-project='solid-form-hidden'
naked
)
h1.centered Créer un nouveau projet
h1.centered(data-trans='project.create.title')
div#loader-projects-create.loader.loader-top
div
@ -24,27 +13,33 @@ div.content-box__info.flex
data-src=`${endpoints.projects || endpoints.post.projects}`
fields='status, line-1(customer.name, name), line-2(captain)'
required-status
required-customer.name
required-name
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-auto-completion'
widget-captain='solid-form-dropdown-autocompletion-label'
class='input-text-like'
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}')
@ -46,7 +49,7 @@
solid-widget(name='hubl-project-captain')
template
solid-display.user-thumb.is-spaced(
solid-display.user-thumb.block.is-spaced(
data-src='${await value}'
fields='account.picture, sup(name), sub(username)'
@ -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(
@ -87,7 +91,7 @@
class-project.name='w280 cell border cell-with-name'
class-project.members='w280 cell border cell-with-id-card'
class-project.captain='w280 cell border cell-with-id-card'
class-leaveButton='w230 cell border cell-with-buttons'
class-leaveButton='w230 cell border cell-with-buttons is-spaced'
action-leaveButton="joinButton"
widget-leaveButton="hubl-admin-project-leave-button"
@ -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}')
@ -127,7 +132,7 @@
class-name='w280 cell border cell-with-name'
class-members='w280 cell border cell-with-id-card'
class-captain='w280 cell border cell-with-id-card'
class-joinButton='w230 cell border cell-with-buttons'
class-joinButton='w230 cell border cell-with-buttons is-spaced'
action-joinButton="joinButton" # Workaround: I need members two times
widget-joinButton="hubl-admin-project-join-button"
@ -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,7 +1,19 @@
div.content-box__info.flex
solid-link(class='backlink right', next='admin-users-list') Retour
solid-link(class='backlink right', next='admin-communities-list' data-trans='user.create.backlink')
h1.centered Ajouter un utilisateur à la plateforme
solid-display.h1-like.centered(
bind-resources
fields='text, name'
value-text=''
data-trans='value-text=user.create.title'
loader-id='loader-users-title'
)
div#loader-users-title.loader.loader
div
div
div
div
div#loader-users-create.loader.loader-top
div
@ -9,26 +21,45 @@ div.content-box__info.flex
div
div
solid-form.form.button-register(
data-src=`${endpoints.users || endpoints.post.users}`
solid-widget(name='hubl-username-field')
template
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)
fields='line-1(first_name, last_name), line-2(username, email), line-3(password)'
solid-widget(name='hubl-email-field')
template
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
nested-field='members'
fields='line-1(user.first_name, user.last_name), line-2(user.username, user.email), user.password'
required-user.first_name
required-user.last_name
required-user.username
required-user.email
loader-id='loader-users-create'
class-first_name='form-label is-light is-half-width input-text-like'
class-last_name='form-label is-light is-half-width input-text-like'
class-username='form-label is-light is-half-width input-text-like'
class-email='form-label is-light is-half-width input-text-like'
class-user.first_name='form-label is-light is-half-width input-text-like'
class-user.last_name='form-label is-light is-half-width input-text-like'
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-first_name='Prénom *'
label-last_name='Nom *'
label-username='Nom d\'utilisateur *'
label-email='E-mail *'
label-user.first_name=''
label-user.last_name=''
label-user.username=''
label-user.email=''
value-password=''
widget-password='solid-form-hidden'
value-user.password=''
widget-user.password='solid-form-hidden'
next='admin-users-list'
widget-user.username='hubl-username-field'
widget-user.email='hubl-email-field'
submit-button='Enregistrer'
next='admin-communities-list'
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

@ -1,36 +0,0 @@
div.content-box__info.flex
solid-link(class='backlink right', next='admin-users-list') Retour
h1.centered
span Modifier un utilisateur
div#loader-users-edit.loader.loader-top
div
div
div
div
solid-display(
bind-resources=''
fields='name'
loader-id='loader-users-edit'
)
solid-form.form.button-register(
bind-resources=''
fields='line-1(first_name, last_name), line-2(email)'
loader-id='loader-users-edit'
class-first_name='form-label is-light is-half-width input-text-like'
class-last_name='form-label is-light is-half-width input-text-like'
class-email='form-label is-light is-full-width input-text-like'
label-first_name='Prénom *'
label-last_name='Nom *'
label-email='E-mail *'
next='admin-user-list'
submit-button='Enregistrer'
)

View File

@ -1,67 +0,0 @@
.content-box.flex.full-width.with-form
solid-router(default-route='admin-users-list', hidden)
solid-route(name='admin-users-list')
solid-route(name='admin-users-create')
solid-route(name='admin-users-edit')
div.content-box__header.flex.space-between
h1.without-margin Administration
button.mobile-sidebar-button.jsMobileSidebarOpenButton.icon-arrow-left-circle MENU
solid-widget(name='hubl-solid-action-custom')
template
solid-ac-checker(data-src="${src}", permission='acl:Write')
solid-link(
class='button rounded reversed button-primary bordered icon-pencil'
data-src="${src}"
next="${value}"
)
#admin-users-list.content-box__height(hidden)
div.content-box__info.flex
div.admin-header.flex
h3 Utilisateurs
solid-ac-checker(data-src=`${endpoints.users || endpoints.post.users}`, permission='acl:Append')
solid-link(
class='button text-bold text-uppercase reversed button-primary bordered with-icon icon-plus'
next='admin-users-create'
) Ajouter un utilisateur
.table-wrapper
.table
div.table-header.grey-color
div.w280 Nom
div.w70
solid-display(
class='table-body'
data-src=`${endpoints.users || endpoints.get.users}`
fields='cell-1(user-thumb(account.picture, sup(name), sub(username))), actions'
loader-id='loader-admin-users'
class-account.picture='avatar user-thumb__picture'
class-name='user-thumb__name'
class-username='user-thumb__username'
class-profile.city='user-thumb__city'
widget-account.picture='hubl-user-avatar'
label-actions='Edit'
action-actions='admin-users-edit'
class-actions='w70 border cell-with-buttons'
widget-actions='hubl-solid-action-custom'
order-by='username'
)
div#loader-admin-users.loader.loader-top
div
div
div
div
#admin-users-create.content-box__height(hidden)
include page-admin-users-create.pug
#admin-users-edit.content-box__height(hidden)
include page-admin-users-edit.pug

View File

@ -2,7 +2,7 @@
solid-xmpp-chat(
data-authentication='login',
data-auto-login='true',
data-bosh-service-url=`${xmpp}`,
data-websocket-url=`${xmppWebsocket || 'wss://jabber.happy-dev.fr/xmpp-websocket'}`,
data-i18n='en',
bind-resources
)

Some files were not shown because too many files have changed in this diff Show More