Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 56 additions & 16 deletions dev/user-backend-mocks/src/knowledge-base/knowledge-base.mock.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,44 +39,84 @@

module.exports.knowledgeBaseData = [
{
"title": "Première page vers enfant",
"title": "Présentation de l’université",
"id": 1,
"pageType": "content",
"content": "Fondée en 1896, l’Université Lumière accueille chaque année plus de 30 000 étudiants. Elle propose un large éventail de formations en sciences, lettres, droit, économie et gestion.",
"childDisplay": "list"
},
{
"title": "Première page vers lien interne map",
"title": "Vie étudiante et services",
"id": 7,
"pageType": "content",
"content": "Découvrez les services dédiés aux étudiants : accompagnement social, bibliothèques, vie associative, événements culturels et accès aux installations sportives du campus.",
"childDisplay": "card"
},
{
"title": "Plan du campus",
"id": 2,
"link": "map",
"pageType": "internal_link"
},
{
"title": "Première page vers lien externe jnesis.com",
"title": "Portail numérique des étudiants",
"id": 3,
"link": "https://www.jnesis.com",
"link": "https://www.esup-portail.org/wiki/spaces/ESUPMULTI/pages/1340637201/Accueil",
"pageType": "external_link"
},
{
"title": "Première enfant",
"content": "id Nunc ...",
"title": "Facultés et départements",
"content": "L’Université est composée de plusieurs facultés : Lettres et Langues, Sciences, Droit, Médecine, ainsi que de nombreux laboratoires de recherche.",
"id": 4,
"pageType": "content",
"childDisplay": "card",
"parentId": 1
"parentId": 1,
childDisplay: "card"
},
{
"title": "Page affiché au format carte",
"content": "id Nunc ...d",
"title": "Département de Lettres Modernes",
"content": "Le département propose des formations en littérature française, comparée et francophonie. Il organise régulièrement des conférences ouvertes à tous.",
"id": 5,
"pageType": "content",
"childDisplay": "card",
"parentId": 4
"parentId": 4,
"link": "https://www.esup-portail.org",
"phone": "0606060606",
"address": "45 rue du Soleil 99999 VILLE",
"email": "contact@esup.com"
},
{
"title": "Autre Page affiché au format carte",
"content": "id Nunc dzdzdzdz zdd z dzdzf fef",
"title": "Département de Physique",
"content": "Les étudiants peuvent suivre une licence, un master ou un doctorat en physique fondamentale ou appliquée, avec de nombreux partenariats industriels.",
"id": 6,
"pageType": "content",
"childDisplay": "card",
"parentId": 4
"parentId": 4,
"link": "https://www.esup-portail.org",
"phone": "0606060606",
"address": "45 rue du Soleil 99999 VILLE",
"email": "contact@esup.com"
},
{
"title": "Santé, bien-être et accompagnement",
"content": "L’université dispose d’un service de santé étudiant, d’un soutien psychologique et d’un pôle handicap. Des permanences sont assurées chaque semaine.",
"id": 8,
"pageType": "content",
"parentId": 7,
"link": "https://www.esup-portail.org",
"phone": "0606060606",
"address": "45 rue du Soleil 99999 VILLE",
"email": "contact@esup.com"
},
{
"title": "Activités sportives et culturelles",
"content": "Une trentaine d’activités sportives sont proposées via le SUAPS. Des ateliers artistiques, clubs photo et musique sont ouverts toute l’année.",
"id": 9,
"pageType": "content",
"parentId": 7
},
{
"title": "Clubs et associations étudiantes",
"content": "Plus de 80 associations sont présentes sur le campus : BDE, clubs humanitaires, écologiques, tech ou encore débats citoyens.",
"id": 10,
"pageType": "content",
"parentId": 9
}
];
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
<!--
~ Copyright ou © ou Copr. Université de Lorraine, (2022)
~
~ Direction du Numérique de l'Université de Lorraine - SIED
~ (dn-mobile-dev@univ-lorraine.fr)
~ JNESIS (contact@jnesis.com)
~
~ Ce logiciel est un programme informatique servant à rendre accessible
~ sur mobile divers services universitaires aux étudiants et aux personnels
~ de l'université.
~
~ Ce logiciel est régi par la licence CeCILL 2.1, soumise au droit français
~ et respectant les principes de diffusion des logiciels libres. Vous pouvez
~ utiliser, modifier et/ou redistribuer ce programme sous les conditions
~ de la licence CeCILL telle que diffusée par le CEA, le CNRS et INRIA
~ sur le site "http://cecill.info".
~
~ En contrepartie de l'accessibilité au code source et des droits de copie,
~ de modification et de redistribution accordés par cette licence, il n'est
~ offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
~ seule une responsabilité restreinte pèse sur l'auteur du programme, le
~ titulaire des droits patrimoniaux et les concédants successifs.
~
~ À cet égard, l'attention de l'utilisateur est attirée sur les risques
~ associés au chargement, à l'utilisation, à la modification et/ou au
~ développement et à la reproduction du logiciel par l'utilisateur étant
~ donné sa spécificité de logiciel libre, qui peut le rendre complexe à
~ manipuler et qui le réserve donc à des développeurs et des professionnels
~ avertis possédant des connaissances informatiques approfondies. Les
~ utilisateurs sont donc invités à charger et à tester l'adéquation du
~ logiciel à leurs besoins dans des conditions permettant d'assurer la
~ sécurité de leurs systèmes et/ou de leurs données et, plus généralement,
~ à l'utiliser et à l'exploiter dans les mêmes conditions de sécurité.
~
~ Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
~ pris connaissance de la licence CeCILL 2.1, et que vous en avez accepté les
~ termes.
-->

