This commit is contained in:
Clément 2018-09-28 21:17:08 +02:00
parent a0c1cab2ba
commit 874a8c636f
76 changed files with 0 additions and 6837 deletions

15
.gitignore vendored
View File

@ -1,15 +0,0 @@
# Folders
.git
node_modules
bower_components
dist/css/*
!dist/css/.gitkeep
dist/html/*
!dist/html/.gitkeep
# Files
index.html
config.pug
issues.md
oidc-client-preprod-config.json

12
.gitmodules vendored
View File

@ -1,12 +0,0 @@
[submodule "dist/lib/webcomponentsjs"]
path = dist/lib/webcomponentsjs
url = https://github.com/webcomponents/webcomponentsjs
[submodule "dist/lib/sib-core"]
path = dist/lib/sib-core
url = git@git.happy-dev.fr:startinblox/sib-core.git
[submodule "dist/lib/sib-router"]
path = dist/lib/sib-router
url = git@git.happy-dev.fr:startinblox/sib-router.git
[submodule "dist/lib/sib-chat"]
path = dist/lib/sib-chat
url = git@git.happy-dev.fr:startinblox/sib-chat.git

View File

@ -1,8 +0,0 @@
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule \. - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
</IfModule>

View File

@ -1,49 +0,0 @@
default: build
config.pug:
@cp -n config-sample.pug config.pug
node_modules:
npm install
install: node_modules
git submodule update --init --recursive
update:
cd dist/lib/sib-chat; \
git pull origin master
cd dist/lib/sib-core; \
git pull origin master
cd dist/lib/sib-router; \
git pull origin master
dist/css/hd-app.css: $(wildcard src/scss/*.scss)
npx node-sass src/scss/main.scss dist/css/hd-app.css --source-map true || touch dist/css/hd-app.css
index.html: config.pug index.pug $(wildcard src/pug/*.pug)
npx pug --pretty index.pug || touch index.html
build: index.html dist/css/hd-app.css
prod:
npx pug index.pug
npx node-sass src/scss/main.scss dist/css/hd-app.css --output-style compressed
watch:
@echo 'watching for change'
@echo 'press ctrl+C to stop'
@while true; do \
$(MAKE) build --silent; \
sleep 0.5; \
done
serve: dist/css/hd-app.css
php -S 127.0.0.1:8080 router.php
dev-mt: watch serve
dev:
@$(MAKE) dev-mt -j --no-print-directory
.PHONY: default install build build-prod watch serve

View File

@ -1,24 +0,0 @@
# HD app
HD app is the magic tool that allows the Happy Dev network to thrive in a decentralized way.
## Install
clone then:
* `make install`
## Build
Compile html & css:
* `make build`
or compile html & css on change:
* `make watch`
## Run server
require PHP
* `make serve`

View File

@ -1,4 +0,0 @@
- var dn = process.env.DN || 'http://127.0.0.1:8080'
- var sdn = process.env.SDN || 'http://127.0.0.1:8000'
- var cdn = process.env.CDN || 'http://127.0.0.1:8080'
- var v = Date.now()

0
dist/css/.gitkeep vendored
View File

1
dist/lib/sib-chat vendored

@ -1 +0,0 @@
Subproject commit 24192a89c1bc19f7faa06546ba1b798ad717e04b

1
dist/lib/sib-core vendored

@ -1 +0,0 @@
Subproject commit e493387102088c9d7c4cd03ce5d4edbc3a26cdcc

View File

@ -1,8 +0,0 @@
{
"authority": "http://localhost:8000/openid/",
"client_id": "598550",
"redirect_uri": "http://oidc-client.local/user-manager-sample.html",
"response_type": "id_token token",
"scope": "openid profile email",
"loadUserInfo": true
}

View File

@ -1,61 +0,0 @@
if (typeof Oidc == "undefined") {
throw new Error("You are missing the `oidc-client-js` lib");
}
// Var declarations
var sib = {};
sib.oidc = {};
// Setup User Manager
sib.oidc._setup = function(settings) {
if (typeof sib.oidc._manager == "undefined") {
sib.oidc._manager = new Oidc.UserManager(settings);
}
}
// Retrieve User from sessionStorage, or fetch it
sib.oidc._getUser = function() {
sib.oidc._manager.getUser()
.then(function(user) {
if (user == null) {
sib.oidc._manager.signinRedirectCallback()
.then()
.catch(function(error) {
sib.oidc._manager.signinRedirect({state: "dummy data"})
.then()
.catch(function(error) {
console.log(error);
});
});
}
else {
sib.oidc.user = user;
}
})
.catch(function(error) {
console.log(error);
});
}
// Connect to OIDC provider
sib.oidc._connect = function(settings) {
sib.oidc._setup(settings);
sib.oidc._getUser();
// When user loaded...
sib.oidc._manager.events.addUserLoaded(function(user) {
sib.oidc._getUser();
});
}
// Entry point
fetch("./oidc-client-config.json")
.then(response => response.json())
.then(settings => sib.oidc._connect(settings));

1
dist/lib/sib-router vendored

@ -1 +0,0 @@
Subproject commit 04ea601abf2fe9d65603867450cb39106f5d06e8

@ -1 +0,0 @@
Subproject commit bdd5203993f19ca08568638afd96f8f9c3959ea1

View File

@ -1,2 +0,0 @@
include config.pug
include src/pug/html.pug

View File

@ -1,10 +0,0 @@
{
"authority": "https://test-paris.happy-dev.fr/openid/",
"client_id": "125356",
"redirect_uri": "http://127.0.0.1:8080",
"response_type": "id_token token",
"scope": "openid profile email",
"automaticSilentRenew": true,
"silent_redirect_uri": "http://127.0.0.1:8080",
"loadUserInfo": true
}

2030
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,18 +0,0 @@
{
"name": "hd-app",
"version": "0.1.0",
"engines": {
"node": ">= 0.10.0"
},
"devDependencies": {
"node-sass": "^4.9.3",
"pug-cli": "^1.0.0-alpha6"
},
"dependencies": {
"bootstrap": "^4.0.0",
"cropper": "^4.0.0",
"font-awesome": "^4.7.0",
"jquery": "^3.3.1",
"normalize.css": "^8.0.0"
}
}

View File

@ -1,18 +0,0 @@
#!/bin/bash
export DN="https://staging-app.happy-dev.fr"
export SDN="https://test-paris.happy-dev.fr"
export CDN="https://staging-app.happy-dev.fr/dist/lib"
make -B build
# ssh staging-app@ssh-staging-app.happy-dev.fr "rm -R staging-app.happy-dev.fr"
ssh staging-app@ssh-staging-app.happy-dev.fr "mkdir -p staging-app.happy-dev.fr/src/fonts; cd staging-app.happy-dev.fr; mkdir -p dist/css;"
echo sync...
rsync -u index.html staging-app@ssh-staging-app.happy-dev.fr:~/staging-app.happy-dev.fr/
rsync -u .htaccess staging-app@ssh-staging-app.happy-dev.fr:~/staging-app.happy-dev.fr/
rsync -u oidc-client-preprod-config.json staging-app@ssh-staging-app.happy-dev.fr:~/staging-app.happy-dev.fr/oidc-client-config.json
rsync -r dist/* staging-app@ssh-staging-app.happy-dev.fr:~/staging-app.happy-dev.fr/dist/
rsync -r src/fonts/* staging-app@ssh-staging-app.happy-dev.fr:~/staging-app.happy-dev.fr/src/fonts/
rsync -r src/js/* staging-app@ssh-staging-app.happy-dev.fr:~/staging-app.happy-dev.fr/src/js/
echo ...done

10
prod.sh
View File

@ -1,10 +0,0 @@
#!/bin/bash
export DN="https://app.happy-dev.fr"
export SDN="https://hd-ldp.happy-dev.fr"
make prod
ssh hd-app@ssh-hd-app.alwaysdata.net "rm -R hd-app; mkdir hd-app; cd hd-app; mkdir -p src/fonts; mkdir -p dist/css;"
scp index.html hd-app@ssh-hd-app.alwaysdata.net:~/hd-app/
scp .htaccess hd-app@ssh-hd-app.alwaysdata.net:~/hd-app/
scp -r dist/css/ hd-app@ssh-hd-app.alwaysdata.net:~/hd-app/dist/
scp -r src/fonts/ hd-app@ssh-hd-app.alwaysdata.net:~/hd-app/src/
scp -r src/js/ hd-app@ssh-hd-app.alwaysdata.net:~/hd-app/src/

View File

@ -1,11 +0,0 @@
<?php
if (PHP_SAPI == 'cli-server') {
$url = parse_url($_SERVER['REQUEST_URI']);
$path = $url['path'];
if(strpos($path, '.') !== false) return false;
$file = __DIR__ . $path;
if (is_file($file)) return false;
}
include "index.html";

Binary file not shown.

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

Binary file not shown.

View File

@ -1,61 +0,0 @@
document.addEventListener("DOMContentLoaded", function(event) {
// Constants declaration
const navBar = document.querySelector("#navbar");
const searchBar = document.querySelector("#search-bar");
const searchView = document.querySelector("#search-view");
const searchInput = searchBar.querySelector("#search-input");
const btnToggle = document.querySelector(".btn-toggle");
// Shortcuts
window.addEventListener("keydown", function(e) {
// CTRL + K triggers the search feature
if ((e.keyCode == 75 || e.keyCode == 80) && (e.ctrlKey === true || e.metaKey === true)) {
e.preventDefault();
e.stopPropagation();
openSearchBar();
}
// Escape key
else if (e.keyCode == 27 && navBar.classList.contains("search-mode")) {
closeSearchBar();
}
});
searchBar.querySelector("#close-search-icon").addEventListener("click", emptySearchBar);
function openSearchBar(e) {
navBar.classList.add("search-mode");
searchBar.querySelector("#search-input").focus();
searchView.classList.add("search-mode");
}
function closeSearchBar(e) {
navBar.classList.remove("search-mode");
searchView.classList.remove("search-mode");
}
function emptySearchBar(e) {
searchInput.value = '';
openSearchBar();
searchInput.focus;
}
// Synchronizes the search input with the <ldp-form>s
searchInput.addEventListener("keyup", (e) => {
searchView.querySelectorAll("ldp-form input[type=text]").forEach((el) => {
el.value = searchInput.value;
});
});
btnToggle.addEventListener('click', e => {
navBar.classList.toggle('open');
e.stopPropagation();
});
window.addEventListener('click', e=>{
navBar.classList.remove('open');
});
});

View File

@ -1,6 +0,0 @@
#calendar(style='display: none')
h1.page-title Agenda
ldp-calendar(
data-src='http://lucky.alwaysdata.net/api/events/',
style='display: block; height: 300px; width: 500px;'
)

View File

@ -1 +0,0 @@
#channel-chat.chat-view(style='display: none', bind-resources='')

View File

@ -1,7 +0,0 @@
#channel-create(style='display: none')
sib-form(
data-src=`${sdn}/channels/`,
range-owner=`${sdn}/members/`,
widget-members='sib-form-multiple-dropdown',
range-members=`${sdn}/members/`
)

View File

@ -1,7 +0,0 @@
#channel-edit(style='display: none')
sib-form(
range-owner=`${sdn}/members/`,
widget-members='sib-form-multiple-dropdown',
range-members=`${sdn}/members/`,
bind-resources=''
)

View File

@ -1,36 +0,0 @@
script.
document.addEventListener("WebComponentsReady", function(event) {
class HDAppMember extends SIBWidget {
get template() {
return `
<div name="${this.name}">
<img src="${this.value.avatar}"/>
</div>
`;
}
render() {
store.get(this.value).then( (value) => {
this._value = value;
this.innerHTML = this.template;
});
}
}
customElements.define("hdapp-member", HDAppMember);
});
#channel-profile(style='display: none')
sib-display(
data-fields='name, description, owner',
widget-owner='hdapp-member',
bind-resources=''
)
h2.section.skills Participants
sib-display(
id-suffix='members',
data-fields='avatar, user',
widget-avatar='sib-display-img',
widget-user='hdapp-userinfo',
bind-resources=''
)

View File

@ -1,15 +0,0 @@
#channel(style='display: none')
sib-router#channel-router(default-route='channel-profile')
sib-route(name='channel-chat')
button Chat
sib-route(name='channel-profile')
button Info
sib-route(name='channel-edit')
button Éditer
sib-route(name='channel-create')
button Nouveau
#network-views-container
include channel-chat.pug
include channel-profile.pug
include channel-edit.pug
include channel-create.pug

View File

@ -1,7 +0,0 @@
#channels(style='display: none')
sib-display#channels-list(
data-src=`${sdn}/channels/`,
data-fields='name, description',
search-fields='name, description',
next='channel'
)

View File

@ -1,5 +0,0 @@
#client-create(style='display: none')
sib-form(
data-src=`${sdn}/clients/`,
data-fields='name, address, logo'
)

View File

@ -1,24 +0,0 @@
#dashboard(style='display: none')
//- form
.form-group
input#search-input.form-control.form-control-sm(
placeholder='Recherche',
aria-describedby='search-help',
autofocus='',
type='text'
)
small#search-help.form-text.text-muted * parmi les membres, les projets et les groupes de discussion
.list-condensed
ldp-display#to-user-profile(
data-src=`${sdn}/members/1/`,
set-name='firstname, name-separator, lastname',
value-name-separator=' ',
data-fields='avatar, name',
widget-avatar='ldp-display-img'
)
script.
document.querySelector("#to-user-profile").addEventListener("click", () => {
document.getElementById("navbar-router").navigate("member");
document.getElementById("member-page-router").navigate("member-detail");
});

View File

@ -1,17 +0,0 @@
// Stylesheets
//- link(rel='stylesheet', href=`${dn}/node_modules/bootstrap/dist/css/bootstrap.min.css`)
//- link(rel='stylesheet', href=`${dn}/node_modules/cropper/dist/cropper.min.css`)
link(rel='stylesheet', href=`${dn}/node_modules/font-awesome/css/font-awesome.min.css`)
link(rel='stylesheet', href=`${dn}/node_modules/normalize.css/normalize.css?v=${v}`)
link(rel='stylesheet', href=`${dn}/dist/css/hd-app.css?v=${v}`)
// Javascript
script(src=`${dn}/node_modules/jquery/dist/jquery.min.js`)
//- script(src=`${dn}/node_modules/bootstrap/dist/js/bootstrap.min.js`)
script(src=`${dn}/node_modules/cropper/dist/cropper.min.js`)
script(src=`${dn}/dist/lib/webcomponentsjs/webcomponents-loader.js`)
script(src=`${dn}/src/js/hd-app.js?v=${v}`)
//- script(src=`${dn}/dist/lib/sib-chat/3rdparty/sib-oidc-client.js?v=${v}`)
// Web components
link(rel='import', href=`${dn}/dist/lib/sib-core/sib-display.html?v=${v}`)
link(rel='import', href=`${dn}/dist/lib/sib-router/sib-router.html?v=${v}`)
//- link(rel='import', href=`${dn}/dist/lib/sib-chat/sib-chat.html`)

View File

@ -1,34 +0,0 @@
// Stylesheets
//-link(rel='stylesheet', href='https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css', integrity='sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4', crossorigin='anonymous')
link(href='https://cdn.bootcss.com/cropper/4.0.0/cropper.min.css', rel='stylesheet')
link(rel='stylesheet', href='https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css')
link(rel='stylesheet', href=`${dn}/dist/css/hd-app.css?v=${v}`)
// Javascript
script(
src='https://code.jquery.com/jquery-3.3.1.slim.min.js',
integrity='sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo',
crossorigin='anonymous')
script(
src='https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js',
integrity='sha384-cs/chFZiN24E4KMATLdqdvsezGxaGsi4hLGOzlXwp5UZB1LY//20VyM2taTB4QvJ',
crossorigin='anonymous')
script(
src='https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js',
integrity='sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm',
crossorigin='anonymous')
script(
src='https://cdn.bootcss.com/cropper/4.0.0/cropper.min.js')
script(
src='https://cdnjs.cloudflare.com/ajax/libs/webcomponentsjs/1.2.0/webcomponents-loader.js',
integrity='sha256-fUVqCtpScUF69qkFkeuHmcShr2N2UleRQJhRG4etHds=',
crossorigin='anonymous')
script(
src=`${dn}/src/js/hd-app.js?v=${v}`)
script(
src=`${cdn}/sib-chat/3rdparty/sib-oidc-client.js?v=${v}`)
// Web components
link(rel='import', href=`${cdn}/sib-core/sib-display.html?v=${v}`)
link(rel='import', href=`${cdn}/sib-router/sib-router.html?v=${v}`)
link(rel='import', href=`${cdn}/sib-chat/sib-chat.html`)

View File

@ -1,2 +0,0 @@
#drive(style='display: none')
h1.page-title Drive

View File

@ -1,8 +0,0 @@
header#header
div#logo
| Happy Dev
#search-bar
input#search-input(placeholder='ctrl + k', type='search')
i#search-icon.fa.fa-search(aria-hidden='true')
i#close-search-icon.fa.fa-times(aria-hidden='true')

View File

@ -1,51 +0,0 @@
doctype html
html(lang='fr')
head
meta(charset='UTF-8')
meta(name='viewport', content='width=device-width, initial-scale=1.0')
meta(http-equiv='X-UA-Compatible', content='ie=edge')
title Happy Dev App
//- Prod/Dev setup
if (['https://app.happy-dev.fr', 'https://staging-app.happy-dev.fr'].includes(dn))
include dependencies-prod.pug
else
include dependencies-dev.pug
body
include header.pug
div#subContainer
include menu.pug
main#mainContainer
//- include dashboard.pug
include members.pug
include member.pug
include job-offers.pug
//- include projects.pug
include project.pug
//- include client-creation.pug
//- include channels.pug
include channel.pug
//- include search.pug
sib-chat#chat-singleton(data-authentication='login', data-auto-login='true', data-bosh-service-url='https://jabber.happy-dev.fr/http-bind/', data-debug='false', data-locales-url='en', bind-resources='')
script.
// Move the chat singleton to the right view on "page load"
window.onload = function() {
if (window.location.pathname.indexOf("-chat") !== -1) {
var chatSingleton = document.querySelector("#chat-singleton");
var pathnameParts = window.location.pathname.split("/");
var viewName = pathnameParts[pathnameParts.length - 1];
var view = document.getElementById(viewName);
console.log({chatSingleton,pathnameParts,viewName,view});
view.appendChild(chatSingleton);
chatSingleton.dataset.src = view.dataset.src;
}
}
// Move the chat singleton to the right view on "navigate"
window.addEventListener('navigate', event => {
var chatSingleton = document.querySelector("#chat-singleton");
var view = document.getElementById(event.detail.route);
view.querySelector(".chat-view").appendChild(chatSingleton);
chatSingleton.dataset.src = view.dataset.src;
});

View File

@ -1,40 +0,0 @@
script.
document.addEventListener('WebComponentsReady', function(event) {
class HDAppAuthor extends SIBDisplayLookupList {
get parentElement() {
return 'div';
}
getTemplate(value, index) {
var firstname, lastname;
if (typeof value == 'object')
if (Object.keys(value).length > 1) {
firstname = value.user.first_name;
lastname = value.user.last_name;
} else {
store.get(value).then(resource => {
this.value.push(resource);
this.render();
});
if (Array.isArray(this.value))
this.value.splice(this.value.indexOf(value), 1);
else this.value = [];
return '';
}
return `${firstname} ${lastname}`;
}
}
customElements.define('hdapp-author', HDAppAuthor);
});
#job-offers(style='display: none')
div
h1 Job offers
sib-display#offers-list(
data-src=`${sdn}/job-offers/`,
data-fields='author, title, description, skills',
set-searchset='title, description',
widget-skills='sib-display-lookuplist',
widget-author='hdapp-author',
search-fields='searchset'
)

View File

@ -1 +0,0 @@
#member-chat.chat-view(style='display: none', bind-resources='')

View File

@ -1,97 +0,0 @@
// script.
class LDPFormImgUpload extends SIBWidget {
get template() {
return `<label for="${this.name}"><img id="${this.name}-preview" src="${this.value}"/></label>
<input id="${this.name}" type="file" name="${this.name}" value="${this.value}" />`;
}
render() {
store.get(this.value).then( (value) => {
this._value = value;
this.innerHTML = this.template;
});
}
}
customElements.define("ldp-form-img-upload", LDPFormImgUpload);
widget-avatar="ldp-form-img-upload"
#member-edit(style='display: none')
label.d-none(for='avatar-input')
img#avatar-preview(src='', style='width: 100%;')
input#avatar-input.d-none(accept='image/*', name='avatar', value='', type='file')
sib-form.edit-form(
data-fields='user, avatar, bio, cell, jabberID, number, pseudo, skills, website',
widget-user='hdapp-usereditinfo',
range-cell=`${sdn}/cells/`, widget-skills='sib-form-multiple-dropdown',
range-skills=`${sdn}/skills/`,
bind-resources=''
)
#crop-modal
.crop-wrapper
img#crop-preview(src='')
.control-bar
button#cancel-img-cropping.btn.btn-link Annuler
i#rotate-img.fa.fa-undo(aria-hidden='true')
button#crop-img.btn.btn-link Valider
script.
// Constant declaration
const avatarPreview = document.querySelector("#avatar-preview");
const avatarInput = document.querySelector("#avatar-input");
const cropModal = document.querySelector("#crop-modal");
const cropPreview = cropModal.querySelector("#crop-preview");
const $cropPreview = $(cropPreview);
// Triggers cropping on image upload
avatarInput.addEventListener("change", function(e) {
var img = avatarInput.files[0];
var reader = new FileReader();
reader.onloadend = function () {
cropPreview.src = reader.result;
cropModal.classList.add("cropping-mode");
}
if (img) {
reader.readAsDataURL(img);//reads the data as a URL
}
});
cropPreview.addEventListener("load", () => {
$cropPreview.cropper({
aspectRatio: 1/1,
viewMode: 3,
zoomable: false,
});
});
// Rotate image
cropModal.querySelector("#rotate-img").addEventListener("click", () => {
$cropPreview.cropper("rotate", -90);
});
// Cancel cropping
cropModal.querySelector("#cancel-img-cropping").addEventListener("click", () => {
closeCropping();
});
// Shortcut
document.querySelector("body").addEventListener("keydown", function(e) {
// Escape key
if (e.keyCode == 27 && cropModal.classList.contains("cropping-mode")) {
closeCropping();
}
});
function closeCropping() {
cropModal.classList.remove("cropping-mode");
avatarInput.value = null;
}
// Validating cropping
cropModal.querySelector("#crop-img").addEventListener("click", () => {
avatarPreview.src = $cropPreview.cropper("getCroppedCanvas").toDataURL()
closeCropping();
});

View File

@ -1,13 +0,0 @@
#member-profile(style='display: none')
sib-display#member-info(
data-fields='header, cell, number, roles, website, skills',
set-header='avatar, user, pseudonym, bio'
set-pseudonym='before-pseudo, pseudo'
widget-avatar='sib-display-img',
widget-user='hdapp-userinfo',
widget-cell='hdapp-usercell',
widget-number='sib-display-tel',
widget-roles='sib-display-lookuplist',
widget-skills='sib-display-lookuplist',
bind-resources=''
)

View File

@ -1,12 +0,0 @@
#member(style='display: none')
sib-router#member-router(default-route='member-profile')
sib-route(name='member-chat')
div Chat
sib-route(name='member-profile')
div Voir
sib-route(name='member-edit')
div Éditer
#member-views-container
include member-chat.pug
include member-profile.pug
include member-edit.pug

View File

@ -1,73 +0,0 @@
script.
document.addEventListener("WebComponentsReady", function(event) {
class HDAppUserInfo extends SIBDisplayLookupList {
get parentElement() {return "div"}
getTemplate(value, index) {
var firstname, lastname, email;
if(typeof value == "object")
if(Object.keys(value).length > 1) {
firstname = value.first_name;
lastname = value.last_name;
email = value.email;
}
else {
store.get(value).then(resource => {
this.value.push(resource);
this.render();
});
if(Array.isArray(this.value))this.value.splice(this.value.indexOf(value), 1);
else this.value = [];
return '';
}
return `<div id="${firstname}-${lastname}">${firstname} ${lastname}</div>`;
// + `<div id="${email}">${email}</div>`;
}
}
customElements.define('hdapp-userinfo', HDAppUserInfo);
class HDAppCell extends SIBDisplayLookupList {
get parentElement() {return "div"}
getTemplate(value, index) {
var city, country;
if(typeof value == "object")
if(Object.keys(value).length > 1) {
city = value.city;
country = value.country;
}
else {
store.get(value).then(resource => {
this.value.push(resource);
this.render();
});
if(Array.isArray(this.value))this.value.splice(this.value.indexOf(value), 1);
else this.value = [];
return '';
}
return `<span id="${city}-${country}">${city} ${country}</span>`;
}
}
customElements.define("hdapp-usercell", HDAppCell);
});
#members.view(style='display: none')
div
h1 Members
sib-display#profiles-list(
data-src=`${sdn}/members/`,
data-fields='header, cell, skills',
set-header='avatar, user, pseudonym, bio'
set-pseudonym='before-pseudo, pseudo'
value-before-pseudo='@',
widget-avatar='sib-display-img',
widget-user='hdapp-userinfo',
widget-cell='hdapp-usercell',
widget-skills='sib-display-lookuplist',
set-searchset='user.first_name, user.last_name',
search-fields='searchset',
next='member'
)

View File

@ -1,39 +0,0 @@
.btn-toggle
i.fa.fa-bars
div
nav#navbar
sib-router#navbar-router(default-route='members')
div(hidden)
sib-route(name='member', id-prefix=`${sdn}/members/`)
sib-route(name='project', id-prefix=`${sdn}/projects/`)
sib-route(name='channel', id-prefix=`${sdn}/channels/`)
div#menu-items
sib-route(name='members')
div
i.fa.fa-users
| Membres
sib-route(name='job-offers')
div
i.fa.fa-handshake-o
| Job offers
div
div
i.fa.fa-tasks
| Projets
sib-display(
data-src=`${sdn}/projects/`,
data-fields='name',
next='project'
)
div
div
i.fa.fa-tasks
| Channels
sib-display(
data-src=`${sdn}/channels/`,
data-fields='name',
next='channel'
)
//- sib-route(name='client-create')
i.fa.fa-plus(aria-hidden='true')
| New client

View File

@ -1 +0,0 @@
#project-chat.chat-view(style='display: none', bind-resources='')

View File

@ -1,7 +0,0 @@
#project-create(style='display: none')
sib-form(
data-src=`${sdn}/projects/`,
range-client=`${sdn}/clients/`,
widget-team='sib-form-multiple-dropdown',
range-team=`${sdn}/members/`
)

View File

@ -1,7 +0,0 @@
#project-edit(style='display: none')
sib-form(
range-client=`${sdn}/clients/`,
widget-team='sib-form-multiple-dropdown',
range-team=`${sdn}/members/`,
bind-resources=''
)

View File

@ -1,16 +0,0 @@
#project-profile(style='display: none')
sib-display(
data-fields='title, description, client',
set-title='number, name'
widget-client='hdapp-client',
bind-resources=''
)
h3 Team
sib-display.members-list-condensed(
id-suffix='team',
data-fields='avatar, user',
widget-avatar='sib-display-img',
widget-user='hdapp-userinfo',
next='member',
bind-resources=''
)

View File

@ -1,15 +0,0 @@
#project(style='display: none')
sib-router#project-router(default-route='project-profile')
sib-route(name='project-chat')
div Chat
sib-route(name='project-profile')
div Voir
sib-route(name='project-edit')
div Éditer
sib-route(name='project-create')
div Nouveau
#project-views-container
include project-chat.pug
include project-profile.pug
include project-edit.pug
include project-create.pug

View File

@ -1,27 +0,0 @@
script.
document.addEventListener("WebComponentsReady", function(event) {
class HDAppClient extends SIBWidget {
get template() {
return `<img name="${this.name}" src="${this.value.logo}"/>`;
}
render() {
store.get(this.value).then( (value) => {
this._value = value;
this.innerHTML = this.template;
});
}
}
customElements.define("hdapp-client", HDAppClient);
});
#projects(style='display: none')
h1 Projects
sib-display(
data-src=`${sdn}/projects/`,
data-fields='number, client, name',
widget-client='hdapp-client',
search-fields='number, name',
next='project'
)

View File

@ -1,26 +0,0 @@
#search-view
.content.container-fluid
ldp-display#search-results-members.list-condensed(
data-src=`${sdn}/members/`,
set-name='firstname, name-separator, lastname',
value-name-separator=' ',
data-fields='avatar, name',
widget-avatar='ldp-display-img',
search-fields='firstname, lastname',
next='member'
)
ldp-display#search-results-projects.list-condensed(
data-src=`${sdn}/projects/`,
set-title='number, after-num-separator, name',
value-after-num-separator=' - ',
data-fields='client, title',
widget-client='ldp-display-client',
search-fields='number, name',
next='project'
)
ldp-display#search-results-channels(
data-src=`${sdn}/channels/`,
data-fields='name',
search-fields='name',
next='channel'
)

View File

@ -1,62 +0,0 @@
#channel {
#channel-detail {
#channel-info {
display: block;
padding-top: 10px;
div[name="name"] {
font-weight: bold;
}
}
ldp-display-member {
img {
width: 50px;
border-radius: 100px;
}
span {
padding-left: 5px;
}
}
#chat-members {
ldp-display {
display: flex;
align-items: center;
margin-bottom: 10px;
img {
width: 50px;
border-radius: 100px;
}
div[name="name"] {
display: flex;
margin-left: 10px;
}
}
}
}
div[name="admin"],
.section {
@extend %detail-section;
margin-top: 40px;
}
}
@media (min-width: $sm-with) {
#channel {
#channel-detail {
#channel-info {
ldp-display-client {
display: block;
float: right;
width: 300px;
}
}
}
}
}

View File

@ -1,24 +0,0 @@
#channels {
#channels-list {
display: flex;
flex-direction: column;
ldp-display {
@extend %td;
cursor: pointer;
display: flex;
align-items: center;
height: 65px;
&:hover {
background-color: $hd-color-faded;
color: white;
}
ldp-display-div[name="name"] {
width: 130px;
}
}
}
}

View File

@ -1,17 +0,0 @@
sib-chat {
//position: absolute;
border: 5px dotted red;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: auto;
display: none;
min-height: 300px;
}
.chat-view {
sib-chat {
display: block;
}
}

View File

@ -1,18 +0,0 @@
.list-condensed {
ldp-display {
display: flex;
align-items: center;
margin-bottom: 10px;
img {
width: 50px;
border-radius: 100px;
}
& > div[name="name"],
& > div[name="title"] {
display: flex;
margin-left: 10px;
}
}
}

View File

@ -1,5 +0,0 @@
#dashboard {
#to-user-profile {
cursor: pointer;
}
}

View File

@ -1,39 +0,0 @@
#crop-modal {
position: absolute;
z-index: 1111;
top: $menu-height;
bottom: 0px;
left: 0px;
right: 0px;
background-color: black;
display: none;
&.cropping-mode {
display: block;
}
.crop-wrapper {
img {
width: 100%;
}
}
.control-bar {
display: flex;
justify-content: space-between;
color: white;
font-size: 30px;
button {
text-transform: uppercase;
color: white;
font-size: 18px;
font-weight: bold;
}
i {
padding-top: 4px;
}
}
}

View File

@ -1,8 +0,0 @@
@font-face {
font-family: 'bebas';
src: url('../../src/fonts/bebas/bebas.eot'); /* IE9 Compat Modes */
src: url('../../src/fonts/bebas/bebas.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('../../src/fonts/bebas/bebas.woff') format('woff'), /* Pretty Modern Browsers */
url('../../src/fonts/bebas/bebas.ttf') format('truetype'), /* Safari, Android, iOS */
url('../../src/fonts/bebas/bebas.svg#svgFontName') format('svg'); /* Legacy iOS */
}

