mirror of
https://github.com/LaCasemate/fab-manager.git
synced 2024-11-29 10:24:20 +01:00
Merge branch 'dev' for release 6.2.0
This commit is contained in:
commit
60da6a8cc1
@ -1,5 +1,14 @@
|
|||||||
# Changelog Fab-manager
|
# Changelog Fab-manager
|
||||||
|
|
||||||
|
## 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
|
||||||
|
|
||||||
## v6.1.2 2023 October 2
|
## v6.1.2 2023 October 2
|
||||||
|
|
||||||
- Fix a bug: minor pb (exception raised) when bot hit api/projects#search without beeing authenticated
|
- Fix a bug: minor pb (exception raised) when bot hit api/projects#search without beeing authenticated
|
||||||
|
@ -218,7 +218,8 @@ export const EventForm: React.FC<EventFormProps> = ({ action, event, onError, on
|
|||||||
id="event_image_attributes"
|
id="event_image_attributes"
|
||||||
accept="image/*"
|
accept="image/*"
|
||||||
defaultImage={output.event_image_attributes}
|
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}
|
<FormRichText control={control}
|
||||||
id="description"
|
id="description"
|
||||||
rules={{ required: true }}
|
rules={{ required: true }}
|
||||||
|
@ -28,7 +28,7 @@ type FormImageUploadProps<TFieldValues, TContext extends object> = FormComponent
|
|||||||
/**
|
/**
|
||||||
* This component allows to upload image, in forms managed by react-hook-form.
|
* 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 { t } = useTranslation('shared');
|
||||||
|
|
||||||
const [file, setFile] = useState<ImageType>(defaultImage);
|
const [file, setFile] = useState<ImageType>(defaultImage);
|
||||||
@ -125,7 +125,8 @@ export const FormImageUpload = <TFieldValues extends FieldValues, TContext exten
|
|||||||
warning={warning}
|
warning={warning}
|
||||||
id={`${id}.attachment_files`}
|
id={`${id}.attachment_files`}
|
||||||
onChange={onFileSelected}
|
onChange={onFileSelected}
|
||||||
placeholder={placeholder()}/>
|
placeholder={placeholder()}
|
||||||
|
tooltip={tooltip} />
|
||||||
{hasImage() && <FabButton onClick={onRemoveFile} icon={<Trash size={20} weight="fill" />} className="is-main" />}
|
{hasImage() && <FabButton onClick={onRemoveFile} icon={<Trash size={20} weight="fill" />} className="is-main" />}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -58,7 +58,7 @@ const MachineCard: React.FC<MachineCardProps> = ({ user, machine, onShowMachine,
|
|||||||
return (
|
return (
|
||||||
<div className={`machine-card ${loading ? 'loading' : ''} ${machine.disabled ? 'disabled' : ''} ${!machine.reservable ? 'unreservable' : ''}`}>
|
<div className={`machine-card ${loading ? 'loading' : ''} ${machine.disabled ? 'disabled' : ''} ${!machine.reservable ? 'unreservable' : ''}`}>
|
||||||
{machinePicture()}
|
{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">
|
<div className="machine-name">
|
||||||
{machine.name}
|
{machine.name}
|
||||||
</div>
|
</div>
|
||||||
|
@ -123,7 +123,8 @@ export const MachineForm: React.FC<MachineFormProps> = ({ action, machine, onErr
|
|||||||
id="machine_image_attributes"
|
id="machine_image_attributes"
|
||||||
accept="image/*"
|
accept="image/*"
|
||||||
defaultImage={output.machine_image_attributes}
|
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}
|
<FormRichText control={control}
|
||||||
id="description"
|
id="description"
|
||||||
rules={{ required: true }}
|
rules={{ required: true }}
|
||||||
|
@ -123,7 +123,8 @@ export const SpaceForm: React.FC<SpaceFormProps> = ({ action, space, onError, on
|
|||||||
id="space_image_attributes"
|
id="space_image_attributes"
|
||||||
accept="image/*"
|
accept="image/*"
|
||||||
defaultImage={output.space_image_attributes}
|
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}
|
<FormInput register={register}
|
||||||
type="number"
|
type="number"
|
||||||
id="default_places"
|
id="default_places"
|
||||||
|
@ -57,13 +57,20 @@ export const SupportingDocumentsTypeForm: React.FC<SupportingDocumentsTypeFormPr
|
|||||||
onChange('name', value);
|
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 (
|
return (
|
||||||
<div className="supporting-documents-type-form">
|
<div className="supporting-documents-type-form">
|
||||||
<div className="info-area">
|
<div className="info-area">
|
||||||
{t('app.admin.settings.account.supporting_documents_type_form.type_form_info')}
|
{t('app.admin.settings.account.supporting_documents_type_form.type_form_info')}
|
||||||
</div>
|
</div>
|
||||||
<form name="supportingDocumentTypeForm">
|
<form name="supportingDocumentTypeForm">
|
||||||
{supportingDocumentType?.document_type === 'User' &&
|
{displayGroupsSelect() &&
|
||||||
<div className="field">
|
<div className="field">
|
||||||
<Select defaultValue={groupsValues()}
|
<Select defaultValue={groupsValues()}
|
||||||
placeholder={t('app.admin.settings.account.supporting_documents_type_form.select_group')}
|
placeholder={t('app.admin.settings.account.supporting_documents_type_form.select_group')}
|
||||||
|
@ -49,7 +49,9 @@ const SupportingDocumentsTypesList: React.FC<SupportingDocumentsTypesListProps>
|
|||||||
// get groups
|
// get groups
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
GroupAPI.index({ disabled: false }).then(data => {
|
GroupAPI.index({ disabled: false }).then(data => {
|
||||||
setGroups(data);
|
if (documentType === 'User') {
|
||||||
|
setGroups(data);
|
||||||
|
}
|
||||||
SupportingDocumentTypeAPI.index({ document_type: documentType }).then(pData => {
|
SupportingDocumentTypeAPI.index({ document_type: documentType }).then(pData => {
|
||||||
setSupportingDocumentsTypes(pData);
|
setSupportingDocumentsTypes(pData);
|
||||||
});
|
});
|
||||||
|
@ -126,7 +126,8 @@ export const TrainingForm: React.FC<TrainingFormProps> = ({ action, training, on
|
|||||||
id="training_image_attributes"
|
id="training_image_attributes"
|
||||||
accept="image/*"
|
accept="image/*"
|
||||||
defaultImage={output.training_image_attributes}
|
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}
|
<FormRichText control={control}
|
||||||
id="description"
|
id="description"
|
||||||
rules={{ required: true }}
|
rules={{ required: true }}
|
||||||
|
@ -511,7 +511,7 @@ Application.Controllers.controller('AdminMembersController', ['$scope', '$sce',
|
|||||||
});
|
});
|
||||||
if ($scope.members.length > 0) {
|
if ($scope.members.length > 0) {
|
||||||
uitour.createStep({
|
uitour.createStep({
|
||||||
selector: '.members-management .members-list .buttons',
|
selector: '.members-management .members-list .member-actions',
|
||||||
stepId: 'actions',
|
stepId: 'actions',
|
||||||
order: 4,
|
order: 4,
|
||||||
title: _t('app.admin.tour.members.actions.title'),
|
title: _t('app.admin.tour.members.actions.title'),
|
||||||
|
@ -268,6 +268,12 @@ Application.Controllers.controller('EditSpaceController', ['$scope', '$state', '
|
|||||||
return space;
|
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
|
// Using the SpacesController
|
||||||
return new SpacesController($scope, $state);
|
return new SpacesController($scope, $state);
|
||||||
}]);
|
}]);
|
||||||
|
@ -191,7 +191,6 @@
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
||||||
img {
|
img {
|
||||||
aspect-ratio: 16/9;
|
|
||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
object-position: center;
|
object-position: center;
|
||||||
}
|
}
|
||||||
@ -200,7 +199,7 @@
|
|||||||
img {
|
img {
|
||||||
display: block;
|
display: block;
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
height: auto;
|
max-height: 700px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.project-image {
|
.project-image {
|
||||||
@include imageRatio(50%);
|
@include imageRatio(56%);
|
||||||
background-size: cover;
|
background-size: cover;
|
||||||
background-position: center;
|
background-position: center;
|
||||||
border-bottom: 1px solid var(--gray-soft-dark);
|
border-bottom: 1px solid var(--gray-soft-dark);
|
||||||
|
@ -332,7 +332,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</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="btn btn-warning m-t m-l" ng-disabled="profileImageForm.$invalid" translate>{{ 'app.shared.buttons.save' }}</button>
|
<button name="button" type="submit" class="btn btn-warning m-t m-l" ng-disabled="profileImageForm.$invalid" translate>{{ 'app.shared.buttons.save' }}</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
<div class="fileinput-preview fileinput-exists thumbnail" data-trigger="fileinput" style="max-width: 334px;">
|
<div class="fileinput-preview fileinput-exists thumbnail" data-trigger="fileinput" style="max-width: 334px;">
|
||||||
<img ng-src="{{ project.project_image }}" alt="" />
|
<img ng-src="{{ project.project_image }}" alt="" />
|
||||||
</div>
|
</div>
|
||||||
|
<span class="help-block text-sm" translate>{{ 'app.shared.project.illustration_recommendation' }}</span>
|
||||||
<div>
|
<div>
|
||||||
<span class="btn btn-default btn-file"><span class="fileinput-new">{{ 'app.shared.project.add_an_illustration' | translate }} <i class="fa fa-upload fa-fw"></i></span><span class="fileinput-exists" translate>{{ 'app.shared.buttons.change' }}</span>
|
<span class="btn btn-default btn-file"><span class="fileinput-new">{{ 'app.shared.project.add_an_illustration' | translate }} <i class="fa fa-upload fa-fw"></i></span><span class="fileinput-exists" translate>{{ 'app.shared.buttons.change' }}</span>
|
||||||
<input type="file"
|
<input type="file"
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<div class="row no-gutter">
|
<div class="row no-gutter">
|
||||||
<div class="col-md-1 hidden-xs">
|
<div class="col-md-1 hidden-xs">
|
||||||
<section class="heading-btn">
|
<section class="heading-btn">
|
||||||
<a ng-click="backPrevLocation($event)"><i class="fas fa-long-arrow-alt-left "></i></a>
|
<a ng-click="cancel()"><i class="fas fa-long-arrow-alt-left "></i></a>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-8 b-l b-r">
|
<div class="col-md-8 b-l b-r">
|
||||||
|
@ -16,4 +16,16 @@ class OpenIdConnectProvider < ApplicationRecord
|
|||||||
validates :display, inclusion: { in: %w[page popup touch wap], allow_nil: true }
|
validates :display, inclusion: { in: %w[page popup touch wap], allow_nil: true }
|
||||||
validates :prompt, inclusion: { in: %w[none login consent select_account], allow_nil: true }
|
validates :prompt, inclusion: { in: %w[none login consent select_account], allow_nil: true }
|
||||||
validates :client_auth_method, inclusion: { in: %w[basic jwks] }
|
validates :client_auth_method, inclusion: { in: %w[basic jwks] }
|
||||||
|
store_accessor :extra_authorize_params
|
||||||
|
|
||||||
|
def extra_authorize_params=(val)
|
||||||
|
return unless val.is_a?(String)
|
||||||
|
|
||||||
|
begin
|
||||||
|
super JSON.parse(val)
|
||||||
|
rescue JSON::ParserError
|
||||||
|
errors[:extra_authorize_params].add('is not valid JSON')
|
||||||
|
super
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
@ -16,6 +16,6 @@ if @provider.providable_type == OpenIdConnectProvider.name
|
|||||||
:prompt, :send_scope_to_token_endpoint, :client__identifier, :client__secret, :client__authorization_endpoint,
|
:prompt, :send_scope_to_token_endpoint, :client__identifier, :client__secret, :client__authorization_endpoint,
|
||||||
:client__token_endpoint, :client__userinfo_endpoint, :client__jwks_uri, :client__end_session_endpoint, :profile_url
|
:client__token_endpoint, :client__userinfo_endpoint, :client__jwks_uri, :client__end_session_endpoint, :profile_url
|
||||||
json.scope @provider.providable[:scope]
|
json.scope @provider.providable[:scope]
|
||||||
json.extra_authorize_params @provider.providable[:extra_authorize_params]
|
json.extra_authorize_params @provider.providable[:extra_authorize_params].to_json
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -26,13 +26,13 @@
|
|||||||
<a href="<%= root_url %>">
|
<a href="<%= root_url %>">
|
||||||
<img src="<%= File.join(root_url, CustomAsset.get_url('logo-file')) %>"
|
<img src="<%= File.join(root_url, CustomAsset.get_url('logo-file')) %>"
|
||||||
alt="<%=fablab_name%>"
|
alt="<%=fablab_name%>"
|
||||||
width="140px;" />
|
width="140" />
|
||||||
</a>
|
</a>
|
||||||
<% else %>
|
<% else %>
|
||||||
<a href="<%= root_url %>">
|
<a href="<%= root_url %>">
|
||||||
<img src="<%= File.join(root_url, asset_pack_path('static/fabmanager-logo.png')) %>"
|
<img src="<%= File.join(root_url, asset_pack_path('static/fabmanager-logo.png')) %>"
|
||||||
alt="<%=fablab_name%>"
|
alt="<%=fablab_name%>"
|
||||||
width="140px;" />
|
width="140" />
|
||||||
</a>
|
</a>
|
||||||
<% end %>
|
<% end %>
|
||||||
</td>
|
</td>
|
||||||
|
@ -17,6 +17,7 @@ class ReservationReminderWorker
|
|||||||
|
|
||||||
Reservation.joins(slots_reservations: :slot)
|
Reservation.joins(slots_reservations: :slot)
|
||||||
.where('slots.start_at >= ? AND slots.start_at <= ? AND slots_reservations.canceled_at IS NULL', starting, ending)
|
.where('slots.start_at >= ? AND slots.start_at <= ? AND slots_reservations.canceled_at IS NULL', starting, ending)
|
||||||
|
.includes(:reservable, :slots_reservations)
|
||||||
.each do |r|
|
.each do |r|
|
||||||
already_sent = Notification.where(
|
already_sent = Notification.where(
|
||||||
attached_object_type: Reservation.name,
|
attached_object_type: Reservation.name,
|
||||||
@ -24,6 +25,7 @@ class ReservationReminderWorker
|
|||||||
notification_type_id: NotificationType.find_by(name: 'notify_member_reservation_reminder')
|
notification_type_id: NotificationType.find_by(name: 'notify_member_reservation_reminder')
|
||||||
).count
|
).count
|
||||||
next if already_sent.positive?
|
next if already_sent.positive?
|
||||||
|
next if r.reservable.is_a?(Event) && r.reservable.pre_registration? && !r.slots_reservations.all?(&:is_valid?)
|
||||||
|
|
||||||
NotificationCenter.call type: 'notify_member_reservation_reminder',
|
NotificationCenter.call type: 'notify_member_reservation_reminder',
|
||||||
receiver: r.user,
|
receiver: r.user,
|
||||||
|
@ -47,6 +47,7 @@ de:
|
|||||||
description: "Beschreibung"
|
description: "Beschreibung"
|
||||||
name: "Name"
|
name: "Name"
|
||||||
illustration: "Visual"
|
illustration: "Visual"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image."
|
||||||
technical_specifications: "Technical specifications"
|
technical_specifications: "Technical specifications"
|
||||||
category: "Kategorie"
|
category: "Kategorie"
|
||||||
attachments: "Anhänge"
|
attachments: "Anhänge"
|
||||||
@ -66,7 +67,8 @@ de:
|
|||||||
dont_forget_to_change_them_before_creating_slots_for_this_training: "Don't forget to change them before creating slots for this training."
|
dont_forget_to_change_them_before_creating_slots_for_this_training: "Don't forget to change them before creating slots for this training."
|
||||||
description: "Beschreibung"
|
description: "Beschreibung"
|
||||||
name: "Name"
|
name: "Name"
|
||||||
illustration: "Illustration"
|
illustration: "Visual"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image."
|
||||||
add_a_new_training: "Add a new training"
|
add_a_new_training: "Add a new training"
|
||||||
validate_your_training: "Validate your training"
|
validate_your_training: "Validate your training"
|
||||||
settings: "Einstellungen"
|
settings: "Einstellungen"
|
||||||
@ -98,7 +100,8 @@ de:
|
|||||||
watch_out_when_creating_a_new_space_its_prices_are_initialized_at_0_for_all_subscriptions: "Achtung! Beim Erstellen eines neuen Raums wird sein Preis für alle Abonnements mit 0 angelegt."
|
watch_out_when_creating_a_new_space_its_prices_are_initialized_at_0_for_all_subscriptions: "Achtung! Beim Erstellen eines neuen Raums wird sein Preis für alle Abonnements mit 0 angelegt."
|
||||||
consider_changing_its_prices_before_creating_any_reservation_slot: "Ändern Sie ggf. die Preise, bevor Sie Reservierungs-Slots erstellen."
|
consider_changing_its_prices_before_creating_any_reservation_slot: "Ändern Sie ggf. die Preise, bevor Sie Reservierungs-Slots erstellen."
|
||||||
name: "Name"
|
name: "Name"
|
||||||
illustration: "Abbildung"
|
illustration: "Visual"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image."
|
||||||
description: "Beschreibung"
|
description: "Beschreibung"
|
||||||
characteristics: "Eigenschaften"
|
characteristics: "Eigenschaften"
|
||||||
attachments: "Dateianhänge"
|
attachments: "Dateianhänge"
|
||||||
@ -118,7 +121,8 @@ de:
|
|||||||
event_form:
|
event_form:
|
||||||
ACTION_title: "{ACTION, select, create{Neue} other{Aktualisiere die}} Veranstaltung"
|
ACTION_title: "{ACTION, select, create{Neue} other{Aktualisiere die}} Veranstaltung"
|
||||||
title: "Titel"
|
title: "Titel"
|
||||||
matching_visual: "Matching visual"
|
illustration: "Visual"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image."
|
||||||
description: "Beschreibung"
|
description: "Beschreibung"
|
||||||
attachments: "Anhänge"
|
attachments: "Anhänge"
|
||||||
attached_files_pdf: "Angehängte Dateien (pdf)"
|
attached_files_pdf: "Angehängte Dateien (pdf)"
|
||||||
@ -1664,6 +1668,7 @@ de:
|
|||||||
secondary_colour: "Sekundärfarbe:"
|
secondary_colour: "Sekundärfarbe:"
|
||||||
secondary: "Sekundär"
|
secondary: "Sekundär"
|
||||||
background_picture_of_the_profile_banner: "Hintergrundbild des Profil-Banners"
|
background_picture_of_the_profile_banner: "Hintergrundbild des Profil-Banners"
|
||||||
|
background_picture_recommendation: "Only .png file. Recommended size: 4/1 ratio, 1600*400 px."
|
||||||
change_the_profile_banner: "Profil-Banner ändern"
|
change_the_profile_banner: "Profil-Banner ändern"
|
||||||
home_page: "Homepage"
|
home_page: "Homepage"
|
||||||
news_of_the_home_page: "Neuigkeiten der Homepage:"
|
news_of_the_home_page: "Neuigkeiten der Homepage:"
|
||||||
|
@ -47,6 +47,7 @@ en:
|
|||||||
description: "Description"
|
description: "Description"
|
||||||
name: "Name"
|
name: "Name"
|
||||||
illustration: "Visual"
|
illustration: "Visual"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image."
|
||||||
technical_specifications: "Technical specifications"
|
technical_specifications: "Technical specifications"
|
||||||
category: "Category"
|
category: "Category"
|
||||||
attachments: "Attachments"
|
attachments: "Attachments"
|
||||||
@ -66,7 +67,8 @@ en:
|
|||||||
dont_forget_to_change_them_before_creating_slots_for_this_training: "Don't forget to change them before creating slots for this training."
|
dont_forget_to_change_them_before_creating_slots_for_this_training: "Don't forget to change them before creating slots for this training."
|
||||||
description: "Description"
|
description: "Description"
|
||||||
name: "Name"
|
name: "Name"
|
||||||
illustration: "Illustration"
|
illustration: "Visual"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image."
|
||||||
add_a_new_training: "Add a new training"
|
add_a_new_training: "Add a new training"
|
||||||
validate_your_training: "Validate your training"
|
validate_your_training: "Validate your training"
|
||||||
settings: "Settings"
|
settings: "Settings"
|
||||||
@ -98,7 +100,8 @@ en:
|
|||||||
watch_out_when_creating_a_new_space_its_prices_are_initialized_at_0_for_all_subscriptions: "Watch out! When creating a new space, its prices are initialized at 0 for all subscriptions."
|
watch_out_when_creating_a_new_space_its_prices_are_initialized_at_0_for_all_subscriptions: "Watch out! When creating a new space, its prices are initialized at 0 for all subscriptions."
|
||||||
consider_changing_its_prices_before_creating_any_reservation_slot: "Consider changing its prices before creating any reservation slot."
|
consider_changing_its_prices_before_creating_any_reservation_slot: "Consider changing its prices before creating any reservation slot."
|
||||||
name: "Name"
|
name: "Name"
|
||||||
illustration: "Illustration"
|
illustration: "Visual"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image."
|
||||||
description: "Description"
|
description: "Description"
|
||||||
characteristics: "Characteristics"
|
characteristics: "Characteristics"
|
||||||
attachments: "Attachments"
|
attachments: "Attachments"
|
||||||
@ -118,7 +121,8 @@ en:
|
|||||||
event_form:
|
event_form:
|
||||||
ACTION_title: "{ACTION, select, create{New} other{Update the}} event"
|
ACTION_title: "{ACTION, select, create{New} other{Update the}} event"
|
||||||
title: "Title"
|
title: "Title"
|
||||||
matching_visual: "Matching visual"
|
illustration: "Visual"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image."
|
||||||
description: "Description"
|
description: "Description"
|
||||||
attachments: "Attachments"
|
attachments: "Attachments"
|
||||||
attached_files_pdf: "Attached files (pdf)"
|
attached_files_pdf: "Attached files (pdf)"
|
||||||
@ -1664,6 +1668,7 @@ en:
|
|||||||
secondary_colour: "Secondary colour:"
|
secondary_colour: "Secondary colour:"
|
||||||
secondary: "Secondary"
|
secondary: "Secondary"
|
||||||
background_picture_of_the_profile_banner: "Background picture of the profile banner"
|
background_picture_of_the_profile_banner: "Background picture of the profile banner"
|
||||||
|
background_picture_recommendation: "Only .png file. Recommended size: 4/1 ratio, 1600*400 px."
|
||||||
change_the_profile_banner: "Change the profile banner"
|
change_the_profile_banner: "Change the profile banner"
|
||||||
home_page: "Home page"
|
home_page: "Home page"
|
||||||
news_of_the_home_page: "News of the home page:"
|
news_of_the_home_page: "News of the home page:"
|
||||||
|
@ -47,6 +47,7 @@ es:
|
|||||||
description: "Descripción"
|
description: "Descripción"
|
||||||
name: "Nombre"
|
name: "Nombre"
|
||||||
illustration: "Ilustración"
|
illustration: "Ilustración"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image."
|
||||||
technical_specifications: "Especificaciones técnicas"
|
technical_specifications: "Especificaciones técnicas"
|
||||||
category: "Categoría"
|
category: "Categoría"
|
||||||
attachments: "Adjuntos"
|
attachments: "Adjuntos"
|
||||||
@ -66,7 +67,8 @@ es:
|
|||||||
dont_forget_to_change_them_before_creating_slots_for_this_training: "No olvide cambiarlos antes de crear franjas horarias para esta formación."
|
dont_forget_to_change_them_before_creating_slots_for_this_training: "No olvide cambiarlos antes de crear franjas horarias para esta formación."
|
||||||
description: "Descripción"
|
description: "Descripción"
|
||||||
name: "Nombre"
|
name: "Nombre"
|
||||||
illustration: "Ilustración"
|
illustration: "Visual"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image."
|
||||||
add_a_new_training: "Añadir una nueva formación"
|
add_a_new_training: "Añadir una nueva formación"
|
||||||
validate_your_training: "Valide su formación"
|
validate_your_training: "Valide su formación"
|
||||||
settings: "Configuración"
|
settings: "Configuración"
|
||||||
@ -98,7 +100,8 @@ es:
|
|||||||
watch_out_when_creating_a_new_space_its_prices_are_initialized_at_0_for_all_subscriptions: "¡Cuidado! Al crear un nuevo espacio, sus precios se inicializan a 0 para todas las suscripciones."
|
watch_out_when_creating_a_new_space_its_prices_are_initialized_at_0_for_all_subscriptions: "¡Cuidado! Al crear un nuevo espacio, sus precios se inicializan a 0 para todas las suscripciones."
|
||||||
consider_changing_its_prices_before_creating_any_reservation_slot: "Considere cambiar sus precios antes de crear cualquier espacio de reserva."
|
consider_changing_its_prices_before_creating_any_reservation_slot: "Considere cambiar sus precios antes de crear cualquier espacio de reserva."
|
||||||
name: "Nombre"
|
name: "Nombre"
|
||||||
illustration: "Illustración"
|
illustration: "Visual"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image."
|
||||||
description: "Descripción"
|
description: "Descripción"
|
||||||
characteristics: "Características"
|
characteristics: "Características"
|
||||||
attachments: "Adjuntos"
|
attachments: "Adjuntos"
|
||||||
@ -118,7 +121,8 @@ es:
|
|||||||
event_form:
|
event_form:
|
||||||
ACTION_title: "{ACTION, select, create{Nuevo} other{Actualiza el}} evento"
|
ACTION_title: "{ACTION, select, create{Nuevo} other{Actualiza el}} evento"
|
||||||
title: "Título"
|
title: "Título"
|
||||||
matching_visual: "Coincidiendo visual"
|
illustration: "Visual"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image."
|
||||||
description: "Descripción"
|
description: "Descripción"
|
||||||
attachments: "Adjuntos"
|
attachments: "Adjuntos"
|
||||||
attached_files_pdf: "Archivos adjuntos (pdf)"
|
attached_files_pdf: "Archivos adjuntos (pdf)"
|
||||||
@ -1664,6 +1668,7 @@ es:
|
|||||||
secondary_colour: "Color secundario:"
|
secondary_colour: "Color secundario:"
|
||||||
secondary: "Secundario"
|
secondary: "Secundario"
|
||||||
background_picture_of_the_profile_banner: "Imagen de fondo de la bandera del perfil"
|
background_picture_of_the_profile_banner: "Imagen de fondo de la bandera del perfil"
|
||||||
|
background_picture_recommendation: "Only .png file. Recommended size: 4/1 ratio, 1600*400 px."
|
||||||
change_the_profile_banner: "Cambiar la bandera del perfil"
|
change_the_profile_banner: "Cambiar la bandera del perfil"
|
||||||
home_page: "Página de inicio"
|
home_page: "Página de inicio"
|
||||||
news_of_the_home_page: "Noticias de la página principal:"
|
news_of_the_home_page: "Noticias de la página principal:"
|
||||||
|
@ -47,6 +47,7 @@ fr:
|
|||||||
description: "Description"
|
description: "Description"
|
||||||
name: "Nom"
|
name: "Nom"
|
||||||
illustration: "Illustration"
|
illustration: "Illustration"
|
||||||
|
illustration_recommendation: "Taille maximale d'affichage : 932 * 700 px (ratio non contraint). L'image peut être recadrée dans la vue en liste. Seule la page de description affiche l'image complète."
|
||||||
technical_specifications: "Caractéristiques techniques"
|
technical_specifications: "Caractéristiques techniques"
|
||||||
category: "Catégorie"
|
category: "Catégorie"
|
||||||
attachments: "Pièces jointes"
|
attachments: "Pièces jointes"
|
||||||
@ -67,6 +68,7 @@ fr:
|
|||||||
description: "Description"
|
description: "Description"
|
||||||
name: "Nom"
|
name: "Nom"
|
||||||
illustration: "Visuel"
|
illustration: "Visuel"
|
||||||
|
illustration_recommendation: "Taille maximale d'affichage : 932 * 700 px (ratio non contraint). L'image peut être recadrée dans la vue en liste. Seule la page de description affiche l'image complète."
|
||||||
add_a_new_training: "Ajouter une nouvelle formation"
|
add_a_new_training: "Ajouter une nouvelle formation"
|
||||||
validate_your_training: "Valider votre formation"
|
validate_your_training: "Valider votre formation"
|
||||||
settings: "Paramètres"
|
settings: "Paramètres"
|
||||||
@ -99,6 +101,7 @@ fr:
|
|||||||
consider_changing_its_prices_before_creating_any_reservation_slot: "Pensez à modifier ces prix avant de créer des créneaux pour cet espace."
|
consider_changing_its_prices_before_creating_any_reservation_slot: "Pensez à modifier ces prix avant de créer des créneaux pour cet espace."
|
||||||
name: "Nom"
|
name: "Nom"
|
||||||
illustration: "Visuel"
|
illustration: "Visuel"
|
||||||
|
illustration_recommendation: "Taille maximale d'affichage : 932 * 700 px (ratio non contraint). L'image peut être recadrée dans la vue en liste. Seule la page de description affiche l'image complète."
|
||||||
description: "Description"
|
description: "Description"
|
||||||
characteristics: "Caractéristiques"
|
characteristics: "Caractéristiques"
|
||||||
attachments: "Pièces jointes"
|
attachments: "Pièces jointes"
|
||||||
@ -118,7 +121,8 @@ fr:
|
|||||||
event_form:
|
event_form:
|
||||||
ACTION_title: "{ACTION, select, create{Nouvel } other{Mettre à jour l''}}événement"
|
ACTION_title: "{ACTION, select, create{Nouvel } other{Mettre à jour l''}}événement"
|
||||||
title: "Titre"
|
title: "Titre"
|
||||||
matching_visual: "Visuel associé"
|
illustration: "Visuel"
|
||||||
|
illustration_recommendation: "Taille maximale d'affichage : 932 * 700 px (ratio non contraint). L'image peut être recadrée dans la vue en liste. Seule la page de description affiche l'image complète."
|
||||||
description: "Description"
|
description: "Description"
|
||||||
attachments: "Pièces jointes"
|
attachments: "Pièces jointes"
|
||||||
attached_files_pdf: "Pièces jointes (pdf)"
|
attached_files_pdf: "Pièces jointes (pdf)"
|
||||||
@ -1664,6 +1668,7 @@ fr:
|
|||||||
secondary_colour: "Couleur secondaire :"
|
secondary_colour: "Couleur secondaire :"
|
||||||
secondary: "Secondaire"
|
secondary: "Secondaire"
|
||||||
background_picture_of_the_profile_banner: "Image de fond du bandeau de profil"
|
background_picture_of_the_profile_banner: "Image de fond du bandeau de profil"
|
||||||
|
background_picture_recommendation: "Seulement un fichier .png. Taille recommandée : ratio 4/1, 1600 * 400 px."
|
||||||
change_the_profile_banner: "Changer le bandeau de profil"
|
change_the_profile_banner: "Changer le bandeau de profil"
|
||||||
home_page: "Page d'accueil"
|
home_page: "Page d'accueil"
|
||||||
news_of_the_home_page: "Brève de la page d'accueil :"
|
news_of_the_home_page: "Brève de la page d'accueil :"
|
||||||
|
@ -47,6 +47,7 @@ it:
|
|||||||
description: "Descrizione"
|
description: "Descrizione"
|
||||||
name: "Nome"
|
name: "Nome"
|
||||||
illustration: "Illustrazione"
|
illustration: "Illustrazione"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image."
|
||||||
technical_specifications: "Specifiche tecniche"
|
technical_specifications: "Specifiche tecniche"
|
||||||
category: "Categoria"
|
category: "Categoria"
|
||||||
attachments: "Allegati"
|
attachments: "Allegati"
|
||||||
@ -66,7 +67,8 @@ it:
|
|||||||
dont_forget_to_change_them_before_creating_slots_for_this_training: "Non dimenticare di cambiarli prima di creare slot per questo addestramento."
|
dont_forget_to_change_them_before_creating_slots_for_this_training: "Non dimenticare di cambiarli prima di creare slot per questo addestramento."
|
||||||
description: "Descrizione"
|
description: "Descrizione"
|
||||||
name: "Nome"
|
name: "Nome"
|
||||||
illustration: "Illustrazione"
|
illustration: "Visual"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image."
|
||||||
add_a_new_training: "Aggiungi un nuovo addestramento"
|
add_a_new_training: "Aggiungi un nuovo addestramento"
|
||||||
validate_your_training: "Convalida il tuo addestramento"
|
validate_your_training: "Convalida il tuo addestramento"
|
||||||
settings: "Impostazioni"
|
settings: "Impostazioni"
|
||||||
@ -98,7 +100,8 @@ it:
|
|||||||
watch_out_when_creating_a_new_space_its_prices_are_initialized_at_0_for_all_subscriptions: "Attenzione! Quando si crea un nuovo spazio, i suoi prezzi sono inizializzati a 0 per tutti gli abbonamenti."
|
watch_out_when_creating_a_new_space_its_prices_are_initialized_at_0_for_all_subscriptions: "Attenzione! Quando si crea un nuovo spazio, i suoi prezzi sono inizializzati a 0 per tutti gli abbonamenti."
|
||||||
consider_changing_its_prices_before_creating_any_reservation_slot: "Valuta se cambiare i suoi prezzi prima di creare qualsiasi slot di prenotazione."
|
consider_changing_its_prices_before_creating_any_reservation_slot: "Valuta se cambiare i suoi prezzi prima di creare qualsiasi slot di prenotazione."
|
||||||
name: "Nome"
|
name: "Nome"
|
||||||
illustration: "Illustrazione"
|
illustration: "Visual"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image."
|
||||||
description: "Descrizione"
|
description: "Descrizione"
|
||||||
characteristics: "Caratteristiche"
|
characteristics: "Caratteristiche"
|
||||||
attachments: "Allegati"
|
attachments: "Allegati"
|
||||||
@ -118,7 +121,8 @@ it:
|
|||||||
event_form:
|
event_form:
|
||||||
ACTION_title: "{ACTION, select, create{Nuovo} other{Aggiorna}} evento"
|
ACTION_title: "{ACTION, select, create{Nuovo} other{Aggiorna}} evento"
|
||||||
title: "Titolo"
|
title: "Titolo"
|
||||||
matching_visual: "Corrispondenza illustazione"
|
illustration: "Visual"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image."
|
||||||
description: "Descrizione"
|
description: "Descrizione"
|
||||||
attachments: "Allegati"
|
attachments: "Allegati"
|
||||||
attached_files_pdf: "File allegati (pdf)"
|
attached_files_pdf: "File allegati (pdf)"
|
||||||
@ -1664,6 +1668,7 @@ it:
|
|||||||
secondary_colour: "Colore secondario:"
|
secondary_colour: "Colore secondario:"
|
||||||
secondary: "Secondario"
|
secondary: "Secondario"
|
||||||
background_picture_of_the_profile_banner: "Immagine di sfondo del banner del profilo"
|
background_picture_of_the_profile_banner: "Immagine di sfondo del banner del profilo"
|
||||||
|
background_picture_recommendation: "Only .png file. Recommended size: 4/1 ratio, 1600*400 px."
|
||||||
change_the_profile_banner: "Cambia il banner del profilo"
|
change_the_profile_banner: "Cambia il banner del profilo"
|
||||||
home_page: "Home page"
|
home_page: "Home page"
|
||||||
news_of_the_home_page: "Notizie della home page:"
|
news_of_the_home_page: "Notizie della home page:"
|
||||||
|
@ -47,6 +47,7 @@
|
|||||||
description: "Description"
|
description: "Description"
|
||||||
name: "Name"
|
name: "Name"
|
||||||
illustration: "Visual"
|
illustration: "Visual"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image."
|
||||||
technical_specifications: "Technical specifications"
|
technical_specifications: "Technical specifications"
|
||||||
category: "Category"
|
category: "Category"
|
||||||
attachments: "Attachments"
|
attachments: "Attachments"
|
||||||
@ -66,7 +67,8 @@
|
|||||||
dont_forget_to_change_them_before_creating_slots_for_this_training: "Don't forget to change them before creating slots for this training."
|
dont_forget_to_change_them_before_creating_slots_for_this_training: "Don't forget to change them before creating slots for this training."
|
||||||
description: "Description"
|
description: "Description"
|
||||||
name: "Name"
|
name: "Name"
|
||||||
illustration: "Illustration"
|
illustration: "Visual"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image."
|
||||||
add_a_new_training: "Add a new training"
|
add_a_new_training: "Add a new training"
|
||||||
validate_your_training: "Validate your training"
|
validate_your_training: "Validate your training"
|
||||||
settings: "Settings"
|
settings: "Settings"
|
||||||
@ -98,7 +100,8 @@
|
|||||||
watch_out_when_creating_a_new_space_its_prices_are_initialized_at_0_for_all_subscriptions: "Watch out! When creating a new space, its prices are initialized at 0 for all subscriptions."
|
watch_out_when_creating_a_new_space_its_prices_are_initialized_at_0_for_all_subscriptions: "Watch out! When creating a new space, its prices are initialized at 0 for all subscriptions."
|
||||||
consider_changing_its_prices_before_creating_any_reservation_slot: "Consider changing its prices before creating any reservation slot."
|
consider_changing_its_prices_before_creating_any_reservation_slot: "Consider changing its prices before creating any reservation slot."
|
||||||
name: "Name"
|
name: "Name"
|
||||||
illustration: "Illustration"
|
illustration: "Visual"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image."
|
||||||
description: "Description"
|
description: "Description"
|
||||||
characteristics: "Characteristics"
|
characteristics: "Characteristics"
|
||||||
attachments: "Attachments"
|
attachments: "Attachments"
|
||||||
@ -118,7 +121,8 @@
|
|||||||
event_form:
|
event_form:
|
||||||
ACTION_title: "{ACTION, select, create{New} other{Update the}} event"
|
ACTION_title: "{ACTION, select, create{New} other{Update the}} event"
|
||||||
title: "Title"
|
title: "Title"
|
||||||
matching_visual: "Matching visual"
|
illustration: "Visual"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image."
|
||||||
description: "Description"
|
description: "Description"
|
||||||
attachments: "Attachments"
|
attachments: "Attachments"
|
||||||
attached_files_pdf: "Attached files (pdf)"
|
attached_files_pdf: "Attached files (pdf)"
|
||||||
@ -1664,6 +1668,7 @@
|
|||||||
secondary_colour: "Secondary colour:"
|
secondary_colour: "Secondary colour:"
|
||||||
secondary: "Secondary"
|
secondary: "Secondary"
|
||||||
background_picture_of_the_profile_banner: "Background picture of the profile banner"
|
background_picture_of_the_profile_banner: "Background picture of the profile banner"
|
||||||
|
background_picture_recommendation: "Only .png file. Recommended size: 4/1 ratio, 1600*400 px."
|
||||||
change_the_profile_banner: "Change the profile banner"
|
change_the_profile_banner: "Change the profile banner"
|
||||||
home_page: "Hjemmeside"
|
home_page: "Hjemmeside"
|
||||||
news_of_the_home_page: "News of the home page:"
|
news_of_the_home_page: "News of the home page:"
|
||||||
|
@ -47,6 +47,7 @@ pt:
|
|||||||
description: "Descrição"
|
description: "Descrição"
|
||||||
name: "Nome"
|
name: "Nome"
|
||||||
illustration: "Visual"
|
illustration: "Visual"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image."
|
||||||
technical_specifications: "Especificações técnicas"
|
technical_specifications: "Especificações técnicas"
|
||||||
category: "Categoria"
|
category: "Categoria"
|
||||||
attachments: "Anexos"
|
attachments: "Anexos"
|
||||||
@ -66,7 +67,8 @@ pt:
|
|||||||
dont_forget_to_change_them_before_creating_slots_for_this_training: "Don't forget to change them before creating slots for this training."
|
dont_forget_to_change_them_before_creating_slots_for_this_training: "Don't forget to change them before creating slots for this training."
|
||||||
description: "Descrição"
|
description: "Descrição"
|
||||||
name: "Nome"
|
name: "Nome"
|
||||||
illustration: "Ilustração"
|
illustration: "Visual"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image."
|
||||||
add_a_new_training: "Adicionar um novo treinamento"
|
add_a_new_training: "Adicionar um novo treinamento"
|
||||||
validate_your_training: "Validar seu treinamento"
|
validate_your_training: "Validar seu treinamento"
|
||||||
settings: "Confirgurações"
|
settings: "Confirgurações"
|
||||||
@ -98,7 +100,8 @@ pt:
|
|||||||
watch_out_when_creating_a_new_space_its_prices_are_initialized_at_0_for_all_subscriptions: "Watch out! When creating a new space, its prices are initialized at 0 for all subscriptions."
|
watch_out_when_creating_a_new_space_its_prices_are_initialized_at_0_for_all_subscriptions: "Watch out! When creating a new space, its prices are initialized at 0 for all subscriptions."
|
||||||
consider_changing_its_prices_before_creating_any_reservation_slot: "Consider changing its prices before creating any reservation slot."
|
consider_changing_its_prices_before_creating_any_reservation_slot: "Consider changing its prices before creating any reservation slot."
|
||||||
name: "Name"
|
name: "Name"
|
||||||
illustration: "Illustration"
|
illustration: "Visual"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image."
|
||||||
description: "Description"
|
description: "Description"
|
||||||
characteristics: "Characteristics"
|
characteristics: "Characteristics"
|
||||||
attachments: "Attachments"
|
attachments: "Attachments"
|
||||||
@ -118,7 +121,8 @@ pt:
|
|||||||
event_form:
|
event_form:
|
||||||
ACTION_title: "{ACTION, select, create{New} other{Update the}} event"
|
ACTION_title: "{ACTION, select, create{New} other{Update the}} event"
|
||||||
title: "Title"
|
title: "Title"
|
||||||
matching_visual: "Matching visual"
|
illustration: "Visual"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio). The image may be cropped in list view. Only the description page displays the full image."
|
||||||
description: "Description"
|
description: "Description"
|
||||||
attachments: "Attachments"
|
attachments: "Attachments"
|
||||||
attached_files_pdf: "Attached files (pdf)"
|
attached_files_pdf: "Attached files (pdf)"
|
||||||
@ -1664,6 +1668,7 @@ pt:
|
|||||||
secondary_colour: "Cor secundária:"
|
secondary_colour: "Cor secundária:"
|
||||||
secondary: "Secundária"
|
secondary: "Secundária"
|
||||||
background_picture_of_the_profile_banner: "Imagem de plano de fundo do perfil"
|
background_picture_of_the_profile_banner: "Imagem de plano de fundo do perfil"
|
||||||
|
background_picture_recommendation: "Only .png file. Recommended size: 4/1 ratio, 1600*400 px."
|
||||||
change_the_profile_banner: "Alterar a capa do perfil"
|
change_the_profile_banner: "Alterar a capa do perfil"
|
||||||
home_page: "Página inicial"
|
home_page: "Página inicial"
|
||||||
news_of_the_home_page: "Notícias da página inicial:"
|
news_of_the_home_page: "Notícias da página inicial:"
|
||||||
|
@ -47,6 +47,7 @@ zu:
|
|||||||
description: "crwdns31665:0crwdne31665:0"
|
description: "crwdns31665:0crwdne31665:0"
|
||||||
name: "crwdns31659:0crwdne31659:0"
|
name: "crwdns31659:0crwdne31659:0"
|
||||||
illustration: "crwdns31661:0crwdne31661:0"
|
illustration: "crwdns31661:0crwdne31661:0"
|
||||||
|
illustration_recommendation: "crwdns38114:0crwdne38114:0"
|
||||||
technical_specifications: "crwdns31667:0crwdne31667:0"
|
technical_specifications: "crwdns31667:0crwdne31667:0"
|
||||||
category: "crwdns36215:0crwdne36215:0"
|
category: "crwdns36215:0crwdne36215:0"
|
||||||
attachments: "crwdns36833:0crwdne36833:0"
|
attachments: "crwdns36833:0crwdne36833:0"
|
||||||
@ -66,7 +67,8 @@ zu:
|
|||||||
dont_forget_to_change_them_before_creating_slots_for_this_training: "crwdns36843:0crwdne36843:0"
|
dont_forget_to_change_them_before_creating_slots_for_this_training: "crwdns36843:0crwdne36843:0"
|
||||||
description: "crwdns31767:0crwdne31767:0"
|
description: "crwdns31767:0crwdne31767:0"
|
||||||
name: "crwdns31763:0crwdne31763:0"
|
name: "crwdns31763:0crwdne31763:0"
|
||||||
illustration: "crwdns31765:0crwdne31765:0"
|
illustration: "crwdns38116:0crwdne38116:0"
|
||||||
|
illustration_recommendation: "crwdns38118:0crwdne38118:0"
|
||||||
add_a_new_training: "crwdns31769:0crwdne31769:0"
|
add_a_new_training: "crwdns31769:0crwdne31769:0"
|
||||||
validate_your_training: "crwdns31771:0crwdne31771:0"
|
validate_your_training: "crwdns31771:0crwdne31771:0"
|
||||||
settings: "crwdns36845:0crwdne36845:0"
|
settings: "crwdns36845:0crwdne36845:0"
|
||||||
@ -98,7 +100,8 @@ zu:
|
|||||||
watch_out_when_creating_a_new_space_its_prices_are_initialized_at_0_for_all_subscriptions: "crwdns36877:0crwdne36877:0"
|
watch_out_when_creating_a_new_space_its_prices_are_initialized_at_0_for_all_subscriptions: "crwdns36877:0crwdne36877:0"
|
||||||
consider_changing_its_prices_before_creating_any_reservation_slot: "crwdns36879:0crwdne36879:0"
|
consider_changing_its_prices_before_creating_any_reservation_slot: "crwdns36879:0crwdne36879:0"
|
||||||
name: "crwdns31793:0crwdne31793:0"
|
name: "crwdns31793:0crwdne31793:0"
|
||||||
illustration: "crwdns31795:0crwdne31795:0"
|
illustration: "crwdns38120:0crwdne38120:0"
|
||||||
|
illustration_recommendation: "crwdns38122:0crwdne38122:0"
|
||||||
description: "crwdns31797:0crwdne31797:0"
|
description: "crwdns31797:0crwdne31797:0"
|
||||||
characteristics: "crwdns31799:0crwdne31799:0"
|
characteristics: "crwdns31799:0crwdne31799:0"
|
||||||
attachments: "crwdns36881:0crwdne36881:0"
|
attachments: "crwdns36881:0crwdne36881:0"
|
||||||
@ -118,7 +121,8 @@ zu:
|
|||||||
event_form:
|
event_form:
|
||||||
ACTION_title: "crwdns36887:0ACTION={ACTION}crwdne36887:0"
|
ACTION_title: "crwdns36887:0ACTION={ACTION}crwdne36887:0"
|
||||||
title: "crwdns31817:0crwdne31817:0"
|
title: "crwdns31817:0crwdne31817:0"
|
||||||
matching_visual: "crwdns31819:0crwdne31819:0"
|
illustration: "crwdns38124:0crwdne38124:0"
|
||||||
|
illustration_recommendation: "crwdns38126:0crwdne38126:0"
|
||||||
description: "crwdns31821:0crwdne31821:0"
|
description: "crwdns31821:0crwdne31821:0"
|
||||||
attachments: "crwdns31823:0crwdne31823:0"
|
attachments: "crwdns31823:0crwdne31823:0"
|
||||||
attached_files_pdf: "crwdns36889:0crwdne36889:0"
|
attached_files_pdf: "crwdns36889:0crwdne36889:0"
|
||||||
@ -1664,6 +1668,7 @@ zu:
|
|||||||
secondary_colour: "crwdns26398:0crwdne26398:0"
|
secondary_colour: "crwdns26398:0crwdne26398:0"
|
||||||
secondary: "crwdns26400:0crwdne26400:0"
|
secondary: "crwdns26400:0crwdne26400:0"
|
||||||
background_picture_of_the_profile_banner: "crwdns26402:0crwdne26402:0"
|
background_picture_of_the_profile_banner: "crwdns26402:0crwdne26402:0"
|
||||||
|
background_picture_recommendation: "crwdns38128:0crwdne38128:0"
|
||||||
change_the_profile_banner: "crwdns26404:0crwdne26404:0"
|
change_the_profile_banner: "crwdns26404:0crwdne26404:0"
|
||||||
home_page: "crwdns26406:0crwdne26406:0"
|
home_page: "crwdns26406:0crwdne26406:0"
|
||||||
news_of_the_home_page: "crwdns26408:0crwdne26408:0"
|
news_of_the_home_page: "crwdns26408:0crwdne26408:0"
|
||||||
|
@ -128,6 +128,7 @@ de:
|
|||||||
name: "Name"
|
name: "Name"
|
||||||
name_is_required: "Name ist erforderlich."
|
name_is_required: "Name ist erforderlich."
|
||||||
illustration: "Ansicht"
|
illustration: "Ansicht"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio)."
|
||||||
add_an_illustration: "Illustration hinzufügen"
|
add_an_illustration: "Illustration hinzufügen"
|
||||||
CAD_file: "CAD-Datei"
|
CAD_file: "CAD-Datei"
|
||||||
CAD_files: "CAD files"
|
CAD_files: "CAD files"
|
||||||
|
@ -128,6 +128,7 @@ en:
|
|||||||
name: "Name"
|
name: "Name"
|
||||||
name_is_required: "Name is required."
|
name_is_required: "Name is required."
|
||||||
illustration: "Visual"
|
illustration: "Visual"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio)."
|
||||||
add_an_illustration: "Add an illustration"
|
add_an_illustration: "Add an illustration"
|
||||||
CAD_file: "CAD file"
|
CAD_file: "CAD file"
|
||||||
CAD_files: "CAD files"
|
CAD_files: "CAD files"
|
||||||
|
@ -128,6 +128,7 @@ es:
|
|||||||
name: "Nombre"
|
name: "Nombre"
|
||||||
name_is_required: "Se requiere un nombre."
|
name_is_required: "Se requiere un nombre."
|
||||||
illustration: "Ilustración"
|
illustration: "Ilustración"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio)."
|
||||||
add_an_illustration: "Añadir una ilustración"
|
add_an_illustration: "Añadir una ilustración"
|
||||||
CAD_file: "Fichero CAD"
|
CAD_file: "Fichero CAD"
|
||||||
CAD_files: "Archivos CAD"
|
CAD_files: "Archivos CAD"
|
||||||
|
@ -128,6 +128,7 @@ fr:
|
|||||||
name: "Nom"
|
name: "Nom"
|
||||||
name_is_required: "Le nom est requis."
|
name_is_required: "Le nom est requis."
|
||||||
illustration: "Illustration"
|
illustration: "Illustration"
|
||||||
|
illustration_recommendation: "Taille maximale d'affichage : 932 * 700 px (ratio non contraint)."
|
||||||
add_an_illustration: "Ajouter un visuel"
|
add_an_illustration: "Ajouter un visuel"
|
||||||
CAD_file: "Fichier CAO"
|
CAD_file: "Fichier CAO"
|
||||||
CAD_files: "Fichiers CAD"
|
CAD_files: "Fichiers CAD"
|
||||||
|
@ -128,6 +128,7 @@ it:
|
|||||||
name: "Nome"
|
name: "Nome"
|
||||||
name_is_required: "Il nome è obbligatorio."
|
name_is_required: "Il nome è obbligatorio."
|
||||||
illustration: "Illustrazione"
|
illustration: "Illustrazione"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio)."
|
||||||
add_an_illustration: "Aggiungi un'illustrazione"
|
add_an_illustration: "Aggiungi un'illustrazione"
|
||||||
CAD_file: "File CAD"
|
CAD_file: "File CAD"
|
||||||
CAD_files: "File CAD"
|
CAD_files: "File CAD"
|
||||||
|
@ -128,6 +128,7 @@
|
|||||||
name: "Navn"
|
name: "Navn"
|
||||||
name_is_required: "Navn er påkrevd."
|
name_is_required: "Navn er påkrevd."
|
||||||
illustration: "Bilde"
|
illustration: "Bilde"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio)."
|
||||||
add_an_illustration: "Legg til en illustrasjon"
|
add_an_illustration: "Legg til en illustrasjon"
|
||||||
CAD_file: "CAD-filer"
|
CAD_file: "CAD-filer"
|
||||||
CAD_files: "CAD files"
|
CAD_files: "CAD files"
|
||||||
|
@ -128,6 +128,7 @@ pt:
|
|||||||
name: "Nome"
|
name: "Nome"
|
||||||
name_is_required: "Nome é obrigatório."
|
name_is_required: "Nome é obrigatório."
|
||||||
illustration: "Foto"
|
illustration: "Foto"
|
||||||
|
illustration_recommendation: "Maximum display size: 932 * 700 px (unconstrained ratio)."
|
||||||
add_an_illustration: "Adicionar foto"
|
add_an_illustration: "Adicionar foto"
|
||||||
CAD_file: "Arquivo CAD"
|
CAD_file: "Arquivo CAD"
|
||||||
CAD_files: "CAD files"
|
CAD_files: "CAD files"
|
||||||
|
@ -128,6 +128,7 @@ zu:
|
|||||||
name: "crwdns28724:0crwdne28724:0"
|
name: "crwdns28724:0crwdne28724:0"
|
||||||
name_is_required: "crwdns28726:0crwdne28726:0"
|
name_is_required: "crwdns28726:0crwdne28726:0"
|
||||||
illustration: "crwdns28728:0crwdne28728:0"
|
illustration: "crwdns28728:0crwdne28728:0"
|
||||||
|
illustration_recommendation: "crwdns38130:0crwdne38130:0"
|
||||||
add_an_illustration: "crwdns28730:0crwdne28730:0"
|
add_an_illustration: "crwdns28730:0crwdne28730:0"
|
||||||
CAD_file: "crwdns28732:0crwdne28732:0"
|
CAD_file: "crwdns28732:0crwdne28732:0"
|
||||||
CAD_files: "crwdns37647:0crwdne37647:0"
|
CAD_files: "crwdns37647:0crwdne37647:0"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "fab-manager",
|
"name": "fab-manager",
|
||||||
"version": "6.1.2",
|
"version": "6.2.0",
|
||||||
"description": "Fab-manager is the FabLab management solution. It provides a comprehensive, web-based, open-source tool to simplify your administrative tasks and your marker's projects.",
|
"description": "Fab-manager is the FabLab management solution. It provides a comprehensive, web-based, open-source tool to simplify your administrative tasks and your marker's projects.",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"fablab",
|
"fablab",
|
||||||
|
109
test/workers/reservation_reminder_worker_test.rb
Normal file
109
test/workers/reservation_reminder_worker_test.rb
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'test_helper'
|
||||||
|
require 'minitest/autorun'
|
||||||
|
|
||||||
|
class ReservationReminderWorkerTest < ActiveSupport::TestCase
|
||||||
|
include ActionMailer::TestHelper
|
||||||
|
|
||||||
|
setup do
|
||||||
|
@worker = ReservationReminderWorker.new
|
||||||
|
|
||||||
|
@training_slot = slots(:slot_1)
|
||||||
|
|
||||||
|
@event = events(:event_1)
|
||||||
|
@event_slot = slots(:slot_129)
|
||||||
|
@event_reservation = Reservation.create!(
|
||||||
|
reservable: @event,
|
||||||
|
nb_reserve_places: 1,
|
||||||
|
statistic_profile_id: statistic_profiles(:pdurand).id,
|
||||||
|
slots_reservations_attributes: [slot_id: @event_slot.id]
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
test 'send a reminder 24 hours before by default and is idempotent' do
|
||||||
|
travel_to @training_slot.start_at - 24.hours
|
||||||
|
|
||||||
|
assert_enqueued_emails 1 do
|
||||||
|
@worker.perform
|
||||||
|
end
|
||||||
|
|
||||||
|
assert_enqueued_emails 0 do
|
||||||
|
@worker.perform
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
test 'reminder_delay can be changed and is respected' do
|
||||||
|
Setting.set('reminder_delay', 15)
|
||||||
|
|
||||||
|
travel_to @training_slot.start_at - 17.hours
|
||||||
|
|
||||||
|
assert_enqueued_emails 0 do
|
||||||
|
@worker.perform
|
||||||
|
end
|
||||||
|
|
||||||
|
travel_to @training_slot.start_at - 13.hours
|
||||||
|
|
||||||
|
assert_enqueued_emails 0 do
|
||||||
|
@worker.perform
|
||||||
|
end
|
||||||
|
|
||||||
|
travel_to @training_slot.start_at - 15.hours
|
||||||
|
|
||||||
|
assert_enqueued_emails 1 do
|
||||||
|
@worker.perform
|
||||||
|
end
|
||||||
|
|
||||||
|
assert_enqueued_emails 0 do
|
||||||
|
@worker.perform
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
test 'do nothing if setting reminder_enable is false' do
|
||||||
|
Setting.set('reminder_enable', false)
|
||||||
|
|
||||||
|
assert_enqueued_emails 0 do
|
||||||
|
assert_nil @worker.perform
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
test 'do nothing if slots_reservations is canceled' do
|
||||||
|
travel_to @training_slot.start_at - 24.hours
|
||||||
|
|
||||||
|
@training_slot.slots_reservations[0].update!(canceled_at: 1.day.ago)
|
||||||
|
|
||||||
|
assert_enqueued_emails 0 do
|
||||||
|
@worker.perform
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
test '[event] do nothing if event.pre_registration is true and slots_reservation is not valid' do
|
||||||
|
@event.update!(pre_registration: true)
|
||||||
|
@event_reservation.slots_reservations.update_all(is_valid: false)
|
||||||
|
|
||||||
|
travel_to @event_slot.start_at - 24.hours
|
||||||
|
|
||||||
|
assert_enqueued_emails 0 do
|
||||||
|
@worker.perform
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
test '[event] do send the notification if event.pre_registration is true and slots_reservation is valid' do
|
||||||
|
@event.update!(pre_registration: true)
|
||||||
|
@event_reservation.slots_reservations.update_all(is_valid: true)
|
||||||
|
|
||||||
|
travel_to @event_slot.start_at - 24.hours
|
||||||
|
|
||||||
|
assert_enqueued_emails 1 do
|
||||||
|
@worker.perform
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
test '[event] do send the notification if event.pre_registration is false' do
|
||||||
|
travel_to @event_slot.start_at - 24.hours
|
||||||
|
|
||||||
|
assert_enqueued_emails 1 do
|
||||||
|
@worker.perform
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue
Block a user