<ion-card>
<ion-grid>
<ion-row>
<ion-col size="auto">
<img class="thumbnail" alt="" src="https://ionicframework.com/docs/img/demos/card-media.png">
</ion-col>
<ion-col class="title-col">
<ion-card-title>
{{item.title}}
</ion-card-title>
</ion-col>
<ion-col size="auto" class="button-col">
<ion-button *ngIf="displayMode !== ChildDisplay.CARD && !item.isLeaf" fill="solid" shape="round" (click)="openItemLink(item)">
<ion-icon [name]="getButtonIcon(item.pageType)" slot="icon-only" size="large"></ion-icon>
</ion-button>
<ion-button *ngIf="displayMode === ChildDisplay.CARD" shape="round" fill="solid" (click)="toggleDetails()">
<ion-icon [name]="isExpanded ? 'chevron-up-outline' : 'chevron-down-outline'" slot="icon-only" size="large"></ion-icon>
</ion-button>
</ion-col>
</ion-row>
</ion-grid>

<ng-container *ngIf="displayMode === ChildDisplay.CARD && isExpanded">
<div class="separator"></div>
<ion-card-content>
<ion-item lines="none">
{{ item.content }}
</ion-item>

<ng-template #clickableItem let-icon="icon" let-value="value" let-click="click">
<ion-item
*ngIf="value"
button
detail="false"
lines="none"
(click)="click(value)"
>
<ion-icon [name]="icon" slot="start"></ion-icon>
<ion-label class="underline-text">{{ value }}</ion-label>
</ion-item>
</ng-template>

<ng-container
*ngTemplateOutlet="clickableItem; context: { icon: 'mail-outline', value: item.email, click: handleEmail }"
></ng-container>
<ng-container
*ngTemplateOutlet="clickableItem; context: { icon: 'call-outline', value: item.phone, click: handlePhone }"
></ng-container>
<ion-item *ngIf="item.address" lines="none">
<ion-icon name="location-outline" slot="start"></ion-icon>
<ion-label>{{ item.address }}</ion-label>
</ion-item>
<ng-container
*ngTemplateOutlet="clickableItem; context: { icon: 'globe-outline', value: item.link, click: handleLink }"
></ng-container>
</ion-card-content>
</ng-container>

</ion-card>

Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
/*
* Copyright ou © ou Copr. Université de Lorraine, (2022)
*
* Direction du Numérique de l'Université de Lorraine - SIED
* (dn-mobile-dev@univ-lorraine.fr)
* JNESIS (contact@jnesis.com)
*
* Ce logiciel est un programme informatique servant à rendre accessible
* sur mobile divers services universitaires aux étudiants et aux personnels
* de l'université.
*
* Ce logiciel est régi par la licence CeCILL 2.1, soumise au droit français
* et respectant les principes de diffusion des logiciels libres. Vous pouvez
* utiliser, modifier et/ou redistribuer ce programme sous les conditions
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et INRIA
* sur le site "http://cecill.info".
*
* En contrepartie de l'accessibilité au code source et des droits de copie,
* de modification et de redistribution accordés par cette licence, il n'est
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
* seule une responsabilité restreinte pèse sur l'auteur du programme, le
* titulaire des droits patrimoniaux et les concédants successifs.
*
* À cet égard, l'attention de l'utilisateur est attirée sur les risques
* associés au chargement, à l'utilisation, à la modification et/ou au
* développement et à la reproduction du logiciel par l'utilisateur étant
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à
* manipuler et qui le réserve donc à des développeurs et des professionnels
* avertis possédant des connaissances informatiques approfondies. Les
* utilisateurs sont donc invités à charger et à tester l'adéquation du
* logiciel à leurs besoins dans des conditions permettant d'assurer la
* sécurité de leurs systèmes et/ou de leurs données et, plus généralement,
* à l'utiliser et à l'exploiter dans les mêmes conditions de sécurité.
*
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
* pris connaissance de la licence CeCILL 2.1, et que vous en avez accepté les
* termes.
*/

import { Component, Input } from '@angular/core';
import { ChildDisplay, KnowledgeBaseItem, PageType } from '../knowledge-base.repository';
import { Browser } from '@capacitor/browser';
import { Router } from '@angular/router';