View File

@ -1,102 +0,0 @@
ldp-display {
ldp-form {
display: block;
background-color: #F3F3F3;
padding: 15px;
box-sizing: content-box;
form {
@extend %self-clear;
ldp-form-text {
position: relative;
display: block;
margin-bottom: 1rem;
&::before {
position: absolute;
top: 3px;
bottom: 0px;
left: 10px;
margin: auto;
font-family: FontAwesome;
content: "\f002";
color: gray;
}
label {
text-transform: capitalize;
display: none;
}
input[type="text"] {
@extend %form-control;
@extend %form-control-sm;
padding-left: 30px;
}
}
input[type="submit"],
input[type="reset"] {
@extend %btn;
float: right;
}
input[type="submit"] {
@extend %btn-primary;
}
input[type="reset"] {
@extend %btn-link;
}
}
}
}
ldp-form.edit-form {
ldp-form-text {
@extend %form-group;
label {
text-transform: capitalize;
}
input {
@extend %form-control;
@extend %form-control-sm;
}
}
input[type="submit"] {
@extend %btn;
@extend %btn-primary;
}
}
sib-form {
sib-form-text {
label {
text-transform: capitalize;
}
input {
margin-right: .5em;
padding: .375em .75em;
font-size: 1rem;
line-height: 1.5;
color: #495057;
background-color: #fff;
border: 1px solid #ced4da;
border-radius: .25rem;
vertical-align: top;
}
}
input[type="submit"], input[type="reset"] {
@extend %btn;
@extend %btn-primary;
margin-right: .5em;
}
}

