Merge branch 'master' into dpo/switch-to-skypack

This commit is contained in:
Benoit Alessandroni 2020-12-14 20:07:43 +01:00
commit 732de91b8f
82 changed files with 11837 additions and 9968 deletions

View File

@ -1,3 +0,0 @@
{
}

21
.gitignore vendored
View File

@ -1,11 +1,22 @@
**/node_modules **/node_modules
config.json
.DS_Store .DS_Store
*.iml *.iml
*.swp *.swp
dist .npm
# Test cache
cache
cypress/screenshots cypress/screenshots
cypress/videos cypress/videos
cache
.npm # Built files
.DS_Store .cache
dist
# Config specific files
config.json
config.*.json
!config.sample.json
# PWA Generated file
src/manifest.webmanifest

View File

@ -38,7 +38,7 @@ build:
test:e2e: test:e2e:
stage: test stage: test
image: cypress/included:4.5.0 image: cypress/included:5.6.0
services: services:
- name: ${CI_REGISTRY_IMAGE}/server:0.1 - name: ${CI_REGISTRY_IMAGE}/server:0.1
before_script: before_script:
@ -150,7 +150,7 @@ stg2:
publish: publish:
stage: release stage: release
script: script:
- npm install -g semantic-release@v17 @semantic-release/gitlab - npm install -g semantic-release@v17 @semantic-release/gitlab@v6.0.5
- semantic-release - semantic-release
only: only:
- master - master
@ -930,5 +930,41 @@ montpellier:
only: only:
- master - master
when: manual when: manual
tags:
- deploy
acn:
stage: deployment
environment:
name: acn
url: https://acn.hubl.world
before_script:
- npm ci --cache .npm --prefer-offline --only=production
script:
- echo "$APP_CONFIG_ACN" > 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/* acn@astral.startinblox.com:~/client/dist/
only:
- master
when: manual
tags:
- deploy
woma:
stage: deployment
environment:
name: woma
url: https://woma.hubl.world
before_script:
- npm ci --cache .npm --prefer-offline --only=production
script:
- echo "$APP_CONFIG_WOMA" > 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/* woma@astral.startinblox.com:~/client/dist/
only:
- master
when: manual
tags: tags:
- deploy - deploy

3
.sassrc Normal file
View File

@ -0,0 +1,3 @@
{
"includePaths": ["node_modules"],
}

166
README.md
View File

@ -1,6 +1,18 @@
# Hubl <h1 align="center">
<br>
<a href="http://hubl.world"><img src="https://cdn.startinblox.com/logos/hubl-logo.png" alt="Hubl" width="200"></a>
<br>
</h1>
Hubl is the magic tool that allows the Freelance Network to thrive in a decentralized way. <h4 align="center">A magic tool that allows the Freelance Network to thrive in a decentralized way, built on top of <a href="https://startinblox.com/" target="_blank">Startin'blox</a>.</h4>
<hr>
<p align="center">
<a href="https://git.startinblox.com/management/product-owners-sync/issues/"><img alt="create a feature request" src="https://img.shields.io/badge/%2B-feature%20request-blue" /></a>
<a href="https://git.startinblox.com/applications/hubl/issues/"><img alt="create an issue" src="https://img.shields.io/badge/%2B-issue-orange" /></a>
<a href="https://git.startinblox.com/applications/hubl/commits/master"><img alt="pipeline status" src="https://git.startinblox.com/applications/hubl/badges/master/pipeline.svg" /></a>
</p>
## Getting Started ## Getting Started
@ -43,13 +55,6 @@ npm install
Then create a `config.json` based on your needs, see Mandatory and Optional Modules on this page. For convienence a `config.sample.json` exists in the source. Then create a `config.json` based on your needs, see Mandatory and Optional Modules on this page. For convienence a `config.sample.json` exists in the source.
Federated Hubl needs to use `config.sample.federated.json` example.
You can quickly update your API URI from the samples:
```
$ sed 's/http:\/\/localhost:8000/https:\/\/api.your-server.startinblox.com/' config.sample.json > config.json
```
Then build your new Hubl: Then build your new Hubl:
```bash ```bash
@ -66,6 +71,22 @@ Serve, watch files & rebuild on change with this command:
npm run watch npm run watch
``` ```
### Multiple config.json
You can have as many `config.*.json` as you need.
Watch on a custom config file:
```bash
CONFIG_PATH='config.customName.json' npm run watch
```
Build with a custom config file:
```bash
CONFIG_PATH='config.customName.json' npm run build
```
## Mandatory modules ## Mandatory modules
By default, a Hubl includes only individual chat modules. By default, a Hubl includes only individual chat modules.
@ -76,14 +97,19 @@ On `config.json`:
```json ```json
{ {
"xmpp": "https://jabber.happy-dev.fr/http-bind/", "xmppWebsocket": "wss://jabber.happy-dev.fr/xmpp-websocket",
"clientName": "My local Hubl", "clientName": "My local Hubl",
"clientLogo": "/images/logo.webp", "clientLogo": "/images/logo.webp",
"authority": "http://localhost:8000/", "authority": "http://localhost:8000/",
"endpoints": { "endpoints": {
"skills": "http://server.url/skills/", "get": {
"users": "http://server.url/users/", "skills": "http://server.url/skills/",
"uploads": "http://server.url/upload/" "users": "http://server.url/users/"
},
"post": {
"users": "http://server.url/users/",
"uploads": "http://server.url/upload/"
}
} }
} }
``` ```
@ -92,11 +118,11 @@ Where:
* `clientName` is the name of your Hubl * `clientName` is the name of your Hubl
* `clientLogo` is an URL to an image file * `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. * `xmppWebsocket` 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. * `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. (djangoldp-account) * `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.*.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) * `endpoints.*.uploads` is the API endpoints for Uploads on your djangoldp server. (djangoldp-upload)
### Communities ### Communities
@ -113,9 +139,7 @@ Don't forget to set some users as admin from the Django Admin if you want to all
On `config.json`: On `config.json`:
```json ```json
"clientName": "Hubl",
"clientFavicon": "/images/favicon.webp", "clientFavicon": "/images/favicon.webp",
"clientLogo": "/images/logo.webp",
"clientLogoHeight": "32px", "clientLogoHeight": "32px",
"clientCSS": "/path/to/custom.css", "clientCSS": "/path/to/custom.css",
"authorityName": "djangoldp-server-name" "authorityName": "djangoldp-server-name"
@ -123,9 +147,7 @@ On `config.json`:
Where: Where:
* `clientName` is the name of your Hubl.
* `clientFavicon` is an URL to a distant favicon * `clientFavicon` is an URL to a distant favicon
* `clientLogo` is an URL to a distant logo for your client
* `clientLogoHeight` allow a quick fix to manage different height logos * `clientLogoHeight` allow a quick fix to manage different height logos
* `clientCSS` is an URL to a distant CSS that'll be the last one loaded by the Hubl * `clientCSS` is an URL to a distant CSS that'll be the last one loaded by the Hubl
* `authorityName` is a visual name of your OpenID Provider * `authorityName` is a visual name of your OpenID Provider
@ -156,7 +178,12 @@ On `config.json`:
```json ```json
"endpoints": { "endpoints": {
"circle": "http://server.url/circles/" "get": {
"circle": "http://server.url/circles/"
},
"post": {
"circle": "http://server.url/circles/"
},
} }
``` ```
@ -170,11 +197,29 @@ On `config.json`:
```json ```json
"endpoints": { "endpoints": {
"dashboard": "http://server.url/dashboard/" "get": {
"dashboard": "http://server.url/dashboard/"
}
} }
``` ```
A [sample fixture](https://git.startinblox.com/djangoldp-packages/djangoldp-dashboard/blob/master/djangoldp_dashboard/fixtures/sample.json) can be loaded with `./manage.py loaddata path/to/djangoldp_dashboard/fixtures/sample.json`. A [sample fixture](https://git.startinblox.com/djangoldp-packages/djangoldp-dashboard/blob/master/djangoldp_dashboard/fixtures/sample.json) can be loaded with `./manage.py loaddata sample`.
### Job Offers
Job Offers includes a job board with conversation. To activate them, you need:
On Server: `djangoldp_joboffer`, `djangoldp_skill`, `djangoldp_upload`, `djangoldp_conversation` packages
On `config.json`:
```json
"endpoints": {
"get": {
"joboffers": "http://server.url/job-offers/"
}
}
```
### Project ### Project
@ -186,10 +231,12 @@ On `config.json`:
```json ```json
"endpoints": { "endpoints": {
"projects": "http://server.url/projects/", "get": {
"customers": "http://server.url/customers/", "projects": "http://server.url/projects/"
"businessproviders": "http://server.url/businessproviders/", },
"skills": "http://server.url/skills/" "post": {
"projects": "http://server.url/projects/"
}
} }
``` ```
@ -202,29 +249,10 @@ On Server: `djangoldp_skill`, `djangoldp_upload` packages
On `config.json`: On `config.json`:
```json ```json
"publicDirectory": true, "publicDirectory": true
"endpoints": {
"groups": "http://server.url/groups/",
"skills": "http://server.url/skills/",
"uploads": "http://server.url/upload/"
}
``` ```
### Job Offers ## Optional community modules
Job Offers includes a job board with conversation. To activate them, you need:
On Server: `djangoldp_joboffer`, `djangoldp_skill`, `djangoldp_upload`, `djangoldp_conversation` packages
On `config.json`:
```json
"endpoints": {
"joboffers": "http://server.url/job-offers/",
"skills": "http://server.url/skills/",
"uploads": "http://server.url/upload/"
}
```
### Events ### Events
@ -238,9 +266,14 @@ On `config.json`:
```json ```json
"endpoints": { "endpoints": {
"events":"http://server.url/events/", "get": {
"typeevents":"http://server.url/typeevents/", "events":"http://server.url/events/",
"uploads": "http://server.url/upload/" "typeevents":"http://server.url/typeevents/"
},
"post": {
"events":"http://server.url/events/",
"typeevents":"http://server.url/typeevents/"
}
} }
``` ```
@ -256,10 +289,16 @@ On `config.json`:
```json ```json
"endpoints": { "endpoints": {
"resources":"http://server.url/resources/", "get": {
"resourceskeywords":"http://server.url/keywords/", "resources":"http://server.url/resources/",
"resourcestypes":"http://server.url/types/", "resourceskeywords":"http://server.url/keywords/",
"uploads": "http://server.url/upload/" "resourcestypes":"http://server.url/types/"
},
"post": {
"resources":"http://server.url/resources/",
"resourceskeywords":"http://server.url/keywords/",
"resourcestypes":"http://server.url/types/"
}
} }
``` ```
@ -273,7 +312,12 @@ On `config.json`:
```json ```json
"endpoints": { "endpoints": {
"polls":"http://server.url/polls/" "get": {
"polls":"http://server.url/polls/"
},
"post": {
"polls":"http://server.url/polls/"
}
} }
``` ```
@ -305,6 +349,12 @@ docker push registry.startinblox.com/applications/hubl/server:0.1
Note: within a Kubernetes pod all services are bound to `localhost`. Note: within a Kubernetes pod all services are bound to `localhost`.
## Troubleshooting
### Circles or Projects are missing the @user list
Did you properly created subscriptions on your DjangoLDP's server? You can quickly create them with `./manage.py create_subscriptions`
## Built With ## Built With
* [Sib-Core](https://git.startinblox.com/framework/sib-core/) - An awesome new framework! * [Sib-Core](https://git.startinblox.com/framework/sib-core/) - A SOLID-Compliant framework

View File

@ -1,23 +0,0 @@
# Documentation
## Define your own colors
We use css variables to apply colors in the application.
The file can be found in src/styles/etc/
Example of use:
```css
:root {
--color-primary: #FFD759;
--color-secondary: #FFB700;
--color-complementary: #3C3F57;
--color-complementary-darken: #27293A;
}
```
Users can find example files at the root of the application. Use
- client.sample.happy-dev.css : for a more advanced example of customization.
- client.sample.css : to set five basic colors and let the default setup apply the colors.

View File

@ -1,282 +0,0 @@
:root {
--color-primary: #FFB700;
--color-secondary: #3C3F57;
--color-complementary: #6259E5;
--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-notification-counter-number: black;
--color-notification-summary: #7A7F85;
--solid-notifications-theme: var(--color-primary);
--color-notification-item-border: #E4E8ED;
--color-notification-scrollbar-background: #EDF1FA;
--color-notification-scrollbar-track: #BDC2D7;
--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: #FFD759;
--color-menu-background: var(--color-secondary);
--color-menu-text: var(--color-white);
--color-menu-text-active: var(--color-secondary);
--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: #DAE2F3;
--color-right-menu-text: var(--color-secondary);
--color-right-menu-link-border: #BDC2D7;
--color-right-menu-active-text: var(--color-primary);
--color-right-menu-active-background: var(--color-secondary);
--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 !important;
--color-directory-grey-5: #F0F3F6 !important;
--color-directory-avatar-background: #E4E8ED !important;
--color-directory-back-link: #36383B !important;
--color-directory-border: #DAE2F3 !important;
--color-directory-content-header-border: #DAE2F3 !important;
--color-directory-h1: var(--color-complementary-darken);
--color-directory-list-icon: var(--color-primary);
--color-directory-text: var(--color-directory-grey-4);
--color-directory-send-border: var(--color-complementary) !important;
--color-directory-list-icon: var(--color-primary) !important;
--color-directory-counter-background: var(--color-directory-grey-5) !important;
--color-directory-counter-border: #9BA0A7 !important;
--color-directory-counter-text: #4A4A4A !important;
--color-directory-paginate: #36383B !important;
--color-directory-paginate-disabled: #9BA0A7 !important;
--color-directory-form-input: #EDF1FA !important;
--color-directory-form-input-text: var(--color-directory-grey-4) !important;
--color-directory-form-input-active: var(--color-complementary) !important;
--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"] {
background: var(--color-complementary);
border: 1px solid var(--color-complementary);
}
#project solid-link[next="project-edit"]:hover,
#circle solid-link[next="circle-edit"]:hover {
background: var(--color-white);
border: 1px solid var(--color-complementary);
color: var(--color-complementary);
}
/* Button to delete a channel */
/* box-button is depreciated */
#circle-profile>div>div.desktop-button__end>solid-ac-checker>solid-delete,
#circle-profile>div>div.box-button>solid-ac-checker>solid-delete {
background: var(--color-white);
border: 1px solid var(--color-complementary);
color: var(--color-complementary);
}
#circle-profile>div>div.desktop-button__end>solid-ac-checker>solid-delete>button,
#circle-profile>div>div.box-button>solid-ac-checker>solid-delete>button {
color: var(--color-complementary);
}
#circle-profile>div>div.desktop-button__end>solid-ac-checker>solid-delete:hover,
#circle-profile>div>div.box-button>solid-ac-checker>solid-delete:hover {
background: var(--color-complementary);
border: 1px solid var(--color-complementary);
color: var(--color-white);
}
#circle-profile>div>div.desktop-button__end>solid-ac-checker>solid-delete:hover>button,
#circle-profile>div>div.box-button>solid-ac-checker>solid-delete:hover>button {
color: var(--color-white);
}
/* Button with a pen to edit a user */
#admin-users-list>div>div.table>solid-display>div>solid-display>div>solid-action-hd-custom>solid-ac-checker>solid-link {
background: var(--color-complementary);
border: 1px solid var(--color-complementary);
color: var(--color-white);
}
#admin-users-list>div>div.table>solid-display>div>solid-display>div>solid-action-hd-custom>solid-ac-checker>solid-link:hover {
background: var(--color-white);
border: 1px solid var(--color-complementary);
color: var(--color-complementary);
}
/* Button to join a channel */
#admin-circle-list>div>div.table>solid-display:nth-child(5)>div>solid-display>div>admin-circle-join-button>solid-form {
background: var(--color-complementary);
border: 1px solid var(--color-complementary);
color: var(--color-white);
}
#admin-circle-list>div>div.table>solid-display:nth-child(5)>div>solid-display>div>admin-circle-join-button>solid-form:hover {
background: var(--color-white);
border: 1px solid var(--color-complementary);
color: var(--color-complementary);
}
#admin-circle-list>div>div.table>solid-display:nth-child(5)>div>solid-display>div>admin-circle-join-button>solid-form:hover input {
color: var(--color-complementary);
}
/* Directory - my profile*/
/* Colors for buttons to send a message to a member and to update or remove your profile picture */
#member-profile>div.profile-card>div.user-profile>div>solid-display>div>solid-action.button.button-primary.bordered,
button#solid-picture-browse.button.button-primary,
button#solid-picture-remove.button.button-primary {
border: 1px solid var(--color-directory-complementary) !important;
}
#member-profile solid-action.button.button-primary>solid-link,
button#solid-picture-browse.button.button-primary,
button#solid-picture-remove.button.button-primary {
color: var(--color-directory-complementary) !important;
}
#member-profile>div.profile-card>div.user-profile>div>solid-display>div>solid-action.button.button-primary.bordered>solid-link::before {
background-color: var(--color-directory-complementary) !important;
}
/* Hover */
#member-profile solid-action.button.button-primary:hover,
#member-profile solid-action.button.button-primary:hover>solid-link,
button#solid-picture-browse.button.button-primary:hover,
button#solid-picture-remove.button.button-primary:hover {
color: var(--color-directory-white) !important;
background-color: var(--color-directory-complementary) !important;
}
#member-profile>div.profile-card>div.user-profile>div>solid-display>div>solid-action.button.button-primary.bordered:hover>solid-link::before {
background-color: var(--color-directory-white) !important;
}
#members-list .send-display solid-link::before {
background-color: var(--color-directory-complementary)!important;
}
/* Dashboard */
.dashboard-card>div>div>p {
color: var(--color-complementary) !important;
}
.dashboard-card .svg-color-secondary {
fill: var(--color-complementary) !important;
}
.dashboard-card i {
border-color: var(--color-primary) !important;
color: var(--color-complementary) !important;
}
.dashboard-card sib-link, .dashboard-card solid-link {
border-color: var(--color-complementary) !important;
color: var(--color-complementary) !important;
}
.dashboard-card sib-link:hover, .dashboard-card solid-link:hover {
background-color: var(--color-complementary) !important;
color: #fff !important;
}

