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

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)),
]