View File

@ -1,10 +0,0 @@
#header{
background-color: $col-alt-bg;
color: $col-alt-fg;
display: flex;
padding: 1em;
}
#logo{
flex: 1 1 0px;
}

View File

@ -1,14 +0,0 @@
#offers-list {
> div {
> sib-display {
display: block;
margin: 1em 0;
box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2);
background-color: #efefef;
padding: 0.5em 1em;
&:nth-child(odd) {
background-color: #e0e0e0;
}
}
}
}

View File

@ -1,123 +0,0 @@
%detail-section {
font-weight: bold;
font-size: 18px;
}
#member-chat {
#conversejs {
margin: none;
}
}
#profiles-list,
#member-info {
img {
display: block;
}
&,
img {
width: 100%;
}
div[name='name'] {
@extend %detail-section;
padding-top: 10px;
}
div[name='name'],
div[name='location'] {
display: flex;
}
}
#member-detail {
#member-info {
sib-display-mailto,
sib-display-tel {
display: block;
}
a[name='email'],
a[name='number'] {
&::before {
font-family: FontAwesome;
padding-right: 4px;
color: black;
}
}
a[name='email'] {
&::before {
content: '\f0e0';
}
}
a[name='number'] {
&::before {
content: '\f10b';
font-size: 22px;
padding-left: 3px;
padding-right: 7px;
}
}
}
.section {
position: relative;
h2 {
@extend %detail-section;
margin-top: 40px;
}
}
#member-skills {
display: flex;
flex-wrap: wrap;
sib-display {
display: block;
background-color: $hd-color;
color: white;
border-radius: 100px;
padding: 3px 10px;
margin-bottom: 5px;
margin-right: 5px;
}
}
}
@media (min-width: $sm-with) {
#member-detail {
#member-info {
sib-display-img {
display: block;
float: right;
width: 300px;
}
}
}
}
#member-info {
@extend %member;
}
.members-list-condensed{
display: block;
img{
width: 50px;
height: 50px;
border-radius: 100%;
object-fit: cover;
object-position: top;
}
label{
display: none;
}
>div>sib-display>div{
display: flex;
}
ul{
padding-left: 1em;
}
}