View File

@ -1,18 +0,0 @@
{
"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/",
"users": "http://localhost:8000/users/",
"groups": "http://localhost:8000/groups/"
},
"post": {
"skills": "http://localhost:8000/skills/",
"users": "http://localhost:8000/users/",
"groups": "http://localhost:8000/groups/"
}
}
}

View File

@ -1,12 +1,16 @@
{ {
"xmpp": "https://jabber.happy-dev.fr/http-bind/", "xmppWebsocket": "wss://jabber.happy-dev.fr/xmpp-websocket",
"clientName": "My local Hubl",
"clientLogo": "/images/logo.webp",
"authority": "http://localhost:8000/", "authority": "http://localhost:8000/",
"authorityName": "djangoldp-server-name",
"clientName": "Hubl",
"clientLogo": "https://cdn.startinblox.com/logos/hubl-logo.png",
"endpoints": { "endpoints": {
"groups": "http://localhost:8000/groups/", "get": {
"skills": "http://localhost:8000/skills/", "skills": "http://localhost:8000/skills/",
"users": "http://localhost:8000/users/" "users": "http://localhost:8000/users/"
},
"post": {
"users": "http://localhost:8000/users/",
"upload": "http://localhost:8000/upload/"
}
} }
} }

View File

@ -1,24 +0,0 @@
{
"xmpp": "https://jabber.happy-dev.fr/http-bind/",
"authority": "$SERVER",
"authorityName": "djangoldp-server-name",
"publicDirectory": true,
"endpoints": {
"get": {
"circles": "$SERVER/circles/",
"dashboards": "$SERVER/dashboards/",
"groups": "$SERVER/groups/",
"users": "$SERVER/users/",
"skills": "$SERVER/skills/",
"uploads": "$SERVER/upload/"
},
"post": {
"circles": "$SERVER/circles/",
"dashboards": "$SERVER/dashboards/",
"groups": "$SERVER/groups/",
"users": "$SERVER/users/",
"skills": "$SERVER/skills/",
"uploads": "$SERVER/upload/"
}
}
}

