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

Merge branch 'dev' into staging

This commit is contained in:
Du Peng 2024-01-02 10:15:54 +01:00
commit 92fb201c74
284 changed files with 8398 additions and 997 deletions

3
.gitignore vendored
View File

@ -77,3 +77,6 @@ yarn-debug.log*
/yarn-error.log
yarn-debug.log*
.yarn-integrity
*.sql
*.tar.gz

View File

@ -1,12 +1,118 @@
# Changelog Fab-manager
## next deploy
## v6.3.8 2023 December 29
- Fix a bug: unable to build docker image
## v6.3.7 2023 December 28
- Fix a bug: unable to show wallet payment mean for invoice
- Fix a bug: PayZen amount of subscription compute error for Coupon validity per user = forever
- Fix a bug: unable to create Stripe coupon with duration = forever
- improvement: remove show_username_in_admin_list setting
- improvement: show invoice payment method in accounting line
- [TODO DEPLOY] `rails fablab:setup:build_accounting_lines`
- [TODO DEPLOY] `rails fablab:fix:stripe_coupon_duration`
## v6.3.6 2023 December 6
- fix a bug: fix event service
- updates translations
## v6.3.5 2023 December 4
- fix a bug: user was not able to reserve at the same time of an event with pre-registration invalidated
- fix a bug: avoids crash if invoicing_profile has no address associated to it
- improvement: improves how pay_zen transactions are matched with payment_schedule_items
- improvement: improves rrule of pay_zen subscriptions
- improvement: better text contrast on customizable colors. Good for accessibility.
- Improvement: set the number of new attempts available in case the payment is rejected to 1 for PayZen
## v6.3.4 2023 November 23
- fix a bug: wrong amount when pay a reservation with payment schedule
- fix a bug: regression on PaymentScheduleItemWorker from v6.3.2
- fix a bug: event.pre_registration_end_date (was set to beginning_of_day instead of end_of_day)
## v6.3.3 2023 November 14
- fix a bug: wrong currency unit for locale fr-CH
## v6.3.2 2023 November 14
- updates sidekiq and sidekiq-scheduler
- fix a bug: wrong locale was causing wrong currency in cron jobs, now we manually set the currency locale in number_to_currency
## v6.3.1 2023 November 10
- Fix a bug: statistic_sub_type.label of plan was nil
- adds a migrations to fix all statistic_sub_types of plans having label = nil
- Fix a bug: unable to show wallet payment mean for avoir
- updates spanish translations and adds translations
- Fix a bug: avoids crash due to oidc config with scope = nil
- Fix a bug: unable to see value for input group with long label on eventModal
- Improvement: when deleting an event, all reservations are canceled
- Improvement: replace original image by large generated version (event, machine, space, training)
## v6.3.0 2023 November 3
- Fix a bug: fix all failing tasks of rake task file chain.rake
- Fix a bug: file_size_validator.rb was broken since ruby v3, see https://github.com/rails/rails/issues/41270
- improvement: pre-registration event reservations limit places
- improvement: add including_deleted_users param for open api users
- decreases sidekiq concurrency from 25 to 5, 25 is too much and consumes memory for nothing
- do not log Notifications#polling action anymore, by default, can be enable via env variable ENABLE_NOTIFICATIONS_POLLING_LOGGING=true
- Fix a bug: api/products/index bug when sorting by amount
- adds a rake task to regenerate invoices by ids (see maintenance.rake)
- Fix a bug: replaces custom ServerLocale middleware with sidekiq i18n middleware
- adds a rake task to erase all reservations and invoices (fablab:maintenance:delete_all_reservations_and_invoices)
- improvement: dynamic label (i18n) for stats structure tables
- [TODO DEPLOY] upgrade to v6.2.0 BEFORE upgrading to v6.3.0 !!!
## v6.2.0 2023 October 13
- Fix a bug: fix ReservationReminderWorker, was sending reservation reminder to users with a event reservation not validated by admin + adds tests for all scenarios
- Fix a bug: admin could not create new SupportingDocumentType (problem was on js side)
- Fix a bug: fix back button on space edit page
- Fix a bug: fix members tour (help), a selector was not valid anymore
- Fix a bug: unable to save OpenID extra_authorize_params as json
- Fix machine list bug : when there is no user logged in and access machines list with at least one machine associated to a space
- [TODO DEPLOY] `rails db:seed`
## v6.1.2 2023 October 2
- Fix a bug: minor pb (exception raised) when bot hit api/projects#search without being authenticated
- Fix a bug: minor pb (exception raised) when a bot or unauthenticated user hit api/auth_providers actions
- Fix a bug: when calling .to_json on an "avoir", there was a bug because order_number delegates on invoice which can be nil, it was causing errors in notifications rendering
- Fix a bug: when getting status of users/subscriptions export
- improvement : adds/edit spanish translations
## v6.1.1 2023 September 28
- Fix a bug: unable to sync projects with openprojects
- Fix a bug: public availabilities (no user) was buggy (server error)
- Fix a bug: unable to generate statistic
- Fix a bug: rss/projects was failing with project without image
- improvement : performance of members#show and reservations#index
- [TODO DEPLOY] `rails fablab:openlab:bulk_export`
- [TODO DEPLOY] `rails fablab:openlab:bulk_update`
- [TODO DEPLOY] `rails fablab:maintenance:regenerate_statistics[2023,9]`
## v6.1.0 2023 September 25
- improves api/notification controller to avoid failing when there is a notification with wrong notification_type in db
- Add extra_authorize_params to OpenIdConnect config
- Improvement : add a notification to remind users to upload their supporting documents
- Cancel payment schedule subscription after update the payment mean
- admin can see reservations of a member
- Fix a bug: unable to update card for payment schedule
- Fix a bug: user is_allow_contact is active by default
- Fix a bug: unable to export projects
- Fix a bug: unable to update card bank of payment schedule
- Feature: family compte for event
- Feature: pre-registration event
- [TODO DEPLOY] `rails db:seed`
## v6.0.14 2023 September 6
@ -68,7 +174,7 @@
- Improved projects list filter
- Fix a bug: unable to refresh machine/space/training calender after pay an reservation
- Fix a bug: Accouning Line in duplicate
- Fix a bug: Accounting Line in duplicate
- Fix a bug: displays "my orders" link only if store module is active
- [TODO DEPLOY] `rails fablab:setup:build_accounting_lines`
@ -77,7 +183,7 @@
- Fix a bug: OpenAPI accounting gateway_object_id missing error
- Fix a bug: unable to modify the price of prepaid pack
- Fix a bug: notification type missing
- Fix critical bug: Incorrect amount calculation when paying monthly subcription with a wallet for PayZen
- Fix critical bug: Incorrect amount calculation when paying monthly subscription with a wallet for PayZen
## v6.0.6 2023 May 4
@ -168,7 +274,7 @@
- Ability to restrict machine availabilities per plan
- Ability to configure a prior period for each reservation type to prevent booking (#440)
- Admins cannot select the date when creating a refund invoice anymore
- Fix a bug: JS date is initalialized 1 day before in negative timezones (#445)
- Fix a bug: JS date is initialized 1 day before in negative timezones (#445)
- Fix a bug: user's profile field gender is now marked as required
- Fix a bug: logical sequence of invoices references is broken, when using the store module or the payments schedules
- Fix a bug: refund invoices may generate duplicates in invoices references
@ -204,11 +310,11 @@
- OpenAPI reservation endpoint will return details for the reserved slots
- Display info messages if the user cannot buy prepaid packs
- Fix a bug: some OpenAPI endpoints struggle and expire with timeout
- Fix a bug: OpenAPI events endpoint documentation does not refect the returned data
- Fix a bug: OpenAPI events endpoint documentation does not reflect the returned data
- Fix a bug: members can't change/cancel their reservations
- Fix a bug: admin events view should default to the list tab
- Fix a bug: event creation form should not allow setting multiple times the same price category
- Fix a bug: MAX_SIZE env varibles should not be quoted (#438)
- Fix a bug: MAX_SIZE env variables should not be quoted (#438)
- Fix a bug: unable to add OIDC scopes without discovery
- [BREAKING CHANGE] GET `open_api/v1/events` will necessarily be paginated
- [BREAKING CHANGE] GET `open_api/v1/invoices` will necessarily be paginated
@ -247,7 +353,7 @@
- Automatically cancel trainings with insufficient attendees
- Check SCSS syntax before saving home page style
- Use Time instead of DateTime objects
- Fix a bug: missing statististics subtypes
- Fix a bug: missing statistics subtypes
- Fix a bug: wrong times in admin/event monitoring
- Fix a bug: daylight saving time is ignored and result in wrong dates and/or times when dealing around the DST day
- Fix a bug: date shift in event creation/update
@ -282,7 +388,7 @@
- Fix a bug: invalid duration for machine/spaces reservations in statistics, when using slots of not 1 hour
- Fix a bug: invalid month in date format
- Fix a bug: do not show theme and age-range fields in event form if no options were set
- Fix a bug: do not show catgory select in plan form if no options were set
- Fix a bug: do not show category select in plan form if no options were set
- Fix a bug: new setups doesn't log
- [TODO DEPLOY] `rails db:seed`
- [TODO DEPLOY] `rails fablab:es:build_stats` THEN `rails fablab:maintenance:regenerate_statistics[2014,1]`
@ -321,7 +427,7 @@
## v5.6.3 2023 January 9
- Fix a bug: unable to build the docker image (yarn error extracting tar content of undefined failed)
- Fix a security issue: logged users but non-admins can access to analytics data throught the API
- Fix a security issue: logged users but non-admins can access to analytics data through the API
## v5.6.2 2023 January 9
@ -363,7 +469,7 @@
- OpenAPI endpoint to fetch accounting data
- Add reservation deadline parameter (#414)
- Verify current password at server side when changing password
- Password strengh indicator
- Password strength indicator
- Updated OpenAPI documentation
- Updated OpenID Connect documentation
- OpenAPI users endpoint offer ability to filter by created_after
@ -371,7 +477,7 @@
- Default accounting codes and labels if not set
- Active serving static files from the `/public` folder by default from rails
- Display custom error message if the PDF invoice is not found
- Report subsription mismatch with user's group
- Report subscription mismatch with user's group
- Added sentry for error reporting
- Report details of the due for invoices related to a payment schedule
- Migrated plan/machine/space/event forms to react

View File

@ -26,7 +26,8 @@ RUN apk update && apk upgrade && \
libsass-dev \
libsass \
libc6-compat \
libidn-dev && \
libidn-dev \
shared-mime-info && \
# Install buildtime apk dependencies
apk add --update --no-cache --virtual .build-deps \
alpine-sdk \

View File

@ -91,9 +91,9 @@ gem 'friendly_id', '~> 5.1.0'
gem 'aasm'
# Background job processing
gem 'sidekiq', '>= 6.0.7'
gem 'sidekiq', '6.5.12'
# Recurring jobs for Sidekiq
gem 'sidekiq-scheduler'
gem 'sidekiq-scheduler', '5.0.3'
gem 'sidekiq-unique-jobs', '~> 7.1.23'
gem 'stripe', '5.29.0'
@ -153,3 +153,4 @@ gem 'sentry-ruby'
gem "reverse_markdown"
gem "ancestry"
gem 'silencer', require: false

View File

@ -125,7 +125,7 @@ GEM
coercible (1.0.0)
descendants_tracker (~> 0.0.1)
concurrent-ruby (1.2.2)
connection_pool (2.2.5)
connection_pool (2.4.1)
coveralls_reborn (0.18.0)
simplecov (>= 0.18.1, < 0.20.0)
term-ansicolor (~> 1.6)
@ -182,7 +182,7 @@ GEM
forgery (0.7.0)
friendly_id (5.1.0)
activerecord (>= 4.0.0)
fugit (1.5.3)
fugit (1.9.0)
et-orbi (~> 1, >= 1.2.7)
raabro (~> 1.4)
globalid (1.1.0)
@ -428,7 +428,7 @@ GEM
nokogiri (>= 1.10.8)
rubyzip (>= 1.3.0)
rubyzip (2.3.2)
rufus-scheduler (3.8.1)
rufus-scheduler (3.9.1)
fugit (~> 1.1, >= 1.1.6)
safe_yaml (1.0.5)
sassc (2.4.0)
@ -448,20 +448,20 @@ GEM
rack-proxy (>= 0.6.1)
railties (>= 5.2)
semantic_range (>= 2.3.0)
sidekiq (6.4.2)
connection_pool (>= 2.2.2)
sidekiq (6.5.12)
connection_pool (>= 2.2.5, < 3)
rack (~> 2.0)
redis (>= 4.2.0)
sidekiq-scheduler (4.0.0)
redis (>= 4.2.0)
redis (>= 4.5.0, < 5)
sidekiq-scheduler (5.0.3)
rufus-scheduler (~> 3.2)
sidekiq (>= 4)
sidekiq (>= 6, < 8)
tilt (>= 1.4.0)
sidekiq-unique-jobs (7.1.23)
brpoplpush-redis_script (> 0.1.1, <= 2.0.0)
concurrent-ruby (~> 1.0, >= 1.0.5)
sidekiq (>= 5.0, < 8.0)
thor (>= 0.20, < 3.0)
silencer (2.0.0)
simplecov (0.19.0)
docile (~> 1.1)
simplecov-html (~> 0.11)
@ -483,7 +483,7 @@ GEM
tins (~> 1.0)
thor (1.2.1)
thread_safe (0.3.6)
tilt (2.0.10)
tilt (2.3.0)
timeout (0.3.2)
tins (1.25.0)
sync
@ -532,6 +532,7 @@ GEM
PLATFORMS
x86_64-darwin-20
x86_64-darwin-21
x86_64-darwin-23
x86_64-linux
DEPENDENCIES
@ -608,9 +609,10 @@ DEPENDENCIES
sentry-ruby
sha3
shakapacker (= 6.6.0)
sidekiq (>= 6.0.7)
sidekiq-scheduler
sidekiq (= 6.5.12)
sidekiq-scheduler (= 5.0.3)
sidekiq-unique-jobs (~> 7.1.23)
silencer
spring (~> 4)
spring-watcher-listen (~> 2.1.0)
stripe (= 5.29.0)

View File

@ -3,7 +3,9 @@
# API Controller for resources of type AuthProvider
# AuthProvider are used to connect users through single-sign on systems
class API::AuthProvidersController < API::APIController
before_action :authenticate_user!
before_action :set_provider, only: %i[show update destroy]
def index
@providers = policy_scope(AuthProvider)
end

View File

@ -67,7 +67,7 @@ class API::MembersController < API::APIController
def export_subscriptions
authorize :export
export = ExportService.last_export('users/subscription')
export = ExportService.last_export('users/subscriptions')
if export.nil? || !FileTest.exist?(export.file)
@export = Export.new(category: 'users', export_type: 'subscriptions', user: current_user)
if @export.save

View File

@ -52,9 +52,9 @@ class API::NotificationsController < API::APIController
def polling
@notifications = current_user.notifications
.with_valid_notification_type
.where('notifications.is_read = false AND notifications.created_at >= :date', date: params[:last_poll])
.order('notifications.created_at DESC')
.with_valid_notification_type
.where('notifications.is_read = false AND notifications.created_at >= :date', date: params[:last_poll])
.order('notifications.created_at DESC')
@totals = {
total: current_user.notifications.with_valid_notification_type.delivered_in_system(current_user).count,
unread: current_user.notifications.with_valid_notification_type.delivered_in_system(current_user).where(is_read: false).count

View File

@ -71,7 +71,7 @@ class API::ProjectsController < API::APIController
render :index
end
format.zip do
head :forbidden unless current_user.admin? || current_user.manager?
head :forbidden unless current_user && (current_user.admin? || current_user.manager?)
send_data ProjectsArchive.new(res[:projects]).call, filename: "projets.zip", disposition: 'attachment', type: 'application/zip'
end

View File

@ -16,8 +16,10 @@ class API::ReservationsController < API::APIController
where_clause[:reservable_id] = params[:reservable_id] if params[:reservable_id]
@reservations = Reservation.where(where_clause)
.preload(:reservable, :booking_users, :tickets, { statistic_profile: { user: :profile }, slots_reservations: :slot })
elsif params[:reservable_id] && params[:reservable_type] && (current_user.admin? || current_user.manager?)
@reservations = Reservation.where(params.permit(:reservable_id, :reservable_type))
.preload(:reservable, :booking_users, :tickets, { statistic_profile: { user: :profile }, slots_reservations: :slot })
else
@reservations = []
end

View File

@ -7,7 +7,9 @@ class OpenAPI::V1::UsersController < OpenAPI::V1::BaseController
expose_doc
def index
@users = User.order(created_at: :desc).includes(:group, :profile, :invoicing_profile)
@users = InvoicingProfile.order(created_at: :desc).includes(user: %i[group profile statistic_profile])
@users = @users.where.not(user_id: nil) if params[:including_deleted_users].blank?
if params[:email].present?
email_param = params[:email].is_a?(String) ? params[:email].downcase : params[:email].map(&:downcase)

View File

@ -18,6 +18,7 @@ class OpenAPI::V1::UsersDoc < OpenAPI::V1::BaseDoc
param :email, [String, Array], optional: true, desc: 'Filter users by *email* using strict matching.'
param :user_id, [Integer, Array], optional: true, desc: 'Filter users by *id* using strict matching.'
param :created_after, DateTime, optional: true, desc: 'Filter users to accounts created after the given date.'
param :including_deleted_users, [true, false], optional: true, desc: 'Filter users to accounts deleted or not.'
example <<-USERS
# /open_api/v1/users?page=1&per_page=4
{

View File

@ -103,7 +103,7 @@ export const EventForm: React.FC<EventFormProps> = ({ action, event, onError, on
const onSubmit: SubmitHandler<Event> = (data: Event) => {
setSubmitting(true);
if (submitting) return;
if (data.pre_registration_end_date?.toString() === 'Invalid Date') {
if (data.pre_registration_end_date?.toString() === 'Invalid Date' || !data.pre_registration) {
data.pre_registration_end_date = null;
}
if (action === 'update') {
@ -218,7 +218,8 @@ export const EventForm: React.FC<EventFormProps> = ({ action, event, onError, on
id="event_image_attributes"
accept="image/*"
defaultImage={output.event_image_attributes}
label={t('app.admin.event_form.matching_visual')} />
label={t('app.admin.event_form.illustration')}
tooltip={t('app.admin.event_form.illustration_recommendation')} />
<FormRichText control={control}
id="description"
rules={{ required: true }}

View File

@ -28,7 +28,7 @@ type FormImageUploadProps<TFieldValues, TContext extends object> = FormComponent
/**
* This component allows to upload image, in forms managed by react-hook-form.
*/
export const FormImageUpload = <TFieldValues extends FieldValues, TContext extends object>({ id, label, register, control, defaultImage, className, rules, disabled, error, warning, formState, onFileChange, onFileRemove, accept, setValue, size, onFileIsMain, mainOption = false }: FormImageUploadProps<TFieldValues, TContext>) => {
export const FormImageUpload = <TFieldValues extends FieldValues, TContext extends object>({ id, label, register, control, defaultImage, className, rules, disabled, error, warning, formState, onFileChange, onFileRemove, accept, setValue, size, onFileIsMain, mainOption = false, tooltip }: FormImageUploadProps<TFieldValues, TContext>) => {
const { t } = useTranslation('shared');
const [file, setFile] = useState<ImageType>(defaultImage);
@ -125,7 +125,8 @@ export const FormImageUpload = <TFieldValues extends FieldValues, TContext exten
warning={warning}
id={`${id}.attachment_files`}
onChange={onFileSelected}
placeholder={placeholder()}/>
placeholder={placeholder()}
tooltip={tooltip} />
{hasImage() && <FabButton onClick={onRemoveFile} icon={<Trash size={20} weight="fill" />} className="is-main" />}
</div>
</div>

View File

@ -67,11 +67,10 @@ export const FormInput = <TFieldValues extends FieldValues, TInputType>({ id, re
return num;
}
if (type === 'date') {
const date: Date = new Date(value + 'T00:00:00');
if (Number.isNaN(date) && nullable) {
if (Number.isNaN(value) && nullable) {
return null;
}
return date;
return value;
}
setCharacterCount(value?.length || 0);
return value;

View File

@ -58,7 +58,7 @@ const MachineCard: React.FC<MachineCardProps> = ({ user, machine, onShowMachine,
return (
<div className={`machine-card ${loading ? 'loading' : ''} ${machine.disabled ? 'disabled' : ''} ${!machine.reservable ? 'unreservable' : ''}`}>
{machinePicture()}
{machine.space && user.role === 'admin' && <FabBadge icon='pin-map' iconWidth='3rem' /> }
{machine.space && user && user.role === 'admin' && <FabBadge icon='pin-map' iconWidth='3rem' /> }
<div className="machine-name">
{machine.name}
</div>

View File

@ -123,7 +123,8 @@ export const MachineForm: React.FC<MachineFormProps> = ({ action, machine, onErr
id="machine_image_attributes"
accept="image/*"
defaultImage={output.machine_image_attributes}
label={t('app.admin.machine_form.illustration')} />
label={t('app.admin.machine_form.illustration')}
tooltip={t('app.admin.machine_form.illustration_recommendation')} />
<FormRichText control={control}
id="description"
rules={{ required: true }}

View File

@ -140,7 +140,7 @@ export const PayzenForm: React.FC<PayzenFormProps> = ({ onSubmit, onSuccess, onE
try {
const { result } = await PayZenKR.current.validateForm();
if (result === null) {
if (!order) {
if (!order && !updateCard) {
await PayzenAPI.checkCart(cart, customer);
}
await PayZenKR.current.onSubmit(onPaid);

View File

@ -123,7 +123,8 @@ export const SpaceForm: React.FC<SpaceFormProps> = ({ action, space, onError, on
id="space_image_attributes"
accept="image/*"
defaultImage={output.space_image_attributes}
label={t('app.admin.space_form.illustration')} />
label={t('app.admin.space_form.illustration')}
tooltip={t('app.admin.space_form.illustration_recommendation')} />
<FormInput register={register}
type="number"
id="default_places"

View File

@ -57,13 +57,20 @@ export const SupportingDocumentsTypeForm: React.FC<SupportingDocumentsTypeFormPr
onChange('name', value);
};
/**
* to know if select input for groups is display or not
*/
const displayGroupsSelect = (): boolean => {
return (supportingDocumentType == null || supportingDocumentType?.document_type === 'User') && (groups.length > 0);
};
return (
<div className="supporting-documents-type-form">
<div className="info-area">
{t('app.admin.settings.account.supporting_documents_type_form.type_form_info')}
</div>
<form name="supportingDocumentTypeForm">
{supportingDocumentType?.document_type === 'User' &&
{displayGroupsSelect() &&
<div className="field">
<Select defaultValue={groupsValues()}
placeholder={t('app.admin.settings.account.supporting_documents_type_form.select_group')}

View File

@ -49,7 +49,9 @@ const SupportingDocumentsTypesList: React.FC<SupportingDocumentsTypesListProps>
// get groups
useEffect(() => {
GroupAPI.index({ disabled: false }).then(data => {
setGroups(data);
if (documentType === 'User') {
setGroups(data);
}
SupportingDocumentTypeAPI.index({ document_type: documentType }).then(pData => {
setSupportingDocumentsTypes(pData);
});
@ -202,13 +204,13 @@ const SupportingDocumentsTypesList: React.FC<SupportingDocumentsTypesListProps>
<p>{t('app.admin.settings.account.supporting_documents_types_list.supporting_documents_type_info')}</p>
<FabAlert level="warning">
<HtmlTranslate trKey="app.admin.settings.account.supporting_documents_types_list.no_groups_info" />
<FabButton onClick={addGroup}>{t('app.admin.settings.account.supporting_documents_types_list.create_groups')}</FabButton>
<FabButton onClick={addGroup} className="is-secondary">{t('app.admin.settings.account.supporting_documents_types_list.create_groups')}</FabButton>
</FabAlert>
</div>
<div className="title">
<h3>{t('app.admin.settings.account.supporting_documents_types_list.supporting_documents_type_title')}</h3>
<FabButton onClick={addType}>{t('app.admin.settings.account.supporting_documents_types_list.add_type')}</FabButton>
<FabButton onClick={addType} className="is-secondary">{t('app.admin.settings.account.supporting_documents_types_list.add_type')}</FabButton>
</div>
<SupportingDocumentsTypeModal isOpen={modalIsOpen}
@ -277,7 +279,7 @@ const SupportingDocumentsTypesList: React.FC<SupportingDocumentsTypesListProps>
<div className="types-list">
<div className="title">
<h3>{t('app.admin.settings.account.supporting_documents_types_list.supporting_documents_type_title')}</h3>
<FabButton onClick={addType}>{t('app.admin.settings.account.supporting_documents_types_list.add_type')}</FabButton>
<FabButton onClick={addType} className='is-secondary'>{t('app.admin.settings.account.supporting_documents_types_list.add_type')}</FabButton>
</div>
<SupportingDocumentsTypeModal isOpen={modalIsOpen}

View File

@ -126,7 +126,8 @@ export const TrainingForm: React.FC<TrainingFormProps> = ({ action, training, on
id="training_image_attributes"
accept="image/*"
defaultImage={output.training_image_attributes}
label={t('app.admin.training_form.illustration')} />
label={t('app.admin.training_form.illustration')}
tooltip={t('app.admin.training_form.illustration_recommendation')} />
<FormRichText control={control}
id="description"
rules={{ required: true }}

View File

@ -824,11 +824,12 @@ Application.Controllers.controller('InvoicesController', ['$scope', '$state', 'I
* @param [concat] {boolean} if true, the result will be append to $scope.invoices instead of being affected
*/
const invoiceSearch = function (concat) {
const date = $scope.searchInvoice.date ? $scope.searchInvoice.date.toISOString().slice(0, 10) : null;
Invoice.list({
query: {
number: $scope.searchInvoice.reference,
customer: $scope.searchInvoice.name,
date: $scope.searchInvoice.date,
date,
order_by: $scope.orderInvoice,
page: $scope.page,
size: INVOICES_PER_PAGE

View File

@ -165,9 +165,6 @@ Application.Controllers.controller('AdminMembersController', ['$scope', '$sce',
if ($scope.enableUserValidationRequired) { $scope.member.memberFilters.push('not_validated'); }
// should we display the username in the list?
$scope.displayUsername = (settingsPromise.show_username_in_admin_list === 'true');
// Admins ordering/sorting. Default: not sorted
$scope.orderAdmin = null;
@ -511,7 +508,7 @@ Application.Controllers.controller('AdminMembersController', ['$scope', '$sce',
});
if ($scope.members.length > 0) {
uitour.createStep({
selector: '.members-management .members-list .buttons',
selector: '.members-management .members-list .member-actions',
stepId: 'actions',
order: 4,
title: _t('app.admin.tour.members.actions.title'),
@ -1066,6 +1063,7 @@ Application.Controllers.controller('NewMemberController', ['$scope', '$state', '
// Default member's profile parameters
$scope.user = {
plan_interval: '',
is_allow_contact: false,
invoicing_profile_attributes: {},
statistic_profile_attributes: {}
};

View File

@ -1023,9 +1023,6 @@ Application.Controllers.controller('ShowEventController', ['$scope', '$state', '
});
resetEventReserve();
});
if ($scope.currentUser.role === 'admin') {
return $scope.ctrl.member = null;
}
};
/**

View File

@ -268,6 +268,12 @@ Application.Controllers.controller('EditSpaceController', ['$scope', '$state', '
return space;
}
/**
* Changes the current user's view, redirecting him to the spaces list
*/
$scope.cancel = function () { $state.go('app.public.spaces_list'); };
// Using the SpacesController
return new SpacesController($scope, $state);
}]);

View File

@ -468,7 +468,7 @@ Application.Directives.directive('cart', ['$rootScope', '$uibModal', 'dialogs',
const validateSameTimeReservations = function (slot, callback) {
let sameTimeReservations = $scope.settings.overlapping_categories.split(',').map(function (k) {
return _.filter($scope.user[k], function (sr) {
return !sr.canceled_at && (
return !sr.canceled_at && !(sr.reservable_type === 'Event' && (sr.is_valid === false)) && (
slot.start.isSame(sr.start_at) ||
(slot.end.isAfter(sr.start_at) && slot.end.isBefore(sr.end_at)) ||
(slot.start.isAfter(sr.start_at) && slot.start.isBefore(sr.end_at)) ||

View File

@ -219,8 +219,7 @@ export const registrationSettings = [
] as const;
export const adminSettings = [
'feature_tour_display',
'show_username_in_admin_list'
'feature_tour_display'
] as const;
export const pricingSettings = [

View File

@ -1037,7 +1037,7 @@ angular.module('application.router', ['ui.router'])
groupsPromise: ['Group', function (Group) { return Group.query().$promise; }],
tagsPromise: ['Tag', function (Tag) { return Tag.query().$promise; }],
authProvidersPromise: ['AuthProvider', function (AuthProvider) { return AuthProvider.query().$promise; }],
settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: "['feature_tour_display', 'user_validation_required', 'show_username_in_admin_list']" }).$promise; }]
settingsPromise: ['Setting', function (Setting) { return Setting.query({ names: "['feature_tour_display', 'user_validation_required']" }).$promise; }]
}
})
.state('app.admin.members_new', {
@ -1198,7 +1198,7 @@ angular.module('application.router', ['ui.router'])
"'link_name', 'home_content', 'home_css', 'phone_required', 'upcoming_events_shown', 'public_agenda_module'," +
"'renew_pack_threshold', 'pack_only_for_subscription', 'overlapping_categories', 'public_registrations'," +
"'extended_prices_in_same_day', 'recaptcha_site_key', 'recaptcha_secret_key', 'user_validation_required', " +
"'user_validation_required_list', 'machines_module', 'user_change_group', 'show_username_in_admin_list', " +
"'user_validation_required_list', 'machines_module', 'user_change_group', " +
"'store_module', 'machine_reservation_deadline', 'training_reservation_deadline', 'event_reservation_deadline', " +
"'space_reservation_deadline', 'reservation_context_feature']"
}).$promise;

View File

@ -15,8 +15,6 @@
outline: 0;
text-transform: uppercase;
//border: 3px solid $yellow;
//background-color: $yellow;
&:hover {
background-color: white;
}

View File

@ -2,8 +2,8 @@
background-color: $brand-light;
}
//.bg-red { background-color: $red; color: white; }
//.bg-red-dark { background-color: $red-dark; }
.bg-red { background-color: var(--main); color: var(--main-text-color); }
.bg-red-dark { background-color: var(--main-dark); color: var(--main-text-color); }
//.bg-yellow { background-color: $yellow !important; }
.bg-token {
background-color: rgba(230, 208, 137, 0.49);

View File

@ -77,6 +77,21 @@
}
}
.modal-footer.btn-stack {
display: flex;
flex-direction: column;
gap: 1rem;
&::after,
&::before {
content: none;
}
& > * {
margin: 0 !important;
}
}
.modal-backdrop {
height: 100%;
}
@ -191,7 +206,6 @@
overflow: hidden;
img {
aspect-ratio: 16/9;
object-fit: cover;
object-position: center;
}
@ -200,7 +214,7 @@
img {
display: block;
max-width: 100%;
height: auto;
max-height: 700px;
}
}
@ -382,8 +396,13 @@
vertical-align: bottom;
&.label-icon {
width: 2.8rem;
height: 2.8rem;
display: inline-flex;
justify-content: center;
align-items: center;
font-size: rem-calc(22);
padding: 4px 9px 1px 10px;
color: var(--main-text-color);
}
}
}
@ -688,3 +707,7 @@ input[type=date].form-control {
margin-bottom: 0;
}
}
.medium-editor-anchor-preview a:hover {
color: #ffffff;
}

View File

@ -501,26 +501,15 @@
}
#nav {
// border-right: 1px solid $red-dark;
.nav {
//background-color: $red;
> li {
> a {
padding: 13px 17px;
font-weight: 600;
color: white;
&:hover,
&:focus, &.active {
//background-color: $red-light;
color: white;
}
color: var(--main-text-color);
&.active {
border-left: 3px solid;
// #870003;
}
}
}

View File

@ -1,9 +1,9 @@
.fab-button {
min-height: 38px;
margin-bottom: 0;
padding: 6px 12px;
display: inline-flex;
align-items: center;
gap: 0 4px;
border: 1px solid #c9c9c9;
border-radius: 4px;
background-color: #fbfbfb;
@ -35,12 +35,11 @@
}
&[disabled] {
color: #3a3a3a;
}
&[disabled],
&[disabled]:hover {
color: #3a3a3a;
color: inherit;
opacity: 0.65;
cursor: not-allowed;
}
&--icon {
@ -60,12 +59,15 @@
border-color: $color;
background-color: $color;
color: $textColor;
opacity: 0.75;
opacity: 0.65;
}
}
&.is-info {
@include colorVariant(var(--information), var(--gray-soft-lightest));
}
&.is-alert {
@include colorVariant(var(--alert), var(--gray-soft-lightest));
}
&.is-secondary {
@include colorVariant(var(--secondary), var(--secondary-text-color));
}
@ -75,4 +77,25 @@
&.is-main {
@include colorVariant(var(--main), var(--main-text-color));
}
// sizes
&.button-full {
width: 100%;
justify-content: center;
}
&.button-xs {
min-height: auto;
padding: 2px 4px;
font-size: 12px;
}
&.button-s {
min-height: auto;
padding: 4px 8px;
font-size: 14px;
}
}
label.fab-button {
margin-bottom: 0;
}

View File

@ -11,7 +11,7 @@
}
.project-image {
@include imageRatio(50%);
@include imageRatio(56%);
background-size: cover;
background-position: center;
border-bottom: 1px solid var(--gray-soft-dark);

View File

@ -39,6 +39,10 @@
grid-template-columns: repeat(auto-fill, minmax(290px, 1fr));
gap: 3.2rem;
& > span { grid-column: 1/-1;}
& > a {
grid-column: 1/-1;
justify-self: center;
}
}
@media (min-width: 1200px) {

View File

@ -29,9 +29,6 @@
margin-top: 15px;
margin-right: 20px;
max-width: 200px;
background-color: var(--secondary-dark);
border-color: var(--secondary-dark);
color: var(--secondary-text-color);
}
}
}
@ -49,9 +46,6 @@
.fab-button {
margin-top: 15px;
margin-right: 20px;
background-color: var(--secondary-dark);
border-color: var(--secondary-dark);
color: var(--secondary-text-color);
}
}

View File

@ -25,7 +25,7 @@
<div class="panel-footer no-padder">
<input type="submit" value="{{ 'app.shared.buttons.save' | translate}}" class="r-b btn-valid btn btn-warning btn-block p-lg btn-lg text-u-c" ng-click="saveAdmin()" ng-disabled="adminForm.$invalid"/>
<input type="submit" value="{{ 'app.shared.buttons.save' | translate}}" class="fab-button is-secondary button-full" ng-click="saveAdmin()" ng-disabled="adminForm.$invalid"/>
</div>
</section>
</form>

View File

@ -7,7 +7,7 @@
</div>
</div>
<div class="col-md-12">
<button type="button" class="btn btn-warning m-t m-b" ui-sref="app.admin.authentication_new" translate>{{ 'app.admin.members.authentication_form.add_a_new_authentication_provider' }}</button>
<button type="button" class="fab-button is-secondary m-t m-b" ui-sref="app.admin.authentication_new" translate>{{ 'app.admin.members.authentication_form.add_a_new_authentication_provider' }}</button>
<table class="table">
<thead>

View File

@ -93,7 +93,7 @@
<span translate ng-if="!r.user.name">{{ 'app.admin.calendar.deleted_user' }}</span>
- <span class="label reservation-time">{{ r.start_at | amDateFormat:'LLL' }} - {{ r.end_at | amDateFormat:'LT' }}</span>
- <span class="label label-success text-white">{{r.reservable.name}}</span>
<span class="btn btn-warning btn-xs" ng-click="cancelBooking(r)" ng-if="!r.canceled_at"><i class="fa fa-times red"></i></span>
<span class="fab-button is-secondary button-xs" ng-click="cancelBooking(r)" ng-if="!r.canceled_at"><i class="fa fa-times red"></i></span>
</li>
</ul>
<div ng-show="reservations.length == 0" translate>{{ 'app.admin.calendar.without_reservation' }}</div>
@ -109,7 +109,7 @@
<ul class="list-unstyled">
<li ng-repeat="m in machines" class="m-b-xs" ng-show="availability.machine_ids.indexOf(m.id) > -1">
{{m.name}}
<span class="btn btn-warning btn-xs" ng-click="removeMachine(m)" ng-if="availability.machine_ids.length > 1"><i class="fa fa-times red"></i></span>
<span class="fab-button is-secondary button-xs" ng-click="removeMachine(m)" ng-if="availability.machine_ids.length > 1"><i class="fa fa-times red"></i></span>
</li>
</ul>
</div>
@ -126,7 +126,7 @@
<ul class="m-n" ng-repeat="plan in g.plans">
<li>
{{::plan.base_name}}
<span class="btn btn-warning btn-xs" ng-click="removePlan(plan)" ><i class="fa fa-times red"></i></span>
<span class="fab-button is-secondary button-xs" ng-click="removePlan(plan)" ><i class="fa fa-times red"></i></span>
</li>
</ul>
</li>

View File

@ -82,18 +82,18 @@
<p class="text-center font-sbold" translate>{{ 'app.admin.calendar.divide_this_availability' }}</p>
<div class="row">
<div class="col-md-5">
<div class="input-group">
<input type="number" class="form-control" ng-model="slots_nb" step="1" min="1" required="true" />
<span class="input-group-addon" translate>{{ 'app.admin.calendar.slots' }}</span>
</div>
<div class="form-group">
<input id="slots_nb" type="number" class="form-control" ng-model="slots_nb" step="1" min="1" required="true" />
<label for="slots_nb" translate>{{ 'app.admin.calendar.slots' }}</label>
</div>
</div>
<p class="col-md-2 middle-of-inputs" translate>
{{ 'app.admin.calendar.slots_of' }}
</p>
<div class="col-md-5">
<div class="input-group">
<input type="number" class="form-control" ng-model="availability.slot_duration" min="1" required="true" />
<span class="input-group-addon" translate>{{ 'app.admin.calendar.minutes' }}</span>
<div class="form-group">
<input id="slot_duration" type="number" class="form-control" ng-model="availability.slot_duration" min="1" required="true" />
<label for="slot_duration" translate>{{ 'app.admin.calendar.minutes' }}</label>
</div>
</div>
</div>
@ -223,7 +223,7 @@
<p class="text-center font-sbold" translate>{{ 'app.admin.calendar.summary' }}</p>
<div class="row">
<span>{{ 'app.admin.calendar.about_to_create' | translate:{NUMBER:occurrences.length,TYPE:availability.available_type} }}</span>
<ul>
<ul style="max-height: 25vh; overflow: auto;">
<li ng-repeat="slot in occurrences">{{slot.start_at | amDateFormat:'L LT'}} - {{slot.end_at | amDateFormat:'LT'}}</li>
</ul>
<div class="alert alert-info text-xs" ng-show="availability.slot_duration">
@ -246,12 +246,12 @@
</div>
</div>
<div class="modal-footer" ng-show="step < 6">
<button class="btn btn-info" ng-click="previous()" ng-disabled="step === 1" translate>{{ 'app.admin.calendar.previous' }}</button>
<button class="btn btn-info" ng-click="next()" translate>{{ 'app.admin.calendar.next' }}</button>
<button class="btn btn-default" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
<button class="fab-button is-info" ng-click="previous()" ng-disabled="step === 1" translate>{{ 'app.admin.calendar.previous' }}</button>
<button class="fab-button is-info" ng-click="next()" translate>{{ 'app.admin.calendar.next' }}</button>
<button class="fab-button" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
</div>
<div class="modal-footer" ng-show="step === 6">
<button class="btn btn-info" ng-click="previous()" translate>{{ 'app.admin.calendar.previous' }}</button>
<button class="btn btn-warning" ng-click="ok()" translate>{{ 'app.shared.buttons.confirm' }}</button>
<button class="btn btn-default" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
<button class="fab-button is-info" ng-click="previous()" translate>{{ 'app.admin.calendar.previous' }}</button>
<button class="fab-button is-secondary" ng-click="ok()" translate>{{ 'app.shared.buttons.confirm' }}</button>
<button class="fab-button" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
</div>

View File

@ -86,7 +86,7 @@
switch-animate="true"/>
</div>
<div class="m-t text-right">
<button role="button" class="btn btn-warning" ng-click="save()" ng-disabled="newImportForm.$invalid" translate>
<button role="button" class="fab-button is-secondary" ng-click="save()" ng-disabled="newImportForm.$invalid" translate>
{{ 'app.shared.buttons.confirm' }}
</button>
</div>

View File

@ -31,7 +31,7 @@
<ng-include src="'/admin/coupons/_form.html'"></ng-include>
<div class="panel-footer no-padder">
<input type="button" value="{{ 'app.shared.buttons.confirm_changes' | translate }}" class="r-b btn-valid btn btn-warning btn-block p-lg btn-lg text-u-c" ng-disabled="couponForm.$invalid" ng-click="updateCoupon()"/>
<input type="button" value="{{ 'app.shared.buttons.confirm_changes' | translate }}" class="p-lg fab-button is-secondary button-full" ng-disabled="couponForm.$invalid" ng-click="updateCoupon()"/>
</div>
</form>
</div>

View File

@ -23,7 +23,7 @@
<ng-include src="'/admin/coupons/_form.html'"></ng-include>
<div class="panel-footer no-padder">
<input type="button" value="{{ 'app.shared.buttons.save' | translate }}" class="r-b btn-valid btn btn-warning btn-block p-lg btn-lg text-u-c" ng-disabled="couponForm.$invalid" ng-click="saveCoupon()"/>
<input type="button" value="{{ 'app.shared.buttons.save' | translate }}" class="p-lg fab-button is-secondary button-full" ng-disabled="couponForm.$invalid" ng-click="saveCoupon()"/>
</div>
</form>

View File

@ -1,7 +1,7 @@
<div class="m-t">
<h3 class="events-categories" translate>{{ 'app.admin.events.categories' }}</h3>
<p translate>{{ 'app.admin.events.at_least_one_category_is_required' }}</p>
<button type="button" class="btn btn-warning m-b m-t" ng-click="addElement('category')" translate>{{ 'app.admin.events.add_a_category' }}</button>
<button type="button" class="fab-button is-secondary m-b m-t" ng-click="addElement('category')" translate>{{ 'app.admin.events.add_a_category' }}</button>
<table class="table">
<thead>
<tr>
@ -19,10 +19,10 @@
<td>
<!-- form -->
<form editable-form name="rowform" onbeforesave="saveElement('category', $data, category.id)" ng-show="rowform.$visible" class="form-buttons form-inline" shown="inserted.category == category">
<button type="submit" ng-disabled="rowform.$waiting" class="btn btn-warning">
<button type="submit" ng-disabled="rowform.$waiting" class="fab-button is-secondary">
<i class="fa fa-check"></i>
</button>
<button type="button" ng-disabled="rowform.$waiting" ng-click="cancelElement('category', rowform, $index)" class="btn btn-default">
<button type="button" ng-disabled="rowform.$waiting" ng-click="cancelElement('category', rowform, $index)" class="fab-button">
<i class="fa fa-times"></i>
</button>
</form>
@ -40,7 +40,7 @@
</table>
<h3 class="events-themes" translate>{{ 'app.admin.events.themes' }}</h3>
<button type="button" class="btn btn-warning m-b m-t" ng-click="addElement('theme')" translate>{{ 'app.admin.events.add_a_theme' }}</button>
<button type="button" class="fab-button is-secondary m-b m-t" ng-click="addElement('theme')" translate>{{ 'app.admin.events.add_a_theme' }}</button>
<table class="table">
<thead>
<tr>
@ -58,10 +58,10 @@
<td>
<!-- form -->
<form editable-form name="rowform" onbeforesave="saveElement('theme', $data, theme.id)" ng-show="rowform.$visible" class="form-buttons form-inline" shown="inserted.theme == theme">
<button type="submit" ng-disabled="rowform.$waiting" class="btn btn-warning">
<button type="submit" ng-disabled="rowform.$waiting" class="fab-button is-secondary">
<i class="fa fa-check"></i>
</button>
<button type="button" ng-disabled="rowform.$waiting" ng-click="cancelElement('theme', rowform, $index)" class="btn btn-default">
<button type="button" ng-disabled="rowform.$waiting" ng-click="cancelElement('theme', rowform, $index)" class="fab-button">
<i class="fa fa-times"></i>
</button>
</form>
@ -79,7 +79,7 @@
</table>
<h3 class="events-age-ranges" translate>{{ 'app.admin.events.age_ranges' }}</h3>
<button type="button" class="btn btn-warning m-b m-t" ng-click="addElement('age_range')" translate>{{ 'app.admin.events.add_a_range' }}</button>
<button type="button" class="fab-button is-secondary m-b m-t" ng-click="addElement('age_range')" translate>{{ 'app.admin.events.add_a_range' }}</button>
<table class="table">
<thead>
<tr>
@ -97,10 +97,10 @@
<td>
<!-- form -->
<form editable-form name="rowform" onbeforesave="saveElement('age_range', $data, range.id)" ng-show="rowform.$visible" class="form-buttons form-inline" shown="inserted.age_range == range">
<button type="submit" ng-disabled="rowform.$waiting" class="btn btn-warning">
<button type="submit" ng-disabled="rowform.$waiting" class="fab-button is-secondary">
<i class="fa fa-check"></i>
</button>
<button type="button" ng-disabled="rowform.$waiting" ng-click="cancelElement('age_range', rowform, $index)" class="btn btn-default">
<button type="button" ng-disabled="rowform.$waiting" ng-click="cancelElement('age_range', rowform, $index)" class="fab-button">
<i class="fa fa-times"></i>
</button>
</form>

View File

@ -13,41 +13,41 @@
<div class="col-xs-12 col-sm-12 col-md-3 b-t hide-b-md" ng-if="isAuthorized(['admin', 'manager'])">
<section class="heading-actions wrapper">
<a class="btn btn-lg btn-warning bg-white b-2x rounded m-t-sm upper text-sm" ui-sref="app.admin.events_new" role="button" translate>{{ 'app.admin.events.add_an_event' }}</a>
<a class="fab-button is-secondary b-2x m-t-sm" ui-sref="app.admin.events_new" role="button" translate>{{ 'app.admin.events.add_an_event' }}</a>
</section>
</div>
</div>
<section class="m-lg events-management"
ui-tour="events"
ui-tour-backdrop="true"
ui-tour-template-url="'/shared/tour-step-template.html'"
ui-tour-use-hotkeys="true"
ui-tour-scroll-parent-id="content-main"
post-render="setupEventsTour">
<div class="row">
<div class="col-md-12" ng-if="isAuthorized('admin')">
<uib-tabset justified="true" active="tabs.active">
<uib-tab heading="{{ 'app.admin.events.settings' | translate }}" index="0">
<events-settings on-error="onError" on-success="onSuccess" ui-router="uiRouter"></events-settings>
</uib-tab>
<uib-tab heading="{{ 'app.admin.events.events_monitoring' | translate }}" index="1">
<ng-include src="'/admin/events/monitoring.html'"></ng-include>
</uib-tab>
<uib-tab heading="{{ 'app.admin.events.manage_filters' | translate }}" index="2">
<ng-include src="'/admin/events/filters.html'"></ng-include>
</uib-tab>
<uib-tab heading="{{ 'app.admin.events.manage_prices_categories' | translate }}" index="3" class="prices-tab">
<ng-include src="'/admin/events/prices.html'"></ng-include>
</uib-tab>
</uib-tabset>
</div>
<div class="col-md-12" ng-if="isAuthorized('manager')">
<ng-include src="'/admin/events/monitoring.html'"></ng-include>
</div>
</div>
</section>
</section>
<section class="m-lg events-management"
ui-tour="events"
ui-tour-backdrop="true"
ui-tour-template-url="'/shared/tour-step-template.html'"
ui-tour-use-hotkeys="true"
ui-tour-scroll-parent-id="content-main"
post-render="setupEventsTour">
<div class="row">
<div class="col-md-12" ng-if="isAuthorized('admin')">
<uib-tabset justified="true" active="tabs.active">
<uib-tab heading="{{ 'app.admin.events.settings' | translate }}" index="0">
<events-settings on-error="onError" on-success="onSuccess" ui-router="uiRouter"></events-settings>
</uib-tab>
<uib-tab heading="{{ 'app.admin.events.events_monitoring' | translate }}" index="1">
<ng-include src="'/admin/events/monitoring.html'"></ng-include>
</uib-tab>
<uib-tab heading="{{ 'app.admin.events.manage_filters' | translate }}" index="2">
<ng-include src="'/admin/events/filters.html'"></ng-include>
</uib-tab>
<uib-tab heading="{{ 'app.admin.events.manage_prices_categories' | translate }}" index="3" class="prices-tab">
<ng-include src="'/admin/events/prices.html'"></ng-include>
</uib-tab>
</uib-tabset>
</div>
<div class="col-md-12" ng-if="isAuthorized('manager')">
<ng-include src="'/admin/events/monitoring.html'"></ng-include>
</div>
</div>
</section>

View File

@ -79,6 +79,6 @@
<div class="row">
<div class="col-lg-12 text-center">
<a class="btn btn-warning" ng-click="loadMoreEvents()" ng-if="paginateActive" translate>{{ 'app.admin.events.load_the_next_events' }}</a>
<a class="fab-button is-secondary" ng-click="loadMoreEvents()" ng-if="paginateActive" translate>{{ 'app.admin.events.load_the_next_events' }}</a>
</div>
</div>

View File

@ -1,7 +1,7 @@
<div class="m-t">
<h3 translate>{{ 'app.admin.events.prices_categories' }}</h3>
<button type="button" class="btn btn-warning m-b m-t" ng-click="newPriceCategory()" translate>{{ 'app.admin.events.add_a_price_category' }}</button>
<button type="button" class="fab-button is-secondary m-b m-t" ng-click="newPriceCategory()" translate>{{ 'app.admin.events.add_a_price_category' }}</button>
<table class="table">
<thead>
<tr>

View File

@ -60,7 +60,7 @@
<div ng-if="!isCancelled(reservation) && !reservation.is_paid">
<label class="m-r-sm">
<span translate>{{ 'app.admin.event_reservations.negative' }}</span>
<input type="radio" name="invalidate-{{reservation.id}}" ng-value="false" ng-click="invalidateReservation(reservation)" ng-model="reservation.slots_reservations_attributes[0].is_valid" ng-disabled="reservation.total_booked_seats > event.nb_free_places && !reservation.slots_reservations_attributes[0].is_valid">
<input type="radio" name="invalidate-{{reservation.id}}" ng-value="false" ng-click="invalidateReservation(reservation)" ng-model="reservation.slots_reservations_attributes[0].is_valid" ng-disabled="reservation.slots_reservations_attributes[0].is_valid === 'false'">
</label>
<label>
<span translate>{{ 'app.admin.event_reservations.affirmative' }}</span>
@ -85,7 +85,7 @@
</table>
<p ng-if="reservations.length == 0" translate>{{ 'app.admin.event_reservations.no_reservations_for_now' }}</p>
<button type="button" class="btn btn-warning m-t m-b" ui-sref="app.admin.events" translate>{{ 'app.admin.event_reservations.back_to_monitoring' }}</button>
<button type="button" class="fab-button is-secondary m-t m-b" ui-sref="app.admin.events" translate>{{ 'app.admin.event_reservations.back_to_monitoring' }}</button>
</div>
</div>
</section>

View File

@ -1,7 +1,6 @@
<div class="m-t-lg m-b">
<button type="button" class="btn btn-warning" ng-click="addGroup()">
<i class="fa fa-plus m-r"></i>
<span translate>{{ 'app.admin.members.group_form.add_a_group' }}</span>
<button type="button" class="fab-button is-secondary" ng-click="addGroup()" translate>
{{ 'app.admin.members.group_form.add_a_group' }}
</button>
<div class="form-group pull-right">
<div class="input-group">
@ -30,10 +29,10 @@
<td>
<!-- form -->
<form editable-form name="rowform" onbeforesave="saveGroup($data, group.id)" ng-show="rowform.$visible" class="form-buttons form-inline" shown="inserted == group">
<button type="submit" ng-disabled="rowform.$waiting" class="btn btn-warning">
<button type="submit" ng-disabled="rowform.$waiting" class="fab-button is-secondary">
<i class="fa fa-check"></i>
</button>
<button type="button" ng-disabled="rowform.$waiting" ng-click="cancelGroup(rowform, $index)" class="btn btn-default">
<button type="button" ng-disabled="rowform.$waiting" ng-click="cancelGroup(rowform, $index)" class="fab-button">
<i class="fa fa-times"></i>
</button>
</form>

View File

@ -95,7 +95,7 @@
<input name="type" type="hidden" ng-value="exportTarget.software"/>
<input name="key" type="hidden" ng-value="query.key"/>
<input name="query" type="hidden" ng-value="query.query"/>
<input type="submit" class="btn btn-warning" value="{{ 'app.shared.buttons.confirm' | translate }}" formtarget="export-frame"/>
<input type="submit" class="fab-button is-secondary" value="{{ 'app.shared.buttons.confirm' | translate }}" formtarget="export-frame"/>
</form>
<button class="btn btn-default" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
<button class="fab-button" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
</div>

View File

@ -38,6 +38,6 @@
</form>
</div>
<div class="modal-footer">
<button class="btn btn-warning" ng-click="ok()" ng-disabled="avoirForm.$invalid" translate>{{ 'app.shared.buttons.confirm' }}</button>
<button class="btn btn-default" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
<button class="fab-button is-secondary" ng-click="ok()" ng-disabled="avoirForm.$invalid" translate>{{ 'app.shared.buttons.confirm' }}</button>
<button class="fab-button" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
</div>

View File

@ -76,6 +76,6 @@
</div>
</div>
<div class="modal-footer">
<button class="btn btn-warning" ng-click="ok()" ng-disabled="closePeriodForm.$invalid || pendingCreation" translate>{{ 'app.shared.buttons.confirm' }}</button>
<button class="btn btn-default" ng-click="cancel()" ng-disabled="pendingCreation" translate>{{ 'app.shared.buttons.cancel' }}</button>
<button class="fab-button is-secondary" ng-click="ok()" ng-disabled="closePeriodForm.$invalid || pendingCreation" translate>{{ 'app.shared.buttons.confirm' }}</button>
<button class="fab-button" ng-click="cancel()" ng-disabled="pendingCreation" translate>{{ 'app.shared.buttons.cancel' }}</button>
</div>

View File

@ -83,7 +83,7 @@
</tbody>
</table>
<div class="text-center">
<button class="btn btn-warning" ng-click="showNextInvoices()" ng-hide="noMoreResults"><i class="fa fa-search-plus" aria-hidden="true"></i> {{ 'app.admin.invoices.display_more_invoices' | translate }}</button>
<button class="fab-button is-secondary" ng-click="showNextInvoices()" ng-hide="noMoreResults"><i class="fa fa-search-plus m-r" aria-hidden="true"></i> {{ 'app.admin.invoices.display_more_invoices' | translate }}</button>
</div>
<p ng-if="invoices.length == 0" translate>{{ 'app.admin.invoices.no_invoices_for_now' }}</p>

View File

@ -21,7 +21,7 @@
</div>
</div>
<div class="modal-footer">
<button class="btn btn-warning" ng-click="ok()" translate>{{ 'app.shared.buttons.confirm' }}</button>
<button class="btn btn-default" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
<button class="fab-button is-secondary" ng-click="ok()" translate>{{ 'app.shared.buttons.confirm' }}</button>
<button class="fab-button" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
</div>
</div>

View File

@ -25,7 +25,7 @@
</div>
</div>
<div class="modal-footer">
<button class="btn btn-warning" ng-click="ok()" translate>{{ 'app.shared.buttons.confirm' }}</button>
<button class="btn btn-default" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
<button class="fab-button is-secondary" ng-click="ok()" translate>{{ 'app.shared.buttons.confirm' }}</button>
<button class="fab-button" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
</div>
</div>

View File

@ -29,7 +29,7 @@
</div>
</div>
<div class="modal-footer">
<button class="btn btn-warning" ng-click="ok()" ng-disabled="model.trim() === ''" translate>{{ 'app.shared.buttons.confirm' }}</button>
<button class="btn btn-default" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
<button class="fab-button is-secondary" ng-click="ok()" ng-disabled="model.trim() === ''" translate>{{ 'app.shared.buttons.confirm' }}</button>
<button class="fab-button" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
</div>
</div>

View File

@ -42,7 +42,7 @@
</form>
</div>
<div class="modal-footer">
<button class="btn btn-warning" ng-click="ok()" ng-disabled="stripeKeysForm.$invalid" translate>{{ 'app.shared.buttons.confirm' }}</button>
<button class="btn btn-default" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
<button class="fab-button is-secondary" ng-click="ok()" ng-disabled="stripeKeysForm.$invalid" translate>{{ 'app.shared.buttons.confirm' }}</button>
<button class="fab-button" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
</div>
</div>

View File

@ -25,7 +25,7 @@
<div class="panel-footer no-padder">
<input type="submit" value="{{ 'app.shared.buttons.save' | translate}}" class="r-b btn-valid btn btn-warning btn-block p-lg btn-lg text-u-c" ng-click="saveManager()" ng-disabled="managerForm.$invalid"/>
<input type="submit" value="{{ 'app.shared.buttons.save' | translate}}" class="fab-button is-secondary button-full p-lg" ng-click="saveManager()" ng-disabled="managerForm.$invalid"/>
</div>
</section>
</form>

View File

@ -7,7 +7,7 @@
</div>
</div>
<div class="col-md-12">
<button type="button" class="btn btn-warning m-t m-b" ui-sref="app.admin.admins_new" ng-show="isAuthorized('admin')" translate>
<button type="button" class="fab-button is-secondary m-t m-b" ui-sref="app.admin.admins_new" ng-show="isAuthorized('admin')" translate>
{{ 'app.admin.members.add_a_new_administrator' }}
</button>

View File

@ -62,14 +62,14 @@
</uib-tab>
<uib-tab heading="{{ 'app.shared.user_admin.children' | translate }}" ng-if="$root.settings.familyAccount">
<children-dashboard user="user" operator="currentUser" admin-panel="true" on-success="onSuccess" on-error="onError" />
</uib-tab>
<uib-tab heading="{{ 'app.admin.members_edit.reservations' | translate }}">
<reservations-dashboard user="user" current-user="currentUser" on-error="onError" />
</uib-tab>
<uib-tab heading="{{ 'app.shared.user_admin.children' | translate }}" ng-if="$root.settings.familyAccount">
<children-dashboard user="user" operator="currentUser" admin-panel="true" on-success="onSuccess" on-error="onError" />
</uib-tab>
<uib-tab heading="{{ 'app.admin.members_edit.supporting_documents' | translate }}" ng-show="hasProofOfIdentityTypes">
<supporting-documents-validation
operator="currentUser"
@ -280,7 +280,7 @@
<div class="clearfix"></div>
<div class="col-sm-4 text-center" ng-hide="user.id === currentUser.id">
<button type="button" class="btn btn-warning m-t m-b" ng-click="createWalletCreditModal(user, wallet)" translate>{{ 'app.admin.members_edit.to_credit' }}</button>
<button type="button" class="fab-button is-secondary m-t m-b" ng-click="createWalletCreditModal(user, wallet)" translate>{{ 'app.admin.members_edit.to_credit' }}</button>
</div>
<p class="col-sm-4 alert alert-info" ng-show="user.id === currentUser.id" translate>
{{ 'app.admin.members_edit.cannot_credit_own_wallet' }}

View File

@ -163,7 +163,7 @@
<div class="panel-footer no-padder">
<input type="submit" value="{{ 'app.admin.members_import.import' | translate }}" class="r-b btn-valid btn btn-warning btn-block p-lg btn-lg text-u-c" ng-disabled="importForm.$invalid"/>
<input type="submit" value="{{ 'app.admin.members_import.import' | translate }}" class="p-lg fab-button is-secondary button-full" ng-disabled="importForm.$invalid"/>
</div>
</section>

View File

@ -11,7 +11,7 @@
</div>
</div>
<div class="col-md-12">
<button type="button" class="btn btn-warning m-t m-b" ui-sref="app.admin.managers_new" ng-show="isAuthorized('admin')" translate>
<button type="button" class="fab-button is-secondary m-t m-b" ui-sref="app.admin.managers_new" ng-show="isAuthorized('admin')" translate>
{{ 'app.admin.members.add_a_new_manager' }}
</button>

View File

@ -19,7 +19,7 @@
</div>
<div class="col-md-12">
<button type="button" class="btn btn-warning m-b" ui-sref="app.admin.members_new" translate>
<button type="button" class="fab-button is-secondary m-b" ui-sref="app.admin.members_new" translate>
{{ 'app.admin.members.add_a_new_member' }}
</button>
<div class="pull-right exports-buttons m-b" ng-show="isAuthorized('admin')">
@ -40,6 +40,6 @@
</div>
<div class="text-center">
<button class="btn btn-warning show-more" ng-click="showNextMembers()" ng-hide="member.noMore"><i class="fa fa-search-plus" aria-hidden="true"></i> {{ 'app.admin.members.display_more_users' | translate }}</button>
<button class="fab-button is-secondary show-more" ng-click="showNextMembers()" ng-hide="member.noMore"><i class="fa fa-search-plus" aria-hidden="true"></i> {{ 'app.admin.members.display_more_users' | translate }}</button>
</div>
</div>

View File

@ -11,7 +11,7 @@
</div>
</div>
<div class="col-md-12">
<button type="button" class="btn btn-warning m-t m-b" ng-click="openPartnerNewModal()" translate>{{ 'app.admin.members.add_a_new_partner' }}</button>
<button type="button" class="fab-button is-secondary m-t m-b" ng-click="openPartnerNewModal()" translate>{{ 'app.admin.members.add_a_new_partner' }}</button>
<table class="table">
<thead>

View File

@ -15,7 +15,7 @@
<div class="col-xs-12 col-sm-12 col-md-4 b-t hide-b-md">
<section class="heading-actions wrapper">
<a href="<%= apipie_apipie_path({version: 'v1'}) %>" target="_blank" class="btn btn-info b-2x rounded m-t-sm documentation-button">
<a href="<%= apipie_apipie_path({version: 'v1'}) %>" target="_blank" class="fab-button is-info m-t-sm documentation-button">
<i class="fa fa-book" aria-hidden="true"></i>&nbsp;
<span translate>{{ 'app.admin.open_api_clients.api_documentation' }}</span>&nbsp;
<span class="exponent"><i class="fa fa-external-link" aria-hidden="true"></i></span>
@ -36,15 +36,15 @@
<div class="col-md-12">
<div class="col-md-12">
<button type="button" class="btn btn-warning m-t m-b" ng-click="createClient()" ng-show="!clientFormVisible" translate>{{ 'app.admin.open_api_clients.add_new_client' | translate }}</button>
<button type="button" class="fab-button is-secondary m-t m-b" ng-click="createClient()" ng-show="!clientFormVisible" translate>{{ 'app.admin.open_api_clients.add_new_client' | translate }}</button>
<form role="form" id="clientForm" ng-show="clientFormVisible" name="clientForm" class="form-inline m-b m-t" novalidate>
<div class="form-group" ng-class="{'has-error': clientForm['client[name]'].$dirty && clientForm['client[name]'].$invalid}">
<input class="form-control" type="text" name="client[name]" ng-model="client.name" value="" placeholder="{{ 'app.admin.open_api_clients.client_name' | translate }}" required>
</div>
<button class="btn btn-default" ng-click="cancelEdit()" name="button">{{ 'app.shared.buttons.cancel' | translate }}</button>
<input type="submit" class="btn btn-warning" ng-disabled="!client.name || client.name.length == 0" ng-click="saveClient(client)" value="{{ 'app.shared.buttons.save' | translate }}">
<button class="fab-button" ng-click="cancelEdit()" name="button">{{ 'app.shared.buttons.cancel' | translate }}</button>
<input type="submit" class="fab-button is-secondary" ng-disabled="!client.name || client.name.length == 0" ng-click="saveClient(client)" value="{{ 'app.shared.buttons.save' | translate }}">
</form>
<table class="table">

View File

@ -1,7 +1,7 @@
<h2 translate>{{ 'app.admin.pricing.list_of_the_coupons' }}</h2>
<div class="m-t-lg m-b">
<button type="button" class="btn btn-warning" ui-sref="app.admin.coupons_new">
<button type="button" class="fab-button is-secondary" ui-sref="app.admin.coupons_new">
<i class="fa fa-plus m-r"></i>
<span translate>{{ 'app.admin.pricing.add_a_new_coupon' }}</span>
</button>
@ -44,5 +44,5 @@
</table>
<div class="text-center">
<button class="btn btn-warning" ng-click="loadMore()" ng-hide="coupons.length === 0 || coupons.length >= coupons[0].total"><i class="fa fa-search-plus" aria-hidden="true"></i> {{ 'app.admin.pricing.display_more_coupons' | translate }}</button>
<button class="fab-button is-secondary" ng-click="loadMore()" ng-hide="coupons.length === 0 || coupons.length >= coupons[0].total"><i class="fa fa-search-plus" aria-hidden="true"></i> {{ 'app.admin.pricing.display_more_coupons' | translate }}</button>
</div>

View File

@ -27,15 +27,15 @@
</td>
<td>
<form editable-form name="rowform" onbeforesave="saveTrainingCredits($data, planId)" ng-show="rowform.$visible" class="form-buttons form-inline" shown="inserted == trainingIds">
<button type="submit" ng-disabled="rowform.$waiting" class="btn btn-warning">
<button type="submit" ng-disabled="rowform.$waiting" class="fab-button is-secondary">
<i class="fa fa-check"></i>
</button>
<button type="button" ng-disabled="rowform.$waiting" ng-click="cancelTrainingCredit(rowform)" class="btn btn-default">
<button type="button" ng-disabled="rowform.$waiting" ng-click="cancelTrainingCredit(rowform)" class="fab-button">
<i class="fa fa-times"></i>
</button>
</form>
<div class="buttons" ng-show="!rowform.$visible">
<button class="btn btn-default" ng-click="rowform.$show()">
<button class="fab-button" ng-click="rowform.$show()">
<i class="fa fa-edit"></i> {{ 'app.shared.buttons.edit' | translate }}
</button>
</div>
@ -48,7 +48,7 @@
<div ng-show="$root.modules.machines">
<h2 class="m-t-lg" translate>{{ 'app.admin.pricing.machines' }}</h2>
<div class="btn-group m-t-md m-b-md">
<button type="button" class="btn btn-warning" ng-click="addMachineCredit($event)" translate>{{ 'app.admin.pricing.add_a_machine_credit' }}</button>
<button type="button" class="fab-button is-secondary" ng-click="addMachineCredit($event)" translate>{{ 'app.admin.pricing.add_a_machine_credit' }}</button>
</div>
<table class="table">
@ -79,18 +79,18 @@
</td>
<td>
<form editable-form name="rowform" onbeforesave="saveMachineCredit($data, mc.id)" ng-show="rowform.$visible" class="form-buttons form-inline" shown="inserted == mc">
<button type="submit" ng-disabled="rowform.$waiting" class="btn btn-warning">
<button type="submit" ng-disabled="rowform.$waiting" class="fab-button is-secondary">
<i class="fa fa-check"></i>
</button>
<button type="button" ng-disabled="rowform.$waiting" ng-click="cancelMachineCredit(rowform, $index)" class="btn btn-default">
<button type="button" ng-disabled="rowform.$waiting" ng-click="cancelMachineCredit(rowform, $index)" class="fab-button">
<i class="fa fa-times"></i>
</button>
</form>
<div class="buttons" ng-show="!rowform.$visible">
<button class="btn btn-default" ng-click="rowform.$show()">
<button class="fab-button" ng-click="rowform.$show()">
<i class="fa fa-edit"></i> {{ 'app.shared.buttons.edit' | translate }}
</button>
<button class="btn btn-danger" ng-click="removeMachineCredit($index)">
<button class="fab-button is-alert" ng-click="removeMachineCredit($index)">
<i class="fa fa-trash-o"></i> {{ 'app.shared.buttons.delete' | translate }}
</button>
</div>
@ -103,7 +103,7 @@
<div ng-show="$root.modules.spaces">
<h2 class="m-t-lg" translate>{{ 'app.admin.pricing.spaces' }}</h2>
<div class="btn-group m-t-md m-b-md">
<button type="button" class="btn btn-warning" ng-click="addSpaceCredit($event)" translate>{{ 'app.admin.pricing.add_a_space_credit' }}</button>
<button type="button" class="fab-button is-secondary" ng-click="addSpaceCredit($event)" translate>{{ 'app.admin.pricing.add_a_space_credit' }}</button>
</div>
<table class="table">
<thead>
@ -133,18 +133,18 @@
</td>
<td>
<form editable-form name="rowform" onbeforesave="saveSpaceCredit($data, sc.id)" ng-show="rowform.$visible" class="form-buttons form-inline" shown="inserted == sc">
<button type="submit" ng-disabled="rowform.$waiting" class="btn btn-warning">
<button type="submit" ng-disabled="rowform.$waiting" class="fab-button is-secondary">
<i class="fa fa-check"></i>
</button>
<button type="button" ng-disabled="rowform.$waiting" ng-click="cancelSpaceCredit(rowform, $index)" class="btn btn-default">
<button type="button" ng-disabled="rowform.$waiting" ng-click="cancelSpaceCredit(rowform, $index)" class="fab-button">
<i class="fa fa-times"></i>
</button>
</form>
<div class="buttons" ng-show="!rowform.$visible">
<button class="btn btn-default" ng-click="rowform.$show()">
<button class="fab-button" ng-click="rowform.$show()">
<i class="fa fa-edit"></i> {{ 'app.shared.buttons.edit' | translate }}
</button>
<button class="btn btn-danger" ng-click="removeSpaceCredit($index)">
<button class="fab-button is-alert" ng-click="removeSpaceCredit($index)">
<i class="fa fa-trash-o"></i> {{ 'app.shared.buttons.delete' | translate }}
</button>
</div>

View File

@ -25,6 +25,6 @@
</div>
</div>
<div class="modal-footer">
<button class="btn btn-warning" ng-click="ok()" ng-disabled="ctrl.member == null" translate>{{ 'app.shared.buttons.confirm' }}</button>
<button class="btn btn-default" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
<button class="fab-button is-secondary" ng-click="ok()" ng-disabled="ctrl.member == null" translate>{{ 'app.shared.buttons.confirm' }}</button>
<button class="fab-button" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
</div>

View File

@ -6,7 +6,7 @@
</div>
<div class="m-t-lg">
<button type="button" class="btn btn-warning new-plan-button" ui-sref="app.admin.plans.new">
<button type="button" class="fab-button is-secondary new-plan-button" ui-sref="app.admin.plans.new">
<i class="fa fa-plus m-r"></i>
<span translate>{{ 'app.admin.pricing.add_a_new_subscription_plan' }}</span>
</button>

View File

@ -12,7 +12,7 @@
</div>
<div class="col-xs-12 col-sm-12 col-md-3 b-t hide-b-md">
<section class="heading-actions wrapper">
<a class="btn btn-ng btn-warning b-2x rounded m-t-sm upper text-sm abuses-button" ui-sref="app.admin.manage_abuses" role="button" translate>{{ 'app.admin.projects.manage_abuses' }}</a>
<a class="m-t-sm fab-button is-secondary abuses-button" ui-sref="app.admin.manage_abuses" role="button" translate>{{ 'app.admin.projects.manage_abuses' }}</a>
</section>
</div>
</div>

View File

@ -1,4 +1,4 @@
<button type="button" class="btn btn-warning m-t m-b" ng-click="addLicence()" translate>{{ 'app.admin.projects.add_a_new_licence' }}</button>
<button type="button" class="fab-button is-secondary m-t m-b" ng-click="addLicence()" translate>{{ 'app.admin.projects.add_a_new_licence' }}</button>
<table class="table">
<thead>
@ -23,18 +23,18 @@
<td>
<!-- form -->
<form editable-form name="rowform" onbeforesave="saveLicence($data, licence.id)" ng-show="rowform.$visible" class="form-buttons form-inline" shown="inserted == licence">
<button type="submit" ng-disabled="rowform.$waiting" class="btn btn-warning">
<button type="submit" ng-disabled="rowform.$waiting" class="fab-button is-secondary">
<i class="fa fa-check"></i>
</button>
<button type="button" ng-disabled="rowform.$waiting" ng-click="cancelLicence(rowform, $index)" class="btn btn-default">
<button type="button" ng-disabled="rowform.$waiting" ng-click="cancelLicence(rowform, $index)" class="fab-button">
<i class="fa fa-times"></i>
</button>
</form>
<div class="buttons" ng-show="!rowform.$visible">
<button class="btn btn-default" ng-click="rowform.$show()">
<button class="fab-button" ng-click="rowform.$show()">
<i class="fa fa-edit"></i> <span class="hidden-xs hidden-sm" translate>{{ 'app.shared.buttons.edit' }}</span>
</button>
<button class="btn btn-danger" ng-click="removeLicence($index)">
<button class="fab-button is-alert" ng-click="removeLicence($index)">
<i class="fa fa-trash-o"></i>
</button>
</div>

View File

@ -1,4 +1,4 @@
<button type="button" class="btn btn-warning m-b m-t" ng-click="addComponent()" translate>{{ 'app.admin.projects.add_a_material' }}</button>
<button type="button" class="fab-button is-secondary m-b m-t" ng-click="addComponent()" translate>{{ 'app.admin.projects.add_a_material' }}</button>
<table class="table">
<thead>
@ -17,18 +17,18 @@
<td>
<!-- form -->
<form editable-form name="rowform" onbeforesave="saveComponent($data, component.id)" ng-show="rowform.$visible" class="form-buttons form-inline" shown="inserted == component">
<button type="submit" ng-disabled="rowform.$waiting" class="btn btn-warning">
<button type="submit" ng-disabled="rowform.$waiting" class="fab-button is-secondary">
<i class="fa fa-check"></i>
</button>
<button type="button" ng-disabled="rowform.$waiting" ng-click="cancelComponent(rowform, $index)" class="btn btn-default">
<button type="button" ng-disabled="rowform.$waiting" ng-click="cancelComponent(rowform, $index)" class="fab-button">
<i class="fa fa-times"></i>
</button>
</form>
<div class="buttons" ng-show="!rowform.$visible">
<button class="btn btn-default" ng-click="rowform.$show()">
<button class="fab-button" ng-click="rowform.$show()">
<i class="fa fa-edit"></i> <span class="hidden-xs hidden-sm" translate>{{ 'app.shared.buttons.edit' }}</span>
</button>
<button class="btn btn-danger" ng-click="removeComponent($index)">
<button class="fab-button is-alert" ng-click="removeComponent($index)">
<i class="fa fa-trash-o"></i>
</button>
</div>

View File

@ -1,4 +1,4 @@
<button type="button" class="btn btn-warning m-t m-b" ng-click="addProjectCategory()" translate>{{ 'app.admin.projects.add_a_new_project_category' }}</button>
<button type="button" class="fab-button is-secondary m-t m-b" ng-click="addProjectCategory()" translate>{{ 'app.admin.projects.add_a_new_project_category' }}</button>
<table class="table">
<thead>
@ -16,18 +16,18 @@
</td>
<td>
<form editable-form name="rowform" onbeforesave="saveProjectCategory($data, projectCategory.id)" ng-show="rowform.$visible" class="form-buttons form-inline" shown="inserted == projectCategory">
<button type="submit" ng-disabled="rowform.$waiting" class="btn btn-warning">
<button type="submit" ng-disabled="rowform.$waiting" class="fab-button is-secondary">
<i class="fa fa-check"></i>
</button>
<button type="button" ng-disabled="rowform.$waiting" ng-click="cancelProjectCategory(rowform, $index)" class="btn btn-default">
<button type="button" ng-disabled="rowform.$waiting" ng-click="cancelProjectCategory(rowform, $index)" class="fab-button">
<i class="fa fa-times"></i>
</button>
</form>
<div class="buttons" ng-show="!rowform.$visible">
<button class="btn btn-default" ng-click="rowform.$show()">
<button class="fab-button" ng-click="rowform.$show()">
<i class="fa fa-edit"></i> <span class="hidden-xs hidden-sm" translate>{{ 'app.shared.buttons.edit' }}</span>
</button>
<button class="btn btn-danger" ng-click="removeProjectCategory($index)">
<button class="fab-button is-alert" ng-click="removeProjectCategory($index)">
<i class="fa fa-trash-o"></i>
</button>
</div>

View File

@ -56,7 +56,7 @@
<input type="file" id="testFile" name="attachment" accept="*/*" required>
</span>
</div>
<input type="submit" class="btn btn-warning" ng-disabled="mimeTestForm.$invalid || $isUploading" value="{{ 'app.shared.buttons.save' | translate}}">
<input type="submit" class="fab-button is-secondary" ng-disabled="mimeTestForm.$invalid || $isUploading" value="{{ 'app.shared.buttons.save' | translate}}">
</form>
</div>
</div>

View File

@ -1,4 +1,4 @@
<button type="button" class="btn btn-warning m-t m-b" ng-click="addTheme()" translate>{{ 'app.admin.projects.add_a_new_theme' }}</button>
<button type="button" class="fab-button is-secondary m-t m-b" ng-click="addTheme()" translate>{{ 'app.admin.projects.add_a_new_theme' }}</button>
<table class="table">
<thead>
@ -17,18 +17,18 @@
<td>
<!-- form -->
<form editable-form name="rowform" onbeforesave="saveTheme($data, theme.id)" ng-show="rowform.$visible" class="form-buttons form-inline" shown="inserted == theme">
<button type="submit" ng-disabled="rowform.$waiting" class="btn btn-warning">
<button type="submit" ng-disabled="rowform.$waiting" class="fab-button is-secondary">
<i class="fa fa-check"></i>
</button>
<button type="button" ng-disabled="rowform.$waiting" ng-click="cancelTheme(rowform, $index)" class="btn btn-default">
<button type="button" ng-disabled="rowform.$waiting" ng-click="cancelTheme(rowform, $index)" class="fab-button">
<i class="fa fa-times"></i>
</button>
</form>
<div class="buttons" ng-show="!rowform.$visible">
<button class="btn btn-default" ng-click="rowform.$show()">
<button class="fab-button" ng-click="rowform.$show()">
<i class="fa fa-edit"></i> <span class="hidden-xs hidden-sm" translate>{{ 'app.shared.buttons.edit' }}</span>
</button>
<button class="btn btn-danger" ng-click="removeTheme($index)">
<button class="fab-button is-alert" ng-click="removeTheme($index)">
<i class="fa fa-trash-o"></i>
</button>
</div>

View File

@ -23,7 +23,7 @@
<div class="col-sm-offset-4 col-sm-4">
<h1 ng-model="aboutTitleSetting.value" medium-editor options='{"placeholder": "{{ "app.admin.settings.title_of_the_about_page" | translate }}", "disableToolbar": true, "disableReturn": false}' class="text-u-c"></h1>
<span class="help-block text-info text-xs"><i class="fa fa-lightbulb-o"></i> {{ 'app.admin.settings.shift_enter_to_force_carriage_return' | translate }}</span>
<button name="button" class="btn btn-warning" ng-click="save(aboutTitleSetting)" translate>{{ 'app.shared.buttons.save' }}</button>
<button name="button" class="fab-button is-secondary" ng-click="save(aboutTitleSetting)" translate>{{ 'app.shared.buttons.save' }}</button>
</div>
</div>
@ -41,7 +41,7 @@
</div>
<span class="help-block text-info text-xs"><i class="fa fa-lightbulb-o"></i> {{ 'app.admin.settings.drag_and_drop_to_insert_images' | translate }} (max. 1200px)</span>
<button name="button" class="btn btn-warning" ng-click="save(aboutBodySetting)" translate>{{ 'app.shared.buttons.save' }}</button>
<button name="button" class="fab-button is-secondary" ng-click="save(aboutBodySetting)" translate>{{ 'app.shared.buttons.save' }}</button>
</div>
<div class="col-md-4 col-md-offset-2">
<div ng-model="aboutContactsSetting.value"
@ -54,7 +54,7 @@
</div>
<span class="help-block text-info text-xs"><i class="fa fa-lightbulb-o"></i> {{ 'app.admin.settings.shift_enter_to_force_carriage_return' | translate }}</span>
<button name="button" class="btn btn-warning" ng-click="save(aboutContactsSetting)" translate>{{ 'app.shared.buttons.save' }}</button>
<button name="button" class="fab-button is-secondary" ng-click="save(aboutContactsSetting)" translate>{{ 'app.shared.buttons.save' }}</button>
</div>
<div class="col-md-4 col-md-offset-2 m-t-xl">
<h2 translate>{{ 'app.admin.settings.about_follow_us' }}</h2>

View File

@ -30,5 +30,5 @@
</div>
</div>
<div class="modal-footer">
<button class="btn btn-warning" ng-click="close()" translate>{{ 'app.shared.buttons.close' }}</button>
<button class="fab-button is-secondary" ng-click="close()" translate>{{ 'app.shared.buttons.close' }}</button>
</div>

View File

@ -105,28 +105,6 @@
</div>
</div>
<div class="panel panel-default m-t-md">
<div class="panel-heading">
<span class="font-sbold" translate>{{ 'app.admin.settings.accounts_management' }}</span>
</div>
<div class="panel-body">
<div class="row">
<h3 class="m-l" translate>{{ 'app.admin.settings.members_list' }}</h3>
<p class="alert alert-warning m-h-md" translate>
{{ 'app.admin.settings.members_list_info' }}
</p>
<div class="col-md-10 col-md-offset-1">
<boolean-setting name="'show_username_in_admin_list'"
settings="allSettings"
label="'app.admin.settings.show_username_in_admin_list' | translate"
on-success="onSuccess"
on-error="onError">
</boolean-setting>
</div>
</div>
</div>
</div>
<div class="panel panel-default m-t-md">
<div class="panel-heading">
<span class="font-sbold" translate>{{ 'app.admin.settings.account.customize_account_settings' }}</span>

View File

@ -31,7 +31,7 @@
{{ 'app.admin.settings.general.neutral' | translate }} <span style="font-weight: normal">{{ 'app.admin.settings.general.eg' | translate }} <cite>{{ 'app.admin.settings.general.the_team' | translate }} <strong translate>{{ 'app.admin.settings.general.neutral_preposition' }}</strong> {{allSettings.fablab_name}}</cite></span>
</label>
</div>
<button name="button" class="btn btn-warning" ng-click="save(nameGenre)" translate>{{ 'app.shared.buttons.save' }}</button>
<button name="button" class="fab-button is-secondary" ng-click="save(nameGenre)" translate>{{ 'app.shared.buttons.save' }}</button>
</form>
</div>
</div>
@ -57,7 +57,7 @@
}'>
</div>
<button name="button" class="btn btn-warning" ng-click="save(machineExplicationsAlert)" translate>{{ 'app.shared.buttons.save' }}</button>
<button name="button" class="fab-button is-secondary" ng-click="save(machineExplicationsAlert)" translate>{{ 'app.shared.buttons.save' }}</button>
</div>
<div class="col-md-3" ng-show="$root.modules.trainings">
<h4 translate>{{ 'app.admin.settings.warning_message_of_the_training_booking_page'}}</h4>
@ -70,7 +70,7 @@
}'>
</div>
<button name="button" class="btn btn-warning" ng-click="save(trainingExplicationsAlert)" translate>{{ 'app.shared.buttons.save' }}</button>
<button name="button" class="fab-button is-secondary" ng-click="save(trainingExplicationsAlert)" translate>{{ 'app.shared.buttons.save' }}</button>
</div>
<div class="col-md-3" ng-show="$root.modules.trainings">
<h4 translate>{{ 'app.admin.settings.information_message_of_the_training_reservation_page'}}</h4>
@ -83,7 +83,7 @@
}'>
</div>
<button name="button" class="btn btn-warning" ng-click="save(trainingInformationMessage)" translate>{{ 'app.shared.buttons.save' }}</button>
<button name="button" class="fab-button is-secondary" ng-click="save(trainingInformationMessage)" translate>{{ 'app.shared.buttons.save' }}</button>
</div>
<div class="col-md-3" ng-show="$root.modules.plans">
<h4 translate>{{ 'app.admin.settings.message_of_the_subscriptions_page' }}</h4>
@ -95,7 +95,7 @@
"targetBlank": true
}'>
</div>
<button name="button" class="btn btn-warning" ng-click="save(subscriptionExplicationsAlert)" translate>{{ 'app.shared.buttons.save' }}</button>
<button name="button" class="fab-button is-secondary" ng-click="save(subscriptionExplicationsAlert)" translate>{{ 'app.shared.buttons.save' }}</button>
</div>
<div class="col-md-3">
<h4 translate>{{ 'app.admin.settings.message_of_the_events_page' }}</h4>
@ -107,7 +107,7 @@
"targetBlank": true
}'>
</div>
<button name="button" class="btn btn-warning" ng-click="save(eventExplicationsAlert)" translate>{{ 'app.shared.buttons.save' }}</button>
<button name="button" class="fab-button is-secondary" ng-click="save(eventExplicationsAlert)" translate>{{ 'app.shared.buttons.save' }}</button>
</div>
<div class="col-md-3" ng-show="$root.modules.spaces" ng-show="$root.modules.spaces">
<h4 translate>{{ 'app.admin.settings.message_of_the_spaces_page' }}</h4>
@ -119,7 +119,7 @@
"targetBlank": true
}'>
</div>
<button name="button" class="btn btn-warning" ng-click="save(spaceExplicationsAlert)" translate>{{ 'app.shared.buttons.save' }}</button>
<button name="button" class="fab-button is-secondary" ng-click="save(spaceExplicationsAlert)" translate>{{ 'app.shared.buttons.save' }}</button>
</div>
</div>
</div>
@ -154,7 +154,7 @@
</span>
</div>
</div>
<button name="button" type="submit" ng-class="{'btn-loading':loader.cgv}" ng-disabled="cgvForm.$invalid" class="btn btn-warning" translate>{{ 'app.shared.buttons.save' }}</button>
<button name="button" type="submit" ng-class="{'btn-loading':loader.cgv}" ng-disabled="cgvForm.$invalid" class="fab-button is-secondary" translate>{{ 'app.shared.buttons.save' }}</button>
</form>
</div>
<div class="row m-t-xl">
@ -178,7 +178,7 @@
</span>
</div>
</div>
<button name="button" type="submit" ng-class="{'btn-loading':loader.cgu}" ng-disabled="cguForm.$invalid" class="btn btn-warning" translate>{{ 'app.shared.buttons.save' }}</button>
<button name="button" type="submit" ng-class="{'btn-loading':loader.cgu}" ng-disabled="cguForm.$invalid" class="fab-button is-secondary" translate>{{ 'app.shared.buttons.save' }}</button>
</form>
</div>
</div>
@ -219,7 +219,7 @@
</div>
</div>
</div>
<button name="button" type="submit" class="btn btn-warning m-t m-l" ng-disabled="logoForm.$invalid" translate>{{ 'app.shared.buttons.save' }}</button>
<button name="button" type="submit" class="fab-button is-secondary m-t m-l" ng-disabled="logoForm.$invalid" translate>{{ 'app.shared.buttons.save' }}</button>
</form>
</div>
<div class="col-md-4">
@ -245,7 +245,7 @@
</div>
</div>
</div>
<button name="button" type="submit" class="btn btn-warning m-t m-l" ng-disabled="logoBlackForm.$invalid" translate>{{ 'app.shared.buttons.save' }}</button>
<button name="button" type="submit" class="fab-button is-secondary m-t m-l" ng-disabled="logoBlackForm.$invalid" translate>{{ 'app.shared.buttons.save' }}</button>
</form>
</div>
<div class="col-md-4">
@ -271,7 +271,7 @@
</div>
</div>
</div>
<button name="button" type="submit" class="btn btn-warning m-t m-l" ng-disabled="faviconForm.$invalid" translate>{{ 'app.shared.buttons.save' }}</button>
<button name="button" type="submit" class="fab-button is-secondary m-t m-l" ng-disabled="faviconForm.$invalid" translate>{{ 'app.shared.buttons.save' }}</button>
</form>
</div>
</div>
@ -288,7 +288,7 @@
</div>
</div>
<div class="form-group">
<button name="button" class="btn btn-warning" ng-click="save(mainColorSetting)" translate>{{ 'app.shared.buttons.save' }}</button>
<button name="button" class="fab-button is-secondary" ng-click="save(mainColorSetting)" translate>{{ 'app.shared.buttons.save' }}</button>
</div>
</form>
</div>
@ -304,7 +304,7 @@
</div>
</div>
<div class="form-group">
<button name="button" class="btn btn-warning" ng-click="save(secondColorSetting)" translate>{{ 'app.shared.buttons.save' }}</button>
<button name="button" class="fab-button is-secondary" ng-click="save(secondColorSetting)" translate>{{ 'app.shared.buttons.save' }}</button>
</div>
</form>
</div>
@ -332,8 +332,9 @@
</div>
</div>
</div>
</div>
<button name="button" type="submit" class="btn btn-warning m-t m-l" ng-disabled="profileImageForm.$invalid" translate>{{ 'app.shared.buttons.save' }}</button>
</div>
<span class="block m-t-xs m-l text-gray text-sm" translate>{{ 'app.admin.settings.background_picture_recommendation' }}</span>
<button name="button" type="submit" class="fab-button is-secondary m-t m-l" ng-disabled="profileImageForm.$invalid" translate>{{ 'app.shared.buttons.save' }}</button>
</form>
</div>
</div>

View File

@ -3,12 +3,12 @@
<div class="row">
<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 reset-button" ng-click="resetHomePage()" title="{{ 'app.admin.settings.reset_home_page' | translate }}"><i class="fa fa-undo"></i></button>
<button class="fab-button pull-right m-t-n-xl reset-button" 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">
</summernote>
<button name="button" class="btn btn-warning" ng-click="save(homeContent)" translate>{{ 'app.shared.buttons.save' }}</button>
<button name="button" class="fab-button is-secondary" ng-click="save(homeContent)" translate>{{ 'app.shared.buttons.save' }}</button>
</div>
</div>
<div class="row m-t-lg">
@ -24,7 +24,7 @@
}'>
</div>
<span class="help-block text-info text-xs"><i class="fa fa-lightbulb-o"></i> {{ 'app.admin.settings.leave_it_empty_to_not_bring_up_any_news_on_the_home_page' | translate }}</span>
<button name="button" class="btn btn-warning" ng-click="save(homeBlogpostSetting)" translate>{{ 'app.shared.buttons.save' }}</button>
<button name="button" class="fab-button is-secondary" ng-click="save(homeBlogpostSetting)" translate>{{ 'app.shared.buttons.save' }}</button>
</div>
<div class="col-md-6">
<text-setting name="twitter_name"
@ -64,7 +64,7 @@
<span translate>{{ 'app.admin.settings.home_css_notice_html' }}</span>
</p>
</uib-alert>
<button name="button" class="btn btn-warning" ng-click="save(homeCss)" translate>{{ 'app.shared.buttons.save' }}</button>
<button name="button" class="fab-button is-secondary" ng-click="save(homeCss)" translate>{{ 'app.shared.buttons.save' }}</button>
</div>
</uib-accordion-group>
</uib-accordion>

View File

@ -9,7 +9,7 @@
</form>
</div>
<div class="modal-footer">
<button class="btn btn-warning" ng-disabled="newSelectOptionForm.$invalid" ng-click="ok()" translate>{{ 'app.shared.buttons.confirm' }}</button>
<button class="btn btn-default" ng-click="dismiss()" translate>{{ 'app.shared.buttons.cancel' }}</button>
<button class="fab-button is-secondary" ng-disabled="newSelectOptionForm.$invalid" ng-click="ok()" translate>{{ 'app.shared.buttons.confirm' }}</button>
<button class="fab-button" ng-click="dismiss()" translate>{{ 'app.shared.buttons.cancel' }}</button>
</div>
</div>

View File

@ -11,5 +11,5 @@
<i class="fa fa-lightbulb-o"></i> {{ helperText | translate }}
</span>
</div>
<button name="button" class="btn btn-warning" ng-click="save(setting)" ng-disabled="settingNumberForm.$invalid" translate>{{ 'app.shared.buttons.save' }}</button>
<button name="button" class="fab-button is-secondary" ng-click="save(setting)" ng-disabled="settingNumberForm.$invalid" translate>{{ 'app.shared.buttons.save' }}</button>
</form>

View File

@ -15,7 +15,7 @@
</div>
<span class="help-block text-info text-xs"><i class="fa fa-lightbulb-o"></i> {{ 'app.admin.settings.drag_and_drop_to_insert_images' | translate }}</span>
<button name="button" class="btn btn-warning" ng-click="savePrivacyPolicy()" translate>{{ 'app.shared.buttons.save' }}</button>
<button name="button" class="fab-button is-secondary" ng-click="savePrivacyPolicy()" translate>{{ 'app.shared.buttons.save' }}</button>
</div>
<div class="col-md-3">
<div ng-model="privacyDpoSetting.value" medium-editor options='{"placeholder": "{{ "app.admin.settings.privacy.input_the_dpo" | translate }}",
@ -24,7 +24,7 @@
</div>
<span class="help-block text-info text-xs"><i class="fa fa-lightbulb-o"></i> {{ 'app.admin.settings.shift_enter_to_force_carriage_return' | translate }}</span>
<button name="button" class="btn btn-warning" ng-click="save(privacyDpoSetting)" translate>{{ 'app.shared.buttons.save' }}</button>
<button name="button" class="fab-button is-secondary" ng-click="save(privacyDpoSetting)" translate>{{ 'app.shared.buttons.save' }}</button>
</div>
</div>

View File

@ -11,14 +11,14 @@
<uib-timepicker ng-model="windowStart.value" hour-step="timepicker.hstep" minute-step="timepicker.mstep" show-meridian="false"></uib-timepicker>
</div>
<div class="col-md-4 m-t">
<button name="button" class="btn btn-warning m-l" ng-click="save(windowStart)" translate>{{ 'app.shared.buttons.save' }}</button>
<button name="button" class="fab-button is-secondary m-l" ng-click="save(windowStart)" translate>{{ 'app.shared.buttons.save' }}</button>
</div>
<div class="col-md-2">
<h4 translate>{{ 'app.admin.settings.closing_time' }}</h4>
<uib-timepicker ng-model="windowEnd.value" hour-step="timepicker.hstep" minute-step="timepicker.mstep" show-meridian="false"></uib-timepicker>
</div>
<div class="col-md-4 m-t">
<button name="button" class="btn btn-warning m-l" ng-click="save(windowEnd)" translate>{{ 'app.shared.buttons.save' }}</button>
<button name="button" class="fab-button is-secondary m-l" ng-click="save(windowEnd)" translate>{{ 'app.shared.buttons.save' }}</button>
</div>
</div>
<div class="section-separator"></div>
@ -269,7 +269,7 @@
<div class="row p-l p-r" ng-if="reservationContextFeature.value === 'true'">
<h3 class="" translate>{{ 'app.admin.settings.reservation_context_options' }}</h3>
<button type="button" class="btn btn-warning m-b m-t" ng-click="addReservationContext()" translate>{{ 'app.admin.settings.add_a_reservation_context' }}</button>
<button type="button" class="fab-button is-secondary m-b m-t" ng-click="addReservationContext()" translate>{{ 'app.admin.settings.add_a_reservation_context' }}</button>
<table class="table">
<thead>
<tr>
@ -299,18 +299,18 @@
<td>
<!-- form -->
<form editable-form name="rowform" onbeforesave="saveReservationContext($data, reservationContext.id)" ng-show="rowform.$visible" class="form-buttons form-inline" shown="newReservationContext == reservationContext">
<button type="submit" ng-disabled="rowform.$waiting" class="btn btn-warning">
<button type="submit" ng-disabled="rowform.$waiting" class="fab-button is-secondary">
<i class="fa fa-check"></i>
</button>
<button type="button" ng-disabled="rowform.$waiting" ng-click="cancelReservationContext(rowform, $index)" class="btn btn-default">
<button type="button" ng-disabled="rowform.$waiting" ng-click="cancelReservationContext(rowform, $index)" class="fab-button">
<i class="fa fa-times"></i>
</button>
</form>
<div class="buttons" ng-show="!rowform.$visible">
<button class="btn btn-default" ng-click="rowform.$show()">
<button class="fab-button" ng-click="rowform.$show()">
<i class="fa fa-edit"></i> <span class="hidden-xs hidden-sm" translate>{{ 'app.shared.buttons.edit' }}</span>
</button>
<button class="btn btn-danger" ng-click="removeReservationContext($index)">
<button class="fab-button is-alert" ng-click="removeReservationContext($index)">
<i class="fa fa-trash-o"></i>
</button>
</div>

View File

@ -6,7 +6,7 @@
<p translate>{{ 'app.admin.settings.privacy.publish_will_notify' }}</p>
</div>
<div class="modal-footer">
<button class="btn btn-info" ng-click="save()" translate>{{ 'app.shared.buttons.save' }}</button>
<button class="btn btn-warning" ng-click="publish()" translate>{{ 'app.admin.settings.privacy.publish' }}</button>
<button class="btn btn-default" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
<button class="fab-button is-info" ng-click="save()" translate>{{ 'app.shared.buttons.save' }}</button>
<button class="fab-button is-secondary" ng-click="publish()" translate>{{ 'app.admin.settings.privacy.publish' }}</button>
<button class="fab-button" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
</div>

View File

@ -13,5 +13,5 @@
<button ng-click="removeItem()" class="btn btn-default"><i class="fa fa-trash"></i></button>
<button ng-click="addItem()" class="btn btn-default"><i class="fa fa-plus"></i></button>
</div>
<button name="button" class="btn btn-warning m-t" ng-click="save(setting)" ng-disabled="settingSelectMultipleForm.$invalid" translate>{{ 'app.shared.buttons.save' }}</button>
<button name="button" class="fab-button is-secondary m-t" ng-click="save(setting)" ng-disabled="settingSelectMultipleForm.$invalid" translate>{{ 'app.shared.buttons.save' }}</button>
</form>

View File

@ -12,5 +12,5 @@
<option ng-if="option5" ng-value="option5[0]" translate>{{ option5[1] }}</option>
</select>
</div>
<button name="button" class="btn btn-warning m-t" ng-click="save(setting)" ng-disabled="settingSelectForm.$invalid" translate>{{ 'app.shared.buttons.save' }}</button>
<button name="button" class="fab-button is-secondary m-t" ng-click="save(setting)" ng-disabled="settingSelectForm.$invalid" translate>{{ 'app.shared.buttons.save' }}</button>
</form>

View File

@ -17,5 +17,5 @@
ng-readonly="readOnly">
</div>
</div>
<button name="button" class="btn btn-warning m-t" ng-click="save(setting)" ng-disabled="settingTextForm.$invalid || readOnly" translate>{{ 'app.shared.buttons.save' }}</button>
<button name="button" class="fab-button is-secondary m-t" ng-click="save(setting)" ng-disabled="settingTextForm.$invalid || readOnly" translate>{{ 'app.shared.buttons.save' }}</button>
</form>

View File

@ -12,7 +12,7 @@
</div>
<div class="col-xs-12 col-sm-12 col-md-3 b-t hide-b-md">
<section class="heading-actions wrapper">
<a class="btn btn-lg btn-warning bg-white b-2x rounded m-t-sm upper text-sm" ui-sref="app.admin.statistics" role="button"><i class="fa fa-table"></i> {{ 'app.admin.stats_graphs.data' | translate }}</a>
<a class="fab-button is-secondary m-t-sm" ui-sref="app.admin.statistics" role="button"><i class="fa fa-table"></i> {{ 'app.admin.stats_graphs.data' | translate }}</a>
</section>
</div>
</div>

View File

@ -12,9 +12,9 @@
</div>
<div class="col-xs-12 col-sm-12 col-md-3 b-t hide-b-md">
<section class="heading-actions wrapper">
<a class="btn btn-lg btn-default rounded m-t-sm text-sm export-button" ng-click="exportToExcel()"><i class="fa fa-file-excel-o"></i></a>
<a class="fab-button m-t-sm export-button" ng-click="exportToExcel()"><i class="fa fa-file-excel-o"></i></a>
<iframe name="export-frame" height="0" width="0" class="none" id="stats-export-frame"></iframe>
<a class="btn btn-lg btn-warning bg-white b-2x rounded m-t-sm upper text-sm charts-button" ui-sref="app.admin.stats_graphs" role="button"><i class="fa fa-line-chart"></i> {{ 'app.admin.statistics.evolution' | translate }}</a>
<a class="fab-button is-secondary m-t-sm charts-button" ui-sref="app.admin.stats_graphs" role="button"><i class="fa fa-line-chart"></i> {{ 'app.admin.statistics.evolution' | translate }}</a>
</section>
</div>
</div>
@ -299,7 +299,7 @@
</tbody>
</table>
<div class="text-center">
<button class="btn btn-warning" ng-click="showMoreResults()" ng-hide="data && data.length >= totalHits"><i class="fa fa-search-plus" aria-hidden="true"></i> {{ 'app.admin.statistics.display_more_results' | translate }}</button>
<button class="fab-button is-secondary" ng-click="showMoreResults()" ng-hide="data && data.length >= totalHits"><i class="fa fa-search-plus" aria-hidden="true"></i> {{ 'app.admin.statistics.display_more_results' | translate }}</button>
</div>
</uib-tab>
</uib-tabset>

View File

@ -1,4 +1,4 @@
<button type="button" class="btn btn-warning m-b m-t-lg" ng-click="addTag()" translate>{{ 'app.admin.members.tag_form.add_a_tag'}}</button>
<button type="button" class="fab-button is-secondary m-b m-t-lg" ng-click="addTag()" translate>{{ 'app.admin.members.tag_form.add_a_tag'}}</button>
<table class="table">
<thead>
<tr>
@ -16,18 +16,18 @@
<td>
<!-- form -->
<form editable-form name="rowform" onbeforesave="saveTag($data, tag.id)" ng-show="rowform.$visible" class="form-buttons form-inline" shown="inserted == tag">
<button type="submit" ng-disabled="rowform.$waiting" class="btn btn-warning">
<button type="submit" ng-disabled="rowform.$waiting" class="fab-button is-secondary">
<i class="fa fa-check"></i>
</button>
<button type="button" ng-disabled="rowform.$waiting" ng-click="cancelTag(rowform, $index)" class="btn btn-default">
<button type="button" ng-disabled="rowform.$waiting" ng-click="cancelTag(rowform, $index)" class="fab-button">
<i class="fa fa-times"></i>
</button>
</form>
<div class="buttons" ng-show="!rowform.$visible">
<button class="btn btn-default" ng-click="rowform.$show()">
<button class="fab-button" ng-click="rowform.$show()">
<i class="fa fa-edit"></i> <span class="hidden-xs hidden-sm" translate>{{ 'app.shared.buttons.edit' }}</span>
</button>
<button class="btn btn-danger" ng-click="removeTag($index)">
<button class="fab-button is-alert" ng-click="removeTag($index)">
<i class="fa fa-trash-o"></i>
</button>
</div>

View File

@ -10,5 +10,5 @@
</form>
</div>
<div class="modal-footer">
<button class="btn btn-warning" ng-disabled="trainingForm.$invalid" ng-click="save()" translate>{{ 'app.shared.buttons.save' }}</button>
<button class="fab-button is-secondary" ng-disabled="trainingForm.$invalid" ng-click="save()" translate>{{ 'app.shared.buttons.save' }}</button>
</div>

View File

@ -16,6 +16,6 @@
<p ng-if="availability.reservation_users.length == 0" translate>{{ 'app.admin.trainings.no_reservation' }}</p>
</div>
<div class="modal-footer">
<button class="btn btn-warning" ng-click="ok()" ng-disabled="usersToValid.length == 0" translate>{{ 'app.admin.trainings.validate_the_trainings' }}</button>
<button class="btn btn-default" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
<button class="fab-button is-secondary" ng-click="ok()" ng-disabled="usersToValid.length == 0" translate>{{ 'app.admin.trainings.validate_the_trainings' }}</button>
<button class="fab-button" ng-click="cancel()" translate>{{ 'app.shared.buttons.cancel' }}</button>
</div>

View File

@ -15,5 +15,5 @@
</p>
</div>
<div class="modal-footer">
<button class="btn btn-warning" ng-click="close()" translate>{{ 'app.shared.buttons.close' }}</button>
<button class="fab-button is-secondary" ng-click="close()" translate>{{ 'app.shared.buttons.close' }}</button>
</div>

View File

@ -10,7 +10,7 @@
<div class="row no-gutter">
<div class="row m-t-md">
<a class="btn btn-lg btn-warning bg-white b-2x rounded m-t-sm upper text-sm col-lg-offset-10" ui-sref="app.logged.projects_new" role="button" translate>{{ 'app.logged.dashboard.projects.add_a_project' }}</a>
<a class="fab-button is-secondary m-t-sm col-lg-offset-10" ui-sref="app.logged.projects_new" role="button" translate>{{ 'app.logged.dashboard.projects.add_a_project' }}</a>
</div>
<div class="wrapper" ng-if="user.all_projects.length == 0" translate>{{ 'app.logged.dashboard.projects.you_dont_have_any_projects' }}</div>
@ -20,7 +20,7 @@
<span class="m-l-sm label label-success text-white">{{project.author_id == currentUser.id ? 'app.logged.dashboard.projects.author' : 'app.logged.dashboard.projects.collaborator' | translate}}</span>
<span class="badge" ng-if="project.state == 'draft'" translate>{{ 'app.logged.dashboard.projects.rough_draft' }}</span>
<div class="pull-right">
<a class="btn btn-warning bg-white b-2x rounded upper text-sm text-black" ui-sref="app.public.projects_show({id:project.slug})" role="button" translate>{{ 'app.shared.buttons.consult' }}</a>
<a class="fab-button is-secondary" ui-sref="app.public.projects_show({id:project.slug})" role="button" translate>{{ 'app.shared.buttons.consult' }}</a>
</div>
</div>
<div class="widget-content bg-light clearfix">

View File

@ -31,7 +31,7 @@
</uib-alert>
</div>
<div ng-show="!user.subscribed_plan.name">{{ 'app.logged.dashboard.settings.no_subscriptions' | translate }} <br><a class="btn text-black btn-warning-full btn-sm m-t-xs" ui-sref="app.public.plans" translate>{{ 'app.logged.dashboard.settings.i_want_to_subscribe' }}</a></div>
<div ng-show="!user.subscribed_plan.name">{{ 'app.logged.dashboard.settings.no_subscriptions' | translate }} <br><a class="fab-button is-secondary button-s m-t-xs" ui-sref="app.public.plans" translate>{{ 'app.logged.dashboard.settings.i_want_to_subscribe' }}</a></div>
</div>
<div class="m-t">
@ -70,10 +70,10 @@
<div ng-show="cookiesStatus === 'accept'" translate>{{ 'app.logged.dashboard.settings.cookies_accepted' }}</div>
<div ng-show="cookiesStatus === 'decline'" translate>{{ 'app.logged.dashboard.settings.cookies_declined' }}</div>
<div ng-hide="cookiesStatus" translate>{{ 'app.logged.dashboard.settings.cookies_unset' }}</div>
<button ng-click="resetCookies()" ng-show="cookiesStatus" class="btn text-black btn-warning-full btn-sm m-t-xs" translate>{{ 'app.logged.dashboard.settings.reset_cookies' }}</button>
<button ng-click="resetCookies()" ng-show="cookiesStatus" class="fab-button is-secondary button-s m-t-xs" translate>{{ 'app.logged.dashboard.settings.reset_cookies' }}</button>
</div>
<div class="widget-content no-bg text-center auto wrapper" ng-hide="isAdminSys">
<button class="btn text-white btn-danger btn-sm" ng-click="deleteUser(user)"><i class="fa fa-warning m-r-xs"></i> {{ 'app.logged.dashboard.settings.delete_my_account' | translate }}</button>
<button class="fab-button is-alert button-s" ng-click="deleteUser(user)"><i class="fa fa-warning m-r-xs"></i> {{ 'app.logged.dashboard.settings.delete_my_account' | translate }}</button>
</div>
</div>
@ -94,13 +94,13 @@
</div>
<div class="panel-body row">
<div class="col-lg-6 col-md-6 col-sm-12 col-xs-12">
<a class="btn btn-default" ng-href="{{activeProvider.link_to_sso_profile}}" target="_blank">
<a class="fab-button" ng-href="{{activeProvider.link_to_sso_profile}}" target="_blank">
<i class="fa fa-edit"></i> {{ 'app.logged.dashboard.settings.change_my_data' | translate }}
</a>
<p>{{ 'app.logged.dashboard.settings.once_your_data_are_up_to_date_' | translate }} <strong translate>{{ 'app.logged.dashboard.settings._click_on_the_synchronization_button_opposite_' }}</strong> {{ 'app.logged.dashboard.settings.or' | translate}} <strong translate>{{ 'app.logged.dashboard.settings._disconnect_then_reconnect_' }}</strong> {{ 'app.logged.dashboard.settings._for_your_changes_to_take_effect' | translate }}</p>
</div>
<div class="col-lg-6 col-md-6 col-sm-12 col-xs-12">
<a class="btn btn-default" ng-click="syncProfile()">
<a class="fab-button" ng-click="syncProfile()">
<i class="fa fa-refresh"></i> {{ 'app.logged.dashboard.settings.sync_my_profile' | translate }}
</a>
</div>

View File

@ -5,6 +5,7 @@
<div class="modal-body">
<p ng-hide="isRecurrent" translate>{{ 'app.public.events_show.do_you_really_want_to_delete_this_event' }}</p>
<p ng-show="isRecurrent" translate>{{ 'app.public.events_show.delete_recurring_event' }}</p>
<p translate>{{ 'app.public.events_show.all_reservations_for_this_event_will_be_canceled' }}</p>
<div ng-show="isRecurrent" class="form-group">
<label class="checkbox">
<input type="radio" name="delete_mode" ng-model="deleteMode" value="single" required/>

View File

@ -13,65 +13,64 @@
<div class="col-xs-12 col-sm-12 col-md-3 b-t hide-b-md" ng-if="isAuthorized(['admin'])">
<section class="heading-actions wrapper">
<a class="btn btn-lg btn-warning bg-white b-2x rounded m-t-sm upper text-sm" ui-sref="app.admin.events_new" role="button" translate>{{ 'app.public.events_list.add_an_event' }}</a>
<a class="fab-button is-secondary m-t-sm" ui-sref="app.admin.events_new" role="button" translate>{{ 'app.public.events_list.add_an_event' }}</a>
</section>
</div>
</div>
</section>
<section class="events-list-page">
<events-editorial-block on-error="onError"></events-editorial-block>
<section class="events-list-page">
<events-editorial-block on-error="onError"></events-editorial-block>
<div class="row">
<div class="col-md-3" ng-show="categories.length > 0">
<select ng-model="filters.category_id" ng-change="filterEvents()" class="form-control" ng-options="c.id as c.name for c in categories">
<option value="" translate>{{ 'app.public.events_list.all_categories' }}</option>
</select>
</div>
<div class="col-md-3" ng-show="themes.length > 0">
<select ng-model="filters.theme_id" ng-change="filterEvents()" class="form-control" ng-options="t.id as t.name for t in themes">
<option value="" translate>{{ 'app.public.events_list.all_themes' }}</option>
</select>
</div>
<div class="col-md-3" ng-show="ageRanges.length > 0">
<select ng-model="filters.age_range_id" ng-change="filterEvents()" class="form-control" ng-options="a.id as a.name for a in ageRanges">
<option value="" translate>{{ 'app.public.events_list.for_all' }}</option>
</select>
</div>
<div class="row">
<div class="col-md-3" ng-show="categories.length > 0">
<select ng-model="filters.category_id" ng-change="filterEvents()" class="form-control" ng-options="c.id as c.name for c in categories">
<option value="" translate>{{ 'app.public.events_list.all_categories' }}</option>
</select>
</div>
<div class="event-focus" ng-if="featuredEevent && (!currentUser || currentUser.role === 'member')">
<div class="col-md-3" ng-show="themes.length > 0">
<select ng-model="filters.theme_id" ng-change="filterEvents()" class="form-control" ng-options="t.id as t.name for t in themes">
<option value="" translate>{{ 'app.public.events_list.all_themes' }}</option>
</select>
</div>
<div class="col-md-3" ng-show="ageRanges.length > 0">
<select ng-model="filters.age_range_id" ng-change="filterEvents()" class="form-control" ng-options="a.id as a.name for a in ageRanges">
<option value="" translate>{{ 'app.public.events_list.for_all' }}</option>
</select>
</div>
</div>
<div class="event-focus" ng-if="featuredEevent && (!currentUser || currentUser.role === 'member')">
<event-card style="display: contents"
event="featuredEevent"
card-type="'lg'"
ui-sref="app.public.events_show({id: featuredEevent.id})">
</event-card>
</div>
<div ng-repeat="month in monthOrder">
<h1>{{monthNames[month.split(',')[0] - 1]}}, {{month.split(',')[1]}}</h1>
<div class="event-monthList">
<event-card style="display: contents"
event="featuredEevent"
card-type="'lg'"
ui-sref="app.public.events_show({id: featuredEevent.id})">
event="event"
ng-repeat="event in eventsGroupByMonth[month]"
card-type="'sm'"
ng-if="isAuthorized(['admin', 'manager']) || event.id !== featuredEevent.id"
ng-class="{'featured-event': event.id === featuredEevent.id}"
ui-sref="app.public.events_show({id: event.id})">
</event-card>
</div>
<div ng-repeat="month in monthOrder">
<h1>{{monthNames[month.split(',')[0] - 1]}}, {{month.split(',')[1]}}</h1>
</div>
<div class="event-monthList">
<event-card style="display: contents"
event="event"
ng-repeat="event in eventsGroupByMonth[month]"
card-type="'sm'"
ng-if="isAuthorized(['admin', 'manager']) || event.id !== featuredEevent.id"
ng-class="{'featured-event': event.id === featuredEevent.id}"
ui-sref="app.public.events_show({id: event.id})">
</event-card>
</div>
<div class="row">
<div class="col-lg-12 text-center m-t-md">
<a class="fab-button is-secondary" ng-click="loadMoreEvents()" ng-hide="noMoreResults" translate>{{ 'app.public.events_list.load_the_next_events' }}</a>
</div>
</div>
<div class="row">
<div class="col-lg-12 text-center m-t-md">
<a class="btn btn-warning" ng-click="loadMoreEvents()" ng-hide="noMoreResults" translate>{{ 'app.public.events_list.load_the_next_events' }}</a>
</div>
</div>
</section>
</section>

View File

@ -17,8 +17,8 @@
<div class="col-xs-12 col-sm-12 col-md-3 b-t hide-b-md" ng-if="isAuthorized(['admin', 'manager'])">
<section class="heading-actions wrapper">
<a ui-sref="app.admin.events_edit({id: event.id})" class="btn btn-lg btn-warning bg-white b-2x rounded m-t-xs text-u-c text-sm"><i class="fa fa-edit"></i> {{ 'app.shared.buttons.edit' | translate }}</a>
<a ng-click="deleteEvent(event)" class="btn btn-lg btn-danger b-2x rounded no-b m-t-xs"><i class="fa fa-trash-o"></i></a>
<a ui-sref="app.admin.events_edit({id: event.id})" class="fab-button is-secondary m-t-xs"><i class="fa fa-edit"></i> {{ 'app.shared.buttons.edit' | translate }}</a>
<a ng-click="deleteEvent(event)" class="fab-button is-alert no-b m-t-xs"><i class="fa fa-trash-o"></i></a>
</section>
</div>
@ -250,7 +250,7 @@
<span ng-show="reservations.length > 0" translate>{{ 'app.public.events_show.thanks_for_coming' }}</span>
<a ui-sref="app.public.events_list" translate>{{ 'app.public.events_show.view_event_list' }}</a>
</div>
<button class="btn btn-warning-full rounded btn-block text-sm" ng-click="reserveEvent()" ng-show="isShowReserveEventButton()">
<button class="fab-button is-secondary" ng-click="reserveEvent()" ng-show="isShowReserveEventButton()">
<span ng-if="event.pre_registration">{{ 'app.public.events_show.pre_book' | translate }}</span>
<span ng-if="!event.pre_registration">{{ 'app.public.events_show.book' | translate }}</span>
</button>
@ -266,11 +266,11 @@
</div>
<div class="panel-footer no-padder ng-scope" ng-if="!event.pre_registration && event.amount && reservationIsValid()">
<button class="btn btn-valid btn-info btn-block p-l btn-lg text-u-c r-b text-base" ng-click="payEvent()" ng-if="reserve.totalSeats > 0">{{ 'app.public.events_show.confirm_and_pay' | translate }} {{reserve.amountTotal | currency}}</button>
<button class="fab-button is-info button-full" ng-click="payEvent()" ng-if="reserve.totalSeats > 0">{{ 'app.public.events_show.confirm_and_pay' | translate }} {{reserve.amountTotal | currency}}</button>
</div>
<div class="panel-footer no-padder ng-scope" ng-if="(event.pre_registration || event.amount == 0) && reservationIsValid()">
<button class="btn btn-valid btn-info btn-block p-l btn-lg text-u-c r-b text-base" ng-click="validReserveEvent()" ng-if="reserve.totalSeats > 0" ng-disabled="attempting">{{ 'app.shared.buttons.confirm' | translate }}</button>
<button class="fab-button is-info button-full" ng-click="validReserveEvent()" ng-if="reserve.totalSeats > 0" ng-disabled="attempting">{{ 'app.shared.buttons.confirm' | translate }}</button>
</div>
</section>

Some files were not shown because too many files have changed in this diff Show More