View File

@ -1,127 +0,0 @@
%member {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
grid-gap: 1em;
label {
display: none;
}
> sib-display {
display: block;
position: relative;
box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2);
padding: 0.5em;
cursor: pointer;
&::before,
&::after {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
transform: scale3d(0, 0, 1);
transition: transform 0.3s ease-out 0s;
background: #eac1;
content: '';
pointer-events: none;
}
&::before {
transform-origin: left top;
}
&::after {
transform-origin: right bottom;
background: #ace1;
}
&:hover,
&:focus {
&::before,
&::after {
transform: scale3d(1, 1, 1);
}
}
}
}
#profiles-list {
display: block;
sib-form {
display: block;
margin: 3em 0;
input[type='reset'] {
display: none;
}
}
div[name='header'] {
border-top: 2em solid $col-alt-bg;
border-bottom: 1px solid $col-alt-bg;
padding-bottom: 1em;
margin-bottom: 1em;
text-align: center;
}
> div {
@extend %member;
}
sib-display-img {
display: block;
position: relative;
width: 80%;
height: 0;
padding-bottom: 80%;
margin: 10%;
img {
display: block;
position: absolute;
width: 100%;
height: 100%;
border-radius: 100%;
object-fit: cover;
object-position: center;
}
}
hdapp-userinfo {
display: block;
color: $pal-black;
font-size: 1.1em;
margin: 0.5em;
ul,
li {
display: block;
margin: 0;
padding: 0;
list-style: none;
}
}
div[name='pseudonym'] {
font-size: 0.8em;
div {
display: inline;
}
}
}
sib-display-lookuplist[name='skills'] {
ul,
li {
display: block;
margin: 0;
padding: 0;
list-style: none;
}
ul {
display: flex;
flex-wrap: wrap;
margin: 0 -0.25em;
}
li {
padding: 0.5em 1em;
border: 1px solid;
border-radius: 0.25em;
margin: 0.25em;
}
}