21
internal/assets.js Normal file
View File

@ -0,0 +1,21 @@
const HTMLAsset = require('parcel-bundler/lib/assets/HTMLAsset')
function shouldIgnore (file) {
// Ignore img(src="${...}") on pug & keep the components folder pristine
return /\${.+}/.test(file) || /components/.test(file) || /\/lib\/solid-/.test(file);
}
class SkipStartinbloxWidgetAsset extends HTMLAsset {
addDependency (name, opts) {
if (!shouldIgnore(opts.resolved)) {
return super.addDependency(name, opts)
}
}
processSingleDependency (p, opts) {
if (shouldIgnore(p)) return p
else return super.processSingleDependency(p, opts)
}
}
module.exports = SkipStartinbloxWidgetAsset

79
internal/parcel.js Normal file
View File

@ -0,0 +1,79 @@
'use strict';
const fs = require('fs');
const fse = require('fs-extra');
const Bundler = require('parcel-bundler');
const options = {
outDir: './dist',
outFile: 'index.html',
publicUrl: '/',
watch: process.env.NODE_ENV !== 'production',
cache: process.env.NODE_ENV !== 'production',
cacheDir: '.cache',
contentHash: false,
minify: process.env.NODE_ENV === 'production',
scopeHoist: false,
target: 'browser',
bundleNodeModules: false,
https: true,
logLevel: 3,
hmr: false,
hmrPort: 1235,
sourceMaps: true,
hmrHostname: '',
detailedReport: false,
autoInstall: true
};
(async function() {
let configPath = process.env.CONFIG_PATH || 'config.json';
if(!fs.existsSync(configPath)) throw `[Error] (Mandatory) Missing ${configPath} file`;
console.log(`Using ${configPath} config file`);
let config = JSON.parse(fs.readFileSync(configPath));
if(!config.clientName) throw `[Error] (Mandatory) Missing clientName on ${configPath}`;
if(!config.clientLogo) throw `[Error] (Mandatory) Missing clientLogo on ${configPath}`;
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"
}
await fse.writeJSON('./src/manifest.webmanifest', manifest)
console.log(`Created manifest for ${config.clientName}`);
await fse.copy("./src/locales", "./dist/locales")
console.log(`Copied locales to dist folder`);
await fse.copy("./src/components", "./dist/components")
console.log(`Copied components to dist folder`);
const bundler = new Bundler('./src/index.pug', options);
bundler.addAssetType('html', require.resolve('./assets.js'));
if(process.env.NODE_ENV !== 'production') {
await bundler.serve();
} else {
await bundler.bundle();
}
})();

View File

@ -1,39 +0,0 @@
'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}`);

19685
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -7,42 +7,14 @@
"url": "https://git.startinblox.com/applications/hubl.git" "url": "https://git.startinblox.com/applications/hubl.git"
}, },
"scripts": { "scripts": {
"build": "run-p copy:* build:*", "prebuild": "rimraf build",
"build:css": "node-sass src/styles/index.scss -o dist/styles/", "build": "NODE_ENV='production' node internal/parcel.js",
"build:js": "babel \"src/scripts/*.js\" -o dist/scripts/index.js", "watch": "rimraf build && node internal/parcel.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 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:open": "cypress open",
"cypress:verify": "cypress verify", "cypress:verify": "cypress verify",
"cypress:info": "cypress info", "cypress:info": "cypress info",
"test": "cypress run" "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": { "release": {
"branches": [ "branches": [
"master" "master"
@ -73,21 +45,15 @@
] ]
}, },
"dependencies": { "dependencies": {
"@babel/cli": "^7.7.0", "fs-extra": "^9.0.1",
"@babel/core": "^7.9.0",
"copyfiles": "^2.1.1",
"include-media": "^1.4.9",
"node-sass": "^4.14.0",
"normalize.css": "^8.0.1", "normalize.css": "^8.0.1",
"npm-run-all": "^4.1.5", "parcel-bundler": "^1.12.4",
"pug": "^2.0.4", "pug": "^3.0.0",
"pug-cli": "^1.0.0-alpha6", "rimraf": "^2.7.1",
"pushstate-server": "^3.1.0" "sass": "^1.29.0"
}, },
"devDependencies": { "devDependencies": {
"cypress": "^4.5.0", "cypress": "^5.6.0",
"cypress-localstorage-commands": "^1.2.1", "cypress-localstorage-commands": "^1.2.4"
"cypress-terminal-report": "^1.2.1",
"npm-watch": "^0.7.0"
} }
} }

View File

