Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • applications/etuc/hubl
  • applications/hubl
  • decentral1se/hubl
  • rngadam/hubl
  • jvtrudel/hubl
  • 3wc/hubl
6 results
Show changes
Showing
with 187 additions and 251 deletions
/**
* Retrieves a component of a specified type from the components list.
*
* @param {string} type - The type of the component to retrieve.
* @param {boolean} [returnFirst=false] - Whether to return the first available component if multiple are found.
* @returns {Object|undefined} - The found component object, or undefined if no component is found or if there are multiple components and returnFirst is false.
*/
const getComponent = (type, returnFirst = false) => {
const availables = components.filter((c) => c.type === type || c.uniq === type);
if (availables.length > 1) {
if (returnFirst) {
return availables[0];
}
if (import.meta.env.DEV) {
console.error(`Too much components availables for type ${type}`);
}
} else if (availables.length < 1 && import.meta.env.DEV) {
console.error(`No component found for type ${type}`);
} else {
return availables[0];
}
return false;
};
export default getComponent;
/**
* Retrieves a component of a specified route from the components list.
*
* @param {string} route - The route of the component to retrieve.
* @returns {Object|undefined} - The found component object, or undefined if no component is found or if there are multiple components and returnFirst is false.
*/
const getComponentFromRoute = (route) => {
return components.find((c) => c.route === route);
};
export default getComponentFromRoute;
/**
* Retrieves the default route from the list of components.
* If a component with a default route is found, its route is returned.
* Otherwise, the default route "dashboard" is returned.
*
* @returns {string} The default route.
*/
const getDefaultRoute = () => {
const defaultComponent = components.filter(
(e) => e.defaultRoute !== undefined
);
let defaultRoute = "dashboard";
if (defaultComponent.length === 1) {
defaultRoute = defaultComponent[0].route;
}
return defaultRoute;
};
export default getDefaultRoute;
/**
* Retrieves the route for a given component type.
*
* @param {string} type - The type or unique identifier of the component.
* @param {boolean} [returnFirst=false] - If true, returns the first available route; otherwise, returns the last available route.
* @param {boolean} [ignoreError=false] - If true, suppresses error logging when no component is found.
* @returns {string|undefined} - The route of the matched component, or undefined if no component is found and ignoreError is true.
*/
const getRoute = (type, returnFirst = false, ignoreError = false) => {
const availables = components.filter((c) => c.type === type || c.uniq === type);
for (const c of components) {
if (c.extensions) {
for (const e of c.extensions) {
if (e.type === type || e.uniq === type) {
availables.push(e);
}
}
}
}
if (availables.length > 1) {
if (returnFirst) {
return availables[0].route;
}
return availables[availables.length - 1].route;
}
if (availables.length < 1) {
if (!ignoreError && import.meta.env.DEV)
console.error(`No component found for route ${type}`);
} else {
return availables[0].route;
}
return false;
};
export default getRoute;
let coreInstance = null;
/**
* Function to retrieve the singleton instance of the core version.
*
* @return {Promise} The promise that resolves to the core instance.
*/
export default async function importCore() {
if (!coreInstance) {
const coreNpm = npm.find((e) => e.package === "@startinblox/core");
const productionCore =
coreNpm.path ||
`https://cdn.jsdelivr.net/npm/@startinblox/core@${coreNpm?.version || "latest"}/dist/index.js`;
if (import.meta.env.DEV) {
try {
coreInstance = await import(
/* @vite-ignore */ "http://localhost:3000/dist/index.js"
);
} catch {
coreInstance = await import(/* @vite-ignore */ productionCore);
}
} else {
// In production, only return the skypack version
coreInstance = await import(/* @vite-ignore */ productionCore);
}
}
return coreInstance;
}
/**
* Rewrites a server URL by replacing the "server://" prefix with the actual server address from the config.
*
* @param {string|array} entry - The entry string that may contain a server URL.
* @param {Object} config - The configuration object containing the server information.
* @returns {string|array} - The rewritten entry with the server URL updated, or the original entry if not a server URL.
*/
const rewriteServer = (entry, config) => {
if (typeof entry === "string" && entry.startsWith("server://")) {
return config.client.server + entry.replace(/server:\//, "");
}
if(Array.isArray(entry)) {
const newArray = [];
for(const value of entry) {
newArray.push(rewriteServer(value, config));
}
return newArray;
}
return entry;
};
export default rewriteServer;
/**
* Truncates the text content of a DOM node and its child nodes to a specified limit.
*
* @param {Node} node - The DOM node whose text content is to be truncated.
* @param {number} limit - The maximum number of characters to retain in the text content.
* @returns {number} - The remaining number of characters that can be truncated.
*/
export default function truncate(node, limit) {
if (node.nodeType === Node.TEXT_NODE && node.textContent) {
node.textContent = node.textContent.substring(0, limit);
return limit - node.textContent.length;
}
let remaining = limit;
for (const child of [...node.childNodes]) {
remaining = truncate(child, limit);
}
return remaining;
}
import convertStringToBoolean from "@helpers/convertStringToBoolean";
import generateUniq from "@helpers/generateUniq";
import generateUrl from "@helpers/generateUrl";
import getComponent from "@helpers/getComponent";
import getComponentFromRoute from "@helpers/getComponentFromRoute";
import getDefaultRoute from "@helpers/getDefaultRoute";
import getRoute from "@helpers/getRoute";
import importCore from "@helpers/importCore";
import truncate from "@helpers/truncate";
import Swal from "sweetalert2";
export {
convertStringToBoolean,
generateUniq,
generateUrl,
getComponent,
getComponentFromRoute,
getDefaultRoute,
getRoute,
importCore,
truncate,
Swal,
};
import.meta.glob("./components/**/*.js", { eager: true });
import.meta.glob("./scripts/**/*.js", { eager: true });
document.dispatchEvent(new CustomEvent("orbit-ready"));
include config.pug
<!DOCTYPE html>
html(lang="en")
head
meta(charset="UTF-8")
title HD App
meta(name="viewport", content="width=device-width, initial-scale=1.0")
meta(http-equiv="X-UA-Compatible", content="ie=edge")
link(rel="icon" type="image/png" href="/images/logo.png")
include dependencies.pug
body
div.layer
header#header
include header.pug
#subContainer
include menu.pug
main#mainContainer
//- #dashboard(hidden)
include page-dashboard.pug
#members(hidden)
include page-members.pug
#member-chat(hidden)
include page-member-chat.pug
#member(hidden)
include page-member.pug
#job-offers(hidden)
include page-job-offers.pug
#job-offer-create(hidden)
include page-job-offer-create.pug
#projects(hidden)
include page-projects.pug
#project(hidden)
include page-project.pug
//- #client-creation(hidden)
include page-client-creation.pug
//-#groups(hidden)
include page-groups.pug
#group(hidden)
include page-group.pug
//- #search(hidden)
include page-search.pug
nav#navbar
sib-router#navbar-router(default-route='members')
sib-route.menu(name='members')
div.menu-notification
sib-display(
data-fields,
data-src=`${sdn}/members/`,
counter-template='${counter}'
)
div.menu-label Members
div.menu-icon.icon-people
sib-route.menu(hidden, name='member', id-prefix=`${sdn}/members/`)
div.divider
sib-route.menu(name='job-offers')
div.menu-notification
sib-display(
data-fields,
data-src=`${sdn}/job-offers/`,
counter-template='${counter}'
)
div.menu-label Job offers
div.menu-icon.icon-briefcase
sib-route(hidden, name='job-offer-create')
div.divider
div.menu-wrapper
div.menu
div.menu-chevron
div.menu-icon.icon-arrow-up
div.menu-label Projects
div.menu-icon.icon-folder-alt
sib-route(hidden,name='project', id-prefix=`${sdn}/projects/`)
div.sub-menu
sib-display(
data-src=`${sdn}/projects/`,
data-fields='name',
next='project'
)
div.divider
div.menu-wrapper
div.menu
div.menu-chevron
div.menu-icon.icon-arrow-up
div.menu-label Groups
div.menu-icon.icon-globe
sib-route(hidden, name='group', id-prefix=`${sdn}/channels/`)
div.sub-menu
sib-display(
data-src=`${sdn}/channels/`,
data-fields='name',
next='group'
)
div.divider
div.menu-wrapper
div.menu
div.menu-chevron
div.menu-icon.icon-arrow-up
div.menu-label Chat
div.menu-icon.icon-envelope-letter
sib-route(hidden, name='member-chat', id-prefix=`${sdn}/members/`)
div.sub-menu
sib-display(
data-src=`${sdn}/members/`,
data-fields='pseudo',
next='member-chat'
)
div.divider
.chat-view
sib-chat(
data-authentication='login',
data-auto-login='true',
data-bosh-service-url=xmpp,
data-debug='false',
data-locales-url='en',
bind-resources
)
\ No newline at end of file
#group-create
h1 New group
.form-view
sib-form.block(
data-src=`${sdn}/channels/`,
data-fields="name, description, owner, members, jabberID, jabberRoom"
range-owner=`${sdn}/members/`,
widget-members='sib-form-multiple-dropdown',
range-members=`${sdn}/members/`
)
#group-edit
h1 Edit group
.form-view
sib-form.block(
range-owner=`${sdn}/members/`,
data-fields="name, description, owner, members, jabberID, jabberRoom"
range-members=`${sdn}/members/`,
widget-members='sib-form-multiple-dropdown',
bind-resources
)
.frame
sib-display(
data-fields='name, label-description, description',
value-label-description="Description:"
bind-resources
)
h2.section.skills In group
sib-display(
id-suffix='members',
data-fields='user-thumb',
set-user-thumb='profile.picture, first_name, last_name',
widget-profile.picture='sib-display-img',
bind-resources
)
//-
sib-display#offers-list.limiter(
data-src=`${sdn}/job-offers/`,
data-fields='date, user-thumb, title, description, skills',
widget-skills='sib-display-lookuplist',
set-user-thumb='author.member.avatar, author.first_name, author.last_name'
widget-author.member.avatar='sib-display-img',
set-date='closingDate, creationDate',
widget-closingDate='hdapp-closing-date',
set-searchset='title, description, skills',
search-fields='searchset'
)
sib-display(
data-fields='title, label-description, description, client',
set-title='phone, client.name, name',
set-client='label-client, client.name, client.logo, client.address',
value-label-description="Description:"
value-label-client="Client:"
widget-client.logo='sib-display-img',
widget-client='hdapp-client',
widget-team='sib-display-lookuplist',
bind-resources,
)
h2 Team:
sib-display.members-list-condensed(
id-suffix='team',
data-fields='member.avatar, member.user',
widget-member.avatar='sib-display-img',
widget-member.user='hdapp-userinfo',
next='member',
bind-resources,
)
\ No newline at end of file
sib-router#group-router(default-route='group-chat')
sib-route(name='group-chat')
div Chat
sib-route(name='group-profile')
div Info
sib-ac-checker(permission='change' bind-resources)
sib-route(name='group-edit')
div Edit
sib-route(name='group-create')
div Add new
#network-views-container
#group-chat
include page-group-chat.pug
#group-profile
include page-group-profile.pug
#group-edit
include page-group-edit.pug
#group-create
include page-group-create.pug
#groups
sib-display#groups-list(
data-src=`${sdn}/channels/`,
data-fields='name, description',
search-fields='name, description',
next='group'
)
//#job-offer-create
div
h1 New job offer
.form-view
sib-form.block(
data-src=`${sdn}/job-offers/`,
data-fields="title, description, skills",
widget-author='sib-form-dropdown',
range-skills= `${sdn}/skills/`,
next="job-offers"
)
div.grid-layer
div.grid-layer-main.containerV
h2 New offers
span Here you can find and post offers
sib-display#offers-list(
data-src=`${sdn}/job-offers/`,
data-fields='status, user-thumb, creation, title, description, skills',
widget-skills='sib-display-lookuplist',
set-user-thumb='author.profile.picture, author.first_name, author.member.roles.ldp:contains.name',
widget-author.profile.picture='sib-display-img',
set-status='closingDate',
set-creation='creationDate',
widget-closingDate='hdapp-closing-date',
set-content='title, description',
search-fields='content,skills,open',
search-range-skills=`${sdn}/skills/`
)
div.grid-layer-links.containerV
template#groups-list-template
p ${value}
sib-link(next="job-offer-create").containerH.containerCenter.action-link
div.icon-plus
div Post a new offer
sib-link().containerH.containerCenter.how-link
div.icon-idea
div.grow How To find a new offer?
sib-link().containerH.containerCenter.how-link
div.icon-idea
div.grow How to set notification?