View File

@ -1,127 +0,0 @@
// #navbar{}
// #navbar-router{}
.btn-toggle {
display: none;
position: absolute;
top: 0;
left: 0;
background-color: $col-alt-bg;
color: $col-alt-fg;
font-size: 1.5em;
padding: 0.5em;
cursor: pointer;
}
#navbar {
background-color: $col-dark-bg;
color: $col-dark-fg;
max-width: 16rem;
position: sticky;
top: 0;
height: 100%;
max-height: 100vh;
&.open {
transform: translateX(0);
}
&:after {
//Shadow
$shadow-width: 4px;
$shadow-opacity: 0.35;
content: '';
display: block;
position: absolute;
top: 0;
bottom: 0;
right: -$shadow-width;
width: $shadow-width;
background-image: linear-gradient(
to right,
rgba(0, 0, 0, $shadow-opacity),
transparent
);
}
}
@media (max-width: 32rem) {
.btn-toggle {
display: block;
}
#navbar {
transform: translateX(-100%);
transition: transform 0.5s ease;
position: absolute;
top: auto;
z-index: 1;
}
#header {
padding-left: 3rem;
}
}
#menu-items {
> * {
display: block;
border-bottom: 1px solid rgba(white, 0.5);
sib-route {
display: block;
cursor: pointer;
}
&[active] {
background-color: $col-highlight-bg;
color: $col-highlight-fg;
}
> div {
width: max-content;
padding: 2em;
}
&[id-prefix] {
display: none;
}
> sib-display {
display: block;
font-size: 0.9em;
color: #aaa;
> div {
margin-bottom: 1.5em;
> sib-display {
cursor: pointer;
display: block;
padding: 0.5em 2em;
}
}
}
}
}
/* sub menu (right menu) */
#mainContainer > div {
display: flex;
flex-direction: row-reverse;
align-items: flex-start;
> sib-router {
display: block;
background-color: #ccc;
sib-route {
display: block;
> div {
position: relative;
padding: 1em 2em;
border-bottom: 1px solid #888;
}
&[active] {
font-weight: bold;
> div:before {
content: '<';
position: absolute;
transform: translateX(-150%);
}
}
}
}
> div {
margin: 0.5em;
flex: 1 1 0px;
}
}