@ -1,4 +1,4 @@
import { store, Sib, StoreMixin } from 'https://cdn.skypack.dev/@startinblox/core@0.13'; import { store, Sib, StoreMixin } from 'https://cdn.skypack.dev/@startinblox/core@0.14';
export const HublReactivity = { export const HublReactivity = {
name: 'hubl-reactivity', name: 'hubl-reactivity',

View File

@ -1,4 +1,4 @@
import { widgetFactory } from 'https://cdn.skypack.dev/@startinblox/core@0.13'; import { widgetFactory } from 'https://cdn.skypack.dev/@startinblox/core@0.14';
const HublSearchUsers = widgetFactory( const HublSearchUsers = widgetFactory(
'hubl-search-users', 'hubl-search-users',

View File

@ -1,4 +1,4 @@
import { widgetFactory, Helpers } from 'https://cdn.skypack.dev/@startinblox/core@0.13'; import { widgetFactory, Helpers } from 'https://cdn.skypack.dev/@startinblox/core@0.14';
import SlimSelect from 'https://cdn.skypack.dev/slim-select@1.23'; import SlimSelect from 'https://cdn.skypack.dev/slim-select@1.23';
const HublStatus = widgetFactory( const HublStatus = widgetFactory(

10
src/context.pug Normal file
View File

@ -0,0 +1,10 @@
//- Context - Fix for default context
script(data-default-context, type="application/ld+json")
| {
| "inbox": "http://happy-dev.fr/owl/#inbox",
| "object": "http://happy-dev.fr/owl/#object",
| "author": "http://happy-dev.fr/owl/#author",
| "account": "http://happy-dev.fr/owl/#account",
| "jabberID": "foaf:jabberID",
| "picture": "foaf:depiction"
| }

View File

@ -1,70 +1,40 @@
//- script(src="https://browser.sentry-cdn.com/5.25.0/bundle.tracing.min.js" defer) script(type="module" src="https://cdn.skypack.dev/@startinblox/core@0.14" 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://cdn.skypack.dev/@startinblox/core@0.13" defer)
//- script(type="module" src="/lib/sib-core/dist/index.js" defer) //- script(type="module" src="/lib/sib-core/dist/index.js" defer)
script(type="module" src="https://cdn.skypack.dev/@startinblox/oidc@0.11" defer) script(type="module" src="https://cdn.skypack.dev/@startinblox/oidc@0.12" defer)
//- script(type="module" src="/lib/sib-auth/index.js" defer) //- script(type="module" src="/lib/sib-auth/index.js" defer)
script(type="module" src="https://cdn.skypack.dev/@startinblox/router@0.11" 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="/lib/sib-router/src/index.js" defer)
script(type="module" src="https://cdn.skypack.dev/@startinblox/component-notifications@0.8" defer) script(type="module" src="https://cdn.skypack.dev/@startinblox/component-notifications@0.9" defer)
//- script(type="module" src="/lib/sib-notifications/index.js" 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)) if endpoints.get
script(type="module" src="https://cdn.skypack.dev/@startinblox/component-event@1.3" defer) if endpoints.get.events && endpoints.get.typeevents
//- script(type="module" src="/lib/sib-event-component/sib-event.js" defer) script(type="module" src="https://cdn.skypack.dev/@startinblox/component-event@1.3" defer)
//- script(type="module" src="/lib/sib-event-component/sib-event.js" defer)
if endpoints.polls || (endpoints.get && endpoints.get.polls) if endpoints.get.resources && endpoints.get.resourceskeywords && endpoints.get.resourcestypes
script(type="module" src="https://cdn.skypack.dev/@startinblox/component-conversation@0.6" defer) script(type="module" src="https://cdn.skypack.dev/@startinblox/component-resource@1.1" defer)
//- script(type="module" src="/lib/sib-conversation/sib-conversation.js" defer) //- script(type="module" src="/lib/sib-resource/sib-resource.js" defer)
if (endpoints.resources || (endpoints.get && endpoints.get.resources)) && (endpoints.resourceskeywords || (endpoints.get && endpoints.get.resourceskeywords)) && (endpoints.resourcestypes || (endpoints.get && endpoints.get.resourcestypes)) if endpoints.get.joboffers
script(type="module" src="https://cdn.skypack.dev/@startinblox/component-resource@1.1" defer) script(type="module" src="https://cdn.skypack.dev/@startinblox/component-job-board@1.3" defer)
//- script(type="module" src="/lib/sib-resource/sib-resource.js" defer) //- script(type="module" src="/lib/solid-job-board/dist/index.js" defer)
if endpoints.joboffers || (endpoints.get && endpoints.get.joboffers) if endpoints.get.uploads && endpoints.get.skills && endpoints.get.users
script(type="module" src="https://cdn.skypack.dev/@startinblox/component-job-board@1.2" defer) script(type="module" src="https://cdn.skypack.dev/@startinblox/component-directory@1.3" defer)
//- script(type="module" src="/lib/solid-job-board/dist/index.js" defer) //- script(type="module" src="/lib/solid-directory/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)) if endpoints.get.dashboards
script(type="module" src="https://cdn.skypack.dev/@startinblox/component-directory@1.2" defer) script(type="module" src="https://cdn.skypack.dev/@startinblox/component-dashboard@0.7" defer)
//- script(type="module" src="/lib/solid-directory/dist/index.js" defer) //- script(type="module" src="/lib/solid-dashboard/dist/index.js" defer)
if endpoints.dashboards || (endpoints.get && endpoints.get.dashboards) if endpoints.get.users
script(type="module" src="https://cdn.skypack.dev/@startinblox/component-dashboard@0.6" defer) script(type="module" src="https://cdn.skypack.dev/@startinblox/component-chat@1.7" defer)
//- script(type="module" src="/lib/solid-dashboard/dist/index.js" defer) //- script(type="module" src="/lib/solid-xmpp-chat/dist/index.js" defer)
if endpoints.users || (endpoints.get && endpoints.get.users) if endpoints.get.polls
script(type="module" src="https://cdn.skypack.dev/@startinblox/component-chat@1.4" defer) script(type="module" src="https://cdn.skypack.dev/@startinblox/component-poll@1.1" defer)
//- script(type="module" src="/lib/solid-xmpp-chat/dist/index.js" defer) //- script(type="module" src="/lib/sib-polls-component/index.js" defer)
if endpoints.polls || (endpoints.get && endpoints.get.polls)
script(type="module" src="https://cdn.skypack.dev/@startinblox/component-poll@1.1" 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)
//- Stylesheets
link(rel='stylesheet', href='/styles/index.css')
link(rel='stylesheet', href='https://fonts.googleapis.com/css?family=Open+Sans:300,400,400i,600,700&amp;subset=latin-ext')
link(rel='stylesheet', href='https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,700,700i,800,800i')
//- Context - Fix for LDFlex
script(data-default-context, type="application/ld+json")
| {
| "inbox": "http://happy-dev.fr/owl/#inbox",
| "object": "http://happy-dev.fr/owl/#object",
| "author": "http://happy-dev.fr/owl/#author",
| "account": "http://happy-dev.fr/owl/#account",
| "jabberID": "foaf:jabberID",
| "picture": "foaf:depiction"
| }

View File

@ -1,5 +0,0 @@
-
var __env = locals[process.env.ENV]
for(k in __env){
eval(`var ${k} = __env[${JSON.stringify(k)}]`);
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 106 KiB

After

Width:  |  Height:  |  Size: 78 KiB

2
src/index.js Normal file
View File

@ -0,0 +1,2 @@
//- Automatically import every scripts
import './scripts/**/*.js';

View File

@ -1,107 +1,137 @@
include get_config.pug
doctype html doctype html
html(lang="en") html(lang="en")
head head
meta(charset="UTF-8") meta(charset="UTF-8")
title #{clientName || "My Personal Hubl"} title #{clientName || "My Personal Hubl"}
meta(name="viewport", content="width=device-width, initial-scale=1.0") meta(name="viewport", content="width=device-width, initial-scale=1.0")
meta(http-equiv="X-UA-Compatible", content="ie=edge") meta(http-equiv="X-UA-Compatible", content="ie=edge")
if clientFavicon if clientFavicon
link(rel="icon" type="image/png" href=`${clientFavicon}`) link(rel="icon" type="image/png" href=`${clientFavicon}`)
else else
link(rel="icon" type="image/webp" href="/images/favicon.webp") link(rel="icon" type="image/webp" href="./images/favicon.webp")
include dependencies.pug
link(rel="preconnect" href="https://fonts.gstatic.com")
link(rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Open+Sans&display=swap")
link(rel='stylesheet', href='/styles/index.scss')
if clientCSS if clientCSS
link(rel='stylesheet', href=`${clientCSS}`) link(rel='stylesheet', href=`${clientCSS}`)
link(rel="manifest" href="/manifest.webmanifest") link(rel="manifest" href="/manifest.webmanifest")
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)
include dependencies.pug
include context.pug
//- swal2 does not work with skypack
script(src="https://cdn.jsdelivr.net/npm/sweetalert2@10" defer)
script(src="index.js" defer)
body body
if endpoints.get && endpoints.post
.wrapper include views/partials/notifications.pug
include views/partials/widgets.pug
header#header.header.is-spaced(role='banner') .wrapper
include header.pug
nav#main__menu.left-menu.jsLeftMenu header#header.header.is-spaced(role='banner')
include menu-left.pug include views/partials/header.pug
main#viewport.content.notLoggedIn nav#main__menu.left-menu.jsLeftMenu
include views/partials/menu-left.pug
if endpoints.dashboards || (endpoints.get && endpoints.get.dashboards) main#viewport.content.notLoggedIn
#dashboard(hidden, data-view="dashboard").no-sidebar.with-padding
include page-dashboard.pug
if publicDirectory && (endpoints.users || (endpoints.get && endpoints.get.users)) if endpoints.get.dashboards
#members(hidden, data-view="members", no-render).no-sidebar.with-padding #dashboard(hidden, data-view="dashboard").no-sidebar.with-padding
include page-directory.pug include views/page-dashboard.pug
if endpoints.joboffers || (endpoints.get && endpoints.get.joboffers) if publicDirectory && endpoints.get.users
#job-offers(hidden, data-view="job-offers", no-render).no-sidebar.with-padding #members(hidden, data-view="members", no-render).no-sidebar.with-padding
if (endpoints.post && endpoints.post.joboffers) && (endpoints.get && endpoints.get.joboffers) include views/page-directory.pug
if endpoints.get.joboffers
#job-offers(hidden, data-view="job-offers", no-render).no-sidebar.with-padding
hubl-reactivity(data-src=`${endpoints.post.joboffers}current/` target-src=`${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}`) hubl-reactivity(data-src=`${endpoints.post.joboffers}expired/` target-src=`${endpoints.get.joboffers}`)
hubl-reactivity(data-src=`${endpoints.post.joboffers}` target-src=`${endpoints.get.joboffers}`) hubl-reactivity(data-src=`${endpoints.post.joboffers}` target-src=`${endpoints.get.joboffers}`)
hubl-reactivity(data-src=`${endpoints.joboffers || endpoints.get.joboffers}current/` target-src=`${endpoints.joboffers || endpoints.get.joboffers}`) hubl-reactivity(data-src=`${endpoints.joboffers || endpoints.get.joboffers}current/` target-src=`${endpoints.joboffers || endpoints.get.joboffers}`)
hubl-reactivity(data-src=`${endpoints.joboffers || endpoints.get.joboffers}current/` target-src=`${endpoints.joboffers || endpoints.get.joboffers}expired/`) hubl-reactivity(data-src=`${endpoints.joboffers || endpoints.get.joboffers}current/` target-src=`${endpoints.joboffers || endpoints.get.joboffers}expired/`)
hubl-reactivity(data-src=`${endpoints.joboffers || endpoints.get.joboffers}expired/` target-src=`${endpoints.joboffers || endpoints.get.joboffers}`) hubl-reactivity(data-src=`${endpoints.joboffers || endpoints.get.joboffers}expired/` target-src=`${endpoints.joboffers || endpoints.get.joboffers}`)
hubl-reactivity(bind-user nested-field="joboffers" target-src=`${endpoints.joboffers || endpoints.get.joboffers}expired/`) hubl-reactivity(bind-user nested-field="joboffers" target-src=`${endpoints.joboffers || endpoints.get.joboffers}expired/`)
hubl-reactivity(bind-user nested-field="joboffers" target-src=`${endpoints.joboffers || endpoints.get.joboffers}`) hubl-reactivity(bind-user nested-field="joboffers" target-src=`${endpoints.joboffers || endpoints.get.joboffers}`)
hubl-reactivity(bind-user nested-field="joboffers" target-src=`${endpoints.joboffers || endpoints.get.joboffers}current/`) hubl-reactivity(bind-user nested-field="joboffers" target-src=`${endpoints.joboffers || endpoints.get.joboffers}current/`)
include page-job-offers.pug include views/page-job-offers.pug
if endpoints.projects || (endpoints.get && endpoints.get.projects) if endpoints.get.projects
#project(hidden, data-view="project", no-render).with-sidebar #project(hidden, data-view="project", no-render).with-sidebar
if (endpoints.post && endpoints.post.projects) && (endpoints.get && endpoints.get.projects) hubl-reactivity(bind-user nested-field='inbox' target-src="store://user.projects")
hubl-reactivity(data-src=`${endpoints.post.projects}joinable/` target-src=`${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}`) hubl-reactivity(data-src=`${endpoints.post.projects}` target-src=`${endpoints.get.projects}`)
hubl-reactivity(bind-user nested-field="projects" target-src=`${endpoints.post.projects}`) hubl-reactivity(bind-user nested-field="projects" target-src=`${endpoints.post.projects}`)
hubl-reactivity(bind-user nested-field="projects" target-src=`${endpoints.post.projects}joinable/`) hubl-reactivity(bind-user nested-field="projects" target-src=`${endpoints.post.projects}joinable/`)
hubl-reactivity(data-src=`${endpoints.projects || endpoints.get.projects}joinable/` target-src=`${endpoints.projects || endpoints.get.projects}`) hubl-reactivity(data-src=`${endpoints.projects || endpoints.get.projects}joinable/` target-src=`${endpoints.projects || endpoints.get.projects}`)
hubl-reactivity(bind-user nested-field="projects" target-src=`${endpoints.projects || endpoints.get.projects}`) hubl-reactivity(bind-user nested-field="projects" target-src=`${endpoints.projects || endpoints.get.projects}`)
hubl-reactivity(bind-user nested-field="projects" target-src=`${endpoints.projects || endpoints.get.projects}joinable/`) hubl-reactivity(bind-user nested-field="projects" target-src=`${endpoints.projects || endpoints.get.projects}joinable/`)
include page-project.pug include views/page-project.pug
if endpoints.circles || (endpoints.get && endpoints.get.circles) if endpoints.get.circles
#circle(hidden, data-view="circle", no-render).with-sidebar #circle(hidden, data-view="circle", no-render).with-sidebar
if (endpoints.post && endpoints.post.circles) && (endpoints.get && endpoints.get.circles) hubl-reactivity(bind-user nested-field='inbox' target-src="store://user.circles")
hubl-reactivity(data-src=`${endpoints.post.circles}joinable/` target-src=`${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}`) hubl-reactivity(data-src=`${endpoints.post.circles}` target-src=`${endpoints.get.circles}`)
hubl-reactivity(bind-user nested-field="circles" target-src=`${endpoints.post.circles}`) hubl-reactivity(bind-user nested-field="circles" target-src=`${endpoints.post.circles}`)
hubl-reactivity(bind-user nested-field="circles" target-src=`${endpoints.post.circles}joinable/`) hubl-reactivity(bind-user nested-field="circles" target-src=`${endpoints.post.circles}joinable/`)
hubl-reactivity(data-src=`${endpoints.circles || endpoints.get.circles}joinable/` target-src=`${endpoints.circles || endpoints.get.circles}`) hubl-reactivity(data-src=`${endpoints.circles || endpoints.get.circles}joinable/` target-src=`${endpoints.circles || endpoints.get.circles}`)
hubl-reactivity(bind-user nested-field="circles" target-src=`${endpoints.circles || endpoints.get.circles}`) hubl-reactivity(bind-user nested-field="circles" target-src=`${endpoints.circles || endpoints.get.circles}`)
hubl-reactivity(bind-user nested-field="circles" target-src=`${endpoints.circles || endpoints.get.circles}joinable/`) hubl-reactivity(bind-user nested-field="circles" target-src=`${endpoints.circles || endpoints.get.circles}joinable/`)
include page-circle.pug include views/page-circle.pug
if endpoints.users || (endpoints.get && endpoints.get.users) if endpoints.get.users
#messages(hidden, data-view="messages", no-render).with-sidebar #messages(hidden, data-view="messages", no-render).with-sidebar
include page-messages.pug hubl-reactivity(bind-user nested-field='inbox' target-src="store://user.contacts")
include views/page-messages.pug
if endpoints.polls || (endpoints.get && endpoints.get.polls)
#polls(hidden, data-view="polls").with-sidebar if endpoints.get.polls
include page-polls.pug #polls(hidden, data-view="polls").with-sidebar
include views/page-polls.pug
if endpoints.events || (endpoints.get && endpoints.get.events) if endpoints.get.events
#events(hidden, data-view="events") #events(hidden, data-view="events")
include page-events.pug include views/page-events.pug
if endpoints.resources || (endpoints.get && endpoints.get.resources) if endpoints.get.resources
#resources(hidden, data-view="resources") #resources(hidden, data-view="resources")
include page-resources.pug include views/page-resources.pug
#admin(hidden, data-view="admin", no-render).with-sidebar #admin(hidden, data-view="admin", no-render).with-sidebar
include page-admin.pug include views/page-admin.pug
#about(data-view="about", no-render).no-sidebar.with-padding #about(data-view="about", no-render).no-sidebar.with-padding
include page-about.pug include views/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)) if endpoints.get.skills && endpoints.post.uploads && endpoints.post.users
#profile(hidden, data-view="profile", no-render).no-sidebar #profile(hidden, data-view="profile", no-render).no-sidebar
include page-profile.pug include views/page-profile.pug
if analytics if analytics
each provider in analytics each provider in analytics
if provider.type && provider.url && provider.url if provider.type && provider.url && provider.url
solid-analytics( solid-analytics(
type=`${provider.type}` type=`${provider.type}`
url=`${provider.url}` url=`${provider.url}`
id=`${provider.id}` id=`${provider.id}`
) )
else
h1(style='color:red') Invalid config.json (missing `endpoints.get` or `endpoints.post`)

View File

@ -15,6 +15,11 @@
"project": "project", "project": "project",
"circle": "circle" "circle": "circle"
}, },
"contact": {
"create": "Find your contacts on the",
"profileDir": "profile directory",
"create2": ""
},
"dashboard": "Dashboard", "dashboard": "Dashboard",
"events": "Events", "events": "Events",
"gov": "Governance", "gov": "Governance",

View File

@ -15,6 +15,11 @@
"project": "proyecto", "project": "proyecto",
"circle": "círculo" "circle": "círculo"
}, },
"contact": {
"create": "Encuentre sus contactos en el",
"profileDir": "directorio de miembros",
"create2": ""
},
"dashboard": "Panel de control", "dashboard": "Panel de control",
"events": "Eventos", "events": "Eventos",
"gov": "Gobernanza", "gov": "Gobernanza",

View File

@ -15,6 +15,11 @@
"project": "projet", "project": "projet",
"circle": "cercle" "circle": "cercle"
}, },
"contact": {
"create": "Retrouve tes contacts sur",
"profileDir": "l'annuaire des membres",
"create2": ""
},
"dashboard": "Tableau de bord", "dashboard": "Tableau de bord",
"events": "Evènements", "events": "Evènements",
"gov": "Gouvernance", "gov": "Gouvernance",