@Component({
selector: 'app-knowledge-base-card',
templateUrl: './knowledge-base-card.component.html',
styleUrls: ['../../../../../src/theme/app-theme/styles/knowledge-base/knowledge-base-card.component.scss']
})

export class KnowledgeBaseCardComponent {
@Input() item: KnowledgeBaseItem;
@Input() displayMode: ChildDisplay;
public isExpanded: boolean = false;

constructor(
private router: Router,
) {}

openItemLink(item: KnowledgeBaseItem) {
Comment thread
jnesis-jbole marked this conversation as resolved.
if (item.pageType === PageType.INTERNAL_LINK) {
this.router.navigateByUrl(item.link)
}
if (item.pageType === PageType.EXTERNAL_LINK) {
Browser.open({url: item.link});
}
if (item.pageType === PageType.CONTENT) {
this.router.navigateByUrl(`knowledge-base/${item.id}`)
}
}

getButtonIcon(type: PageType) {
switch (type) {
case PageType.EXTERNAL_LINK: return 'open-outline';
case PageType.INTERNAL_LINK: return 'arrow-forward';
case PageType.CONTENT: return 'arrow-forward';
}
}

toggleDetails() {
this.isExpanded = !this.isExpanded;
}

handlePhone(phone: string) {
window.open(`tel:${phone}`);
}

handleEmail(email: string) {
window.open(`mailto:${email}`);
}

handleLink(link: string) {
Browser.open({url: link});
}

protected readonly ChildDisplay = ChildDisplay;
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,14 @@
*/

import { CommonModule } from '@angular/common';
import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core';
import { APP_INITIALIZER, NgModule } from '@angular/core';
import { IonicModule } from '@ionic/angular';
import { TranslateModule } from '@ngx-translate/core';
import { ProjectModuleService, SharedComponentsModule, SharedPipeModule } from '@multi/shared';
import { KnowledgeBasePageRoutingModule } from './knowledge-base-routing.module';
import { KnowledgeBasePage } from './knowledge-base.page';
import { KnowledgeBaseComponent } from './widgets/knowledge-base/knowledge-base.component';
import { KnowledgeBaseCardComponent } from './knowledge-base-card/knowledge-base-card.component';

const initModule = (projectModuleService: ProjectModuleService) =>
() => projectModuleService.initProjectModule({
Expand All @@ -67,6 +68,7 @@ const initModule = (projectModuleService: ProjectModuleService) =>
declarations: [
KnowledgeBasePage,
KnowledgeBaseComponent,
KnowledgeBaseCardComponent
],
providers: [{
provide: APP_INITIALIZER,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,26 +40,33 @@
<ion-content>
<ion-progress-bar *ngIf="isLoading" type="indeterminate"></ion-progress-bar>

<ion-list>
<ion-list *ngIf="(knowledgeBases$ | async) as knowledgeBases">
<ion-card *ngFor="let item of knowledgeBases">
<ion-card-header>
<ion-card-title>{{item.title}}</ion-card-title>
</ion-card-header>
<ion-card-content>
{{item.content}}
</ion-card-content>
<ion-toolbar>
<ion-icon slot="end" name="arrow-forward" size="large" (click)="openItemLink(item)"></ion-icon>
</ion-toolbar>
</ion-card>
</ion-list>
</ion-list>
<ng-container *ngIf="(knowledgeBaseParentItem$ | async) as parentItem; else noParent">
<div class="parent-content">
<h1>{{ parentItem.title }}</h1>
<p>{{ parentItem.content }}</p>
</div>
</ng-container>

<ng-template #noParent>
<ion-searchbar placeholder="Rechercher une page"></ion-searchbar>
Comment thread
jnesis-jbole marked this conversation as resolved.
Outdated
</ng-template>

<ng-container *ngIf="(knowledgeBasesIsEmpty$ | async) && !isLoading">
<ion-row class="ion-margin ion-justify-content-center">
<ion-text>{{ "KNOWLEDGE-BASE.NO_DATA" | translate }}</ion-text>
</ion-row>
<ng-container *ngIf="(knowledgeBases$ | async) as knowledgeBases">
<ion-list *ngIf="knowledgeBases.length > 0; else noData">
<app-knowledge-base-card
*ngFor="let item of knowledgeBases"
[item]="item"
[displayMode]="(knowledgeBaseParentItem$ | async)?.childDisplay ?? ChildDisplay.LIST"
></app-knowledge-base-card>
</ion-list>
</ng-container>

<ng-template #noData>
<ng-container *ngIf="(knowledgeBasesIsEmpty$ | async) && !isLoading">
<ion-row class="ion-margin ion-justify-content-center">
<ion-text>{{ "KNOWLEDGE-BASE.NO_DATA" | translate }}</ion-text>
</ion-row>
</ng-container>
</ng-template>

</ion-content>
Loading
Loading