View File

@ -1,103 +0,0 @@
%title{
color: $pal-black;
}
// Bootstrap classes
%btn {
display: inline-block;
font-weight: 400;
text-align: center;
white-space: nowrap;
vertical-align: middle;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
border: 1px solid transparent;
padding: .375rem .75rem;
font-size: 1rem;
line-height: 1.5;
border-radius: 100em;
transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;
&:not(:disabled):not(.disabled) {
cursor: pointer;
}
}
%btn-primary {
color: $col-highlight-fg;
background-color: $col-highlight-bg;
border-color: $col-highlight-bg;
}
%btn-link {
font-weight: 400;
color: $col-highlight-bg;
background-color: transparent;
}
%form-group {
display: block;
margin-bottom: 1rem;
}
%form-control {
display: block;
width: 100%;
padding: .375rem .75rem;
font-size: 1rem;
line-height: 1.5;
color: #495057;
background-color: #fff;
background-clip: padding-box;
border: 1px solid #ced4da;
border-radius: .25rem;
transition: border-color .15s ease-in-out,box-shadow .15s ease-in-out;
}
%form-control-sm {
padding: .25rem .5rem;
font-size: .875rem;
line-height: 1.5;
border-radius: .2rem;
}
%td {
padding: .65rem;
vertical-align: top;
border-top: 1px solid #dee2e6;
}
// Custom mixins
%self-clear {
&::after {
content: "";
clear: both;
display: table;
}
}
@mixin list-reset($deep:0) {
padding: 0;
margin: 0;
display: block;
list-style: none;
@if ($deep == 0) {
> li {
padding: 0;
margin: 0;
display: block;
list-style: none;
}
} @else {
ul,
ol,
li {
padding: 0;
margin: 0;
display: block;
list-style: none;
}
}
}

