1
0
mirror of https://github.com/LaCasemate/fab-manager.git synced 2025-01-29 18:52:22 +01:00

admin set its customized html template for the home page & can reset it to factory value

This commit is contained in:
Sylvain 2020-01-22 11:53:40 +01:00
parent b1e6154cc9
commit b85c7ac00b
13 changed files with 311 additions and 194 deletions

View File

@ -12,8 +12,8 @@
*/ */
'use strict'; 'use strict';
Application.Controllers.controller('SettingsController', ['$scope', '$rootScope', '$filter', '$uibModal', 'Setting', 'growl', 'settingsPromise', 'privacyDraftsPromise', 'cgvFile', 'cguFile', 'logoFile', 'logoBlackFile', 'faviconFile', 'profileImageFile', 'CSRF', '_t', Application.Controllers.controller('SettingsController', ['$scope', '$rootScope', '$filter', '$uibModal', 'dialogs', 'Setting', 'growl', 'settingsPromise', 'privacyDraftsPromise', 'cgvFile', 'cguFile', 'logoFile', 'logoBlackFile', 'faviconFile', 'profileImageFile', 'CSRF', '_t',
function ($scope, $rootScope, $filter, $uibModal, Setting, growl, settingsPromise, privacyDraftsPromise, cgvFile, cguFile, logoFile, logoBlackFile, faviconFile, profileImageFile, CSRF, _t) { function ($scope, $rootScope, $filter, $uibModal, dialogs, Setting, growl, settingsPromise, privacyDraftsPromise, cgvFile, cguFile, logoFile, logoBlackFile, faviconFile, profileImageFile, CSRF, _t) {
/* PUBLIC SCOPE */ /* PUBLIC SCOPE */
// timepickers steps configuration // timepickers steps configuration
@ -140,10 +140,14 @@ Application.Controllers.controller('SettingsController', ['$scope', '$rootScope'
$scope.summernoteOptsHomePage = Object.assign({}, $rootScope.summernoteOpts); $scope.summernoteOptsHomePage = Object.assign({}, $rootScope.summernoteOpts);
$scope.summernoteOptsHomePage.toolbar[5][1].push('nugget'); // toolbar -> insert -> nugget $scope.summernoteOptsHomePage.toolbar[5][1].push('nugget'); // toolbar -> insert -> nugget
$scope.summernoteOptsHomePage.nugget = { $scope.summernoteOptsHomePage.nugget = {
label: "🧱", label: '\uF12E',
tooltip: "blabla", tooltip: _t('app.admin.settings.home_items'),
list: [ list: [
'[[lorem ipsum]]' `<div id="news">${_t('app.admin.settings.item_news')}</div>`,
`<div id="projects">${_t('app.admin.settings.item_projects')}</div>`,
`<div id="twitter">${_t('app.admin.settings.item_twitter')}</div>`,
`<div id="members">${_t('app.admin.settings.item_members')}</div>`,
`<div id="events">${_t('app.admin.settings.item_events')}</div>`
] ]
} }
@ -305,6 +309,29 @@ Application.Controllers.controller('SettingsController', ['$scope', '$rootScope'
}); });
} }
/**
* Reset the home page to its initial state (factory value)
*/
$scope.resetHomePage = function () {
dialogs.confirm({
resolve: {
object () {
return {
title: _t('app.admin.settings.confirmation_required'),
msg: _t('app.admin.settings.confirm_reset_home_page')
};
}
}
}
, function () { // confirmed
Setting.reset({ name: 'home_content' }, function (data) {
$scope.homeContent.value = data.value;
growl.success(_t('app.admin.settings.home_content_reset'));
})
}
)
}
/* PRIVATE SCOPE */ /* PRIVATE SCOPE */
/** /**

View File

@ -1006,7 +1006,7 @@ angular.module('application.router', ['ui.router'])
'fablab_name', 'name_genre', 'reminder_enable', \ 'fablab_name', 'name_genre', 'reminder_enable', \
'reminder_delay', 'visibility_yearly', 'visibility_others', \ 'reminder_delay', 'visibility_yearly', 'visibility_others', \
'display_name_enable', 'machines_sort_by', 'fab_analytics', \ 'display_name_enable', 'machines_sort_by', 'fab_analytics', \
'link_name']` }).$promise; 'link_name', 'home_content']` }).$promise;
}], }],
privacyDraftsPromise: ['Setting', function (Setting) { return Setting.get({ name: 'privacy_draft', history: true }).$promise; }], privacyDraftsPromise: ['Setting', function (Setting) { return Setting.get({ name: 'privacy_draft', history: true }).$promise; }],
cguFile: ['CustomAsset', function (CustomAsset) { return CustomAsset.get({ name: 'cgu-file' }).$promise; }], cguFile: ['CustomAsset', function (CustomAsset) { return CustomAsset.get({ name: 'cgu-file' }).$promise; }],

View File

@ -15,6 +15,11 @@ Application.Services.factory('Setting', ['$resource', function ($resource) {
}, },
query: { query: {
isArray: false isArray: false
},
reset: {
url: '/api/settings/reset/:name',
params: { name: '@name' },
method: 'PUT'
} }
} }
); );

View File

@ -0,0 +1,44 @@
.admin-settings {
.home-page-settings {
.home-page-content {
.note-editor {
.note-toolbar .note-btn-group .note-btn .nugget {
font-family: "FontAwesome";
}
.note-editing-area .note-editable {
#news {
width: 100%;
background-color: #b1b1b1;
color: white;
border: 1px dashed #8f9091;
border-radius: 5px;
text-align: center;
vertical-align: middle;
line-height: 10rem;
font-size: 2em;
}
#projects {
@extend #news;
line-height: 523px;
}
#twitter {
@extend #news;
line-height: 162px;
}
#members {
@extend #news;
line-height: 320px;
}
#events {
@extend #news;
line-height: 621px;
}
}
}
}
}
}

View File

@ -1,8 +1,9 @@
<div class="panel panel-default m-t-md"> <div class="panel panel-default m-t-md home-page-settings">
<div class="panel-body"> <div class="panel-body">
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12 home-page-content">
<h4 translate>{{ 'app.admin.settings.customize_home_page' }}</h4> <h4 translate>{{ 'app.admin.settings.customize_home_page' }}</h4>
<button class="btn btn-default pull-right m-t-n-xl" ng-click="resetHomePage()" title="{{ 'app.admin.settings.reset_home_page' | translate }}"><i class="fa fa-undo"></i></button>
<summernote ng-model="homeContent.value" <summernote ng-model="homeContent.value"
id="home_content" id="home_content"
config="summernoteOptsHomePage"> config="summernoteOptsHomePage">

View File

@ -14,7 +14,7 @@
</div> </div>
</section> </section>
<section class="m-lg"> <section class="m-lg admin-settings">
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">

View File

@ -2,7 +2,7 @@
# API Controller for resources of type Setting # API Controller for resources of type Setting
class API::SettingsController < API::ApiController class API::SettingsController < API::ApiController
before_action :authenticate_user!, only: :update before_action :authenticate_user!, only: %i[update bulk_update reset]
def index def index
@settings = Setting.where(name: names_as_string_to_array) @settings = Setting.where(name: names_as_string_to_array)
@ -36,6 +36,19 @@ class API::SettingsController < API::ApiController
@show_history = params[:history] == 'true' && current_user.admin? @show_history = params[:history] == 'true' && current_user.admin?
end end
def reset
authorize Setting
setting = Setting.find_or_create_by(name: params[:name])
first_val = setting.history_values.order(created_at: :asc).limit(1).first
new_val = HistoryValue.create!(
setting_id: setting.id,
value: first_val.value,
invoicing_profile_id: current_user.invoicing_profile.id
)
render json: new_val, status: :ok
end
private private
def setting_params def setting_params

View File

@ -1,3 +1,8 @@
# frozen_string_literal: true
# Setting is a configuration element of the platform. Only administrators are allowed to modify Settings
# For some settings, changing them will involve some callback actions (like rebuilding the stylesheets if the theme color Setting is changed).
# A full history of the previous values is kept in database with the date and the author of the change
class Setting < ActiveRecord::Base class Setting < ActiveRecord::Base
has_many :history_values has_many :history_values
validates :name, inclusion: validates :name, inclusion:
@ -65,7 +70,8 @@ class Setting < ActiveRecord::Base
hub_last_version hub_last_version
hub_public_key hub_public_key
fab_analytics fab_analytics
link_name] } link_name
home_content] }
after_update :update_stylesheet, :notify_privacy_policy_changed if :value_changed? after_update :update_stylesheet, :notify_privacy_policy_changed if :value_changed?

View File

@ -2,7 +2,7 @@
# Check the access policies for API::SettingsController # Check the access policies for API::SettingsController
class SettingPolicy < ApplicationPolicy class SettingPolicy < ApplicationPolicy
%w[update bulk_update].each do |action| %w[update bulk_update reset].each do |action|
define_method "#{action}?" do define_method "#{action}?" do
user.admin? user.admin?
end end

View File

@ -928,6 +928,18 @@ fr:
space_explications_alert: "l'explication sur la page de réservation d'un espace" space_explications_alert: "l'explication sur la page de réservation d'un espace"
main_color: "la couleur principale" main_color: "la couleur principale"
secondary_color: "la couleur secondaire" secondary_color: "la couleur secondaire"
customize_home_page: "Personnaliser la page d'accueil"
reset_home_page: "Remettre la page d'accueil dans son état initial"
confirmation_required: "Confirmation requise"
confirm_reset_home_page: "Voulez-vous vraiment remettre la page d'accueil à sa valeur d'usine ?"
home_items: "Éléments de la page d'accueil"
item_news: "Brève"
item_projects: "Derniers projets"
item_twitter: "Dernier tweet"
item_members: "Derniers membres"
item_events: "Prochains événements"
home_content: "la page d'accueil"
home_content_reset: "La page d'accueil a bien été restaurée dans sa configuration initiale."
home_blogpost: "la brève de la page d'accueil" home_blogpost: "la brève de la page d'accueil"
twitter_name: "nom du flux Twitter" twitter_name: "nom du flux Twitter"
link_name: "l'intitulé du lien vers la page \"À propos\"" link_name: "l'intitulé du lien vers la page \"À propos\""

View File

@ -47,6 +47,7 @@ Rails.application.routes.draw do
resources :admins, only: %i[index create destroy] resources :admins, only: %i[index create destroy]
resources :settings, only: %i[show update index], param: :name do resources :settings, only: %i[show update index], param: :name do
patch '/bulk_update', action: 'bulk_update', on: :collection patch '/bulk_update', action: 'bulk_update', on: :collection
put '/reset/:name', action: 'reset', on: :collection
end end
resources :users, only: %i[index create] resources :users, only: %i[index create]
resources :members, only: %i[index show create update destroy] do resources :members, only: %i[index show create update destroy] do

View File

@ -214,7 +214,7 @@ if Machine.count.zero?
"\r\nVitesse d'analyse (scannage): 4-15 mm/sec\r\n \r\n \r\nLogiciel utilisé pour le fraisage: Roland Modela player" \ "\r\nVitesse d'analyse (scannage): 4-15 mm/sec\r\n \r\n \r\nLogiciel utilisé pour le fraisage: Roland Modela player" \
" 4 \r\nLogiciel utilisé pour l'usinage de circuits imprimés: Cad.py (linux)\r\nFormats acceptés: STL,PNG 3D\r\n" \ " 4 \r\nLogiciel utilisé pour l'usinage de circuits imprimés: Cad.py (linux)\r\nFormats acceptés: STL,PNG 3D\r\n" \
"Format d'exportation des données scannées: DXF, VRML, STL, 3DMF, IGES, Grayscale, Point Group et BMP\r\n", "Format d'exportation des données scannées: DXF, VRML, STL, 3DMF, IGES, Grayscale, Point Group et BMP\r\n",
slug: 'petite-fraiseuse' }, slug: 'petite-fraiseuse' }
]) ])
Price.all.each do |p| Price.all.each do |p|
@ -294,13 +294,18 @@ end
unless Setting.find_by(name: 'subscription_explications_alert').try(:value) unless Setting.find_by(name: 'subscription_explications_alert').try(:value)
setting = Setting.find_or_initialize_by(name: 'subscription_explications_alert') setting = Setting.find_or_initialize_by(name: 'subscription_explications_alert')
setting.value = '<p><b>Règle sur la date de début des abonnements</b><br></p><ul><li>' \ setting.value = <<~HTML
' <span style=\"font-size: 1.6rem; line-height: 2.4rem;\">Si vous êtes un nouvel utilisateur - i.e aucune ' \ <p><b>Règle sur la date de début des abonnements</b></p>
" formation d'enregistrée sur le site - votre abonnement débutera à la date de réservation de votre première " \ <ul>
' formation.</span><br></li><li><span style=\"font-size: 1.6rem; line-height: 2.4rem;\">Si vous avez déjà une ' \ <li><span style=\"font-size: 1.6rem; line-height: 2.4rem;\">Si vous êtes un nouvel utilisateur - i.e aucune
" formation ou plus de validée, votre abonnement débutera à la date de votre achat d'abonnement.</span></li>" \ formation d'enregistrée sur le site - votre abonnement débutera à la date de réservation de votre première
" </ul><p>Merci de bien prendre ses informations en compte, et merci de votre compréhension. L'équipe du Fab Lab.<br>" \ formation.</span></li>
' </p><p></p>' <li><span style="font-size: 1.6rem; line-height: 2.4rem;">Si vous avez déjà une formation ou plus de validée,
votre abonnement débutera à la date de votre achat d'abonnement.</span></li>
</ul>
<p>Merci de bien prendre ses informations en compte, et merci de votre compréhension. L'équipe du Fab Lab.<br>
</p>
HTML
setting.save setting.save
end end
@ -495,138 +500,140 @@ end
unless Setting.find_by(name: 'privacy_draft').try(:value) unless Setting.find_by(name: 'privacy_draft').try(:value)
setting = Setting.find_or_initialize_by(name: 'privacy_draft') setting = Setting.find_or_initialize_by(name: 'privacy_draft')
setting.value = "<p>La présente politique de confidentialité définit et vous informe de la manière dont _________ utilise et protège les setting.value = <<~HTML
informations que vous nous transmettez, le cas échéant, lorsque vous utilisez le présent site accessible à partir de lURL suivante : <p>La présente politique de confidentialité définit et vous informe de la manière dont _________ utilise et protège les
_________ (ci-après le « Site »).</p><p>Veuillez noter que cette politique de confidentialité est susceptible dêtre modifiée ou informations que vous nous transmettez, le cas échéant, lorsque vous utilisez le présent site accessible à partir de lURL suivante :
complétée à tout moment par _________, notamment en vue de se conformer à toute évolution législative, réglementaire, jurisprudentielle _________ (ci-après le « Site »).</p><p>Veuillez noter que cette politique de confidentialité est susceptible dêtre modifiée ou
ou technologique. Dans un tel cas, la date de sa mise à jour sera clairement identifiée en tête de la présente politique et l'Utilisateur complétée à tout moment par _________, notamment en vue de se conformer à toute évolution législative, réglementaire, jurisprudentielle
sera informé par courriel. Ces modifications engagent lUtilisateur dès leur mise en ligne. Il convient par conséquent que lUtilisateur ou technologique. Dans un tel cas, la date de sa mise à jour sera clairement identifiée en tête de la présente politique et l'Utilisateur
consulte régulièrement la présente politique de confidentialité et dutilisation des cookies afin de prendre connaissance de ses sera informé par courriel. Ces modifications engagent lUtilisateur dès leur mise en ligne. Il convient par conséquent que lUtilisateur
éventuelles modifications.</p><h3>I. DONNÉES PERSONNELLES</h3><p>Dune manière générale, il vous est possible de visiter le site de consulte régulièrement la présente politique de confidentialité et dutilisation des cookies afin de prendre connaissance de ses
_________ sans communiquer aucune information personnelle vous concernant. En toute hypothèse, vous nêtes en aucune manière obligé de éventuelles modifications.</p><h3>I. DONNÉES PERSONNELLES</h3><p>Dune manière générale, il vous est possible de visiter le site de
transmettre ces informations à _________.</p><p>Néanmoins, en cas de refus, il se peut que vous ne puissiez pas bénéficier de _________ sans communiquer aucune information personnelle vous concernant. En toute hypothèse, vous nêtes en aucune manière obligé de
certaines informations ou services que vous avez demandé. A ce titre en effet, _________ peut être amené dans certains cas à vous transmettre ces informations à _________.</p><p>Néanmoins, en cas de refus, il se peut que vous ne puissiez pas bénéficier de
demander de renseigner vos nom, prénom, pseudonyme, sexe, adresse mail, numéro de téléphone, entreprise et date de naissance (ci-après certaines informations ou services que vous avez demandé. A ce titre en effet, _________ peut être amené dans certains cas à vous
vos « Informations Personnelles »). En fournissant ces informations, vous acceptez expressément quelles soient traitées par demander de renseigner vos nom, prénom, pseudonyme, sexe, adresse mail, numéro de téléphone, entreprise et date de naissance (ci-après
_________, aux fins indiquées au point 2 ci-dessous.</p><p>Conformément au Règlement Général sur la Protection des Données (General vos « Informations Personnelles »). En fournissant ces informations, vous acceptez expressément quelles soient traitées par
Data Protection Regulation) adopté par le Parlement européen le 14 avril 2016, et à la Loi Informatique et Libertés du 6 janvier 1978 _________, aux fins indiquées au point 2 ci-dessous.</p><p>Conformément au Règlement Général sur la Protection des Données (General
modifiée, _________ vous informe des points suivants :</p><h4>1. Identité du responsable du traitement</h4><p>Le responsable du Data Protection Regulation) adopté par le Parlement européen le 14 avril 2016, et à la Loi Informatique et Libertés du 6 janvier 1978
traitement est (la société/l'association) _________ (adresse) _________, (code postal) _________ (ville)&nbsp;_________ (Pays) modifiée, _________ vous informe des points suivants :</p><h4>1. Identité du responsable du traitement</h4><p>Le responsable du
_________ .</p><h4>2. Finalités du traitement</h4><p>_________ est susceptible de traiter vos Informations Personnelles :</p><p>(a) traitement est (la société/l'association) _________ (adresse) _________, (code postal) _________ (ville)&nbsp;_________ (Pays)
aux fins de vous fournir les informations ou les services que vous avez demandés (notamment : l'envoi de notifications relatives à _________ .</p><h4>2. Finalités du traitement</h4><p>_________ est susceptible de traiter vos Informations Personnelles :</p><p>(a)
vos activités sur le Site, lenvoi de la Newsletter, la correspondance par email, lenvoi dinformations commerciales, livres aux fins de vous fournir les informations ou les services que vous avez demandés (notamment : l'envoi de notifications relatives à
blancs ou encore lévaluation de votre niveau de satisfaction quant aux services proposés) ;</p><p>(b) aux fins de recueillir des vos activités sur le Site, lenvoi de la Newsletter, la correspondance par email, lenvoi dinformations commerciales, livres
informations nous permettant daméliorer notre Site, nos produits et services (notamment par le biais de cookies) ;</p><p>(c) blancs ou encore lévaluation de votre niveau de satisfaction quant aux services proposés) ;</p><p>(b) aux fins de recueillir des
aux fins de pouvoir vous contacter à propos de différents événements relatifs à _________, incluant notamment la mise à jour des informations nous permettant daméliorer notre Site, nos produits et services (notamment par le biais de cookies) ;</p><p>(c)
produits et le support client.</p><h4>3. Destinataires</h4><p>Seul _________ est destinataire de vos Informations Personnelles. aux fins de pouvoir vous contacter à propos de différents événements relatifs à _________, incluant notamment la mise à jour des
Celles-ci, que ce soit sous forme individuelle ou agrégée, ne sont jamais transmises à un tiers, nonobstant les sous-traitants produits et le support client.</p><h4>3. Destinataires</h4><p>Seul _________ est destinataire de vos Informations Personnelles.
auxquels _________ fait appel (vous trouverez de plus amples informations à leur sujet au point 7 ci-dessous). Ni _________, Celles-ci, que ce soit sous forme individuelle ou agrégée, ne sont jamais transmises à un tiers, nonobstant les sous-traitants
ni lun quelconque de ses sous-traitants, ne procèdent à la commercialisation des données personnelles des visiteurs et Utilisateurs de auxquels _________ fait appel (vous trouverez de plus amples informations à leur sujet au point 7 ci-dessous). Ni _________,
son Site.</p><h4>4. Durée de conservation</h4><p>Vos Informations Personnelles sont conservées par _________ uniquement pour le temps ni lun quelconque de ses sous-traitants, ne procèdent à la commercialisation des données personnelles des visiteurs et Utilisateurs de
correspondant à la finalité de la collecte tel quindiqué en 2 ci-dessus qui ne saurait en tout état de cause excéder 36 mois.</p><h4>5. son Site.</p><h4>4. Durée de conservation</h4><p>Vos Informations Personnelles sont conservées par _________ uniquement pour le temps
Droits Informatique et Libertés</h4><p>Vous disposez des droits suivants concernant vos Informations Personnelles, que vous pouvez exercer correspondant à la finalité de la collecte tel quindiqué en 2 ci-dessus qui ne saurait en tout état de cause excéder 36 mois.</p><h4>5.
en nous écrivant à ladresse postale mentionnée au point 1 ou en contactant le délégué à la protection des données, dont l'adresse est Droits Informatique et Libertés</h4><p>Vous disposez des droits suivants concernant vos Informations Personnelles, que vous pouvez exercer
mentionnée ci-contre.</p><p><b>o Droit daccès et de communication des données</b></p><p>Vous avez la faculté daccéder aux Informations en nous écrivant à ladresse postale mentionnée au point 1 ou en contactant le délégué à la protection des données, dont l'adresse est
Personnelles qui vous concernent.</p><p>Cependant, en raison de lobligation de sécurité et de confidentialité dans le traitement des mentionnée ci-contre.</p><p><b>o Droit daccès et de communication des données</b></p><p>Vous avez la faculté daccéder aux Informations
données à caractère personnel qui incombe à _________, vous êtes informé que votre demande sera traitée sous réserve que vous apportiez la Personnelles qui vous concernent.</p><p>Cependant, en raison de lobligation de sécurité et de confidentialité dans le traitement des
preuve de votre identité, notamment par la production dun scan de votre titre didentité valide (en cas de demande par voie électronique) données à caractère personnel qui incombe à _________, vous êtes informé que votre demande sera traitée sous réserve que vous apportiez la
ou dune photocopie signée de votre titre didentité valide (en cas de demande adressée par écrit).</p><p>_________ vous informe quil preuve de votre identité, notamment par la production dun scan de votre titre didentité valide (en cas de demande par voie électronique)
sera en droit, le cas échéant, de sopposer aux demandes manifestement abusives (de par leur nombre, leur caractère répétitif ou ou dune photocopie signée de votre titre didentité valide (en cas de demande adressée par écrit).</p><p>_________ vous informe quil
systématique).</p><p>Pour vous aider dans votre démarche, notamment si vous désirez exercer votre droit daccès par le biais dune sera en droit, le cas échéant, de sopposer aux demandes manifestement abusives (de par leur nombre, leur caractère répétitif ou
demande écrite à ladresse postale mentionnée au point 1, vous trouverez en cliquant sur le <a systématique).</p><p>Pour vous aider dans votre démarche, notamment si vous désirez exercer votre droit daccès par le biais dune
href=\"https://www.cnil.fr/fr/modele/courrier/exercer-son-droit-dacces\">lien</a> suivant un modèle de courrier élaboré par la Commission demande écrite à ladresse postale mentionnée au point 1, vous trouverez en cliquant sur le <a
Nationale de lInformatique et des Libertés (la « CNIL »).</p><p><b>o Droit de rectification des données</b></p><p>Au titre de ce droit, href="https://www.cnil.fr/fr/modele/courrier/exercer-son-droit-dacces">lien</a> suivant un modèle de courrier élaboré par la Commission
la législation vous habilite à demander la rectification, la mise à jour, le verrouillage ou encore leffacement des données vous Nationale de lInformatique et des Libertés (la « CNIL »).</p><p><b>o Droit de rectification des données</b></p><p>Au titre de ce droit,
concernant qui peuvent savérer le cas échéant inexactes, erronées, incomplètes ou obsolètes.</p><p>Egalement, vous pouvez définir des la législation vous habilite à demander la rectification, la mise à jour, le verrouillage ou encore leffacement des données vous
directives générales et particulières relatives au sort des données à caractère personnel après votre décès. Le cas échéant, les héritiers concernant qui peuvent savérer le cas échéant inexactes, erronées, incomplètes ou obsolètes.</p><p>Egalement, vous pouvez définir des
dune personne décédée peuvent exiger de prendre en considération le décès de leur proche et/ou de procéder aux mises à jour nécessaires. directives générales et particulières relatives au sort des données à caractère personnel après votre décès. Le cas échéant, les héritiers
</p><p>Pour vous aider dans votre démarche, notamment si vous désirez exercer, pour votre propre compte ou pour le compte de lun de vos dune personne décédée peuvent exiger de prendre en considération le décès de leur proche et/ou de procéder aux mises à jour nécessaires.
proches défunt, votre droit de rectification par le biais dune demande écrite à ladresse postale mentionnée au point 1, vous trouverez </p><p>Pour vous aider dans votre démarche, notamment si vous désirez exercer, pour votre propre compte ou pour le compte de lun de vos
en cliquant sur le <a href=\"https://www.cnil.fr/fr/modele/courrier/rectifier-des-donnees-inexactes-obsoletes-ou-perimees\">lien</a> proches défunt, votre droit de rectification par le biais dune demande écrite à ladresse postale mentionnée au point 1, vous trouverez
suivant un modèle de courrier élaboré par la CNIL.</p><p><b>o Droit dopposition</b></p><p>Lexercice de ce droit nest possible que dans en cliquant sur le <a href="https://www.cnil.fr/fr/modele/courrier/rectifier-des-donnees-inexactes-obsoletes-ou-perimees">lien</a>
lune des deux situations suivantes :</p><p>Lorsque lexercice de ce droit est fondé sur des motifs légitimes ; ou</p><p>Lorsque suivant un modèle de courrier élaboré par la CNIL.</p><p><b>o Droit dopposition</b></p><p>Lexercice de ce droit nest possible que dans
lexercice de ce droit vise à faire obstacle à ce que les données recueillies soient utilisées à des fins de prospection commerciale.</p> lune des deux situations suivantes :</p><p>Lorsque lexercice de ce droit est fondé sur des motifs légitimes ; ou</p><p>Lorsque
<p>Pour vous aider dans votre démarche, notamment si vous désirez exercer votre droit dopposition par le biais dune demande écrite lexercice de ce droit vise à faire obstacle à ce que les données recueillies soient utilisées à des fins de prospection commerciale.</p>
adressée à ladresse postale indiquée au point 1, vous trouverez en cliquant sur le <a <p>Pour vous aider dans votre démarche, notamment si vous désirez exercer votre droit dopposition par le biais dune demande écrite
href=\"https://www.cnil.fr/fr/modele/courrier/supprimer-des-informations-vous-concernant-dun-site-internet\">lien</a> suivant un modèle de adressée à ladresse postale indiquée au point 1, vous trouverez en cliquant sur le <a
courrier élaboré par la CNIL.</p><h4>6. Délais de réponse</h4><p> _________ sengage à répondre à votre demande daccès, de rectification href="https://www.cnil.fr/fr/modele/courrier/supprimer-des-informations-vous-concernant-dun-site-internet">lien</a> suivant un modèle de
ou dopposition ou toute autre demande complémentaire dinformations dans un délai raisonnable qui ne saurait dépasser 1 mois à compter courrier élaboré par la CNIL.</p><h4>6. Délais de réponse</h4><p> _________ sengage à répondre à votre demande daccès, de rectification
de la réception de votre demande.</p><h4>7. Prestataires habilités et transfert vers un pays tiers de lUnion Européenne</h4><p>_________ ou dopposition ou toute autre demande complémentaire dinformations dans un délai raisonnable qui ne saurait dépasser 1 mois à compter
vous informe quil a recours à ses prestataires habilités pour faciliter le recueil et le traitement des données que vous nous avez de la réception de votre demande.</p><h4>7. Prestataires habilités et transfert vers un pays tiers de lUnion Européenne</h4><p>_________
communiqué. Ces prestataires peuvent être situés en dehors de lUnion Européenne et ont communication des données recueillies par le vous informe quil a recours à ses prestataires habilités pour faciliter le recueil et le traitement des données que vous nous avez
biais des divers formulaires présents sur le Site.</p><p>_________ sest préalablement assuré de la mise en œuvre par ses prestataires de communiqué. Ces prestataires peuvent être situés en dehors de lUnion Européenne et ont communication des données recueillies par le
garanties adéquates et du respect de conditions strictes en matière de confidentialité, dusage et de protection des données. Tout biais des divers formulaires présents sur le Site.</p><p>_________ sest préalablement assuré de la mise en œuvre par ses prestataires de
particulièrement, la vigilance sest portée sur lexistence dun fondement légal pour effectuer un quelconque transfert de données vers un garanties adéquates et du respect de conditions strictes en matière de confidentialité, dusage et de protection des données. Tout
pays tiers. A ce titre, lun de nos prestataires est soumis à (nom de la règle) _________ approuvées par la (nom de l'autorité) _________ particulièrement, la vigilance sest portée sur lexistence dun fondement légal pour effectuer un quelconque transfert de données vers un
en (année d'approbation)&nbsp;_________.</p><h4>8. Plainte auprès de lautorité compétente</h4><p>Si vous considérez que _________ ne pays tiers. A ce titre, lun de nos prestataires est soumis à (nom de la règle) _________ approuvées par la (nom de l'autorité) _________
respecte pas ses obligations au regard de vos Informations Personnelles, vous pouvez adresser une plainte ou une demande auprès de en (année d'approbation)&nbsp;_________.</p><h4>8. Plainte auprès de lautorité compétente</h4><p>Si vous considérez que _________ ne
lautorité compétente. En France, lautorité compétente est la CNIL à laquelle vous pouvez adresser une demande par voie électronique en respecte pas ses obligations au regard de vos Informations Personnelles, vous pouvez adresser une plainte ou une demande auprès de
cliquant sur le lien suivant : <a href=\"https://www.cnil.fr/fr/plaintes/internet\">https://www.cnil.fr/fr/plaintes/internet</a>.</p> lautorité compétente. En France, lautorité compétente est la CNIL à laquelle vous pouvez adresser une demande par voie électronique en
<h3>II. POLITIQUE RELATIVE AUX COOKIES</h3><p>Lors de votre première connexion sur le site web de _________, vous êtes avertis par un cliquant sur le lien suivant : <a href="https://www.cnil.fr/fr/plaintes/internet">https://www.cnil.fr/fr/plaintes/internet</a>.</p>
bandeau en bas de votre écran que des informations relatives à votre navigation sont susceptibles dêtre enregistrées dans des fichiers <h3>II. POLITIQUE RELATIVE AUX COOKIES</h3><p>Lors de votre première connexion sur le site web de _________, vous êtes avertis par un
dénommés « cookies ». Notre politique dutilisation des cookies vous permet de mieux comprendre les dispositions que nous mettons en œuvre bandeau en bas de votre écran que des informations relatives à votre navigation sont susceptibles dêtre enregistrées dans des fichiers
en matière de navigation sur notre site web. Elle vous informe notamment sur lensemble des cookies présents sur notre site web, leur dénommés « cookies ». Notre politique dutilisation des cookies vous permet de mieux comprendre les dispositions que nous mettons en œuvre
finalité (partie I.) et vous donne la marche à suivre pour les paramétrer (partie II.)</p><h4>1. Informations générales sur les cookies en matière de navigation sur notre site web. Elle vous informe notamment sur lensemble des cookies présents sur notre site web, leur
présents sur le site de _________</h4><p>_________, en tant quéditeur du présent site web, pourra procéder à limplantation dun cookie finalité (partie I.) et vous donne la marche à suivre pour les paramétrer (partie II.)</p><h4>1. Informations générales sur les cookies
sur le disque dur de votre terminal (ordinateur, tablette, mobile etc.) afin de vous garantir une navigation fluide et optimale sur notre présents sur le site de _________</h4><p>_________, en tant quéditeur du présent site web, pourra procéder à limplantation dun cookie
site Internet.</p><p>Les « cookies » (ou témoins de connexion) sont des petits fichiers texte de taille limitée qui nous permettent de sur le disque dur de votre terminal (ordinateur, tablette, mobile etc.) afin de vous garantir une navigation fluide et optimale sur notre
reconnaître votre ordinateur, votre tablette ou votre mobile aux fins de personnaliser les services que nous vous proposons.</p><p>Les site Internet.</p><p>Les « cookies » (ou témoins de connexion) sont des petits fichiers texte de taille limitée qui nous permettent de
informations recueillies par le biais des cookies ne permettent en aucune manière de vous identifier nominativement. Elles sont utilisées reconnaître votre ordinateur, votre tablette ou votre mobile aux fins de personnaliser les services que nous vous proposons.</p><p>Les
exclusivement pour nos besoins propres afin daméliorer linteractivité et la performance de notre site web et de vous adresser des informations recueillies par le biais des cookies ne permettent en aucune manière de vous identifier nominativement. Elles sont utilisées
contenus adaptés à vos centres dintérêts. Aucune de ces informations ne fait lobjet dune communication auprès de tiers sauf lorsque exclusivement pour nos besoins propres afin daméliorer linteractivité et la performance de notre site web et de vous adresser des
_________ a obtenu au préalable votre consentement ou bien lorsque la divulgation de ces informations est requise par la loi, sur ordre contenus adaptés à vos centres dintérêts. Aucune de ces informations ne fait lobjet dune communication auprès de tiers sauf lorsque
dun tribunal ou toute autorité administrative ou judiciaire habilitée à en connaître.</p><p>Pour mieux vous éclairer sur les informations _________ a obtenu au préalable votre consentement ou bien lorsque la divulgation de ces informations est requise par la loi, sur ordre
que les cookies identifient, vous trouverez ci-dessous un tableau listant les différents types de cookies susceptibles dêtre utilisés sur dun tribunal ou toute autorité administrative ou judiciaire habilitée à en connaître.</p><p>Pour mieux vous éclairer sur les informations
le site web de _________, leur nom, leur finalité ainsi que leur durée de conservation.</p><h4>2. Configuration de vos préférences sur les que les cookies identifient, vous trouverez ci-dessous un tableau listant les différents types de cookies susceptibles dêtre utilisés sur
cookies</h4><p>Vous pouvez accepter ou refuser le dépôt de cookies à tout moment.</p><p>Lors de votre première connexion sur le site web le site web de _________, leur nom, leur finalité ainsi que leur durée de conservation.</p><h4>2. Configuration de vos préférences sur les
de _________, une bannière présentant brièvement des informations relatives au dépôt de cookies et de technologies similaires apparaît en cookies</h4><p>Vous pouvez accepter ou refuser le dépôt de cookies à tout moment.</p><p>Lors de votre première connexion sur le site web
bas de votre écran. Cette bannière vous demande de choisir explicitement d'acceptez ou non le dépôt de cookies sur votre terminal. de _________, une bannière présentant brièvement des informations relatives au dépôt de cookies et de technologies similaires apparaît en
</p><p>Après avoir fait votre choix, vous pouvez le modifier ultérieurement&nbsp; en vous connectant à votre compte utilisateur puis en bas de votre écran. Cette bannière vous demande de choisir explicitement d'acceptez ou non le dépôt de cookies sur votre terminal.
naviguant dans la section intitulée « mes paramètres&nbsp;», accessible via un clic sur votre nom, en haut à droite de l'écran.</p> </p><p>Après avoir fait votre choix, vous pouvez le modifier ultérieurement&nbsp; en vous connectant à votre compte utilisateur puis en
<p>Selon le type de cookie en cause, le recueil de votre consentement au dépôt et à la lecture de cookies sur votre terminal peut être naviguant dans la section intitulée « mes paramètres&nbsp;», accessible via un clic sur votre nom, en haut à droite de l'écran.</p>
impératif.</p><h4>a. Les cookies exemptés de consentement</h4><p>Conformément aux recommandations de la Commission Nationale de <p>Selon le type de cookie en cause, le recueil de votre consentement au dépôt et à la lecture de cookies sur votre terminal peut être
lInformatique et des Libertés (CNIL), certains cookies sont dispensés du recueil préalable de votre consentement dans la mesure ils impératif.</p><h4>a. Les cookies exemptés de consentement</h4><p>Conformément aux recommandations de la Commission Nationale de
sont strictement nécessaires au fonctionnement du site internet ou ont pour finalité exclusive de permettre ou faciliter la communication lInformatique et des Libertés (CNIL), certains cookies sont dispensés du recueil préalable de votre consentement dans la mesure ils
par voie électronique. Il sagit des cookies suivants :</p><p><b>o Identifiant de session</b> et&nbsp;<b>authentification</b> sur l'API. sont strictement nécessaires au fonctionnement du site internet ou ont pour finalité exclusive de permettre ou faciliter la communication
Ces cookies sont intégralement soumis à la présente politique dans la mesure ils sont émis et gérés par _________.</p><p> par voie électronique. Il sagit des cookies suivants :</p><p><b>o Identifiant de session</b> et&nbsp;<b>authentification</b> sur l'API.
<b>o Stripe</b>, permettant de gérer les paiements par carte bancaire et dont la politique de confidentialité est accessible sur ce Ces cookies sont intégralement soumis à la présente politique dans la mesure ils sont émis et gérés par _________.</p><p>
<a href=\"https://stripe.com/fr/privacy\">lien</a>.</p><p><b>o Disqus</b>, permettant de poster des commentaires sur les fiches projet et <b>o Stripe</b>, permettant de gérer les paiements par carte bancaire et dont la politique de confidentialité est accessible sur ce
dont la politique de confidentialité est accessible sur ce <a href=\"https://help.disqus.com/articles/1717103-disqus-privacy-policy\">lien <a href="https://stripe.com/fr/privacy">lien</a>.</p><p><b>o Disqus</b>, permettant de poster des commentaires sur les fiches projet et
</a>.</p><h4>b. Les cookies nécessitant le recueil préalable de votre consentement</h4><p>Cette dont la politique de confidentialité est accessible sur ce <a href="https://help.disqus.com/articles/1717103-disqus-privacy-policy">lien
exigence concerne les cookies émis par des tiers et qui sont qualifiés de « persistants » dans la mesure ils demeurent dans votre </a>.</p><h4>b. Les cookies nécessitant le recueil préalable de votre consentement</h4><p>Cette
terminal jusquà leur effacement ou leur date dexpiration.</p><p>De tels cookies étant émis par des tiers, leur utilisation et leur dépôt exigence concerne les cookies émis par des tiers et qui sont qualifiés de « persistants » dans la mesure ils demeurent dans votre
sont soumis à leurs propres politiques de confidentialité dont vous trouverez un lien ci-dessous. Cette famille de cookie comprend les terminal jusquà leur effacement ou leur date dexpiration.</p><p>De tels cookies étant émis par des tiers, leur utilisation et leur dépôt
cookies de mesure daudience (Google Analytics).</p><p>Les cookies de mesure daudience établissent des statistiques concernant la sont soumis à leurs propres politiques de confidentialité dont vous trouverez un lien ci-dessous. Cette famille de cookie comprend les
fréquentation et lutilisation de divers éléments du site web (comme les contenus/pages que vous avez visité). cookies de mesure daudience (Google Analytics).</p><p>Les cookies de mesure daudience établissent des statistiques concernant la
Ces données participent à lamélioration de lergonomie du site web de _________. Un outil de mesure daudience est utilisé sur le fréquentation et lutilisation de divers éléments du site web (comme les contenus/pages que vous avez visité).
présent site internet :</p><p><b>o Google Analytics</b> pour gérer les statistiques de visites dont la politique de Ces données participent à lamélioration de lergonomie du site web de _________. Un outil de mesure daudience est utilisé sur le
confidentialité est disponible (uniquement en anglais) à partir du <a href=\"https://policies.google.com/privacy?hl=fr&amp;gl=ZZ\">lien présent site internet :</p><p><b>o Google Analytics</b> pour gérer les statistiques de visites dont la politique de
</a> suivant. </p><h4>c. Vous disposez de divers outils de paramétrage des cookies</h4><p>La plupart confidentialité est disponible (uniquement en anglais) à partir du <a href="https://policies.google.com/privacy?hl=fr&amp;gl=ZZ">lien
des navigateurs Internet sont configurés par défaut de façon à ce que le dépôt de cookies soit autorisé. Votre navigateur vous offre </a> suivant. </p><h4>c. Vous disposez de divers outils de paramétrage des cookies</h4><p>La plupart
lopportunité de modifier ces paramètres standards de manière à ce que lensemble des cookies soit rejeté systématiquement ou bien à ce des navigateurs Internet sont configurés par défaut de façon à ce que le dépôt de cookies soit autorisé. Votre navigateur vous offre
quune partie seulement des cookies soit acceptée ou refusée en fonction de leur émetteur.</p><p><b>ATTENTION</b> : Nous attirons votre lopportunité de modifier ces paramètres standards de manière à ce que lensemble des cookies soit rejeté systématiquement ou bien à ce
attention sur le fait que le refus du dépôt de cookies sur votre terminal est néanmoins susceptible daltérer votre expérience quune partie seulement des cookies soit acceptée ou refusée en fonction de leur émetteur.</p><p><b>ATTENTION</b> : Nous attirons votre
dutilisateur ainsi que votre accès à certains services ou fonctionnalités du présent site web. Le cas échéant, _________ décline toute attention sur le fait que le refus du dépôt de cookies sur votre terminal est néanmoins susceptible daltérer votre expérience
responsabilité concernant les conséquences liées à la dégradation de vos conditions de navigation qui interviennent en raison de votre dutilisateur ainsi que votre accès à certains services ou fonctionnalités du présent site web. Le cas échéant, _________ décline toute
choix de refuser, supprimer ou bloquer les cookies nécessaires au fonctionnement du site. responsabilité concernant les conséquences liées à la dégradation de vos conditions de navigation qui interviennent en raison de votre
Ces conséquences ne sauraient constituer un dommage et vous ne pourrez prétendre à aucune indemnité de ce fait.</p> choix de refuser, supprimer ou bloquer les cookies nécessaires au fonctionnement du site.
<p>Votre navigateur vous permet également de supprimer les cookies existants sur votre Ces conséquences ne sauraient constituer un dommage et vous ne pourrez prétendre à aucune indemnité de ce fait.</p>
terminal ou encore de vous signaler lorsque de nouveaux cookies sont susceptibles dêtre déposés sur votre terminal. Ces paramètres nont <p>Votre navigateur vous permet également de supprimer les cookies existants sur votre
pas dincidence sur votre navigation mais vous font perdre tout le bénéfice apporté par le cookie.</p><p>Veuillez ci-dessous prendre terminal ou encore de vous signaler lorsque de nouveaux cookies sont susceptibles dêtre déposés sur votre terminal. Ces paramètres nont
connaissance des multiples outils mis à votre disposition afin que vous puissiez paramétrer les cookies déposés sur votre terminal.</p> pas dincidence sur votre navigation mais vous font perdre tout le bénéfice apporté par le cookie.</p><p>Veuillez ci-dessous prendre
<h4>d. Le paramétrage de votre navigateur Internet</h4><p>Chaque navigateur Internet propose ses propres paramètres de gestion des connaissance des multiples outils mis à votre disposition afin que vous puissiez paramétrer les cookies déposés sur votre terminal.</p>
cookies. Pour savoir de quelle manière modifier vos préférences en matière de cookies, vous trouverez ci-dessous les liens vers laide <h4>d. Le paramétrage de votre navigateur Internet</h4><p>Chaque navigateur Internet propose ses propres paramètres de gestion des
nécessaire pour accéder au menu de votre navigateur prévu à cet effet :</p> cookies. Pour savoir de quelle manière modifier vos préférences en matière de cookies, vous trouverez ci-dessous les liens vers laide
<ul> nécessaire pour accéder au menu de votre navigateur prévu à cet effet :</p>
<li><a href=\"https://support.google.com/chrome/answer/95647?hl=fr\">Chrome</a></li> <ul>
<li><a href=\"https://support.mozilla.org/fr/kb/activer-desactiver-cookies\">Firefox</a></li> <li><a href="https://support.google.com/chrome/answer/95647?hl=fr">Chrome</a></li>
<li><a href=\"https://support.microsoft.com/fr-fr/help/17442/windows-internet-explorer-delete-manage-cookies#ie=ie-11\">Internet <li><a href="https://support.mozilla.org/fr/kb/activer-desactiver-cookies">Firefox</a></li>
Explorer</a></li> <li><a href="https://support.microsoft.com/fr-fr/help/17442/windows-internet-explorer-delete-manage-cookies#ie=ie-11">Internet
<li><a href=\"http://help.opera.com/Windows/10.20/fr/cookies.html\">Opera</a></li> Explorer</a></li>
<li><a href=\"https://support.apple.com/kb/PH21411?viewlocale=fr_FR&amp;locale=fr_FR\">Safari</a></li> <li><a href="http://help.opera.com/Windows/10.20/fr/cookies.html">Opera</a></li>
</ul> <li><a href="https://support.apple.com/kb/PH21411?viewlocale=fr_FR&amp;locale=fr_FR">Safari</a></li>
<p>Pour de plus amples informations concernant les outils de maîtrise des cookies, vous pouvez consulter le </ul>
<a href=\"https://www.cnil.fr/fr/cookies-les-outils-pour-les-maitriser\">site internet</a> de la CNIL.</p>" <p>Pour de plus amples informations concernant les outils de maîtrise des cookies, vous pouvez consulter le
<a href="https://www.cnil.fr/fr/cookies-les-outils-pour-les-maitriser">site internet</a> de la CNIL.</p>
HTML
setting.save setting.save
end end
@ -644,6 +651,28 @@ unless Setting.find_by(name: 'link_name').try(:value)
setting.save setting.save
end end
unless Setting.find_by(name: 'home_content').try(:value)
setting = Setting.find_or_initialize_by(name: 'home_content')
setting.value = <<~HTML
<div class="row wrapper">
<div id="news">Brève</div>
</div>
<div class="row">
<div class="col-lg-8">
<div id="projects">Derniers projets</div>
</div>
<div class="col-lg-4 m-t-lg">
<div id="twitter">Dernier tweet</div>
<div id="members">Derniers membres</div>
</div>
</div>
<div class="row wrapper m-t-sm">
<div id="events">Prochains événements</div>
</div>
HTML
setting.save
end
if StatisticCustomAggregation.count.zero? if StatisticCustomAggregation.count.zero?
# available reservations hours for machines # available reservations hours for machines
machine_hours = StatisticType.find_by(key: 'hour', statistic_index_id: 2) machine_hours = StatisticType.find_by(key: 'hour', statistic_index_id: 2)

View File

@ -1,33 +1,5 @@
// Credits to: https://github.com/pHAlkaline/summernote-plugins/tree/master/plugins/nugget // Inspired by: https://github.com/pHAlkaline/summernote-plugins/tree/master/plugins/nugget
/*
summernote-nugget
Allow users to insert custom nuggets into the WYSIWYG.
Installation
1) Copy the plugin
You must copy the plugin/nugget folder into your local summernote plugin folder.
2) Configure the plugin
After that, to initialize the template plugin, you have to set these options :
$('#summernote').summernote({
toolbar: [
['insert', ['nugget']]
],
nugget: {
list: [
'[[Condo.name]]',
'[[Condo.title]]'
]
},
});
*
**/
(function (factory) { (function (factory) {
/* global define */ /* global define */
if (typeof define === 'function' && define.amd) { if (typeof define === 'function' && define.amd) {
@ -91,17 +63,17 @@
'nugget': function (context) { 'nugget': function (context) {
// ui has renders to build ui elements. // ui has renders to build ui elements.
// - you can create a button with `ui.button` // - you can create a button with `ui.button`
var ui = $.summernote.ui; const ui = $.summernote.ui;
var options = context.options.nugget; const options = context.options.nugget;
var context_options = context.options; const context_options = context.options;
var lang = context_options.langInfo; const lang = context_options.langInfo;
var defaultOptions = { const defaultOptions = {
label: lang.nugget.Nugget, label: lang.nugget.Nugget,
tooltip: lang.nugget.Insert_nugget tooltip: lang.nugget.Insert_nugget
}; };
// Assign default values if not supplied // Assign default values if not supplied
for (var propertyName in defaultOptions) { for (const propertyName in defaultOptions) {
if (options.hasOwnProperty(propertyName) === false) { if (options.hasOwnProperty(propertyName) === false) {
options[propertyName] = defaultOptions[propertyName]; options[propertyName] = defaultOptions[propertyName];
} }
@ -111,7 +83,7 @@
context.memo('button.nugget', function () { context.memo('button.nugget', function () {
// create button // create button
var button = ui.buttonGroup([ const button = ui.buttonGroup([
ui.button({ ui.button({
className: 'dropdown-toggle', className: 'dropdown-toggle',
contents: '<span class="nugget">' + options.label + ' </span><span class="note-icon-caret"></span>', contents: '<span class="nugget">' + options.label + ' </span><span class="note-icon-caret"></span>',
@ -122,15 +94,22 @@
}), }),
ui.dropdown({ ui.dropdown({
className: 'dropdown-nugget', className: 'dropdown-nugget',
items: options.list, contents: options.list.map((i) => {
const li = document.createElement('li');
const a = document.createElement('a');
a.innerHTML = i.trim();
a.setAttribute('href', '#');
li.appendChild(a);
return li.outerHTML;
}),
click: function (event) { click: function (event) {
event.preventDefault(); event.preventDefault();
var $button = $(event.target); const $button = $(event.target);
var value = $button.data('value'); const value = $button[0].outerHTML;
var node = document.createElement('span'); const node = document.createElement('div');
node.innerHTML = value; node.innerHTML = value.trim();
context.invoke('editor.insertText', value); context.invoke('editor.insertNode', node.firstChild);
} }
}) })