6
src/pug.config.js Normal file
View File

@ -0,0 +1,6 @@
let configPath = process.env.CONFIG_PATH || 'config.json';
const config = require(`../${configPath}`);
module.exports = {
locals: config
};

View File

@ -187,10 +187,14 @@ document.addEventListener("DOMContentLoaded", () => {
*/ */
function recursivePopulate(element) { function recursivePopulate(element) {
Array.from(element.querySelectorAll('*')).forEach((e) => { Array.from(element.querySelectorAll('*')).forEach((e) => {
e.addEventListener("populate", (e) => { if(e.content && e.content instanceof DocumentFragment) {
recursivePopulate(e.target); recursivePopulate(e.content);
jsI18n.processNode(e.target); } else if(e instanceof HTMLElement) {
}); e.addEventListener("populate", (el) => {
recursivePopulate(el.target);
jsI18n.processNode(el.target);
});
}
}); });
} }
// Process every children from document // Process every children from document

View File

@ -0,0 +1,284 @@
// Button global CSS
solid-delete,
solid-route,
solid-link,
button,
input[type='submit'],
a,
.button {
background: none;
border: none;
cursor: pointer;
display: inline-block;
padding: 0;
&.button {
padding: 0.55rem 2.5rem;
border-radius: 100em;
*,
& {
font-size: 1.4rem;
}
&.mobile-full-width {
margin-bottom: 1rem;
padding-left: 5rem;
width: -webkit-fill-available;
width: -moz-available;
@include breakpoint(lg) {
margin-bottom: 0;
padding-left: 2.5rem;
width: auto;
}
&::before {
margin-left: -2.6rem;
@include breakpoint(lg) {
margin-left: 0;
}
}
}
&.desktop-btn-margin__left {
margin: 0;
@include breakpoint(lg) {
margin-left: 2.2rem;
}
}
&.small {
*,
& {
font-size: 1rem;
}
}
&.text-bold {
*,
& {
font-weight: bold;
}
}
&.text-uppercase {
*,
& {
text-transform: uppercase;
}
}
&.rounded {
border-radius: 50%;
font-size: 1.8rem;
padding: 1rem;
height: 42px;
width: 42px;
display: flex;
align-items: center;
justify-content: center;
margin: 0 auto;
}
&.button-link {
border-radius: 100em;
*,
& {
text-decoration: underline;
}
&:hover {
text-decoration: none;
}
}
&.with-icon::before {
font-size: 1.6rem;
margin-right: 1rem;
}
&.button-primary{
background-color: var(--color-white);
*,
& {
color: var(--color-primary);
}
&.bordered, &.button-bordered {
border: 1px solid var(--color-primary);
}
&:hover {
background-color: var(--color-primary);
*,
& {
color: var(--color-white);
}
}
}
&.button-disabled{
cursor: not-allowed;
background-color: var(--color-white);
*,
& {
color: var(--color-grey-3);
}
&.bordered, &.button-bordered {
border: 1px solid var(--color-grey-3);
}
&:hover {
background-color: var(--color-white);
*,
& {
color: var(--color-grey-3);
}
}
}
&.button-secondary {
background-color: var(--color-white);
*,
& {
color: var(--color-secondary);
}
&.bordered, &.button-bordered {
border: 1px solid var(--color-secondary);
}
&:hover {
background-color: var(--color-secondary);
*,
& {
color: var(--color-white);
}
}
}
&.button-complementary {
color: var(--color-complementary);
background-color: var(--color-white);
&.bordered, &.button-bordered {
border: 1px solid var(--color-complementary);
}
&:hover {
background-color: var(--color-complementary);
color: var(--color-white);
}
}
&.flex {
display: flex;
}
&.reversed {
&.button-primary {
background-color: var(--color-primary);
*,
& {
color: var(--color-white);
}
&:hover {
background-color: var(--color-white);
color: var(--color-primary);
*,
& {
color: var(--color-primary);
}
&.bordered, &.button-bordered {
border: 1px solid var(--color-primary);
}
}
}
&.button-disabled{
cursor: not-allowed;
background-color: var(--color-grey-3);
*,
& {
color: var(--color-white);
}
&.bordered, &.button-bordered {
border: 1px solid var(--color-white);
}
&:hover {
background-color: var(--color-grey-3);
*,
& {
color: var(--color-white);
}
}
}
&.button-secondary {
background-color: var(--color-secondary);
*,
& {
color: var(--color-white);
}
&:hover {
background-color: var(--color-white);
*,
& {
color: var(--color-secondary);
}
&.bordered, &.button-bordered {
border: 1px solid var(--color-secondary);
}
}
}
&.button-complementary {
background-color: var(--color-complementary);
*,
& {
color: var(--color-white);
}
&:hover {
background-color: var(--color-white);
*,
& {
color: var(--color-complementary);
}
&.bordered, &.button-bordered {
border: 1px solid var(--color-complementary);
}
}
}
}
}
}

View File

@ -18,13 +18,14 @@ solid-form {
} }
} }
.button-register>form>input[type=submit] {
@extend .button, .button-register input[type=submit] {
.text-bold, @extend .button;
.text-uppercase, @extend .text-bold;
.reversed, @extend .text-uppercase;
.button-secondary, @extend .reversed;
.bordered; @extend .button-secondary;
@extend .bordered;
height: auto; height: auto;
position: fixed; position: fixed;
bottom: 1em; bottom: 1em;
@ -100,37 +101,6 @@ textarea {
height: 100px; height: 100px;
resize: vertical; resize: vertical;
} }
.content-box {
&.with-form {
/*solid-set-default:not([name='user-thumb']) {
clear: both;
display: flex!important;
flex-wrap: wrap;
max-width: 100%;
solid-form-label-text {
float: left;
width: 50%;
}
}*/
}
}
/*solid-form[set-user-id-select] {
input[type="submit"] {
margin-left: 0;
margin-top: 0;
}
select {
display: none;
}
}*/
/* WIDGETS SIB (let in .content-box to override default styles) */ /* WIDGETS SIB (let in .content-box to override default styles) */
@ -196,12 +166,12 @@ hubl-status {
min-width: 35vw; min-width: 35vw;
} }
input[type='submit'] { input[type=submit] {
@extend .button, @extend .button;
.text-bold, @extend .text-bold;
.text-uppercase, @extend .text-uppercase;
.button-complementary, @extend .button-complementary;
.bordered; @extend .bordered;
margin: 10px 0; margin: 10px 0;
width: 100%; width: 100%;
@ -280,11 +250,11 @@ solid-form-file {
} }
label { label {
@extend .button, @extend .button;
.text-bold, @extend .text-bold;
.text-uppercase, @extend .text-uppercase;
.button-primary, @extend .button-primary;
.bordered; @extend .bordered;
text-align: center; text-align: center;
width: 100%; width: 100%;

View File

@ -294,11 +294,11 @@ h5 {
} }
input[type='submit'] { input[type='submit'] {
@extend .button, @extend .button;
.text-bold, @extend .text-bold;
.text-uppercase, @extend .text-uppercase;
.button-primary, @extend .button-primary;
.bordered; @extend .bordered;
align-self: center; align-self: center;
} }
} }
@ -340,11 +340,11 @@ h5 {
} }
input { input {
@extend .button, @extend .button;
.text-bold, @extend .text-bold;
.text-uppercase, @extend .text-uppercase;
.button-primary, @extend .button-primary;
.bordered; @extend .bordered;
margin: 10px 0; margin: 10px 0;
width: 100%; width: 100%;
@ -618,293 +618,9 @@ h5 {
} }
// Other base components // Other base components
@import 'buttons';
@import 'form'; @import 'form';
@import 'table'; @import 'table';
@import 'header'; @import 'header';
@import 'menu-left'; @import 'menu-left';
@import 'user-thumb'; @import 'user-thumb';
// Button global CSS
solid-delete,
solid-route,
solid-link,
button,
input[type='submit'],
a,
.button {
background: none;
border: none;
cursor: pointer;
display: inline-block;
padding: 0;
&.button {
padding: 0.55rem 2.5rem;
border-radius: 100em;
*,
& {
font-size: 1.4rem;
}
&.mobile-full-width {
margin-bottom: 1rem;
padding-left: 5rem;
width: -webkit-fill-available;
width: -moz-available;
@include breakpoint(lg) {
margin-bottom: 0;
padding-left: 2.5rem;
width: auto;
}
&::before {
margin-left: -2.6rem;
@include breakpoint(lg) {
margin-left: 0;
}
}
}
&.desktop-btn-margin__left {
margin: 0;
@include breakpoint(lg) {
margin-left: 2.2rem;
}
}
&.small {
*,
& {
font-size: 1rem;
}
}
&.text-bold {
*,
& {
font-weight: bold;
}
}
&.text-uppercase {
*,
& {
text-transform: uppercase;
}
}
&.rounded {
border-radius: 50%;
font-size: 1.8rem;
padding: 1rem;
height: 42px;
width: 42px;
display: flex;
align-items: center;
justify-content: center;
margin: 0 auto;
}
&.button-link {
border-radius: 100em;
*,
& {
text-decoration: underline;
}
&:hover {
text-decoration: none;
}
}
&.with-icon::before {
font-size: 1.6rem;
margin-right: 1rem;
}
&.button-primary{
background-color: var(--color-white);
*,
& {
color: var(--color-primary);
}
&.bordered {
border: 1px solid var(--color-primary);
}
&:hover {
background-color: var(--color-primary);
*,
& {
color: var(--color-white);
}
}
}
&.button-disabled{
cursor: not-allowed;
background-color: var(--color-white);
*,
& {
color: var(--color-grey-3);
}
&.bordered {
border: 1px solid var(--color-grey-3);
}
&:hover {
background-color: var(--color-white);
*,
& {
color: var(--color-grey-3);
}
}
}
&.button-secondary {
background-color: var(--color-white);
*,
& {
color: var(--color-secondary);
}
&.bordered {
border: 1px solid var(--color-secondary);
}
&:hover {
background-color: var(--color-secondary);
*,
& {
color: var(--color-white);
}
}
}
&.button-complementary {
color: var(--color-complementary);
background-color: var(--color-white);
&.bordered {
border: 1px solid var(--color-complementary);
}
&:hover {
background-color: var(--color-complementary);
color: var(--color-white);
}
}
&.flex {
display: flex;
}
&.reversed {
&.button-primary {
background-color: var(--color-primary);
*,
& {
color: var(--color-white);
}
&:hover {
background-color: var(--color-white);
color: var(--color-primary);
*,
& {
color: var(--color-primary);
}
&.bordered {
border: 1px solid var(--color-primary);
}
}
}
&.button-disabled{
cursor: not-allowed;
background-color: var(--color-grey-3);
*,
& {
color: var(--color-white);
}
&.bordered {
border: 1px solid var(--color-white);
}
&:hover {
background-color: var(--color-grey-3);
*,
& {
color: var(--color-white);
}
}
}
&.button-secondary {
background-color: var(--color-secondary);
*,
& {
color: var(--color-white);
}
&:hover {
background-color: var(--color-white);
*,
& {
color: var(--color-secondary);
}
&.bordered {
border: 1px solid var(--color-secondary);
}
}
}
&.button-complementary {
background-color: var(--color-complementary);
*,
& {
color: var(--color-white);
}
&:hover {
background-color: var(--color-white);
*,
& {
color: var(--color-complementary);
}
&.bordered {
border: 1px solid var(--color-complementary);
}
}
}
}
}
}

View File

@ -164,7 +164,7 @@
} }
} }
solid-display.nosub>solid-form[fields="name"]>hubl-search-users>input { solid-display>solid-form[fields="contact.name"]>hubl-search-users>input {
margin-left: 30px; margin-left: 30px;
margin-bottom: 10px; margin-bottom: 10px;
width: calc(80vw - 71px); width: calc(80vw - 71px);
@ -182,28 +182,9 @@
} }
} }
solid-display.nosub>nav { hubl-create solid-link,
text-align: center; hubl-create-contact solid-link {
overflow: hidden; display: inline;
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 { hubl-menu-publicprivate {
@ -218,10 +199,6 @@
} }
} }
>solid-display.nosub>div>solid-display>div {
padding: 1rem 1rem 1rem 3rem;
}
solid-display>div { solid-display>div {
.create { .create {
@ -239,7 +216,8 @@
cursor: pointer; cursor: pointer;
>hubl-menu-fix-url-circle>solid-link>solid-display>div, >hubl-menu-fix-url-circle>solid-link>solid-display>div,
>hubl-menu-fix-url-project>solid-link>solid-display>div { >hubl-menu-fix-url-project>solid-link>solid-display>div,
>hubl-menu-fix-url-contact>solid-link>solid-display>div {
padding: 1rem 1rem 1rem 3rem; padding: 1rem 1rem 1rem 3rem;
} }
} }
@ -251,7 +229,8 @@
&>solid-display[active]>div, &>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-circle>solid-link>solid-display[active]>div,
&>solid-display>div>hubl-menu-fix-url-project>solid-link>solid-display[active]>div { &>solid-display>div>hubl-menu-fix-url-project>solid-link>solid-display[active]>div,
&>solid-display>div>hubl-menu-fix-url-contact>solid-link>solid-display[active]>div {
background-color: var(--color-menu-highlight-primary); background-color: var(--color-menu-highlight-primary);
color: var(--color-menu-text-active); color: var(--color-menu-text-active);
font-weight: bold; font-weight: bold;
@ -261,13 +240,15 @@
&.menu-notification { &.menu-notification {
>solid-display>div>solid-display>div>hubl-menu-fix-url-circle, >solid-display>div>solid-display>div>hubl-menu-fix-url-circle,
>solid-display>div>solid-display>div>hubl-menu-fix-url-project { >solid-display>div>solid-display>div>hubl-menu-fix-url-project,
>solid-display>div>solid-display>div>hubl-menu-fix-url-contact {
flex: 1; flex: 1;
} }
>solid-display>div>solid-display>div, >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-circle>solid-link>solid-display>div,
>solid-display>div>solid-display>div>hubl-menu-fix-url-project>solid-link>solid-display>div { >solid-display>div>solid-display>div>hubl-menu-fix-url-project>solid-link>solid-display>div,
>solid-display>div>solid-display>div>hubl-menu-fix-url-contact>solid-link>solid-display>div {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
} }

View File

@ -154,14 +154,13 @@
[name='button'] { [name='button'] {
input[type='submit'] { input[type='submit'] {
@extend @extend .button;
.button, @extend .text-bold;
.text-bold, @extend .text-uppercase;
.text-uppercase, @extend .reversed;
.reversed, @extend .button-secondary;
.button-secondary, @extend .bordered;
.bordered, @extend .desktop-btn-margin__left;
.desktop-btn-margin__left;
} }
} }

View File

@ -1,28 +1,25 @@
@charset "UTF-8"; @charset "UTF-8";
@import '../../node_modules/include-media/dist/include-media'; @import 'normalize.css';
@import '../../node_modules/normalize.css/normalize';
@import 'abstracts/fonts'; @import 'abstracts/fonts';
@import 'abstracts/variables'; @import 'abstracts/variables';
@import 'abstracts/mixins'; @import 'abstracts/mixins';
@import 'components/loader'; @import 'components/loader';
@import 'components/icons/index'; @import 'components/icons';
@import 'base/main'; @import 'base/main';
@import 'base/about'; @import 'base/about';
#viewport { #viewport {
display: flex; display: flex;
flex: 1; flex: 1;
/*height: auto;
min-height: 100vh;*/
overflow-y: auto; overflow-y: auto;
@import 'components/index'; @import 'components';
@import 'layout/members/index'; @import 'layout/members';
@import 'layout/job-offers/index'; @import 'layout/job-offers';
@import 'layout/user/index'; @import 'layout/user';
@import 'layout/events/index'; @import 'layout/events';
@import 'layout/resources/index'; @import 'layout/resources';
@import 'layout/dashboard/index'; @import 'layout/dashboard';
@import 'layout/polls/index'; @import 'layout/polls';
} }

142
src/sw.js
View File

@ -1,4 +1,4 @@
const CACHE_NAME = 'hubl-store'; const CACHE_NAME = 'hubl-store-cnt82i';
self.addEventListener('install', function (e) { self.addEventListener('install', function (e) {
self.skipWaiting(); self.skipWaiting();
@ -30,84 +30,86 @@ self.addEventListener('activate', function (e) {
self.clients.claim(); self.clients.claim();
}); });
self.addEventListener('fetch', function (event) { if(process.env.NODE_ENV === 'production'){
let requestURL = new URL(event.request.url); self.addEventListener('fetch', function (event) {
if (requestURL.origin == location.origin) { let requestURL = new URL(event.request.url);
// Static asset, cache then network if (requestURL.origin == location.origin) {
event.respondWith( // Static asset, cache then network
caches.open(CACHE_NAME).then(function (cache) { event.respondWith(
return cache.match(event.request).then(function (response) { caches.open(CACHE_NAME).then(function (cache) {
var fetchPromise = fetch(event.request).then(function (networkResponse) { return cache.match(event.request).then(function (response) {
cache.put(event.request, networkResponse.clone()); var fetchPromise = fetch(event.request).then(function (networkResponse) {
return networkResponse; cache.put(event.request, networkResponse.clone());
return networkResponse;
});
return response || fetchPromise;
}); });
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 { } else {
if ( if (
/unpkg/.test(requestURL.origin) || event.request.method == 'POST' ||
/skypack/.test(request.origin) || event.request.method == 'PUT'
/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 // disabled: lead to cors errors
// // api: distant then cache // // POST/PUT to api, rewrite the cache
// event.respondWith( // event.respondWith(
// fetch(event.request) // caches.open(CACHE_NAME + '-api').then(function (cache) {
// .then((response) => { // return fetch(event.request).then(function (response) {
// caches.open(CACHE_NAME + '-api').then(function (cache) {
// cache.put(event.request, response.clone()); // cache.put(event.request, response.clone());
// return response; // return response;
// }); // })
// }) // }));
// .catch(() => {
// return caches.match(event.request);
// })
// );
// api: no cache // api: no cache
event.respondWith(fetch(event.request)); 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(requestURL.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

@ -1,2 +0,0 @@
solid-widget(name='hubl-user-avatar')
template ${await value ? `<img src="${await value}" style="max-width:100%; max-height: 100%;" />` : `<object type="image/svg+xml" data="/images/alien.svg"></object>`}

View File

@ -1,13 +1,13 @@
.views-container.sidebar-is-closed .views-container.sidebar-is-closed
if endpoints.circles || (endpoints.get && endpoints.get.circles) if endpoints.circles || (endpoints.get && endpoints.get.circles)
#admin-circles(hidden, data-view="admin-circles") #admin-circles(hidden, data-view="admin-circles")
include views/admin/page-admin-circles.pug include partials/admin/page-admin-circles.pug
if endpoints.projects || (endpoints.get && endpoints.get.projects) if endpoints.projects || (endpoints.get && endpoints.get.projects)
#admin-projects(hidden, data-view="admin-projects") #admin-projects(hidden, data-view="admin-projects")
include views/admin/page-admin-projects.pug include partials/admin/page-admin-projects.pug
if (endpoints.users || (endpoints.get && endpoints.get.users)) if (endpoints.users || (endpoints.get && endpoints.get.users))
#admin-communities(hidden, data-view="admin-communities") #admin-communities(hidden, data-view="admin-communities")
include views/admin/page-admin-communities.pug include partials/admin/page-admin-communities.pug
nav.jsRightMenu(role='navigation') nav.jsRightMenu(role='navigation')
solid-router(default-route='admin-circles') solid-router(default-route='admin-circles')
ul ul

View File

@ -13,15 +13,15 @@
div.content-box__height div.content-box__height
solid-ac-checker(permission='acl:Read', bind-resources) solid-ac-checker(permission='acl:Read', bind-resources)
#circle-chat(hidden, data-view="circle-chat") #circle-chat(hidden, data-view="circle-chat")
include views/circle/page-circle-chat.pug include partials/circle/page-circle-chat.pug
#circle-information.content-box__height(hidden, data-view="circle-information") #circle-information.content-box__height(hidden, data-view="circle-information")
include views/circle/page-circle-profile.pug include partials/circle/page-circle-profile.pug
#circle-events(hidden, data-view="circle-events") #circle-events(hidden, data-view="circle-events")
include views/circle/page-circle-events.pug include partials/circle/page-circle-events.pug
#circle-resources(hidden, data-view="circle-resources") #circle-resources(hidden, data-view="circle-resources")
include views/circle/page-circle-resources.pug include partials/circle/page-circle-resources.pug
#circle-polls(hidden, data-view="circle-polls") #circle-polls(hidden, data-view="circle-polls")
include views/circle/page-circle-polls.pug include partials/circle/page-circle-polls.pug
nav.jsRightMenu(role='navigation') nav.jsRightMenu(role='navigation')
solid-router(default-route='circle-chat') solid-router(default-route='circle-chat')

View File

@ -17,11 +17,11 @@
div.content-box__height div.content-box__height
solid-ac-checker(permission='acl:Read', bind-resources) solid-ac-checker(permission='acl:Read', bind-resources)
#project-chat(hidden, data-view="project-chat") #project-chat(hidden, data-view="project-chat")
include views/project/page-project-chat.pug include partials/project/page-project-chat.pug
#project-information.content-box__height(hidden, data-view="project-information") #project-information.content-box__height(hidden, data-view="project-information")
include views/project/page-project-profile.pug include partials/project/page-project-profile.pug
#project-picture(hidden, data-view="project-picture") #project-picture(hidden, data-view="project-picture")
include views/project/page-project-picture.pug include partials/project/page-project-picture.pug
nav.jsRightMenu(role='navigation') nav.jsRightMenu(role='navigation')
solid-router(default-route='project-chat') solid-router(default-route='project-chat')

View File

@ -11,7 +11,6 @@
include ../circle/page-circle-left.pug include ../circle/page-circle-left.pug
#admin-circle-list.content-box__height(hidden, data-view="admin-circle-list") #admin-circle-list.content-box__height(hidden, data-view="admin-circle-list")
include ../../templates/hubl-user-avatar.pug
solid-widget(name='hubl-circle-owner') solid-widget(name='hubl-circle-owner')
template template
@ -90,7 +89,7 @@
value-user.username='hubl-workaround-493' value-user.username='hubl-workaround-493'
widget-user.username='solid-form-hidden' widget-user.username='solid-form-hidden'
submit-button='Rejoindre' submit-button=''
data-trans='submit-button=circle.list.buttonJoin' 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}` target-src='${value}')

View File

@ -12,7 +12,6 @@
include ../project/page-project-left.pug include ../project/page-project-left.pug
#admin-project-list.content-box__height(hidden, data-view="admin-project-list") #admin-project-list.content-box__height(hidden, data-view="admin-project-list")
include ../../templates/hubl-user-avatar.pug
div.content-box__info.flex div.content-box__info.flex
div.admin-header.flex div.admin-header.flex

View File

@ -1,7 +1,5 @@
div.content-box__info div.content-box__info
include ../../templates/hubl-user-avatar.pug
solid-widget(name="circle-edit-members-delete") solid-widget(name="circle-edit-members-delete")
template template
solid-ac-checker(permission="acl:Delete" data-src="${src}") solid-ac-checker(permission="acl:Delete" data-src="${src}")

View File

@ -10,12 +10,6 @@ solid-notifications.notLoggedIn(
bind-user bind-user
) )
//- Templates for notifications from circles and from other users
include views/notifications/message-circle.pug
include views/notifications/message-private.pug
include templates/hubl-user-avatar.pug
details#user-controls.notLoggedIn details#user-controls.notLoggedIn
summary(tabindex='0' role='button') summary(tabindex='0' role='button')
solid-display#user-controls__profile( solid-display#user-controls__profile(

View File

@ -12,6 +12,15 @@ solid-widget(name='hubl-menu-publicprivate')
template template
div ${value == 'Public' ? '#' : ''} div ${value == 'Public' ? '#' : ''}
solid-widget(name='hubl-create-contact')
template
p.create
span(data-trans="menuLeft.contact.create")
span &nbsp;
solid-link(next="members" data-trans="menuLeft.contact.profileDir")
span &nbsp;
span(data-trans="menuLeft.contact.create2")
solid-widget(name='hubl-create') solid-widget(name='hubl-create')
template template
p.create p.create
@ -22,6 +31,19 @@ solid-widget(name='hubl-create')
span &nbsp; span &nbsp;
solid-link(next="${value == 'projet' ? 'admin-projects' : 'admin-circles'}", data-trans="menuLeft.emptyCircleProject.adminPanel") solid-link(next="${value == 'projet' ? 'admin-projects' : 'admin-circles'}", data-trans="menuLeft.emptyCircleProject.adminPanel")
solid-widget(name='hubl-menu-fix-url-contact')
template
solid-link(data-src="${value}" next="messages")
solid-display(
data-src='${value}'
fields='name, chatProfile.jabberID, badge'
value-badge='${value}'
widget-badge='hubl-counter'
widget-chatProfile.jabberID='hubl-menu-jabberid'
widget-name='solid-display-div'
order-asc='username'
)
solid-widget(name='hubl-menu-fix-url-circle') solid-widget(name='hubl-menu-fix-url-circle')
template template
solid-link(data-src="${value}" next="circle") solid-link(data-src="${value}" next="circle")
@ -33,7 +55,7 @@ solid-widget(name='hubl-menu-fix-url-circle')
widget-badge='hubl-counter' widget-badge='hubl-counter'
widget-jabberID='hubl-menu-jabberid' widget-jabberID='hubl-menu-jabberid'
widget-name='solid-display-div' widget-name='solid-display-div'
order-by="name" order-asc="name"
) )
solid-widget(name='hubl-menu-fix-url-project') solid-widget(name='hubl-menu-fix-url-project')
@ -49,7 +71,7 @@ solid-widget(name='hubl-menu-fix-url-project')
widget-jabberID='hubl-menu-jabberid' widget-jabberID='hubl-menu-jabberid'
widget-badge='hubl-counter' widget-badge='hubl-counter'
widget-name='solid-display-div' widget-name='solid-display-div'
order-by="customer.name" order-asc="customer.name"
) )
@ -110,7 +132,7 @@ solid-router#navbar-router(default-route='dashboard')
empty-value='' empty-value=''
data-trans="empty-value=menuLeft.emptyCircleProject.project" data-trans="empty-value=menuLeft.emptyCircleProject.project"
widget-project='hubl-menu-fix-url-project' widget-project='hubl-menu-fix-url-project'
order-by="project.customer.name" order-asc="project.customer.name"
) )
div.divider div.divider
if endpoints.circles || (endpoints.get && endpoints.get.circles) if endpoints.circles || (endpoints.get && endpoints.get.circles)
@ -139,40 +161,37 @@ solid-router#navbar-router(default-route='dashboard')
empty-value='' empty-value=''
data-trans="empty-value=menuLeft.emptyCircleProject.circle" data-trans="empty-value=menuLeft.emptyCircleProject.circle"
widget-circle='hubl-menu-fix-url-circle' widget-circle='hubl-menu-fix-url-circle'
order-by="circle.name" order-asc="circle.name"
)
div.divider
if endpoints.users || (endpoints.get && endpoints.get.users)
div.menu-wrapper
div.menu
div.menu-chevron
div.menu-icon.icon-arrow-up
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
div#loader-messages.loader.loader-menu
div
div
div
div
solid-display.nosub.message-tab(
data-src=`${endpoints.users || (endpoints.get && endpoints.get.users)}`
fields='name, chatProfile.jabberID, badge'
loader-id='loader-messages'
search-fields="name"
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'
widget-chatProfile.jabberID='hubl-menu-jabberid'
action-badge='badge'
order-by='username'
next='messages'
paginate-by='10'
) )
div.divider div.divider
div.menu-wrapper
div.menu
div.menu-chevron
div.menu-icon.icon-arrow-up
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
div#loader-messages.loader.loader-menu
div
div
div
div
//- search-fields="contact.name"
//- search-label-contact.name=""
//- data-trans="search-label-contact.name=menuLeft.search"
//- search-widget-contact.name="hubl-search-users"
solid-display.message-tab(
bind-user
nested-field='contacts'
fields='contact'
loader-id='loader-messages'
empty-widget='hubl-create-contact'
empty-value=''
widget-contact='hubl-menu-fix-url-contact'
order-asc="contact.username"
)
div.divider
solid-route(name='admin', hidden) solid-route(name='admin', hidden)
solid-route.menu(name='profile', hidden) solid-route.menu(name='profile', hidden)

View File

@ -0,0 +1,4 @@
//- Templates for notifications
include notifications/message-circle.pug
include notifications/message-private.pug

View File

@ -1,7 +1,5 @@
div.content-box__info div.content-box__info
include ../../templates/hubl-user-avatar.pug
solid-widget(name="project-edit-members-delete") solid-widget(name="project-edit-members-delete")
template template
solid-ac-checker(permission="acl:Delete" data-src="${src}") solid-ac-checker(permission="acl:Delete" data-src="${src}")

View File

@ -3,7 +3,6 @@ solid-router(default-route='project-profile', hidden)
solid-route(name='project-edit') solid-route(name='project-edit')
#project-profile(hidden, data-view="project-profile") #project-profile(hidden, data-view="project-profile")
include ../../templates/hubl-captain.pug
solid-widget(name='hubl-project-team-contact') solid-widget(name='hubl-project-team-contact')
template template

View File

@ -0,0 +1,4 @@
//- Import your widgets from the `widget`folder here
include widgets/hubl-captain.pug
include widgets/hubl-user-avatar.pug

View File

@ -1,9 +1,7 @@
include hubl-user-avatar.pug
solid-widget(name='hubl-captain') solid-widget(name='hubl-captain')
template template
solid-display.user-thumb( solid-display.user-thumb(
data-src="${await value}" data-src="${value}"
fields='account.picture, sup(name), sub(is_lead)' fields='account.picture, sup(name), sub(is_lead)'
class-account.picture='avatar user-thumb__picture' class-account.picture='avatar user-thumb__picture'

View File

@ -0,0 +1,2 @@
solid-widget(name='hubl-user-avatar')
template ${value ? `<img src="${value}" style="max-width:100%; max-height: 100%;" />` : `<object type="image/svg+xml" data="/images/alien.svg"></object>`}