View File

@ -1,19 +0,0 @@
#project-profile {
[name='title'] {
font-size: 1.5em;
padding: .5em 0;
margin-bottom: .5em;
border-bottom: 1px solid grey;
color: $pal-black;
sib-display-div,
div {
display: inline;
}
sib-display-div[name='number'] {
padding-right: 0.5em;
&:before {
content: '#';
}
}
}
}

View File

@ -1,36 +0,0 @@
#projects {
#projects-list {
display: flex;
flex-direction: column;
ldp-display {
@extend %td;
cursor: pointer;
display: flex;
align-items: center;
height: 65px;
&:hover {
background-color: $hd-color-faded;
color: white;
}
ldp-display-div[name="number"] {
width: 50px;
}
ldp-display-client[name="client"] {
display: block;
width: 70px;
img {
width: 50px;
}
}
ldp-display-div[name="name"] {
width: 150px;
}
}
}
}

View File

@ -1,35 +0,0 @@
#search-bar{
position: relative;
}
#search-icon{
pointer-events: none;
}
#search-icon,
#close-search-icon{
position: absolute;
right: .4em;
top: 50%;
transform: translateY(-50%);
margin: auto;
display: block;
}
#search-input {
-webkit-appearance: textfield;
border-radius: 10em;
padding: .2em .5em;
border: 1px solid $col-main-fg;
& ~ #close-search-icon{
opacity: 0;
}
&:focus{
& ~ #close-search-icon{
opacity: 1;
}
& ~ #search-icon{
visibility: hidden;
}
}
}

