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:
parent
b1e6154cc9
commit
b85c7ac00b
@ -12,8 +12,8 @@
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
Application.Controllers.controller('SettingsController', ['$scope', '$rootScope', '$filter', '$uibModal', '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) {
|
||||
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, dialogs, Setting, growl, settingsPromise, privacyDraftsPromise, cgvFile, cguFile, logoFile, logoBlackFile, faviconFile, profileImageFile, CSRF, _t) {
|
||||
/* PUBLIC SCOPE */
|
||||
|
||||
// timepickers steps configuration
|
||||
@ -140,10 +140,14 @@ Application.Controllers.controller('SettingsController', ['$scope', '$rootScope'
|
||||
$scope.summernoteOptsHomePage = Object.assign({}, $rootScope.summernoteOpts);
|
||||
$scope.summernoteOptsHomePage.toolbar[5][1].push('nugget'); // toolbar -> insert -> nugget
|
||||
$scope.summernoteOptsHomePage.nugget = {
|
||||
label: "🧱",
|
||||
tooltip: "blabla",
|
||||
label: '\uF12E',
|
||||
tooltip: _t('app.admin.settings.home_items'),
|
||||
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 */
|
||||
|
||||
/**
|
||||
|
@ -1006,7 +1006,7 @@ angular.module('application.router', ['ui.router'])
|
||||
'fablab_name', 'name_genre', 'reminder_enable', \
|
||||
'reminder_delay', 'visibility_yearly', 'visibility_others', \
|
||||
'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; }],
|
||||
cguFile: ['CustomAsset', function (CustomAsset) { return CustomAsset.get({ name: 'cgu-file' }).$promise; }],
|
||||
|
@ -15,6 +15,11 @@ Application.Services.factory('Setting', ['$resource', function ($resource) {
|
||||
},
|
||||
query: {
|
||||
isArray: false
|
||||
},
|
||||
reset: {
|
||||
url: '/api/settings/reset/:name',
|
||||
params: { name: '@name' },
|
||||
method: 'PUT'
|
||||
}
|
||||
}
|
||||
);
|
||||
|
44
app/assets/stylesheets/modules/settings.scss
Normal file
44
app/assets/stylesheets/modules/settings.scss
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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="row">
|
||||
<div class="col-md-12">
|
||||
<div class="col-md-12 home-page-content">
|
||||
<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"
|
||||
id="home_content"
|
||||
config="summernoteOptsHomePage">
|
||||
|
@ -14,7 +14,7 @@
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="m-lg">
|
||||
<section class="m-lg admin-settings">
|
||||
<div class="row">
|
||||
|
||||
<div class="col-md-12">
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
# API Controller for resources of type Setting
|
||||
class API::SettingsController < API::ApiController
|
||||
before_action :authenticate_user!, only: :update
|
||||
before_action :authenticate_user!, only: %i[update bulk_update reset]
|
||||
|
||||
def index
|
||||
@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?
|
||||
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
|
||||
|
||||
def setting_params
|
||||
|
@ -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
|
||||
has_many :history_values
|
||||
validates :name, inclusion:
|
||||
@ -65,7 +70,8 @@ class Setting < ActiveRecord::Base
|
||||
hub_last_version
|
||||
hub_public_key
|
||||
fab_analytics
|
||||
link_name] }
|
||||
link_name
|
||||
home_content] }
|
||||
|
||||
after_update :update_stylesheet, :notify_privacy_policy_changed if :value_changed?
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
# Check the access policies for API::SettingsController
|
||||
class SettingPolicy < ApplicationPolicy
|
||||
%w[update bulk_update].each do |action|
|
||||
%w[update bulk_update reset].each do |action|
|
||||
define_method "#{action}?" do
|
||||
user.admin?
|
||||
end
|
||||
|
@ -928,6 +928,18 @@ fr:
|
||||
space_explications_alert: "l'explication sur la page de réservation d'un espace"
|
||||
main_color: "la couleur principale"
|
||||
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"
|
||||
twitter_name: "nom du flux Twitter"
|
||||
link_name: "l'intitulé du lien vers la page \"À propos\""
|
||||
|
@ -47,6 +47,7 @@ Rails.application.routes.draw do
|
||||
resources :admins, only: %i[index create destroy]
|
||||
resources :settings, only: %i[show update index], param: :name do
|
||||
patch '/bulk_update', action: 'bulk_update', on: :collection
|
||||
put '/reset/:name', action: 'reset', on: :collection
|
||||
end
|
||||
resources :users, only: %i[index create]
|
||||
resources :members, only: %i[index show create update destroy] do
|
||||
|
73
db/seeds.rb
73
db/seeds.rb
@ -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" \
|
||||
" 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",
|
||||
slug: 'petite-fraiseuse' },
|
||||
slug: 'petite-fraiseuse' }
|
||||
])
|
||||
|
||||
Price.all.each do |p|
|
||||
@ -294,13 +294,18 @@ end
|
||||
|
||||
unless Setting.find_by(name: 'subscription_explications_alert').try(:value)
|
||||
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>' \
|
||||
' <span style=\"font-size: 1.6rem; line-height: 2.4rem;\">Si vous êtes un nouvel utilisateur - i.e aucune ' \
|
||||
" formation d'enregistrée sur le site - votre abonnement débutera à la date de réservation de votre première " \
|
||||
' formation.</span><br></li><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><p></p>'
|
||||
setting.value = <<~HTML
|
||||
<p><b>Règle sur la date de début des abonnements</b></p>
|
||||
<ul>
|
||||
<li><span style=\"font-size: 1.6rem; line-height: 2.4rem;\">Si vous êtes un nouvel utilisateur - i.e aucune
|
||||
formation d'enregistrée sur le site - votre abonnement débutera à la date de réservation de votre première
|
||||
formation.</span></li>
|
||||
<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
|
||||
end
|
||||
|
||||
@ -495,7 +500,8 @@ end
|
||||
|
||||
unless Setting.find_by(name: 'privacy_draft').try(:value)
|
||||
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
|
||||
<p>La présente politique de confidentialité définit et vous informe de la manière dont _________ utilise et protège les
|
||||
informations que vous nous transmettez, le cas échéant, lorsque vous utilisez le présent site accessible à partir de l’URL suivante :
|
||||
_________ (ci-après le « Site »).</p><p>Veuillez noter que cette politique de confidentialité est susceptible d’être modifiée ou
|
||||
complétée à tout moment par _________, notamment en vue de se conformer à toute évolution législative, réglementaire, jurisprudentielle
|
||||
@ -534,7 +540,7 @@ unless Setting.find_by(name: 'privacy_draft').try(:value)
|
||||
sera en droit, le cas échéant, de s’opposer aux demandes manifestement abusives (de par leur nombre, leur caractère répétitif ou
|
||||
systématique).</p><p>Pour vous aider dans votre démarche, notamment si vous désirez exercer votre droit d’accès par le biais d’une
|
||||
demande écrite à l’adresse postale mentionnée au point 1, vous trouverez en cliquant sur le <a
|
||||
href=\"https://www.cnil.fr/fr/modele/courrier/exercer-son-droit-dacces\">lien</a> suivant un modèle de courrier élaboré par la Commission
|
||||
href="https://www.cnil.fr/fr/modele/courrier/exercer-son-droit-dacces">lien</a> suivant un modèle de courrier élaboré par la Commission
|
||||
Nationale de l’Informatique et des Libertés (la « CNIL »).</p><p><b>o Droit de rectification des données</b></p><p>Au titre de ce droit,
|
||||
la législation vous habilite à demander la rectification, la mise à jour, le verrouillage ou encore l’effacement des données vous
|
||||
concernant qui peuvent s’avérer le cas échéant inexactes, erronées, incomplètes ou obsolètes.</p><p>Egalement, vous pouvez définir des
|
||||
@ -542,13 +548,13 @@ unless Setting.find_by(name: 'privacy_draft').try(:value)
|
||||
d’une 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.
|
||||
</p><p>Pour vous aider dans votre démarche, notamment si vous désirez exercer, pour votre propre compte ou pour le compte de l’un de vos
|
||||
proches défunt, votre droit de rectification par le biais d’une demande écrite à l’adresse postale mentionnée au point 1, vous trouverez
|
||||
en cliquant sur le <a href=\"https://www.cnil.fr/fr/modele/courrier/rectifier-des-donnees-inexactes-obsoletes-ou-perimees\">lien</a>
|
||||
en cliquant sur le <a href="https://www.cnil.fr/fr/modele/courrier/rectifier-des-donnees-inexactes-obsoletes-ou-perimees">lien</a>
|
||||
suivant un modèle de courrier élaboré par la CNIL.</p><p><b>o Droit d’opposition</b></p><p>L’exercice de ce droit n’est possible que dans
|
||||
l’une des deux situations suivantes :</p><p>Lorsque l’exercice de ce droit est fondé sur des motifs légitimes ; ou</p><p>Lorsque
|
||||
l’exercice de ce droit vise à faire obstacle à ce que les données recueillies soient utilisées à des fins de prospection commerciale.</p>
|
||||
<p>Pour vous aider dans votre démarche, notamment si vous désirez exercer votre droit d’opposition par le biais d’une demande écrite
|
||||
adressée à l’adresse postale indiquée au point 1, vous trouverez en cliquant sur le <a
|
||||
href=\"https://www.cnil.fr/fr/modele/courrier/supprimer-des-informations-vous-concernant-dun-site-internet\">lien</a> suivant un modèle de
|
||||
href="https://www.cnil.fr/fr/modele/courrier/supprimer-des-informations-vous-concernant-dun-site-internet">lien</a> suivant un modèle de
|
||||
courrier élaboré par la CNIL.</p><h4>6. Délais de réponse</h4><p> _________ s’engage à répondre à votre demande d’accès, de rectification
|
||||
ou d’opposition ou toute autre demande complémentaire d’informations dans un délai raisonnable qui ne saurait dépasser 1 mois à compter
|
||||
de la réception de votre demande.</p><h4>7. Prestataires habilités et transfert vers un pays tiers de l’Union Européenne</h4><p>_________
|
||||
@ -561,7 +567,7 @@ unless Setting.find_by(name: 'privacy_draft').try(:value)
|
||||
en (année d'approbation) _________.</p><h4>8. Plainte auprès de l’autorité compétente</h4><p>Si vous considérez que _________ ne
|
||||
respecte pas ses obligations au regard de vos Informations Personnelles, vous pouvez adresser une plainte ou une demande auprès de
|
||||
l’autorité compétente. En France, l’autorité compétente est la CNIL à laquelle vous pouvez adresser une demande par voie électronique en
|
||||
cliquant sur le lien suivant : <a href=\"https://www.cnil.fr/fr/plaintes/internet\">https://www.cnil.fr/fr/plaintes/internet</a>.</p>
|
||||
cliquant sur le lien suivant : <a href="https://www.cnil.fr/fr/plaintes/internet">https://www.cnil.fr/fr/plaintes/internet</a>.</p>
|
||||
<h3>II. POLITIQUE RELATIVE AUX COOKIES</h3><p>Lors de votre première connexion sur le site web de _________, vous êtes avertis par un
|
||||
bandeau en bas de votre écran que des informations relatives à votre navigation sont susceptibles d’être enregistrées dans des fichiers
|
||||
dénommés « cookies ». Notre politique d’utilisation des cookies vous permet de mieux comprendre les dispositions que nous mettons en œuvre
|
||||
@ -590,8 +596,8 @@ unless Setting.find_by(name: 'privacy_draft').try(:value)
|
||||
par voie électronique. Il s’agit des cookies suivants :</p><p><b>o Identifiant de session</b> et <b>authentification</b> sur l'API.
|
||||
Ces cookies sont intégralement soumis à la présente politique dans la mesure où ils sont émis et gérés par _________.</p><p>
|
||||
<b>o Stripe</b>, permettant de gérer les paiements par carte bancaire et dont la politique de confidentialité est accessible sur ce
|
||||
<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
|
||||
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
|
||||
dont la politique de confidentialité est accessible sur ce <a href="https://help.disqus.com/articles/1717103-disqus-privacy-policy">lien
|
||||
</a>.</p><h4>b. Les cookies nécessitant le recueil préalable de votre consentement</h4><p>Cette
|
||||
exigence concerne les cookies émis par des tiers et qui sont qualifiés de « persistants » dans la mesure où ils demeurent dans votre
|
||||
terminal jusqu’à leur effacement ou leur date d’expiration.</p><p>De tels cookies étant émis par des tiers, leur utilisation et leur dépôt
|
||||
@ -600,7 +606,7 @@ unless Setting.find_by(name: 'privacy_draft').try(:value)
|
||||
fréquentation et l’utilisation de divers éléments du site web (comme les contenus/pages que vous avez visité).
|
||||
Ces données participent à l’amélioration de l’ergonomie du site web de _________. Un outil de mesure d’audience est utilisé sur le
|
||||
présent site internet :</p><p><b>o Google Analytics</b> pour gérer les statistiques de visites dont la politique de
|
||||
confidentialité est disponible (uniquement en anglais) à partir du <a href=\"https://policies.google.com/privacy?hl=fr&gl=ZZ\">lien
|
||||
confidentialité est disponible (uniquement en anglais) à partir du <a href="https://policies.google.com/privacy?hl=fr&gl=ZZ">lien
|
||||
</a> suivant. </p><h4>c. Vous disposez de divers outils de paramétrage des cookies</h4><p>La plupart
|
||||
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
|
||||
l’opportunité de modifier ces paramètres standards de manière à ce que l’ensemble des cookies soit rejeté systématiquement ou bien à ce
|
||||
@ -618,15 +624,16 @@ unless Setting.find_by(name: 'privacy_draft').try(:value)
|
||||
cookies. Pour savoir de quelle manière modifier vos préférences en matière de cookies, vous trouverez ci-dessous les liens vers l’aide
|
||||
nécessaire pour accéder au menu de votre navigateur prévu à cet effet :</p>
|
||||
<ul>
|
||||
<li><a href=\"https://support.google.com/chrome/answer/95647?hl=fr\">Chrome</a></li>
|
||||
<li><a href=\"https://support.mozilla.org/fr/kb/activer-desactiver-cookies\">Firefox</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.google.com/chrome/answer/95647?hl=fr">Chrome</a></li>
|
||||
<li><a href="https://support.mozilla.org/fr/kb/activer-desactiver-cookies">Firefox</a></li>
|
||||
<li><a href="https://support.microsoft.com/fr-fr/help/17442/windows-internet-explorer-delete-manage-cookies#ie=ie-11">Internet
|
||||
Explorer</a></li>
|
||||
<li><a href=\"http://help.opera.com/Windows/10.20/fr/cookies.html\">Opera</a></li>
|
||||
<li><a href=\"https://support.apple.com/kb/PH21411?viewlocale=fr_FR&locale=fr_FR\">Safari</a></li>
|
||||
<li><a href="http://help.opera.com/Windows/10.20/fr/cookies.html">Opera</a></li>
|
||||
<li><a href="https://support.apple.com/kb/PH21411?viewlocale=fr_FR&locale=fr_FR">Safari</a></li>
|
||||
</ul>
|
||||
<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>"
|
||||
<a href="https://www.cnil.fr/fr/cookies-les-outils-pour-les-maitriser">site internet</a> de la CNIL.</p>
|
||||
HTML
|
||||
setting.save
|
||||
end
|
||||
|
||||
@ -644,6 +651,28 @@ unless Setting.find_by(name: 'link_name').try(:value)
|
||||
setting.save
|
||||
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?
|
||||
# available reservations hours for machines
|
||||
machine_hours = StatisticType.find_by(key: 'hour', statistic_index_id: 2)
|
||||
|
@ -1,33 +1,5 @@
|
||||
// Credits to: https://github.com/pHAlkaline/summernote-plugins/tree/master/plugins/nugget
|
||||
/*
|
||||
summernote-nugget
|
||||
// Inspired by: https://github.com/pHAlkaline/summernote-plugins/tree/master/plugins/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) {
|
||||
/* global define */
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
@ -91,17 +63,17 @@
|
||||
'nugget': function (context) {
|
||||
// ui has renders to build ui elements.
|
||||
// - you can create a button with `ui.button`
|
||||
var ui = $.summernote.ui;
|
||||
var options = context.options.nugget;
|
||||
var context_options = context.options;
|
||||
var lang = context_options.langInfo;
|
||||
var defaultOptions = {
|
||||
const ui = $.summernote.ui;
|
||||
const options = context.options.nugget;
|
||||
const context_options = context.options;
|
||||
const lang = context_options.langInfo;
|
||||
const defaultOptions = {
|
||||
label: lang.nugget.Nugget,
|
||||
tooltip: lang.nugget.Insert_nugget
|
||||
};
|
||||
|
||||
// Assign default values if not supplied
|
||||
for (var propertyName in defaultOptions) {
|
||||
for (const propertyName in defaultOptions) {
|
||||
if (options.hasOwnProperty(propertyName) === false) {
|
||||
options[propertyName] = defaultOptions[propertyName];
|
||||
}
|
||||
@ -111,7 +83,7 @@
|
||||
context.memo('button.nugget', function () {
|
||||
// create button
|
||||
|
||||
var button = ui.buttonGroup([
|
||||
const button = ui.buttonGroup([
|
||||
ui.button({
|
||||
className: 'dropdown-toggle',
|
||||
contents: '<span class="nugget">' + options.label + ' </span><span class="note-icon-caret"></span>',
|
||||
@ -122,15 +94,22 @@
|
||||
}),
|
||||
ui.dropdown({
|
||||
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) {
|
||||
event.preventDefault();
|
||||
|
||||
var $button = $(event.target);
|
||||
var value = $button.data('value');
|
||||
var node = document.createElement('span');
|
||||
node.innerHTML = value;
|
||||
context.invoke('editor.insertText', value);
|
||||
const $button = $(event.target);
|
||||
const value = $button[0].outerHTML;
|
||||
const node = document.createElement('div');
|
||||
node.innerHTML = value.trim();
|
||||
context.invoke('editor.insertNode', node.firstChild);
|
||||
|
||||
}
|
||||
})
|
||||
|
Loading…
x
Reference in New Issue
Block a user