View File

@ -1,36 +0,0 @@
* {
box-sizing: border-box;
}
html {
font-family: Trebuchet MS, Lucida Grande, Lucida Sans Unicode, Lucida Sans,
Tahoma, sans-serif;
font-size: 16px;
background-color: $col-main-bg;
color: $col-main-fg;
}
html,
body {
margin: 0;
padding: 0;
}
html,
body {
height: 100%;
}
#subContainer {
display: flex;
min-height: 100%;
}
#mainContainer {
flex: 1 1 0px;
}
h1,h2,h3,h4,h5,h6{
color: $pal-black;
}

View File

@ -1,30 +0,0 @@
// palette
$pal-white: #e8e8e8;
$pal-black: #222;
$pal-light-grey: #ddd;
$pal-dark-grey: #4a4a4a;
$pal-yellow: #fdc815;
// color
$col-main-fg: $pal-dark-grey;
$col-main-bg: $pal-white;
$col-alt-fg: $pal-dark-grey;
$col-alt-bg: $pal-light-grey;
$col-dark-fg: $pal-white;
$col-dark-bg: $pal-dark-grey;
$col-highlight-fg: $pal-black;
$col-highlight-bg: $pal-yellow;
// other color
$hd-color: rgb(253, 200, 21);
$hd-color-faded: rgba(253, 200, 21, 0.8);
$twitter-color: grey;
$menu-height: 43px;
$menu-font-size: 16px;
$vertical-menu-width: 50px;
$sm-with: 576px;
$md-with: 768px;

View File

@ -1,23 +0,0 @@
// Generic
@import "variables";
@import "fonts";
@import "mixins";
@import "classes";
@import "styles";
@import "forms";
// Specific
@import "header";
@import "menu";
@import "dashboard";
@import "members";
@import "member";
@import "job-offers";
@import "edit-profile";
@import "projects";
@import "project";
@import "channels";
@import "channel";
@import "search";
@import "chat";

View File

@ -1,10 +0,0 @@
from django.contrib import admin
from .models import Member, Skill, Project, Client, Cell, Channel, Role
admin.site.register(Member)
admin.site.register(Skill)
admin.site.register(Project)
admin.site.register(Client)
admin.site.register(Cell)
admin.site.register(Channel)
admin.site.register(Role)

View File

@ -1,83 +0,0 @@
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
class Member(models.Model):
avatar = models.URLField(blank=True)
available = models.NullBooleanField(blank=True)
bio = models.CharField(max_length=255, blank=True, null=True)
cell = models.ForeignKey("Cell", on_delete=models.DO_NOTHING, blank=True, null=True)
jabberID = models.CharField(max_length=255, blank=True, null=True)
jabberRoom = models.NullBooleanField(blank=True)
user = models.OneToOneField(User, on_delete=models.CASCADE)
number = models.CharField(max_length=255, blank=True, null=True)
projects = models.ManyToManyField("Project", blank=True)
pseudo = models.CharField(max_length=255, blank=True, null=True)
roles = models.ManyToManyField("Role", blank=True)
skills = models.ManyToManyField("Skill", blank=True)
website = models.URLField(blank=True)
def __str__(self):
return 'Profil de {} '.format(self.user.get_full_name())
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Member.objects.create(user=instance)
else:
instance.member.save()
class Skill(models.Model):
name = models.CharField(max_length=255, default='')
def __str__(self):
return self.name
class Role(models.Model):
name = models.CharField(max_length=255, default='')
def __str__(self):
return self.name
class Project(models.Model):
name = models.CharField(max_length=255, default='')
number = models.PositiveIntegerField(default='0', blank=True)
client = models.ForeignKey("Client", on_delete=models.DO_NOTHING)
team = models.ManyToManyField("Member", blank=True)
def __str__(self):
return self.name
class Client(models.Model):
name = models.CharField(max_length=255, default='')
address = models.CharField(max_length=255, default='')
logo = models.URLField()
def __str__(self):
return self.name
class Cell(models.Model):
name = models.CharField(max_length=255, default='')
city = models.CharField(max_length=255, default='')
country = models.CharField(max_length=255, default='')
def __str__(self):
return self.name
class Channel(models.Model):
name = models.CharField(max_length=255, default='')
description = models.CharField(max_length=255, default='')
members = models.ManyToManyField("Member", blank=True)
owner = models.ForeignKey("Member", related_name="owned_chatrooms", on_delete=models.DO_NOTHING)
def __str__(self):
return self.name

View File

@ -1,40 +0,0 @@
"""hdappserver URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/1.11/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.conf.urls import url, include
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url, include
from django.contrib import admin
from django.views.generic import TemplateView
from djangoldp.views import LDPViewSet
from django.conf import settings
from .models import Member, Skill, Project, Client, Cell, Channel, Role
from .views import userinfocustom
urlpatterns = [
url(r'^$', TemplateView.as_view(template_name="index.html"), name="index"),
url(r'^accounts/', include('django.contrib.auth.urls')),
url(r'^admin/', admin.site.urls),
url(r'^channels/', LDPViewSet.urls(model=Channel, nested_field="members")),
url(r'^cells/', LDPViewSet.urls(model=Cell)),
url(r'^clients/', LDPViewSet.urls(model=Client)),
url(r'^members/', LDPViewSet.urls(model=Member, nested_field="skills")),
url(r'^projects/', LDPViewSet.urls(model=Project, nested_field="team")),
url(r'^skills/', LDPViewSet.urls(model=Skill)),
url(r'^openid/userinfo', userinfocustom),
url(r'^openid/', include('oidc_provider.urls', namespace='oidc_provider')),
url(r'^role/', LDPViewSet.urls(model=Role)),
url(r'^users/', LDPViewSet.urls(model=settings.AUTH_USER_MODEL)),
]